{"version":3,"file":"html2canvas-pro.cjs","names":["toCodePoints","fromCodePoint","chars$1","lookup$1","i$1","decode","polyUint16Array","polyUint32Array","UTRIE2_SHIFT_2","UTRIE2_SHIFT_1","UTRIE2_INDEX_SHIFT","UTRIE2_SHIFT_1_2","UTRIE2_LSCP_INDEX_2_OFFSET","UTRIE2_DATA_MASK","UTRIE2_INDEX_1_OFFSET","UTRIE2_OMITTED_BMP_INDEX_1_LENGTH","UTRIE2_INDEX_2_MASK","slice16","slice32","createTrieFromBase64","Trie","chars","lookup","i","base64","CR","LF","ZWJ","RI","BREAK_NOT_ALLOWED","BREAK_ALLOWED","UnicodeTrie","SPACE","fromCodePoint","toCodePoints","fromCodePoint","color","fromCodePoint","colorType","angle","angleType","angle","angleType","colorType","parseDisplayValue","color","transform","rotate","color","MIX_BLEND_MODE","VALID_VALUES","transform","colorType","toCodePoints","fromCodePoint","Segmenter","toCodePoints","fromCodePoint","MIX_BLEND_MODE","MIX_BLEND_MODE"],"sources":["../src/config.ts","../src/core/validator.ts","../src/core/performance-monitor.ts","../src/css/layout/bounds.ts","../node_modules/.pnpm/css-line-break@2.1.0/node_modules/css-line-break/dist/css-line-break.es5.js","../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/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/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/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/display.ts","../src/css/property-descriptors/float.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.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-color.ts","../src/css/property-descriptors/text-decoration-line.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-family.ts","../src/css/property-descriptors/font-size.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/content.ts","../src/css/property-descriptors/counter-increment.ts","../src/css/property-descriptors/counter-reset.ts","../src/css/property-descriptors/duration.ts","../src/css/property-descriptors/quotes.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/core/constants.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/slot-cloner.ts","../src/dom/document-cloner.ts","../src/dom/dom-normalizer.ts","../src/dom/element-container.ts","../node_modules/.pnpm/text-segmentation@1.0.3/node_modules/text-segmentation/dist/text-segmentation.es5.js","../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/box-sizing.ts","../src/render/background.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/object-fit.ts","../src/render/canvas/content-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/abort-helper.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    /** Indicates if runtime validation is recommended (e.g. for proxy URLs against DNS rebinding) */\n    requiresRuntimeCheck?: boolean;\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                // For proxy URLs, mark that runtime validation is recommended\n                // to prevent DNS rebinding attacks\n                return {\n                    valid: true,\n                    sanitized: url,\n                    requiresRuntimeCheck: true\n                };\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];\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            // Note: Proxy URLs are marked with requiresRuntimeCheck to prevent DNS rebinding\n            // Consider implementing runtime IP validation in production environments\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        }\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","/*\n * css-line-break 2.1.0 <https://github.com/niklasvh/css-line-break#readme>\n * Copyright (c) 2022 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar toCodePoints = function (str) {\n    var codePoints = [];\n    var i = 0;\n    var length = str.length;\n    while (i < length) {\n        var value = str.charCodeAt(i++);\n        if (value >= 0xd800 && value <= 0xdbff && i < length) {\n            var extra = str.charCodeAt(i++);\n            if ((extra & 0xfc00) === 0xdc00) {\n                codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n            }\n            else {\n                codePoints.push(value);\n                i--;\n            }\n        }\n        else {\n            codePoints.push(value);\n        }\n    }\n    return codePoints;\n};\nvar fromCodePoint = function () {\n    var codePoints = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        codePoints[_i] = arguments[_i];\n    }\n    if (String.fromCodePoint) {\n        return String.fromCodePoint.apply(String, codePoints);\n    }\n    var length = codePoints.length;\n    if (!length) {\n        return '';\n    }\n    var codeUnits = [];\n    var index = -1;\n    var result = '';\n    while (++index < length) {\n        var codePoint = codePoints[index];\n        if (codePoint <= 0xffff) {\n            codeUnits.push(codePoint);\n        }\n        else {\n            codePoint -= 0x10000;\n            codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00);\n        }\n        if (index + 1 === length || codeUnits.length > 0x4000) {\n            result += String.fromCharCode.apply(String, codeUnits);\n            codeUnits.length = 0;\n        }\n    }\n    return result;\n};\nvar chars$2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup$2 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i$2 = 0; i$2 < chars$2.length; i$2++) {\n    lookup$2[chars$2.charCodeAt(i$2)] = i$2;\n}\n\n/*\n * utrie 1.0.2 <https://github.com/niklasvh/utrie>\n * Copyright (c) 2022 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i$1 = 0; i$1 < chars$1.length; i$1++) {\n    lookup$1[chars$1.charCodeAt(i$1)] = i$1;\n}\nvar decode = function (base64) {\n    var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n    if (base64[base64.length - 1] === '=') {\n        bufferLength--;\n        if (base64[base64.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n    var buffer = typeof ArrayBuffer !== 'undefined' &&\n        typeof Uint8Array !== 'undefined' &&\n        typeof Uint8Array.prototype.slice !== 'undefined'\n        ? new ArrayBuffer(bufferLength)\n        : new Array(bufferLength);\n    var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\n    for (i = 0; i < len; i += 4) {\n        encoded1 = lookup$1[base64.charCodeAt(i)];\n        encoded2 = lookup$1[base64.charCodeAt(i + 1)];\n        encoded3 = lookup$1[base64.charCodeAt(i + 2)];\n        encoded4 = lookup$1[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return buffer;\n};\nvar polyUint16Array = function (buffer) {\n    var length = buffer.length;\n    var bytes = [];\n    for (var i = 0; i < length; i += 2) {\n        bytes.push((buffer[i + 1] << 8) | buffer[i]);\n    }\n    return bytes;\n};\nvar polyUint32Array = function (buffer) {\n    var length = buffer.length;\n    var bytes = [];\n    for (var i = 0; i < length; i += 4) {\n        bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\n    }\n    return bytes;\n};\n\n/** Shift size for getting the index-2 table offset. */\nvar UTRIE2_SHIFT_2 = 5;\n/** Shift size for getting the index-1 table offset. */\nvar UTRIE2_SHIFT_1 = 6 + 5;\n/**\n * Shift size for shifting left the index array values.\n * Increases possible data size with 16-bit index values at the cost\n * of compactability.\n * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.\n */\nvar UTRIE2_INDEX_SHIFT = 2;\n/**\n * Difference between the two shift sizes,\n * for getting an index-1 offset from an index-2 offset. 6=11-5\n */\nvar UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;\n/**\n * The part of the index-2 table for U+D800..U+DBFF stores values for\n * lead surrogate code _units_ not code _points_.\n * Values for lead surrogate code _points_ are indexed with this portion of the table.\n * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)\n */\nvar UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;\n/** Number of entries in a data block. 32=0x20 */\nvar UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;\n/** Mask for getting the lower bits for the in-data-block offset. */\nvar UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;\nvar UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;\n/** Count the lengths of both BMP pieces. 2080=0x820 */\nvar UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;\n/**\n * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.\n */\nvar UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;\nvar UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */\n/**\n * The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n * Variable length, for code points up to highStart, where the last single-value range starts.\n * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.\n * (For 0x100000 supplementary code points U+10000..U+10ffff.)\n *\n * The part of the index-2 table for supplementary code points starts\n * after this index-1 table.\n *\n * Both the index-1 table and the following part of the index-2 table\n * are omitted completely if there is only BMP data.\n */\nvar UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;\n/**\n * Number of index-1 entries for the BMP. 32=0x20\n * This part of the index-1 table is omitted from the serialized form.\n */\nvar UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;\n/** Number of entries in an index-2 block. 64=0x40 */\nvar UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;\n/** Mask for getting the lower bits for the in-index-2-block offset. */\nvar UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;\nvar slice16 = function (view, start, end) {\n    if (view.slice) {\n        return view.slice(start, end);\n    }\n    return new Uint16Array(Array.prototype.slice.call(view, start, end));\n};\nvar slice32 = function (view, start, end) {\n    if (view.slice) {\n        return view.slice(start, end);\n    }\n    return new Uint32Array(Array.prototype.slice.call(view, start, end));\n};\nvar createTrieFromBase64 = function (base64, _byteLength) {\n    var buffer = decode(base64);\n    var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);\n    var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);\n    var headerLength = 24;\n    var index = slice16(view16, headerLength / 2, view32[4] / 2);\n    var data = view32[5] === 2\n        ? slice16(view16, (headerLength + view32[4]) / 2)\n        : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));\n    return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);\n};\nvar Trie = /** @class */ (function () {\n    function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {\n        this.initialValue = initialValue;\n        this.errorValue = errorValue;\n        this.highStart = highStart;\n        this.highValueIndex = highValueIndex;\n        this.index = index;\n        this.data = data;\n    }\n    /**\n     * Get the value for a code point as stored in the Trie.\n     *\n     * @param codePoint the code point\n     * @return the value\n     */\n    Trie.prototype.get = function (codePoint) {\n        var ix;\n        if (codePoint >= 0) {\n            if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {\n                // Ordinary BMP code point, excluding leading surrogates.\n                // BMP uses a single level lookup.  BMP index starts at offset 0 in the Trie2 index.\n                // 16 bit data is stored in the index array itself.\n                ix = this.index[codePoint >> UTRIE2_SHIFT_2];\n                ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n                return this.data[ix];\n            }\n            if (codePoint <= 0xffff) {\n                // Lead Surrogate Code Point.  A Separate index section is stored for\n                // lead surrogate code units and code points.\n                //   The main index has the code unit data.\n                //   For this function, we need the code point data.\n                // Note: this expression could be refactored for slightly improved efficiency, but\n                //       surrogate code points will be so rare in practice that it's not worth it.\n                ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];\n                ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n                return this.data[ix];\n            }\n            if (codePoint < this.highStart) {\n                // Supplemental code point, use two-level lookup.\n                ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);\n                ix = this.index[ix];\n                ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;\n                ix = this.index[ix];\n                ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n                return this.data[ix];\n            }\n            if (codePoint <= 0x10ffff) {\n                return this.data[this.highValueIndex];\n            }\n        }\n        // Fall through.  The code point is outside of the legal range of 0..0x10ffff.\n        return this.errorValue;\n    };\n    return Trie;\n}());\n\n/*\n * base64-arraybuffer 1.0.2 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2022 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n}\n\nvar base64 = 'KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA==';\n\nvar LETTER_NUMBER_MODIFIER = 50;\n// Non-tailorable Line Breaking Classes\nvar BK = 1; //  Cause a line break (after)\nvar CR = 2; //  Cause a line break (after), except between CR and LF\nvar LF = 3; //  Cause a line break (after)\nvar CM = 4; //  Prohibit a line break between the character and the preceding character\nvar NL = 5; //  Cause a line break (after)\nvar WJ = 7; //  Prohibit line breaks before and after\nvar ZW = 8; //  Provide a break opportunity\nvar GL = 9; //  Prohibit line breaks before and after\nvar SP = 10; // Enable indirect line breaks\nvar ZWJ = 11; // Prohibit line breaks within joiner sequences\n// Break Opportunities\nvar B2 = 12; //  Provide a line break opportunity before and after the character\nvar BA = 13; //  Generally provide a line break opportunity after the character\nvar BB = 14; //  Generally provide a line break opportunity before the character\nvar HY = 15; //  Provide a line break opportunity after the character, except in numeric context\nvar CB = 16; //   Provide a line break opportunity contingent on additional information\n// Characters Prohibiting Certain Breaks\nvar CL = 17; //  Prohibit line breaks before\nvar CP = 18; //  Prohibit line breaks before\nvar EX = 19; //  Prohibit line breaks before\nvar IN = 20; //  Allow only indirect line breaks between pairs\nvar NS = 21; //  Allow only indirect line breaks before\nvar OP = 22; //  Prohibit line breaks after\nvar QU = 23; //  Act like they are both opening and closing\n// Numeric Context\nvar IS = 24; //  Prevent breaks after any and before numeric\nvar NU = 25; //  Form numeric expressions for line breaking purposes\nvar PO = 26; //  Do not break following a numeric expression\nvar PR = 27; //  Do not break in front of a numeric expression\nvar SY = 28; //  Prevent a break before; and allow a break after\n// Other Characters\nvar AI = 29; //  Act like AL when the resolvedEAW is N; otherwise; act as ID\nvar AL = 30; //  Are alphabetic characters or symbols that are used with alphabetic characters\nvar CJ = 31; //  Treat as NS or ID for strict or normal breaking.\nvar EB = 32; //  Do not break from following Emoji Modifier\nvar EM = 33; //  Do not break from preceding Emoji Base\nvar H2 = 34; //  Form Korean syllable blocks\nvar H3 = 35; //  Form Korean syllable blocks\nvar HL = 36; //  Do not break around a following hyphen; otherwise act as Alphabetic\nvar ID = 37; //  Break before or after; except in some numeric context\nvar JL = 38; //  Form Korean syllable blocks\nvar JV = 39; //  Form Korean syllable blocks\nvar JT = 40; //  Form Korean syllable blocks\nvar RI = 41; //  Keep pairs together. For pairs; break before and after other classes\nvar SA = 42; //  Provide a line break opportunity contingent on additional, language-specific context analysis\nvar XX = 43; //  Have as yet unknown line breaking behavior or unassigned code positions\nvar ea_OP = [0x2329, 0xff08];\nvar BREAK_MANDATORY = '!';\nvar BREAK_NOT_ALLOWED = '×';\nvar BREAK_ALLOWED = '÷';\nvar UnicodeTrie = createTrieFromBase64(base64);\nvar ALPHABETICS = [AL, HL];\nvar HARD_LINE_BREAKS = [BK, CR, LF, NL];\nvar SPACE = [SP, ZW];\nvar PREFIX_POSTFIX = [PR, PO];\nvar LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE);\nvar KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3];\nvar HYPHEN = [HY, BA];\nvar codePointsToCharacterClasses = function (codePoints, lineBreak) {\n    if (lineBreak === void 0) { lineBreak = 'strict'; }\n    var types = [];\n    var indices = [];\n    var categories = [];\n    codePoints.forEach(function (codePoint, index) {\n        var classType = UnicodeTrie.get(codePoint);\n        if (classType > LETTER_NUMBER_MODIFIER) {\n            categories.push(true);\n            classType -= LETTER_NUMBER_MODIFIER;\n        }\n        else {\n            categories.push(false);\n        }\n        if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) {\n            // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0\n            if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) {\n                indices.push(index);\n                return types.push(CB);\n            }\n        }\n        if (classType === CM || classType === ZWJ) {\n            // LB10 Treat any remaining combining mark or ZWJ as AL.\n            if (index === 0) {\n                indices.push(index);\n                return types.push(AL);\n            }\n            // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of\n            // the base character in all of the following rules. Treat ZWJ as if it were CM.\n            var prev = types[index - 1];\n            if (LINE_BREAKS.indexOf(prev) === -1) {\n                indices.push(indices[index - 1]);\n                return types.push(prev);\n            }\n            indices.push(index);\n            return types.push(AL);\n        }\n        indices.push(index);\n        if (classType === CJ) {\n            return types.push(lineBreak === 'strict' ? NS : ID);\n        }\n        if (classType === SA) {\n            return types.push(AL);\n        }\n        if (classType === AI) {\n            return types.push(AL);\n        }\n        // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL\n        // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised\n        // to take into account the actual line breaking properties for these characters.\n        if (classType === XX) {\n            if ((codePoint >= 0x20000 && codePoint <= 0x2fffd) || (codePoint >= 0x30000 && codePoint <= 0x3fffd)) {\n                return types.push(ID);\n            }\n            else {\n                return types.push(AL);\n            }\n        }\n        types.push(classType);\n    });\n    return [indices, types, categories];\n};\nvar isAdjacentWithSpaceIgnored = function (a, b, currentIndex, classTypes) {\n    var current = classTypes[currentIndex];\n    if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) {\n        var i = currentIndex;\n        while (i <= classTypes.length) {\n            i++;\n            var next = classTypes[i];\n            if (next === b) {\n                return true;\n            }\n            if (next !== SP) {\n                break;\n            }\n        }\n    }\n    if (current === SP) {\n        var i = currentIndex;\n        while (i > 0) {\n            i--;\n            var prev = classTypes[i];\n            if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) {\n                var n = currentIndex;\n                while (n <= classTypes.length) {\n                    n++;\n                    var next = classTypes[n];\n                    if (next === b) {\n                        return true;\n                    }\n                    if (next !== SP) {\n                        break;\n                    }\n                }\n            }\n            if (prev !== SP) {\n                break;\n            }\n        }\n    }\n    return false;\n};\nvar previousNonSpaceClassType = function (currentIndex, classTypes) {\n    var i = currentIndex;\n    while (i >= 0) {\n        var type = classTypes[i];\n        if (type === SP) {\n            i--;\n        }\n        else {\n            return type;\n        }\n    }\n    return 0;\n};\nvar _lineBreakAtIndex = function (codePoints, classTypes, indicies, index, forbiddenBreaks) {\n    if (indicies[index] === 0) {\n        return BREAK_NOT_ALLOWED;\n    }\n    var currentIndex = index - 1;\n    if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) {\n        return BREAK_NOT_ALLOWED;\n    }\n    var beforeIndex = currentIndex - 1;\n    var afterIndex = currentIndex + 1;\n    var current = classTypes[currentIndex];\n    // LB4 Always break after hard line breaks.\n    // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks.\n    var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0;\n    var next = classTypes[afterIndex];\n    if (current === CR && next === LF) {\n        return BREAK_NOT_ALLOWED;\n    }\n    if (HARD_LINE_BREAKS.indexOf(current) !== -1) {\n        return BREAK_MANDATORY;\n    }\n    // LB6 Do not break before hard line breaks.\n    if (HARD_LINE_BREAKS.indexOf(next) !== -1) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB7 Do not break before spaces or zero width space.\n    if (SPACE.indexOf(next) !== -1) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB8 Break before any character following a zero-width space, even if one or more spaces intervene.\n    if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) {\n        return BREAK_ALLOWED;\n    }\n    // LB8a Do not break after a zero width joiner.\n    if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // zwj emojis\n    if ((current === EB || current === EM) && UnicodeTrie.get(codePoints[afterIndex]) === ZWJ) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB11 Do not break before or after Word joiner and related characters.\n    if (current === WJ || next === WJ) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB12 Do not break after NBSP and related characters.\n    if (current === GL) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB12a Do not break before NBSP and related characters, except after spaces and hyphens.\n    if ([SP, BA, HY].indexOf(current) === -1 && next === GL) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.\n    if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB14 Do not break after ‘[’, even after spaces.\n    if (previousNonSpaceClassType(currentIndex, classTypes) === OP) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB15 Do not break within ‘”[’, even with intervening spaces.\n    if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces.\n    if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB17 Do not break within ‘——’, even with intervening spaces.\n    if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB18 Break after spaces.\n    if (current === SP) {\n        return BREAK_ALLOWED;\n    }\n    // LB19 Do not break before or after quotation marks, such as ‘ ” ’.\n    if (current === QU || next === QU) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB20 Break before and after unresolved CB.\n    if (next === CB || current === CB) {\n        return BREAK_ALLOWED;\n    }\n    // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents.\n    if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB21a Don't break after Hebrew + Hyphen.\n    if (before === HL && HYPHEN.indexOf(current) !== -1) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB21b Don’t break between Solidus and Hebrew letters.\n    if (current === SY && next === HL) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB22 Do not break before ellipsis.\n    if (next === IN) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB23 Do not break between digits and letters.\n    if ((ALPHABETICS.indexOf(next) !== -1 && current === NU) || (ALPHABETICS.indexOf(current) !== -1 && next === NU)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes.\n    if ((current === PR && [ID, EB, EM].indexOf(next) !== -1) ||\n        ([ID, EB, EM].indexOf(current) !== -1 && next === PO)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix.\n    if ((ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1) ||\n        (PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB25 Do not break between the following pairs of classes relevant to numbers:\n    if (\n    // (PR | PO) × ( OP | HY )? NU\n    ([PR, PO].indexOf(current) !== -1 &&\n        (next === NU || ([OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU))) ||\n        // ( OP | HY ) × NU\n        ([OP, HY].indexOf(current) !== -1 && next === NU) ||\n        // NU ×\t(NU | SY | IS)\n        (current === NU && [NU, SY, IS].indexOf(next) !== -1)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP)\n    if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) {\n        var prevIndex = currentIndex;\n        while (prevIndex >= 0) {\n            var type = classTypes[prevIndex];\n            if (type === NU) {\n                return BREAK_NOT_ALLOWED;\n            }\n            else if ([SY, IS].indexOf(type) !== -1) {\n                prevIndex--;\n            }\n            else {\n                break;\n            }\n        }\n    }\n    // NU (NU | SY | IS)* (CL | CP)? × (PO | PR))\n    if ([PR, PO].indexOf(next) !== -1) {\n        var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex;\n        while (prevIndex >= 0) {\n            var type = classTypes[prevIndex];\n            if (type === NU) {\n                return BREAK_NOT_ALLOWED;\n            }\n            else if ([SY, IS].indexOf(type) !== -1) {\n                prevIndex--;\n            }\n            else {\n                break;\n            }\n        }\n    }\n    // LB26 Do not break a Korean syllable.\n    if ((JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) ||\n        ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) ||\n        ([JT, H3].indexOf(current) !== -1 && next === JT)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB27 Treat a Korean Syllable Block the same as ID.\n    if ((KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1) ||\n        (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB28 Do not break between alphabetics (“at”).\n    if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).\n    if (current === IS && ALPHABETICS.indexOf(next) !== -1) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses.\n    if ((ALPHABETICS.concat(NU).indexOf(current) !== -1 &&\n        next === OP &&\n        ea_OP.indexOf(codePoints[afterIndex]) === -1) ||\n        (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // LB30a Break between two regional indicator symbols if and only if there are an even number of regional\n    // indicators preceding the position of the break.\n    if (current === RI && next === RI) {\n        var i = indicies[currentIndex];\n        var count = 1;\n        while (i > 0) {\n            i--;\n            if (classTypes[i] === RI) {\n                count++;\n            }\n            else {\n                break;\n            }\n        }\n        if (count % 2 !== 0) {\n            return BREAK_NOT_ALLOWED;\n        }\n    }\n    // LB30b Do not break between an emoji base and an emoji modifier.\n    if (current === EB && next === EM) {\n        return BREAK_NOT_ALLOWED;\n    }\n    return BREAK_ALLOWED;\n};\nvar cssFormattedClasses = function (codePoints, options) {\n    if (!options) {\n        options = { lineBreak: 'normal', wordBreak: 'normal' };\n    }\n    var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), indicies = _a[0], classTypes = _a[1], isLetterNumber = _a[2];\n    if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') {\n        classTypes = classTypes.map(function (type) { return ([NU, AL, SA].indexOf(type) !== -1 ? ID : type); });\n    }\n    var forbiddenBreakpoints = options.wordBreak === 'keep-all'\n        ? isLetterNumber.map(function (letterNumber, i) {\n            return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff;\n        })\n        : undefined;\n    return [indicies, classTypes, forbiddenBreakpoints];\n};\nvar Break = /** @class */ (function () {\n    function Break(codePoints, lineBreak, start, end) {\n        this.codePoints = codePoints;\n        this.required = lineBreak === BREAK_MANDATORY;\n        this.start = start;\n        this.end = end;\n    }\n    Break.prototype.slice = function () {\n        return fromCodePoint.apply(void 0, this.codePoints.slice(this.start, this.end));\n    };\n    return Break;\n}());\nvar LineBreaker = function (str, options) {\n    var codePoints = toCodePoints(str);\n    var _a = cssFormattedClasses(codePoints, options), indicies = _a[0], classTypes = _a[1], forbiddenBreakpoints = _a[2];\n    var length = codePoints.length;\n    var lastEnd = 0;\n    var nextIndex = 0;\n    return {\n        next: function () {\n            if (nextIndex >= length) {\n                return { done: true, value: null };\n            }\n            var lineBreak = BREAK_NOT_ALLOWED;\n            while (nextIndex < length &&\n                (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) ===\n                    BREAK_NOT_ALLOWED) { }\n            if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) {\n                var value = new Break(codePoints, lineBreak, lastEnd, nextIndex);\n                lastEnd = nextIndex;\n                return { value: value, done: false };\n            }\n            return { done: true, value: null };\n        },\n    };\n};\n\nexport { LineBreaker, fromCodePoint, toCodePoints };\n//# sourceMappingURL=css-line-break.es5.js.map\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 = 0x003d;\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 { fromCodePoint } from 'css-line-break';\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 = [];\n\n    while (isDigit(codePoints[c])) {\n        integers.push(codePoints[c++]);\n    }\n\n    const int = integers.length ? parseInt(fromCodePoint(...integers), 10) : 0;\n\n    if (codePoints[c] === FULL_STOP) {\n        c++;\n    }\n\n    const fraction = [];\n    while (isDigit(codePoints[c])) {\n        fraction.push(codePoints[c++]);\n    }\n\n    const fracd = fraction.length;\n    const frac = fracd ? parseInt(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 = [];\n\n    while (isDigit(codePoints[c])) {\n        exponent.push(codePoints[c++]);\n    }\n\n    const exp = exponent.length ? parseInt(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 { toCodePoints, fromCodePoint } from 'css-line-break';\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    constructor() {\n        this._value = [];\n    }\n\n    private _reset(): void {\n        this._value = [];\n    }\n\n    write(chunk: string): void {\n        this._value = this._value.concat(toCodePoints(chunk));\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                    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                    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: fromCodePoint(codePoint) };\n    }\n\n    private consumeCodePoint(): number {\n        const value = this._value.shift();\n\n        return typeof value === 'undefined' ? -1 : value;\n    }\n\n    private reconsumeCodePoint(codePoint: number) {\n        this._value.unshift(codePoint);\n    }\n\n    private peekCodePoint(delta: number): number {\n        if (delta >= this._value.length) {\n            return -1;\n        }\n\n        return this._value[delta];\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                fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? ZERO : digit))),\n                16\n            );\n            const end = parseInt(fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? F : digit))), 16);\n            return { type: TokenType.UNICODE_RANGE_TOKEN, start, end };\n        }\n\n        const start = parseInt(fromCodePoint(...digits), 16);\n        if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {\n            this.consumeCodePoint();\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(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: 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: 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        while (count > 0) {\n            const amount = Math.min(SLICE_STACK_SIZE, count);\n            value += fromCodePoint(...this._value.splice(0, amount));\n            count -= amount;\n        }\n        this._value.shift();\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[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._value.splice(0, i);\n                return BAD_STRING_TOKEN;\n            }\n\n            if (codePoint === REVERSE_SOLIDUS) {\n                const next = this._value[i + 1];\n                if (next !== EOF && next !== undefined) {\n                    if (next === LINE_FEED) {\n                        value += this.consumeStringSlice(i);\n                        i = -1;\n                        this._value.shift();\n                    } else if (isValidEscape(codePoint, next)) {\n                        value += this.consumeStringSlice(i);\n                        value += fromCodePoint(this.consumeEscapedCodePoint());\n                        i = -1;\n                    }\n                }\n            }\n\n            i++;\n        } while (true);\n    }\n\n    private consumeNumber() {\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 = fromCodePoint(codePoint);\n            while (isHex(this.peekCodePoint(0)) && hex.length < 6) {\n                hex += 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 += fromCodePoint(codePoint);\n            } else if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n                result += 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\n    | TokenType.LEFT_SQUARE_BRACKET_TOKEN\n    | 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","/**\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[ops[ops.length - 1]] >= precedence[tok]) {\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;\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/**\n * Multiply two 3x3 matrices\n */\nexport const multiplyMatrices = (A: number[], B: number[]): [number, number, number] => {\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 } 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: [number, number, number]): number[] => {\n    return rgb.map((c: 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};\n\n/**\n * Convert RGB to sRGB\n *\n * @param rgb\n */\nexport const rgb2rgbLinear = (rgb: [number, number, number]): number[] => {\n    return rgb.map((c: 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};\n\n/**\n * XYZ to SRGB\n *\n * @param args\n */\nexport const srgbFromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {\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: [number, number, number, number]): [number, number, number, number] => {\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 { 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 ? [tokens[0], tokens[1]] : [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 } from './color-math';\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    (tokens[0].type === TokenType.IDENT_TOKEN ? tokens[0].value : 'unknown') === 'from';\n\n// Re-export from color-math to maintain backward compatibility\nexport { clamp, multiplyMatrices };\n\nexport const packSrgb = (args: number[]): 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 = ([r, g, b, a]: [number, number, number, number]): number => {\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: number[]): 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 [l, a, b, alpha] = extractLabComponents(args),\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\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[]): [number, number, number, number] => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        [hue, saturation, lightness, alpha] = tokens,\n        h = (hue.type === TokenType.NUMBER_TOKEN ? deg(hue.number) : angle.parse(context, hue)) / (Math.PI * 2),\n        s = isLengthPercentage(saturation) ? saturation.number / 100 : 0,\n        l = isLengthPercentage(lightness) ? lightness.number / 100 : 0,\n        a = typeof 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, s === 0 ? 1 : a);\n};\n\nexport const extractLchComponents = (args: CSSValue[]): [number, number, number, number] => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        l = isLengthPercentage(tokens[0]) ? tokens[0].number : 0,\n        c = isLengthPercentage(tokens[1]) ? tokens[1].number : 0,\n        h = isNumberToken(tokens[2]) || isDimensionToken(tokens[2]) ? tokens[2].number : 0,\n        a = typeof tokens[4] !== 'undefined' && isLengthPercentage(tokens[4]) ? getAbsoluteValue(tokens[4], 1) : 1;\n\n    return [l, c, h, a];\n};\n\nexport const extractLabComponents = (args: CSSValue[]): [number, number, number, number] => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        l =\n            tokens[0].type === TokenType.PERCENTAGE_TOKEN\n                ? tokens[0].number / 100\n                : isNumberToken(tokens[0])\n                  ? tokens[0].number\n                  : 0,\n        a =\n            tokens[1].type === TokenType.PERCENTAGE_TOKEN\n                ? tokens[1].number / 100\n                : isNumberToken(tokens[1])\n                  ? tokens[1].number\n                  : 0,\n        b = isNumberToken(tokens[2]) || isDimensionToken(tokens[2]) ? tokens[2].number : 0,\n        alpha = typeof tokens[4] !== 'undefined' && isLengthPercentage(tokens[4]) ? getAbsoluteValue(tokens[4], 1) : 1;\n\n    return [l, a, b, alpha];\n};\n\nexport const extractOkLchComponents = (args: CSSValue[]): [number, number, number, number] => {\n    const tokens = args.filter(nonFunctionArgSeparator),\n        l =\n            tokens[0].type === TokenType.PERCENTAGE_TOKEN\n                ? tokens[0].number / 100\n                : isNumberToken(tokens[0])\n                  ? tokens[0].number\n                  : 0,\n        c =\n            tokens[1].type === TokenType.PERCENTAGE_TOKEN\n                ? tokens[1].number / 100\n                : isNumberToken(tokens[1])\n                  ? tokens[1].number\n                  : 0,\n        h = isNumberToken(tokens[2]) || isDimensionToken(tokens[2]) ? tokens[2].number : 0,\n        a = typeof tokens[4] !== 'undefined' && isLengthPercentage(tokens[4]) ? getAbsoluteValue(tokens[4], 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\nconst hsl2rgb = ([h, s, l]: [number, number, number]): [number, number, number] => {\n    if (s === 0) {\n        return [l * 255, l * 255, l * 255];\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 */\nconst 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 */\nconst 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 = LMSg.map((val: number) => val ** 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 */\nconst 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 = [\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) {\n        const [r, g, b] = tokens.map(getTokenColorValue),\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, 1];\n    }\n\n    if (tokens.length === 4) {\n        const [r, g, b, a] = tokens.map(getTokenColorValue),\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: number[]): [number, number, number] => {\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: number[]): 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: number[]): 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 { 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: [number, number, number]): number[] => {\n    return p3.map((c: 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};\n\n/**\n * Convert P3 Linear to P3\n *\n * @param p3l\n */\nexport const p3Linear2p3 = (p3l: [number, number, number]): number[] => {\n    return srgbLinear2rgb(p3l);\n};\n\n/**\n * Convert P3 to XYZ\n *\n * @param args\n */\nexport const p3ToXYZ = (args: number[]): number[] => {\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: number[]): 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 { 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], mapped[1], mapped[2]];\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], mapped[1], mapped[2]];\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: number[]): 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';\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: [number, number, number]): number[] => {\n    return p3.map((c: number) => {\n        return c < 16 / 512 ? c / 16 : c ** 1.8;\n    });\n};\n\n/**\n * Convert Pro-Photo Linear to Pro-Photo\n *\n * @param p3\n */\nexport const proPhotoLinearToProPhoto = (p3: [number, number, number]): number[] => {\n    return p3.map((c: number) => {\n        return c > 1 / 512 ? c ** (1 / 1.8) : c * 16;\n    });\n};\n\n/**\n * Convert Pro-Photo to XYZ\n *\n * @param args\n */\nexport const proPhotoToXYZ = (args: number[]): [number, number, number] => {\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: number[]): 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';\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: [number, number, number]): number[] => {\n    return rgb.map(function (c) {\n        return c < _b * 4.5 ? c / 4.5 : Math.pow((c + _a - 1) / _a, 1 / 0.45);\n    });\n};\n\n/**\n * Convert rec2020 linear to rec2020\n *\n * @param rgb\n */\nexport const rec2020Linear2rec2020 = (rgb: [number, number, number]): number[] => {\n    return rgb.map(function (c) {\n        return c >= _b ? _a * Math.pow(c, 0.45) - (_a - 1) : 4.5 * c;\n    });\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: number[]): [number, number, number] => {\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: number[]): 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 { 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 { 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';\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 COLORS.TRANSPARENT;\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) {\n        const [r, g, b] = tokens.map(getTokenColorValue);\n        return pack(r, g, b, 1);\n    }\n\n    if (tokens.length === 4) {\n        const [r, g, b, a] = tokens.map(getTokenColorValue);\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 && tokens[3].type === TokenType.DELIM_TOKEN && tokens[3].value === '/') {\n        const r = getTokenColorValue(tokens[0], 0);\n        const g = getTokenColorValue(tokens[1], 1);\n        const b = getTokenColorValue(tokens[2], 2);\n        const a = getTokenColorValue(tokens[4], 3);\n        return pack(r, g, b, a);\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_value = tokens[0].type === TokenType.IDENT_TOKEN ? tokens[0].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 c1 = isNumberToken(tokens[1]) ? tokens[1].number : 0,\n            c2 = isNumberToken(tokens[2]) ? tokens[2].number : 0,\n            c3 = isNumberToken(tokens[3]) ? tokens[3].number : 0,\n            a =\n                tokens.length > 4 &&\n                tokens[4].type === TokenType.DELIM_TOKEN &&\n                tokens[4].value === '/' &&\n                isNumberToken(tokens[5])\n                    ? tokens[5].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 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_colorspace =\n                tokens[1].type === TokenType.FUNCTION\n                    ? tokens[1].name\n                    : isIdentToken(tokens[1]) || tokens[1].type === TokenType.HASH_TOKEN\n                      ? 'rgb'\n                      : 'unknown',\n            to_colorspace = isIdentToken(tokens[2]) ? tokens[2].value : 'unknown';\n\n        let from =\n            tokens[1].type === TokenType.FUNCTION ? tokens[1].values : isIdentToken(tokens[1]) ? [tokens[1]] : [];\n\n        if (isIdentToken(tokens[1])) {\n            const named_color = COLORS[tokens[1].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, tokens[1].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 (tokens[1].type === TokenType.HASH_TOKEN) {\n            const [red, green, blue, alpha] = hash2rgb(tokens[1]);\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, tokens[3]),\n            c2 = extractComponent(from_final_colorspace, tokens[4]),\n            c3 = extractComponent(from_final_colorspace, tokens[5]),\n            a =\n                tokens.length > 6 &&\n                tokens[6].type === TokenType.DELIM_TOKEN &&\n                tokens[6].value === '/' &&\n                isNumberToken(tokens[7])\n                    ? tokens[7].number\n                    : 1;\n        if (c1 === null || c2 === null || c3 === null) {\n            throw new Error(`Invalid relative color in color() function`);\n        }\n\n        return toColorPack([c1, c2, c3, a]);\n    }\n};\n\nconst SUPPORTED_COLOR_SPACES_ABSOLUTE: {\n    [key: string]: (args: number[]) => 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};\n\nexport const parseColor = (context: Context, value: string): Color =>\n    color.parse(context, Parser.create(value).parseComponentValue());\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: 0x00000000,\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 { fromCodePoint } from 'css-line-break';\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 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                    counter[Math.max(0, counter.length - 1)] += 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            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            (codePoint) => 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 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 {\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, 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    const first = stops[0];\n    const last = stops[stops.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 < stops.length; i++) {\n        const stop = stops[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 = 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 stops.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 = [\n        [0, 0],\n        [0, height],\n        [width, 0],\n        [width, height]\n    ];\n\n    return corners.reduce(\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        rx = getAbsoluteValue(gradient.size[0], width);\n        ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.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.type === TokenType.IDENT_TOKEN && firstToken.value === 'to') {\n                angle = parseNamedSide(arg);\n                return;\n            } else if (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.type === TokenType.IDENT_TOKEN &&\n                ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1\n            ) {\n                angle = parseNamedSide(arg);\n                return;\n            } else if (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 {\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 (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, firstToken.values[0]);\n                stops.push({ stop: ZERO_LENGTH, color });\n            } else if (firstToken.name === 'to') {\n                const color = colorType.parse(context, 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, values[1]);\n                    const stop = 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.CIRCLE;\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.CIRCLE;\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 { 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 { Context } from '../../core/context';\n\nexport const enum CSSImageType {\n    URL,\n    LINEAR_GRADIENT,\n    RADIAL_GRADIENT,\n    REPEATING_LINEAR_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 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;\n    shape: CSSRadialShape;\n    size: CSSRadialSize;\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};\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.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 { 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}\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\nexport type ClipPathValue =\n    | NoneClipPath\n    | InsetClipPath\n    | CircleClipPath\n    | EllipseClipPath\n    | PolygonClipPath\n    | PathClipPath;\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 && isIdentToken(arg[0])) continue; // skip fill-rule\n        const lengths = arg.filter(isLengthPercentage);\n        if (lengths.length >= 2) {\n            points.push([lengths[0], 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\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            }\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, 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 { 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 } 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        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 { 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 { 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 { CSSValue, isIdentWithValue, parseFunctionArgs } from '../syntax/parser';\nimport { ZERO_LENGTH } from '../types/length-percentage';\nimport { color, Color, COLORS } 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(tokens[0], 'none')) {\n            return [];\n        }\n\n        return parseFunctionArgs(tokens).map((values: CSSValue[]) => {\n            const shadow: TextShadowItem = {\n                color: COLORS.TRANSPARENT,\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 (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 = color.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 { 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.filter((arg) => arg.type === TokenType.NUMBER_TOKEN).map((arg: NumberValueToken) => 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.filter((arg) => arg.type === TokenType.NUMBER_TOKEN).map((arg: NumberValueToken) => arg.number);\n\n    const [a1, b1, {}, {}, a2, b2, {}, {}, {}, {}, {}, {}, a4, b4, {}, {}] = values;\n\n    return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null;\n};\n\nconst rotate = (context: Context, args: CSSValue[]): Transform => {\n    if (args.length !== 1) {\n        return null;\n    }\n\n    const arg = 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';\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 [origins[0], 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 { 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 { 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 { 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        tokens.forEach((token) => {\n            switch (token.type) {\n                case TokenType.IDENT_TOKEN:\n                case TokenType.STRING_TOKEN:\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                    accumulator.length = 0;\n                    break;\n            }\n        });\n        if (accumulator.length) {\n            results.push(accumulator.join(' '));\n        }\n        return results.map((result) => (result.indexOf(' ') === -1 ? result : `'${result}'`));\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, 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 { 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.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n            return [];\n        }\n\n        return tokens;\n    }\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.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.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 { 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 { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\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.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 = filtered[i].value;\n            const close = 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 { PropertyDescriptorParsingType, IPropertyListDescriptor } from '../property-descriptor';\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(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 (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 { 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 && tokens[0].type === TokenType.IDENT_TOKEN && tokens[0].value === 'none') {\n            return null;\n        }\n\n        const parts: string[] = [];\n        for (const token of tokens) {\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}px)`);\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}deg)`);\n                        break;\n                    case 'drop-shadow':\n                        parts.push(`drop-shadow(${renderedArgs})`);\n                        break;\n                    default:\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            continue;\n        }\n        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(' ');\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 { 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 (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 [result[0], 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 { 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, filtered[0]);\n    }\n};\n","import { IPropertyListDescriptor, PropertyDescriptorParsingType } from '../property-descriptor';\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[] => {\n    const result = [...sides];\n    if (result.length === 1) {\n        result.push(result[0], result[0], result[0]);\n    } else if (result.length === 2) {\n        result.push(result[0], result[1]);\n    } else if (result.length === 3) {\n        result.push(result[1]);\n    }\n    return result.slice(0, 4);\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","/**\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/** 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","import type { CSSParsedDeclaration } from '../index';\n\n/**\n * Read-only grouped accessor for border-related CSS properties.\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 */\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 */\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 */\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 { 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, ClipPathValue } from './property-descriptors/clip-path';\nimport { color } from './property-descriptors/color';\nimport { direction } from './property-descriptors/direction';\nimport { display, DISPLAY } from './property-descriptors/display';\nimport { float, FLOAT } from './property-descriptors/float';\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 { overflow, OVERFLOW } from './property-descriptors/overflow';\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, 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, 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 { CSSValue, isIdentToken, Parser } from './syntax/parser';\nimport { Tokenizer } from './syntax/tokenizer';\nimport { Color, color as colorType } from './types/color';\nimport { isTransparent } from './types/color-utilities';\nimport { angle } from './types/angle';\nimport { image } from './types/image';\nimport { time } from './types/time';\nimport { opacity } from './property-descriptors/opacity';\nimport { textDecorationColor } from './property-descriptors/text-decoration-color';\nimport { textDecorationLine } from './property-descriptors/text-decoration-line';\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, LengthPercentage, ZERO_LENGTH } from './types/length-percentage';\nimport { fontFamily } from './property-descriptors/font-family';\nimport { fontSize } from './property-descriptors/font-size';\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 { contains } from '../core/bitwise';\nimport { content } from './property-descriptors/content';\nimport { counterIncrement } from './property-descriptors/counter-increment';\nimport { counterReset } from './property-descriptors/counter-reset';\nimport { duration } from './property-descriptors/duration';\nimport { quotes } from './property-descriptors/quotes';\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, 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 { PARSE_CACHE_MAX_PER_DESCRIPTOR } from '../core/constants';\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\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    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\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    private static readonly standardProps: [keyof CSSParsedDeclaration, 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        ['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    ];\n\n    constructor(context: Context, declaration: CSSStyleDeclaration) {\n        const standardProps = CSSParsedDeclaration.standardProps;\n\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 standardProps) {\n                if (key !== 'display') {\n                    (this as Record<string, unknown>)[key] = parse(context, descriptor, undefined);\n                }\n            }\n            this.float = parse(context, float, undefined);\n            this.textDecorationColor = parse(context, textDecorationColor, undefined);\n            this.textDecorationLine = parse(context, textDecorationLine, undefined);\n            const overflowTuple = parse(context, overflow, undefined);\n            this.overflowX = overflowTuple[0];\n            this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];\n            return;\n        }\n\n        for (const [key, descriptor, cssProp] of standardProps) {\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        this.float = parse(context, float, declaration.cssFloat);\n        this.textDecorationColor = parse(\n            context,\n            textDecorationColor,\n            declaration.textDecorationColor ?? declaration.color\n        );\n        this.textDecorationLine = parse(\n            context,\n            textDecorationLine,\n            declaration.textDecorationLine ?? declaration.textDecoration\n        );\n\n        // overflow returns a tuple that must be split into X/Y\n        const overflowTuple = parse(context, overflow, declaration.overflow);\n        this.overflowX = overflowTuple[0];\n        this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];\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;\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\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\nconst parseCache = new Map<CSSPropertyDescriptor<any>, Map<string, unknown>>();\n\nconst 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            valueCache.delete(oldestKey);\n        }\n        valueCache.set(rawValue, result);\n    }\n\n    return result;\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","import { isElementNode, isScriptElement, isSlotElement, isStyleElement } from './node-type-guards';\nimport { Context } from '../core/context';\n\n/** Options subset needed by SlotCloner */\nexport interface SlotClonerOptions {\n    ignoreElements?: (element: Element) => boolean;\n    copyStyles: boolean;\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    }\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    }\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 { 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 { DebuggerType, isDebugging } from '../core/debugger';\nimport { IGNORE_ATTRIBUTE, SlotCloner } from './slot-cloner';\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};\n\n/**\n * Trusted Types factory (getPolicy / createPolicy) for document.write in strict CSP environments.\n * Used in toIFrame() when writing initial HTML to the cloned document.\n */\ntype TrustedTypesFactory = {\n    getPolicy?: (name: string) => unknown;\n    createPolicy: (name: string, config: object) => unknown;\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 slotCloner: SlotCloner;\n    private quoteDepth: number;\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.quoteDepth = 0;\n        this.slotCloner = new SlotCloner(\n            (node, copyStyles) => this.cloneNode(node, copyStyles),\n            { ignoreElements: options.ignoreElements, copyStyles: options.copyStyles ?? true },\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    }\n\n    toIFrame(ownerDocument: Document, windowSize: Bounds): Promise<HTMLIFrameElement> {\n        const iframe: HTMLIFrameElement = createIFrameContainer(\n            ownerDocument,\n            windowSize,\n            this.options.iframeContainer\n        );\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).then(async () => {\n            this.scrolledElements.forEach(restoreNodeScroll);\n            if (cloneWindow) {\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                    this.context.logger.warn('Unable to restore scroll position for cloned document');\n                    this.context.windowBounds = this.context.windowBounds.add(\n                        cloneWindow.scrollX - windowSize.left,\n                        cloneWindow.scrollY - windowSize.top,\n                        0,\n                        0\n                    );\n                }\n            }\n\n            const onclone = this.options.onclone;\n\n            const referenceElement = this.clonedReferenceElement;\n\n            if (typeof referenceElement === 'undefined') {\n                throw new Error(`Error finding the ${this.referenceElement.nodeName} in the cloned document`);\n            }\n\n            if (documentClone.fonts && documentClone.fonts.ready) {\n                await documentClone.fonts.ready;\n            }\n\n            if (/(AppleWebKit)/g.test(navigator.userAgent)) {\n                await imagesReady(documentClone);\n            }\n\n            if (typeof onclone === 'function') {\n                return Promise.resolve()\n                    .then(() => onclone(documentClone, referenceElement))\n                    .then(() => iframe);\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(document.doctype) + '<html></html>'\n        // No user-controlled input — safe for document.write in the sandbox iframe.\n        const rawHTML = serializeDoctype(document.doctype) + '<html></html>';\n        try {\n            const ownerWindow = this.referenceElement.ownerDocument?.defaultView;\n            const trustedTypesFactory =\n                ownerWindow && (ownerWindow as Window & { trustedTypes?: TrustedTypesFactory }).trustedTypes;\n            let policy = trustedTypesFactory?.getPolicy?.('html2canvas-pro');\n            if (!policy && trustedTypesFactory) {\n                policy = trustedTypesFactory.createPolicy('html2canvas-pro', {\n                    createHTML: (s: string) => s\n                });\n            }\n            // Prefer Trusted Types when available; fallback is the same static HTML.\n            const html = policy ? (policy as { createHTML: (s: string) => string }).createHTML(rawHTML) : rawHTML;\n            // CodeQL:no - rawHTML is a static internal string, never user-controlled\n            documentClone.write(html as string);\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(this.referenceElement.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(this.documentElement);\n        addBase(adoptedNode, baseUri);\n        documentClone.replaceChild(adoptedNode, documentClone.documentElement);\n\n        return iframeLoad;\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[i];\n            if (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.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 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.resolvePseudoContent(node, clone, styleBefore, PseudoElementType.BEFORE);\n                if (before) {\n                    clone.insertBefore(before, clone.firstChild);\n                }\n\n                const styleAfter = window.getComputedStyle(node, ':after');\n                const after = this.resolvePseudoContent(node, clone, styleAfter, PseudoElementType.AFTER);\n                if (after) {\n                    clone.appendChild(after);\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            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    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) {\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                        anonymousReplacedElement.appendChild(\n                            document.createTextNode(getQuote(declaration.quotes, --this.quoteDepth, false))\n                        );\n                        break;\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    static destroy(container: HTMLIFrameElement): boolean {\n        if (container.parentNode) {\n            container.parentNode.removeChild(container);\n            return true;\n        }\n        return false;\n    }\n}\n\nenum PseudoElementType {\n    BEFORE,\n    AFTER\n}\n\nconst 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 = (iframe: HTMLIFrameElement): 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\n        cloneWindow.onload = iframe.onload = () => {\n            cloneWindow.onload = iframe.onload = null;\n            const MAX_POLL_ATTEMPTS = 600; // 30 seconds at 50ms intervals\n            let attempts = 0;\n            const interval = setInterval(() => {\n                attempts++;\n                if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {\n                    clearInterval(interval);\n                    resolve(iframe);\n                } else if (attempts >= MAX_POLL_ATTEMPTS) {\n                    clearInterval(interval);\n                    resolve(iframe); // resolve anyway to avoid hanging\n                }\n            }, 50);\n        };\n    });\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/**\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]: [HTMLElement, number, number]) => {\n    element.scrollLeft = x;\n    element.scrollTop = y;\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\nconst createPseudoHideStyles = (body: HTMLElement, cspNonce?: string) => {\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) => {\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\nconst 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","/**\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 } 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}\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        if (!isHTMLElementNode(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        // Same rationale for the standalone `rotate` property.\n        // `rotate: 0deg` is an identity rotation with no visual effect.\n        //\n        // However, individual transform properties (`rotate`, `translate`, `scale`)\n        // are part of CSS Transforms Level 2 and their containing-block guarantee\n        // is not uniformly implemented across all browsers. To be safe, if `rotate`\n        // is the only transform-like property active on this element, we also set\n        // `transform: translate(0, 0)` so that the containing-block role is reliably\n        // preserved via the well-supported `transform` property.\n        if (styles.rotate !== null) {\n            originalStyles.rotate = element.style.rotate;\n            element.style.rotate = '0deg';\n\n            // Individual transform properties (`rotate`, `translate`, `scale`) are\n            // CSS Transforms Level 2 and their containing-block guarantee is not\n            // uniformly implemented in all browsers. If `transform` was not already\n            // set to translate(0,0) in the block above (i.e. this element has\n            // `rotate` but no `transform`), we set it now so the containing-block\n            // role is reliably established via the widely-supported `transform`\n            // property – independently of browser support for individual props.\n            if (originalStyles.transform === undefined) {\n                originalStyles.transform = element.style.transform;\n                element.style.transform = 'translate(0, 0)';\n            }\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)) {\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}\n","import { CSSParsedDeclaration } from '../css/index';\nimport { TextContainer } from './text-container';\nimport { Bounds, parseBounds } from '../css/layout/bounds';\nimport { isHTMLElementNode } 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        if (shouldNormalize && isHTMLElementNode(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 * text-segmentation 1.0.3 <https://github.com/niklasvh/text-segmentation>\n * Copyright (c) 2022 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar base64 = 'AAAAAAAAAAAAEA4AGBkAAFAaAAACAAAAAAAIABAAGAAwADgACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAQABIAEQATAAIABAACAAQAAgAEAAIABAAVABcAAgAEAAIABAACAAQAGAAaABwAHgAgACIAI4AlgAIABAAmwCjAKgAsAC2AL4AvQDFAMoA0gBPAVYBWgEIAAgACACMANoAYgFkAWwBdAF8AX0BhQGNAZUBlgGeAaMBlQGWAasBswF8AbsBwwF0AcsBYwHTAQgA2wG/AOMBdAF8AekB8QF0AfkB+wHiAHQBfAEIAAMC5gQIAAsCEgIIAAgAFgIeAggAIgIpAggAMQI5AkACygEIAAgASAJQAlgCYAIIAAgACAAKBQoFCgUTBRMFGQUrBSsFCAAIAAgACAAIAAgACAAIAAgACABdAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABoAmgCrwGvAQgAbgJ2AggAHgEIAAgACADnAXsCCAAIAAgAgwIIAAgACAAIAAgACACKAggAkQKZAggAPADJAAgAoQKkAqwCsgK6AsICCADJAggA0AIIAAgACAAIANYC3gIIAAgACAAIAAgACABAAOYCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAkASoB+QIEAAgACAA8AEMCCABCBQgACABJBVAFCAAIAAgACAAIAAgACAAIAAgACABTBVoFCAAIAFoFCABfBWUFCAAIAAgACAAIAAgAbQUIAAgACAAIAAgACABzBXsFfQWFBYoFigWKBZEFigWKBYoFmAWfBaYFrgWxBbkFCAAIAAgACAAIAAgACAAIAAgACAAIAMEFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAMgFCADQBQgACAAIAAgACAAIAAgACAAIAAgACAAIAO4CCAAIAAgAiQAIAAgACABAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAD0AggACAD8AggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIANYFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAMDvwAIAAgAJAIIAAgACAAIAAgACAAIAAgACwMTAwgACAB9BOsEGwMjAwgAKwMyAwsFYgE3A/MEPwMIAEUDTQNRAwgAWQOsAGEDCAAIAAgACAAIAAgACABpAzQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFIQUoBSwFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABtAwgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABMAEwACAAIAAgACAAIABgACAAIAAgACAC/AAgACAAyAQgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACAAIAAwAAgACAAIAAgACAAIAAgACAAIAAAARABIAAgACAAIABQASAAIAAgAIABwAEAAjgCIABsAqAC2AL0AigDQAtwC+IJIQqVAZUBWQqVAZUBlQGVAZUBlQGrC5UBlQGVAZUBlQGVAZUBlQGVAXsKlQGVAbAK6wsrDGUMpQzlDJUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAfAKAAuZA64AtwCJALoC6ADwAAgAuACgA/oEpgO6AqsD+AAIAAgAswMIAAgACAAIAIkAuwP5AfsBwwPLAwgACAAIAAgACADRA9kDCAAIAOED6QMIAAgACAAIAAgACADuA/YDCAAIAP4DyQAIAAgABgQIAAgAXQAOBAgACAAIAAgACAAIABMECAAIAAgACAAIAAgACAD8AAQBCAAIAAgAGgQiBCoECAExBAgAEAEIAAgACAAIAAgACAAIAAgACAAIAAgACAA4BAgACABABEYECAAIAAgATAQYAQgAVAQIAAgACAAIAAgACAAIAAgACAAIAFoECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAOQEIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAB+BAcACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEABhgSMBAgACAAIAAgAlAQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAwAEAAQABAADAAMAAwADAAQABAAEAAQABAAEAAQABHATAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAdQMIAAgACAAIAAgACAAIAMkACAAIAAgAfQMIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACFA4kDCAAIAAgACAAIAOcBCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAIcDCAAIAAgACAAIAAgACAAIAAgACAAIAJEDCAAIAAgACADFAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABgBAgAZgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAbAQCBXIECAAIAHkECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAJwEQACjBKoEsgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAC6BMIECAAIAAgACAAIAAgACABmBAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAxwQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAGYECAAIAAgAzgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBd0FXwUIAOIF6gXxBYoF3gT5BQAGCAaKBYoFigWKBYoFigWKBYoFigWKBYoFigXWBIoFigWKBYoFigWKBYoFigWKBYsFEAaKBYoFigWKBYoFigWKBRQGCACKBYoFigWKBQgACAAIANEECAAIABgGigUgBggAJgYIAC4GMwaKBYoF0wQ3Bj4GigWKBYoFigWKBYoFigWKBYoFigWKBYoFigUIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWLBf///////wQABAAEAAQABAAEAAQABAAEAAQAAwAEAAQAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAQADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUAAAAFAAUAAAAFAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAQAAAAUABQAFAAUABQAFAAAAAAAFAAUAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAFAAUAAQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAAABwAHAAcAAAAHAAcABwAFAAEAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAcABwAFAAUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQABAAAAAAAAAAAAAAAFAAUABQAFAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAHAAcAAAAHAAcAAAAAAAUABQAHAAUAAQAHAAEABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwABAAUABQAFAAUAAAAAAAAAAAAAAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABQANAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAABQAHAAUABQAFAAAAAAAAAAcABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUAAAAFAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAUAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAcABwAFAAcABwAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUABwAHAAUABQAFAAUAAAAAAAcABwAAAAAABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAAAAAAAAAAABQAFAAAAAAAFAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAFAAUABQAFAAUAAAAFAAUABwAAAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABwAFAAUABQAFAAAAAAAHAAcAAAAAAAcABwAFAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAAAAAAAAAHAAcABwAAAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAUABQAFAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAHAAcABQAHAAcAAAAFAAcABwAAAAcABwAFAAUAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAFAAcABwAFAAUABQAAAAUAAAAHAAcABwAHAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAHAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAUAAAAFAAUAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABwAFAAUABQAFAAUABQAAAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABQAFAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAFAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAHAAUABQAFAAUABQAFAAUABwAHAAcABwAHAAcABwAHAAUABwAHAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABwAHAAcABwAFAAUABwAHAAcAAAAAAAAAAAAHAAcABQAHAAcABwAHAAcABwAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAUABQAFAAUABQAFAAUAAAAFAAAABQAAAAAABQAFAAUABQAFAAUABQAFAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAUABQAFAAUABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABwAFAAcABwAHAAcABwAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAUABQAFAAUABwAHAAUABQAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABQAFAAcABwAHAAUABwAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAcABQAFAAUABQAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAAAAAABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAUABQAHAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAFAAUABQAFAAcABwAFAAUABwAHAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAcABwAFAAUABwAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABQAAAAAABQAFAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAcABwAAAAAAAAAAAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAcABwAFAAcABwAAAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAFAAUABQAAAAUABQAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABwAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAHAAcABQAHAAUABQAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAAABwAHAAAAAAAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAFAAUABwAFAAcABwAFAAcABQAFAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAAAAAABwAHAAcABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAFAAcABwAFAAUABQAFAAUABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAUABQAFAAcABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABQAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAAAAAAFAAUABwAHAAcABwAFAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAHAAUABQAFAAUABQAFAAUABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAABQAAAAUABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAHAAcAAAAFAAUAAAAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABQAFAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAABQAFAAUABQAFAAUABQAAAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAFAAUABQAFAAUADgAOAA4ADgAOAA4ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAAAAAAAAAAAAsADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAADgAOAA4AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAAAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4AAAAOAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAAAAAAAAAAAA4AAAAOAAAAAAAAAAAADgAOAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAA=';\n\n/*\n * utrie 1.0.2 <https://github.com/niklasvh/utrie>\n * Copyright (c) 2022 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i$1 = 0; i$1 < chars$1.length; i$1++) {\n    lookup$1[chars$1.charCodeAt(i$1)] = i$1;\n}\nvar decode = function (base64) {\n    var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n    if (base64[base64.length - 1] === '=') {\n        bufferLength--;\n        if (base64[base64.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n    var buffer = typeof ArrayBuffer !== 'undefined' &&\n        typeof Uint8Array !== 'undefined' &&\n        typeof Uint8Array.prototype.slice !== 'undefined'\n        ? new ArrayBuffer(bufferLength)\n        : new Array(bufferLength);\n    var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\n    for (i = 0; i < len; i += 4) {\n        encoded1 = lookup$1[base64.charCodeAt(i)];\n        encoded2 = lookup$1[base64.charCodeAt(i + 1)];\n        encoded3 = lookup$1[base64.charCodeAt(i + 2)];\n        encoded4 = lookup$1[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return buffer;\n};\nvar polyUint16Array = function (buffer) {\n    var length = buffer.length;\n    var bytes = [];\n    for (var i = 0; i < length; i += 2) {\n        bytes.push((buffer[i + 1] << 8) | buffer[i]);\n    }\n    return bytes;\n};\nvar polyUint32Array = function (buffer) {\n    var length = buffer.length;\n    var bytes = [];\n    for (var i = 0; i < length; i += 4) {\n        bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\n    }\n    return bytes;\n};\n\n/** Shift size for getting the index-2 table offset. */\nvar UTRIE2_SHIFT_2 = 5;\n/** Shift size for getting the index-1 table offset. */\nvar UTRIE2_SHIFT_1 = 6 + 5;\n/**\n * Shift size for shifting left the index array values.\n * Increases possible data size with 16-bit index values at the cost\n * of compactability.\n * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.\n */\nvar UTRIE2_INDEX_SHIFT = 2;\n/**\n * Difference between the two shift sizes,\n * for getting an index-1 offset from an index-2 offset. 6=11-5\n */\nvar UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;\n/**\n * The part of the index-2 table for U+D800..U+DBFF stores values for\n * lead surrogate code _units_ not code _points_.\n * Values for lead surrogate code _points_ are indexed with this portion of the table.\n * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)\n */\nvar UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;\n/** Number of entries in a data block. 32=0x20 */\nvar UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;\n/** Mask for getting the lower bits for the in-data-block offset. */\nvar UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;\nvar UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;\n/** Count the lengths of both BMP pieces. 2080=0x820 */\nvar UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;\n/**\n * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.\n */\nvar UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;\nvar UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */\n/**\n * The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n * Variable length, for code points up to highStart, where the last single-value range starts.\n * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.\n * (For 0x100000 supplementary code points U+10000..U+10ffff.)\n *\n * The part of the index-2 table for supplementary code points starts\n * after this index-1 table.\n *\n * Both the index-1 table and the following part of the index-2 table\n * are omitted completely if there is only BMP data.\n */\nvar UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;\n/**\n * Number of index-1 entries for the BMP. 32=0x20\n * This part of the index-1 table is omitted from the serialized form.\n */\nvar UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;\n/** Number of entries in an index-2 block. 64=0x40 */\nvar UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;\n/** Mask for getting the lower bits for the in-index-2-block offset. */\nvar UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;\nvar slice16 = function (view, start, end) {\n    if (view.slice) {\n        return view.slice(start, end);\n    }\n    return new Uint16Array(Array.prototype.slice.call(view, start, end));\n};\nvar slice32 = function (view, start, end) {\n    if (view.slice) {\n        return view.slice(start, end);\n    }\n    return new Uint32Array(Array.prototype.slice.call(view, start, end));\n};\nvar createTrieFromBase64 = function (base64, _byteLength) {\n    var buffer = decode(base64);\n    var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);\n    var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);\n    var headerLength = 24;\n    var index = slice16(view16, headerLength / 2, view32[4] / 2);\n    var data = view32[5] === 2\n        ? slice16(view16, (headerLength + view32[4]) / 2)\n        : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));\n    return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);\n};\nvar Trie = /** @class */ (function () {\n    function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {\n        this.initialValue = initialValue;\n        this.errorValue = errorValue;\n        this.highStart = highStart;\n        this.highValueIndex = highValueIndex;\n        this.index = index;\n        this.data = data;\n    }\n    /**\n     * Get the value for a code point as stored in the Trie.\n     *\n     * @param codePoint the code point\n     * @return the value\n     */\n    Trie.prototype.get = function (codePoint) {\n        var ix;\n        if (codePoint >= 0) {\n            if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {\n                // Ordinary BMP code point, excluding leading surrogates.\n                // BMP uses a single level lookup.  BMP index starts at offset 0 in the Trie2 index.\n                // 16 bit data is stored in the index array itself.\n                ix = this.index[codePoint >> UTRIE2_SHIFT_2];\n                ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n                return this.data[ix];\n            }\n            if (codePoint <= 0xffff) {\n                // Lead Surrogate Code Point.  A Separate index section is stored for\n                // lead surrogate code units and code points.\n                //   The main index has the code unit data.\n                //   For this function, we need the code point data.\n                // Note: this expression could be refactored for slightly improved efficiency, but\n                //       surrogate code points will be so rare in practice that it's not worth it.\n                ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];\n                ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n                return this.data[ix];\n            }\n            if (codePoint < this.highStart) {\n                // Supplemental code point, use two-level lookup.\n                ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);\n                ix = this.index[ix];\n                ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;\n                ix = this.index[ix];\n                ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n                return this.data[ix];\n            }\n            if (codePoint <= 0x10ffff) {\n                return this.data[this.highValueIndex];\n            }\n        }\n        // Fall through.  The code point is outside of the legal range of 0..0x10ffff.\n        return this.errorValue;\n    };\n    return Trie;\n}());\n\n/*\n * base64-arraybuffer 1.0.2 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2022 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n}\n\nvar Prepend = 1;\nvar CR = 2;\nvar LF = 3;\nvar Control = 4;\nvar Extend = 5;\nvar SpacingMark = 7;\nvar L = 8;\nvar V = 9;\nvar T = 10;\nvar LV = 11;\nvar LVT = 12;\nvar ZWJ = 13;\nvar Extended_Pictographic = 14;\nvar RI = 15;\nvar toCodePoints = function (str) {\n    var codePoints = [];\n    var i = 0;\n    var length = str.length;\n    while (i < length) {\n        var value = str.charCodeAt(i++);\n        if (value >= 0xd800 && value <= 0xdbff && i < length) {\n            var extra = str.charCodeAt(i++);\n            if ((extra & 0xfc00) === 0xdc00) {\n                codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n            }\n            else {\n                codePoints.push(value);\n                i--;\n            }\n        }\n        else {\n            codePoints.push(value);\n        }\n    }\n    return codePoints;\n};\nvar fromCodePoint = function () {\n    var codePoints = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        codePoints[_i] = arguments[_i];\n    }\n    if (String.fromCodePoint) {\n        return String.fromCodePoint.apply(String, codePoints);\n    }\n    var length = codePoints.length;\n    if (!length) {\n        return '';\n    }\n    var codeUnits = [];\n    var index = -1;\n    var result = '';\n    while (++index < length) {\n        var codePoint = codePoints[index];\n        if (codePoint <= 0xffff) {\n            codeUnits.push(codePoint);\n        }\n        else {\n            codePoint -= 0x10000;\n            codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00);\n        }\n        if (index + 1 === length || codeUnits.length > 0x4000) {\n            result += String.fromCharCode.apply(String, codeUnits);\n            codeUnits.length = 0;\n        }\n    }\n    return result;\n};\nvar UnicodeTrie = createTrieFromBase64(base64);\nvar BREAK_NOT_ALLOWED = '×';\nvar BREAK_ALLOWED = '÷';\nvar codePointToClass = function (codePoint) { return UnicodeTrie.get(codePoint); };\nvar _graphemeBreakAtIndex = function (_codePoints, classTypes, index) {\n    var prevIndex = index - 2;\n    var prev = classTypes[prevIndex];\n    var current = classTypes[index - 1];\n    var next = classTypes[index];\n    // GB3 Do not break between a CR and LF\n    if (current === CR && next === LF) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // GB4 Otherwise, break before and after controls.\n    if (current === CR || current === LF || current === Control) {\n        return BREAK_ALLOWED;\n    }\n    // GB5\n    if (next === CR || next === LF || next === Control) {\n        return BREAK_ALLOWED;\n    }\n    // Do not break Hangul syllable sequences.\n    // GB6\n    if (current === L && [L, V, LV, LVT].indexOf(next) !== -1) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // GB7\n    if ((current === LV || current === V) && (next === V || next === T)) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // GB8\n    if ((current === LVT || current === T) && next === T) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // GB9 Do not break before extending characters or ZWJ.\n    if (next === ZWJ || next === Extend) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // Do not break before SpacingMarks, or after Prepend characters.\n    // GB9a\n    if (next === SpacingMark) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // GB9a\n    if (current === Prepend) {\n        return BREAK_NOT_ALLOWED;\n    }\n    // GB11 Do not break within emoji modifier sequences or emoji zwj sequences.\n    if (current === ZWJ && next === Extended_Pictographic) {\n        while (prev === Extend) {\n            prev = classTypes[--prevIndex];\n        }\n        if (prev === Extended_Pictographic) {\n            return BREAK_NOT_ALLOWED;\n        }\n    }\n    // GB12 Do not break within emoji flag sequences.\n    // That is, do not break between regional indicator (RI) symbols\n    // if there is an odd number of RI characters before the break point.\n    if (current === RI && next === RI) {\n        var countRI = 0;\n        while (prev === RI) {\n            countRI++;\n            prev = classTypes[--prevIndex];\n        }\n        if (countRI % 2 === 0) {\n            return BREAK_NOT_ALLOWED;\n        }\n    }\n    return BREAK_ALLOWED;\n};\nvar GraphemeBreaker = function (str) {\n    var codePoints = toCodePoints(str);\n    var length = codePoints.length;\n    var index = 0;\n    var lastEnd = 0;\n    var classTypes = codePoints.map(codePointToClass);\n    return {\n        next: function () {\n            if (index >= length) {\n                return { done: true, value: null };\n            }\n            var graphemeBreak = BREAK_NOT_ALLOWED;\n            while (index < length &&\n                (graphemeBreak = _graphemeBreakAtIndex(codePoints, classTypes, ++index)) === BREAK_NOT_ALLOWED) { }\n            if (graphemeBreak !== BREAK_NOT_ALLOWED || index === length) {\n                var value = fromCodePoint.apply(null, codePoints.slice(lastEnd, index));\n                lastEnd = index;\n                return { value: value, done: false };\n            }\n            return { done: true, value: null };\n        },\n    };\n};\nvar splitGraphemes = function (str) {\n    var breaker = GraphemeBreaker(str);\n    var graphemes = [];\n    var bk;\n    while (!(bk = breaker.next()).done) {\n        if (bk.value) {\n            graphemes.push(bk.value.slice());\n        }\n    }\n    return graphemes;\n};\n\nexport { GraphemeBreaker, fromCodePoint, splitGraphemes, toCodePoints };\n//# sourceMappingURL=text-segmentation.es5.js.map\n","import { fromCodePoint, toCodePoints } from 'css-line-break';\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 testIOSLineBreak = (document: Document) => {\n    const testElement = document.createElement('boundtest');\n    testElement.style.width = '50px';\n    testElement.style.display = 'block';\n    testElement.style.fontSize = '12px';\n    testElement.style.letterSpacing = '0px';\n    testElement.style.wordSpacing = '0px';\n    document.body.appendChild(testElement);\n    const range = document.createRange();\n\n    testElement.innerHTML = typeof ''.repeat === 'function' ? '&#128104;'.repeat(10) : '';\n\n    const node = testElement.firstChild as Text;\n\n    const textList = toCodePoints(node.data).map((i) => fromCodePoint(i));\n    let offset = 0;\n    let prev: DOMRect = {} as DOMRect;\n\n    // ios 13 does not handle range getBoundingClientRect line changes correctly #2177\n    const supports = textList.every((text, i) => {\n        range.setStart(node, offset);\n        range.setEnd(node, offset + text.length);\n        const rect = range.getBoundingClientRect();\n\n        offset += text.length;\n        const boundAhead = rect.x > prev.x || rect.y > prev.y;\n\n        prev = rect;\n        if (i === 0) {\n            return true;\n        }\n\n        return boundAhead;\n    });\n\n    document.body.removeChild(testElement);\n    return supports;\n};\n\nconst testCORS = (): boolean => typeof new Image().crossOrigin !== 'undefined';\n\nconst testResponseType = (): boolean => typeof new XMLHttpRequest().responseType === 'string';\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\nconst isGreenPixel = (data: Uint8ClampedArray): boolean =>\n    data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;\n\nconst testForeignObject = (document: Document): Promise<boolean> => {\n    const canvas = document.createElement('canvas');\n    const size = 100;\n    canvas.width = size;\n    canvas.height = size;\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n        return Promise.reject(new Error('Failed to get 2D rendering context'));\n    }\n    ctx.fillStyle = 'rgb(0, 255, 0)';\n    ctx.fillRect(0, 0, size, size);\n\n    const img = new Image();\n    const greenImageSrc = canvas.toDataURL();\n    img.src = greenImageSrc;\n    const svg = createForeignObjectSVG(size, size, 0, 0, img);\n    ctx.fillStyle = 'red';\n    ctx.fillRect(0, 0, size, size);\n\n    return loadSerializedSVG(svg)\n        .then((img: HTMLImageElement) => {\n            ctx.drawImage(img, 0, 0);\n            const data = ctx.getImageData(0, 0, size, size).data;\n            ctx.fillStyle = 'red';\n            ctx.fillRect(0, 0, size, size);\n\n            const node = document.createElement('div');\n            node.style.backgroundImage = `url(${greenImageSrc})`;\n            node.style.height = `${size}px`;\n            // Firefox 55 does not render inline <img /> tags\n            return isGreenPixel(data)\n                ? loadSerializedSVG(createForeignObjectSVG(size, size, 0, 0, node))\n                : Promise.reject(new Error('ForeignObject rendering not supported'));\n        })\n        .then((img: HTMLImageElement) => {\n            ctx.drawImage(img, 0, 0);\n            // Edge does not render background-images\n            return isGreenPixel(ctx.getImageData(0, 0, size, size).data);\n        })\n        .catch(() => false);\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_WORD_BREAKING(): boolean {\n        'use strict';\n        const value = FEATURES.SUPPORT_RANGE_BOUNDS && testIOSLineBreak(document);\n        Object.defineProperty(FEATURES, 'SUPPORT_WORD_BREAKING', { 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_FOREIGNOBJECT_DRAWING(): Promise<boolean> {\n        'use strict';\n        const value =\n            typeof Array.from === 'function' && typeof window.fetch === 'function'\n                ? testForeignObject(document)\n                : Promise.resolve(false);\n        Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_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    get SUPPORT_RESPONSE_TYPE(): boolean {\n        'use strict';\n        const value = testResponseType();\n        Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value });\n        return value;\n    },\n    get SUPPORT_CORS_XHR(): boolean {\n        'use strict';\n        const value = 'withCredentials' in new XMLHttpRequest();\n        Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value });\n        return value;\n    },\n    get SUPPORT_NATIVE_TEXT_SEGMENTATION(): boolean {\n        'use strict';\n\n        // Intl.Segmenter is TC39 Stage 4 but not yet in TS lib types\n\n        const value = !!(typeof Intl !== 'undefined' && (Intl as unknown as { Segmenter: unknown }).Segmenter);\n        Object.defineProperty(FEATURES, 'SUPPORT_NATIVE_TEXT_SEGMENTATION', { value });\n        return value;\n    }\n};\n","import { OVERFLOW_WRAP } from '../property-descriptors/overflow-wrap';\nimport { CSSParsedDeclaration } from '../index';\nimport { fromCodePoint, LineBreaker, toCodePoints } from 'css-line-break';\nimport { splitGraphemes } from 'text-segmentation';\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\nexport const segmentGraphemes = (value: string): string[] => {\n    if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) {\n        // Intl.Segmenter is TC39 Stage 4 but not yet in TS lib types\n\n        const Segmenter = Intl as unknown as {\n            Segmenter: new (l?: unknown, o?: object) => { segment(v: string): Iterable<{ segment: string }> };\n        };\n        const seg = new Segmenter.Segmenter(void 0, { granularity: 'grapheme' });\n\n        return Array.from(seg.segment(value)).map((s) => s.segment);\n    }\n\n    return splitGraphemes(value);\n};\n\nconst segmentWords = (value: string, styles: CSSParsedDeclaration): string[] => {\n    if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) {\n        const Segmenter = Intl as unknown as {\n            Segmenter: new (l?: unknown, o?: object) => { segment(v: string): Iterable<{ segment: string }> };\n        };\n        const seg = new Segmenter.Segmenter(void 0, { granularity: 'word' });\n\n        return Array.from(seg.segment(value)).map((s) => s.segment);\n    }\n\n    return breakWords(value, styles);\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, styles);\n};\n\n// https://drafts.csswg.org/css-text/#word-separator\nconst wordSeparators = [0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091];\n\nconst breakWords = (str: string, styles: CSSParsedDeclaration): string[] => {\n    const breaker = LineBreaker(str, {\n        lineBreak: styles.lineBreak,\n        wordBreak: styles.overflowWrap === OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : styles.wordBreak\n    });\n\n    const words = [];\n    let bk;\n\n    while (!(bk = breaker.next()).done) {\n        if (bk.value) {\n            const value = bk.value.slice();\n            const codePoints = toCodePoints(value);\n            let word = '';\n            codePoints.forEach((codePoint) => {\n                if (wordSeparators.indexOf(codePoint) === -1) {\n                    word += fromCodePoint(codePoint);\n                } else {\n                    if (word.length) {\n                        words.push(word);\n                    }\n                    words.push(fromCodePoint(codePoint));\n                    word = '';\n                }\n            });\n\n            if (word.length) {\n                words.push(word);\n            }\n        }\n    }\n\n    return words;\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 } 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) {\n        super(context, img);\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 } 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) {\n        super(context, canvas);\n        this.canvas = canvas;\n        this.intrinsicWidth = canvas.width;\n        this.intrinsicHeight = canvas.height;\n    }\n}\n","import { ElementContainer } from '../element-container';\nimport { parseBounds } from '../../css/layout/bounds';\nimport { Context } from '../../core/context';\n\nexport class SVGElementContainer extends ElementContainer {\n    svg: string;\n    intrinsicWidth: number;\n    intrinsicHeight: number;\n\n    constructor(context: Context, img: SVGSVGElement) {\n        super(context, img);\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(s.serializeToString(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 } from '../element-container';\nimport { Context } from '../../core/context';\nexport class LIElementContainer extends ElementContainer {\n    readonly value: number;\n\n    constructor(context: Context, element: HTMLLIElement) {\n        super(context, element);\n        this.value = element.value;\n    }\n}\n","import { ElementContainer } 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) {\n        super(context, element);\n        this.start = element.start;\n        this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;\n    }\n}\n","import { ElementContainer } 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';\nexport const INPUT_COLOR = 0x2a2a2aff;\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) {\n        super(context, input);\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 } from '../element-container';\nimport { Context } from '../../core/context';\nexport class SelectElementContainer extends ElementContainer {\n    readonly value: string;\n    constructor(context: Context, element: HTMLSelectElement) {\n        super(context, element);\n        const option = element.options[element.selectedIndex || 0];\n        this.value = option ? option.text || '' : '';\n    }\n}\n","import { ElementContainer } from '../element-container';\nimport { Context } from '../../core/context';\nexport class TextareaElementContainer extends ElementContainer {\n    readonly value: string;\n    constructor(context: Context, element: HTMLTextAreaElement) {\n        super(context, element);\n        this.value = element.value;\n    }\n}\n","import { ElementContainer } from '../element-container';\nimport { Color, parseColor, COLORS } 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: Node) => 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(context: Context, iframe: HTMLIFrameElement, parseTreeFn?: ParseTreeFunction) {\n        super(context, iframe);\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            if (\n                iframe.contentWindow &&\n                iframe.contentWindow.document &&\n                iframe.contentWindow.document.documentElement &&\n                this.parseTreeFn\n            ) {\n                this.tree = this.parseTreeFn(context, iframe.contentWindow.document.documentElement);\n\n                // http://www.w3.org/TR/css3-background/#special-backgrounds\n                const documentBackgroundColor = iframe.contentWindow.document.documentElement\n                    ? parseColor(\n                          context,\n                          getComputedStyle(iframe.contentWindow.document.documentElement).backgroundColor as string\n                      )\n                    : COLORS.TRANSPARENT;\n                const bodyBackgroundColor = iframe.contentWindow.document.body\n                    ? parseColor(\n                          context,\n                          getComputedStyle(iframe.contentWindow.document.body).backgroundColor as string\n                      )\n                    : COLORS.TRANSPARENT;\n\n                this.backgroundColor = isTransparent(documentBackgroundColor)\n                    ? isTransparent(bodyBackgroundColor)\n                        ? this.styles.backgroundColor\n                        : bodyBackgroundColor\n                    : documentBackgroundColor;\n            }\n        } catch (e) {}\n    }\n}\n","import { CSSParsedDeclaration } from '../css';\nimport { ElementContainer } 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 { DISPLAY } from '../css/property-descriptors/display';\n\nconst LIST_OWNERS = ['OL', 'UL', 'MENU'];\n\nconst parseNodeTree = (context: Context, node: Node, parent: ElementContainer, root: ElementContainer) => {\n    for (let childNode = node.firstChild, nextNode; childNode; childNode = nextNode) {\n        nextNode = childNode.nextSibling;\n        parseChildNode(context, childNode, parent, root);\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 = (context: Context, childNode: Node, parent: ElementContainer, root: ElementContainer) => {\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        parent.textNodes.push(new TextContainer(context, childNode, parent.styles));\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) => parseChildNode(context, assignedNode, parent, root));\n        } else {\n            const container = createContainer(context, childNode);\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                if (childNode.shadowRoot) {\n                    parseNodeTree(context, childNode.shadowRoot, container, root);\n                } else if (!isTextareaElement(childNode) && !isSVGElement(childNode) && !isSelectElement(childNode)) {\n                    parseNodeTree(context, childNode, container, root);\n                }\n            }\n        }\n    }\n};\n\nconst createContainer = (context: Context, element: Element): ElementContainer => {\n    if (isImageElement(element)) {\n        return new ImageElementContainer(context, element);\n    }\n\n    if (isCanvasElement(element)) {\n        return new CanvasElementContainer(context, element);\n    }\n\n    if (isSVGElement(element)) {\n        return new SVGElementContainer(context, element);\n    }\n\n    if (isLIElement(element)) {\n        return new LIElementContainer(context, element);\n    }\n\n    if (isOLElement(element)) {\n        return new OLElementContainer(context, element);\n    }\n\n    if (isInputElement(element)) {\n        return new InputElementContainer(context, element);\n    }\n\n    if (isSelectElement(element)) {\n        return new SelectElementContainer(context, element);\n    }\n\n    if (isTextareaElement(element)) {\n        return new TextareaElementContainer(context, element);\n    }\n\n    if (isIFrameElement(element)) {\n        return new IFrameElementContainer(context, element, parseTree);\n    }\n\n    return new ElementContainer(context, element);\n};\n\nexport const parseTree = (context: Context, element: HTMLElement): ElementContainer => {\n    const container = createContainer(context, element);\n    container.createsRealStackingContext = true;\n    parseNodeTree(context, element, container, container);\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        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    // 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            tlh > 0 || tlv > 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            tlh > 0 || tlv > 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            tlh > 0 || tlv > 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 { 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(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: lengths[0],\n            offsetY: lengths[1],\n            blur: 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 { 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    isClipEffect,\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\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        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.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            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 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): IElementEffect[] {\n        let inFlow = [POSITION.ABSOLUTE, POSITION.FIXED].indexOf(this.container.styles.position) === -1;\n        let parent = this.parent;\n        const effects = this.effects.slice(0);\n        while (parent) {\n            const croplessEffects = parent.effects.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.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(absPoints[0][0], absPoints[0][1]);\n                    for (let i = 1; i < absPoints.length; i++) {\n                        ctx.lineTo(absPoints[i][0], 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.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;\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 = 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","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 { 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 (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 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","/**\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        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 baseline measurement that works correctly with\n * webfonts (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\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    const tm = ctx.measureText(SAMPLE_TEXT);\n    const fmAscent = (tm as { fontBoundingBoxAscent?: number }).fontBoundingBoxAscent;\n    const ascent = fmAscent !== undefined && !Number.isNaN(fmAscent) ? fmAscent : tm.actualBoundingBoxAscent;\n    return ascent !== undefined && !Number.isNaN(ascent) ? ascent : fallback;\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 { 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';\n\n/**\n * Dependencies required for TextRenderer\n */\nexport interface TextRendererDependencies {\n    ctx: CanvasRenderingContext2D;\n    options: {\n        scale: number;\n    };\n}\n\n// iOS font fix - see https://github.com/niklasvh/html2canvas/pull/2645\nconst iOSBrokenFonts = ['-apple-system', 'system-ui'];\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 * CJK characters use the ideographic baseline in browsers, which differs\n * from the alphabetic baseline used for Latin script.\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 * Detect iOS version from user agent\n * Returns null if not iOS or version cannot be determined\n */\nconst getIOSVersion = (): number | null => {\n    if (typeof navigator === 'undefined') {\n        return null;\n    }\n\n    const userAgent = navigator.userAgent;\n\n    // Check if it's iOS or iPadOS\n    // iPadOS 13+ may identify as Macintosh, check for touch support\n    const isIOS = /iPhone|iPad|iPod/.test(userAgent);\n    const isIPadOS = /Macintosh/.test(userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n    if (!isIOS && !isIPadOS) {\n        return null;\n    }\n\n    // Extract version number from various iOS user agent formats:\n    // - \"iPhone OS 15_0\" or \"iPhone OS 15_0_1\"\n    // - \"CPU OS 15_0 like Mac OS X\"\n    // - \"CPU iPhone OS 15_0 like Mac OS X\"\n    // - \"Version/15.0\" (for iPadOS)\n    const patterns = [\n        /(?:iPhone|CPU(?:\\siPhone)?)\\sOS\\s(\\d+)[\\._](\\d+)/, // iPhone OS, CPU OS, CPU iPhone OS\n        /Version\\/(\\d+)\\.(\\d+)/ // Version/15.0 (iPadOS)\n    ];\n\n    for (const pattern of patterns) {\n        const match = userAgent.match(pattern);\n        if (match && match[1]) {\n            return parseInt(match[1], 10);\n        }\n    }\n\n    return null;\n};\n\nconst fixIOSSystemFonts = (fontFamilies: string[]): string[] => {\n    const iosVersion = getIOSVersion();\n\n    // On iOS 15.0 and 15.1, system fonts have rendering issues\n    // Fixed in iOS 17+\n    if (iosVersion !== null && iosVersion >= 15 && iosVersion < 17) {\n        return fontFamilies.map((fontFamily) =>\n            iOSBrokenFonts.indexOf(fontFamily) !== -1\n                ? `-apple-system, \"Helvetica Neue\", Arial, sans-serif`\n                : fontFamily\n        );\n    }\n\n    return fontFamilies;\n};\n\nconst getTextStrokeLineJoin = (): CanvasLineJoin => {\n    const currentWindow = typeof window !== 'undefined' ? (window as Window & { chrome?: unknown }) : undefined;\n    return currentWindow?.chrome ? 'miter' : 'round';\n};\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     * 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 and\n     * per-script baseline for each character.\n     *\n     * Issue #73: When letter-spacing is non-zero, text must be rendered character by\n     * character. This helper centralises two fixes applied during that iteration:\n     *   1. Add `letterSpacing` to each character's advance width (was previously\n     *      omitted, causing characters to render without any spacing).\n     *   2. Switch to the ideographic baseline for CJK glyphs so their vertical\n     *      position matches how browsers lay them out in the DOM.\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            if (hasCJKCharacters(letter)) {\n                const savedBaseline = this.ctx.textBaseline;\n                this.ctx.textBaseline = 'ideographic';\n                renderFn(letter, left, y);\n                this.ctx.textBaseline = savedBaseline;\n            } else {\n                renderFn(letter, left, y);\n            }\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];\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];\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                renderFn(letters[j], 0, runOffset);\n                runOffset += this.cachedMeasureText(letters[j], 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 and CJK baseline are 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 = asString(styles.color);\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                    this.ctx.shadowBlur = textShadow.blur.number;\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 = asString(styles.color);\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 = fixIOSSystemFonts(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     * 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 = styles.fontSize.number * 1.5;\n        const lines: TextBounds[][] = [];\n        let currentLine: TextBounds[] = [];\n        let currentLineTop = 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            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 = 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 = asString(styles.color);\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 = styles.fontSize.number * 1.5;\n        const firstTop = 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, 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    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 = measureBaseline(this.ctx, styles.fontSize.number);\n\n        // -webkit-line-clamp\n        const clamp =\n            styles.webkitLineClamp > 0 &&\n            (styles.display & DISPLAY.BLOCK) !== 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}\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 { ElementContainer } from '../../dom/element-container';\nimport { Path } from '../path';\nimport {\n    CSSImageType,\n    CSSLinearGradientImage,\n    CSSRadialGradientImage,\n    CSSURLImage,\n    isLinearGradient,\n    isRadialGradient,\n    isRepeatingLinearGradient\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 { LRUMap } from '../../core/lru-map';\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>(50);\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            }\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            this.context.logger.error(`Error loading background-image ${url}`);\n            this.context.onError?.(e instanceof Error ? e : new Error(String(e)));\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, x0, x1, y0, y1] = calculateGradientDirection(backgroundImage.angle, width, height);\n\n        // Determine the repeating pattern length from color stops\n        const processedStops = processColorStops(backgroundImage.stops, lineLength || 1);\n        const lastStop = processedStops[processedStops.length - 1];\n        const firstStop = processedStops[0];\n        const patternLength = lastStop.stop - firstStop.stop;\n\n        if (patternLength <= 0) {\n            // Fallback: render as normal linear gradient\n            this.renderLinearGradient(container, backgroundImage, index);\n            return;\n        }\n\n        // Scale direction vectors to match the pattern length\n        const dirX = x1 - x0;\n        const dirY = y1 - y0;\n        const totalLength = Math.sqrt(dirX * dirX + dirY * dirY);\n        const scale = patternLength / (totalLength || 1);\n        const pX0 = x0;\n        const pY0 = y0;\n        const pX1 = x0 + dirX * scale;\n        const pY1 = y0 + dirY * scale;\n\n        const ownerDocument = this.canvas.ownerDocument ?? document;\n\n        // Cache key for this repeating gradient pattern\n        const cacheKey = `rlg|${backgroundImage.angle}|${Math.round(patternLength)}|${JSON.stringify(backgroundImage.stops)}`;\n\n        let pattern = this.patternCache.get(cacheKey);\n        if (!pattern) {\n            const canvas = ownerDocument.createElement('canvas');\n            // Create a canvas large enough to hold one full repeating unit\n            const canvasSize = Math.max(1, Math.ceil(patternLength));\n            canvas.width = canvasSize;\n            canvas.height = canvasSize;\n            const ctx = canvas.getContext('2d');\n            if (!ctx) {\n                return;\n            }\n\n            const gradient = ctx.createLinearGradient(pX0 - x, pY0 - y, pX1 - x, pY1 - y);\n\n            // Normalize stops to [0, 1] range for one repeating unit\n            processedStops.forEach((colorStop) => {\n                gradient.addColorStop((colorStop.stop - firstStop.stop) / patternLength, asString(colorStop.color));\n            });\n\n            ctx.fillStyle = gradient;\n            ctx.fillRect(0, 0, canvasSize, canvasSize);\n\n            if (canvasSize > 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 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(position[0], width);\n        const y = getAbsoluteValue(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            let pattern = this.patternCache.get(cacheKey);\n            if (!pattern) {\n                const ownerDocument = this.canvas.ownerDocument ?? document;\n                const size = Math.ceil(Math.max(rx, ry) * 2);\n                const offscreen = ownerDocument.createElement('canvas');\n                offscreen.width = size;\n                offscreen.height = size;\n                const offCtx = offscreen.getContext('2d');\n                if (offCtx) {\n                    const offRadius = Math.max(rx, ry);\n                    const gradient = offCtx.createRadialGradient(\n                        offRadius,\n                        offRadius,\n                        0,\n                        offRadius,\n                        offRadius,\n                        offRadius\n                    );\n                    processColorStops(backgroundImage.stops, offRadius * 2).forEach((s) =>\n                        gradient.addColorStop(s.stop, asString(s.color))\n                    );\n                    offCtx.fillStyle = gradient;\n                    if (rx !== ry) offCtx.scale(1, ry / rx);\n                    offCtx.fillRect(0, 0, offRadius * 2, offRadius * 2);\n                    pattern = this.ctx.createPattern(offscreen, 'no-repeat') as CanvasPattern;\n                    this.patternCache.set(cacheKey, pattern);\n                }\n            }\n\n            if (pattern) {\n                this.path(path);\n                this.ctx.save();\n                this.ctx.clip();\n                this.ctx.translate(left + x - Math.max(rx, ry), top + y - Math.max(rx, ry));\n                this.ctx.fillStyle = pattern;\n                this.ctx.fillRect(0, 0, Math.max(rx, ry) * 2, Math.max(rx, ry) * 2);\n                this.ctx.restore();\n            }\n        }\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 { 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(boxPaths[0])) {\n            startX = (boxPaths[0] as BezierCurve).start.x;\n            startY = (boxPaths[0] as BezierCurve).start.y;\n        } else {\n            startX = (boxPaths[0] as Vector).x;\n            startY = (boxPaths[0] as Vector).y;\n        }\n        if (isBezierCurve(boxPaths[1])) {\n            endX = (boxPaths[1] as BezierCurve).end.x;\n            endY = (boxPaths[1] as BezierCurve).end.y;\n        } else {\n            endX = (boxPaths[1] as Vector).x;\n            endY = (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(boxPaths[0])) {\n                const path1 = boxPaths[3] as BezierCurve;\n                const path2 = 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(boxPaths[1])) {\n                const path1 = boxPaths[1] as BezierCurve;\n                const path2 = 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 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    ): void {\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\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        }> = [\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            },\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            },\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            },\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            }\n        ];\n\n        for (const edge of edges) {\n            if (edge.sw <= 0 || edge.sh <= 0 || edge.dw <= 0 || edge.dh <= 0) continue;\n            const isHorizontal = edge.dw >= edge.dh;\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, isHorizontal, edge.repeat === BORDER_IMAGE_REPEAT.ROUND);\n            }\n        }\n\n        // Draw center if fill is specified\n        if (slice.fill) {\n            const cx = sL;\n            const cy = sT;\n            const cw = imgW - sL - sR;\n            const ch = imgH - sT - sB;\n            const tcx = left + dL;\n            const tcy = top + dT;\n            const tcw = width - dL - dR;\n            const tch = height - dT - dB;\n            this.drawRegion(image, cx, cy, cw, ch, tcx, tcy, tcw, tch);\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        isHorizontal: boolean,\n        round: boolean\n    ): void {\n        const srcLength = isHorizontal ? edge.sw : edge.sh;\n        const tgLength = isHorizontal ? 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        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            const remaining = tgLength - offset;\n            const clampedSize = Math.min(tileSize, remaining);\n            if (clampedSize <= 0) break;\n\n            if (isHorizontal) {\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                    clampedSize,\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                    clampedSize\n                );\n            }\n        }\n\n        this.ctx.restore();\n    }\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';\n\n/**\n * Dependencies required for EffectsRenderer\n */\nexport interface EffectsRendererDependencies {\n    ctx: CanvasRenderingContext2D;\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 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    }\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 = 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.\n            this.ctx.filter = effect.safeFilterString || 'none';\n\n            if (effect.shadow) {\n                this.ctx.shadowOffsetX = effect.shadow.offsetX;\n                this.ctx.shadowOffsetY = effect.shadow.offsetY;\n                this.ctx.shadowBlur = effect.shadow.blur;\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","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        const containW = imgRatio > boxRatio ? dw : dh * imgRatio;\n        const noneW = sw > dw ? sw : dw;\n        if (containW < noneW) {\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 } from '../box-sizing';\nimport { Context } from '../../core/context';\nimport { TextRenderer } from './text-renderer';\nimport { measureBaseline } 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            context.logger.error(`Error loading image ${container.src}`);\n            context.onError?.(e instanceof Error ? e : new Error(String(e)));\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            context.logger.error(`Error loading svg ${container.svg.substring(0, 255)}`);\n            context.onError?.(e instanceof Error ? e : new Error(String(e)));\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(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(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 baseline = measureBaseline(ctx, getAbsoluteValue(styles.fontSize, 0));\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        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            const fontSizeValue = getAbsoluteValue(styles.fontSize, 0);\n            verticalOffset = (bounds.height - fontSizeValue) / 2;\n        }\n\n        const textBounds = bounds.add(x, verticalOffset, 0, 0);\n\n        ctx.save();\n        pathFn([\n            new Vector(bounds.left, bounds.top),\n            new Vector(bounds.left + bounds.width, bounds.top),\n            new Vector(bounds.left + bounds.width, bounds.top + bounds.height),\n            new Vector(bounds.left, bounds.top + bounds.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 fontSizeValue = getAbsoluteValue(styles.fontSize, 0);\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 * 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                ctx.drawImage(image!, container.bounds.left - (image!.width + 10), container.bounds.top);\n            } catch (e) {\n                context.logger.error(`Error loading list-style-image ${url}`);\n                context.onError?.(e instanceof Error ? e : new Error(String(e)));\n            }\n        }\n    } else if (paint.listValue && container.styles.listStyleType !== LIST_STYLE_TYPE.NONE) {\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 * 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 { 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 { 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 { CSSImageType, CSSURLImage } from '../../css/types/image';\nimport { getBackgroundValueForIndex } from '../background';\nimport { contentBox } from '../box-sizing';\nimport { ReplacedElementContainer } from '../../dom/replaced-elements';\nimport { EffectTarget } from '../effects';\nimport { TextRenderer } from './text-renderer';\nimport { Context } from '../../core/context';\nimport { BackgroundRenderer } from './background-renderer';\nimport { BorderRenderer } from './border-renderer';\nimport { BorderImageRenderer } from './border-image-renderer';\nimport { EffectsRenderer } from './effects-renderer';\nimport { createCanvasPath, formatCanvasPath } from './canvas-path';\nimport { calculateObjectFitRendering } from '../object-fit';\nimport { renderReplacedElements, renderFormElements, renderListMarker } from './content-renderer';\nimport { SHADOW_MASK_OFFSET } from '../../core/constants';\nimport { DIRECTION } from '../../css/property-descriptors/direction';\nimport { isVerticalWritingMode, WRITING_MODE } from '../../css/property-descriptors/writing-mode';\nimport { measureBaseline } from './font-utils';\nimport { CSSParsedDeclaration } from '../../css/index';\nimport { segmentGraphemes, TextBounds } from '../../css/layout/text';\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\n    constructor(context: Context, options: RenderConfigurations) {\n        this.context = context;\n        this.options = options;\n        this.canvas = options.canvas ? options.canvas : document.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        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({ ctx: this.ctx }, { path: (paths) => this.path(paths) });\n\n        this.textRenderer = new TextRenderer({\n            ctx: this.ctx,\n            options: { scale: options.scale }\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            await this.renderStackContent(stack);\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));\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    mask(paths: Path[]): void {\n        this.ctx.beginPath();\n        this.ctx.moveTo(0, 0);\n        // Use logical dimensions (options.width/height) instead of canvas pixel dimensions\n        // because context has already been scaled by this.options.scale\n        // Fix for Issue #126: Using canvas pixel dimensions causes broken output\n        this.ctx.lineTo(this.options.width, 0);\n        this.ctx.lineTo(this.options.width, this.options.height);\n        this.ctx.lineTo(0, this.options.height);\n        this.ctx.lineTo(0, 0);\n        this.formatPath(paths.slice(0).reverse());\n        this.ctx.closePath();\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    async renderNodeBackgroundAndBorders(paint: ElementPaint): Promise<void> {\n        this.effectsRenderer.applyEffects(paint.getEffects(EffectTarget.BACKGROUND_BORDERS));\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.renderTextClippedBackground(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            styles.boxShadow\n                .slice(0)\n                .reverse()\n                .forEach((shadow) => {\n                    this.ctx.save();\n                    const borderBoxArea = calculateBorderBoxPath(paint.curves);\n                    const maskOffset = shadow.inset ? 0 : SHADOW_MASK_OFFSET;\n                    const shadowPaintingArea = transformPath(\n                        borderBoxArea,\n                        -maskOffset + (shadow.inset ? 1 : -1) * shadow.spread.number,\n                        (shadow.inset ? 1 : -1) * shadow.spread.number,\n                        shadow.spread.number * (shadow.inset ? -2 : 2),\n                        shadow.spread.number * (shadow.inset ? -2 : 2)\n                    );\n\n                    if (shadow.inset) {\n                        this.path(borderBoxArea);\n                        this.ctx.clip();\n                        this.mask(shadowPaintingArea);\n                    } else {\n                        this.mask(borderBoxArea);\n                        this.ctx.clip();\n                        this.path(shadowPaintingArea);\n                    }\n\n                    this.ctx.shadowOffsetX = shadow.offsetX.number + maskOffset;\n                    this.ctx.shadowOffsetY = shadow.offsetY.number;\n                    this.ctx.shadowColor = asString(shadow.color);\n                    this.ctx.shadowBlur = shadow.blur.number;\n                    this.ctx.fillStyle = shadow.inset ? asString(shadow.color) : 'rgba(0,0,0,1)';\n\n                    this.ctx.fill();\n                    this.ctx.restore();\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            if (source.type === CSSImageType.URL) {\n                const url = (source as CSSURLImage).url;\n                try {\n                    const image = await this.context.cache.match(url);\n                    if (image) {\n                        const bounds = paint.container.bounds;\n                        this.borderImageRenderer.renderBorderImage(\n                            bounds,\n                            image as HTMLImageElement,\n                            styles.borderImageSlice,\n                            styles.borderImageRepeat,\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                    }\n                } catch (e) {\n                    this.context.logger.error(`Error loading border-image ${url}`);\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\n    async render(element: ElementContainer): Promise<HTMLCanvasElement> {\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    }\n\n    /**\n     * Render background clipped to text shape using offscreen canvas with destination-in compositing.\n     * This implements background-clip: text support.\n     *\n     * Algorithm:\n     *   1. Draw background (color + images) onto an offscreen canvas\n     *   2. Use destination-in compositing to clip the background to the text glyph shapes\n     *   3. Composite the result back onto the main canvas\n     *\n     * The offscreen canvas uses CSS-pixel dimensions (not device-pixel) because the\n     * background renderer handles scaling internally via BackgroundRenderer options.\n     */\n    private async renderTextClippedBackground(paint: ElementPaint): Promise<void> {\n        const container = paint.container;\n        const styles = container.styles;\n        const bounds = container.bounds;\n\n        if (bounds.width <= 0 || bounds.height <= 0) {\n            return;\n        }\n\n        const ownerDocument = this.canvas.ownerDocument ?? document;\n        const offscreen = ownerDocument.createElement('canvas');\n        const width = Math.ceil(bounds.width);\n        const height = Math.ceil(bounds.height);\n        offscreen.width = width;\n        offscreen.height = height;\n\n        const offCtx = offscreen.getContext('2d');\n        if (!offCtx) {\n            return;\n        }\n\n        // ── Set up font matching the main context ──\n        const [fontString] = this.textRenderer.createFontStyle(styles);\n        offCtx.font = fontString;\n        offCtx.textBaseline = 'alphabetic';\n        offCtx.textAlign = 'left';\n        offCtx.direction = styles.direction === DIRECTION.RTL ? 'rtl' : 'ltr';\n\n        // Measure baseline from the actual rendered font\n        const baseline = measureBaseline(offCtx, styles.fontSize.number);\n\n        // ── Draw background onto offscreen canvas ──\n        const bgRenderer = new BackgroundRenderer({\n            ctx: offCtx,\n            context: this.context,\n            canvas: offscreen,\n            options: { width, height, scale: 1 }\n        });\n\n        if (!isTransparent(styles.backgroundColor)) {\n            offCtx.fillStyle = asString(styles.backgroundColor);\n            offCtx.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        offCtx.save();\n        offCtx.translate(-bounds.left, -bounds.top);\n        await bgRenderer.renderBackgroundImage(container);\n        offCtx.restore();\n\n        // ── Clip background to text glyphs ──\n        // destination-in: keep background pixels only where the source (text) is non-transparent.\n        offCtx.globalCompositeOperation = 'destination-in';\n        offCtx.fillStyle = '#000';\n\n        const writingMode = styles.writingMode;\n        const letterSpacing = styles.letterSpacing;\n\n        for (const textNode of container.textNodes) {\n            for (const textBound of textNode.textBounds) {\n                // Offset from element bounds to canvas-local coordinates\n                const localLeft = textBound.bounds.left - bounds.left;\n                const localTop = textBound.bounds.top - bounds.top + baseline;\n\n                if (letterSpacing > 0) {\n                    this.renderTextMaskWithLetterSpacing(\n                        offCtx,\n                        textBound,\n                        letterSpacing,\n                        localLeft,\n                        localTop,\n                        writingMode\n                    );\n                } else {\n                    offCtx.fillText(textBound.text, localLeft, localTop);\n                }\n            }\n        }\n\n        // ── Composite back to main canvas ──\n        this.ctx.drawImage(offscreen, bounds.left, bounds.top);\n    }\n\n    /**\n     * Render text glyphs one-by-one as a mask, applying letter-spacing between characters.\n     * This ensures the mask matches how the text renderer lays out the characters.\n     */\n    private renderTextMaskWithLetterSpacing(\n        ctx: CanvasRenderingContext2D,\n        text: TextBounds,\n        letterSpacing: number,\n        x: number,\n        y: number,\n        writingMode: WRITING_MODE\n    ): void {\n        const letters = segmentGraphemes(text.text);\n        let offset = x;\n\n        for (const letter of letters) {\n            if (isVerticalWritingMode(writingMode)) {\n                // Vertical writing mode: not yet supported for text-clip;\n                // fall back to single fillText call.\n                ctx.fillText(text.text, x, y);\n                return;\n            }\n\n            ctx.fillText(letter, offset, y);\n            offset += ctx.measureText(letter).width + letterSpacing;\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 : document.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        const svg = createForeignObjectSVG(\n            this.options.width * this.options.scale,\n            this.options.height * this.options.scale,\n            this.options.scale,\n            this.options.scale,\n            element\n        );\n\n        const img = await loadSerializedSVG(svg);\n\n        if (this.options.backgroundColor) {\n            this.ctx.fillStyle = asString(this.options.backgroundColor);\n            this.ctx.fillRect(0, 0, this.options.width * this.options.scale, this.options.height * this.options.scale);\n        }\n\n        this.ctx.drawImage(img, -this.options.x * this.options.scale, -this.options.y * this.options.scale);\n\n        return this.canvas;\n    }\n}\n","export interface LoggerOptions {\n    id: string;\n    enabled: boolean;\n}\n\nexport class Logger {\n    static instances: { [key: string]: Logger } = {};\n\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';\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    maxCacheSize?: number; // Maximum cache size (default: 100, max: 10000)\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    constructor(\n        private readonly context: Context,\n        private readonly _options: ResourceOptions\n    ) {\n        // Default cache size: 100 items\n        this.maxSize = _options.maxCacheSize ?? 100;\n\n        if (this.maxSize < 1) {\n            throw new Error('Cache maxSize must be at least 1');\n        }\n\n        if (this.maxSize > 10000) {\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    }\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). Subsequent cache.match() calls return immediately.\n     *\n     * @param concurrency - Max concurrent image loads (1–100, default 10).\n     */\n    async preloadAll(concurrency = 10): Promise<void> {\n        this._deferMode = false;\n        const urls = Array.from(this._collectedUrls);\n        this._collectedUrls.clear();\n\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.\n        for (let i = 0; i < urls.length; i += limit) {\n            const batch = urls.slice(i, i + limit);\n            const operations = batch.map((url) => this._addImageWithPending(url));\n            await Promise.allSettled(operations);\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 ?? 15000;\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\n        imageWithTimeout.catch((error) => {\n            this.context.logger.error(\n                `Failed to load image ${src}: ${error instanceof Error ? error.message : 'Unknown error'}`\n            );\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._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            FEATURES.SUPPORT_CORS_XHR &&\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, 256)}`);\n\n        return await new Promise((resolve, reject) => {\n            const img = new Image();\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                // Inline XML images may fail to parse, throwing an Error later on\n                setTimeout(() => resolve(img), 500);\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, 256);\n\n        return new Promise((resolve, reject) => {\n            const responseType = FEATURES.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text';\n            const xhr = new XMLHttpRequest();\n            xhr.onload = () => {\n                if (xhr.status === 200) {\n                    if (responseType === 'text') {\n                        resolve(xhr.response);\n                    } else {\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);\n                    }\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            xhr.open('GET', `${proxy}${queryString}url=${encodeURIComponent(src)}&responseType=${responseType}`);\n\n            if (responseType !== 'text' && xhr instanceof XMLHttpRequest) {\n                xhr.responseType = responseType;\n            }\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 anchor element and origin reference.\n *\n * Replaces the static methods in CacheStorage with instance-based approach.\n */\nexport class OriginChecker {\n    private readonly link: HTMLAnchorElement;\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.link = window.document.createElement('a');\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\n     * @returns Origin string (e.g., \"https://example.com:8080\")\n     */\n    getOrigin(url: string): string {\n        this.link.href = url;\n        // IE9 hack: accessing href twice to ensure it's properly parsed\n        this.link.href = this.link.href;\n        return this.link.protocol + this.link.hostname + this.link.port;\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    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 static instanceCount = 1;\n\n    constructor(\n        options: ContextOptions,\n        public windowBounds: Bounds,\n        config: Html2CanvasConfig\n    ) {\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    }\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","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});\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 { COLORS, parseColor, 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        : COLORS.TRANSPARENT;\n    const bodyBackgroundColor = ownerDocument.body\n        ? parseColor(context, getComputedStyle(ownerDocument.body).backgroundColor as string)\n        : COLORS.TRANSPARENT;\n\n    const defaultBackgroundColor =\n        typeof backgroundColorOverride === 'string'\n            ? parseColor(context, backgroundColorOverride)\n            : backgroundColorOverride === null\n              ? COLORS.TRANSPARENT\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 { COLORS } 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\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    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    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);\n            perfMonitor.end('parse');\n\n            // Batch-preload all collected images in parallel before rendering.\n            perfMonitor.start('preload');\n            await context.cache.preloadAll();\n            perfMonitor.end('preload');\n\n            if (backgroundColor === root.styles.backgroundColor) {\n                root.styles.backgroundColor = COLORS.TRANSPARENT;\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        perfMonitor.start('cleanup');\n        if (opts.removeContainer ?? true) {\n            if (!DocumentCloner.destroy(container)) {\n                context.logger.error(`Cannot detach cloned iframe as it is not in the DOM anymore`);\n            }\n        }\n        perfMonitor.end('cleanup');\n\n        perfMonitor.end('total');\n        context.logger.debug(`Finished rendering`);\n\n        if (performanceMonitoring) {\n            perfMonitor.logSummary();\n        }\n\n        return canvas;\n    } finally {\n        if (root) {\n            root.restoreTree();\n        }\n    }\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"],"x_google_ignoreList":[4,116],"mappings":"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"}