{
  "version": 3,
  "sources": ["/cdn/shop/t/15/assets/fr-theme.js?frv=clean-urls-20260705-2"],
  "sourcesContent": ["(function () {\n  const state = { data: null };\n  const money = (value) => value || \"Not verified\";\n  const firstMatch = (value, pattern) => {\n    const match = String(value || \"\").match(pattern);\n    return match ? match[1] || match[0] : \"\";\n  };\n  const compactPrice = (value) => {\n    const text = String(value || \"\").trim();\n    const lower = text.toLowerCase();\n    if (!text) return \"Not publicly listed\";\n    if (lower.includes(\"not publicly sold\")) return \"Not sold\";\n    if (lower.includes(\"enterprise quote\") || lower.includes(\"contact sales\")) return \"Quote\";\n    if (lower.includes(\"no public msrp\")) return \"No MSRP\";\n    if (lower.includes(\"pricing not listed\") || lower.includes(\"price not verified\") || lower === \"not verified\") return \"Not listed\";\n    const usdRange = text.match(/(?:USD\\s*)?\\$?\\s*(\\d[\\d,]*(?:\\.\\d+)?(?:\\s*-\\s*\\$?\\s*\\d[\\d,]*(?:\\.\\d+)?)?)/i);\n    if (usdRange) return `$${usdRange[1].replace(/\\s+/g, \"\")}`;\n    return text.split(/[;.]/)[0].trim() || \"Not publicly listed\";\n  };\n  const compactMeasure = (value, unit) => {\n    const text = String(value || \"\").trim();\n    if (!text) return \"Not listed\";\n    const escapedUnit = unit.replace(\"/\", \"\\\\/\");\n    const match = firstMatch(text, new RegExp(`(?:about\\\\s*|approx\\\\.?\\\\s*|~\\\\s*)?(\\\\d+(?:\\\\.\\\\d+)?\\\\s*${escapedUnit})`, \"i\"));\n    return match ? match.replace(/\\s+/g, \" \") : text.split(/[;.]/)[0].trim();\n  };\n  const compactDof = (value) => {\n    const text = String(value || \"\").trim();\n    if (!text) return \"Not listed\";\n    return firstMatch(text, /(\\d+\\+?)/) || \"Not listed\";\n  };\n  const compactRuntime = (value) => {\n    const text = String(value || \"\").trim();\n    if (!text) return \"Not listed\";\n    const lower = text.toLowerCase();\n    if (lower.includes(\"not publicly disclosed\")) return \"Not disclosed\";\n    const match = firstMatch(text, /(?:about\\s*|approx\\.?\\s*|~\\s*)?(\\d+(?:\\.\\d+)?\\s*(?:hours?|hrs?|h)\\b)/i);\n    return match ? match.replace(/\\bh\\b/i, \"hr\").replace(/\\s+/g, \" \") : text.split(/[;.]/)[0].trim();\n  };\n  const compactStatus = (value) => {\n    const raw = String(value || \"\").trim();\n    const lower = raw.toLowerCase();\n    if (!lower || [\"review\", \"unknown\", \"not verified\", \"not publicly listed\"].includes(lower)) return \"Not publicly confirmed\";\n    if (lower.includes(\"discontinued\")) return \"Discontinued\";\n    if (lower.includes(\"available\")) return \"Available\";\n    if (lower.includes(\"pilot\")) return \"Piloting\";\n    if (lower.includes(\"prototype\")) return \"Prototype\";\n    if (lower.includes(\"announced\")) return \"Announced\";\n    if (lower.includes(\"development\")) return \"Development\";\n    return raw.split(/[;.]/)[0].trim();\n  };\n  const compactComparisonValue = (robot, key) => {\n    if (key === \"price\") return compactPrice(robot.price);\n    if (key === \"height\") return compactMeasure(robot.height, \"mm\");\n    if (key === \"weight\") return compactMeasure(robot.weight, \"kg\");\n    if (key === \"dof\") return compactDof(robot.dof);\n    if (key === \"payload\") return compactMeasure(robot.payload, \"kg\");\n    if (key === \"runtime\") return compactRuntime(robot.runtime);\n    if (key === \"speed\") return compactMeasure(robot.speed, \"m/s\");\n    if (key === \"status\") return compactStatus(robot.status);\n    return String(robot[key] || \"Not listed\").split(/[;.]/)[0].trim();\n  };\n  const safe = (value, fallback = \"Not verified\") => {\n    const text = String(value || \"\").trim();\n    return text ? text : fallback;\n  };\n  const publicMaker = (robot = {}) => robot.manufacturer || \"Manufacturer not listed\";\n  const publicCardValue = (value, fallback = \"Not publicly listed\") => {\n    const text = String(value || \"\").trim();\n    const lower = text.toLowerCase();\n    if (!text || [\"unknown\", \"review\", \"not verified\", \"not publicly listed\"].includes(lower)) return fallback;\n    return text.split(/[;.]/)[0].trim();\n  };\n  const escapeHtml = (value) => String(value || \"\").replace(/[&<>\"']/g, (char) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }[char]));\n  const slugFromText = (value = \"\") => String(value || \"\")\n    .toLowerCase()\n    .replace(/&/g, \" and \")\n    .replace(/[^a-z0-9]+/g, \"-\")\n    .replace(/-+/g, \"-\")\n    .replace(/^-|-$/g, \"\") || \"unknown\";\n  const robotMatchesSlug = (robot = {}, slug = \"\") => {\n    const target = String(slug || \"\").trim();\n    if (!target) return false;\n    return robot.slug === target\n      || slugFromText(robot.name) === target\n      || slugFromText(`${robot.manufacturer || \"\"}-${robot.name || \"\"}`) === target\n      || slugFromText(`${robot.manufacturer || \"\"} ${robot.name || \"\"}`) === target;\n  };\n  const currentPageHandle = () => {\n    const match = location.pathname.match(/^\\/pages\\/([^/?#]+)/);\n    return match ? decodeURIComponent(match[1]).replace(/\\/+$/, \"\") : \"\";\n  };\n  const categoryHandleMap = {\n    \"humanoid-robots\": \"humanoid\",\n    \"consumer-robots\": \"consumer\",\n    \"enterprise-robots\": \"enterprise\",\n    \"industrial-robots\": \"industrial\",\n    \"warehouse-robots\": \"warehouse\",\n    \"service-robots\": \"service\",\n    \"research-robots\": \"research\",\n    \"military-defense-robots\": \"military\"\n  };\n  const categoryPageMeta = {\n    \"humanoid-robots\": [\"Category Guide\", \"Humanoid Robots\", \"Bipedal and human-form robots for research, industry, enterprise, and emerging home use.\"],\n    \"consumer-robots\": [\"Category Guide\", \"Consumer Robots\", \"Robots positioned for consumer, education, entertainment, and home-adjacent use.\"],\n    \"enterprise-robots\": [\"Category Guide\", \"Enterprise Robots\", \"Robots built or positioned for business, pilot deployments, and workplace automation.\"],\n    \"industrial-robots\": [\"Category Guide\", \"Industrial Robots\", \"Robots relevant to manufacturing, inspection, logistics, production, and industrial automation.\"],\n    \"warehouse-robots\": [\"Category Guide\", \"Warehouse Robots\", \"Robots used for warehouse automation, logistics, fulfillment, inventory, and material movement.\"],\n    \"service-robots\": [\"Category Guide\", \"Service Robots\", \"Robots built for customer-facing, hospitality, healthcare, delivery, reception, and facility support roles.\"],\n    \"research-robots\": [\"Category Guide\", \"Research Robots\", \"Robots used by universities, labs, developers, and robotics researchers for experimentation and platform development.\"],\n    \"military-defense-robots\": [\"Category Guide\", \"Military and Defense Robots\", \"Public-safety, defense-adjacent, field robotics, and rugged automation platforms.\"]\n  };\n  const categoryUrl = (slug) => {\n    const bySlug = Object.entries(categoryHandleMap).find(([, value]) => value === slug);\n    return `/pages/${bySlug ? bySlug[0] : `${slugifyLocal(slug)}-robots`}`;\n  };\n  const manufacturerUrl = (manufacturer) => {\n    const slug = typeof manufacturer === \"string\" ? manufacturer : (manufacturer.slug || manufacturer.name || \"\");\n    return `/pages/${slugifyLocal(slug)}-robot-manufacturer`;\n  };\n  const robotUrl = (robot) => `/pages/${encodeURIComponent(robot.slug)}`;\n  const knowledgeUrl = (topic) => `/pages/${slugifyLocal(`robot ${topic} explained`)}`;\n  const redirectToCleanUrl = (data) => {\n    const handle = currentPageHandle();\n    const params = new URLSearchParams(location.search);\n    let target = \"\";\n    if (handle === \"robot-profile\" && params.get(\"robot\")) {\n      const slug = params.get(\"robot\");\n      const robot = (data.robots || []).find((item) => robotMatchesSlug(item, slug));\n      target = robot ? robotUrl(robot) : `/pages/${slugifyLocal(slug)}`;\n    } else if (handle === \"manufacturer-profile\" && params.get(\"manufacturer\")) {\n      target = manufacturerUrl(params.get(\"manufacturer\"));\n    } else if (handle === \"category\" && params.get(\"filter\")) {\n      target = categoryUrl(params.get(\"filter\"));\n    } else if (handle === \"knowledge\" && params.get(\"topic\")) {\n      target = knowledgeUrl(params.get(\"topic\"));\n    } else if (handle === \"compare\" && params.get(\"add\")) {\n      target = \"/pages/compare\";\n    }\n    if (target && target !== location.pathname) {\n      window.location.replace(target);\n      return true;\n    }\n    return false;\n  };\n  const PAGE_META = {\n    \"robots\": [\"Robot Database\", \"Robots\", \"Search and filter source-backed robot profiles, prices, specifications, images, and videos.\"],\n    \"robot-profile\": [\"Robot Profile\", \"Robot Profile\", \"Robot reviews, specifications, pricing, images, videos, sources, and buying research from FIRGELLI Robots.\"],\n    \"manufacturers\": [\"Manufacturer Database\", \"Manufacturers\", \"Explore companies building humanoid, service, industrial, research, and mobile robots.\"],\n    \"manufacturer-profile\": [\"Manufacturer Profile\", \"Manufacturer Profile\", \"Source-backed manufacturer profiles connected to robot records.\"],\n    \"category\": [\"Robot Categories\", \"Robot Categories\", \"Browse robots by market, form factor, use case, and grade.\"],\n    \"compare\": [\"Comparison Engine\", \"Compare Robots\", \"Compare robots side by side using source-backed specification records.\"],\n    \"tools\": [\"Tools & Widgets\", \"Tools & Widgets\", \"Robot finder, matching tools, payload calculator, ownership calculator, timeline, and visual size viewer.\"],\n    \"robot-compare-tool\": [\"Robot Compare Tool\", \"Robot Compare Tool\", \"Build a side-by-side robot comparison with live FIRGELLI Robots data, images, prices, specs and profile links.\"],\n    \"robot-finder\": [\"Robot Finder\", \"Robot Finder\", \"Rank robots by use case, budget, availability, payload, runtime and developer requirements.\"],\n    \"payload-calculator\": [\"Robot Payload Calculator\", \"Payload Calculator\", \"Estimate required robot payload with safety margin and find matching robots with public payload data.\"],\n    \"robot-cost-calculator\": [\"Robot Cost Calculator\", \"Cost of Ownership Calculator\", \"Estimate robot purchase, deployment, service, consumables, labor and support costs.\"],\n    \"robot-timeline\": [\"Robot Timeline\", \"Robot Timeline\", \"Browse robot launches, announcements, research platforms and database timeline signals.\"],\n    \"3d-robot-viewer\": [\"Robot Size Viewer\", \"Robot Size Viewer\", \"Compare robot images, height, weight, payload and status in a practical visual size viewer.\"],\n    \"research\": [\"Research Library\", \"Research, Patents & Sources\", \"Review papers, patents, manuals, videos, source URLs, and reference material.\"],\n    \"knowledge\": [\"Knowledge Hub\", \"Knowledge Hub\", \"Robot specifications, definitions, buying guidance, research links, and latest robotics updates.\"],\n    \"news\": [\"Robot News\", \"Robot News\", \"Latest robot additions, database changes, source-backed updates, and robotics research notes.\"],\n    \"marketplace\": [\"Marketplace\", \"Marketplace\", \"Future marketplace for robot accessories, skills, mods, and compatible parts.\"],\n    \"community\": [\"Community\", \"Community\", \"Future owner reviews, community posts, known issues, galleries, and mod discussions.\"],\n    \"developers\": [\"Developers\", \"Developers\", \"Developer resources, SDK support, APIs, ROS support, and integration tools.\"],\n    \"about\": [\"About\", \"About FIRGELLI Robots\", \"A research-first robotics intelligence platform for robot specifications, images, videos, and buyer guidance.\"],\n    \"editorial-policy\": [\"Editorial Policy\", \"Editorial Policy\", \"How FIRGELLI Robots reviews sources, image rights, robot specifications, and publication readiness.\"],\n    \"contact\": [\"Contact\", \"Contact FIRGELLI Robots\", \"Reach the FIRGELLI Robots team for research support, partnerships, and data corrections.\"]\n  };\n  const pathPageKind = () => {\n    const handle = currentPageHandle();\n    return handle && PAGE_META[handle] ? handle : \"\";\n  };\n  const resolvePageKind = (root) => {\n    const configured = root.dataset.frPageKind || \"auto\";\n    const fromPath = pathPageKind();\n    const handle = currentPageHandle();\n    if ([\"robot-compare-tool\", \"robot-finder\", \"payload-calculator\", \"robot-cost-calculator\", \"robot-timeline\", \"3d-robot-viewer\"].includes(handle)) {\n      return \"tools\";\n    }\n    if (configured === \"auto\") {\n      return fromPath || \"robots\";\n    }\n    if (configured === \"robots\" && fromPath && fromPath !== \"robots\") {\n      return fromPath;\n    }\n    if (configured === \"robots\" && root.querySelector(\".fr-page-hero h1\")?.textContent?.toLowerCase().includes(\"page not found\")) {\n      return fromPath || configured;\n    }\n    return configured;\n  };\n  const applyPageMeta = (root, kind) => {\n    const handle = currentPageHandle();\n    if (handle && !PAGE_META[handle] && ![\"robot-profile\", \"manufacturer-profile\", \"category\"].includes(kind)) return;\n    const meta = PAGE_META[handle] || (kind === \"category\" && categoryPageMeta[handle] ? categoryPageMeta[handle] : PAGE_META[kind]);\n    if (!meta) return;\n    const [eyebrow, heading, subheading] = meta;\n    const eyebrowNode = root.querySelector(\".fr-page-hero .fr-eyebrow\");\n    const headingNode = root.querySelector(\".fr-page-hero h1\");\n    const subheadingNode = root.querySelector(\".fr-page-hero p:not(.fr-eyebrow)\");\n    const crumbNode = root.querySelector(\".fr-breadcrumb span:last-child\");\n    if (eyebrowNode) eyebrowNode.textContent = eyebrow;\n    if (headingNode) headingNode.textContent = heading;\n    if (subheadingNode) subheadingNode.textContent = subheading;\n    if (crumbNode) crumbNode.textContent = heading;\n    document.title = `${heading} - FIRGELLI Robots`;\n  };\n  const badgeClass = (status) => {\n    const s = String(status || \"\").toLowerCase();\n    if (s.includes(\"prototype\")) return \"fr-badge fr-badge--prototype\";\n    if (s.includes(\"discontinued\")) return \"fr-badge fr-badge--discontinued\";\n    if (s.includes(\"announced\") || s.includes(\"coming\")) return \"fr-badge fr-badge--announced\";\n    return \"fr-badge\";\n  };\n  const icon = () => `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 3v4\"></path><path d=\"M6 8h12l-1 10H7L6 8Z\"></path><path d=\"M9 12h.01\"></path><path d=\"M15 12h.01\"></path><path d=\"M9 21h6\"></path><path d=\"M4 13H2\"></path><path d=\"M22 13h-2\"></path></svg>`;\n  const categoryIcon = (slug = \"\") => {\n    const icons = {\n      humanoid: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"4.5\" r=\"2.1\"></circle><path d=\"M12 7v6\"></path><path d=\"M8.5 9.5 12 8l3.5 1.5\"></path><path d=\"M10 13 8.5 20\"></path><path d=\"M14 13l1.5 7\"></path><path d=\"M9 20h2\"></path><path d=\"M13 20h2\"></path></svg>`,\n      consumer: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 11 12 4l8 7\"></path><path d=\"M6.5 10.5V20h11V10.5\"></path><path d=\"M9 20v-5h6v5\"></path><path d=\"M10 11.5h4\"></path></svg>`,\n      enterprise: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 20V5h9v15\"></path><path d=\"M14 10h5v10\"></path><path d=\"M8 8h2\"></path><path d=\"M8 12h2\"></path><path d=\"M8 16h2\"></path><path d=\"M16.5 14h.01\"></path><path d=\"M16.5 17h.01\"></path></svg>`,\n      industrial: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 20V9l5 3V9l5 3V8h6v12H4Z\"></path><path d=\"M16 8V4h3v4\"></path><path d=\"M7 16h2\"></path><path d=\"M12 16h2\"></path><path d=\"M17 16h1\"></path></svg>`,\n      warehouse: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3.5 10 12 5l8.5 5\"></path><path d=\"M5 10v10h14V10\"></path><path d=\"M8 14h8\"></path><path d=\"M8 17h8\"></path><path d=\"M9 20v-6h6v6\"></path></svg>`,\n      service: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 14h12a4 4 0 0 1 4 4\"></path><path d=\"M4 18h16\"></path><path d=\"M7 14V9a3 3 0 0 1 6 0v5\"></path><path d=\"M10 6V4\"></path></svg>`,\n      research: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10 3v5l-5 9a3 3 0 0 0 2.6 4.5h8.8A3 3 0 0 0 19 17l-5-9V3\"></path><path d=\"M9 3h6\"></path><path d=\"M7 16h10\"></path><path d=\"M9 19h6\"></path></svg>`,\n      military: `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 3 19 6v5c0 4.8-2.9 8.4-7 10-4.1-1.6-7-5.2-7-10V6l7-3Z\"></path><path d=\"M12 8v7\"></path><path d=\"M8.8 11.5h6.4\"></path></svg>`\n    };\n    return icons[slug] || icon();\n  };\n  let assetBase = \"\";\n  const homepageImageFallbacks = {\n    \"tesla-optimus\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-tesla-optimus-ad30d48fcf.png\",\n    \"figure-ai-figure-02\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-figure-ai-figure-02-a475ade5a5.png\",\n    \"unitree-robotics-unitree-g1\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-unitree-robotics-unitree-g1-726472fdcf.png\",\n    \"apptronik-apollo\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-apptronik-apollo-1809635ecd.png\",\n    \"agility-robotics-digit\": \"asset://fr-display-crop-v1-fr-approved-robot-digit-7170e64273-digit-front-view-7cfe6097d7.webp\",\n    \"1x-technologies-neo\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-1x-technologies-neo-7a03dc0fa4.png\",\n    \"sanctuary-ai-phoenix\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-sanctuary-ai-phoenix-35d25960a8.png\",\n    \"ubtech-robotics-walker-s\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-ubtech-robotics-walker-s-af89630df5.png\",\n    \"fourier-intelligence-gr-2\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-fourier-intelligence-gr-2-f9187a0b9b.png\",\n    \"unitree-robotics-unitree-h2\": \"https://www.firgellirobots.com/cdn/shop/t/15/assets/fr-home-compare-unitree-robotics-unitree-h2-7fde71e458.png\",\n    \"istituto-italiano-di-tecnologia-icub\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-view-robot-icub-a922c3d274-icub-front-view-dfb9c70f9a-803c12cd25-8755ed7085.webp\",\n    \"xman-r1\": \"asset://fr-card-consumer-v1-xman-r1-149637edbf.webp\",\n    \"xiaomi-cyberone\": \"asset://fr-display-crop-v1-fr-approved-robot-xiaomi-cyberone-5a9971b1f7-xiaomi-cyberone-front-view-d778fadc18.webp\"\n  };\n  const cardImageOverrides = {\n    \"agility-robotics-digit\": \"asset://fr-display-crop-v1-fr-approved-robot-digit-7170e64273-digit-front-view-7cfe6097d7.webp\",\n    \"softbank-robotics-pepper\": \"asset://fr-display-crop-v1-fr-approved-robot-pepper-dfc6035e61-pepper-front-view-6f9e41ce75.webp\",\n    \"university-of-bonn-nimbro-op2x\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-nimbro-op2x-25c5eec270-nimbro-op2x-front-view-d27b37d6d5-3bd75e78a8-efb041aa26.webp\",\n    \"nasa-valkyrie\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-valkyrie-9b9de5e434-valkyrie-front-view-29e186b926-c63ae56ce4-75f6345da9.webp\",\n    \"kepler-robotics-kepler-forerunner\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-kepler-forerunner-69ce2f4189-kepler-forerunner-front-view-27283df1bd-cc62ec0250-a6f03f8281.webp\",\n    \"istituto-italiano-di-tecnologia-icub\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-view-robot-icub-a922c3d274-icub-front-view-dfb9c70f9a-803c12cd25-8755ed7085.webp\",\n    \"robotis-op3\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-robotis-op3-d69cbaaf62-robotis-op3-front-view-57a3ee0e83-cb1eead0d4-a93cafbe60.webp\",\n    \"pal-robotics-reem-c\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-reem-c-dcdbf329e6-reem-c-front-view-2bc26fb9a7-3edd3ab6a6-9ed6fe9315.webp\",\n    \"kawada-robotics-hrp-5p\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-hrp-5p-78a76ad22f-hrp-5p-front-view-c1e0996341-86bf21a38c-1fbdbc2d39.webp\",\n    \"kawada-robotics-hrp-4\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-hrp-4-687a957d84-hrp-4-front-view-924a727c16-7d02fe4d1d-f21953df00.webp\",\n    \"kuka-lbr-iiwa\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-lbr-iiwa-4370ffc9e8-lbr-iiwa-front-view-3e99dbb559-136e26e2fd-18106cbd1a.webp\",\n    \"poppy-project-poppy-humanoid\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-poppy-humanoid-1d91886c1f-poppy-humanoid-front-view-c29769519a-acd5df9320-41bbe0c671.webp\",\n    \"pal-robotics-talos\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-talos-a4d479eec7-talos-front-view-61f83819c3-f9bdde1b01-2f0c20f66c.webp\",\n    \"tekntrash-alpha\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-tekntrash-alpha-cac6f141f9-tekntrash-alpha-front-view-e36b65454d-fe3a0a7361-85739157c3.webp\",\n    \"limx\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-limx-193d4dbb97-limx-front-view-baf1a975ee-3348cdec32-e267b88c73.webp\",\n    \"toyota-t-hr3\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-t-hr3-7401935bc7-t-hr3-front-view-911d9ae041-fd4059c847-2d4d977743.webp\",\n    \"osaka-university-alter3\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-alter3-0c21b52379-alter3-front-view-b8ae2b365f-29aea66abc-dfe2f28adc.webp\",\n    \"karlsruhe-institute-of-technology-armar-6\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-armar-6-9cb4f73ab6-armar-6-front-view-4115c14f9c-56f0cac063-2f30463239.webp\",\n    \"unitree-r1\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-unitree-r1-4c67a080b9-unitree-r1-front-view-2aa18087f7-6df6ae5b90-573a2ae6b1.webp\",\n    \"robotera-l7\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-robotera-l7-3a5efc2bbe-robotera-l7-front-view-8d8306978a-0771d92624-fea94af841.webp\",\n    \"px5\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-px5-70a1966be7-px5-front-view-ca3fa01729-1714bb9714-3fddf98b2b.webp\",\n    \"ff-master\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-ff-master-59b27dae0c-ff-master-front-view-1354b268d9-f9d717b2f4-ee0a904240.webp\",\n    \"allex\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-allex-85437fca28-allex-front-view-fbb2c5152c-128d068254-c9a747af5c.webp\",\n    \"university-of-tokyo-kengoro\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-kengoro-29da5c42d0-kengoro-front-view-56e0cdf95c-90c6568913-cbed39ebae.webp\",\n    \"fourier-intelligence-gr-1\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-gr-1-4cc050622b-gr-1-front-view-2add7ab5d2-0eeb45e7a2-75dda8d8d7.webp\",\n    \"fourier-intelligence-g1\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-g1-8bf5eabdde-g1-front-view-bcb674f485-79d115ccfc-bac279f58d.webp\",\n    \"quantax2\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-quantax2-3ed238b7e0-quantax2-front-view-62b6afe1d5-1ffbd09386-b4936a658e.webp\",\n    \"ff-futurist\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-ff-futurist-aca8a3329b-ff-futurist-front-view-67c83af742-f29fe9bd2e-0b1e76c954.webp\",\n    \"dora\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-dora-91d55d9af6-dora-front-view-957c5a5913-7b7baabc50-9354b1e91a.webp\",\n    \"steve\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-steve-043b97324a-steve-front-view-77514e455c-102d1a42a0-c9382a06e2.webp\",\n    \"kepler\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-kepler-b8bd00bb42-kepler-front-view-fcabc9ac8c-7de9fd71e9-dd3deeec55.webp\",\n    \"pudu-d7\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-pudu-d7-d7777798a1-pudu-d7-front-view-dfcc616675-3907a98fab-61765d539a.webp\",\n    \"n2\": \"asset://fr-display-crop-v1-fr-approved-robot-n2-bcc698a524-n2-front-view-4db8e45ac9.webp\",\n    \"k1-pro\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-k1-pro-e1f843b606-k1-pro-front-view-25172fc528-2fc0e8a0cb-78cd41bfa0.webp\",\n    \"k1-geek\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-k1-geek-11c1ff6776-k1-geek-front-view-2ecc2bcc37-d3306dac4c-28dfcae832.webp\",\n    \"k1-edu\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-k1-edu-9d887f2c0b-k1-edu-front-view-baed311cd2-28087f2e89-242d53b996.webp\",\n    \"hmnd-01\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-hmnd-01-dd1d68ace5-hmnd-01-front-view-5e79e4f2d2-9abd9c8378-bd35f01f27.webp\",\n    \"apptronik-apollo\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-apptronik-apollo-573fa212fd-apptronik-apollo-front-view-7f7ef52c5c-104498b885-da839eb2f5.webp\",\n    \"agibot-a2\": \"asset://fr-gallery-fill-v1-fr-white-v2-fr-approved-robot-agibot-a2-23d77e8e39-agibot-a2-front-view-e0212e266c-50337a5cfb-5b118ccccb.webp\",\n    \"xiaomi-cyberone\": \"asset://fr-display-crop-v1-fr-approved-robot-xiaomi-cyberone-5a9971b1f7-xiaomi-cyberone-front-view-d778fadc18.webp\",\n    \"astribot-s1\": \"asset://fr-display-crop-v1-fr-approved-robot-astribot-s1-dfbb8b35be-astribot-s1-front-view-1ec54f8105.webp\"\n  };  const resolveImage = (src = \"\") => src.startsWith(\"asset://\") ? `${assetBase}${src.replace(\"asset://\", \"\")}` : src;\n  const robotFallbackImage = (robot) => cardImageOverrides[robot?.slug] || robot?.imageFallback || homepageImageFallbacks[robot?.slug] || \"\";\n  const firstMediaImage = (items = []) => {\n    if (!Array.isArray(items)) return \"\";\n    const preferred = items.find((item) => item?.image && String(item.type || \"\").match(/hero|front|main|comparison|thumbnail|card|portrait/i));\n    return preferred?.image || items.find((item) => item?.image)?.image || \"\";\n  };\n  const foundImageCandidates = (robot) => Array.isArray(robot?.foundImages)\n    ? robot.foundImages.filter((item) => item?.image && (item.approved || item.officialImage || item.quality >= 80)).map((item) => item.image)\n    : [];\n  const imageCandidates = (robot) => {\n    const candidates = [\n      cardImageOverrides[robot?.slug],\n      robot?.image,\n      firstMediaImage(robot?.approvedMedia),\n      firstMediaImage(robot?.imageViews),\n      ...(Array.isArray(robot?.approvedMedia) ? robot.approvedMedia.map((item) => item.image) : []),\n      ...(Array.isArray(robot?.imageViews) ? robot.imageViews.map((item) => item.image) : []),\n      ...foundImageCandidates(robot),\n      robotFallbackImage(robot),\n    ].filter(Boolean).map(resolveImage);\n    return [...new Set(candidates)];\n  };\n  const imageTag = (robot, candidates, alt = \"\", className = \"\", loading = \"lazy\") => {\n    const src = candidates[0] || \"\";\n    const fallbacks = candidates.slice(1);\n    if (!src) return `<div class=\"fr-image-placeholder${className ? ` ${escapeHtml(className)}` : \"\"}\">${icon()}</div>`;\n    return `<img loading=\"${escapeHtml(loading)}\" src=\"${escapeHtml(src)}\" data-fr-fallbacks=\"${escapeHtml(JSON.stringify(fallbacks))}\" alt=\"${escapeHtml(alt || robot.name)}\"${className ? ` class=\"${escapeHtml(className)}\"` : \"\"}>`;\n  };\n  const image = (robot, alt = \"\") => imageTag(robot, imageCandidates(robot), alt);\n  const shopAssetImageCandidates = (robot) => {\n    const candidates = imageCandidates(robot);\n    const shopAssets = candidates.filter((src) => /(^\\/\\/|^https?:\\/\\/)?www\\.firgellirobots\\.com\\/cdn\\/shop\\/.+\\/assets\\//i.test(src));\n    return shopAssets.length ? shopAssets : candidates;\n  };\n  const legacyShopAssetCandidate = (src = \"\") => {\n    const value = String(src || \"\");\n    if (!value.includes(\"fr-white-v2-\")) return \"\";\n    return value\n      .replace(\"asset://fr-white-v2-\", \"asset://\")\n      .replace(\"/assets/fr-white-v2-\", \"/assets/\")\n      .replace(/-[a-f0-9]{10}(\\.[a-z0-9]+)([?#].*)?$/i, \"$1$2\");\n  };\n  const withLegacyShopAssetCandidates = (candidates = []) => {\n    const expanded = [];\n    candidates.forEach((src) => {\n      const legacy = legacyShopAssetCandidate(src);\n      if (legacy) expanded.push(legacy);\n      expanded.push(src);\n    });\n    return [...new Set(expanded)];\n  };\n  const latestImageCandidates = (robot) => {\n    const candidates = shopAssetImageCandidates(robot);\n    return [...new Set([resolveImage(robotFallbackImage(robot)), ...withLegacyShopAssetCandidates(candidates), ...candidates].filter(Boolean))];\n  };\n  const compareImage = (robot) => {\n    const candidates = shopAssetImageCandidates(robot);\n    return imageTag(robot, candidates, `${robot.name} robot`, \"fr-table-robot__image\", \"eager\");\n  };\n  const manufacturerModelTokens = (manufacturer = {}) => String(manufacturer.models || \"\")\n    .split(/[;|,]/)\n    .map((item) => normalizeSearch(item))\n    .filter(Boolean);\n  const manufacturerLineup = (manufacturer = {}, data = {}) => {\n    const makerName = normalizeSearch(manufacturer.name || \"\");\n    const modelTokens = manufacturerModelTokens(manufacturer);\n    return (data.robots || []).filter((robot) => {\n      if (hiddenRobotSlugs.has(robot.slug)) return false;\n      const robotMaker = normalizeSearch(robot.manufacturer || \"\");\n      const robotName = normalizeSearch(robot.name || \"\");\n      return (makerName && robotMaker === makerName) || modelTokens.some((model) => model && (robotName === model || robotName.includes(model) || model.includes(robotName)));\n    });\n  };\n  const manufacturerCardImageScore = (src = \"\") => {\n    const value = String(src || \"\").toLowerCase();\n    if (!value) return -1;\n    if (value.includes(\"display-crop\") || value.includes(\"head-torso\") || value.includes(\"head_torso\") || value.includes(\"home-compare\")) return 0;\n    if (value.includes(\"front-view\") || value.includes(\"front_view\") || value.includes(\"gallery-fill\") || value.includes(\"white-v2\")) return 5;\n    if (value.includes(\"main\") && !value.includes(\"compare\")) return 4;\n    return 3;\n  };\n  const manufacturerCardImage = (manufacturer = {}, data = {}) => {\n    const lineup = manufacturerLineup(manufacturer, data);\n    const robotImages = lineup.flatMap((robot) => imageCandidates(robot))\n      .sort((a, b) => manufacturerCardImageScore(b) - manufacturerCardImageScore(a));\n    const candidates = [...robotImages, manufacturer.logo, manufacturer.logoFallback].filter(Boolean).map(resolveImage);\n    const src = candidates[0] || \"\";\n    const fallbacks = candidates.slice(1);\n    if (!src) return `<div class=\"fr-image-placeholder fr-manufacturer-card__image\">${icon()}</div>`;\n    return `<img loading=\"lazy\" src=\"${escapeHtml(src)}\" data-fr-fallbacks=\"${escapeHtml(JSON.stringify(fallbacks))}\" alt=\"${escapeHtml((manufacturer.name || \"Robot manufacturer\") + \" representative robot\")}\" class=\"fr-manufacturer-card__image\" style=\"width:100%;height:260px;object-fit:contain;object-position:center;background:#fff;\">`;\n  };\n  document.addEventListener(\"error\", (event) => {\n    const img = event.target;\n    if (!(img instanceof HTMLImageElement) || !img.dataset.frFallbacks) return;\n    let fallbacks = [];\n    try { fallbacks = JSON.parse(img.dataset.frFallbacks || \"[]\"); } catch (error) { fallbacks = []; }\n    const next = fallbacks.shift();\n    if (next) {\n      img.dataset.frFallbacks = JSON.stringify(fallbacks);\n      img.src = next;\n    } else {\n      img.replaceWith(document.createRange().createContextualFragment(`<div class=\"fr-image-placeholder${img.className ? ` ${escapeHtml(img.className)}` : \"\"}\">${icon()}</div>`));\n    }\n  }, true);\n  const rawField = (robot, key) => robot?.rawFields?.[key] || \"\";\n  const listFromText = (value = \"\", limit = 6) => String(value || \"\").split(/[;|]/).map((item) => item.trim()).filter(Boolean).slice(0, limit);\n  const publicStatusLabel = (status = \"\") => {\n    const text = String(status || \"\").toLowerCase();\n    if (text.includes(\"known\")) return \"Verified\";\n    if (text.includes(\"calculated\")) return \"Calculated\";\n    if (text.includes(\"estimated\")) return \"Estimated\";\n    if (text.includes(\"n/a\")) return \"Not applicable\";\n    if (text.includes(\"need\")) return \"Source needed\";\n    return status || \"Source needed\";\n  };\n  const upsertMeta = (name, content) => {\n    if (!content) return;\n    let meta = document.querySelector(`meta[name=\"${name}\"]`);\n    if (!meta) {\n      meta = document.createElement(\"meta\");\n      meta.setAttribute(\"name\", name);\n      document.head.appendChild(meta);\n    }\n    meta.setAttribute(\"content\", content);\n  };\n  const upsertCanonical = (href) => {\n    if (!href) return;\n    let link = document.querySelector('link[rel=\"canonical\"]');\n    if (!link) {\n      link = document.createElement(\"link\");\n      link.setAttribute(\"rel\", \"canonical\");\n      document.head.appendChild(link);\n    }\n    link.setAttribute(\"href\", href);\n  };\n  const mediaViewKey = (item = {}) => {\n    const hay = `${item.displayLabel || \"\"} ${item.label || \"\"} ${item.type || \"\"} ${item.group || \"\"} ${item.sourcePath || \"\"}`.toLowerCase().replace(/[_-]+/g, \" \");\n    const checks = [\n      [\"contact_sheet\", [\"contact sheet\"]],\n      [\"head_torso\", [\"head torso\", \"head close\", \"torso\"]],\n      [\"arm_leg\", [\"arm leg\"]],\n      [\"front\", [\"front\", \"portrait\"]],\n      [\"side\", [\"side\", \"profile\"]],\n      [\"rear\", [\"rear\", \"back\"]],\n      [\"arm\", [\"arm\", \"hand\"]],\n      [\"leg\", [\"leg\", \"feet\", \"foot\"]],\n      [\"hero\", [\"hero\", \"main\"]],\n      [\"square\", [\"square\"]],\n      [\"landscape\", [\"landscape\"]],\n      [\"mobile\", [\"mobile\"]],\n      [\"social\", [\"social\", \"open graph\"]],\n      [\"thumbnail\", [\"thumbnail\", \"thumb\"]]\n    ];\n    for (const [key, tokens] of checks) {\n      if (tokens.some((token) => hay.includes(token))) return key;\n    }\n    return `image:${item.image || item.sourcePath || item.label || \"\"}`;\n  };\n  const uniqueMedia = (items = [], limit = 80) => {\n    const rows = Array.isArray(items) ? items.filter((item) => item && item.image) : [];\n    const seenImages = new Set();\n    const seenViews = new Set();\n    const unique = [];\n    rows.forEach((item) => {\n      const imageKey = item.image || \"\";\n      const viewKey = mediaViewKey(item);\n      if (seenImages.has(imageKey) || seenViews.has(viewKey)) return;\n      seenImages.add(imageKey);\n      seenViews.add(viewKey);\n      unique.push(item);\n    });\n    return unique.slice(0, limit);\n  };\n  function robotFaqs(robot) {\n    const maker = robot.manufacturer || \"the listed manufacturer\";\n    const price = safe(robot.price, \"not publicly verified\");\n    const availability = safe(robot.status, \"not publicly verified\");\n    const height = safe(robot.height, \"not publicly listed\");\n    const runtime = safe(robot.runtime, \"not publicly listed\");\n    const payload = safe(robot.payload, \"not publicly listed\");\n    const sourceCount = Number((robot.sources || []).length + (robot.manuals || []).length + (robot.papers || []).length + (robot.communityMentions || []).length);\n    return [\n      [`What is ${robot.name}?`, `${robot.name} is a ${robot.category || \"robot\"} associated with ${maker}. FIRGELLI Robots tracks its public specifications, media, source links, availability status, and comparison data in one profile.`],\n      [`Who makes ${robot.name}?`, `${robot.name} is listed with ${maker}. The manufacturer profile and source links on this page should be used to verify company-level details before making buying or research decisions.`],\n      [`Is ${robot.name} available to buy?`, `Current availability status: ${availability}. If the robot is marked as a prototype, pilot, announced, or not publicly sold, treat pricing and delivery claims as preliminary.`],\n      [`How much does ${robot.name} cost?`, `Pricing status: ${price}. Robot prices often vary by configuration, support contract, deployment type, and whether the buyer is a research, enterprise, or consumer customer.`],\n      [`What are the main ${robot.name} specifications?`, `Headline specs include height ${height}, runtime ${runtime}, payload ${payload}, and degrees of freedom ${safe(robot.dof, \"not publicly listed\")}. The specification table below groups the public details by category.`],\n      [`What is ${robot.name} best used for?`, `${robot.name} is most useful to evaluate in the context of ${safe(robot.useCase || robot.targetMarket || robot.category, \"robot research and comparison\")}. Check the limitations section before assuming it is ready for home, factory, warehouse, or developer use.`],\n      [`How reliable is the ${robot.name} data?`, `This profile currently links ${sourceCount.toLocaleString()} source records and avoids filling missing specifications with guesses.`]\n    ];\n  }\n  const setRobotSeo = (robot) => {\n    const maker = robot.manufacturer || \"Manufacturer not listed\";\n    const title = `${robot.name} Robot Review, Specs, Price & Images | FIRGELLI Robots`;\n    const description = `${robot.name} by ${maker}: specifications, pricing status, images, videos, use cases, and source-linked robot data.`;\n    const canonicalUrl = `${location.origin}${robotUrl(robot)}`;\n    const citationUrls = [...(robot.sources || []), ...(robot.manuals || []), ...(robot.papers || []), ...(robot.communityMentions || [])]\n      .map((item) => item && item.url)\n      .filter(Boolean)\n      .slice(0, 12);\n    document.title = title;\n    upsertMeta(\"description\", description.slice(0, 158));\n    upsertCanonical(canonicalUrl);\n    const faqs = robotFaqs(robot).slice(0, 8);\n    const schema = {\n      \"@context\": \"https://schema.org\",\n      \"@graph\": [\n        {\n          \"@type\": \"Product\",\n          \"name\": robot.name,\n          \"brand\": maker,\n          \"manufacturer\": { \"@type\": \"Organization\", \"name\": maker },\n          \"description\": robot.summary || description,\n          \"image\": robot.image ? resolveImage(robot.image) : undefined,\n          \"url\": canonicalUrl,\n          \"additionalProperty\": [\n            [\"Availability\", robot.status],\n            [\"Price\", robot.price],\n            [\"Height\", robot.height],\n            [\"Weight\", robot.weight],\n            [\"Payload\", robot.payload],\n            [\"Runtime\", robot.runtime],\n            [\"Degrees of freedom\", robot.dof],\n            [\"Speed\", robot.speed]\n          ].filter(([, value]) => value).map(([name, value]) => ({ \"@type\": \"PropertyValue\", name, value }))\n        },\n        {\n          \"@type\": \"WebPage\",\n          \"@id\": canonicalUrl,\n          \"name\": title,\n          \"description\": description,\n          \"about\": { \"@type\": \"Product\", \"name\": robot.name, \"brand\": maker },\n          \"citation\": citationUrls\n        },\n        {\n          \"@type\": \"FAQPage\",\n          \"mainEntity\": faqs.map(([question, answer]) => ({\n            \"@type\": \"Question\",\n            \"name\": question,\n            \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": answer }\n          }))\n        },\n        {\n          \"@type\": \"BreadcrumbList\",\n          \"itemListElement\": [\n            { \"@type\": \"ListItem\", \"position\": 1, \"name\": \"Home\", \"item\": `${location.origin}/` },\n            { \"@type\": \"ListItem\", \"position\": 2, \"name\": \"Robots\", \"item\": `${location.origin}/pages/robots` },\n            { \"@type\": \"ListItem\", \"position\": 3, \"name\": robot.name, \"item\": canonicalUrl }\n          ]\n        }\n      ]\n    };\n    let script = document.querySelector(\"script[data-fr-robot-schema]\");\n    if (!script) {\n      script = document.createElement(\"script\");\n      script.type = \"application/ld+json\";\n      script.dataset.frRobotSchema = \"true\";\n      document.head.appendChild(script);\n    }\n    script.textContent = JSON.stringify(schema);\n  };\n  const publicMediaLabel = (view = {}) => {\n    const raw = String(view.displayLabel || view.label || view.type || \"Robot image\")\n      .replace(/[_-]+/g, \" \")\n      .replace(/\\s+/g, \" \")\n      .trim();\n    const lower = raw.toLowerCase();\n    if (lower.includes(\"hero\")) return \"Main photo\";\n    if (lower.includes(\"rear/back\")) return \"Rear view\";\n    if (lower.includes(\"head/torso\")) return \"Head and torso\";\n    if (lower.includes(\"arm + leg\")) return \"Arm and leg detail\";\n    return raw || \"Robot image\";\n  };\n  const publicMediaGroup = (view = {}) => {\n    const group = String(view.group || \"\").replace(/[_-]+/g, \" \").trim();\n    if (!group) return \"\";\n    const lower = group.toLowerCase();\n    if (lower.includes(\"approved\") || lower.includes(\"generated\")) return \"standard view\";\n    return group;\n  };\n  const mediaGallery = (items = [], robot = {}, limit = 80) => {\n    const media = uniqueMedia(items, limit);\n    if (!media.length) return \"\";\n    return `<div class=\"fr-view-gallery\">${media.map((view) => `\n      <article class=\"fr-view-card\">\n        <img loading=\"lazy\" src=\"${escapeHtml(resolveImage(view.image || \"\"))}\" alt=\"${escapeHtml(`${robot.name || \"Robot\"} ${publicMediaLabel(view)}`)}\">\n        <strong>${escapeHtml(publicMediaLabel(view))}</strong>\n        <span>${escapeHtml([publicMediaGroup(view), view.officialImage ? \"manufacturer source\" : \"\"].filter(Boolean).join(\" - \"))}</span>\n      </article>\n    `).join(\"\")}</div>`;\n  };\n  const viewGallery = (robot) => mediaGallery(Array.isArray(robot.imageViews) ? robot.imageViews : [], robot, 12);\n  const hiddenPublicSpecLabels = new Set([\"robot id\", \"record id\", \"database id\", \"slug\", \"canonical slug\", \"image id\", \"source id\", \"video\", \"videos\"]);\n  const publicSpecLabelMap = {\n    api: \"Developer API\",\n    ros: \"ROS\",\n    ros2: \"ROS 2\",\n    \"total dof\": \"Total degrees of freedom\",\n    \"actuator count\": \"Actuators\",\n    \"carry capacity\": \"Payload\",\n    \"product url\": \"Official product page\",\n    \"consumer / enterprise / research\": \"Market\"\n  };\n  const booleanSpec = (value = \"\") => {\n    const text = String(value || \"\").trim().toLowerCase();\n    if ([\"true\", \"yes\", \"1\", \"supported\", \"available\"].includes(text)) return \"true\";\n    if ([\"false\", \"no\", \"0\", \"unsupported\"].includes(text)) return \"false\";\n    return \"\";\n  };\n  const publicSpecLabel = (label = \"\") => publicSpecLabelMap[String(label || \"\").trim().toLowerCase()] || String(label || \"\").trim();\n  const publicListValue = (value = \"\") => {\n    const parts = String(value || \"\").replace(/\\|/g, \";\").split(\";\").map((item) => item.trim()).filter(Boolean);\n    return parts.length ? parts.map((item) => item.charAt(0).toUpperCase() + item.slice(1)).join(\", \") : String(value || \"\").trim();\n  };\n  const publicPhraseValue = (value = \"\") => {\n    const text = String(value || \"\").replace(/[_-]+/g, \" \").trim();\n    return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n  };\n  const robotLooksLikeArm = (robot = {}) => [\"name\", \"category\", \"summary\", \"useCase\", \"targetMarket\"]\n    .map((key) => String(robot[key] || \"\").toLowerCase())\n    .join(\" \")\n    .match(/\\b(arm|manipulator|cobot)\\b/);\n  const publicBooleanSpecValue = (label = \"\", value = \"\") => {\n    const flag = booleanSpec(value);\n    const lower = String(label || \"\").trim().toLowerCase();\n    if (!flag || flag === \"false\") return \"\";\n    if (lower === \"walking\") return \"Legged walking mobility\";\n    if (lower === \"wheels\") return \"Wheeled base\";\n    if (lower === \"tracks\") return \"Tracked base\";\n    if ([\"api\", \"ros\", \"ros2\", \"ethernet\"].includes(lower)) return \"Supported\";\n    if (lower.includes(\"military\")) return \"Listed for defense or military-related use in the public data\";\n    return \"Yes\";\n  };\n  const isDisplayableSpecRow = (row = {}) => {\n    const value = String(row.value || \"\").trim().toLowerCase();\n    const label = String(row.label || \"\").trim().toLowerCase();\n    const status = String(row.status || \"\").trim().toLowerCase();\n    if (!value || value === \"not found yet\" || value === \"not publicly listed\") return false;\n    if (hiddenPublicSpecLabels.has(label)) return false;\n    if (status.includes(\"need\") || status.includes(\"research\")) return false;\n    return true;\n  };\n  const publicSpecRow = (row = {}, section = {}, robot = {}) => {\n    if (!isDisplayableSpecRow(row)) return null;\n    const label = String(row.label || \"\").trim();\n    let value = String(row.value || \"\").trim();\n    const lowerLabel = label.toLowerCase();\n    const boolValue = booleanSpec(value);\n    if (boolValue) {\n      value = publicBooleanSpecValue(label, value, section, robot);\n      if (!value) return null;\n    } else if ([\"availability\", \"status\"].includes(lowerLabel)) {\n      value = publicPhraseValue(value);\n    } else if ([\"consumer / enterprise / research\", \"use case\", \"target market\"].includes(lowerLabel)) {\n      value = publicListValue(value);\n    } else if (lowerLabel === \"product url\") {\n      value = \"Open official product page\";\n    }\n    return { label: publicSpecLabel(label), value };\n  };\n  const publicMobilityRows = (section = {}, robot = {}) => {\n    const sourceRows = (section.rows || []).filter(isDisplayableSpecRow);\n    const rowByLabel = new Map(sourceRows.map((row) => [String(row.label || \"\").trim().toLowerCase(), row]));\n    const motionLabels = [\"walking\", \"wheels\", \"tracks\"];\n    const presentMotionLabels = motionLabels.filter((label) => rowByLabel.has(label));\n    const explicitlyStationary = presentMotionLabels.length && presentMotionLabels.every((label) => booleanSpec(rowByLabel.get(label)?.value) === \"false\");\n    const rows = motionLabels\n      .filter((label) => rowByLabel.has(label) && booleanSpec(rowByLabel.get(label)?.value) === \"true\")\n      .map((label) => publicSpecRow(rowByLabel.get(label), section, robot))\n      .filter(Boolean);\n    sourceRows\n      .filter((row) => !motionLabels.includes(String(row.label || \"\").trim().toLowerCase()))\n      .map((row) => publicSpecRow(row, section, robot))\n      .filter(Boolean)\n      .forEach((row) => rows.push(row));\n    if (rows.length) return rows;\n    if (explicitlyStationary) {\n      return [{\n        label: \"Mobility type\",\n        value: robotLooksLikeArm(robot)\n          ? \"Static robot arm designed to work from a fixed mounting point rather than walking or driving.\"\n          : \"No walking, wheeled, or tracked mobility is listed in the public specifications.\"\n      }];\n    }\n    return [];\n  };\n  const publicSpecRowsForSection = (section = {}, robot = {}) => {\n    const category = String(section.category || \"\").trim().toLowerCase();\n    if (!category || [\"internal database fields\", \"website assets\", \"seo / knowledge graph\"].includes(category)) return [];\n    if (category === \"mobility\") return publicMobilityRows(section, robot);\n    return (section.rows || []).map((row) => publicSpecRow(row, section, robot)).filter(Boolean);\n  };\n  const publicSpecCount = (robot = {}) => (robot.specSections || []).reduce((total, section) => total + publicSpecRowsForSection(section, robot).length, 0);\n  const renderSpecSections = (robot) => {\n    const hiddenCategories = new Set([\"Internal Database Fields\", \"Website Assets\", \"SEO / Knowledge Graph\"]);\n    const sections = (Array.isArray(robot.specSections) ? robot.specSections : [])\n      .filter((section) => !hiddenCategories.has(section.category))\n      .map((section) => ({ ...section, rows: publicSpecRowsForSection(section, robot) }))\n      .filter((section) => section.rows.length);\n    if (!sections.length) return \"\";\n    return `<div class=\"fr-spec-chart\">${sections.map((section, index) => `\n      <details class=\"fr-spec-section\" ${index < 8 ? \"open\" : \"\"}>\n        <summary><span>${escapeHtml(section.category)}</span><em>${Number(section.rows.length || 0).toLocaleString()} public detail${section.rows.length === 1 ? \"\" : \"s\"}</em></summary>\n        <div class=\"fr-spec-table\">\n          ${section.rows.map((row) => `\n            <div class=\"fr-spec-row\">\n              <span>${escapeHtml(row.label)}</span>\n              <strong>${escapeHtml(row.value)}</strong>\n            </div>\n          `).join(\"\")}\n        </div>\n      </details>\n    `).join(\"\")}</div>`;\n  };\n  const sourceTypeLabel = (value = \"\") => {\n    const key = String(value || \"\").trim().toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n    const labels = {\n      official_product_page: \"Official product page\",\n      manufacturer_page: \"Manufacturer page\",\n      official_press_release: \"Official press release\",\n      press_release: \"Press release\",\n      manual: \"Manual\",\n      user_manual: \"User manual\",\n      technical_manual: \"Technical manual\",\n      quick_start_guide: \"Quick start guide\",\n      api_docs: \"API documentation\",\n      sdk_docs: \"SDK documentation\",\n      white_paper: \"White paper\",\n      research_paper: \"Research paper\",\n      paper: \"Research paper\",\n      patent: \"Patent\",\n      news: \"News coverage\",\n      review: \"Review\",\n      forum: \"Forum discussion\",\n      owner_review: \"Owner review\"\n    };\n    if (labels[key]) return labels[key];\n    return String(value || \"Reference source\").replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \").trim().replace(/\\b\\w/g, (char) => char.toUpperCase());\n  };\n  const sourceHost = (item = {}) => {\n    if (item.domain || item.publisher) return String(item.domain || item.publisher).replace(/^www\\./, \"\");\n    try {\n      return new URL(item.url, window.location.href).hostname.replace(/^www\\./, \"\");\n    } catch (error) {\n      return \"\";\n    }\n  };\n  const sourcePathLabel = (url = \"\") => {\n    try {\n      const parsed = new URL(url, window.location.href);\n      const path = parsed.pathname.split(\"/\").filter(Boolean).slice(0, 2).join(\" / \");\n      return path ? `${path} page` : \"\";\n    } catch (error) {\n      return \"\";\n    }\n  };\n  const sourceTitle = (item = {}, robot = {}) => {\n    const raw = String(item.title || \"\").trim();\n    const kind = sourceTypeLabel(item.type);\n    if (raw && raw !== item.url) {\n      const lower = raw.toLowerCase();\n      const kindLower = kind.toLowerCase();\n      if (!lower.includes(kindLower) && [\"Official product page\", \"Manufacturer page\", \"Manual\", \"Patent\", \"Research paper\"].includes(kind)) {\n        return `${raw} ${kind.toLowerCase()}`;\n      }\n      return raw;\n    }\n    const host = sourceHost(item);\n    return `${robot.name || \"Robot\"} ${kind.toLowerCase()}${host ? ` from ${host}` : \"\"}`;\n  };\n  const uniqueSourceRows = (items = []) => {\n    const rows = Array.isArray(items) ? items.filter((item) => item && item.url) : [];\n    const score = (item = {}) => {\n      const quality = Number(item.quality || 0);\n      try {\n        const parsed = new URL(item.url, window.location.href);\n        const path = parsed.pathname.split(\"/\").filter(Boolean).join(\"/\");\n        return quality * 1000 + path.length;\n      } catch (error) {\n        return quality * 1000;\n      }\n    };\n    const sourceKey = (item = {}) => {\n      const title = String(item.title || \"\").trim().toLowerCase();\n      const type = String(item.type || \"\").trim().toLowerCase();\n      const host = sourceHost(item).toLowerCase();\n      if (title && type && host) return `${host}|${type}|${title}`;\n      return String(item.url || \"\").trim().toLowerCase().replace(/\\/+$/, \"\");\n    };\n    const seen = new Set();\n    return rows.sort((a, b) => score(b) - score(a)).filter((item) => {\n      const key = sourceKey(item);\n      if (!key || seen.has(key)) return false;\n      seen.add(key);\n      return true;\n    }).slice(0, 16);\n  };\n  const listPhrase = (items = []) => {\n    const values = items.filter(Boolean);\n    if (!values.length) return \"\";\n    if (values.length === 1) return values[0];\n    if (values.length === 2) return `${values[0]} and ${values[1]}`;\n    return `${values.slice(0, -1).join(\", \")}, and ${values[values.length - 1]}`;\n  };\n  const linkCards = (items = [], robot = {}) => {\n    const rows = uniqueSourceRows(items);\n    if (!rows.length) return \"\";\n    return `<div class=\"fr-source-grid\">${rows.map((item) => {\n      const host = sourceHost(item);\n      const type = sourceTypeLabel(item.type);\n      const path = sourcePathLabel(item.url);\n      const meta = [type, host, path].filter(Boolean).join(\" - \");\n      const summary = String(item.summary || \"\").trim();\n      return `\n        <article class=\"fr-source-card\">\n          <a href=\"${escapeHtml(item.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">\n            <strong>${escapeHtml(sourceTitle(item, robot))}</strong>\n            <span>${escapeHtml(meta || \"Reference source\")}</span>\n            ${summary && !/fetch failed/i.test(summary) ? `<em>${escapeHtml(summary.slice(0, 170))}</em>` : \"\"}\n            <b>Open source</b>\n          </a>\n        </article>`;\n    }).join(\"\")}</div>`;\n  };\n  const robotSourcesPanel = (robot) => {\n    const buckets = [\n      [\"Official and primary sources\", \"Manufacturer pages, launch pages, and other primary references used to verify the public robot profile.\", robot.sources],\n      [\"Manuals and technical documentation\", \"Manuals, developer documentation, quick-start guides, SDK notes, and technical PDFs where available.\", robot.manuals],\n      [\"Research papers and patents\", \"Academic papers, patents, white papers, and technical research connected to the robot or platform.\", robot.papers],\n      [\"Community and owner notes\", \"Public owner notes, forum posts, reviews, and community references with usable links.\", robot.communityMentions]\n    ].map(([title, description, items]) => ({ title, description, rows: uniqueSourceRows(items) })).filter((bucket) => bucket.rows.length);\n    if (!buckets.length) {\n      return `<div class=\"fr-source-empty\"><strong>Sources are being verified for ${escapeHtml(robot.name || \"this robot\")}.</strong><p>FIRGELLI Robots only publishes usable citation links in this section, so queued research placeholders and unverified backlog records are kept out of the customer-facing page.</p></div>`;\n    }\n    const total = buckets.reduce((sum, bucket) => sum + bucket.rows.length, 0);\n    const domains = [...new Set(buckets.flatMap((bucket) => bucket.rows.map(sourceHost).filter(Boolean)))].slice(0, 6);\n    const sourceKinds = buckets.map((bucket) => bucket.title.toLowerCase());\n    const category = robot.category || \"robot\";\n    return `\n      <div class=\"fr-source-summary\">\n        <div>\n          <strong>${Number(total).toLocaleString()} verified ${total === 1 ? \"reference\" : \"references\"} for ${escapeHtml(robot.name || \"this robot\")}</strong>\n          <p>This ${escapeHtml(category)} profile connects ${escapeHtml(listPhrase(sourceKinds))} to help verify specifications, price status, availability, images, videos, developer support, and comparison notes before deeper research or buying decisions.</p>\n        </div>\n        ${domains.length ? `<div class=\"fr-source-domain-row\" aria-label=\"Source domains\">${domains.map((domain) => `<span>${escapeHtml(domain)}</span>`).join(\"\")}</div>` : \"\"}\n      </div>\n      <div class=\"fr-robot-source-layout\">\n        ${buckets.map((bucket) => `\n          <section class=\"fr-source-group\">\n            <h3>${escapeHtml(bucket.title)}</h3>\n            <p>${escapeHtml(bucket.description)}</p>\n            ${linkCards(bucket.rows, robot)}\n          </section>\n        `).join(\"\")}\n      </div>`;\n  };\n  const videoPlaceholderValues = new Set([\"\", \"#\", \"n/a\", \"na\", \"null\", \"none\", \"undefined\", \"unknown\", \"test\", \"placeholder\", \"source\", \"video_url\", \"embed_url\", \"youtube\", \"youtube_link\", \"youtube_url\", \"youtube_video_id\"]);\n  const cleanVideoValue = (value = \"\") => String(value || \"\").replace(/\\s+/g, \" \").trim();\n  const isVideoPlaceholder = (value = \"\") => videoPlaceholderValues.has(cleanVideoValue(value).toLowerCase());\n  const safeVideoTitle = (value, index) => {\n    const title = cleanVideoValue(value);\n    return isVideoPlaceholder(title) ? `Movement video ${index + 1}` : (title || `Movement video ${index + 1}`);\n  };\n  const parseVideoSource = (url = \"\", record = {}) => {\n    const raw = cleanVideoValue(url);\n    if (isVideoPlaceholder(raw)) return null;\n    const explicitStatus = cleanVideoValue(record.validationStatus || record.validation_status);\n    if (explicitStatus && ![\"valid_embeddable\", \"valid_link_only\"].includes(explicitStatus)) return null;\n    const explicitEmbed = cleanVideoValue(record.embedUrl || record.embed_url || record.normalizedEmbedUrl);\n    const explicitWatch = cleanVideoValue(record.url || record.watchUrl || record.normalizedWatchUrl || raw);\n    if (explicitStatus === \"valid_link_only\") {\n      return { status: \"valid_link_only\", watchUrl: explicitWatch || raw, embedUrl: \"\", embeddable: false, kind: \"link\" };\n    }\n    try {\n      const parsed = new URL(raw, window.location.href);\n      const host = parsed.hostname.replace(/^www\\./, \"\").toLowerCase();\n      if (host === \"youtube.com\" || host === \"m.youtube.com\") {\n        const id = parsed.searchParams.get(\"v\") || parsed.pathname.match(/\\/shorts\\/([^/?#]+)/)?.[1] || parsed.pathname.match(/\\/embed\\/([^/?#]+)/)?.[1];\n        if (/^[A-Za-z0-9_-]{11}$/.test(id || \"\")) {\n          return { status: \"valid_embeddable\", kind: \"youtube\", videoId: id, watchUrl: `https://www.youtube.com/watch?v=${id}`, embedUrl: `https://www.youtube.com/embed/${id}`, embeddable: true };\n        }\n        return null;\n      }\n      if (host === \"youtube-nocookie.com\") {\n        const id = parsed.pathname.match(/\\/embed\\/([^/?#]+)/)?.[1];\n        if (/^[A-Za-z0-9_-]{11}$/.test(id || \"\")) {\n          return { status: \"valid_embeddable\", kind: \"youtube\", videoId: id, watchUrl: `https://www.youtube.com/watch?v=${id}`, embedUrl: `https://www.youtube.com/embed/${id}`, embeddable: true };\n        }\n        return null;\n      }\n      if (host === \"youtu.be\") {\n        const id = parsed.pathname.split(\"/\").filter(Boolean)[0];\n        if (/^[A-Za-z0-9_-]{11}$/.test(id || \"\")) {\n          return { status: \"valid_embeddable\", kind: \"youtube\", videoId: id, watchUrl: `https://www.youtube.com/watch?v=${id}`, embedUrl: `https://www.youtube.com/embed/${id}`, embeddable: true };\n        }\n        return null;\n      }\n      if (host === \"vimeo.com\" || host === \"player.vimeo.com\") {\n        const id = parsed.pathname.split(\"/\").filter(Boolean).find((part) => /^\\d+$/.test(part));\n        if (id) return { status: \"valid_embeddable\", kind: \"vimeo\", videoId: id, watchUrl: `https://vimeo.com/${id}`, embedUrl: `https://player.vimeo.com/video/${id}`, embeddable: true };\n        return null;\n      }\n      if (host === \"cdn.embedly.com\") {\n        const candidate = parsed.searchParams.get(\"src\") || parsed.searchParams.get(\"url\") || \"\";\n        if (candidate && candidate.includes(\"vimeo.com\")) return parseVideoSource(candidate, record);\n        return null;\n      }\n      if (/\\.(mp4|webm|ogg)(?:$|[?#])/i.test(parsed.href)) {\n        return { status: \"valid_embeddable\", kind: \"direct\", watchUrl: parsed.href, embedUrl: parsed.href, embeddable: true };\n      }\n      if (explicitEmbed && !isVideoPlaceholder(explicitEmbed)) {\n        return { status: \"valid_embeddable\", kind: \"embed\", watchUrl: explicitWatch || explicitEmbed, embedUrl: explicitEmbed, embeddable: true };\n      }\n      return null;\n    } catch (error) {\n      return null;\n    }\n  };\n  const usableVideoRecords = (robot) => {\n    const videos = Array.isArray(robot.videos) ? robot.videos : [];\n    return videos.map((item, index) => {\n      const record = typeof item === \"string\" ? { url: item } : (item || {});\n      const parsed = parseVideoSource(record.url || record.embedUrl || \"\", record);\n      if (!parsed) return null;\n      return { ...record, ...parsed, title: safeVideoTitle(record.title || record.type, index) };\n    }).filter(Boolean);\n  };\n  const isDirectVideoUrl = (url = \"\") => /\\.(mp4|webm|ogg)(?:$|[?#])/i.test(String(url));\n  const videoFrame = (record, robotName) => {\n    const frameTitle = `${robotName || \"Robot\"} ${record.title || \"movement video\"}`;\n    if (record.status === \"valid_link_only\" || !record.embeddable) {\n      const href = record.watchUrl || record.url;\n      return href ? `<a class=\"fr-button fr-button--secondary\" href=\"${escapeHtml(href)}\" target=\"_blank\" rel=\"noopener noreferrer\">Watch on YouTube</a>` : \"\";\n    }\n    const embedUrl = record.embedUrl || record.url;\n    if (!embedUrl || isVideoPlaceholder(embedUrl)) return \"\";\n    if (isDirectVideoUrl(embedUrl)) {\n      const srcdoc = `<!doctype html><html><head><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><style>html,body{margin:0;height:100%;background:#071525}video{display:block;width:100%;height:100%;object-fit:contain;background:#071525}</style></head><body><video controls preload=\"metadata\" src=\"${escapeHtml(embedUrl)}\"></video></body></html>`;\n      return `<iframe class=\"fr-video-frame\" srcdoc=\"${escapeHtml(srcdoc)}\" title=\"${escapeHtml(frameTitle)}\" loading=\"lazy\" allow=\"autoplay; fullscreen; picture-in-picture\" allowfullscreen></iframe>`;\n    }\n    return `<iframe class=\"fr-video-frame\" src=\"${escapeHtml(embedUrl)}\" title=\"${escapeHtml(frameTitle)}\" loading=\"lazy\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen></iframe>`;\n  };\n  const videoIframes = (robot) => {\n    const videos = usableVideoRecords(robot);\n    if (!videos.length) return \"\";\n    return `<div class=\"fr-video-grid\">${videos.map((record) => {\n      const frame = videoFrame(record, robot.name);\n      if (!frame) return \"\";\n      return `\n        <article class=\"fr-video-card\">\n          ${frame}\n          <div>\n            <strong>${escapeHtml(record.title)}</strong>\n            <span>${escapeHtml([record.platform, record.type].filter((item) => item && !isVideoPlaceholder(item)).join(\" - \") || \"Video evidence\")}</span>\n            ${record.source ? `<a href=\"${escapeHtml(record.source)}\">Source -></a>` : \"\"}\n          </div>\n        </article>`;\n    }).filter(Boolean).join(\"\")}</div>`;\n  };\n  const bindTabs = (root = document) => {\n    root.querySelectorAll(\"[data-fr-tabs]\").forEach((tabs) => {\n      const buttons = Array.from(tabs.querySelectorAll(\"[data-fr-tab-button]\"));\n      const panels = Array.from(tabs.querySelectorAll(\"[data-fr-tab-panel]\"));\n      buttons.forEach((button) => {\n        button.addEventListener(\"click\", () => {\n          const selected = button.dataset.frTabButton;\n          buttons.forEach((item) => item.classList.toggle(\"is-active\", item === button));\n          panels.forEach((panel) => {\n            const active = panel.dataset.frTabPanel === selected;\n            panel.classList.toggle(\"is-active\", active);\n            panel.hidden = !active;\n          });\n        });\n      });\n    });\n  };\n  const approvedMedia = (robot) => Array.isArray(robot.approvedMedia) && robot.approvedMedia.length ? robot.approvedMedia : (Array.isArray(robot.imageViews) ? robot.imageViews : []);\n  const normalizeMediaToken = (value = \"\") => String(value || \"\").toLowerCase().replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \").trim();\n  const mediaMatchScore = (item, tokens) => {\n    const type = normalizeMediaToken(item.type || \"\");\n    const label = normalizeMediaToken(item.label || item.displayLabel || \"\");\n    const hay = normalizeMediaToken(`${item.label || \"\"} ${item.type || \"\"} ${item.group || \"\"} ${item.sourcePath || \"\"}`);\n    return tokens.reduce((score, token) => {\n      const normalized = normalizeMediaToken(token);\n      if (!normalized) return score;\n      if (type === normalized) return Math.max(score, 100);\n      if (label === normalized) return Math.max(score, 90);\n      if (hay.includes(normalized)) return Math.max(score, 10);\n      return score;\n    }, 0);\n  };\n  const pickMediaSet = (robot, definitions, limit = 8) => {\n    const media = uniqueMedia([...(Array.isArray(robot.imageViews) ? robot.imageViews : []), ...approvedMedia(robot)], 64);\n    const used = new Set();\n    const selected = [];\n    definitions.forEach(([label, tokens]) => {\n      const match = media\n        .map((item, index) => ({ item, index, score: used.has(item.image) ? 0 : mediaMatchScore(item, tokens) }))\n        .filter((entry) => entry.score > 0)\n        .sort((a, b) => b.score - a.score || a.index - b.index)[0]?.item;\n      if (match) {\n        used.add(match.image);\n        selected.push({ ...match, displayLabel: label });\n      }\n    });\n    media.forEach((item) => {\n      if (selected.length < limit && !used.has(item.image)) {\n        used.add(item.image);\n        selected.push(item);\n      }\n    });\n    return selected.slice(0, limit);\n  };\n  const mediaTileGrid = (items, robot, modifier = \"\") => {\n    const media = Array.isArray(items) ? items : [];\n    if (!media.length) return `<p class=\"fr-muted\">No image gallery is available yet.</p>`;\n    return `<div class=\"fr-angle-grid ${modifier}\">${media.map((view) => `\n      <article class=\"fr-angle-tile\">\n        <img loading=\"lazy\" src=\"${escapeHtml(resolveImage(view.image || \"\"))}\" alt=\"${escapeHtml(`${robot.name || \"Robot\"} ${publicMediaLabel(view)}`)}\">\n        <strong>${escapeHtml(publicMediaLabel(view))}</strong>\n      </article>\n    `).join(\"\")}</div>`;\n  };\n  const specLookup = (robot, labels) => {\n    const wanted = labels.map((label) => label.toLowerCase());\n    for (const section of robot.specSections || []) {\n      for (const row of section.rows || []) {\n        if (wanted.includes(String(row.label || \"\").toLowerCase())) return row.value || \"\";\n      }\n    }\n    return \"\";\n  };\n  const shortValue = (value) => {\n    const text = safe(value, \"Not verified\");\n    return text.length > 84 ? `${text.slice(0, 82).trim()}...` : text;\n  };\n  const robotChecklist = (robot) => {\n    const mediaCount = approvedMedia(robot).length;\n    const checks = [\n      [\"Image gallery\", mediaCount ? `${mediaCount} images` : \"Not listed yet\"],\n      [\"Main robot photo\", robot.image ? \"Available\" : \"Not listed yet\"],\n      [\"Specification fields\", `${Number(robot.specSummary?.Total || 0).toLocaleString()} fields`],\n      [\"Source links\", `${Number((robot.sources || []).length).toLocaleString()} sources`],\n      [\"Media library\", `${mediaCount.toLocaleString()} images`],\n      [\"Profile depth\", robot.completeness >= 80 ? \"Strong\" : \"Still growing\"],\n    ];\n    return `<ul class=\"fr-dossier-checklist\">${checks.map(([label, value]) => `<li><span></span><strong>${escapeHtml(label)}</strong><em>${escapeHtml(value)}</em></li>`).join(\"\")}</ul>`;\n  };\n  const pipelineSteps = (robot) => {\n    const steps = [\n      [\"1\", \"Identity\", robot.id ? \"Listed\" : \"Not listed\"],\n      [\"2\", \"Images\", approvedMedia(robot).length ? \"Available\" : \"Needed\"],\n      [\"3\", \"Specs\", `${Number(publicSpecCount(robot) || robot.specSummary?.Known || 0).toLocaleString()} details`],\n      [\"4\", \"Sources\", `${Number((robot.sources || []).length).toLocaleString()} sources`],\n      [\"5\", \"Docs\", `${Number((robot.manuals || []).length + (robot.papers || []).length).toLocaleString()} linked`],\n      [\"6\", \"Profile\", \"Published\"],\n    ];\n    return `<div class=\"fr-dossier-pipeline\">${steps.map((step, index) => `\n      <div class=\"fr-pipeline-step\">\n        <span>${escapeHtml(step[0])}</span>\n        <strong>${escapeHtml(step[1])}</strong>\n        <em>${escapeHtml(step[2])}</em>\n      </div>\n      ${index < steps.length - 1 ? `<b>-></b>` : \"\"}\n    `).join(\"\")}</div>`;\n  };\n  const knownSpecRows = (robot, categories = [], limit = 8) => {\n    const wanted = categories.map((category) => category.toLowerCase());\n    const rows = [];\n    (robot.specSections || []).forEach((section) => {\n      if (wanted.length && !wanted.some((name) => String(section.category || \"\").toLowerCase().includes(name))) return;\n      publicSpecRowsForSection(section, robot).forEach((row) => rows.push(row));\n    });\n    return rows.slice(0, limit);\n  };\n  const specSentence = (robot, categories, fallback) => {\n    const rows = knownSpecRows(robot, categories, 4);\n    if (!rows.length) return fallback;\n    return rows.map((row) => `${row.label}: ${row.value}`).join(\"; \");\n  };\n  const internalLinkList = (items = []) => `<div class=\"fr-related-links\">${items.filter(Boolean).map((item) => `<a href=\"${escapeHtml(item.url)}\">${escapeHtml(item.label)}</a>`).join(\"\")}</div>`;\n  const relatedRobots = (robot, data, limit = 6) => {\n    const seen = new Set([robot.slug]);\n    const rows = [];\n    const add = (candidate) => {\n      if (!candidate || seen.has(candidate.slug)) return;\n      rows.push(candidate);\n      seen.add(candidate.slug);\n    };\n    data.robots.filter((item) => item.manufacturer && item.manufacturer === robot.manufacturer).forEach(add);\n    data.robots.filter((item) => item.category && item.category === robot.category).forEach(add);\n    (data.featuredRobots || []).forEach(add);\n    return rows.slice(0, limit);\n  };\n  const faqBlock = (faqs = []) => `<div class=\"fr-faq-list\">${faqs.map(([question, answer]) => `\n    <details class=\"fr-faq-item\">\n      <summary>${escapeHtml(question)}</summary>\n      <p>${escapeHtml(answer)}</p>\n    </details>\n  `).join(\"\")}</div>`;\n  const robotSeoArticle = (robot, data) => {\n    const maker = publicMaker(robot);\n    const related = relatedRobots(robot, data, 6);\n    const mediaCount = approvedMedia(robot).length;\n    const sourceCount = Number((robot.sources || []).length + (robot.manuals || []).length + (robot.papers || []).length);\n    const targetMarket = safe(robot.targetMarket || robot.useCase || rawField(robot, \"target_market\"), \"robot buyers, researchers, engineers, and comparison shoppers\");\n    const hardware = specSentence(robot, [\"physical\", \"degrees\", \"hands\", \"payload\"], `Public hardware details are still incomplete for ${robot.name}; published dimensions and manipulation fields are listed in the specification table.`);\n    const mobility = specSentence(robot, [\"mobility\", \"performance\"], `${robot.name} should be evaluated from the public mobility fields below, especially walking method, speed, terrain limits, and stability notes where available.`);\n    const battery = specSentence(robot, [\"battery\"], `Battery chemistry, charging method, and runtime are not fully documented in the public data yet. Runtime should not be assumed beyond the fields shown in the specification table.`);\n    const aiSoftware = specSentence(robot, [\"software\", \"ai\", \"developer\"], `Software, SDK, ROS, local AI, and cloud AI details are tracked when publicly available. Software details stay unconfirmed until a stronger source is connected.`);\n    const hands = specSentence(robot, [\"hands\", \"payload\"], `End-effector and hand details are not fully documented yet. Use payload, hand DOF, finger count, and grip fields when comparing manipulation ability.`);\n    const strengths = [\n      sourceCount ? `${sourceCount.toLocaleString()} linked source records support verification.` : \"\",\n      mediaCount ? `${mediaCount.toLocaleString()} approved image assets help compare visible design and proportions.` : \"\",\n      robot.height ? `Height is listed as ${robot.height}.` : \"\",\n      robot.payload ? `Payload is listed as ${robot.payload}.` : \"\",\n      robot.dof ? `Degrees of freedom are listed as ${robot.dof}.` : \"\"\n    ].filter(Boolean);\n    const limitations = [\n      !robot.price || /not verified|not publicly|quote|listed/i.test(robot.price) ? \"Pricing should be treated as unconfirmed or configuration-dependent.\" : \"\",\n      /prototype|pilot|announced|development|not publicly/i.test(String(robot.status || \"\")) ? \"Availability may be limited to pilots, announcements, or non-public deployment.\" : \"\",\n      !robot.runtime ? \"Runtime is not fully documented in the public data.\" : \"\",\n      !robot.source ? \"A primary source URL is not yet attached to this profile.\" : \"\",\n      \"Robot specifications can change quickly as manufacturers revise hardware, software, and deployment programs.\"\n    ].filter(Boolean);\n    const relatedLinks = [\n      robot.manufacturer ? { label: `${maker} manufacturer profile`, url: manufacturerUrl(maker) } : null,\n      { label: `${robot.category || \"Robot\"} category`, url: categoryUrl(robot.category || \"humanoid\") },\n      { label: \"Robot comparison tool\", url: \"/pages/compare\" },\n      { label: \"Robot price guide\", url: knowledgeUrl(\"Price\") },\n      { label: \"Robot DOF explained\", url: knowledgeUrl(\"DOF\") },\n      { label: \"Robot battery runtime explained\", url: knowledgeUrl(\"Runtime\") }\n    ];\n    return `\n      <section class=\"fr-seo-article fr-robot-panel\">\n        <p class=\"fr-eyebrow\">${escapeHtml(robot.name)} Review</p>\n        <h2>${escapeHtml(robot.name)} review, specs, price, availability and comparison</h2>\n        <p><strong>Quick answer:</strong> ${escapeHtml(robot.name)} is a ${escapeHtml(robot.category || \"robot\")} associated with ${escapeHtml(maker)}. Based on currently available public information, its availability is ${escapeHtml(safe(robot.status, \"not publicly confirmed\"))}, and its pricing status is ${escapeHtml(safe(robot.price, \"not publicly confirmed\"))}.</p>\n        <p>This profile is designed for people comparing humanoid robots, evaluating robot buying options, checking developer suitability, or researching the state of commercial robotics. Fields without enough public support stay unconfirmed until a stronger source is attached.</p>\n\n        <div class=\"fr-seo-grid\">\n          <article><h3>What is ${escapeHtml(robot.name)}?</h3><p>${escapeHtml(robot.summary || `${robot.name} is a ${robot.category || \"robot\"} profile built from public specifications, manufacturer references, approved images, and source links.`)}</p></article>\n          <article><h3>Who makes it?</h3><p>${escapeHtml(maker)} is the manufacturer currently connected to this profile. Use the linked manufacturer page and source cards below to verify company-level details, model lineage, and official product information.</p></article>\n          <article><h3>What is it designed for?</h3><p>${escapeHtml(robot.name)} is most relevant for ${escapeHtml(targetMarket)}. Treat use-case claims carefully when the robot is still marked as prototype, piloting, announced, or unavailable to the public.</p></article>\n          <article><h3>Availability and price</h3><p>Availability: ${escapeHtml(safe(robot.status, \"not publicly listed\"))}. Price: ${escapeHtml(safe(robot.price, \"not publicly listed\"))}. Robot pricing often depends on configuration, support contract, accessories, and whether the customer is buying, leasing, or joining a pilot.</p></article>\n        </div>\n\n        <h3>Hardware and design</h3>\n        <p>${escapeHtml(hardware)}</p>\n        <h3>Mobility</h3>\n        <p>${escapeHtml(mobility)}</p>\n        <h3>Hands, manipulation and payload</h3>\n        <p>${escapeHtml(hands)}</p>\n        <h3>Battery and charging</h3>\n        <p>${escapeHtml(battery)}</p>\n        <h3>AI, software and developer support</h3>\n        <p>${escapeHtml(aiSoftware)}</p>\n\n        <div class=\"fr-seo-grid\">\n          <article><h3>Strengths</h3><ul>${(strengths.length ? strengths : [\"This profile is connected to the broader FIRGELLI Robots comparison database.\"]).map((item) => `<li>${escapeHtml(item)}</li>`).join(\"\")}</ul></article>\n          <article><h3>Limitations and uncertainties</h3><ul>${limitations.map((item) => `<li>${escapeHtml(item)}</li>`).join(\"\")}</ul></article>\n          <article><h3>Best use cases</h3><ul>${listFromText(robot.useCase || robot.targetMarket || \"Research; Comparison shopping; Robotics education; Enterprise evaluation\", 6).map((item) => `<li>${escapeHtml(item)}</li>`).join(\"\")}</ul></article>\n          <article><h3>Not ideal for</h3><ul><li>Buyers who need guaranteed availability without confirming directly with the manufacturer.</li><li>Procurement decisions that require independently verified pricing, warranty, and deployment support.</li><li>Applications where missing safety, runtime, payload, or autonomy data cannot be tolerated.</li></ul></article>\n        </div>\n\n        <h3>Similar robots and comparisons</h3>\n        <p>Compare ${escapeHtml(robot.name)} against nearby robots to understand maturity, cost, availability, hardware tradeoffs, and ecosystem differences.</p>\n        ${internalLinkList(related.map((item) => ({ label: item.name, url: robotUrl(item) })).concat(relatedLinks))}\n\n        <h3>FAQ</h3>\n        ${faqBlock(robotFaqs(robot))}\n      </section>`;\n  };\n  const slugifyLocal = (value = \"\") => String(value || \"\").toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n  const categorySlugFromRoute = () => categoryHandleMap[currentPageHandle()] || \"\";\n  const manufacturerSlugFromRoute = () => currentPageHandle().replace(/-robot-manufacturer$/, \"\");\n  const knowledgeTopicFromRoute = () => {\n    const handle = currentPageHandle();\n    const map = {\n      \"humanoid-robot-price-guide\": \"Price\",\n      \"robot-price-explained\": \"Price\",\n      \"robot-payload-explained\": \"Payload\",\n      \"robot-runtime-explained\": \"Runtime\",\n      \"robot-dof-explained\": \"DOF\",\n      \"robot-height-explained\": \"Height\",\n      \"robot-weight-explained\": \"Weight\",\n      \"robot-release-status-explained\": \"Release Status\",\n      \"robot-walking-speed-explained\": \"Walking Speed\"\n    };\n    return map[handle] || \"\";\n  };\n  const toolFocusFromRoute = () => {\n    const handle = currentPageHandle();\n    return {\n      \"robot-finder\": \"Robot Match\",\n      \"robot-compare-tool\": \"Robot Compare\",\n      \"payload-calculator\": \"Payload Calculator\",\n      \"robot-cost-calculator\": \"Cost of Ownership\",\n      \"robot-timeline\": \"Robot Timeline\",\n      \"3d-robot-viewer\": \"Robot Size Viewer\"\n    }[handle] || \"\";\n  };\n  const categorySeoContent = (kind, data, robots) => {\n    const category = new URLSearchParams(location.search).get(\"filter\") || categorySlugFromRoute() || \"humanoid\";\n    const record = (data.categories || []).find((item) => item.slug === category) || { label: \"Robot Categories\", description: \"Robots grouped by use case, availability, specifications, images, and source quality.\" };\n    const top = robots.slice(0, 8);\n    return `\n      <section class=\"fr-seo-article fr-card fr-section\">\n        <p class=\"fr-eyebrow\">Category Guide</p>\n        <h2>${escapeHtml(record.label)} guide, best robots and buying considerations</h2>\n        <p>${escapeHtml(record.description || `${record.label} are tracked by use case, availability, specifications, images, and source quality.`)}</p>\n        <div class=\"fr-seo-grid\">\n          <article><h3>What belongs here?</h3><p>Robots in this category should have a clear public role that matches the category, plus enough specifications, images, or source material to compare them usefully.</p></article>\n          <article><h3>What should be compared elsewhere?</h3><p>Robots built for a different job are better reviewed in another category. A polished demo or similar-looking body shape is not enough by itself.</p></article>\n          <article><h3>What to compare first</h3><p>Start with whether the robot is actually available, then compare price status, size, payload, runtime, DOF, mobility, software access, support, and source quality.</p></article>\n          <article><h3>What to be careful about</h3><p>Many robotics companies publish partial specs. Missing price, runtime, safety, SDK, warranty, or deployment details should be treated as unknown.</p></article>\n        </div>\n        <h3>Good robots to start with</h3>\n        ${internalLinkList(top.map((robot) => ({ label: robot.name, url: robotUrl(robot) })))}\n        <h3>FAQ</h3>\n        ${faqBlock([\n          [`What is the best ${record.label.toLowerCase()}?`, `The best choice depends on whether you need consumer access, enterprise deployment, developer support, payload, runtime, or research flexibility. Use the comparison table and robot detail pages rather than relying on one headline spec.`],\n          [`Are ${record.label.toLowerCase()} for sale?`, `Some are sold, some are enterprise-only, and many are still prototypes or pilot programs. Always verify the current availability status on the robot profile and manufacturer source.`],\n          [`Which specs matter most?`, `Price, availability, payload, runtime, DOF, safety, SDK/ROS support, and source quality usually matter more than promotional videos alone.`]\n        ])}\n      </section>`;\n  };\n  const manufacturerSeoContent = (manufacturer, robots) => {\n    const lineup = robots.filter((robot) => robot.manufacturer === manufacturer.name).slice(0, 12);\n    return `\n      <section class=\"fr-seo-article fr-card fr-section\">\n        <p class=\"fr-eyebrow\">Manufacturer Profile</p>\n        <h2>${escapeHtml(manufacturer.name)} robots, company focus and public lineup</h2>\n        <p>${escapeHtml(manufacturer.name)} is a robotics company${manufacturer.country ? ` with country listed as ${escapeHtml(manufacturer.country)}` : \"\"}. This page reviews the company's public robot lineup, focus areas, available product information, and related robot profiles so buyers and researchers can understand where ${escapeHtml(manufacturer.name)} fits in the robotics market.</p>\n        <div class=\"fr-seo-grid\">\n          <article><h3>Robotics focus</h3><p>${escapeHtml(safe(manufacturer.focus, \"Robotics focus is not fully documented yet.\"))}</p></article>\n          <article><h3>Known models</h3><p>${escapeHtml(safe(manufacturer.models, lineup.map((robot) => robot.name).join(\", \") || \"No robot models are linked yet.\"))}</p></article>\n          <article><h3>Location</h3><p>${escapeHtml([manufacturer.country, manufacturer.headquarters].filter(Boolean).join(\" - \") || \"Country and headquarters are not fully documented yet.\")}</p></article>\n          <article><h3>Source confidence</h3><p>${Number(manufacturer.confidence || 0).toLocaleString()}% confidence with ${Number(manufacturer.sourceCount || 0).toLocaleString()} source records attached where available.</p></article>\n        </div>\n        <h3>Robot lineup</h3>\n        ${internalLinkList(lineup.map((robot) => ({ label: robot.name, url: robotUrl(robot) })))}\n        <h3>FAQ</h3>\n        ${faqBlock([\n          [`What robots does ${manufacturer.name} make?`, `${manufacturer.models || lineup.map((robot) => robot.name).join(\", \") || \"The linked robot lineup is still being expanded.\"}`],\n          [`Where is ${manufacturer.name} based?`, `${[manufacturer.country, manufacturer.headquarters].filter(Boolean).join(\" - \") || \"Location data is not fully documented yet.\"}`],\n          [`How should I verify ${manufacturer.name} data?`, `Use the linked robot profiles, manufacturer website, product pages, and source records. Unknown company details should stay unconfirmed until supported by a source.`]\n        ])}\n      </section>`;\n  };\n  const comparisonSeoContent = (robots) => {\n    if (!robots.length) return \"\";\n    const names = robots.map((robot) => robot.name).join(\" vs \");\n    return `\n      <section class=\"fr-seo-article fr-card fr-section\">\n        <p class=\"fr-eyebrow\">Comparison Analysis</p>\n        <h2>${escapeHtml(names)} comparison guide</h2>\n        <p>This comparison is designed to help buyers, researchers, engineers, and robotics enthusiasts evaluate differences in price, availability, dimensions, payload, runtime, DOF, and maturity. The table is a starting point; each robot profile contains deeper source notes and missing-data warnings.</p>\n        <div class=\"fr-seo-grid\">\n          <article><h3>Short verdict</h3><p>Choose the robot with the best match for your intended use case, not simply the most familiar brand. Availability and support matter as much as headline specifications.</p></article>\n          <article><h3>Key differences</h3><p>${escapeHtml(robots.map((robot) => `${robot.name}: ${compactStatus(robot.status)}, ${compactPrice(robot.price)}`).join(\"; \"))}</p></article>\n          <article><h3>Data limitations</h3><p>Several humanoid robot projects publish incomplete or changing data. Treat unknown fields as unknown and verify directly with the manufacturer before buying or citing.</p></article>\n          <article><h3>Best next step</h3><p>Open each robot profile to inspect source links, image galleries, videos, and full specification sections before making a decision.</p></article>\n        </div>\n        <h3>Related robot profiles</h3>\n        ${internalLinkList(robots.map((robot) => ({ label: robot.name, url: robotUrl(robot) })))}\n      </section>`;\n  };\n  const toolSeoContent = (data, focus = \"\") => {\n    const profiles = {\n      \"Robot Compare\": {\n        eyebrow: \"Comparison Guide\",\n        heading: \"Robot comparison tool for price, specs, availability and fit\",\n        targets: [\"robot comparison tool\", \"compare humanoid robots\", \"robot specs comparison\", \"best humanoid robot comparison\", \"robot price comparison\"],\n        intro: \"This robot comparison tool is built for buyers, engineers, researchers and robotics teams who need a fast way to compare robots side by side without losing sight of source quality. It helps you compare price status, availability, height, weight, payload, runtime, degrees of freedom, mobility and profile evidence before you spend time contacting manufacturers or reading every profile in full.\",\n        sections: [\n          [\"What this comparison is best for\", \"Use the compare widget when you have two to four candidate robots and need to understand how they differ in practical terms. A robot with a lower price may have weaker support, a shorter runtime, less payload or a less mature deployment path. A robot with impressive videos may still be a prototype with limited buying information. The value of a comparison is not simply finding the biggest number; it is seeing which public claims are complete enough to trust.\"],\n          [\"How the data should be read\", \"FIRGELLI Robots separates published specifications, public price signals, release status, images and source notes so readers can see what is known and what still needs verification. When a field is unknown, quote-based or not publicly listed, treat that as a research flag. Unknown data should never be interpreted as zero cost, zero risk or hidden performance.\"],\n          [\"Expert review perspective\", \"A useful robot comparison checks the job first, then the robot. For warehouse work, payload, runtime, service model and safety integration may matter more than humanoid appearance. For research, SDK access, repairability, documentation and lab adoption may matter more than near-term commercial availability. For a buyer, warranty, support, delivery timing and total cost often outweigh a single headline specification.\"]\n        ],\n        cards: [\n          [\"Compare like for like\", \"Start with robots meant for the same job. A research platform, prototype, preorder robot and commercial deployment can look similar in a table but mean very different things.\"],\n          [\"Check missing data\", \"Unknown price, runtime, payload or support terms should be treated as open questions, not as zero or as a confirmed feature.\"],\n          [\"Use profiles for proof\", \"The compare tool is a fast view. Open each robot profile to inspect sources, images, videos and notes before making a buying or research decision.\"],\n          [\"Good next step\", \"After comparing specs, use the cost calculator and robot finder to test budget and use-case fit.\"]\n        ],\n        faq: [\n          [\"What is the best way to compare humanoid robots?\", \"Start with the intended use case, then compare availability, price status, payload, runtime, height, weight, mobility, software access, support model and source quality. The best robot is the one that fits the job and has enough verified information to reduce buying risk.\"],\n          [\"Can I use this robot comparison tool for buying decisions?\", \"Use it as an early research and shortlisting tool. Before buying, confirm current pricing, delivery timing, warranty, safety requirements, training, integration support and service terms directly with the manufacturer or integrator.\"],\n          [\"Why do some robots show unknown or quote-based values?\", \"Many robotics companies publish partial specifications or enterprise-only pricing. FIRGELLI Robots keeps those gaps visible so users do not mistake missing public data for confirmed capability.\"],\n          [\"Which specs matter most when comparing robots?\", \"For most projects, availability, price, payload, runtime, serviceability, safety, software ecosystem, support and source confidence matter more than a single impressive demo metric.\"],\n          [\"Should prototypes be compared with commercial robots?\", \"They can be compared for research context, but they should not be treated as equivalent buying options. A prototype may show future capability while a commercial robot has delivery, support and deployment responsibilities.\"],\n          [\"How often should robot comparison data be rechecked?\", \"Recheck data whenever you are close to a purchase, citation or project decision. Robot pricing, release status, payload claims and software access can change quickly.\"]\n        ],\n        links: [\n          { label: \"Robot database\", url: \"/pages/robots\" },\n          { label: \"Robot finder\", url: \"/pages/robot-finder\" },\n          { label: \"Cost calculator\", url: \"/pages/robot-cost-calculator\" },\n          { label: \"Humanoid robot price guide\", url: \"/pages/humanoid-robot-price-guide\" }\n        ]\n      },\n      \"Robot Match\": {\n        eyebrow: \"Finder Guide\",\n        heading: \"Robot finder for matching robots by use case, budget and specs\",\n        targets: [\"robot finder\", \"find a robot for my use case\", \"humanoid robot finder\", \"robot recommendation tool\", \"robot buying guide\"],\n        intro: \"The robot finder is designed for people who know the job they want a robot to do but do not yet know which models deserve closer review. It ranks robots by goal, form factor, budget signal and priority so users can move from a broad robotics database to a more realistic shortlist.\",\n        sections: [\n          [\"What the finder is trying to solve\", \"Robot search is difficult because the market mixes commercial robots, preorder systems, pilot programs, research platforms and prototypes. A simple alphabetical list does not help a buyer decide whether a robot is suitable for home assistance, research, warehouse work, education, hospitality or enterprise testing. The finder turns those decision points into a practical filter.\"],\n          [\"How to interpret matches\", \"A strong match means a robot record contains public signals that align with your filters. It does not mean the robot is guaranteed to be available, safe for your environment or affordable after integration. Treat the result as a prioritized reading list, then open the profiles and compare the finalists.\"],\n          [\"Expert review perspective\", \"Good robot matching starts with the task environment. Payload, runtime, mobility, developer access, service terms and support expectations should be matched to the work before brand preference. The finder helps expose candidates, but the final decision should consider whether the robot can be purchased, maintained and safely operated.\"]\n        ],\n        cards: [\n          [\"Start broad\", \"Begin with any budget or any type, then tighten the filters once you see which robots appear repeatedly.\"],\n          [\"Read the fit score carefully\", \"A high fit score means the public record matches the selected filters. It does not guarantee availability, warranty, safety or delivery timing.\"],\n          [\"Open the profiles\", \"The result cards link to robot profiles with source notes, images, videos and specifications so you can verify the match.\"],\n          [\"Compare finalists\", \"Once you have two to four candidates, compare them side by side and model ownership cost.\"]\n        ],\n        faq: [\n          [\"How does the robot finder choose matches?\", \"It scores public robot records against the selected use case, category, budget signal and priority. The score reflects visible database fit, not a private endorsement or guaranteed product recommendation.\"],\n          [\"What should I do after the finder shows robot matches?\", \"Open the top profiles, check source links and missing data, then compare two to four finalists with the robot compare tool and cost calculator.\"],\n          [\"Can the finder tell me which robot to buy?\", \"No. It can narrow the field, but buying requires confirmation of current price, availability, support, warranty, safety and integration needs.\"],\n          [\"Why does a robot appear even if it is not commercially available?\", \"Research platforms, prototypes and announced robots can be relevant for education, development or market tracking. The status field should be read before treating any robot as a purchase option.\"],\n          [\"Which robot finder filters matter most?\", \"Goal and priority usually matter first. Budget is useful, but many robots use quote-based pricing, so a budget filter should be combined with availability, payload, runtime and developer access.\"],\n          [\"Is this only a humanoid robot finder?\", \"No. The finder can surface humanoid, service, warehouse, research, industrial and other robot records when the public data matches the selected criteria.\"]\n        ],\n        links: [\n          { label: \"Robot database\", url: \"/pages/robots\" },\n          { label: \"Robot compare tool\", url: \"/pages/robot-compare-tool\" },\n          { label: \"Cost calculator\", url: \"/pages/robot-cost-calculator\" },\n          { label: \"Payload calculator\", url: \"/pages/payload-calculator\" }\n        ]\n      },\n      \"Payload Calculator\": {\n        eyebrow: \"Payload Guide\",\n        heading: \"Robot payload calculator for lifting, carrying and handling tasks\",\n        targets: [\"robot payload calculator\", \"humanoid robot payload\", \"robot arm payload calculator\", \"calculate robot payload\", \"robot lifting capacity\"],\n        intro: \"The robot payload calculator helps estimate the minimum rated payload a robot should publish before it is considered for a lifting, carrying or handling task. It is especially useful when comparing humanoid robots, mobile manipulators, service robots and research platforms that publish payload in different ways.\",\n        sections: [\n          [\"Why payload needs a safety margin\", \"Payload is not only the weight of the object. A realistic estimate includes the object, gripper, bracket, tool, cable drag, packaging variation and dynamic forces from starting, stopping or turning. A robot that can lift a load once in a demonstration may not be suitable for repeated production cycles without margin.\"],\n          [\"How to read matching robots\", \"The calculator surfaces robots with public payload values that meet or exceed the estimate. That does not prove reach, grip, duty cycle, stability, safety certification or endurance. A match means the robot deserves further review, not that it is automatically ready for deployment.\"],\n          [\"Expert review perspective\", \"For practical robotics work, payload should be evaluated with reach, speed, battery life, thermal limits, end-effector design and failure mode. Humanoid robots may publish arm payload, carrying payload or planned payload, which are not always the same measurement. Always verify which payload definition the manufacturer is using.\"]\n        ],\n        cards: [\n          [\"Use real working weight\", \"Include the object, gripper, fixture, cable drag and anything else the robot has to carry or move.\"],\n          [\"Add safety margin\", \"A higher safety factor is useful when the load shifts, cycle rate is high, specs are incomplete or the task is safety-sensitive.\"],\n          [\"Treat matches as candidates\", \"Matching robots have enough public payload data to clear the estimate, but you still need to verify reach, grip, duty cycle and support.\"],\n          [\"Do not ignore unknowns\", \"Robots without public payload data may still be capable, but they should not be assumed suitable until the manufacturer confirms it.\"]\n        ],\n        faq: [\n          [\"How do I calculate robot payload?\", \"Start with the full working load, including the object, gripper, fixture and any attached tooling. Multiply that by an appropriate safety factor, then compare the result against the robot's rated payload.\"],\n          [\"What safety factor should I use for robot payload?\", \"Use a lower factor for controlled light-duty tasks and a higher factor when the load shifts, speed is high, the duty cycle is heavy, the robot works near people or the published data is incomplete.\"],\n          [\"Is humanoid robot payload the same as robot arm payload?\", \"Not always. A humanoid may publish single-arm payload, two-arm carrying capacity, hand payload or planned carrying capacity. Those values should not be treated as interchangeable without manufacturer confirmation.\"],\n          [\"Why are some robots missing from the payload matches?\", \"Robots without public payload data are not shown as matches because the calculator cannot verify that they clear the estimate.\"],\n          [\"Can payload alone determine whether a robot can do a task?\", \"No. Reach, grip, balance, runtime, motion speed, environment, safety, software and support also affect whether a robot can perform the work reliably.\"],\n          [\"Should I choose the robot with the highest payload?\", \"Not automatically. Choose the robot whose payload, reach, runtime, availability, support and total cost match the job with enough margin.\"]\n        ],\n        links: [\n          { label: \"Robot payload explained\", url: \"/pages/robot-payload-explained\" },\n          { label: \"Robot database\", url: \"/pages/robots\" },\n          { label: \"Robot compare tool\", url: \"/pages/robot-compare-tool\" },\n          { label: \"Cost calculator\", url: \"/pages/robot-cost-calculator\" }\n        ]\n      },\n      \"Cost of Ownership\": {\n        eyebrow: \"Cost Guide\",\n        heading: \"Robot cost of ownership calculator for purchase, deployment and support\",\n        targets: [\"robot cost calculator\", \"robot cost of ownership\", \"humanoid robot cost\", \"robot deployment cost\", \"robot maintenance cost\"],\n        intro: \"The robot cost of ownership calculator turns a headline robot price into a fuller budget estimate. It is designed for buyers and teams comparing humanoid robots, service robots, warehouse robots and research platforms where the purchase price is only one part of the real cost.\",\n        sections: [\n          [\"What total robot cost includes\", \"A robot project usually includes purchase price, deployment setup, fixtures, tools, accessories, software, training, integration labor, shipping, taxes, service plans, replacement batteries or consumables and internal support time. For enterprise robots, the largest cost difference may come from integration and service rather than the robot body itself.\"],\n          [\"Why this matters for robot buyers\", \"Robotics budgets fail when teams compare a public MSRP against a real deployment requirement. A lower-cost robot can become expensive if it needs custom integration, frequent support or unavailable parts. A higher-cost robot may be more economical if it includes documentation, service, training and a mature deployment path.\"],\n          [\"Expert review perspective\", \"Cost of ownership should be tied to risk. Prototype robots, preorder programs and quote-only platforms need more contingency than mature products with clear warranty and support. The calculator makes assumptions visible so a buyer can change the model instead of relying on a single marketing number.\"]\n        ],\n        cards: [\n          [\"Headline price is not total cost\", \"Deployment, integration, tools, safety work, software, freight, tax and downtime can be as important as the robot purchase price.\"],\n          [\"Use a robot preset carefully\", \"A preset fills the purchase price when public price data exists. Keep editing the assumptions to match your project.\"],\n          [\"Separate one-time and recurring costs\", \"The breakdown separates purchase and setup from annual support items so you can see what drives the total over time.\"],\n          [\"Verify before buying\", \"Confirm warranty, service plan, battery life, spares, support response, training and delivery terms directly with the maker or integrator.\"]\n        ],\n        faq: [\n          [\"How much does a humanoid robot cost?\", \"Public prices vary widely. Some robots list a price, some use enterprise quotes, and others are prototypes or research platforms with no public selling price. The calculator helps model the ownership cost once a purchase price or quote is available.\"],\n          [\"What should be included in robot cost of ownership?\", \"Include purchase price, deployment setup, accessories, end effectors, safety work, software, training, service, consumables, batteries, internal support labor, freight, taxes and downtime assumptions.\"],\n          [\"Why is robot deployment cost different from purchase price?\", \"Deployment cost includes the work required to make the robot useful in a real environment: integration, setup, training, testing, support, tooling and process changes.\"],\n          [\"Can I use the calculator before I have a quote?\", \"Yes. Use a rough price assumption or a public preset to explore scenarios, then replace it with a manufacturer quote before making a decision.\"],\n          [\"How should service and maintenance be estimated?\", \"Start with a percentage of purchase price plus expected consumables and support labor. Increase the assumption when the robot is new, hard to service, heavily used or mission-critical.\"],\n          [\"Does the lowest purchase price mean the lowest total cost?\", \"Not necessarily. A low purchase price can be outweighed by integration work, limited support, short battery life, downtime, missing documentation or expensive parts.\"]\n        ],\n        links: [\n          { label: \"Humanoid robot price guide\", url: \"/pages/humanoid-robot-price-guide\" },\n          { label: \"Robot compare tool\", url: \"/pages/robot-compare-tool\" },\n          { label: \"Robot finder\", url: \"/pages/robot-finder\" },\n          { label: \"Robot runtime explained\", url: \"/pages/robot-runtime-explained\" }\n        ]\n      },\n      \"Robot Timeline\": {\n        eyebrow: \"Timeline Guide\",\n        heading: \"Robot timeline for launches, prototypes, pilots and research platforms\",\n        targets: [\"robot timeline\", \"humanoid robot timeline\", \"robot launch dates\", \"humanoid robot release date\", \"robot development timeline\"],\n        intro: \"The robot timeline helps readers understand when robots were announced, launched, piloted, updated or documented in public records. It is built for researchers, buyers and enthusiasts who need context around robot maturity rather than a simple list of names.\",\n        sections: [\n          [\"What the timeline can and cannot prove\", \"A timeline year can point to an announcement, product launch, pilot, research milestone, public source record or database update. That context matters because a robot announced in a given year may not be available for purchase, and a research platform may remain important even if it is not a commercial product.\"],\n          [\"Why robot maturity matters\", \"Robots often move through phases: concept, prototype, lab platform, pilot, preorder, commercial deployment and sometimes discontinuation. A timeline helps show where a robot sits in that progression, but maturity should still be checked against source links, manufacturer pages, customer deployments and support details.\"],\n          [\"Expert review perspective\", \"For market research, timeline data is useful for spotting waves of competition and changes in manufacturer focus. For buying decisions, the important question is not only when a robot appeared, but whether it has stable specifications, delivery terms, support infrastructure and real deployment evidence.\"]\n        ],\n        cards: [\n          [\"Timeline years need context\", \"A year may refer to an announcement, launch, update, research publication or database signal. Open the profile to verify what it means.\"],\n          [\"Filter by category and status\", \"Use the filters to separate humanoid, service, quadruped and arm records, then narrow by availability or research maturity.\"],\n          [\"Watch maturity changes\", \"Robotics projects can move from prototype to pilot to commercial deployment over time. Timeline position is not the same as readiness.\"],\n          [\"Use sources for proof\", \"The research hub and robot profiles are the best places to confirm whether a date is official, secondary or still incomplete.\"]\n        ],\n        faq: [\n          [\"What does a year mean in the robot timeline?\", \"A year may represent an announcement, release, pilot, research publication, public product page or database signal. Open the robot profile to understand the source behind the year.\"],\n          [\"Is a robot with a recent year automatically better?\", \"No. Newer robots may have better hardware or AI claims, but they may also have less proof, fewer support resources and less availability than older platforms.\"],\n          [\"Can I use the timeline to find robots for sale?\", \"Use it as a starting point, then check status and profile sources. A timeline entry does not guarantee that the robot is commercially available.\"],\n          [\"Why are research robots included?\", \"Research robots are important for understanding the development of humanoid robotics, manipulation, walking, sensing and open-source platforms, even when they are not sold as commercial products.\"],\n          [\"How should prototypes be handled in timeline research?\", \"Treat prototypes as evidence of direction and capability, not as confirmed products. Look for later source records that show pilots, deployments or sales.\"],\n          [\"What should I compare after using the timeline?\", \"Compare robots by availability, price, payload, runtime, mobility, source confidence and manufacturer support before drawing conclusions.\"]\n        ],\n        links: [\n          { label: \"Research hub\", url: \"/pages/research\" },\n          { label: \"Robot database\", url: \"/pages/robots\" },\n          { label: \"Manufacturers\", url: \"/pages/manufacturers\" },\n          { label: \"Robot compare tool\", url: \"/pages/robot-compare-tool\" }\n        ]\n      },\n      \"Robot Size Viewer\": {\n        eyebrow: \"Size Guide\",\n        heading: \"Robot size viewer for height, proportions, payload and visual comparison\",\n        targets: [\"robot size viewer\", \"compare robot height\", \"humanoid robot height comparison\", \"robot dimensions\", \"robot size comparison\"],\n        intro: \"The robot size viewer helps compare two robots visually using database images and published dimensions. It is built for readers who need to understand robot height, proportions, weight, payload and status before moving into a deeper specification comparison.\",\n        sections: [\n          [\"Why visual size comparison matters\", \"Robot dimensions affect workspace fit, transport, safety planning, reach, visibility, storage, battery placement and how the robot interacts with people. A humanoid robot that looks similar in a photo may have very different height, weight, payload and operating assumptions.\"],\n          [\"How to read the viewer\", \"The size viewer uses available robot images and compact dimensions for practical comparison. It is not a CAD model, reach simulator or engineering drawing. It should be used to understand proportion and scale before checking the full profile and source records.\"],\n          [\"Expert review perspective\", \"Size should be evaluated with the job. A taller robot may reach higher shelves but be harder to transport or operate in tight spaces. A lighter robot may be easier to deploy but have lower payload or stability. Status and support matter as much as dimensions.\"]\n        ],\n        cards: [\n          [\"Use it for proportion checks\", \"The viewer helps compare height, body shape and visual scale quickly. It is not a CAD model, engineering drawing or reach simulation.\"],\n          [\"Read dimensions with caution\", \"Some records publish height in different units or with planned values. Open the profile and sources before relying on the number.\"],\n          [\"Compare payload and status too\", \"A robot that is taller is not automatically stronger, available or better suited to a task. Pair size with payload, runtime and status.\"],\n          [\"Open profiles for detail\", \"The profile pages include images, specs, notes and sources that explain the visual comparison in more depth.\"]\n        ],\n        faq: [\n          [\"How do I compare robot height accurately?\", \"Use the published height value and check the source behind it. Some robots publish planned dimensions, approximate measurements or values in different units.\"],\n          [\"Is the robot size viewer a 3D model?\", \"No. It is a practical visual comparison tool using database images and published dimensions. It is not a CAD viewer, reach simulation or engineering model.\"],\n          [\"Why does robot weight matter with size?\", \"Weight affects transport, stability, floor loading, battery requirements, safety and deployment logistics. Two robots with similar height can have very different operating constraints.\"],\n          [\"Should I choose a taller humanoid robot?\", \"Not automatically. A taller robot may have reach advantages, but the right choice depends on payload, runtime, mobility, safety, support and environment fit.\"],\n          [\"Can images distort robot size?\", \"Yes. Camera angle, pose, cropping and missing scale references can affect perception. Use the dimensions and source links to verify what the image suggests.\"],\n          [\"What should I check after comparing robot size?\", \"Open the robot profiles and compare payload, runtime, availability, price, mobility, support and source confidence.\"]\n        ],\n        links: [\n          { label: \"Robot height explained\", url: \"/pages/robot-height-explained\" },\n          { label: \"Robot payload explained\", url: \"/pages/robot-payload-explained\" },\n          { label: \"Robot compare tool\", url: \"/pages/robot-compare-tool\" },\n          { label: \"Robot database\", url: \"/pages/robots\" }\n        ]\n      }\n    };\n    const profile = profiles[focus];\n    const relatedTools = (current = \"\") => normalizedTools()\n      .filter((tool) => !current || tool.title !== current)\n      .map((tool) => ({ label: tool.title, url: tool.url }));\n    if (profile) {\n      return `\n        <section class=\"fr-seo-article fr-card fr-section\">\n          <p class=\"fr-eyebrow\">${escapeHtml(profile.eyebrow)}</p>\n          <h2>${escapeHtml(profile.heading)}</h2>\n          <p>${escapeHtml(profile.intro)}</p>\n          <p><strong>Search intent this page serves:</strong> ${escapeHtml(profile.targets.join(\", \"))}.</p>\n          ${profile.sections.map(([heading, copy]) => `<h3>${escapeHtml(heading)}</h3><p>${escapeHtml(copy)}</p>`).join(\"\")}\n          <div class=\"fr-seo-grid\">\n            ${profile.cards.map(([heading, copy]) => `<article><h3>${escapeHtml(heading)}</h3><p>${escapeHtml(copy)}</p></article>`).join(\"\")}\n          </div>\n          <h3>FAQ</h3>\n          ${faqBlock(profile.faq)}\n          <h3>Related robot tools</h3>\n          ${internalLinkList(relatedTools(focus))}\n          <h3>Useful next pages</h3>\n          ${internalLinkList(profile.links)}\n        </section>`;\n    }\n    return `\n      <section class=\"fr-seo-article fr-card fr-section\">\n        <p class=\"fr-eyebrow\">Robot Tools</p>\n        <h2>Robot finder, comparison tools, calculators and research widgets</h2>\n        <p>FIRGELLI Robots tools are built for buyers, engineers, robotics researchers and enthusiasts who need practical decision support from source-backed robot data. The tool set connects robot profiles, public specifications, manufacturer records, approved imagery, source links and research notes so users can move from broad discovery to a defensible shortlist.</p>\n        <p><strong>Search intent this page serves:</strong> robot tools, robot finder, robot comparison tool, robot cost calculator, robot payload calculator, robot timeline, robot size comparison.</p>\n        <h3>How the tool hub should be used</h3>\n        <p>Start with the robot finder when you are still exploring, use the compare tool when you have finalists, estimate payload when a robot must lift or carry something, model ownership cost before contacting suppliers, use the timeline for market context, and use the size viewer when dimensions and proportions affect fit.</p>\n        <h3>Evidence, trust and limitations</h3>\n        <p>The tools are designed to make assumptions visible. Missing price, unknown payload, incomplete runtime, prototype status or quote-based availability should be treated as research questions. The widgets help you decide what to verify next; final buying decisions should always use current manufacturer documentation, direct quotes, warranty terms and deployment planning.</p>\n        <div class=\"fr-seo-grid\">\n          <article><h3>Robot Compare</h3><p>Use the comparison tool to evaluate price, height, payload, runtime, DOF, mobility, and availability side by side.</p></article>\n          <article><h3>Robot Finder</h3><p>Use the finder workflow to narrow robots by intended use, environment, budget assumptions, and hardware priorities.</p></article>\n          <article><h3>Cost of ownership</h3><p>Use the calculator to combine purchase price, deployment setup, accessories, service percentage, battery replacement, and support assumptions.</p></article>\n          <article><h3>Limitations</h3><p>Unknown price, battery, safety, warranty, and support data are surfaced as assumptions so buyers can adjust the inputs instead of guessing blindly.</p></article>\n        </div>\n        <h3>FAQ</h3>\n        ${faqBlock([\n          [\"Which robot tool should I start with?\", \"Start with the robot finder if you do not have a shortlist. Use robot compare once you have candidates, then use the cost and payload calculators to test practical feasibility.\"],\n          [\"Are these tools enough to choose a robot?\", \"No. They are research tools. Use them to shortlist robots, then verify price, availability, warranty, safety, service, training and integration directly with the manufacturer or integrator.\"],\n          [\"Why do some robot records have missing values?\", \"Many robotics companies publish incomplete specifications or quote-only pricing. FIRGELLI Robots keeps missing data visible so users know what still needs confirmation.\"],\n          [\"Do the tools use live robot database records?\", \"Yes. The widgets use the FIRGELLI Robots database fields, including public specs, images, status, price signals and profile links where available.\"],\n          [\"Can these tools compare humanoid robots and non-humanoid robots?\", \"Yes. The database includes humanoid, service, warehouse, research, industrial, quadruped and robot arm records when public data is available.\"]\n        ])}\n        <h3>Related robot tools</h3>\n        ${internalLinkList(relatedTools())}\n        <h3>Related guides</h3>\n        ${internalLinkList([{ label: \"Humanoid robot price guide\", url: \"/pages/humanoid-robot-price-guide\" }, { label: \"Robot payload explained\", url: \"/pages/robot-payload-explained\" }, { label: \"Robot runtime explained\", url: \"/pages/robot-runtime-explained\" }, { label: \"Compare robots\", url: \"/pages/compare\" }])}\n      </section>`;\n  };\n  const normalizedTools = () => [\n    { title: \"Robot Compare\", description: \"Build a live side-by-side comparison from source-backed robot records\", cta: \"Compare Robots\", url: \"/pages/robot-compare-tool\" },\n    { title: \"Robot Match\", description: \"Rank robots by use case, budget, availability and key specs\", cta: \"Find Match\", url: \"/pages/robot-finder\" },\n    { title: \"Payload Calculator\", description: \"Estimate required payload and find robots with enough public payload data\", cta: \"Calculate\", url: \"/pages/payload-calculator\" },\n    { title: \"Cost of Ownership\", description: \"Model purchase, deployment, service and support assumptions\", cta: \"Calculate\", url: \"/pages/robot-cost-calculator\" },\n    { title: \"Robot Timeline\", description: \"Filter robot launches, announcements and research milestones\", cta: \"Explore Now\", url: \"/pages/robot-timeline\" },\n    { title: \"Robot Size Viewer\", description: \"Compare robot proportions with live images and dimensions\", cta: \"View Sizes\", url: \"/pages/3d-robot-viewer\" }\n  ];\n  const formatUsd = (value) => new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: \"USD\", maximumFractionDigits: 0 }).format(Math.max(0, Number(value) || 0));\n  const numericValue = (value) => Number.isFinite(Number(value)) ? Number(value) : 0;\n  const boundedPercent = (value) => Math.max(0, Math.min(100, Math.round(Number(value) || 0)));\n  const toolRobots = (data) => (data.robots || []).filter((robot) => robot && robot.name).slice(0, 220);\n  const toolRobotBySlug = (data, slug) => toolRobots(data).find((robot) => robot.slug === slug);\n  const defaultRobotSlug = (data, slugs = []) => {\n    const robots = toolRobots(data);\n    return (slugs.map((slug) => robots.find((robot) => robot.slug === slug)).find(Boolean) || robots[0] || {}).slug || \"\";\n  };\n  const toolRobotOptions = (data, selected = \"\", blankLabel = \"\") => {\n    const options = toolRobots(data)\n      .sort((a, b) => String(a.name).localeCompare(String(b.name)))\n      .map((robot) => `<option value=\"${escapeHtml(robot.slug)}\"${robot.slug === selected ? \" selected\" : \"\"}>${escapeHtml(robot.name)}</option>`)\n      .join(\"\");\n    return `${blankLabel ? `<option value=\"\">${escapeHtml(blankLabel)}</option>` : \"\"}${options}`;\n  };\n  const toolCategoryOptions = (data, selected = \"\") => [...new Set(toolRobots(data).map((robot) => String(robot.category || \"\").trim()).filter(Boolean))]\n    .sort((a, b) => a.localeCompare(b))\n    .map((category) => `<option value=\"${escapeHtml(category)}\"${category === selected ? \" selected\" : \"\"}>${escapeHtml(category.replace(/-/g, \" \"))}</option>`)\n    .join(\"\");\n  const robotHeightCm = (robot) => {\n    const text = String(robot.height || \"\").toLowerCase();\n    let match = text.match(/(\\d+(?:\\.\\d+)?)\\s*(?:ft|feet|')\\s*(?:(\\d+(?:\\.\\d+)?)\\s*(?:in|inches|\"))?/);\n    if (match) return Number(match[1]) * 30.48 + numericValue(match[2]) * 2.54;\n    match = text.match(/(\\d+(?:\\.\\d+)?)\\s*mm\\b/);\n    if (match) return Number(match[1]) / 10;\n    match = text.match(/(\\d+(?:\\.\\d+)?)\\s*cm\\b/);\n    if (match) return Number(match[1]);\n    match = text.match(/(\\d+(?:\\.\\d+)?)\\s*m\\b/);\n    if (match) return Number(match[1]) * 100;\n    const raw = numericValue(robot.heightRaw);\n    if (raw >= 300) return raw / 10;\n    if (raw > 40) return raw;\n    if (raw > 0 && raw < 10) return raw * 100;\n    return raw;\n  };\n  const compactToolMeasure = (value, unit, fallback = \"Unknown\") => {\n    const text = compactMeasure(value, unit);\n    return text === \"Not listed\" ? fallback : text;\n  };\n  const toolMiniSpecs = (robot) => `\n    <dl class=\"fr-tool-mini-specs\">\n      <div><dt>Price</dt><dd>${escapeHtml(compactPrice(robot.price))}</dd></div>\n      <div><dt>Payload</dt><dd>${escapeHtml(publicCardValue(robot.payload, \"Unknown\"))}</dd></div>\n      <div><dt>Runtime</dt><dd>${escapeHtml(compactRuntime(robot.runtime))}</dd></div>\n    </dl>`;\n  const toolResultCards = (robots, noteFn = () => \"\") => {\n    if (!robots.length) return `<p class=\"fr-tool-note\">No matching robot records have enough public data yet. Try relaxing the filters or use the full robot database.</p>`;\n    return `<div class=\"fr-tool-result-list\">${robots.map((robot) => `\n      <article class=\"fr-tool-result-card\">\n        <a class=\"fr-tool-result-card__image\" href=\"${robotUrl(robot)}\">${image(robot, `${robot.name} robot`)}</a>\n        <div class=\"fr-tool-result-card__body\">\n          <strong><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></strong>\n          <span>${escapeHtml(publicMaker(robot))}</span>\n          <small>${escapeHtml(noteFn(robot) || compactStatus(robot.status))}</small>\n          ${toolMiniSpecs(robot)}\n        </div>\n      </article>`).join(\"\")}</div>`;\n  };\n  const finderResultCards = (rows) => {\n    if (!rows.length) return `<p class=\"fr-tool-note\">No close matches yet. Try a broader goal, a quote-based budget, or the full robot database.</p>`;\n    return `<div class=\"fr-tool-result-list\">${rows.map(({ robot, score }) => {\n      const fit = boundedPercent(score);\n      return `\n        <article class=\"fr-tool-result-card fr-tool-result-card--ranked\">\n          <a class=\"fr-tool-result-card__image\" href=\"${robotUrl(robot)}\">${image(robot, `${robot.name} robot`)}</a>\n          <div class=\"fr-tool-result-card__body\">\n            <div class=\"fr-tool-result-card__top\"><strong><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></strong><span>${fit}% fit</span></div>\n            <span>${escapeHtml(publicMaker(robot))}</span>\n            <div class=\"fr-fit-meter\" aria-label=\"${fit}% match\"><span style=\"width:${fit}%\"></span></div>\n            <small>${escapeHtml(compactPrice(robot.price))} / ${escapeHtml(compactStatus(robot.status))}</small>\n            ${toolMiniSpecs(robot)}\n          </div>\n        </article>`;\n    }).join(\"\")}</div>`;\n  };\n  const robotText = (robot) => normalizeSearch(`${robot.name} ${robot.manufacturer} ${robot.category} ${robot.useCase} ${robot.targetMarket} ${robot.summary} ${robot.status} ${robot.price} ${robot.movement}`);\n  const finderTerms = {\n    home: [\"home\", \"consumer\", \"house\", \"personal\", \"companion\"],\n    business: [\"enterprise\", \"business\", \"workplace\", \"commercial\", \"customer\", \"reception\", \"service\"],\n    research: [\"research\", \"education\", \"developer\", \"university\", \"lab\", \"embodied ai\"],\n    industrial: [\"industrial\", \"manufacturing\", \"inspection\", \"factory\", \"warehouse\", \"logistics\"],\n    service: [\"service\", \"hospitality\", \"healthcare\", \"delivery\", \"facility\"]\n  };\n  const matchesAnyTerm = (text, terms = []) => terms.some((term) => text.includes(term));\n  const scoreRobotForFinder = (robot, prefs) => {\n    const text = robotText(robot);\n    let score = 0;\n    if (prefs.goal === \"any\" || matchesAnyTerm(text, finderTerms[prefs.goal] || [prefs.goal])) score += 36;\n    if (prefs.form === \"any\" || String(robot.category || \"\").toLowerCase() === prefs.form || text.includes(prefs.form)) score += 22;\n    const price = numericValue(robot.priceRaw);\n    if (prefs.budget === \"any\") score += 8;\n    if (prefs.budget === \"under-25k\" && price && price <= 25000) score += 22;\n    if (prefs.budget === \"under-100k\" && price && price <= 100000) score += 18;\n    if (prefs.budget === \"quote\" && (!price || /quote|contact|enterprise|not publicly/i.test(robot.price || \"\"))) score += 16;\n    if (prefs.priority === \"available\" && /available|commercial|paid|preorder|early access|pilot/i.test(robot.status || \"\")) score += 18;\n    if (prefs.priority === \"payload\" && numericValue(robot.payloadRaw) >= 5) score += 18;\n    if (prefs.priority === \"runtime\" && numericValue(robot.runtimeRaw) >= 2) score += 18;\n    if (prefs.priority === \"developer\" && matchesAnyTerm(text, [\"research\", \"developer\", \"sdk\", \"ros\", \"education\"])) score += 18;\n    if (/discontinued/i.test(robot.status || \"\")) score -= 18;\n    return score;\n  };\n  const compareWidget = (data) => {\n    const defaults = [\n      defaultRobotSlug(data, [\"tesla-optimus\", \"unitree-robotics-unitree-g1\"]),\n      defaultRobotSlug(data, [\"figure-ai-figure-02\", \"1x-technologies-neo\"]),\n      defaultRobotSlug(data, [\"unitree-robotics-unitree-g1\", \"boston-dynamics-atlas\"]),\n      defaultRobotSlug(data, [\"apptronik-apollo\", \"xiaomi-cyberone\"])\n    ].filter(Boolean);\n    return `\n      <section class=\"fr-tool-widget\" id=\"robot-compare-tool\">\n        <div class=\"fr-tool-widget__header\">\n          <div><p class=\"fr-eyebrow\">Live Widget</p><h2>Robot compare tool</h2><p>Select up to four robots and compare price, availability, dimensions, payload, runtime, movement and source-backed profile data.</p></div>\n          <a class=\"fr-button fr-button--secondary\" href=\"/pages/compare\">Open Classic Table</a>\n        </div>\n        <div class=\"fr-tool-panel\" data-fr-compare-widget>\n          <div class=\"fr-widget-form\">\n            ${[0, 1, 2, 3].map((index) => `<label>Robot ${index + 1}<select data-fr-compare-select>${toolRobotOptions(data, defaults[index] || \"\", \"Choose robot\")}</select></label>`).join(\"\")}\n          </div>\n          <div class=\"fr-tool-results\" data-fr-compare-results></div>\n        </div>\n      </section>`;\n  };\n  const robotFinderWidget = (data) => `\n    <section class=\"fr-tool-widget\" id=\"robot-finder\">\n      <div class=\"fr-tool-widget__header\">\n        <div><p class=\"fr-eyebrow\">Live Widget</p><h2>Robot finder</h2><p>Choose the buying context and the widget ranks robot records from the live FIRGELLI Robots database.</p></div>\n        <a class=\"fr-button fr-button--secondary\" href=\"/pages/robots\">Full Database</a>\n      </div>\n      <div class=\"fr-tool-panel\" data-fr-finder-widget>\n        <div class=\"fr-widget-form\">\n          <label>Goal<select data-fr-finder-goal><option value=\"any\">Any goal</option><option value=\"home\">Home / consumer</option><option value=\"business\">Business / enterprise</option><option value=\"research\">Research / education</option><option value=\"industrial\">Industrial / warehouse</option><option value=\"service\">Service / hospitality</option></select></label>\n          <label>Robot type<select data-fr-finder-form><option value=\"any\">Any type</option><option value=\"humanoid\">Humanoid</option><option value=\"consumer\">Consumer</option><option value=\"enterprise\">Enterprise</option><option value=\"industrial\">Industrial</option><option value=\"warehouse\">Warehouse</option><option value=\"service\">Service</option><option value=\"research\">Research</option></select></label>\n          <label>Budget<select data-fr-finder-budget><option value=\"any\">Any budget</option><option value=\"under-25k\">Under $25k</option><option value=\"under-100k\">Under $100k</option><option value=\"quote\">Quote / enterprise</option></select></label>\n          <label>Priority<select data-fr-finder-priority><option value=\"available\">Availability</option><option value=\"developer\">Developer access</option><option value=\"payload\">Payload</option><option value=\"runtime\">Runtime</option></select></label>\n        </div>\n        <div class=\"fr-tool-results\" data-fr-finder-results></div>\n      </div>\n    </section>`;\n  const payloadWidget = () => `\n    <section class=\"fr-tool-widget\" id=\"payload-calculator\">\n      <div class=\"fr-tool-widget__header\"><div><p class=\"fr-eyebrow\">Live Calculator</p><h2>Payload calculator</h2><p>Estimate the rated payload you should look for after adding a safety margin.</p></div></div>\n      <div class=\"fr-tool-panel\" data-fr-payload-widget>\n        <div class=\"fr-widget-form\">\n          <label>Object/load weight (kg)<input type=\"number\" min=\"0\" step=\"0.1\" value=\"2\" data-fr-payload-load></label>\n          <label>Safety factor<select data-fr-payload-factor><option value=\"1.25\">1.25x light duty</option><option value=\"1.5\" selected>1.5x normal</option><option value=\"2\">2x conservative</option><option value=\"3\">3x unknown load</option></select></label>\n          <label>Cycles per hour<input type=\"number\" min=\"0\" step=\"1\" value=\"30\" data-fr-payload-cycles></label>\n          <label>Use case<select data-fr-payload-use><option value=\"any\">Any</option><option value=\"humanoid\">Humanoid</option><option value=\"industrial\">Industrial</option><option value=\"warehouse\">Warehouse</option><option value=\"service\">Service</option></select></label>\n        </div>\n        <div class=\"fr-tool-results\" data-fr-payload-results></div>\n      </div>\n    </section>`;\n  const costWidget = (data) => {\n    const pricedRobots = { robots: toolRobots(data).filter((robot) => numericValue(robot.priceRaw) > 0) };\n    return `\n    <section class=\"fr-tool-widget\" id=\"robot-cost-calculator\">\n      <div class=\"fr-tool-widget__header\"><div><p class=\"fr-eyebrow\">Live Calculator</p><h2>Cost of ownership calculator</h2><p>Model the purchase, deployment, service, battery and support assumptions behind a robot evaluation.</p></div></div>\n      <div class=\"fr-tool-panel\" data-fr-cost-widget>\n        <div class=\"fr-widget-form\">\n          <label>Robot preset<select data-fr-cost-preset>${toolRobotOptions(pricedRobots, \"\", \"Custom price\")}</select></label>\n          <label>Robot price (USD)<input type=\"number\" min=\"0\" step=\"100\" value=\"50000\" data-fr-cost-purchase></label>\n          <label>Years<input type=\"number\" min=\"1\" max=\"10\" step=\"1\" value=\"3\" data-fr-cost-years></label>\n          <label>Service / year (%)<input type=\"number\" min=\"0\" max=\"100\" step=\"1\" value=\"12\" data-fr-cost-service></label>\n          <label>Deployment setup<input type=\"number\" min=\"0\" step=\"100\" value=\"10000\" data-fr-cost-deploy></label>\n          <label>Accessories<input type=\"number\" min=\"0\" step=\"100\" value=\"5000\" data-fr-cost-accessories></label>\n          <label>Battery / consumables per year<input type=\"number\" min=\"0\" step=\"100\" value=\"1200\" data-fr-cost-battery></label>\n          <label>Support labor per year<input type=\"number\" min=\"0\" step=\"100\" value=\"8000\" data-fr-cost-labor></label>\n          <label>Training / integration<input type=\"number\" min=\"0\" step=\"100\" value=\"3000\" data-fr-cost-training></label>\n        </div>\n        <div class=\"fr-tool-results\" data-fr-cost-results></div>\n      </div>\n    </section>`;\n  };\n  const robotTimelineYear = (robot) => {\n    const raw = `${robot.releaseDate || \"\"} ${robot.status || \"\"} ${robot.summary || \"\"} ${robot.rawFields?.release_year || \"\"} ${robot.rawFields?.announced || \"\"} ${robot.rawFields?.launch_date || \"\"}`;\n    const match = raw.match(/\\b(19|20)\\d{2}\\b/);\n    return match ? Number(match[0]) : Number(String(robot.lastUpdated || \"\").slice(0, 4)) || 0;\n  };\n  const timelineWidget = (data) => `\n      <section class=\"fr-tool-widget\" id=\"robot-timeline\">\n        <div class=\"fr-tool-widget__header\"><div><p class=\"fr-eyebrow\">Live Timeline</p><h2>Robot timeline</h2><p>Browse launch/update year signals from the robot database. Open a profile to verify the underlying sources.</p></div></div>\n        <div class=\"fr-tool-panel\" data-fr-timeline-widget>\n          <div class=\"fr-widget-form fr-widget-form--compact\">\n            <label>Category<select data-fr-timeline-category><option value=\"\">All categories</option>${toolCategoryOptions(data)}</select></label>\n            <label>Status<select data-fr-timeline-status><option value=\"\">All status</option><option value=\"available\">Available / paid</option><option value=\"pilot\">Pilot / preorder</option><option value=\"prototype\">Prototype</option><option value=\"announced\">Announced</option><option value=\"research\">Research</option></select></label>\n            <label>Sort<select data-fr-timeline-sort><option value=\"newest\">Newest first</option><option value=\"oldest\">Oldest first</option><option value=\"name\">Robot name</option></select></label>\n          </div>\n          <div class=\"fr-tool-timeline\" data-fr-timeline-results></div>\n        </div>\n      </section>`;\n  const timelineRowMarkup = (rows) => rows.length ? rows.map(({ robot, year }) => `\n    <a class=\"fr-tool-timeline__row\" href=\"${robotUrl(robot)}\">\n      <time>${year}</time>\n      <span class=\"fr-tool-timeline__thumb\">${image(robot, `${robot.name} robot`)}</span>\n      <span><strong>${escapeHtml(robot.name)}</strong><span>${escapeHtml(publicMaker(robot))} / ${escapeHtml(compactStatus(robot.status))}</span></span>\n      <span class=\"fr-tool-chip\">${escapeHtml(publicCardValue(robot.height, \"Specs pending\"))}</span>\n    </a>`).join(\"\") : `<p class=\"fr-tool-note\">No timeline records match those filters yet.</p>`;\n  const sizeViewerWidget = (data) => {\n    const robots = toolRobots(data).filter((robot) => imageCandidates(robot).length).sort((a, b) => String(a.name).localeCompare(b.name));\n    const selectedA = (robots.find((robot) => robot.slug === \"tesla-optimus\") || robots[0] || {}).slug || \"\";\n    const selectedB = (robots.find((robot) => robot.slug === \"xiaomi-cyberone\") || robots[1] || robots[0] || {}).slug || \"\";\n    return `\n      <section class=\"fr-tool-widget\" id=\"robot-size-viewer\">\n        <div class=\"fr-tool-widget__header\"><div><p class=\"fr-eyebrow\">Live Viewer</p><h2>Robot size viewer</h2><p>Compare two robot silhouettes, images and headline dimensions from the database. This is a visual research tool, not a CAD model viewer.</p></div></div>\n        <div class=\"fr-tool-panel\" data-fr-size-widget>\n          <div class=\"fr-widget-form fr-widget-form--compact\">\n            <label>Robot A<select data-fr-size-a>${toolRobotOptions({ robots }, selectedA)}</select></label>\n            <label>Robot B<select data-fr-size-b>${toolRobotOptions({ robots }, selectedB)}</select></label>\n          </div>\n          <div class=\"fr-size-viewer\">\n            <div class=\"fr-size-viewer__stage\" data-fr-size-stage></div>\n            <div class=\"fr-size-viewer__details\" data-fr-size-details></div>\n          </div>\n        </div>\n      </section>`;\n  };\n  const renderToolWidgets = (data, focus = \"\") => {\n    const show = (name) => !focus || focus === name;\n    const widgets = [];\n    if (show(\"Robot Compare\")) widgets.push(compareWidget(data));\n    if (show(\"Robot Match\")) widgets.push(robotFinderWidget(data));\n    if (show(\"Payload Calculator\")) widgets.push(payloadWidget(data));\n    if (show(\"Cost of Ownership\")) widgets.push(costWidget(data));\n    if (show(\"Robot Timeline\")) widgets.push(timelineWidget(data));\n    if (show(\"Robot Size Viewer\")) widgets.push(sizeViewerWidget(data));\n    return `<div class=\"fr-tool-widget-stack\">${widgets.join(\"\")}</div>`;\n  };\n  function bindToolWidgets(data) {\n    document.querySelectorAll(\"[data-fr-compare-widget]\").forEach((root) => {\n      const results = root.querySelector(\"[data-fr-compare-results]\");\n      const rows = [[\"Price\", \"price\"], [\"Availability\", \"status\"], [\"Height\", \"height\"], [\"Weight\", \"weight\"], [\"Payload\", \"payload\"], [\"Runtime\", \"runtime\"], [\"DOF\", \"dof\"], [\"Movement\", \"movement\"], [\"Use case\", \"useCase\"]];\n      const update = () => {\n        const slugs = [...new Set(Array.from(root.querySelectorAll(\"[data-fr-compare-select]\")).map((select) => select.value).filter(Boolean))];\n        const robots = slugs.map((slug) => toolRobotBySlug(data, slug)).filter(Boolean).slice(0, 4);\n        if (!robots.length) {\n          results.innerHTML = `<p class=\"fr-tool-note\">Choose at least one robot to build a comparison.</p>`;\n          return;\n        }\n        results.innerHTML = `\n          <div class=\"fr-compare-widget__cards\">${robots.map((robot) => `\n            <article class=\"fr-compare-widget__card\">\n              <a href=\"${robotUrl(robot)}\">${image(robot, `${robot.name} robot`)}</a>\n              <strong>${escapeHtml(robot.name)}</strong>\n              <span>${escapeHtml(publicMaker(robot))}</span>\n              <small>${escapeHtml(compactStatus(robot.status))}</small>\n            </article>`).join(\"\")}</div>\n          <div class=\"fr-tool-table-wrap\"><table class=\"fr-tool-compare-table\">\n            <thead><tr><th>Spec</th>${robots.map((robot) => `<th><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></th>`).join(\"\")}</tr></thead>\n            <tbody>${rows.map(([label, key]) => `<tr><td>${escapeHtml(label)}</td>${robots.map((robot) => `<td>${escapeHtml(compactComparisonValue(robot, key))}</td>`).join(\"\")}</tr>`).join(\"\")}</tbody>\n          </table></div>`;\n      };\n      root.querySelectorAll(\"select\").forEach((control) => control.addEventListener(\"change\", update));\n      update();\n    });\n    document.querySelectorAll(\"[data-fr-finder-widget]\").forEach((root) => {\n      const results = root.querySelector(\"[data-fr-finder-results]\");\n      const update = () => {\n        const prefs = {\n          goal: root.querySelector(\"[data-fr-finder-goal]\")?.value || \"any\",\n          form: root.querySelector(\"[data-fr-finder-form]\")?.value || \"any\",\n          budget: root.querySelector(\"[data-fr-finder-budget]\")?.value || \"any\",\n          priority: root.querySelector(\"[data-fr-finder-priority]\")?.value || \"available\"\n        };\n        const matches = toolRobots(data).map((robot) => ({ robot, score: scoreRobotForFinder(robot, prefs) })).filter((row) => row.score > 20).sort((a, b) => b.score - a.score).slice(0, 6);\n        results.innerHTML = `<div class=\"fr-tool-summary\"><strong>${matches.length} ranked matches</strong><span>Scored from ${Number(data.stats?.robots || data.robots?.length || 0).toLocaleString()} robot records.</span></div>${finderResultCards(matches)}`;\n      };\n      root.querySelectorAll(\"select\").forEach((control) => control.addEventListener(\"change\", update));\n      update();\n    });\n    document.querySelectorAll(\"[data-fr-payload-widget]\").forEach((root) => {\n      const results = root.querySelector(\"[data-fr-payload-results]\");\n      const update = () => {\n        const load = numericValue(root.querySelector(\"[data-fr-payload-load]\")?.value);\n        const factor = numericValue(root.querySelector(\"[data-fr-payload-factor]\")?.value) || 1.5;\n        const cycles = numericValue(root.querySelector(\"[data-fr-payload-cycles]\")?.value);\n        const use = root.querySelector(\"[data-fr-payload-use]\")?.value || \"any\";\n        const required = load * factor;\n        const cycleMargin = cycles >= 100 ? 1.15 : 1;\n        const recommended = required * cycleMargin;\n        const robots = toolRobots(data).filter((robot) => numericValue(robot.payloadRaw) >= required && (use === \"any\" || robotText(robot).includes(use))).sort((a, b) => numericValue(a.payloadRaw) - numericValue(b.payloadRaw)).slice(0, 6);\n        const maxPayload = Math.max(required, recommended, ...robots.map((robot) => numericValue(robot.payloadRaw)), 1);\n        results.innerHTML = `<div class=\"fr-tool-stat-grid\"><div class=\"fr-tool-stat\"><span>Minimum rated payload</span><strong>${required.toFixed(1)} kg</strong></div><div class=\"fr-tool-stat\"><span>Recommended target</span><strong>${recommended.toFixed(1)} kg</strong></div><div class=\"fr-tool-stat\"><span>Safety factor</span><strong>${factor.toFixed(2)}x</strong></div><div class=\"fr-tool-stat\"><span>Cycles/hour</span><strong>${cycles.toLocaleString()}</strong></div></div><div class=\"fr-tool-meter\"><span style=\"width:${boundedPercent((recommended / maxPayload) * 100)}%\"></span><strong>${recommended.toFixed(1)} kg target</strong></div>${toolResultCards(robots, (robot) => `Payload: ${publicCardValue(robot.payload, \"not published\")}`)}`;\n      };\n      root.querySelectorAll(\"input, select\").forEach((control) => control.addEventListener(\"input\", update));\n      root.querySelectorAll(\"select\").forEach((control) => control.addEventListener(\"change\", update));\n      update();\n    });\n    document.querySelectorAll(\"[data-fr-cost-widget]\").forEach((root) => {\n      const results = root.querySelector(\"[data-fr-cost-results]\");\n      const purchaseInput = root.querySelector(\"[data-fr-cost-purchase]\");\n      const update = () => {\n        const purchase = numericValue(purchaseInput?.value);\n        const years = Math.max(1, numericValue(root.querySelector(\"[data-fr-cost-years]\")?.value) || 1);\n        const service = numericValue(root.querySelector(\"[data-fr-cost-service]\")?.value) / 100;\n        const deploy = numericValue(root.querySelector(\"[data-fr-cost-deploy]\")?.value);\n        const accessories = numericValue(root.querySelector(\"[data-fr-cost-accessories]\")?.value);\n        const battery = numericValue(root.querySelector(\"[data-fr-cost-battery]\")?.value);\n        const labor = numericValue(root.querySelector(\"[data-fr-cost-labor]\")?.value);\n        const training = numericValue(root.querySelector(\"[data-fr-cost-training]\")?.value);\n        const annual = purchase * service + battery + labor;\n        const firstYear = purchase + deploy + accessories + training + annual;\n        const total = purchase + deploy + accessories + training + annual * years;\n        const monthly = total / Math.max(1, years * 12);\n        const oneTime = purchase + deploy + accessories + training;\n        const parts = [[\"Purchase\", purchase], [\"Deployment\", deploy + training], [\"Accessories\", accessories], [\"Service\", purchase * service * years], [\"Consumables\", battery * years], [\"Labor\", labor * years]];\n        results.innerHTML = `<div class=\"fr-tool-stat-grid\"><div class=\"fr-tool-stat\"><span>First year</span><strong>${formatUsd(firstYear)}</strong></div><div class=\"fr-tool-stat\"><span>${years}-year total</span><strong>${formatUsd(total)}</strong></div><div class=\"fr-tool-stat\"><span>Annual support</span><strong>${formatUsd(annual)}</strong></div><div class=\"fr-tool-stat\"><span>Monthly average</span><strong>${formatUsd(monthly)}</strong></div></div><div class=\"fr-cost-breakdown\">${parts.map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${formatUsd(value)}</strong><i><b style=\"width:${boundedPercent((value / Math.max(total, 1)) * 100)}%\"></b></i></div>`).join(\"\")}</div><p class=\"fr-tool-note\">One-time setup is ${formatUsd(oneTime)} before recurring annual support. Confirm price, warranty, service, battery, software, integration, tax, freight and downtime directly with the manufacturer or integrator.</p>`;\n      };\n      const preset = root.querySelector(\"[data-fr-cost-preset]\");\n      preset?.addEventListener(\"change\", () => {\n        const robot = toolRobotBySlug(data, preset.value);\n        if (robot && purchaseInput) purchaseInput.value = String(Math.round(numericValue(robot.priceRaw)));\n        update();\n      });\n      root.querySelectorAll(\"input\").forEach((control) => control.addEventListener(\"input\", update));\n      update();\n    });\n    document.querySelectorAll(\"[data-fr-timeline-widget]\").forEach((root) => {\n      const results = root.querySelector(\"[data-fr-timeline-results]\");\n      const update = () => {\n        const category = root.querySelector(\"[data-fr-timeline-category]\")?.value || \"\";\n        const status = root.querySelector(\"[data-fr-timeline-status]\")?.value || \"\";\n        const sort = root.querySelector(\"[data-fr-timeline-sort]\")?.value || \"newest\";\n        const statusTerms = {\n          available: [\"available\", \"commercial\", \"paid\"],\n          pilot: [\"pilot\", \"preorder\", \"early access\"],\n          prototype: [\"prototype\"],\n          announced: [\"announced\", \"coming\"],\n          research: [\"research\", \"university\", \"open source\"]\n        };\n        let rows = toolRobots(data)\n          .map((robot) => ({ robot, year: robotTimelineYear(robot) }))\n          .filter((row) => row.year)\n          .filter(({ robot }) => !category || robot.category === category)\n          .filter(({ robot }) => !status || (statusTerms[status] || [status]).some((term) => robotText(robot).includes(term)));\n        rows = rows.sort((a, b) => {\n          if (sort === \"oldest\") return a.year - b.year || String(a.robot.name).localeCompare(b.robot.name);\n          if (sort === \"name\") return String(a.robot.name).localeCompare(b.robot.name);\n          return b.year - a.year || String(a.robot.name).localeCompare(b.robot.name);\n        }).slice(0, 24);\n        results.innerHTML = timelineRowMarkup(rows);\n      };\n      root.querySelectorAll(\"select\").forEach((control) => control.addEventListener(\"change\", update));\n      update();\n    });\n    document.querySelectorAll(\"[data-fr-size-widget]\").forEach((root) => {\n      const selectA = root.querySelector(\"[data-fr-size-a]\");\n      const selectB = root.querySelector(\"[data-fr-size-b]\");\n      const stage = root.querySelector(\"[data-fr-size-stage]\");\n      const details = root.querySelector(\"[data-fr-size-details]\");\n      const update = () => {\n        const robots = [toolRobotBySlug(data, selectA?.value), toolRobotBySlug(data, selectB?.value)].filter(Boolean);\n        if (!robots.length) return;\n        const maxHeight = Math.max(...robots.map(robotHeightCm), 1);\n        stage.innerHTML = robots.map((robot) => {\n          const height = robotHeightCm(robot);\n          const scale = Math.max(.42, Math.min(1, height ? height / maxHeight : .7));\n          return `<article class=\"fr-size-viewer__robot\" style=\"--fr-scale:${scale.toFixed(2)}\"><a href=\"${robotUrl(robot)}\">${image(robot, `${robot.name} robot`)}</a><strong>${escapeHtml(robot.name)}</strong><span>${escapeHtml(compactToolMeasure(robot.height, \"mm\", \"Height unknown\"))}</span></article>`;\n        }).join(\"\");\n        details.innerHTML = `<div class=\"fr-size-viewer__compare\">${robots.map((robot) => `<article><h3>${escapeHtml(robot.name)}</h3><p>${escapeHtml(robot.summary || `${robot.name} robot record`)}</p><dl class=\"fr-tool-mini-specs\"><div><dt>Height</dt><dd>${escapeHtml(compactToolMeasure(robot.height, \"mm\"))}</dd></div><div><dt>Weight</dt><dd>${escapeHtml(compactToolMeasure(robot.weight, \"kg\"))}</dd></div><div><dt>Payload</dt><dd>${escapeHtml(compactToolMeasure(robot.payload, \"kg\"))}</dd></div><div><dt>Status</dt><dd>${escapeHtml(compactStatus(robot.status))}</dd></div></dl><a class=\"fr-button fr-button--secondary\" href=\"${robotUrl(robot)}\">Open Profile</a></article>`).join(\"\")}</div>`;\n      };\n      [selectA, selectB].filter(Boolean).forEach((select) => select.addEventListener(\"change\", update));\n      update();\n    });\n  }\n  const researchSeoContent = (data) => `\n    <section class=\"fr-seo-article fr-card fr-section\">\n      <p class=\"fr-eyebrow\">Research Hub</p>\n      <h2>Humanoid robot research, patents, manuals and source references</h2>\n      <p>The research hub organizes source material behind robot profiles: official product pages, manuals, papers, patents, videos, and supporting references. The goal is to separate manufacturer claims, third-party coverage, and technical documentation so users can verify what is known.</p>\n      <div class=\"fr-seo-grid\">\n        <article><h3>Plain-English summary</h3><p>Use this page to move from a robot card to the evidence behind it. Source records help explain where specifications, images, availability notes, and technical claims came from.</p></article>\n        <article><h3>Technical summary</h3><p>The database currently tracks ${Number(data.stats.sources || 0).toLocaleString()} source records, ${Number(data.stats.papersPatents || 0).toLocaleString()} papers/patents, and ${Number(data.stats.manualsDocs || 0).toLocaleString()} manuals/docs.</p></article>\n        <article><h3>Why it matters</h3><p>Humanoid robotics changes quickly. Source-backed pages are more trustworthy than static lists because they show which details are verified and which still need research.</p></article>\n        <article><h3>How to use sources</h3><p>Prioritize official product pages and technical documents for specifications, then use papers, patents, and reputable coverage for context.</p></article>\n      </div>\n    </section>`;\n\n  async function loadData(root) {\n    if (state.data) return state.data;\n    const rawUrl = root?.dataset?.dataUrl || document.querySelector(\"[data-data-url]\")?.dataset?.dataUrl;\n    const url = new URL(rawUrl, window.location.href);\n    if (url.pathname.endsWith(\"/fr-robot-data-current.json\")) {\n      url.searchParams.set(\"fr_cache\", Date.now());\n    }\n    const response = await fetch(url.toString(), { cache: \"no-store\" });\n    state.data = await response.json();\n    return state.data;\n  }\n\n  function renderHero(data) {\n    const target = document.querySelector(\"[data-fr-hero-robots]\");\n    if (!target) return;\n    target.innerHTML = data.featuredRobots.slice(0, 4).map((robot) => `\n      <a class=\"fr-hero-robot\" href=\"${robotUrl(robot)}\">\n        <span class=\"fr-hero-robot__image\">${image(robot)}</span>\n        <strong>${escapeHtml(robot.name.replace(\"Tesla \", \"\"))}</strong>\n      </a>\n    `).join(\"\");\n  }\n\n  function renderFeaturedTable(data) {\n    const table = document.querySelector(\"[data-fr-featured-table]\");\n    if (!table) return;\n    const robots = data.featuredRobots.slice(0, 10);\n    const rows = [\n      [\"Price (USD)\", \"price\"],\n      [\"Height\", \"height\"],\n      [\"Weight\", \"weight\"],\n      [\"DOF\", \"dof\"],\n      [\"Payload\", \"payload\"],\n      [\"Runtime\", \"runtime\"],\n      [\"Walking Speed\", \"speed\"],\n      [\"Release Status\", \"status\"]\n    ];\n    table.innerHTML = `\n      <colgroup><col class=\"fr-compare-label-col\">${robots.map(() => `<col class=\"fr-compare-robot-col\">`).join(\"\")}</colgroup>\n      <thead><tr><th scope=\"col\"></th>${robots.map((robot) => `<th scope=\"col\"><a class=\"fr-table-robot\" href=\"${robotUrl(robot)}\">${image(robot)}<span>${escapeHtml(robot.name)}</span></a></th>`).join(\"\")}</tr></thead>\n      <tbody>${rows.map(([label, key]) => `<tr><td><a href=\"${knowledgeUrl(label)}\">${label}</a></td>${robots.map((robot) => `<td>${escapeHtml(compactComparisonValue(robot, key))}</td>`).join(\"\")}</tr>`).join(\"\")}</tbody>`;\n  }\n\n  function bindFeaturedTableScroll() {\n    document.querySelectorAll(\"[data-fr-scroll-table]\").forEach((button) => {\n      button.addEventListener(\"click\", () => {\n        const section = button.closest(\".fr-section\");\n        const wrap = section ? section.querySelector(\".fr-table-wrap\") : document.querySelector(\".fr-table-wrap\");\n        if (!wrap) return;\n        const direction = Number(button.dataset.frScrollTable || 1);\n        wrap.scrollBy({ left: direction * Math.round(wrap.clientWidth * 0.82), behavior: \"smooth\" });\n      });\n    });\n  }\n\n  function renderCategories(data) {\n    const target = document.querySelector(\"[data-fr-categories]\");\n    if (!target) return;\n    target.innerHTML = data.categories.map((category) => `\n        <a class=\"fr-category-card\" href=\"${categoryUrl(category.slug)}\">\n        <span class=\"fr-category-card__icon\">${categoryIcon(category.slug)}</span>\n        <strong>${escapeHtml(category.label)}</strong>\n        <span>${category.count}+ Robots</span>\n      </a>\n    `).join(\"\");\n  }\n\n  function renderStats(data) {\n    const target = document.querySelector(\"[data-fr-stats]\");\n    if (!target) return;\n    const stats = [\n      [\"Humanoid Robots\", data.stats.humanoidRobots],\n      [\"Manufacturers\", data.stats.manufacturers],\n      [\"Specifications\", data.stats.specifications],\n      [\"Images\", data.stats.images],\n      [\"Videos\", data.stats.videos],\n      [\"Patents & Papers\", data.stats.papersPatents]\n    ];\n    target.innerHTML = stats.map(([label, value]) => `<div class=\"fr-stat\"><span class=\"fr-stat__icon\">${icon()}</span><div><strong>${Number(value || 0).toLocaleString()}+</strong><span>${escapeHtml(label)}</span></div></div>`).join(\"\");\n  }\n\n  function renderLatest(data) {\n    const target = document.querySelector(\"[data-fr-latest]\");\n    if (!target) return;\n    target.innerHTML = data.latestRobots.slice(0, 5).map((robot) => `\n      <article class=\"fr-robot-card\">\n        <a href=\"${robotUrl(robot)}\">${imageTag(robot, latestImageCandidates(robot), `${robot.name} robot`, \"\", \"eager\")}</a>\n        <div>\n          <h3><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></h3>\n          <dl>\n            <div><dt>Manufacturer</dt><dd>${escapeHtml(publicMaker(robot))}</dd></div>\n            <div><dt>Price Est.</dt><dd>${escapeHtml(compactPrice(robot.price))}</dd></div>\n            <div><dt>Height</dt><dd>${escapeHtml(publicCardValue(robot.height))}</dd></div>\n          </dl>\n          <span class=\"${badgeClass(robot.status)}\">${escapeHtml(compactStatus(robot.status))}</span>\n        </div>\n      </article>\n    `).join(\"\");\n  }\n\n  function homeManufacturerList(data) {\n    return [...(data.manufacturers || [])]\n      .filter((manufacturer) => manufacturer && manufacturer.name)\n      .sort((a, b) => String(a.name).localeCompare(String(b.name), undefined, { sensitivity: \"base\" }));\n  }\n\n  function populateHomeManufacturerSelect(select, data) {\n    if (!select) return;\n    const current = select.value;\n    const options = homeManufacturerList(data);\n    select.innerHTML = ['<option value=\"\">All manufacturers</option>'].concat(options.map((manufacturer) => {\n      const slug = manufacturer.slug || slugifyLocal(manufacturer.name);\n      return `<option value=\"${escapeHtml(slug)}\" data-name=\"${escapeHtml(manufacturer.name)}\" data-url=\"${escapeHtml(manufacturerUrl(manufacturer))}\">${escapeHtml(manufacturer.name)}</option>`;\n    })).join(\"\");\n    if (current && [...select.options].some((option) => option.value === current)) select.value = current;\n  }\n\n  function selectedHomeManufacturer(select) {\n    const option = select && select.selectedOptions && select.selectedOptions[0];\n    if (!option || !option.value) return null;\n    return {\n      slug: option.value,\n      name: option.getAttribute(\"data-name\") || option.textContent.trim(),\n      url: option.getAttribute(\"data-url\") || manufacturerUrl(option.value)\n    };\n  }\n\n  function homeSearchMatches(data, query, manufacturerName) {\n    const q = normalizeSearch(query);\n    const maker = String(manufacturerName || \"\").trim();\n    if (!q && !maker) return [];\n    const tokens = q.split(\" \").filter(Boolean);\n    return (data.robots || []).filter((robot) => {\n      if (maker && String(robot.manufacturer || \"\") !== maker) return false;\n      if (!tokens.length) return true;\n      const rawFieldHay = Object.values(robot.rawFields || {}).join(\" \");\n      const specHay = (robot.specSections || []).flatMap((section) => (section.rows || []).map((row) => `${row.label} ${row.value}`)).join(\" \");\n      const hay = normalizeSearch(`${robot.id} ${robot.slug} ${robot.name} ${robot.manufacturer} ${robot.summary} ${robot.category} ${robot.useCase} ${robot.targetMarket} ${robot.price} ${robot.status} ${robot.height} ${robot.weight} ${rawFieldHay} ${specHay}`);\n      return tokens.every((token) => hay.includes(token));\n    }).slice(0, 8);\n  }\n\n  function homeSearchUrl(query) {\n    const params = new URLSearchParams();\n    params.set(\"q\", String(query || \"\").trim());\n    return `/pages/robots?${params.toString()}`;\n  }\n\n  function homeSearchCard(robot) {\n    return `\n      <article class=\"fr-robot-card\">\n        <a href=\"${robotUrl(robot)}\">${image(robot)}</a>\n        <div>\n          <h3><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></h3>\n          <dl>\n            <div><dt>Maker</dt><dd>${escapeHtml(publicMaker(robot))}</dd></div>\n            <div><dt>Status</dt><dd>${escapeHtml(compactStatus(robot.status))}</dd></div>\n            <div><dt>Height</dt><dd>${escapeHtml(publicCardValue(robot.height))}</dd></div>\n          </dl>\n          <span class=\"${badgeClass(robot.status)}\">${escapeHtml(robot.category || \"Robot\")}</span>\n        </div>\n      </article>`;\n  }\n\n  function renderHomeSearchResults(root, data, query, manufacturerName) {\n    const target = root.querySelector(\"[data-fr-home-search-results]\");\n    if (!target) return;\n    const q = String(query || \"\").trim();\n    const maker = String(manufacturerName || \"\").trim();\n    if (!q && !maker) {\n      target.hidden = true;\n      target.innerHTML = \"\";\n      return;\n    }\n    const robots = homeSearchMatches(data, q, maker);\n    const label = [q, maker].filter(Boolean).join(\" / \");\n    const fullResultsUrl = maker && !q ? manufacturerUrl(maker) : homeSearchUrl(q);\n    target.hidden = false;\n    if (!robots.length) {\n      target.innerHTML = `\n        <div class=\"fr-home-search-empty\">\n          <strong>No robots found for \"${escapeHtml(label)}\"</strong>\n          <span>Try a manufacturer, model name, robot category, status, height, price, or capability.</span>\n        </div>\n        <div class=\"fr-home-search-results__header\"><span></span><a href=\"${fullResultsUrl}\">Search full database</a></div>`;\n      return;\n    }\n    target.innerHTML = `\n      <div class=\"fr-home-search-results__header\">\n        <strong>${robots.length} result${robots.length === 1 ? \"\" : \"s\"} for \"${escapeHtml(label)}\"</strong>\n        <a href=\"${fullResultsUrl}\">Open full results</a>\n      </div>\n      <div class=\"fr-home-search-results__grid\">${robots.map(homeSearchCard).join(\"\")}</div>`;\n  }\n\n  function bindHomeSearch(root, data) {\n    const form = root.querySelector(\"[data-fr-search-form]\");\n    const input = root.querySelector(\"[data-fr-search-input]\");\n    const select = root.querySelector(\"[data-fr-search-manufacturer]\");\n    const results = root.querySelector(\"[data-fr-home-search-results]\");\n    if (!form || !input || !results) return;\n    populateHomeManufacturerSelect(select, data);\n    const currentMaker = () => selectedHomeManufacturer(select);\n    const render = () => renderHomeSearchResults(root, data, input.value, currentMaker()?.name || \"\");\n    input.addEventListener(\"input\", render);\n    if (select) {\n      select.addEventListener(\"change\", () => {\n        const maker = currentMaker();\n        const q = String(input.value || \"\").trim();\n        if (maker && !q) {\n          window.location.assign(maker.url);\n          return;\n        }\n        render();\n      });\n    }\n    form.addEventListener(\"submit\", (event) => {\n      event.preventDefault();\n      const maker = currentMaker();\n      const q = String(input.value || \"\").trim();\n      if (maker && !q) {\n        window.location.assign(maker.url);\n        return;\n      }\n      render();\n      if (q) {\n        const url = new URL(window.location.href);\n        url.searchParams.set(\"q\", q);\n        if (maker) url.searchParams.set(\"manufacturer\", maker.slug);\n        else url.searchParams.delete(\"manufacturer\");\n        history.replaceState(null, \"\", url.toString());\n        results.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" });\n      }\n    });\n    const params = new URLSearchParams(location.search);\n    const q = params.get(\"q\") || \"\";\n    const makerSlug = params.get(\"manufacturer\") || \"\";\n    if (q) input.value = q;\n    if (makerSlug && select) select.value = makerSlug;\n    if (q || makerSlug) render();\n  }\n\n  function renderViewShowcase(data) {\n    const target = document.querySelector(\"[data-fr-view-showcase]\");\n    if (!target) return;\n    const robot = data.robots.find((item) => item.slug === \"tesla-optimus\" || item.id === \"robot_optimus_f2db54a655\");\n    if (!robot || !Array.isArray(robot.imageViews) || !robot.imageViews.length) {\n      target.remove();\n      return;\n    }\n    target.innerHTML = `\n      <div class=\"fr-section__header\">\n        <div>\n          <h2>${escapeHtml(robot.manufacturer)} ${escapeHtml(robot.name)}</h2>\n        </div>\n        <a href=\"${robotUrl(robot)}\">Open Robot Profile -></a>\n      </div>\n      ${viewGallery(robot)}\n    `;\n  }\n\n  function renderTools(data) {\n    const target = document.querySelector(\"[data-fr-tools]\");\n    if (!target) return;\n    target.innerHTML = normalizedTools(data).map((tool) => `\n      <article class=\"fr-tool-card\">\n        <span class=\"fr-tool-card__icon\">${icon()}</span>\n        <strong>${escapeHtml(tool.title)}</strong>\n        <p>${escapeHtml(tool.description)}</p>\n        <a href=\"${escapeHtml(tool.url)}\">${escapeHtml(tool.cta)} -></a>\n      </article>\n    `).join(\"\");\n  }\n\n  function renderManufacturerMarquee(data) {\n    const target = document.querySelector(\"[data-fr-manufacturer-marquee]\");\n    if (!target) return;\n    const manufacturers = [...(data.manufacturers || [])]\n      .filter((manufacturer) => manufacturer && manufacturer.name)\n      .sort((a, b) => String(a.name).localeCompare(String(b.name)));\n    if (!manufacturers.length) {\n      target.closest(\".fr-manufacturer-marquee\")?.remove();\n      return;\n    }\n    const row = [...manufacturers, ...manufacturers];\n    target.innerHTML = row.map((manufacturer) => {\n      const logo = manufacturer.logo || manufacturer.logoFallback || \"\";\n      return `\n        <a class=\"fr-manufacturer-logo\" href=\"${manufacturerUrl(manufacturer)}\" aria-label=\"${escapeHtml(`Open ${manufacturer.name} manufacturer profile`)}\">\n          <strong>${escapeHtml(manufacturer.name)}</strong>\n          ${logo ? `<img loading=\"lazy\" src=\"${escapeHtml(logo)}\" alt=\"${escapeHtml(`${manufacturer.name} logo`)}\">` : \"\"}\n        </a>`;\n    }).join(\"\");\n    target.querySelectorAll(\"img\").forEach((img) => {\n      img.addEventListener(\"error\", () => {\n        img.hidden = true;\n      }, { once: true });\n    });\n  }\n\n  function manufacturerSelectHtml(selectId) {\n    return `<label class=\"visually-hidden\" for=\"${selectId}\">Filter by manufacturer</label>\n        <select id=\"${selectId}\" class=\"fr-hub-manufacturer\" aria-label=\"Filter by manufacturer\" data-fr-hub-manufacturer>\n          <option value=\"\">All manufacturers</option>\n        </select>`;\n  }\n\n  function bindHubManufacturerSelect(select) {\n    if (!select || select.dataset.frHubBound === \"1\") return;\n    select.dataset.frHubBound = \"1\";\n    select.addEventListener(\"change\", () => {\n      const maker = selectedHomeManufacturer(select);\n      if (maker && maker.url) window.location.assign(maker.url);\n    });\n  }\n\n  function hideGiantListingDumps() {\n    document.querySelectorAll(\".fr-related-links\").forEach((list) => {\n      const count = list.querySelectorAll(\"a\").length;\n      const prev = list.previousElementSibling;\n      const maybeIntro = prev && prev.tagName === \"P\" ? prev : null;\n      const maybeHeading = maybeIntro ? maybeIntro.previousElementSibling : prev;\n      const headingText = `${maybeHeading && maybeHeading.textContent || \"\"} ${maybeIntro && maybeIntro.textContent || \"\"}`;\n      if (/related database/i.test(headingText) && count <= 8) return;\n      if (count < 8) return;\n      list.classList.add(\"fr-related-links--hidden-dump\");\n      if (maybeIntro && /index links to|published robot profile|this index links/i.test(maybeIntro.textContent || \"\")) {\n        maybeIntro.classList.add(\"fr-related-links--hidden-dump\");\n      }\n      if (maybeHeading && /all robot profiles|all manufacturers|related links/i.test(maybeHeading.textContent || \"\")) {\n        maybeHeading.classList.add(\"fr-related-links--hidden-dump\");\n      }\n    });\n  }\n\n  async function initHubManufacturerSelects() {\n    const selects = [...document.querySelectorAll(\"[data-fr-hub-manufacturer]\")];\n    if (!selects.length) return;\n    const needsData = selects.some((select) => select.options.length < 2);\n    let data = state.data;\n    if (needsData && !data) {\n      data = await loadData(document.querySelector(\"[data-data-url]\") || selects[0]);\n    }\n    selects.forEach((select, index) => {\n      if (!select.id) select.id = index ? `fr-hub-manufacturer-${index}` : \"fr-hub-manufacturer\";\n      if (data) populateHomeManufacturerSelect(select, data);\n      bindHubManufacturerSelect(select);\n    });\n  }\n\n  function renderControls(kind, data) {\n    const controls = document.querySelector(\"[data-fr-page-controls]\");\n    if (!controls) return;\n    if (kind === \"tools\") {\n      controls.innerHTML = \"\";\n      controls.hidden = true;\n      return;\n    }\n    controls.hidden = false;\n    const listingKinds = [\"robots\", \"compare\", \"category\", \"knowledge\", \"news\", \"developers\", \"marketplace\", \"community\", \"manufacturers\"];\n    if (!listingKinds.includes(kind)) return;\n    const parts = [];\n    if ([\"robots\", \"compare\", \"category\", \"knowledge\", \"news\", \"developers\", \"marketplace\", \"community\"].includes(kind)) {\n      parts.push(`<input type=\"search\" placeholder=\"Search robots, manufacturers, specs...\" data-fr-filter-search>`);\n      parts.push(`<select data-fr-filter-category><option value=\"\">All categories</option>${data.categories.map(c => `<option value=\"${escapeHtml(c.slug)}\">${escapeHtml(c.label)}</option>`).join(\"\")}</select>`);\n      parts.push(`<select data-fr-filter-status><option value=\"\">All availability</option>${[...new Set(data.robots.map(r => r.status).filter(Boolean))].sort().map(s => `<option value=\"${escapeHtml(s)}\">${escapeHtml(s)}</option>`).join(\"\")}</select>`);\n    }\n    parts.push(manufacturerSelectHtml(\"fr-hub-manufacturer\"));\n    controls.innerHTML = parts.join(\"\\n        \");\n    populateHomeManufacturerSelect(controls.querySelector(\"[data-fr-hub-manufacturer]\"), data);\n    bindHubManufacturerSelect(controls.querySelector(\"[data-fr-hub-manufacturer]\"));\n    const category = new URLSearchParams(location.search).get(\"filter\") || categorySlugFromRoute();\n    const query = new URLSearchParams(location.search).get(\"q\") || \"\";\n    const searchInput = controls.querySelector(\"[data-fr-filter-search]\");\n    const categorySelect = controls.querySelector(\"[data-fr-filter-category]\");\n    if (query && searchInput) searchInput.value = query;\n    if (category && categorySelect) categorySelect.value = category;\n  }\n\n  const normalizeSearch = (value = \"\") => String(value || \"\").toLowerCase().replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \").trim();\n  const hiddenRobotSlugs = new Set([\"ff-aegis-basic-quadruped\"]);\n\n  function filteredRobots(data) {\n    const q = normalizeSearch(document.querySelector(\"[data-fr-filter-search]\")?.value || new URLSearchParams(location.search).get(\"q\") || \"\");\n    const category = document.querySelector(\"[data-fr-filter-category]\")?.value || new URLSearchParams(location.search).get(\"filter\") || categorySlugFromRoute() || \"\";\n    const status = document.querySelector(\"[data-fr-filter-status]\")?.value || \"\";\n    const seenRobotSlugs = new Set();\n    return data.robots.filter((robot) => {\n      if (hiddenRobotSlugs.has(robot.slug)) return false;\n      const uniqueRobotKey = robot.slug || robot.id || robot.name;\n      if (seenRobotSlugs.has(uniqueRobotKey)) return false;\n      seenRobotSlugs.add(uniqueRobotKey);\n      const rawFieldHay = Object.values(robot.rawFields || {}).join(\" \");\n      const specHay = (robot.specSections || []).flatMap((section) => (section.rows || []).map((row) => `${row.label} ${row.value}`)).join(\" \");\n      const hay = normalizeSearch(`${robot.id} ${robot.slug} ${robot.name} ${robot.manufacturer} ${robot.summary} ${robot.category} ${robot.useCase} ${rawFieldHay} ${specHay}`);\n      if (q && !q.split(\" \").every((token) => hay.includes(token))) return false;\n      if (status && robot.status !== status) return false;\n      if (category && !robot.flags[category] && robot.category !== category) return false;\n      return true;\n    });\n  }\n\n  function renderPageResults(kind, data) {\n    const target = document.querySelector(\"[data-fr-page-results]\");\n    if (!target) return;\n    if (kind === \"robot-profile\") {\n      const routeHandle = currentPageHandle();\n      const slug = new URLSearchParams(location.search).get(\"robot\") || (routeHandle !== \"robot-profile\" ? routeHandle : \"\");\n      const robot = data.robots.find(r => robotMatchesSlug(r, slug)) || data.robots[0];\n      const specSummary = robot.specSummary || {};\n      target.closest(\".fr-page-shell\")?.classList.add(\"fr-page-shell--robot-profile\");\n      const pageEyebrow = document.querySelector(\".fr-page-hero .fr-eyebrow\");\n      const pageHeading = document.querySelector(\".fr-page-hero h1\");\n      const pageCopy = document.querySelector(\".fr-page-hero p:not(.fr-eyebrow)\");\n      const maker = publicMaker(robot);\n      const publicSummary = robot.summary || `${robot.name} is a ${robot.category || \"robot\"} from ${maker}. This page brings together specifications, availability, images, videos, and source links in one public robot profile.`;\n      setRobotSeo(robot);\n      if (pageEyebrow) pageEyebrow.textContent = `${maker} robot profile`;\n      if (pageHeading) pageHeading.textContent = robot.name;\n      if (pageCopy) pageCopy.textContent = publicSummary;\n      const standardViews = pickMediaSet(robot, [\n        [\"Front view\", [\"front_view\", \"front\", \"portrait\"]],\n        [\"Side view\", [\"side_view\", \"side\"]],\n        [\"Rear view\", [\"rear_view\", \"rear\", \"back\"]],\n        [\"Head and torso\", [\"head_torso_view\", \"head_torso\", \"head torso\", \"head\", \"torso\"]],\n        [\"Arm detail\", [\"arm_view\", \"arm\"]],\n        [\"Leg detail\", [\"leg_view\", \"leg\", \"feet\", \"foot\"]],\n        [\"Arm and leg detail\", [\"arm_leg_view\", \"arm_leg\", \"arm leg\"]]\n      ], 7).filter((item) => String(item.image || \"\") !== String(robot.image || \"\"));\n      const mediaItems = uniqueMedia(approvedMedia(robot), 18);\n      const standardImageKeys = new Set(standardViews.map((item) => String(item.image || \"\")));\n      if (robot.image) standardImageKeys.add(String(robot.image));\n      const supplementalMediaItems = mediaItems.filter((item) => !standardImageKeys.has(String(item.image || \"\")));\n      const quickSpecs = [\n        [\"Price\", robot.price],\n        [\"Availability\", robot.status],\n        [\"Height\", robot.height],\n        [\"Weight\", robot.weight],\n        [\"Payload\", robot.payload],\n        [\"Runtime\", robot.runtime],\n        [\"DOF\", robot.dof],\n        [\"Speed\", robot.speed],\n        [\"Battery\", specLookup(robot, [\"Battery Capacity\"])],\n        [\"Actuators\", specLookup(robot, [\"Actuator Count\"])],\n      ];\n      const videoRecords = usableVideoRecords(robot);\n      const videoCount = videoRecords.length;\n      const documentedSpecs = Number(specSummary.Known || 0) + Number(specSummary.Calculated || 0) + Number(specSummary.Estimated || 0);\n      const sourceTotal = Number((robot.sources || []).length + (robot.manuals || []).length + (robot.papers || []).length + (robot.communityMentions || []).length);\n      const bestFor = listFromText(rawField(robot, \"best_for\") || robot.useCase || robot.targetMarket).join(\", \") || `${robot.category || \"robotics\"} research, comparison, and buyer evaluation`;\n      const caveats = listFromText(rawField(robot, \"known_limitations\") || rawField(robot, \"known_issues\") || rawField(robot, \"not_best_for\")).join(\", \") || \"Public specifications can change as the manufacturer releases new details.\";\n      const competitors = listFromText(rawField(robot, \"competitors\") || rawField(robot, \"similar_robots\")).join(\", \") || data.featuredRobots.filter((item) => item.slug !== robot.slug).slice(0, 4).map((item) => item.name).join(\", \");\n      const productUrl = robot.productPage || robot.source || rawField(robot, \"product_page_url\") || rawField(robot, \"robot_url\");\n      const metrics = [\n        [\"Documented specs\", `${documentedSpecs.toLocaleString()} fields`],\n        [\"Reference links\", `${sourceTotal.toLocaleString()} sources`],\n        [\"Images\", `${mediaItems.length.toLocaleString()} views`],\n        [\"Videos\", `${videoCount.toLocaleString()} clips`],\n        [\"Data confidence\", `${Number(robot.confidence || 0).toLocaleString()}%`]\n      ];\n      const hasDisplayValue = (value) => {\n        const text = String(value ?? \"\").replace(/\\s+/g, \" \").trim();\n        return text && !/^(unknown|n\\/a|na|none|null|not available|not publicly listed)$/i.test(text);\n      };\n      const cleanSentence = (value) => String(value || \"\").replace(/\\s+/g, \" \").trim().replace(/[.;,\\s]+$/, \"\");\n      const sentence = (value, fallback = \"\") => cleanSentence(value) || fallback;\n      const compactList = (items, fallback = \"\") => {\n        const values = Array.isArray(items) ? items : listFromText(items);\n        return values.map(cleanSentence).filter(Boolean).slice(0, 6).join(\", \") || fallback;\n      };\n      const plural = (count, singular, pluralWord) => `${Number(count || 0).toLocaleString()} ${Number(count || 0) === 1 ? singular : pluralWord || `${singular}s`}`;\n      const sourcePhrase = sourceTotal ? plural(sourceTotal, \"reference record\") : \"public source records still being expanded\";\n      const specPhrase = documentedSpecs ? plural(documentedSpecs, \"documented specification field\") : \"the currently available public specification fields\";\n      const imagePhrase = mediaItems.length ? plural(mediaItems.length, \"approved image/media view\") : \"image coverage that is still being expanded\";\n      const videoPhrase = videoCount ? plural(videoCount, \"video reference\") : \"video coverage that is still being expanded\";\n      const makerPhrase = maker && maker !== \"Unknown\" ? maker : \"its listed manufacturer\";\n      const categoryPhrase = robot.category ? `${robot.category} robot` : \"robotics platform\";\n      const targetMarkets = compactList(robot.targetMarket || robot.useCase || rawField(robot, \"target_market\") || rawField(robot, \"use_cases\"), \"robot buyers, engineers, researchers, and comparison shoppers\");\n      const specHighlights = quickSpecs\n        .filter(([, value]) => hasDisplayValue(value))\n        .slice(0, 6)\n        .map(([label, value]) => `${label}: ${String(value).replace(/\\s+/g, \" \").trim()}`)\n        .join(\"; \");\n      const statusText = sentence(robot.status, \"availability not publicly listed\");\n      const priceText = sentence(robot.price, \"not publicly listed\");\n      const caveatText = sentence(caveats, \"Public specifications can change as the manufacturer releases new details\");\n      const competitorText = competitors || \"other leading humanoid, service, research, and enterprise robot platforms\";\n      const overviewText = `${robot.name} is a ${categoryPhrase} from ${makerPhrase}. ${publicSummary} Our read is that this robot is worth looking at for ${targetMarkets}, but it should be judged by what is actually published today: size, payload, runtime, mobility, software access, safety claims, and whether real customers can buy or deploy it.`;\n      const availabilityText = `${robot.name} is currently listed as ${statusText}. Pricing is ${priceText}. That buying status matters: a preorder, pilot program, enterprise quote, research platform, prototype, or discontinued model all mean very different things for buyers. Before treating it like a finished product, check delivery timing, support, warranty terms, subscription costs, and what capabilities are available at launch.`;\n      const bestFitText = `Based on its published specs and positioning, ${robot.name} looks most relevant for ${targetMarkets}. The strongest use cases will be the ones where its height, weight, payload, runtime, hands or grippers, mobility, and software ecosystem line up with the work being asked of it. It should be evaluated as a practical robot, not just as a headline or demo video.`;\n      const watchText = `${caveatText}. The main things to verify are release timing, purchase availability, safety claims, autonomy level, SDK or ROS access, payload and runtime tradeoffs, battery details, sensor package, hand design, actuator details, walking speed, and whether the manufacturer has published stable measurements that can be compared fairly against other robots.`;\n      const compareText = `A useful comparison set for ${robot.name} includes ${competitorText}. Compare them on price, availability, height, weight, payload, runtime, degrees of freedom, walking speed, end effectors, software access, service model, manufacturer maturity, and how much real-world deployment evidence exists.`;\n      const coverageText = `${robot.name} has ${specPhrase} available for review. Specification highlights${specHighlights ? ` include ${specHighlights}` : \" are still being filled in as more public details become available\"}. The most important takeaway is not a single number, but whether the published capabilities match the job: lifting, walking, sensing, manipulating objects, operating safely around people, and being supported after deployment.`;\n      const reviewNotes = [\n        [\"What it is\", overviewText],\n        [\"Availability and pricing\", availabilityText],\n        [\"Best fit\", bestFitText],\n        [\"What to watch\", watchText],\n        [\"Comparable robots\", compareText],\n        [\"Specs that matter\", coverageText]\n      ];\n      const mediaTabImages = mediaGallery(supplementalMediaItems, robot) || `<p class=\"fr-muted\">Additional robot images will appear here as more angles are added.</p>`;\n      target.innerHTML = `\n        <div class=\"fr-robot-profile\">\n          <section class=\"fr-robot-hero\">\n            <div class=\"fr-robot-hero__copy\">\n              <div class=\"fr-robot-pill-row\">\n                <span class=\"fr-robot-pill\">${escapeHtml(maker)}</span>\n                <span class=\"fr-robot-pill\">${escapeHtml(compactStatus(robot.status))}</span>\n                <span class=\"fr-robot-pill\">${escapeHtml(robot.category || \"Robot\")}</span>\n              </div>\n              <h2>${escapeHtml(robot.name)} robot review and specifications</h2>\n              <p>${escapeHtml(publicSummary)}</p>\n              <div class=\"fr-profile__actions\">\n                <a class=\"fr-button\" href=\"/pages/compare\">Compare ${escapeHtml(robot.name)}</a>\n                ${productUrl ? `<a class=\"fr-button fr-button--secondary\" href=\"${escapeHtml(productUrl)}\">Official page</a>` : \"\"}\n              </div>\n            </div>\n            <div class=\"fr-robot-hero__image\">${image(robot, `${robot.name} robot`)}</div>\n            <aside class=\"fr-robot-facts\" aria-label=\"${escapeHtml(robot.name)} key facts\">\n              <p class=\"fr-eyebrow\">Key facts</p>\n              <h2>At a glance</h2>\n              <div class=\"fr-robot-fact-grid\">\n                ${quickSpecs.map(([k, v]) => `<div class=\"fr-robot-fact\"><span>${escapeHtml(k)}</span><strong>${escapeHtml(shortValue(v))}</strong></div>`).join(\"\")}\n              </div>\n            </aside>\n          </section>\n\n          <section class=\"fr-robot-panel\">\n            <div class=\"fr-robot-section-header\">\n              <div>\n                <p class=\"fr-eyebrow\">Images and videos</p>\n                <h2>${escapeHtml(robot.name)} photo gallery and movement media</h2>\n                <p>Standardized views make it easier to compare body shape, proportions, end effectors, and visible hardware across robots.</p>\n              </div>\n              <span>${Number(mediaItems.length).toLocaleString()} images / ${Number(videoCount).toLocaleString()} videos</span>\n            </div>\n            ${mediaTileGrid(standardViews, robot, \"fr-angle-grid--standard\")}\n            <div class=\"fr-tabs fr-robot-media-tabs\" data-fr-tabs>\n              <div class=\"fr-tab-list\" role=\"tablist\" aria-label=\"${escapeHtml(robot.name)} media\">\n                <button type=\"button\" class=\"is-active\" data-fr-tab-button=\"gallery\">Additional images</button>\n                ${videoCount ? `<button type=\"button\" data-fr-tab-button=\"videos\">Videos</button>` : \"\"}\n              </div>\n              <div class=\"fr-tab-panel is-active\" data-fr-tab-panel=\"gallery\">${mediaTabImages}</div>\n              ${videoCount ? `<div class=\"fr-tab-panel\" data-fr-tab-panel=\"videos\" hidden>${videoIframes(robot)}</div>` : \"\"}\n            </div>\n          </section>\n\n          <section class=\"fr-robot-panel\">\n            <div class=\"fr-robot-section-header\">\n              <div>\n                <p class=\"fr-eyebrow\">Robot review profile</p>\n                <h2>Our review, buying status, and research notes</h2>\n              </div>\n            </div>\n            <div class=\"fr-robot-review-grid\">\n              ${reviewNotes.map(([label, text]) => `<article class=\"fr-robot-note\"><strong>${escapeHtml(label)}</strong><span>${escapeHtml(text)}</span></article>`).join(\"\")}\n            </div>\n          </section>\n\n          <section class=\"fr-robot-panel\">\n            <div class=\"fr-robot-section-header\">\n              <div>\n                <p class=\"fr-eyebrow\">Profile coverage</p>\n                <h2>Documented facts and source coverage</h2>\n                <p>These counters summarize how much public robot information is currently connected to this profile.</p>\n              </div>\n            </div>\n            <div class=\"fr-robot-metrics\">\n              ${metrics.map(([label, value]) => `<div class=\"fr-robot-metric\"><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join(\"\")}\n            </div>\n          </section>\n\n          ${robotSeoArticle(robot, data)}\n\n          <section class=\"fr-robot-panel\">\n            <div class=\"fr-robot-section-header\">\n              <div>\n                <p class=\"fr-eyebrow\">Specifications</p>\n                <h2>${escapeHtml(robot.name)} specifications</h2>\n                <p>Specs are grouped into practical sections with plain-language values so readers can quickly compare the robot.</p>\n              </div>\n              <span>${Number(documentedSpecs || specSummary.Total || 0).toLocaleString()} public details</span>\n            </div>\n            ${renderSpecSections(robot)}\n          </section>\n\n          <section class=\"fr-robot-panel\">\n            <div class=\"fr-robot-section-header\">\n              <div>\n                <p class=\"fr-eyebrow\">Sources</p>\n                <h2>${escapeHtml(robot.name)} sources and further reading</h2>\n                <p>Use these links to verify manufacturer claims, inspect technical documentation, and continue deeper robot research.</p>\n              </div>\n            </div>\n            ${robotSourcesPanel(robot)}\n          </section>\n        </div>`;\n      bindTabs(target);\n      return;\n    }\n    if (kind === \"manufacturer-profile\" || kind === \"manufacturers\") {\n      const routeHandle = currentPageHandle();\n      const slug = new URLSearchParams(location.search).get(\"manufacturer\") || (routeHandle !== \"manufacturer-profile\" && routeHandle.endsWith(\"-robot-manufacturer\") ? manufacturerSlugFromRoute() : \"\");\n      const manufacturers = slug ? data.manufacturers.filter(m => m.slug === slug) : data.manufacturers;\n      const overview = slug && manufacturers[0] ? manufacturerSeoContent(manufacturers[0], data.robots) : `\n        <section class=\"fr-seo-article fr-card fr-section\">\n          <p class=\"fr-eyebrow\">Manufacturer Guide</p>\n          <h2>Robot manufacturers tracked by FIRGELLI Robots</h2>\n          <p>This manufacturer database connects companies to robot lineups, countries, public websites, focus areas, and source-backed robot profiles. Use it to move from a robot model to the company behind it.</p>\n        </section>`;\n      if (slug && manufacturers[0]) {\n        const pageEyebrow = document.querySelector(\".fr-page-hero .fr-eyebrow\");\n        const pageHeading = document.querySelector(\".fr-page-hero h1\");\n        const pageCopy = document.querySelector(\".fr-page-hero p:not(.fr-eyebrow)\");\n        if (pageEyebrow) pageEyebrow.textContent = \"Robot Manufacturer Profile\";\n        if (pageHeading) pageHeading.textContent = `${manufacturers[0].name} robot manufacturer profile`;\n        if (pageCopy) pageCopy.textContent = `Review ${manufacturers[0].name} robots, company focus, public lineup, country, links, and related robot profiles.`;\n      }\n      target.innerHTML = `${overview}<div class=\"fr-results-grid\">${manufacturers.map(m => `<article class=\"fr-tool-card fr-manufacturer-card\"><a class=\"fr-manufacturer-card__media\" href=\"${manufacturerUrl(m)}\">${manufacturerCardImage(m, data)}</a><strong>${escapeHtml(m.name)}</strong><p>${escapeHtml([m.country, m.focus, m.models].filter(Boolean).join(\" - \") || \"Manufacturer profile queued for enrichment.\")}</p><a href=\"${manufacturerUrl(m)}\">View Manufacturer -></a></article>`).join(\"\")}</div>`;\n      return;\n    }\n    if (kind === \"research\") {\n      const docs = [...data.research.papersPatents, ...data.research.manualsDocs, ...data.research.sources].slice(0, 80);\n      target.innerHTML = `${researchSeoContent(data)}<div class=\"fr-results-grid\">${docs.map(doc => `<article class=\"fr-tool-card\"><span class=\"fr-tool-card__icon\">${icon()}</span><strong>${escapeHtml(doc.title || doc.source_title || doc.document_type || \"Research source\")}</strong><p>${escapeHtml(doc.document_type || doc.source_type || doc.publisher || \"Source-backed research item\")}</p><a href=\"${escapeHtml(doc.url || doc.source_url)}\">Open Source -></a></article>`).join(\"\")}</div>`;\n      return;\n    }\n    if (kind === \"knowledge\") {\n      const term = new URLSearchParams(location.search).get(\"topic\") || knowledgeTopicFromRoute() || \"\";\n      const knowledgeCards = [\n        [\"Price\", \"Estimated or verified robot purchase price, lease status, or quote requirement.\"],\n        [\"Height\", \"Physical robot height from manufacturer data or trusted source review.\"],\n        [\"Weight\", \"Robot mass including body, battery, and standard configuration where known.\"],\n        [\"DOF\", \"Degrees of freedom: the number of independently controlled motion axes.\"],\n        [\"Payload\", \"Rated carry or manipulation capacity, separated from body weight.\"],\n        [\"Runtime\", \"Expected battery operating time under stated workload.\"],\n        [\"Release Status\", \"Commercial availability, pilot status, prototype status, or announcement state.\"]\n      ];\n      const docs = [...data.research.sources, ...data.research.papersPatents].slice(0, 24);\n      target.innerHTML = `\n        <section class=\"fr-seo-article fr-card fr-section\">\n          <p class=\"fr-eyebrow\">Specification Guide</p>\n          <h2>${escapeHtml(term || \"Robot specifications\")} explained</h2>\n          <p>Specification pages explain what each robot attribute means, why it matters, how it is measured, and how to compare robots without over-trusting incomplete manufacturer claims.</p>\n          <div class=\"fr-seo-grid\">\n            <article><h3>Why it matters</h3><p>Specs like DOF, payload, runtime, price, sensors, LiDAR, SDK support, ROS support, and walking speed help separate practical capability from promotional claims.</p></article>\n            <article><h3>How to compare</h3><p>Use the same field across multiple robot profiles, then inspect source status and missing-data warnings. A known lower value is often more useful than an unknown or unsupported claim.</p></article>\n            <article><h3>Common misunderstanding</h3><p>One number rarely describes a whole robot. Runtime depends on task, payload depends on pose and safety margin, and price depends on configuration and support.</p></article>\n            <article><h3>Related tool</h3><p>Use the robot comparison page to view the same specification across multiple robots side by side.</p></article>\n          </div>\n        </section>\n        <div class=\"fr-results-grid\">\n          ${knowledgeCards.filter(([label]) => !term || label.toLowerCase().includes(term.toLowerCase())).map(([label, text]) => `<article class=\"fr-tool-card\"><span class=\"fr-tool-card__icon\">${icon()}</span><strong>${escapeHtml(label)}</strong><p>${escapeHtml(text)}</p><a href=\"/pages/robots\">Browse records -></a></article>`).join(\"\")}\n        </div>\n        <div class=\"fr-card fr-section\">\n          <p class=\"fr-eyebrow\">Trusted Source Feed</p>\n          <h2>Latest knowledge-brain sources</h2>\n          <div class=\"fr-results-grid\">${docs.map(doc => `<article class=\"fr-tool-card\"><strong>${escapeHtml(doc.source_title || doc.title || \"Source record\")}</strong><p>${escapeHtml(doc.source_type || doc.document_type || doc.publisher || \"Knowledge source\")}</p>${doc.url || doc.source_url ? `<a href=\"${escapeHtml(doc.url || doc.source_url)}\">Open source -></a>` : \"\"}</article>`).join(\"\")}</div>\n        </div>`;\n      return;\n    }\n    if (kind === \"news\") {\n      const latest = data.latestRobots.slice(0, 10);\n      const sources = data.research.sources.slice(0, 18);\n      target.innerHTML = `\n        <div class=\"fr-results-grid\">${latest.map(robot => `<article class=\"fr-robot-card\"><a href=\"${robotUrl(robot)}\">${image(robot)}</a><div><h3><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></h3><dl><div><dt>Maker</dt><dd>${escapeHtml(publicMaker(robot))}</dd></div><div><dt>Status</dt><dd>${escapeHtml(compactStatus(robot.status))}</dd></div></dl><span class=\"${badgeClass(robot.status)}\">${escapeHtml(robot.category)}</span></div></article>`).join(\"\")}</div>\n        <div class=\"fr-card fr-section\">\n          <p class=\"fr-eyebrow\">Source-backed updates</p>\n          <h2>Recent source records</h2>\n          <div class=\"fr-results-grid\">${sources.map(doc => `<article class=\"fr-tool-card\"><strong>${escapeHtml(doc.source_title || \"Source update\")}</strong><p>${escapeHtml(doc.source_domain || doc.source_type || \"Knowledge source\")}</p>${doc.url ? `<a href=\"${escapeHtml(doc.url)}\">Open source -></a>` : \"\"}</article>`).join(\"\")}</div>\n        </div>`;\n      return;\n    }\n    if (kind === \"tools\") {\n      const focus = toolFocusFromRoute();\n      const toolList = normalizedTools(data);\n      const tools = toolList;\n      document.querySelectorAll(\".fr-server-content\").forEach((node) => node.remove());\n      const directory = focus ? \"\" : `\n        <section class=\"fr-card fr-section\">\n          <p class=\"fr-eyebrow\">Tool Directory</p>\n          <h2>All robot tools and calculators</h2>\n          <div class=\"fr-results-grid\">${tools.map(tool => `<article class=\"fr-tool-card\"><span class=\"fr-tool-card__icon\">${icon()}</span><strong>${escapeHtml(tool.title)}</strong><p>${escapeHtml(tool.description)}</p><a href=\"${escapeHtml(tool.url)}\">${escapeHtml(tool.cta)} -></a></article>`).join(\"\")}</div>\n        </section>`;\n      target.innerHTML = `${renderToolWidgets(data, focus)}\n        ${directory}\n        ${toolSeoContent(data, focus)}`;\n      bindToolWidgets(data);\n      return;\n    }\n    if (kind === \"developers\") {\n      const developerRobots = data.robots.filter(robot => String(robot.summary || robot.useCase || robot.category).toLowerCase().includes(\"research\") || robot.flags.research).slice(0, 40);\n      target.innerHTML = `<div class=\"fr-results-grid\">${developerRobots.map(robot => `<article class=\"fr-robot-card\"><a href=\"${robotUrl(robot)}\">${image(robot)}</a><div><h3><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></h3><dl><div><dt>Maker</dt><dd>${escapeHtml(publicMaker(robot))}</dd></div><div><dt>Use</dt><dd>${escapeHtml(publicCardValue(robot.useCase || robot.category, \"Research platform\"))}</dd></div></dl><span class=\"${badgeClass(robot.status)}\">${escapeHtml(compactStatus(robot.status))}</span></div></article>`).join(\"\")}</div>`;\n      return;\n    }\n    if (kind === \"marketplace\") {\n      const marketplaceRobots = data.robots.filter(robot => robot.flags.consumer || robot.flags.enterprise || robot.flags.industrial || robot.flags.humanoid).slice(0, 40);\n      target.innerHTML = `<div class=\"fr-card fr-section\"><p class=\"fr-eyebrow\">Marketplace Foundation</p><h2>Robots ready for future commerce mapping</h2><p>These public robot profiles can later connect to accessories, skills, compatible parts, service plans, and quote flows as the marketplace grows.</p></div><div class=\"fr-results-grid\">${marketplaceRobots.map(robot => `<article class=\"fr-robot-card\"><a href=\"${robotUrl(robot)}\">${image(robot)}</a><div><h3><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></h3><dl><div><dt>Maker</dt><dd>${escapeHtml(publicMaker(robot))}</dd></div><div><dt>Price</dt><dd>${escapeHtml(compactPrice(robot.price))}</dd></div></dl><span class=\"${badgeClass(robot.status)}\">${escapeHtml(compactStatus(robot.status))}</span></div></article>`).join(\"\")}</div>`;\n      return;\n    }\n    if (kind === \"community\") {\n      const mentions = (data.community || []).slice(0, 80);\n      target.innerHTML = `<div class=\"fr-results-grid\">${mentions.map(item => `<article class=\"fr-tool-card\"><span class=\"fr-tool-card__icon\">${icon()}</span><strong>${escapeHtml(item.title || \"Community review item\")}</strong><p>${escapeHtml(item.notes || item.claim_summary || item.mention_type || \"Queued for manual community review.\")}</p>${item.url ? `<a href=\"${escapeHtml(item.url)}\">Open mention -></a>` : `<a href=\"/pages/robots\">Open database -></a>`}</article>`).join(\"\")}</div>`;\n      return;\n    }\n    if (kind === \"about\" || kind === \"editorial-policy\" || kind === \"contact\") {\n      const body = {\n        \"about\": [\"A database-first robotics intelligence platform\", `FIRGELLI Robots is organized around ${data.stats.robots} robot records, ${data.stats.manufacturers} manufacturers, ${data.stats.sources} source records, and ${data.stats.papersPatents} papers/patents for robot buyers, researchers, and builders.`],\n        \"editorial-policy\": [\"Editorial and source policy\", \"Robot specifications, manufacturer claims, images, videos, patents, papers, and community notes are separated by source type. Unverified fields stay marked as unknown until reviewed.\"],\n        \"contact\": [\"Contact FIRGELLI Robots\", \"Use this development page as the future intake point for data corrections, manufacturer submissions, marketplace partnerships, and robotics research requests.\"]\n      }[kind];\n      target.innerHTML = `<div class=\"fr-card fr-section\"><p class=\"fr-eyebrow\">${escapeHtml(body[0])}</p><h2>${escapeHtml(body[0])}</h2><p>${escapeHtml(body[1])}</p><p><a class=\"fr-button\" href=\"/pages/robots\">Explore Database</a> <a class=\"fr-button fr-button--secondary\" href=\"/pages/research\">Review Sources</a></p></div>`;\n      return;\n    }\n    if (kind === \"category\" && currentPageHandle() === \"robot-categories\") {\n      const categoryCards = (data.categories || []).map((category) => `\n        <a class=\"fr-category-card\" href=\"${categoryUrl(category.slug)}\">\n          <span class=\"fr-category-card__icon\">${categoryIcon(category.slug)}</span>\n          <strong>${escapeHtml(category.label)}</strong>\n          <span>${Number(category.count || 0).toLocaleString()}+ Robots</span>\n        </a>`).join(\"\");\n      target.innerHTML = `\n        <section class=\"fr-seo-article fr-card fr-section\">\n          <p class=\"fr-eyebrow\">Robot Category Index</p>\n          <h2>Browse robots by category</h2>\n          <p>Use these category landing pages to narrow robots by form factor, market, deployment type, research use, service role, warehouse use, industrial automation, and defense-adjacent applications.</p>\n        </section>\n        <div class=\"fr-category-grid\">${categoryCards}</div>`;\n      return;\n    }\n    const robots = kind === \"compare\" ? filteredRobots(data).slice(0, 4) : filteredRobots(data);\n    if (kind === \"compare\") {\n      const rows = [[\"Price\", \"price\"], [\"Height\", \"height\"], [\"Weight\", \"weight\"], [\"DOF\", \"dof\"], [\"Payload\", \"payload\"], [\"Runtime\", \"runtime\"], [\"Movement\", \"movement\"], [\"Status\", \"status\"]];\n      const addSlug = new URLSearchParams(location.search).get(\"add\");\n      const compareRobots = addSlug ? [data.robots.find(r => r.slug === addSlug), ...robots.filter(r => r.slug !== addSlug)].filter(Boolean).slice(0, 4) : robots;\n      target.innerHTML = `<div class=\"fr-table-wrap\"><table class=\"fr-compare-table fr-compare-table--page\"><colgroup><col class=\"fr-compare-label-col\">${compareRobots.map(() => `<col class=\"fr-compare-robot-col\">`).join(\"\")}</colgroup><thead><tr><th scope=\"col\"></th>${compareRobots.map(r => `<th scope=\"col\"><a class=\"fr-table-robot fr-table-robot--compact\" href=\"${robotUrl(r)}\">${compareImage(r)}<span>${escapeHtml(r.name)}</span></a></th>`).join(\"\")}</tr></thead><tbody>${rows.map(([label, key]) => `<tr><td>${label}</td>${compareRobots.map(r => `<td>${escapeHtml(compactComparisonValue(r, key))}</td>`).join(\"\")}</tr>`).join(\"\")}</tbody></table></div>${comparisonSeoContent(compareRobots)}`;\n    } else {\n      const seoLead = kind === \"category\" ? categorySeoContent(kind, data, robots) : \"\";\n      if (kind === \"category\") {\n        const category = new URLSearchParams(location.search).get(\"filter\") || categorySlugFromRoute() || \"\";\n        const record = (data.categories || []).find((item) => item.slug === category);\n        if (record) {\n          const pageEyebrow = document.querySelector(\".fr-page-hero .fr-eyebrow\");\n          const pageHeading = document.querySelector(\".fr-page-hero h1\");\n          const pageCopy = document.querySelector(\".fr-page-hero p:not(.fr-eyebrow)\");\n          if (pageEyebrow) pageEyebrow.textContent = \"Robot Category\";\n          if (pageHeading) pageHeading.textContent = record.label;\n          if (pageCopy) pageCopy.textContent = record.description || `Browse ${record.label.toLowerCase()} by specifications, manufacturer, images, pricing status, and availability.`;\n        }\n      }\n      target.innerHTML = `${seoLead}<div class=\"fr-results-grid\">${robots.map(robot => `<article class=\"fr-robot-card\"><a href=\"${robotUrl(robot)}\">${image(robot)}</a><div><h3><a href=\"${robotUrl(robot)}\">${escapeHtml(robot.name)}</a></h3><dl><div><dt>Maker</dt><dd>${escapeHtml(publicMaker(robot))}</dd></div><div><dt>Status</dt><dd>${escapeHtml(compactStatus(robot.status))}</dd></div><div><dt>Height</dt><dd>${escapeHtml(publicCardValue(robot.height))}</dd></div></dl><span class=\"${badgeClass(robot.status)}\">${escapeHtml(robot.category)}</span></div></article>`).join(\"\")}</div>`;\n    }\n  }\n\n  function currentRobotFromRoute(data) {\n    const routeHandle = currentPageHandle();\n    const slug = new URLSearchParams(location.search).get(\"robot\") || (routeHandle !== \"robot-profile\" ? routeHandle : \"\");\n    return (data.robots || []).find((robot) => robotMatchesSlug(robot, slug));\n  }\n\n  function repairServerRobotProfile(kind, data) {\n    if (kind !== \"robot-profile\") return;\n    const profile = document.querySelector(\".fr-server-robot-profile\");\n    if (!profile) return;\n    const html = profile.innerHTML;\n    const text = profile.textContent || \"\";\n    const isStale = /Known headline specs|Robot ID|Unknown fields stay unknown|Full [^<]+ specification sheet|documented fields/i.test(html)\n      || /\\bWalking\\s+false\\b|\\bWheels\\s+false\\b|\\bTracks\\s+false\\b/i.test(text);\n    if (!isStale) return;\n    const robot = currentRobotFromRoute(data);\n    if (!robot) return;\n\n    const specPanel = [...profile.querySelectorAll(\".fr-robot-panel\")]\n      .find((panel) => (panel.querySelector(\".fr-eyebrow\")?.textContent || \"\").trim().toLowerCase() === \"specifications\");\n    if (specPanel) {\n      const count = publicSpecCount(robot) || Number(robot.specSummary?.Total || 0);\n      specPanel.innerHTML = `\n        <div class=\"fr-robot-section-header\">\n          <div>\n            <p class=\"fr-eyebrow\">Specifications</p>\n            <h2>${escapeHtml(robot.name)} specifications</h2>\n            <p>Specs are grouped into practical sections with plain-language values so readers can quickly compare the robot.</p>\n          </div>\n          <span>${Number(count || 0).toLocaleString()} public details</span>\n        </div>\n        ${renderSpecSections(robot)}`;\n    }\n\n    const faqList = profile.querySelector(\".fr-faq-list\");\n    if (faqList) faqList.outerHTML = faqBlock(robotFaqs(robot));\n\n    profile.innerHTML = profile.innerHTML\n      .replace(/Known headline specs include/g, \"Headline specs include\")\n      .replace(/Unknown fields stay unknown until a stronger source is attached\\./g, \"Fields without enough public support stay unconfirmed until a stronger source is attached.\")\n      .replace(/known dimensions/g, \"published dimensions\")\n      .replace(/Verified ([^<]+) sources and further reading/g, \"$1 sources and further reading\");\n  }\n\n  function repairServerCategoryPage(kind) {\n    if (kind !== \"category\") return;\n    const content = document.querySelector(\".fr-server-category\") || document.querySelector(\".fr-server-content\");\n    if (!content) return;\n    const html = content.innerHTML;\n    const text = content.textContent || \"\";\n    const isStale = /uncertain category mapping|What belongs in this category|What does not belong|Best robots in this category|Unknown manufacturer|Price not verified/i.test(html)\n      || [...content.querySelectorAll(\"td, dd, span, strong\")].some((node) => (node.textContent || \"\").trim().toLowerCase() === \"review\")\n      || /\\breviewed\\b|\\bevidence\\b|\\bmapping\\b/i.test(text);\n    if (!isStale) return;\n    content.innerHTML = content.innerHTML\n      .replace(/What belongs in this category\\?/g, \"What belongs here?\")\n      .replace(/Robots are included when their public specifications, manufacturer positioning, visible hardware, and use cases match this category\\./g, \"Robots in this category should have a clear public role that matches the category, plus enough specifications, images, or source material to compare them usefully.\")\n      .replace(/What does not belong\\?/g, \"What should be compared elsewhere?\")\n      .replace(/Robots without enough matching evidence, unrelated automation products, or records with uncertain category mapping should remain outside this landing page until reviewed\\./g, \"Robots built for a different job are better compared in another category. A polished demo or similar-looking body shape is not enough by itself.\")\n      .replace(/What to compare(?! first)/g, \"What to compare first\")\n      .replace(/Start with availability, price, height, payload, runtime, mobility, DOF, developer support, source count, and whether the robot has approved images or public videos\\./g, \"Start with whether the robot is actually available, then compare price status, size, payload, runtime, DOF, mobility, software access, support, and source quality.\")\n      .replace(/Limitations/g, \"What to be careful about\")\n      .replace(/Many robot manufacturers publish partial information\\. Missing price, runtime, SDK, safety, and deployment data should be treated as a research gap, not as a hidden positive\\./g, \"Many robotics companies publish partial specs. Missing price, runtime, safety, SDK, warranty, or deployment details should be treated as unconfirmed.\")\n      .replace(/Best robots in this category/g, \"Good robots to start with\")\n      .replace(/Unknown manufacturer/g, \"Manufacturer not listed\")\n      .replace(/Price not verified/g, \"Price not publicly listed\")\n      .replace(/>\\s*review\\s*</gi, \">Not publicly confirmed<\")\n      .replace(/>\\s*Unknown\\s*</g, \">Not publicly listed<\");\n  }\n\n  function bindPageFilters(kind, data) {\n    document.querySelectorAll(\"[data-fr-filter-search], [data-fr-filter-category], [data-fr-filter-status]\").forEach((control) => {\n      control.addEventListener(\"input\", () => renderPageResults(kind, data));\n      control.addEventListener(\"change\", () => renderPageResults(kind, data));\n    });\n  }\n\n  async function initHome(root) {\n    assetBase = root.dataset.assetBase || assetBase;\n    const data = await loadData(root);\n    renderHero(data);\n    bindHomeSearch(root, data);\n    renderFeaturedTable(data);\n    bindFeaturedTableScroll();\n    renderCategories(data);\n    renderStats(data);\n    renderLatest(data);\n    renderViewShowcase(data);\n    renderTools(data);\n    renderManufacturerMarquee(data);\n  }\n\n  async function initPage(root) {\n    assetBase = root.dataset.assetBase || assetBase;\n    const data = await loadData(root);\n    if (redirectToCleanUrl(data)) return;\n    const kind = resolvePageKind(root);\n    applyPageMeta(root, kind);\n    renderControls(kind, data);\n    renderPageResults(kind, data);\n    repairServerRobotProfile(kind, data);\n    repairServerCategoryPage(kind);\n    bindPageFilters(kind, data);\n    hideGiantListingDumps();\n    initHubManufacturerSelects();\n  }\n\n  const robotLightboxSelector = [\n    \".fr-server-robot-profile .fr-robot-hero__image img\",\n    \".fr-server-robot-profile .fr-profile__media img\",\n    \".fr-server-robot-profile .fr-angle-tile img\",\n    \".fr-server-robot-profile .fr-view-card img\",\n    \".fr-server-robot-profile .fr-found-card img\"\n  ].join(\", \");\n  let lastLightboxFocus = null;\n\n  function lightboxImageFromTarget(target) {\n    if (!target || typeof target.closest !== \"function\") return null;\n    const image = target.closest(robotLightboxSelector);\n    return image && document.body.contains(image) ? image : null;\n  }\n\n  function ensureImageLightbox() {\n    let lightbox = document.querySelector(\"[data-fr-lightbox]\");\n    if (lightbox) return lightbox;\n    lightbox = document.createElement(\"div\");\n    lightbox.className = \"fr-lightbox\";\n    lightbox.setAttribute(\"data-fr-lightbox\", \"\");\n    lightbox.setAttribute(\"role\", \"dialog\");\n    lightbox.setAttribute(\"aria-modal\", \"true\");\n    lightbox.setAttribute(\"aria-label\", \"Larger robot image\");\n    lightbox.innerHTML = `\n      <div class=\"fr-lightbox__dialog\" data-fr-lightbox-dialog>\n        <button class=\"fr-lightbox__close\" type=\"button\" aria-label=\"Close larger image\">&times;</button>\n        <div class=\"fr-lightbox__frame\"><img alt=\"\"></div>\n        <div class=\"fr-lightbox__caption\" data-fr-lightbox-caption></div>\n      </div>`;\n    document.body.appendChild(lightbox);\n    lightbox.addEventListener(\"click\", (event) => {\n      if (event.target === lightbox || event.target.closest(\".fr-lightbox__close\")) closeImageLightbox();\n    });\n    return lightbox;\n  }\n\n  function openImageLightbox(image) {\n    const src = image.currentSrc || image.src || image.getAttribute(\"src\");\n    if (!src) return;\n    const lightbox = ensureImageLightbox();\n    const fullImage = lightbox.querySelector(\".fr-lightbox__frame img\");\n    const caption = lightbox.querySelector(\"[data-fr-lightbox-caption]\");\n    const label = image.closest(\".fr-angle-tile, .fr-view-card, .fr-found-card\")?.querySelector(\"strong\")?.textContent?.trim()\n      || image.alt\n      || \"Robot image\";\n    lastLightboxFocus = document.activeElement;\n    fullImage.src = src;\n    fullImage.alt = image.alt || label;\n    if (image.srcset) fullImage.srcset = image.srcset;\n    else fullImage.removeAttribute(\"srcset\");\n    if (image.sizes) fullImage.sizes = image.sizes;\n    else fullImage.removeAttribute(\"sizes\");\n    caption.textContent = label;\n    document.body.classList.add(\"fr-lightbox-open\");\n    lightbox.classList.add(\"is-open\");\n    requestAnimationFrame(() => lightbox.querySelector(\".fr-lightbox__close\")?.focus());\n  }\n\n  function closeImageLightbox() {\n    const lightbox = document.querySelector(\"[data-fr-lightbox]\");\n    if (!lightbox || !lightbox.classList.contains(\"is-open\")) return;\n    lightbox.classList.remove(\"is-open\");\n    document.body.classList.remove(\"fr-lightbox-open\");\n    if (lastLightboxFocus && typeof lastLightboxFocus.focus === \"function\") lastLightboxFocus.focus();\n  }\n\n  function decorateLightboxImages() {\n    document.querySelectorAll(robotLightboxSelector).forEach((image) => {\n      if (image.dataset.frLightboxReady === \"1\") return;\n      image.dataset.frLightboxReady = \"1\";\n      if (!image.hasAttribute(\"tabindex\")) image.tabIndex = 0;\n      image.setAttribute(\"role\", \"button\");\n      image.setAttribute(\"aria-label\", `Open larger view of ${image.alt || \"robot image\"}`);\n    });\n  }\n\n  function bindImageLightbox() {\n    if (document.documentElement.dataset.frLightboxBound === \"1\") return;\n    document.documentElement.dataset.frLightboxBound = \"1\";\n    document.addEventListener(\"click\", (event) => {\n      const image = lightboxImageFromTarget(event.target);\n      if (!image) return;\n      event.preventDefault();\n      openImageLightbox(image);\n    });\n    document.addEventListener(\"keydown\", (event) => {\n      if (event.key === \"Escape\") {\n        closeImageLightbox();\n        return;\n      }\n      if (event.key !== \"Enter\" && event.key !== \" \") return;\n      const image = lightboxImageFromTarget(event.target);\n      if (!image) return;\n      event.preventDefault();\n      openImageLightbox(image);\n    });\n    decorateLightboxImages();\n    const observer = new MutationObserver(decorateLightboxImages);\n    observer.observe(document.body, { childList: true, subtree: true });\n  }\n\n  function bindNav() {\n    const button = document.querySelector(\"[data-fr-menu]\");\n    const nav = document.querySelector(\"[data-fr-mobile-nav]\");\n    if (!button || !nav) return;\n    button.addEventListener(\"click\", () => {\n      const open = nav.classList.toggle(\"is-open\");\n      button.setAttribute(\"aria-expanded\", String(open));\n    });\n  }\n\n  const versionIcubImageUrl = (url = \"\") => {\n    const text = String(url || \"\");\n    if (!text.includes(\"icub-a922c3d274\")) return text;\n    if (/[?&]v=/.test(text)) return text;\n    return `${text}${text.includes(\"?\") ? \"&\" : \"?\"}v=1`;\n  };\n\n  function refreshIcubImages(root = document) {\n    root.querySelectorAll?.('img[src*=\"icub-a922c3d274\"], img[data-fr-fallbacks*=\"icub-a922c3d274\"]').forEach((image) => {\n      const refreshedSrc = versionIcubImageUrl(image.getAttribute(\"src\"));\n      if (refreshedSrc && refreshedSrc !== image.getAttribute(\"src\")) image.setAttribute(\"src\", refreshedSrc);\n      if (!image.dataset.frFallbacks) return;\n      try {\n        const fallbacks = JSON.parse(image.dataset.frFallbacks || \"[]\").map(versionIcubImageUrl);\n        image.dataset.frFallbacks = JSON.stringify([...new Set(fallbacks)]);\n      } catch (error) {\n        image.dataset.frFallbacks = image.dataset.frFallbacks.replace(/(icub-a922c3d274[^,\\]\"]*?\\.webp)(?![?&]v=)/g, \"$1?v=1\");\n      }\n    });\n  }\n\n  function sanitizeServerVideoCards(root = document) {\n    const badLabels = new Set([\"youtube_link\", \"youtube_url\", \"youtube_video_id\", \"embed_url\", \"video_url\", \"placeholder\"]);\n    root.querySelectorAll?.(\".fr-video-card\").forEach((card, index) => {\n      const frame = card.querySelector(\"iframe, video\");\n      const src = frame ? String(frame.getAttribute(\"src\") || \"\").trim() : \"\";\n      const lowerSrc = src.toLowerCase();\n      if (!src || lowerSrc.includes(\"${\") || lowerSrc.includes(\"youtube_link\") || lowerSrc.includes(\"embed_url\")) {\n        card.remove();\n        return;\n      }\n      const label = card.querySelector(\"strong\");\n      if (label && badLabels.has(label.textContent.trim().toLowerCase())) {\n        label.textContent = `Movement video ${index + 1}`;\n      }\n      if (frame && frame.tagName === \"IFRAME\") {\n        const title = String(frame.getAttribute(\"title\") || \"\").toLowerCase();\n        if ([...badLabels].some((bad) => title.includes(bad))) {\n          frame.setAttribute(\"title\", `Movement video ${index + 1}`);\n        }\n      }\n    });\n    root.querySelectorAll?.(\".fr-video-grid\").forEach((grid) => {\n      if (grid.querySelector(\".fr-video-card\")) return;\n      const heading = grid.previousElementSibling;\n      if (heading && heading.tagName === \"H3\" && heading.textContent.trim().toLowerCase() === \"videos\") heading.remove();\n      grid.remove();\n    });\n  }\n\n  document.addEventListener(\"DOMContentLoaded\", () => {\n    refreshIcubImages();\n    sanitizeServerVideoCards();\n    bindNav();\n    bindImageLightbox();\n    document.querySelectorAll(\"[data-fr-home]\").forEach(initHome);\n    document.querySelectorAll(\"[data-fr-page-kind]\").forEach(initPage);\n    if (!document.querySelector(\"[data-fr-page-kind]\")) {\n      hideGiantListingDumps();\n      initHubManufacturerSelects();\n    }\n  });\n})();\n"],
  "mappings": "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",
  "names": ["q", "image"]
}
