{"id":20454,"date":"2026-03-29T19:33:35","date_gmt":"2026-03-29T17:33:35","guid":{"rendered":"https:\/\/penalex.ch\/test-3\/"},"modified":"2026-04-04T10:48:57","modified_gmt":"2026-04-04T08:48:57","slug":"test-3","status":"publish","type":"page","link":"https:\/\/penalex.ch\/en\/test-3\/","title":{"rendered":"test"},"content":{"rendered":"\n\n\n<div>\n<!-- COMPASS Risk Assessment \u2014 Version UPGRADED -->\n\n\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>COMPASS &#8211; Criminal risk assessment<\/title>\n  <script crossorigin=\"\" src=\"https:\/\/unpkg.com\/react@18.2.0\/umd\/react.production.min.js\" integrity=\"sha384-tMH8h3BGESGckSAVGZ82T9n90ztNXxvdwvdM6UoR56cYcf+0iGXBliJ29D+wZ\/x8\"><\/script>\n  <script crossorigin=\"\" src=\"https:\/\/unpkg.com\/react-dom@18.2.0\/umd\/react-dom.production.min.js\" integrity=\"sha384-bm7MnzvK++ykSwVJ2tynSE5TRdN+xL418osEVF2DE\/L\/gfWHj91J2Sphe582B1Bh\"><\/script>\n  <script src=\"https:\/\/unpkg.com\/jspdf@2.5.1\/dist\/jspdf.umd.min.js\" integrity=\"sha384-JcnsjUPPylna1s1fvi1u12X5qjY5OL56iySh75FdtrwhO\/SWXgMjoVqcKyIIWOLk\" crossorigin=\"anonymous\"><\/script>\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Lato:ital,wght@0,300;0,400;0,700;0,900;1,400&amp;family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,500&amp;display=swap\" rel=\"stylesheet\">\n  <style>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    html, body { height: 100%; overflow-x: hidden; }\n\n    body {\n      background: #070D18;\n      \/* Subtle noise texture for depth *\/\n      background-image:\n        url(\"data:image\/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'\/%3E%3C\/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'\/%3E%3C\/svg%3E\");\n    }\n    #root { min-height: 100vh; }\n\n    \/* \u2500\u2500 Keyframes \u2500\u2500 *\/\n    @keyframes slideInRight {\n      from { transform: translateX(64px); opacity: 0; filter: blur(4px); }\n      to   { transform: translateX(0);    opacity: 1; filter: blur(0); }\n    }\n    @keyframes slideInLeft {\n      from { transform: translateX(-64px); opacity: 0; filter: blur(4px); }\n      to   { transform: translateX(0);     opacity: 1; filter: blur(0); }\n    }\n    @keyframes fadeUp {\n      from { transform: translateY(28px); opacity: 0; filter: blur(3px); }\n      to   { transform: translateY(0);    opacity: 1; filter: blur(0); }\n    }\n    @keyframes fadeIn {\n      from { opacity: 0; }\n      to   { opacity: 1; }\n    }\n    @keyframes pulseGlow {\n      0%, 100% { box-shadow: 0 0 0 0 rgba(111,183,200,0); }\n      50%       { box-shadow: 0 0 28px 4px rgba(111,183,200,0.18); }\n    }\n    @keyframes shimmer {\n      0%   { background-position: -200% center; }\n      100% { background-position: 200% center; }\n    }\n    @keyframes orbFloat {\n      0%, 100% { transform: translateY(0px) scale(1); }\n      50%       { transform: translateY(-18px) scale(1.04); }\n    }\n    @keyframes progressFill {\n      from { width: 0%; }\n    }\n    @keyframes countUp {\n      from { opacity: 0; transform: translateY(8px); }\n      to   { opacity: 1; transform: translateY(0); }\n    }\n\n    .slide-in-right { animation: slideInRight 0.44s cubic-bezier(0.16,1,0.3,1) both; }\n    .slide-in-left  { animation: slideInLeft  0.44s cubic-bezier(0.16,1,0.3,1) both; }\n    .fade-up        { animation: fadeUp 0.52s cubic-bezier(0.16,1,0.3,1) both; }\n    .fade-up-delay-1 { animation: fadeUp 0.52s 0.08s cubic-bezier(0.16,1,0.3,1) both; }\n    .fade-up-delay-2 { animation: fadeUp 0.52s 0.16s cubic-bezier(0.16,1,0.3,1) both; }\n    .fade-up-delay-3 { animation: fadeUp 0.52s 0.24s cubic-bezier(0.16,1,0.3,1) both; }\n\n    \/* \u2500\u2500 Nav \u2500\u2500 *\/\n    .compass-nav {\n      display: flex; align-items: center; justify-content: space-between;\n      padding: 0 36px; height: 64px;\n      border-bottom: 1px solid rgba(111,183,200,0.10);\n      background: rgba(7,13,24,0.88);\n      backdrop-filter: blur(24px) saturate(1.4);\n      -webkit-backdrop-filter: blur(24px) saturate(1.4);\n      position: sticky; top: 0; z-index: 200;\n    }\n    .compass-nav::after {\n      content: '';\n      position: absolute; bottom: 0; left: 36px; right: 36px;\n      height: 1px;\n      background: linear-gradient(90deg, transparent, rgba(111,183,200,0.25), transparent);\n      pointer-events: none;\n    }\n    .nav-item {\n      background: none; border: none;\n      padding: 7px 14px; border-radius: 7px;\n      font-family: Lato, sans-serif; font-size: 13px; font-weight: 500;\n      letter-spacing: 0.02em; cursor: pointer;\n      transition: background 0.18s, color 0.18s;\n      color: #4E7080; white-space: nowrap; position: relative;\n    }\n    .nav-item:hover  { background: rgba(255,255,255,0.04); color: #9BBDCC; }\n    .nav-item.active {\n      background: rgba(111,183,200,0.10);\n      color: #A3CFDE;\n      border: 1px solid rgba(111,183,200,0.18);\n    }\n    .lang-btn {\n      background: rgba(111,183,200,0.08);\n      border: 1px solid rgba(111,183,200,0.20);\n      border-radius: 6px; padding: 5px 13px;\n      color: #6FB7C8; font-family: Lato, sans-serif;\n      font-size: 11px; font-weight: 800; letter-spacing: 2px;\n      cursor: pointer; transition: all 0.2s;\n    }\n    .lang-btn:hover { background: rgba(111,183,200,0.16); color: #9DD4E2; }\n\n    \/* \u2500\u2500 Progress bar \u2500\u2500 *\/\n    .progress-track {\n      height: 2px; background: rgba(255,255,255,0.06);\n      overflow: hidden;\n    }\n    .progress-fill {\n      height: 100%; border-radius: 1px;\n      background: linear-gradient(90deg, #4A96AA, #6FB7C8, #9DD4E2);\n      background-size: 200% 100%;\n      transition: width 0.5s cubic-bezier(0.16,1,0.3,1);\n      animation: shimmer 2.5s linear infinite;\n    }\n\n    \/* \u2500\u2500 Tabs \u2500\u2500 *\/\n    .tab-btn {\n      background: none; border: none; border-bottom: 2px solid transparent;\n      cursor: pointer; font-family: Lato, sans-serif; font-size: 13px;\n      font-weight: 600; letter-spacing: 0.06em; padding: 14px 22px;\n      transition: color 0.2s, border-color 0.2s; color: #3E6070; white-space: nowrap;\n    }\n    .tab-btn:hover  { color: #7AAAB8; }\n    .tab-btn.active { color: #7FC9D8; border-bottom-color: #6FB7C8; }\n\n    \/* \u2500\u2500 Answer buttons \u2500\u2500 *\/\n    .answer-btn {\n      display: flex; align-items: center; gap: 16px;\n      padding: 20px 26px;\n      background: rgba(10,18,32,0.7);\n      border: 1.5px solid rgba(111,183,200,0.12);\n      border-radius: 14px; cursor: pointer;\n      transition: border-color 0.22s, background 0.22s, transform 0.22s, box-shadow 0.22s;\n      font-family: Lato, sans-serif; font-size: 16px;\n      font-weight: 600; color: #D4E4EE; text-align: left;\n      backdrop-filter: blur(8px);\n    }\n    .answer-btn:hover {\n      border-color: rgba(111,183,200,0.45);\n      background: rgba(111,183,200,0.07);\n      transform: translateY(-3px);\n      box-shadow: 0 12px 32px rgba(0,0,0,0.35), 0 0 0 1px rgba(111,183,200,0.08);\n    }\n    .answer-btn.yes:hover {\n      border-color: rgba(52,211,153,0.55);\n      background: rgba(52,211,153,0.08);\n      box-shadow: 0 12px 32px rgba(0,0,0,0.35), 0 0 18px rgba(52,211,153,0.12);\n    }\n    .answer-btn.no:hover {\n      border-color: rgba(239,68,68,0.50);\n      background: rgba(239,68,68,0.07);\n      box-shadow: 0 12px 32px rgba(0,0,0,0.35), 0 0 18px rgba(239,68,68,0.10);\n    }\n    @keyframes answerFlash {\n      0%   { transform: scale(1); }\n      40%  { transform: scale(1.03); }\n      100% { transform: scale(1); }\n    }\n    .answer-btn.selected-yes {\n      border-color: #34D399;\n      background: rgba(52,211,153,0.12);\n      color: #34D399;\n      box-shadow: 0 0 20px rgba(52,211,153,0.18), inset 0 0 0 1px rgba(52,211,153,0.12);\n      animation: answerFlash 0.28s ease both;\n    }\n    .answer-btn.selected-no {\n      border-color: #EF4444;\n      background: rgba(239,68,68,0.12);\n      color: #EF4444;\n      box-shadow: 0 0 20px rgba(239,68,68,0.15), inset 0 0 0 1px rgba(239,68,68,0.10);\n      animation: answerFlash 0.28s ease both;\n    }\n\n    \/* \u2500\u2500 Kbd shortcuts \u2500\u2500 *\/\n    .kbd {\n      display: inline-flex; align-items: center; justify-content: center;\n      width: 28px; height: 28px; border-radius: 6px; flex-shrink: 0;\n      background: rgba(26,45,59,0.9);\n      border: 1px solid rgba(34,58,74,0.9);\n      font-size: 11px; font-weight: 800; color: #6FA8B8;\n      box-shadow: 0 2px 4px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.05);\n    }\n\n    \/* \u2500\u2500 Inputs \u2500\u2500 *\/\n    input, select {\n      transition: border-color 0.2s, box-shadow 0.2s;\n    }\n    input:focus, select:focus {\n      border-color: rgba(111,183,200,0.6) !important;\n      box-shadow: 0 0 0 3px rgba(111,183,200,0.10) !important;\n      outline: none;\n    }\n\n    \/* \u2500\u2500 Scrollbar \u2500\u2500 *\/\n    ::-webkit-scrollbar       { width: 4px; }\n    ::-webkit-scrollbar-track { background: transparent; }\n    ::-webkit-scrollbar-thumb { background: rgba(111,183,200,0.18); border-radius: 2px; }\n    ::-webkit-scrollbar-thumb:hover { background: rgba(111,183,200,0.30); }\n\n    \/* \u2500\u2500 Cards hover lift \u2500\u2500 *\/\n    .card-hover {\n      transition: transform 0.22s cubic-bezier(0.16,1,0.3,1), box-shadow 0.22s;\n    }\n    .card-hover:hover {\n      transform: translateY(-3px);\n      box-shadow: 0 16px 48px rgba(0,0,0,0.4);\n    }\n\n    \/* \u2500\u2500 Buttons \u2500\u2500 *\/\n    .btn-primary-global {\n      position: relative; overflow: hidden;\n      transition: transform 0.18s, box-shadow 0.18s, filter 0.18s;\n    }\n    .btn-primary-global::before {\n      content: '';\n      position: absolute; inset: 0;\n      background: linear-gradient(135deg, rgba(255,255,255,0.12) 0%, transparent 60%);\n      pointer-events: none;\n    }\n    .btn-primary-global:hover {\n      transform: translateY(-2px);\n      box-shadow: 0 10px 36px rgba(111,183,200,0.35) !important;\n      filter: brightness(1.08);\n    }\n    .btn-primary-global:active {\n      transform: translateY(0px);\n    }\n\n    \/* \u2500\u2500 Hero orbs \u2500\u2500 *\/\n    .hero-orb {\n      position: absolute; border-radius: 50%;\n      pointer-events: none; will-change: transform;\n    }\n    .hero-orb-1 {\n      width: 600px; height: 600px;\n      left: 50%; top: -200px;\n      transform: translateX(-50%);\n      background: radial-gradient(circle, rgba(111,183,200,0.07) 0%, transparent 70%);\n      animation: orbFloat 8s ease-in-out infinite;\n    }\n    .hero-orb-2 {\n      width: 300px; height: 300px;\n      left: 10%; top: 20%;\n      background: radial-gradient(circle, rgba(52,211,153,0.04) 0%, transparent 70%);\n      animation: orbFloat 11s 2s ease-in-out infinite;\n    }\n    .hero-orb-3 {\n      width: 250px; height: 250px;\n      right: 8%; top: 30%;\n      background: radial-gradient(circle, rgba(111,183,200,0.05) 0%, transparent 70%);\n      animation: orbFloat 9s 1s ease-in-out infinite;\n    }\n\n    \/* \u2500\u2500 Section dividers \u2500\u2500 *\/\n    .section-rule {\n      width: 48px; height: 1px;\n      background: linear-gradient(90deg, #6FB7C8, transparent);\n      margin: 0 auto 16px;\n    }\n\n    \/* \u2500\u2500 Mobile \u2500\u2500 *\/\n    @media (max-width: 640px) {\n      .compass-nav { padding: 0 18px; }\n      .nav-item { padding: 6px 10px; font-size: 12px; }\n      .answer-btn { padding: 16px 18px; font-size: 15px; }\n      .history-row { min-width: 560px; }\n    }\n  <\/style>\n\n\n  <div id=\"root\"><\/div>\n  <script>\nconst { useState, useEffect, useRef } = React;\n\/* ================================================================\n   COMPASS \u2014 CONFIGURATION UX BUILDER\n   Modifiez uniquement ce bloc pour personnaliser l'outil.\n   Ne touchez pas au code en dessous de la ligne de separation.\n   ================================================================\n\n   COORDONNEES DE CONTACT\n   ---------------------- *\/\nconst CONTACT_EMAIL = \"compass@penalex.ch\";\nconst CONTACT_PHONE = \"+41 21 925 30 90\";\nconst CONTACT_URL   = \"penalex.ch\/compass\";\n\n\/* PALETTE DE COULEURS\n   -------------------\n   Modifiez les valeurs hex\/rgba ci-dessous.\n   C.bg         : fond de page\n   C.accent     : couleur teal principale\n   C.text       : texte principal\n   C.card       : fond des cartes\n   (toutes les autres couleurs derivent de ces valeurs de base)\n   ================================================================ *\/\n\n\/* TEXTES DE L'INTERFACE (FR + EN)\n   ---------------------------------\n   T.fr  = textes francais\n   T.en  = textes anglais\n   Modifiez les chaines entre guillemets dans les deux langues.\n   Cle \"questions\" : 14 questions de l'auto-evaluation (tableau)\n   Cle \"sectors\"   : liste des secteurs d'activite (tableau)\n   ---------------------------------------------------------------- *\/\nconst T = {\n  fr: {\n    brand: \"compass\",\n    tagline: \"Orientation strat\u00e9gique face aux risques p\u00e9naux\",\n    heroTitle: \"Identifiez vos risques p\u00e9nauxnavant qu'il ne soit trop tard\",\n    heroSub: \"Fond\u00e9 sur la pratique du contentieux p\u00e9nal et de la criminalit\u00e9 \u00e9conomique, cet outil permet aux dirigeants et entreprises d'anticiper, cartographier et neutraliser leurs expositions p\u00e9nales.\",\n    startBtn: \"\u00c9valuer mon exposition\",\n    dashboardBtn: \"Tableau de bord\",\n    langSwitch: \"EN\",\n    nav: {\n      home: \"Accueil\",\n      assess: \"\u00c9valuation\",\n      dashboard: \"Tableau de bord\",\n      history: \"Historique\"\n    },\n    assess: {\n      title: \"Auto-\u00e9valuation rapide\",\n      subtitle: \"R\u00e9pondez \u00e0 ces 14 questions pour obtenir une premi\u00e8re estimation de votre niveau d'exposition aux risques p\u00e9naux. Chaque r\u00e9ponse \u00ab Oui \u00bb indique une mesure de protection en place.\",\n      companyName: \"Nom de l'entreprise\",\n      companyPlaceholder: \"Ex: Penalex SA\",\n      sector: \"Secteur d'activit\u00e9\",\n      sectors: [\"Finance & Banque\", \"Construction\", \"Sant\u00e9 & Pharma\", \"Technologie\", \"Commerce & Distribution\", \"Industrie\", \"Transport & Logistique\", \"\u00c9nergie & Environnement\", \"Secteur public\", \"Immobilier\", \"Services juridiques\", \"Autre\"],\n      size: \"Taille de l'entreprise (Nombre d'employ\u00e9s \u00e9quivalent plein-temps \/ EPT)\",\n      sizes: [\"< 10\", \"10 \u2013 249\", \"250 \u2013 4\u202f999\", \"5\u202f000+\"],\n      next: \"Suivant\",\n      prev: \"Pr\u00e9c\u00e9dent\",\n      submit: \"Obtenir mon diagnostic\",\n      questions: [\"Disposez-vous de proc\u00e9dures formalis\u00e9es et effectivement appliqu\u00e9es (code de conduite, formations, contr\u00f4les) ?\", \"Avez-vous identifi\u00e9 de mani\u00e8re exhaustive les processus pouvant engendrer des risques p\u00e9naux ?\", \"Disposez-vous de suffisamment de contr\u00f4les en place afin de minimiser les risques p\u00e9naux d\u00e9tect\u00e9s ?\", \"Avez-vous r\u00e9alis\u00e9 un audit de vos risques juridiques au cours des trois derni\u00e8res ann\u00e9es ?\", \"Vos collaborateurs ont-ils re\u00e7u des formations internes sur les risques de fraudes ?\", \"Existe-t-il un canal de signalement interne (whistleblowing) permettant de rapporter des comportements suspects de mani\u00e8re confidentielle ?\", \"Les responsabilit\u00e9s et processus de d\u00e9cision sont-ils clairement d\u00e9finis et document\u00e9s ?\", \"Votre entreprise dispose-t-elle de proc\u00e9dures claires pour pr\u00e9venir les infractions li\u00e9es \u00e0 la gestion et activit\u00e9s des employ\u00e9s (permis de travail, s\u00e9curit\u00e9 au travail, respect des obligations l\u00e9gales) ?\", \"Existe-t-il des r\u00e8gles claires concernant l'utilisation des cartes de cr\u00e9dit, frais et ressources de l'entreprise par les dirigeants et cadres ?\", \"Effectuez-vous une v\u00e9rification pr\u00e9alable (due diligence) de vos partenaires commerciaux, agents et sous-traitants avant de les engager ?\", \"Si votre entreprise devait rencontrer des difficult\u00e9s financi\u00e8res, savez-vous quelles d\u00e9cisions pourraient engager votre responsabilit\u00e9 p\u00e9nale (paiement pr\u00e9f\u00e9rentiel, gestion fautive, etc.) ?\", \"Les d\u00e9cisions importantes (contrats, paiements, investissements) sont-elles document\u00e9es de mani\u00e8re \u00e0 d\u00e9montrer la diligence du dirigeant en cas d'enqu\u00eate p\u00e9nale ?\", \"Avez-vous des d\u00e9l\u00e9gations de pouvoir formellement document\u00e9es pour les d\u00e9cisions importantes ?\", \"Disposez-vous d'un plan de r\u00e9action en cas de perquisition, saisie ou ouverture d'une enqu\u00eate p\u00e9nale visant votre entreprise ?\"],\n      answers2: [\"Oui\", \"Non\"],\n      categories: [{\n        name: \"Conformit\u00e9 &#038; Proc\u00e9dures\",\n        questions: [0, 1, 2]\n      }, {\n        name: \"Audit &#038; Formation\",\n        questions: [3, 4, 5, 6]\n      }, {\n        name: \"Gestion du personnel &#038; Tiers\",\n        questions: [7, 8, 9]\n      }, {\n        name: \"Responsabilit\u00e9 des dirigeants\",\n        questions: [10, 11, 12]\n      }, {\n        name: \"Gestion de crise\",\n        questions: [13]\n      }]\n    },\n    results: {\n      title: \"Votre diagnostic\",\n      overallRisk: \"Niveau de protection actuel\",\n      measures: \"mesures de protection identifi\u00e9es\",\n      categoryBreakdown: \"D\u00e9tail par domaine de risque\",\n      recommendations: \"Recommandations\",\n      downloadReport: \"T\u00e9l\u00e9charger le rapport\",\n      newAssessment: \"Nouvelle \u00e9valuation\",\n      backHome: \"Retour \u00e0 l'accueil\",\n      disclaimer: \"Ce test rapide ne se substitue pas \u00e0 l'analyse professionnelle. Quelle que soit votre r\u00e9ponse, nos avocats sont disponibles pour un entretien pr\u00e9liminaire confidentiel sans engagement.\",\n      levels: {\n        excellent: \"Protection solide\",\n        good: \"Protection satisfaisante\",\n        moderate: \"Protection insuffisante\",\n        weak: \"Exposition \u00e9lev\u00e9e\",\n        critical: \"Exposition critique\"\n      },\n      recs: {\n        excellent: \"Votre entreprise dispose de dispositifs de protection robustes. Maintenez vos bonnes pratiques et planifiez des v\u00e9rifications p\u00e9riodiques pour assurer la p\u00e9rennit\u00e9 du dispositif.\",\n        good: \"Votre niveau de protection est globalement satisfaisant. Renforcez les quelques domaines identifi\u00e9s comme lacunaires et formalisez davantage vos proc\u00e9dures.\",\n        moderate: \"Plusieurs lacunes significatives ont \u00e9t\u00e9 identifi\u00e9es. Il est recommand\u00e9 de proc\u00e9der \u00e0 un diagnostic approfondi avec un sp\u00e9cialiste en droit p\u00e9nal pour cartographier pr\u00e9cis\u00e9ment vos expositions.\",\n        weak: \"Votre entreprise pr\u00e9sente une exposition p\u00e9nale \u00e9lev\u00e9e. Des mesures correctives urgentes sont n\u00e9cessaires. Un accompagnement professionnel est fortement recommand\u00e9.\",\n        critical: \"Risque imminent d'exposition p\u00e9nale. Les lacunes identifi\u00e9es correspondent aux situations qui d\u00e9clenchent le plus fr\u00e9quemment des proc\u00e9dures p\u00e9nales. Consultez imm\u00e9diatement un avocat p\u00e9naliste.\"\n      },\n      catRecs: [{\n        low: \"Vos proc\u00e9dures de conformit\u00e9 sont inexistantes ou insuffisantes. C'est le premier axe que les autorit\u00e9s examinent lors d'une enqu\u00eate (art. 102 CP).\",\n        high: \"Vos proc\u00e9dures de conformit\u00e9 sont bien \u00e9tablies. Veillez \u00e0 les maintenir \u00e0 jour.\"\n      }, {\n        low: \"L'absence d'audit r\u00e9cent et de formation expose votre entreprise. Les collaborateurs non form\u00e9s et l'absence de canal de signalement constituent des facteurs de risque majeurs.\",\n        high: \"Vos pratiques d'audit, de formation et de signalement interne sont en place. Poursuivez sur cette voie.\"\n      }, {\n        low: \"Les infractions li\u00e9es aux relations de travail et aux partenaires externes exposent r\u00e9guli\u00e8rement les dirigeants \u00e0 des poursuites. Formalisez vos proc\u00e9dures RH et votre due diligence tiers.\",\n        high: \"La gestion du personnel et des tiers est bien encadr\u00e9e. Continuez \u00e0 surveiller les \u00e9volutions l\u00e9gales.\"\n      }, {\n        low: \"Les d\u00e9cisions de gestion non document\u00e9es et les d\u00e9l\u00e9gations floues sont les premi\u00e8res causes de mise en cause p\u00e9nale des dirigeants.\",\n        high: \"La documentation des d\u00e9cisions et les d\u00e9l\u00e9gations sont bien g\u00e9r\u00e9es.\"\n      }, {\n        low: \"L'absence de plan de r\u00e9action en cas d'enqu\u00eate p\u00e9nale peut aggraver consid\u00e9rablement votre situation. Les premi\u00e8res heures sont d\u00e9terminantes.\",\n        high: \"Vous disposez d'un plan de gestion de crise p\u00e9nale. Veillez \u00e0 le tester r\u00e9guli\u00e8rement.\"\n      }]\n    },\n    dashboard: {\n      title: \"Tableau de bord\",\n      totalAssessments: \"\u00c9valuations\",\n      avgScore: \"Score moyen\",\n      highExposure: \"Exposition \u00e9lev\u00e9e\",\n      lastDate: \"Derni\u00e8re \u00e9valuation\",\n      noData: \"Aucune \u00e9valuation r\u00e9alis\u00e9e\",\n      startFirst: \"Commencez votre premi\u00e8re auto-\u00e9valuation\",\n      distribution: \"Distribution des niveaux de protection\",\n      recent: \"\u00c9valuations r\u00e9centes\"\n    },\n    history: {\n      title: \"Historique des \u00e9valuations\",\n      empty: \"Aucune \u00e9valuation dans l'historique\",\n      company: \"Entreprise\",\n      date: \"Date\",\n      score: \"Score\",\n      level: \"Niveau\",\n      actions: \"Actions\",\n      view: \"Voir\",\n      delete: \"Suppr.\",\n      clearAll: \"Tout effacer\",\n      confirmClear: \"Confirmer la suppression de tout l'historique ?\"\n    },\n    footer: \"Outil d'auto-\u00e9valuation. Ne constitue pas un avis juridique. Pour un diagnostic complet, consultez un avocat sp\u00e9cialis\u00e9.\",\n    phases: [{\n      n: \"01\",\n      title: \"Diagnostic et cartographie\",\n      desc: \"Analyse compl\u00e8te de votre organisation pour identifier les zones d'exposition p\u00e9nale : secteur d'activit\u00e9, bases l\u00e9gales, entretiens avec la direction.\"\n    }, {\n      n: \"02\",\n      title: \"Rapport et plan d'action\",\n      desc: \"Synth\u00e8se des risques identifi\u00e9s, recommandations concr\u00e8tes int\u00e9grables \u00e0 vos processus, valeur probante (art. 102 al. 2 CP).\"\n    }, {\n      n: \"03\",\n      title: \"Suivi et v\u00e9rification\",\n      desc: \"Impl\u00e9mentation des recommandations, suivi de la mise en \u0153uvre, v\u00e9rification p\u00e9riodique de l'\u00e9volution de votre exposition p\u00e9nale.\"\n    }],\n    situations: [{\n      title: \"Enqu\u00eate visant les dirigeants\",\n      desc: \"Certaines d\u00e9cisions de gestion peuvent engager la responsabilit\u00e9 p\u00e9nale personnelle des cadres et dirigeants.\"\n    }, {\n      title: \"Fraude ou abus interne\",\n      desc: \"D\u00e9tournements d'actifs, fraude comptable ou gestion d\u00e9loyale \u2014 souvent invisibles jusqu'\u00e0 ce que le dommage soit consid\u00e9rable.\"\n    }, {\n      title: \"D\u00e9faillance d'organisation\",\n      desc: \"L'absence de contr\u00f4les suffisants peut engager la responsabilit\u00e9 de l'entreprise (art. 102 CP).\"\n    }, {\n      title: \"Gestion du personnel\",\n      desc: \"Harc\u00e8lement, licenciements abusifs, non-paiement de charges sociales exposent les dirigeants \u00e0 des poursuites.\"\n    }]\n  },\n  en: {\n    brand: \"compass\",\n    tagline: \"Strategic guidance against criminal risks\",\n    heroTitle: \"Identify your criminal risksnbefore it's too late\",\n    heroSub: \"Built on criminal litigation and white-collar crime expertise, this tool helps executives and companies anticipate, map, and neutralize their criminal exposure.\",\n    startBtn: \"Assess my exposure\",\n    dashboardBtn: \"Dashboard\",\n    langSwitch: \"FR\",\n    nav: {\n      home: \"Home\",\n      assess: \"Assessment\",\n      dashboard: \"Dashboard\",\n      history: \"History\"\n    },\n    assess: {\n      title: \"Quick Self-Assessment\",\n      subtitle: \"Answer these 14 questions for a first estimate of your criminal risk exposure. Each 'Yes' indicates a protection measure in place.\",\n      companyName: \"Company Name\",\n      companyPlaceholder: \"E.g.: Penalex SA\",\n      sector: \"Industry Sector\",\n      sectors: [\"Finance &#038; Banking\", \"Construction\", \"Health &#038; Pharma\", \"Technology\", \"Retail &#038; Distribution\", \"Industry\", \"Transport &#038; Logistics\", \"Energy &#038; Environment\", \"Public sector\", \"Real Estate\", \"Legal Services\", \"Other\"],\n      size: \"Company Size (Full-time equivalent employees \/ FTE)\",\n      sizes: [\"< 10\", \"10 \u2013 249\", \"250 \u2013 4\u202f999\", \"5\u202f000+\"],\n      next: \"Next\",\n      prev: \"Previous\",\n      submit: \"Get my diagnosis\",\n      questions: [\"Do you have formalized and effectively applied procedures (code of conduct, training, controls)?\", \"Have you comprehensively identified processes that could generate criminal risks?\", \"Do you have sufficient controls in place to minimize detected criminal risks?\", \"Have you conducted an audit of your legal risks in the last three years?\", \"Have your employees received internal training on fraud risks?\", \"Is there an internal whistleblowing channel allowing confidential reporting of suspicious behavior?\", \"Are responsibilities and decision-making processes clearly defined and documented?\", \"Does your company have clear procedures to prevent offenses related to employee management (work permits, occupational safety, legal obligations)?\", \"Are there clear rules regarding the use of credit cards, expenses, and company resources by executives?\", \"Do you conduct due diligence on your business partners, agents, and subcontractors before engaging them?\", \"If your company faced financial difficulties, do you know which decisions could engage your criminal liability (preferential payments, mismanagement, etc.)?\", \"Are important decisions (contracts, payments, investments) documented to demonstrate due diligence in case of criminal investigation?\", \"Do you have formally documented delegations of authority for important decisions?\", \"Do you have a response plan in case of a search, seizure, or criminal investigation targeting your company?\"],\n      answers2: [\"Yes\", \"No\"],\n      categories: [{\n        name: \"Compliance &#038; Procedures\",\n        questions: [0, 1, 2]\n      }, {\n        name: \"Audit &#038; Training\",\n        questions: [3, 4, 5, 6]\n      }, {\n        name: \"Personnel &#038; Third Parties\",\n        questions: [7, 8, 9]\n      }, {\n        name: \"Executive Liability\",\n        questions: [10, 11, 12]\n      }, {\n        name: \"Crisis Management\",\n        questions: [13]\n      }]\n    },\n    results: {\n      title: \"Your Diagnosis\",\n      overallRisk: \"Current Protection Level\",\n      measures: \"protection measures identified\",\n      categoryBreakdown: \"Breakdown by Risk Area\",\n      recommendations: \"Recommendations\",\n      downloadReport: \"Download Report\",\n      newAssessment: \"New Assessment\",\n      backHome: \"Back to Home\",\n      disclaimer: \"This quick test does not replace professional analysis. Whatever your results, our lawyers are available for a confidential preliminary consultation.\",\n      levels: {\n        excellent: \"Strong Protection\",\n        good: \"Satisfactory Protection\",\n        moderate: \"Insufficient Protection\",\n        weak: \"High Exposure\",\n        critical: \"Critical Exposure\"\n      },\n      recs: {\n        excellent: \"Your company has robust protective measures. Maintain best practices and schedule periodic reviews.\",\n        good: \"Your protection level is generally satisfactory. Strengthen areas identified as deficient.\",\n        moderate: \"Several significant gaps were identified. A thorough assessment with a criminal law specialist is recommended.\",\n        weak: \"Your company has high criminal exposure. Urgent corrective measures are needed.\",\n        critical: \"Imminent criminal exposure risk. Consult a criminal lawyer immediately.\"\n      },\n      catRecs: [{\n        low: \"Compliance procedures are non-existent or insufficient. This is the first area authorities examine.\",\n        high: \"Compliance procedures are well established.\"\n      }, {\n        low: \"Lack of recent audits, training, and whistleblowing channels exposes your company significantly.\",\n        high: \"Audit, training, and internal reporting practices are in place.\"\n      }, {\n        low: \"Labor-related offenses and third-party risks regularly expose executives to prosecution. Formalize HR and due diligence procedures.\",\n        high: \"Personnel and third-party management is well governed.\"\n      }, {\n        low: \"Undocumented decisions and unclear delegations are leading causes of executive criminal liability.\",\n        high: \"Decision documentation and delegations are well managed.\"\n      }, {\n        low: \"The absence of a crisis response plan can severely worsen your situation during criminal proceedings. The first hours are critical.\",\n        high: \"You have a criminal crisis management plan. Make sure to test it regularly.\"\n      }]\n    },\n    dashboard: {\n      title: \"Dashboard\",\n      totalAssessments: \"Assessments\",\n      avgScore: \"Average Score\",\n      highExposure: \"High Exposure\",\n      lastDate: \"Last Assessment\",\n      noData: \"No assessments yet\",\n      startFirst: \"Start your first self-assessment\",\n      distribution: \"Protection Level Distribution\",\n      recent: \"Recent Assessments\"\n    },\n    history: {\n      title: \"Assessment History\",\n      empty: \"No assessments in history\",\n      company: \"Company\",\n      date: \"Date\",\n      score: \"Score\",\n      level: \"Level\",\n      actions: \"Actions\",\n      view: \"View\",\n      delete: \"Delete\",\n      clearAll: \"Clear All\",\n      confirmClear: \"Confirm deletion of all history?\"\n    },\n    footer: \"Self-assessment tool. Does not constitute legal advice. For a complete diagnosis, consult a specialized lawyer.\",\n    phases: [{\n      n: \"01\",\n      title: \"Diagnosis &#038; Mapping\",\n      desc: \"Complete analysis of your organization to identify criminal exposure areas: sector, legal framework, management interviews.\"\n    }, {\n      n: \"02\",\n      title: \"Report &#038; Action Plan\",\n      desc: \"Summary of identified risks, concrete recommendations integrable into your processes, evidentiary value (art. 102 para. 2 SCC).\"\n    }, {\n      n: \"03\",\n      title: \"Follow-up &#038; Review\",\n      desc: \"Implementation support, action plan monitoring, periodic review of your criminal exposure evolution.\"\n    }],\n    situations: [{\n      title: \"Executive Investigation\",\n      desc: \"Certain management decisions can engage the personal criminal liability of executives.\"\n    }, {\n      title: \"Internal Fraud\",\n      desc: \"Asset misappropriation, accounting fraud or disloyal management \u2014 often invisible until damage is significant.\"\n    }, {\n      title: \"Organizational Failure\",\n      desc: \"Insufficient controls can engage corporate liability (art. 102 SCC).\"\n    }, {\n      title: \"Personnel Management\",\n      desc: \"Harassment, wrongful termination, unpaid social charges expose executives to prosecution.\"\n    }]\n  }\n};\n\n\/\/ \u2500\u2500\u2500 COMPASS LOGO (embedded) \u2500\u2500\u2500\nconst LOGO_SRC = \"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAABUCAYAAACvKq23AAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAD\/AP8A\/6C9p5MAAAAHdElNRQfqAxsNOi5KFHjvAABphUlEQVR42u29d5xV1fX+\/177nHvv9KF3EJBiBbtir7FwZwB7jRpTbBgTo4lpX01iTDRqIvYYNfZOmcHeG2LDDiqogHQYps8t5+z1+2OfGWZgGigk+X3meb1GZDhln13WXnuVZwmbEZPL30DDgBsm7B\/9\/XVjs1lz46QDg8nlr4MYpowfRxe60IUu\/C\/j7AeeFPF8QPHzClRtiHi+AdXuu43T6k8+lEcPHqvfbORz\/c3ZaLWhp9bq5CdmWREDYCUMNfrnHFRDINs1vF3oQhf+l+Hl5IKIQdUiImqtmIRvw4Z61rzxsphYLDZp5qxs9cfvqnged\/3inE49VzZHYyeXv44GAXieaBhiYvE4wt4oHyOsAkHDoAgkG9ZWN3j5BdhMhpuOPaRrpLvQhS78T+H8stcQEcKGejAGLzd\/J2AccFtQU6U2k1a\/sBgTT1D90TtEAlo782yzWVosIhgvZuI5auIJRSQP5ExEhgL9gD3EmKx4XoPNpiVMNcRsJiX\/Jf3dhS50oQudh7WeWuuZnDy83HxQXQa8A9rNLyz+W7xnn9+aeCIHtRrU1cBGKMbfiYA+7Yrr5LQrrlv3UjEx8bytNJspAE4GjkftZdjwA5DLgGcQczhATv8hKsYLxXhdA92FLnThfxCiiFHQGOiuOLPt2yiDgFOAk1AtBkn02OsgAWxnn\/ydCGgRgxj3qAuenI2IZMTzFmDMgcDtwE2ImYSYnsAqYG70Z8xm0zFELCL6X9TjXehCF7rQOQhWBCvG6wHyV0RKgIsR+SPwAqrnIyKI3A6MKxi1A+dPf6VTj\/5WTsKf3DMDk8ih+pP38PLyAVDVPVBdgUgdsAuQA4TAKYicCSwGzkb1I0QGgHDTMQd\/81\/b+V3oQhe60A5uKN2P86a9jInF16B6ASJ7An8C4sAiRF4BtgEqgUrEGEQ9OhEg8a00aPE8EeNJt532oniH3XTyzFkAAxEZC9wN\/BLIAFcDNcD2wOHAVohYEVkqIku7hrgLXejC\/zRUPQ2ygsinoJWsszMPAW4E\/g7ka5D9QoyJifEGA\/zw1vv58Z2PtfnYb6VBm0QOJhYXZ38hAeSJMVPV2lLge4AHWNAUyCJgDfAxqp8h0ltV14iI\/a\/u+C78T+OcB59CfB+TyOGGkn27OqQLmwVijMF4PtYGGPMRcD2wI7A70B2IAePFj52E6myEL9yNIogAtGri3WQN+txHnwNVtemUzaxZqYgcjcj9kXD+Qctny6+Ao4FHgBOABUAeINcfuWfX6HbhO8M5Dz\/DeY+\/2PR3taFo6H66eqcLmwvieVnxvAZECoC\/AkuAv+GUUnCOwW7AbYjchzJ48sxZ2HQKm0m3+dxvY+IwKJ6XV0DugCEAXwAfAX8GJuBU\/BU41T4gEsh+fuEKRAJgIc423YUufHdQFbVWwGWyBrXVhA11EtbVMHnmLCY\/8SYA55e9zrmPvdDVX134TlDz2Udk1qzAWQu4D3QlMAUYgZNzH+L8b3GgN1AAFOZtNULEWSBaxSZrFWffP9OAECvu3hORM3Bxf3UgTwA9o8vWAvcCI4EloDdi7VcgwZTk3rVdw9qF7xpn3\/+EiOeJl1dg4z16kdt\/CNWfzgEXZZTAmfXqRAREuP6IPbo6rQvf0dybKRoExHv1VWBf4BkgN\/rnNM7MkQImo\/oyIheBXg6yAmDKUXtt8MyNtkH\/9Jl3RVXJVq6xfkERwM44rXkhSCXO3gJOay4EJgPzgLPFeAttECTosjt34TvG5CfedNmralViccWqZKvWnpKtWjsfkfeAfli7RjwvpaqFqvpjVN8\/f\/qrz0vMB6TVBdKFLnQW4vliYnFPRLKq9mOQu4AjgIE45QCcBr03Ih4wNZKZBqcsb2BR2GgThw2y2HRDjoaBINIbkbXAr3E7w67NnjkTF8mRwmnSGVQ9kDRd\/Btd2AzrA9V4pmKVaBh6iOaCfglaicivgBcx5jIbZD2cLfAUYB9Qg5KrtstG3YVvBz+\/UL28ggAQkGOB2aCnAYuaXwacBdwAjEU1japgbauZehsloM+f8SqxwmLVIEjHuvXsCdwB3AdU4WL8mmMnYADwe+AHqK5W1e7iedLlTe\/Cd4nzZ7wGoBgh0ad\/nnje7xAzFSQHaxcB44HhwMni+ZcBF6P6Z9DrxY+NRuR2MWbo+TNe4\/wZr3Z1aBc2CVOSe+uU8eMUVYAa0ADkPGBoK5fHgT2B\/qh6Jh7PtPbMjdOgRfxsdaVncnItaAJnWx6JCylp5A0NgW+ArXDqvQWdd+v4cVkNggqbbugayS58pxARH2tjYrwMYvoCP8KFef4IMfsDXwGvA5\/hYvMnI3IySF+cs+ZFkGoxIojp0qS7sMm44Km3BRHEeA8B7wKH0ropeRHwNSIzMWaiDbJNDuzm2DgbtJILhKBDQY4DpuLIj77POmFfDdwSLZBc0Lc0DBM\/nv5KYLOZsPrjd7tGsQvfCpNnzgJVgroal8FqzIGIFKL6OnAgLsRpCWAReRAQ0B+CVAN7APnAIcCzkYnuxyKyRsUYiTK8znnoaTQMueXko7o6vAudhoYBiMTj3XtkMmtWLEHkWVxUWy4tFeKPcY7DGmAtiiCYM665JbzrorObLuqUgD5\/+iuI57Pb+HE1b894zZNY7FfAacB8XHhdc62jO3AR8CLW\/qz2y3mL84eNykdEbzrm4K6wui58F\/BU1ca699S8gcOo++qzDxDyELkcZ9+rBD0JZAAu7h6QBOjXwCUgfYCDgf2AwcAkVc0gshhktbtcJJrVXRwxXeg8nHkjm1mzEsTsDrwGPIwLpNiu2ZVHAYcBD2gYvirGxFEtAlaf8+BTarMZbj2ttJMatPM4Fsx5\/v0q8f18oD76GRH9NGIuLntwFDAKoaFg+GhFpDZqeBe6sMk477EXkFgcQEUEDYLd6xZ+cTpG7kL5AGEkLpSpeySEFwC\/AupQfQ+RW4C\/o\/ZeHH3iSGAlsC3wLPAYMHnyzDcy2apKpw11oQsbAVVVadzURbaN5thQXMr3+ogB+4nnbQ18oUF2TdMjnLxUszGvDjPpkYjcC+wF3Iqz7TVHFfA5UAb8CZFqDcOiKeP3Zkpyn67R68K3gvi+iBEPESuep9E8PAdkEiI\/jxbBYuAfOKfg48An4nk3I\/IlcA3wGWKuB34CPAx6LM42nQ8URZFG8Zz+g+hiWOzCxuKGkkjOCWDtP3FsnqfgfB3rw+LMHvcAPxc\/hoknMLEY4seATjgJf\/HW13g5uSHGVOO8jiXAWOA4oG+zSxsXzFHA82LMQxoEWZydpQtd2Ggc86Nz5dhzftpkPhPPSyCmN1CsqqcBPugZoKtw7GEjgTkaBr8GXgWeAl2qYSijjtwzJSLluOzW7XHZXNuAXIEzdVwB\/ALogcjEoKrSeImcFmnjXehCZ+CUaMnBmCywFHeSaw3zgBdwJ7hhgEkt\/0a83HxttJV0aOJIr1rWTa1NGc8vULQIpyH3AgY1u6wS+CCa6BbIaBgY8WOqQbZLQHdhk9Brv8NRa5lcchIAYkxKrV0J\/BgXORSAnARU4BQBH1gBkqtBMFtt+LqXyAnDVIOZN\/0Vc+PEA8LJM9+oRMwvcCQ2O+MKSgB8AoxApBLVF2yQsapWsBa67NBd2Cgoam0oImDMtjiH4Ee4qLatm104AucDeR\/Vq1BLz3GHDLCZ1NLUssV6+lU3ti2gz5\/xKo5lSevE8xKK\/g04BngveuHRzS4vAHbA2fOuBH0A6A+65obS\/VJdA9aFjcG5jz6HeD6oojYE1QQik9Ta92wmvcDEE31w9juAE4HiaAFMAx4UzxuH6nLg\/fSq5ex9Wqk9BMf5iJIT1Fa96hcWvwwcj4uRzgEmRs\/6CuF4L69gdcM3X4ufXyB0CegubBRERchijAFOwsnK6bjM6uaIRz8jEMn3C4qDoLZ6dVRdSqA9DVqMiOAhksWFiIzGCeJ9cWncjUhHL+kJrAaeBypBaqArpbsLmzK\/jSAi8e69bFBfC6ommnf1Jp44DWde+xy4GaeVHA58ieq9CEtQXYES1i9aIIjw8k338NaAITq5\/A1UNfTy8gVn4oiBngPUgvwMOMjNcxkNpHIHDFli06lM14B0YWNwQ8k+nPPQ0\/iFxRbnD\/kQ+CPQp41b4sCvgrraZ0DujXwfAu3YoMUYH2MKQApwducFwBO46I14s0tX4lK3Q+ATVBtAeiASSpeT5X8CpcccR7KkhGQy+d\/TKFUvqKsxwE6I7IOjE1iG43YZDVisfRynNX8czc0alEIvNz+FMdmCrbfRxkgME4sLxhgRyYiYEOdHudIlqHh50Zz+DLgOZ8t+EWMOklic86a93DVJurCREMGd7Bag+gQuP6Q1rADux53kTgdyxPPJ33pbBbRVDXryE28SNtRlY4XFVTYIJgH\/wlVGmUlL7RmcDQXgJdAfolqNSK8pR+1V8Z\/uopJJR6PZ5gpQ89NqKydXEcrLyr5b4XfcCdiG+vXeJesix1sJP0z0G8xjt9+8eftm4iQXRqZKw1fzSAwcmos7DW1w6ik95ljHWdvYVokar43\/cd8jxqNs+rSNfv\/647PozmsVMdmtf3p5X5tJ\/wsnkE+OXpaN5uByjLkSKAA9S4NwjonFQlXtFdRW14ofG6qqXv6wUfPF88HaGNZ2n5Lce+XZ95WTP3ybWWF97dFBXc0Qm83ebhI5BRhzB+jtIOOAt4GVJh43RWN2l2Qy2W4Mf3l5+RaZ06XHHY9Np4hs49FYRHO5eV+KwS8sYtr9937370+lQFs7HDeuqSYFEBAkHqfs8ce+\/bvXn4etvrslvPxCpj\/0wBaXPRpkAU2gpBHZDWetWIsLQy5qdmkuLvhiDuhlGgb14nlFJhav\/fcl51lpQ0DHgFCMsWrDQ0HuxR0J24v6mBbUVB0TK+pmVfU\/xgw2fvx4V8BWFa+wm4Q1ld0RGYjqYFzUSXE0mhbn3FyOyGJUl6BaRURD+W0E9Qk\/+yV1X3wCqthsBhNP5IP0RxiC0h+0RzRgCtQBqxFZgrIYdDWq2UYh+F0u\/OSECW5hq2LyC8XW1\/ZBdRfgUJBihF+Ul5VVNl1fOgFsiFqLGC\/PtV9H4BzEUVYpqxFZAHyBtRWI4BUWM\/2B+1ofn2TSLSUbIp5fDGyF6nAcb0vCPVNWI3zV64AjG4q23\/VKYKCqfozL\/usGXIvqVETuie47Nrr3G+A9DbIJ8WOPAjFUz0ZkDMLi3gfu+eHsY5PhVj\/4+YCK15\/tXf3JnBHxnr3P8guLj+x14Hji3XouVdU0sEZEzlv57NS3+k86I2\/1i2X91r79ShGqQ4EeIAq61o2ZLlJYJWBBEK\/zm1RnMeH4Ewkb6tx8yqQxidxCVLcCHY3z\/udFc6kKkUU4889XWNuAMd+J0pEsLQVrG8ctH+iH6pCo\/xvnM0ADjqR+GbAEZKXaoE6MB8Zjt\/uncVlB57Ppk8kkGA9sSFhfh5dfUAQMQBkC2j+aD2a9tbQU1aXAKrU2JcaA8SifMX2LyKDzy15HwwATTwBaBPI0LsLtq2is+rZy2yrQw0HmYMN8xDRMGT+uDQE9c1YcCBHZD2fe+CpaHBPbaNNSHCnSKtDX6hbMq0AMd5x\/+hYTzMmSkuY7aR9U9wE5DHQ3YCuQYtwxVprt8AqkQdeCfAn6KiLliLyDtWkQysvLNrodGoaNAm0XlMNA9wVGgvQEzQFZf6PLgtaCLAf9CBd684KG4QLxfYsxlE\/ftMnVJGRVET\/mYcP+qO4OcgjofiAjgVyET0AOLC+bsbpk4kQ0CKh880W67XXQ1sBRIEcBO4L2cll5TbqCxcW\/fwbyMOgDqC5XYObMmestcEXVxkVkR5DxoIfibL6NJYGiIRELWuPlFVTkDBgyN6ffoKuKd9rrp2rtpOhxD+K4DHKBl3AxzLfjHNg\/AnqB7gpSJWL2QDhdw\/Dr6o\/fmbz65SeLY916nmkzqd1sqqEbEBM\/Vtf7kNK\/F4zcfh+19kAxBpvNXLvm5SffrPnso7GoHgI6wm3u4jfqSECt2xRkFuh0kNdQW\/1dCUWnrTa4+eR5haiOjcYtspXTa117mvouG4UdvgtyH8JMVGs3dbNvMnsZz8eGOwBHgBzsNgfpSYsU5qZ1FYA2CuoFwJvACxjvnfIZ06s7++6SCRPdKcvzcgntbqBH4XwRw6ONMrFuPTet\/SxQD7IS9DOQ13Dmqo\/KZ0zfIkRAk2e+YdQqxvct4Kvqr3AO6G1wGnRrqEH1PEReNb7\/tc1mmTJ+XEvC\/p\/cMx0RIdajD1gbx5iHIqH8Ic5BOLyVBytwEdbegDFjUZ1Xu2BunRiPO84\/fYvYoJPJpDv2eN4ArD0eOBlkDOs4WNtA86NY49+pAGYg8jcR+cQkEkx\/5JGOJ9PESe5YI5KLcghwFugBuKy2jf0kjdKSpyFyZ87QUR+nvvpMO7PATvrVZdR8+l50BBYwEsPawSB7OoEoe4MOB4m3uFH4EOQQ1K622QwmFh8BnBaFsY2gcx+h0WK4SMPg\/R3\/dCOVn37MNw\/cAsb4WLsn8EMn7LVPx4+MbCgib\/YvOdnPHTx8G1VdiNMa892moCeA7Aj8Bkc9UCgiu2JMeVBT\/QubST2cWbNy74ZF86n7+os1tqG+kCYfSpOdaUXRDrv+oNfBJcdpNnt8esWSRNWHs6sbvvm60KYa\/E6OXx3oy8B1iLwIhJsqpEuPORabThHU1eAXFA9G9cgooWZ3oNuG7Wmcx+vPZ1LA46C\/QeTrjW1PMplEPA+1dgdUz3WyQPp3MF5tTBWtAbnB5Ob+dsYjD3cYPJAsLUVicaOZ9D6oTsaRDnVvMg9ulGTR1SCXlJeX3blFBHT566JhiIknUNUBbrOS4UA5rWvPtTiH9zZAtQbBD8RIxgZByygOE4sbwIgxQaZ6bTZW1P1RXMzznqwLa1ofFsgg0ktE3nFLSmVLRSZFO3wckRKsvdhNYjFuEFtM2DVABcJQVGPu9+tPJAHoAXoGyi6Knp2trpnVYRtKSrCpBiQW2wHll9GmVrDB84VKVBfgTCvdgaEgPVp5pIAMA36GMin11Wc3ALcnk8kqv6hbu3bFJQ\/dStGOu+eADAXdG6uHRuM3hKZjaBsCRwhReplY4hTQs6MJszEQ4GDU3iIip47YaasFS0dv5X3z4K1DsDoZ5GSaPNnSycchqI6rePMFesYTr+cMGHKxBsEtwBj3TfJINDf\/DTyF2mnZ2tqC1NJFybWzXyyw2cwozWawQYCI9GxlQ8YkcroVbrfzbZmVy3pWvf9mXd3XnydsQ333Jvtu5wRCfrTx7IHqtYhMSZaW1pbPmLFx87mkhLC+FvFjQ\/z8opNQewqw\/bo53WY\/tdanOTjbfTHww2QyubyzWnTJhInYIOsThseBXAaMauX5TlMXvgDJoNoLke1Qtos20OZtLAQdYdMpQyt+jpbCeQKo5msmfQ6qv3BCTdYbNl2MyDu4QiGKaj9cqO82G8oq6QW6NVsIqqg6O7kA+4IsxJHHFbRxizPNOEf3XNQG4HmAM3Ec\/9NL6LXf4QS1VYKIJHr1K3DlWFgEugzkHie4NkBUf4s6QFG9KFu9NvQSuTQsWSh3TD5js0rpSDh3By6OeFeLWpm7i3CFA6bjPKanABeh9OrEK17AyLHlM2asbbMNEya4MDCrpaB\/Btm2lctChOkg\/wD9GCUFmovISOBklFNZV4mmNQSgDyPmNxpmv7YKTz75ZFsLa5CGwV+AAyNtZz1zirYuHIVPgb+gejrIgYC3oUakdE7rFUBv6bH3IX9oWPzVqQ2LvzwZZKfmQrHzQnrdc\/OGjV7R57BJH0nM3w7luWijuwBARJ6qXzj\/3NovPp6WXrFkTFBThYZhJ96lmEQOeUNHkVq2iKC6ssVKa3KIbtwpKAM6BTGXo1rTGTNZMlnS+JpClONBzwfGNmsAnRrHti4WLkP1T+Xl5R1qr0ef+UOya9d4GmTPALmqxdp3io+CPIXwJ8S8n1nxTb3Ec8gZNMyEddXdUd0X5Vc4u2vzIZiB6nHl5eWZ9vpBPC9Xw\/B3wM9Z\/xQsBMA9qF6D8b7IrlmRAYj37u9rGPQGjoyUpFHr3Xd1Np265Olnnt0iQvrcR59D\/BgixpdYbM9I+BZ1cNtrqB6rYbACkZiGYegD2Exa1IbkDdmahiULLSLdcI6XIpCGdoTHYqz9M8Zo1JEWqyZsqNPNLpyd06IPyNWR0PVambivInLxCdOnv\/VQSYkigpeTd3WYqv8Il9o7toPXjEF1EM772uoGISK+WntGJJx7t3KZRbgDkV+iunbdJKce1TUmnvOOzaRfBb0WZFAb7fBBTkZtH\/H8sz0xC9pciapVIHMiu7dpTRK3gREot4DkNftdFpEM4KHazN7XnmBoEmjHVcx6oT\/Od1HQJJiNUfF8wVqrYdDsGNOxsEktW9Q3s2Z535z+Q1Abvo3qDIwZCwxT1VdyBw27NKitDms\/\/3gOqju3cezfoL02nab2sw+dnV4EicXxcvMRz7OazZgw1RB55aWzgjIOcgGq9Rjzp\/HJZGZmO5prsqSkcTPYFtXfA5Oa2fkDXJbjbNAvEKlDtRhndtoLlybcEWWDoJwEcgfOkdp+Py9ZiEnkHAjyZ9ZXzJxiOAc4F9WvESjYbhcKtxnL2ndescAarJ2OMV+g3Icr3NHYT4kO2yqIhuGpwIW0bqIsF8\/\/uQbZSoDi3fYj3r0XVXNmBSjLVMM7xPhfg96D6oCmsVES7mS\/pZKOxAAGIwFOkajqhIDeBrS3eN4KVLNKdOS12QyazZpsZYXN6TsQm80sQeRE4GIcrWhb6IMxNwBXAS\/lDRlBVeVs2dzEdcnSUlC64cqbn9ZyhTT971uI\/FjDcN6jx5\/Y5CApmTgp1DCcKb6\/ANXLUY6mrYQdoYINK8UAUHrs8YSpeiEITnDfL93bWLSzgcuwdm1rx8uSiZOCsKH2ES+3AByPdo\/WbeMCcCiq14L9UbKkdGV5WavH5xrR8BoV8wJwMcJEx+Pdpp2y8RUuq0kkCzpLrX1Sg+AjP7+gXsPAFz8+2svLPzOortxBwyDehhbefPr3RJkACiJhrHuvmtz+Q1Ym+g9O+IXFW9lM+puKWc\/fKsacHNRUbW\/TqQ6FtG2op37hgmxOv8GLEL5EzLaoXhixJVZizM1FO+z2YtWcWTdlq9aeA5zpYvJZ39zVqnD18wtq8oaNriwYsd1Av6hbVvyYaDYTz1atTa1966WnU0sXbyuet95Rv802x4CfYsMPBX20zbmcTEIYguftj+o\/1p00mvApwjHix77UbEbVWreJ+DGjYTgQ9EyUnwPFHZhihiGM6YyANoncosi00KfVZwoPazb79cynnmr1\/gknnER27apPTSL3CuAulPxob8+hbScZx\/7kPFJLFg3Dac65rVySBv6NamVbpprkhAl4eYUvhbVVU0D+1Ox9uXkDh7LFoC5aSoxJADsCT+EiOCbQuqmjDrg9yiEpnTJ+rxk\/+fc0t5uZWEyDumob1FZjg+zOiPwWl5CS004TXsLxnB4IjNVslvqFXyB+zJqYv9lE9MSTT3OTX+3PQU5tY4WsQfgtNpwX79mH6Y881PQPZdOmEuveA1TnIfIThMtw9unWMF1i8aWtCotUPYLsjUt26L6hpIomlHAjIkvbmlBl06bi5ReCMVMRbiYK12r9eQIuquYX4pl4a4kl5TOmoy5IZI545kfA2cAnnTNN6Gd+YfEv\/PyCSaMuueruUb+6esnBjz36av7W2z477Jxfzxt4\/I\/6Fo3Z\/TGMWdaqJNANf+EXd6fnfocH\/Y464f7eh5SeVbjN2HTuwK3IHzaq1+BTzus24Jgz63rue3iViSeq21duXPhjzdz330uvWTFBxLwGHBC9dT4iq1E9S8Pg99mqigU99z\/89xg5FfRVFNu6pWCd6SZ3qxFhv5JTvN4Hju+VO3j4olhxj\/P9vIJPY8U9yNtqhAw45gdP9Dls4i1eXsGTUaRAZ1AEcgnGG1B6zHFtfJaA5+2C6i0thXNjzDkLxfMWaZDVyWVlDL\/gMo4vK0NtaEEXix\/7M8I1QNCBbphAGdZRgyccfyKg44D9na96g0tClPkmJ7fNZ0x\/6AHiPfuBmCdQfbZFG0TazF7+6tYbQTgKF6HSGmpRvm4vjLF8+nRsqt4icjcu\/d\/1pRBH7RaplnPuo8\/h1jEBYgbiFMkjcanebfnyVqL2VuBLIpZQGwZuJReM2I6gpkrjPfso7kglwNW05NtYHwGOjekEVO+JqEv9m084nJtPOGKzfXx6xRKwejjIZNrWfB8Wz3\/Jyytg6t0bOm6n3XevC4NSKk088ReEs5Bmg+n+fAG4AWs3SFBIlpSCSC\/gcpDB7Qi9T1Ce7YgL2zmSNAC5DfST9ntABOVHGoYHtWWeLC8vp7y8HFWt0zC8G+EKmhKMWj+mix9ryB+x3T\/Ove\/uKcPO\/V19UFdzQ9hQ\/8KCJ2cnex86cZjNpHOM70\/tue\/3Xu613+Hi6BC1XYFvcnLpdcBRFI\/ZIxEr7r67DbI91Ya1au0atbZCw+AXxo\/tUbjt2HdNbt7vgfpmgmm95zttN6yryVn4r2uWh\/W11djw\/6H2o6oP3pKq998URKqBur7jT5Dh55zXYFMNTyLyS6BqXVJNqwgTvfpNS\/Tpn1XVXLW2SK3dTlVzVXWJWvtvIFm43c5XDDzurNfV2n9shJDeFdVjTV4bwb8i+Si\/3tB30XQ0Xya+H5SXlXG4CFMO353vi1A+YwblZWVoGAaI3IGLfW5FR2iB\/I4aG3ER74PT9lqDQeimtn1T9rQH7gW19ZGgbAxvi0Vp+62if+mEGMqBtK1NJBCKOsp4LZv6OIm+g5bhwjE1elxOWF+3RQS0eJ7YIBCTyAEXgvyXSPCW0nZkWT\/EXI3IDiLyETjTswG466Kzueuis0HVixV2+wjVm3GUjG0dRywu7OVKnE2pwrktdbNyb0w48WS8vILewCW4APXWsBa4D9Vsc825VUFWNgMNg1CDYDrICQiPRkkS9yNyNqqLyqZNbWWKGsHZvQ\/oQJa+bHJyV3UmvKl8xgxskF2MyP0tJUlrQkW7oUxGNyBf2eCZJicXlJoOpCleTm5O9z0O+MXMZ9\/bM6it6o1LQqnAeZ+fAv6iqg9hbaZg1I79cvoNQltkrrXa1jq\/oHheVDA4D7gL52n\/O\/BbIO2mjXYbePSZY3L6D9amzUzbkjLSzS8oKkoefbCAZFXVuoAcQ+WcWUwZPw4QXfncS1q43c7gQpiC9qQWQO3nHz0FPBAtpFrgZzhN7nVUrwMWqbUL\/aJuc4t32utaLy\/\/xU6aMw3KSUHl6h5tSMRBwN5t3LsS4b2gtk7bHuPpgCxHeGe9\/bGVrqND4jITjxtEtm6nvySa9\/Hx48e3+6zAWhB5Ffg0+lUeIrF2dod8WiW21+YbzP42kxan6beN7NpVitBILwuqeTbdsHE1WDcRam2jgzoHGOzl5t+MC7FrC1FSD8cCP7TZbOz8stdpWLRgvd3MmL2zNWsHIrITrduAwNlkP4x6rR7IotYzjmB6swro6Q\/eD+jRrCtQ2xreF2M+6Gw2V9m0aZhEDqidi8iPETlCjPkx1n4h8Q03u2QyCTYciOpZtE\/XGgCzNJvptLnH+L6ClEUDRtuLRAAORNi7ZOKk9r+v8ym2AnRTG\/4UpBwojErGG5xHfHvgEFU7xyRyyuO9+i6XDgSCBkFDw6L5v0LkYOA2nJMkjjvu\/RiXtn2Pqj7j5RecmTt4eH77zXN7CeDVA1OSe+MqxIsi61rwr3NO5cZJB\/HQ368iqvXWvuYkIoXb7jRBjHkWVwrrj+uEOocgMhMYh+oFa199bmrvg5NDeux96IvA\/HWpze1iDLDrpNPOaO3lGaSRM10VdCnoDISfIhwhnn\/3E0892X7zPRPiChV0IDnouESMVeMESzvfpZRg7QQvkeP8QW3gqZkz8QuK1iDcDfoq6LvQXhs0Qaua+zpKcJQfmETOnkFtNe3N\/RmPPoKJJeYj3Av6GiJzEdkyBYFVFbWKszXvGjbU7YdjTmwLa4HlwKug9ziyJM25\/8+\/d1wc5zz0dGM0z4dRQPVNrOPYWB9FOM9xJXAhqs8j0hfVVVOS+2Q353cnS0u7Y\/WUdgWj8KbfvXfdxjy3UUtOlpSsRXlXVShvlgXX4vHGQ9UeDrJdm3LEzetK4PONSfstLyujZMLE+S5CgQkdXJ6PMgl4Dqftti\/bOpAhYTpVkVm17Ffx7r1\/HAmU7UDuxJmxvo4mUS3IDWK8e2u\/+PglxPyt3Q0nHi8UP5aIyk\/tinOYvocr6jAsEtAPovoRyDYmntgRkeF0ZDDXltLj7l9N7kgwdbg5ebl5w1B6ajazWGKx14BfR5lyUQYlIHJSt70P2tlmMu\/kDxt53UrVWLxH78vD+lpxTk7aanoesJ9XUPTs+q0RYxarDa9BGAfyCvAaIgs0DF2Kcmfm79SpJEtK1h09pM00hA652aMA3mzrk6bJqdoN9G82kzF45rFkSUkgfoyyqY9vKO\/TKRXPv1lteAeINYmc9rT4DJDqIPJmGKo3izEX7vDI46\/opBJti28jveKbdKxX399ibUw8P\/SLum1W+dSIm449lMkzZzHlqL1Wn1\/22sPi+TcCu7VzS6MsuRerT0T7iAdRyIt4vojnebhQkFwc70ab6w5nR8kBvhZj0qgut0GwWQu4TTjpVFyKMru0J2eAj2x97SY5KcvLyigvL2s3Z1\/V5uCYp7wOhMEaXCD\/RkGtTQOvdE666L5qwz4dP7Sdf2g0dQbZVJhOVYKmo4UyD1eA9SLgESAJOhsoBg2D6qrq1neCdf8f1tevyqxZsQTVq3GV333Qe4CFuNPWIqAIkVKTSFxQ+d7rV3ZKnKIc01llSNpb69oklSpmv3S1V1B0p8Tiw0FuAmaJ5\/0KuAN3olmGM2v9Fbjeyyscljd05IuoLmuMEBHPW+9dzS1VunNqycJW7I8a5PQfcqNfUHS6BsGtKJ8AqVhRN8rLymjVxNY6\/CbBpq0OvEbj2i7ChtoQbTzBtdvHQ0BvIbRXAlvZVAPJkhImndqS3mHGY48CZF26udaLtENBLNKAsKpjh7bsBNz70aSSnwG9gtqqVpkY+004FZQ0UAvasCVLmGkYxM6f8apn4gmLi5zpjHwcBOTabCYEqYsGFUw87uOOngEu7vEtoB\/uaNuWzWgBaK5a3VHD8KOWrHHfPcT3xXEiSHuOjgZUv5n+8IObsykDUXbtxHUVILUb+3C\/uDtBVcX7uLCb\/PaTRGQrVEfRwiTSSaHVaOONpqyXm98nd\/Dwf7p3MgPVPyJyVTRpRIPsSvG8SrXhoZKTVymed0br7WoWzidCrLhHT1CJ5tZAkAeB\/rgirb8GHQpyNqovB9VVteLH2DAsbr13bMxJVTvqCPenTTWkURugugKRKagu0DD8IXAAGnFGO2fcEGC0zWYf6Hfk8WbVCzPyauZ9iInFSPQZQHrFUlTDVjYshmLDYmhpBy6bPp0Jx52gQNB93MHc+\/uLv+VCaf7NLd5vcSeWjvpLET5Cm+rltdJfTf\/fDfQXKIdGWuJjmYpVa5MlJS24SDq7yfgFRemgpqqx8kgHJz8ZBFwFmhTxrlf0mWQyWY\/nNfHW\/PuS8\/lPQTxPUVTDcB9c5Z4ZuCzafdu4ZRFwB0ZON\/HEc\/UL588966Z7MN\/\/y\/UcUbJvkLfViHpgD5wjZwTwfjtSfzHoT0BqEBl+w4T9qf3iE75\/5T822wcHVWvzQXbvYHI2IFK5mft+G1rPp18fVajd6F1r2r3\/BmdSWN324mhCPm2HJLVxa6uhU4gxvogU4zbtbRG5OFqgvwW9TvzY0Yj5MaorNMim10WmNBOi0vJlXm5+n9whI27AVTW+DldoeCjuBFYJ+h6qT6CajOXkzhPf91psHq1LnY1LNZBO\/l6Ea\/cZDSI1wFSUlbhEkAMQBiNyFs689wLO4bOT+P6Yoh1361a43c7kDhpGZs1K1IaYnFz8wuL1GirdacOxPf2Rh5j+yEPfVjhrB31j6YSJIzo9vk5nbNrrOnIn4CZUHxbjTQDJSyaT7dqnW\/2AMFTcxl3b8lva\/CgP5CDQe8SddPYVMX6ypITx\/yFu8wtf\/FB++twcAQkQLM7xd0zUR+1EfFFW+8Wn94K8jLBcVUXVBczKw3+5noYlXytoFc6b2Bt3nMtte7AlDnxoM+kZzUZq8xnh3VF+eNtzREHJRhVgNidGOgGjHc3bgE11mhqzBumMVqwCDDlwpx06sXS1XYlls5lam828BLyMi9c8GVdhJAUyEHdMe1GtNcB2sR69ezU3kbS2jsR4cTFmcCSY+kZ\/VuMI9h91fCGSj7AQCFraTrWTkrZTYqv938u6\/045ai+qPn4n4iXRyx2DmmyLK13UDecgfxNIqbU1iT4D6noflKTP944md8jWiO8jnk9Utshp+25+5tKJMLdNQRTRYDrsCenUMRvxvAUID28Y5kg7gR3EgENB70Xtv4BxICZZUuK4NTqB6Q89gBhvFsKzLdZ1O2n60fsLQE4AHtcguBbYVmjOcLnlkFqykNSyxWKzmSiZUO\/DMS12B7Zq59Z9CkZudzHwNchal+hiMc5x3JSGuQpI4uIH20J9NBkeB04z8bhe8OTsLfHtjTzKbYyTfItV3DlcuqAiagedmDSbDvH8epxXt43nNRO2Sq+cnn06iFJYr72y4QU2napc+ey088X3S5zwbHLEXQo8g7NFf61BFlU9IN6j9xBU7YbH6XXtVQ0DVbsat+kfjQtdS4GeK8Y8imqAWjvlqHFcvfeoDRv9XY1mp0jz1uHuS85HjGeAxSBv4lKt63E23DOBy9x3cAFiysUYTCKHbrvtS7+SUyjafheC2mrUWuK9+uDl5QP4GoaJX81b8518UsnESU1VcML6WlDyWhuDZn0Qsi4euX1YDYAbEHl9g05sOjm1RZovBSAnAo9h7f8D+qGW0mOP79yr06laXPjul22HWrY1sNIbmIzqtEZunmQyScmko7eYgM5UVpCtqmjcVQ4ESaB6FRuciJsQ4E4NRbjQ01GoJW\/I1tpr36M0IroWBXYA+SNOQ2yPxewpXOD1u8BiEdOspMNmzHMX6QWS08FKi2FtYnM1QZ3GWvTtpEHHCBvqA3T9AW2LZEjzvESObOSHtNrBmTUr07HuvWtBr8OFwf0yurobzi74Fy+v4CrxvFl1C+a+h0j7XB9Wg6Cy4irEHA180aIJYTgCYSnGrG2zG7+L2SRsMj+TGCOo+qgtx\/H5noFLPMjBhVB9T0RGBXU11H35GbHCbuQOGkrxmD0oGLUD+cNGYRvqCRvqQYwp2GbMIDHinV\/2Ouc+9vxGC+TxySTJZEkjsZKH8xMdDFwacWt39JGdOtGVzZgOqotALkSY0\/KxnSWPkv7A71C9HxhX9e6rnRKUvb83CeAdhAtxdtlNGfRRjtuGWxEZZdOpLSakg+q1GlRXqovE0NGgByPyD9o6\/btN\/yNXyYcLgXkoPqrmqp36YO6+9KcUj9kdVD8DpuC0nL3bacNhwLnAjTadegKnTcfu\/vWF3H3pTzfflyuN9tG2kiIAyQXptrmakF1dBW07Tddvby7tx0m3CT+\/QGm0w3W8IGyH4VidFXSqGtRWFYP0FZHbUXs9zrb3Gc7EcTZwkYbBpbEevXt3uEg9LyaJxOCIunQwzjTwc2AbRB4EGYy1TH5iVst2diicN0Jy6ybfanFmgd6ImYja50Dn47TpD4E5wImI7BzUVLHm9WdoWLoIDQIwhp77HU7fI4+neOe9ETGIZ8J4j96FJrRGjOm0OTBZWkoyWeLImlTjCKNAT9Uge5tLo5YZjtSoVRbF5t8dIJLq9NeLoEHmHdym9DSNwY2dvr\/xv3IQyr2FO+w2Idath3RkG77r5z8B0J1mzChHOAsXltm5QWzRoxJHORHlHvG8XdeFQW5e3P3rCyneaS9MPEc1m70d5ANcUl9bSX95bk3ISag+79b9uu8zZ1xzCwhxDYP6aCF2oKVSiEta2NckcqyGYUhnvMPfHn7TELR99MlFGFRy9DGbpQEahOCOuh1LBaEYkU3S5usWfwVo52K5RWplk7hPNpRc4nli4vFq4MNsVaWAFKH6d9BDcKaOukiQH1647U6TO5J2YV3tCvH83qieieMV\/wJn7lgNXBP9aWi0n0onhejGRHFsIAq1g4XtcP2Re1I5ZxZYXalheBdiRkfc00eAXo9jQ6xCFQ0CinbYDc1mWP1iOWvffsXZoWMx8rfeht6HTqD3wSUZP7\/wg5qvv8wCfb3cvN3B1f+c\/MSbLd5delxjEd8SN++FUcAPReR+VJ8BuQvkByA70Gm7tlpXqaZzKC8rwy\/qjlr7ISKng\/6JJrNbZwapBYajekNm9YqDjed36t0fTDpaUZ7DyAkItyHNi65K56a0wx6o3iqet02yZOOclt8CcdVwNMaTSAC3ZftfgsvWBUdMVYgNnYMxGivjvlbyxfPioFvhVO4q2mBxi\/A1zpk0DCH3+iP33Pzxhc6G1tF7DLCDxBKbxRYtxihKVcczQ0DpjmrBprzn+dnvbMwKWCHepgjo1gmZTDxuQdNhql5pchLLElSfBs4B\/h\/IJyYW79PR89WGgabTC3COwQDH5DUT5C\/AJ4jUqaq0UgLsu7M\/b2B4k84ubAApGT8uBK1uKe5lEnC1iMSC2uo7qj96e2HByO3JHbI1qZVLqfl0DjXz3ie1ZCEahhSM2oGCUTv2LNhm7Amqdi+gCOULJ5i1J7h5kiwpJZlMElSuBegLeizW\/isSyreCHAOyFeuodVMInyDcgksCag8BajdKjZz+0APkb70toCsQuQzhGIRHcCWl2u+8DX89CNU\/qrX9O1M9vmza1MZwy\/ni+RcApwIv0rl44vUaILui+js2k5O2ORxRklqQCvG8A3H29Bxcotf6Sld3nKlsEXApyBKMGTk1ubfcMGE\/tx7zthqh4nlr1doA5FJc5tRS2qYlVODG9MrlUTpw2\/SB37F4rKa1jLkNGST3tA11m2Ugrhm3NQhLNpx+rUqT7tCpogAb4IjDDgNpLEnVruwNURbMePTRjZPFLZ7b8vl\/220YU44ax21nTEI87xvxvGUahgaR7YDHxXh\/EGP+YbOZpU6TbTtMws8r6OPl5X8PkamonoZLfsnDxddPQPVk8fyBrS46bSf8YmP4bKVjKdz2vcK9f5kiYUMdWPsRcBKqjcUVRgJ5GEO8V19T\/9VnrH3zRcKGOgq325mauR+wbMZ9VH\/yLhoEqLUWVy\/xKUTuQKRQxAjKYJRepccdT9X7b3rADiaR+ztUnwTuBfk+yFZIU5RGBngf4e+InAByuIklJruqJu1+jDYL0O40Hr7+b43EYhZ4A5EzI3KxN9iAebEDNkJkD1QnaifHr7ysLHq3pjUMyzByPMLPEOZuxMA3\/r0UdFxnnZWbCpPIkaC2JozqQo7BhZU2atLrn6jzcPkna1CdimpVJHebOsiASPUn76HZbIizry3CxUHv0M6X90v06TsU+BAxtWwR6Epa80JvONZjUbvjZgyxmQ90RhMpRGTopsRjRkT2hRtMtA0F7VqEeZv2GR07e6o\/eY\/qT95zJwdr52FtWsMgjue9XP3xO9e3fb8bFPH9HInFdgcG4GKsc3GRQg8DhzsBxC9FxPz0uTmttE87u9t04lPbaGd7j4uYnEw8RxDJN7HYGyaRmAZMBVao6nIvN\/\/k7nscMDjesy+1X3yMTaXQMECzWTTIUjf\/U1Y9P4PaLz5+QERW48pPjQOuVLU3I1KczWa+Fmv7Dzn9gj9LLP4E6B+AnVsU51UChOcQzkDkyJoPZv8M1RmgS9TRaOa3bXBXcGbITTZFlpeXUebKd9VpkH0Q5BiEi1vOvw7HxgOOEOPlbMy7y6ZPI96zNyirbTp1gxO2\/DVSljqLAlQP2wJ8HAkvN8\/Hai4ugewdHGFTgrZ9UisRGYRIPuuZUH0NMtx10dlMfuLNItA7gOdAHsJpCOvD4hwkh4DsC0wIG+pXnPvY89x0zCGbW0IvxaVPF3Yg3nqAHI\/Lhgw3Qzvm42xxw1ougg3GPQaM8WLxqRv7glhhsUcY9mpD7jXHZ5i2q6t8W9x10dkATH5ilkaMeIDmo7ZHULW2qu1F6YSrhmHGZtIv4Wxtf8cd9Z5A7Z8QcylOk16hqnFR9ZpKTHWoYH2HmYTa9pV3\/\/pCfnDj3Y1rut5mMoJIKdAP1eMRckFuBxlkcvPIHTwcVKn59H1sNkOssJiCEdtR9eFbVTVz59xWuM3YdwnDH+NMcSe7Jsh2WlnxK6+w+NK6BXOTUQVvxI9hM+nGVtXgikLchNoKRCje4wBmPOqKGZdMmBh9TLs84raj9eAqu6y7TcS4iI7Gp0SybcKJJxPW1SwnDK\/F98tAz0E5ndbL4q0\/ICNR7c562a\/jx493zxdxRf2sZeYTTzT9+9R7\/u2+ddLRaJCdj+f9Ghs+hnBBVHQjrxOzYQebqo\/TiYSdjcX5018hTKfQIEgjgsT9s3F+mxdx\/M5tEILzCujvQA4Dns+uXfNhycPPAHDz8d\/DR0zjxDzSmRG0kLZDyWpB70DJRySG2joxxkS8k5vXDi1mJdj5KEM7XLzK8Qj3J0tK3t6UysonX3o51R+\/A6oblqoXswy1760T0O0IC9XdbZDNoXMad\/Mb8xAGdOws4zmg4zL233Jkphy1jjxw8sw36jSbnQsc0GEsuIjJVq2dlug9oBbHxQGwF2IeAwJUL0btQ7hklv6qVqWFxUy+tXxutl90dEUb0TkqtV9+RuGoHQIxRlR1D+BwhFkgx6NaWL9oPrWffUjx2D2I9+rH8hn30bB0EUF9HTVz30eD8N3+E06tVRu+hupDuEzNB4A+qO4S79330b6HH9N\/9WvPkK2qwMsvItajN6mlC4nsObdHafcZRNigko40D2tqM7Ej6DCJS8Sg9nsoo4E6FX0o2hxawLFKRrzoql+I51+iYfACcCXKDu1PRClANhSmIpILlKA6EFginj+VVjT+RkKmZGmpBd5GzI\/BvoxyGejADU6cLf0P3SLT4XcuoCMebTSbUb+wGFUtwpnCjutgxr7l5eS9HabqP8JqVsNAxPebxtR4uXlMLn8dVGeiuhTkr7SdylwIcgUi+6F6G46fwIv4kTcr4j1716O82snLB6D8BuiRnDBho94zfvx4qj58Cxeyt6F9XUTSwEw6p53vjDJ8o80c1vZGGdTBVSuAGUInCGA6ZYftnBSfMn5vrj9yz3buWScgxBg\/3r3X5Kh8UlTSh89xp7NtEdkP450G0tsvyHtTxMh3n4+qnWKzA3qUHnNsK2OhGN9HfB88T1G9BtWJkcZzvBhTnFm9gqC2hvSKpdTM\/YBs9VpHnKRK2FAfqtqH84Ztk41CL5eBvokLVf0t8JIYr3+sR2+67bQXPfY6iNxBQ6PCFBYvv7A+b\/jo6ahm+h55HH2PPL416dBIYNZe5wWoBh3IZwE5HeTvIH9Hdbf21k95WVQ0QG1gs5nyqELRV52YiK0hB+RikGudDNIhRx7+vbbfHRUsABr+MGPG7Qg\/Z\/3Ahjbi\/TeHfNJsBg0CI7G4qGpvXLLXybjTY1umjSpgqzDVcAWKB4SqioYWDV3AjUERVTyEGoQ62k8ZbbSNHoDIUMTgFxRlE736bVYeaHC0hQjPsC4spZ14aMBlRP5eoNBlE03q8B0lk4529d48f3AUA7z3+h5nDQOiVNRPOtHsfggHb8yMiGzno+mI70OYLp73UafoTLUzC2RT1NLW6r2u+4taG4rnjQYdg9vs5uBMVWknqDgRxxN9q1rpZTPpoJMfshHN7GRGorKVeH7Tlec9\/iLnTXuZnAFDNNFnoGoQxDUIfoBIEc4jH2ucD4Xb7Uy\/5Ikk+gygas4bBLU1Ubq3ALxnPH+GzaQ\/FpFXxRhBzHjg\/Xj3Xlesee3pL9Krl5OtrCDRZwDd9ziQnvsfSU6\/QZjcPFBbKZ6\/rLy8HA0DsdnMBl+jYWCimpLtIaSDRBW\/e08bCQ1wdLZHtRphs76wnD6deI\/eFO00bhZwTweX16LaWqhqhnXa+mCUg7x4x6bq8hnT+b1bM9NAnung8k3ix+kI37\/yesJUvZqcnNDEE3HgWhzr4RDaNsnW4rJzn8aRTplMVYXEB4xSMUYlYt4z4nkixnhYKyghcD8u9bCqjQdngKlRhepdw\/o6qZj94uaWz0y7\/14Q8wGO\/5h1mlGbq89DOVdDew3IEJtO08gLcOY\/\/tV00dFnnEUymXThTVVrAdkZG\/4T+CHw88i5tW5ClJcj8cQSXAJHB1q0GJTjgO6d9R6rtVGKaLvx6IuAW1R1i\/Dbdigs2+DPsOnUWg2C13EmHosrLjwB+ADVM6BJ2+oe1teN7bHXQXuJ50vrURodVefeBLneMj56TJiqz2sm2AUwBSO2xS8sIkzVZ0FXotobkXtE5Lhs5Rpd\/fKThPW1mHiCeM8ordsdddEwrEPk2rVrVi+r+XSO2EwGDQNF9UXQpanli7trNrvryqceY3nZ\/aRWLAERTCJBj30Opf\/E0yjcbmev\/qvPvYN32QUNAtFstuOvbO3EJGQQk2kvFjisqVKkuRaq4wnDgR1VTmlcnzUfvqW4cL+2haDwpcTiG2aPGi+DNMkcD5iEan7ztdqmkC4vB9UMwtvtD7rOw5jv3LyBIA3ffC1ebj42ncrgqBHqcLHyPdu4y+I2+ac1yF4onl+TWrqImvdflptPPIKbT3SEfkbVWtAMxosjciVwIKrlbBiz14gK0CuBlQDi++QP30Yml7+x2c0c4vhib3XVtjsV3hPDhTY9KsY7ExgIalY9O5Xx48eTHD+ezKrlqGoMGOnlFVwCPAJyePT83aKSRC2HOZtRhPtwDoCOsCdIaVBV0eGFzlFiBqAc2c5lGYTrTCz+QSOtYicm0BZCSwY6DYN0zdz3fwNMBP1ltPA8YDgi5+JIuV4FLtEge2zxLnv\/LNG7n7h6d7YN4byRYXbtXdvSPrkjqqMbGdjcslAavvnKAPt7ufmTRMxToDHgQEQKAbHZDNmqCjJrVlL96RzChnpyBgwh4h6+02Yz06prayNNXrwoeWm1iGkQ4+XEe\/fvqWFA7pCtMX6MugVzqf7wbWLFPUj0HkDBiO17xYq777n39Nn02f8wG6ZbBjJF7W25e7V2YlIGgh6HkJdMJmmtiO2Mxx4lCvVqvH8UUBIrKOxUV3u5+e5N0u5R55WeBxy1gZBM9BkQ0kIp1P0Q9l359KOdFQ6NoYBtTfoUIi91yiS4sdCmeZZjEjkjNQzuA32RtuOu650c5QZgshg\/yFZWuHDM9Wj1zQ0l+zbaOwIcZ+n7iFwKDGjj4d1AfoLIDuJ574qIhqkGCRvq2dwomz4NMd6rOO11Yzp6d9DbUJ7G2n8BvxRjfoKYcxBzmbg6gE+D\/gWI6rFRi8ifMd7n6z\/MFXllNSK\/xyXttLdRJICfmZzcEe0F6JdMnNgYXncCrmIN62lAjX\/eh5h\/RXG1HaJk4iToXOCpAtqZ8MSo1JDt6HEmFs9T1VBVn9bQ3g38A7eprcRp0n1x2YVLMWZuesXSl4KaKi0YtQN5Q0fROr2Ls2t1PoyyIxNH0\/P7ACeKH\/PO\/PsdxIq7qSNbl1zgz8DtqnoIYvYDDYLaasK6WnodcBS5A4dSNWcWFa8\/S9hQh001AMzMGzbqupEXXWkOuPJWinfcTQE\/clQlVPVgDYOt17zy5BdefiE99jyQnAFbkalYRXrlUmw6RdhQS\/3XX\/heQdEvKj9464h3f1zK2lnPa+OJL5lMYhK5ArIrbXM9NKI7yrVYewsi2wfVFbSuTUtz7dYD\/WFQXzeoo\/4+5fKrSC1fDKpj0Obxvi3m8NeIlNV8OmeD+djnyOMUba69SyFwtvjxgo78SBNOOAnxfJ+m0OBWs0XfRszrG1PhaGNFNC6c9BLx\/JNAzmnn8sa8gPuAWTbIuBOb2sZSWesENIAYEQ0DY3z\/PpwNqa0MuFqcc+oC4I8ahgVqQ8KGeg0b6tgy0CzINQhPbyi92l2oPrA9yBkgf3Fl7rkJlxl3LMiwZg6EaoTLTDzxL9qKHRUh1q3Hm8DFNBambLsdY1H+AvRLJpONYVEtBJ7NZjF+bE9gMk2hDLLePNepwG9RrekMCXqydAJ+UTcBGUJrvoWWNvxcIqa+9gpylkychJdfKJFAa1cw2mzG1nzynv\/VLX9GPK831v4VtATHDd2AMxEdB8xE9ZSqObPmB\/W1mjtwKIm+A8EYvLx8xPNpRneZi8jAZhtFh\/K5c6T9gHKGZtJH9j7oiDwvrzAR2Zt3AGaIyD9E5BTgClSLKt95lco5r0dJY+LC6rr3xPgxzaxZWZZetfyc\/iWn9LbZzI6o9lXVE8XztjOx2Apc+aNHvdz8f+YO2brWLygiqK8lW7WGvCEj6HVQEi83j7VvvULF7Bcxnr995TuvXZ8zYKuTcXbNIqA3Invbhrq\/AA+ADu+4M8gBTkP1MZPI+wFC\/gbzUaSq5eYrY1EuBHIbr73w5U82mGeVs1\/CLyweAXJSG\/0bALeIH\/vssdtu3KBha996eT3zCqAcgbWnied7yZISSia2XDfHnj2ZZEkpQU0VGgZ7Q+PJc4N1WA38Payt+m6oBNfD3ZdeQPFOe4HqQuAPOGradio\/yd6InIzqbxM9ek\/DWsTzvLt\/fSF3\/\/rCFld6AHue+iMjYvqpaj1qCxH5HutC7Zov7OU4r6QH3A28AeqL54WZilU654nNsju1wOeffcbI4cNqxfPeAd3RcQpvAtp25i5FuFT82G1Ymy1vY8f9\/LPPGLn1cEDnAQsQdseF1bSFbYGRiMw18ZyVI4cNZdTo0YwaNQoTzzHYcD+Q62nSnlsgcJqz\/Bxk6QZhVq0J52QSMV48bKg7E\/T\/QWRL36AoRtMv8qL+\/DhbseqbbcaM5fPPP9\/gmV5ugQlrq04C+TXNHSAbuq7cM9XuiuqC7rvvv8zE43UaBCmE5SBv4Rwk24jIIFXtZ3Jyx+QNHu6lliyk5tP38AuK6Pu9owlTdWTWrGp8TR7ILsAXVS9M\/2rskRP5\/LO2c3VGjR7dFzidTsXJar6q7r3mladrGhbO\/6Zg5Pa\/jcLbUnXzP73Kyy882cRiI0QM4vskevcnW1XB2rdeJrNqGX0OmaCJPv0fyxs68uZBx\/9oBw3DrzQMPxVjfgtcjciuGobPI9IP2E1EVucNHZGfN2z0cJtqYPVLTxDv3pNEnwEIQmrZIsT3Sa9aTsOi+T1RLUFkIiJH43wk54IcglDsGClVOj4xCCC9gMNRHQ4yX4xZ\/fln8xRg1KiRg92mKf46wiPdGeiPyEIRU7HmlafsqFGjaPyJij3sgvI3YJ\/WOhbhXpQrxEjD5\/M2HK+PX3+ZUaNH74xLYGqED+xFGOQislBi8eqRw4dp43uDqgrEmBwROQTH7TKilXdnEK5G5F9+Ybfws08749vfeOx5yg+3bhbC9wNaJ+fP4mz0w4E9EHkibKj7Wjwfm2qw7zx67wY3eD+48W5y+w3CZtI1YkweIn\/HVVYpi4R0t2bXF0cv\/gLVX4oxdagW2nQq9c8zNw9BUWvY7ZhTyKxatgaR1xAG4qIezLe0tSrCGwgXSDzxOGEYdnQc+nzeXEaNGqWpJQvn+kXdZuPKQw2l9UgYwdG4HqlBdljkfOwHsrsGwdnA73CJG+vftRThSsT8EXR1R3Hdqsq7775LRHT0S9DLo+Knndm1BoLuZxI5XxKLzx81aiSff\/ZZk3BWVV+z2VMdlaP06+BZjT99gYPXvvXy4pXPPP5+n8MmFmoYHo+1jyKyAmuHZqvWbhfWVMZy+g82ib6D8Iu7kV6xFC+ewAYB6eXf4OXlkz98G4KqtWgY9AMOyhk6arV43qejRo22p111Ey8+eHfnBHRTAEpL+jwTTxDr1qNbWF97WFhf+728ISMO8guLu2uQ3VrV7m\/iibFhqj6n\/st5JPoPJtHPuScaFn2JX1BU5+XmXVm887g74917\/1VVJwODBS1DzIHRmkojsg8u\/Oop0KuNH\/+h8f2e4vnUffExYW01Jp5DaulCTDyHnvscBmppWPxVpFBJD7cGpW8z+t33IiHUi7ZNk+vDBxmFUC\/Ge+3zefOCqL\/6gZxCy7jwGMhuoEnU7ixihoiRrQTZTkQORO05uCK7O6\/bnJsWYxq4E5FLEda05zcZNXr0drBBseQ84ADgSMJgBxEZLGKGiZExInI46M+Ai9wJeANUIvwVkWuBhtaK2n5bnHHNLex0eJJE737b4Hwqv8MVuvBbbY+jan4beAHVJxAJEeHGSQdqG4OkUj3vAxI9+6pfVGyjOnpVOIq84jbaNQiRwRqGa008XuHK+2w5PPDXyx0Fow3nm1j8R2rD2Sg\/QZvsx00yt3OZaXwN3AXyT2y4VLOZRjtzhygvK6P0mGMJG+pni+efCno8ylnA2A0HScBVVbgAOA\/n7Y61MZirccRCt\/hFxW8FNdW2M0k3E0tLxdVr0z+BnLbxcZ8yCvQOguwliHmQdR75hIic5RzEUtTRXreeqj5QRG6MFfcc8fU\/r7pu8Knn3xOZD+5RtWPWvv2yb1MN9DlsIkYMsaLuLt5XLRWzniezejmF2+1M0Q670rDka1QVERlsM+mbNAiGiuf9Y01tfQ2gk594E9QyZXzEmNvIF7J+VRlVXP1DcREXNiTWrSdFO+xK5Zw3Evlbb7eTGENq6SLC+tqcvK1G7im+T2rpImoXzCXeqy9eTl7azy9s6HPYxG4SiycAwvq65TgOFgPsgPGujzbuK1BdFilAecBBGoZ\/wZN\/izGnpFcssXlbjdw2d9BQb\/WrT5NesYT8EduR6OO09KZvaTmXFyPcici\/NJNeJLHEfERvRzssyZZFeB24SYx52uTmNyVSiZjPFXsnykRgYLN5C8hgXKWlU5rxenhtZDAq8AnCFETuQ7WuE\/P3DYSHUQ6hRfSDCE4JGx2Ze8OoH7w2jgtZhNnANRKLz9Qgm+3set5YFG67kzu0eP4sDYJ9gYm0HYHVE5dR+8+wruaXfkGxVbV++7to5D\/yi7oJNmxAzM9wXuq7aF0TTOM877\/HmJfCVP11YSqlZ98\/k1tOHs+WQnl5Gf9Q5dkJE9eeOmPG3+4tLS0DTkQpiQYzf71U3vUFRzWOvKcMeFzRuYK4Eu4bWXR2xmOPcvzki6j\/6vM1asObxY9NQ+2hwHiU3XG23fXLh3nud01taoxB\/Rz0BcSUiTHvqg0zYUN9u5XGmyOwFnHpyNuAvr2JzPeC6nFgZ9FItC+yNapJ4LPWQyPWf8\/6RV9dhYmgtvp94BGEfCBHxJj84aMbYt17xcWPUf\/151+YWNzkDhq2NSIU7bg7se69semG7OoXZ84N62pTvQ48ansRMateKP\/MZjMHqw1fL8pNvNg0pxGdPPONUIzHlzf+0WKMguLnF2GDANtQh6olb8ho\/Pwiar\/4mNxBw7DplFa8+WJYuM0Yv8eeB4IIlXPeILNqObmDhyPqabx3P+1z6EQjvk9QW32bl5u3QOKJ61D1gf2jjfUtXKiVAudH3\/4Grjr6kcCeQJl4\/qHACpDDqj95T3rseeBPEPm+TacGY62pWzCXhsVfupRvaaqLkUb40m3e3Bfr2efD7JqV1ssvRPzYE2F97TkIl6Ps2MbO+T7oLYh5TINgjRhD4dg94YF7owt0pfixCzUIbgE9HDgYZQxOO2zm\/BOv5WMBJARWR0VnZyBSZtMNX5ucXDqjXKi188Tzz0DtWIQjgQNQtsGlkMeaCX+v5XshUiRWIrwDTEXMkxpkV4ln2VzCOUIBymjNZOZhzJh2rmustVgC9PHyC32ELNo+O9+6VG9VwXhbA4tRnY3TKlt74XxUH0bkQGCVOgN3Y+zqFitrDvDTSDmUY45VYF5YW32Zl190E8KOuCy+UbhIgXikTTcAy1Cdh8j7wKc4JikE6Ixtty08POUaAEonTsSG4TK19h4Tiz+kQTAg4vMdBQxDtSdIHi5nLkSlKqo\/uACYC3ypoa0Q44ZkU1LVgX8D94O4D9NmCSW6Hit+xH3Q9LvmMlWbc1LLfJz2pOvWCetZCaSlnG66JvqlMQKSUbUQslw8\/3SEPvnDt71UjDlCVUn0GfCW+LGYqg5E9ZtE34G9cvoP7qZhYDMVq28Iairfydtq5FFAJmyofyxvqxGTFOorc4t18pNvgtWEU7ExiOyUP3L7vNrPP8bEE\/Q6cDzp1cup+eQ94r36EtbXkl6xhOIxe9Jtt32wqVSq4s0Xr80dMmI7XBwuhaPHqI7YXsTzG9Tav4vxxpic2HhVxS8srgLeR\/URpxCwChepsgo4BOcE3QenUX+I0NuZnTCgCxFzBlBcO\/+TZV4iR3sdNP4P8\/\/263uylWv2w\/N3Q3WQTTXEgBCRClS\/RHgXkTkKS8RaDasrm+ZI6dHH2LC+dqqXV\/Ah6ImIHI7qSESKUL5BuBPHkPcNqvj5hUx\/5CFoZnYonzGDkomTAtCPUf1Y\/NjNGoaDQEcAo1AGI\/RinckoAKlEWYrwOfCp+P5XNpOpFZfIxozHH+ucVuBOOw2gb2oYvimxeBFWh4COwmWfDsL5eRqzJjO4pKHFkbI1T3x\/oWYyKTzByy9kxiMPbTb5c37Za1H8tSzFmDNx1KK5rCNH6tZyA9EXUB6JNutQwzA+Zfy4dPuaEvD9P\/+d4p32EiCBtSHGXIgrd\/QpzlvfvHJ0EGmfj6B6UXr18no\/vzCOauam4w7bogJ6fZQee3wU4qSoWvJHj5H6+Z\/GUCehxHg2vWJJNtazt6vWFAn4TRSC7eLk3\/yJmo\/fcZmHEWw2Q6LfYBPWVhlE0DDU5VMfD\/sccYRLDW5WGWVT27QulO\/bBj+7oWzkImki0vk2iJo04OgzJFbUPRHr3jPlykFJxDONERdfnKOqS1E9BZGfACe6vUMWOF1Cp4vIrxAZheqzCrdGQnIsqi8jshQ4WURua1i66K3VL5bt6OUX9op160lYV0PhdjuTN3QUqWWLWfnM43Tf4wCKtt8FVLOIvIHqIHVc3vdGp5GRqhqgWgo0IPJXXPLNm8BpwENYeynG7AH8E5fO\/X2QVdH6ydEgWCC+VwoyD\/RTXEqvEc8Tm82ENpM2Nx\/\/PT3pkt9pzdz3KS8rI1k6IY5jqlOTyAnC+jpXPccYxxPTyhyJiIxcdXE\/VqTWDgL6IrI4qFg13+\/uav2Wl3c8vxqjJjQMIYrq1CAg1rO3CVMNJiI30uWPPRL2OuwwJBZHjHFRN8ZQ1knB3Oq7jz7GxQTbsEmBcBXT84wYt1AkFtfUkoWhX9Qt8ndHztu+A3j01hs3u7yZXP6Gj2ARY6Nx\/+E6YYzBmS4bqyMVAmsdox7vahAKInJDyT62MwJa1Fq67TxOURvDeP\/EhYp8jdNAWzMyLwf2EZEvMxWrRTyPm0884j8qoJvjpEt+T92CT7HZTDONTjCxGH0OP4bbf3zSFm\/TpNPOwKZT2CCK3FOLeDHyt96WRJ\/+Texx\/3\/H2feVi5dfaLDWmkTOUET2QHU+UITIP3Gx6GtxcaLb4oL6FwM\/wWmqjRVZMtE8\/BCnuR4I3OLi2eVgEflRUFs132azpX5BUffqj9+l6oPZ9J9wKvGefdBshvrFXxIr7kGsW893gJdwtRiLgKWo7h9FTPwMmOvYHuXAaDF+DuyFsyneq0FwBcYYERmMSErDcKV43kis\/RJjstiQoLZGGkMG1YbSc+9DbdWHb1Mz7wPyh40Wm0lz84lH6BnX3ErFrOexjUkpjn6AWLeePH7nPzu3UZeUOgXEhjSejMSPsamOstOvvpFuu+7Lwn9ejc2mndCOTl9ebj6F244l1rMPd5z7\/e90rpxxzS1gPDSbZu3sl5pKirk+8RDPp9sue2Ny87lz8plbdB5PnjlrBLAWkT2B3+AcwQ20TO\/+CvT3IGfhzJg\/tKmGhYCKH9MbSvelUwIa4O5fX6gXPDkbVd0K2A+nsrdG2hMCM0EfAlk55ai9nvvBlDu5Ywt3UBf+N3HOA0\/i5eWjYYjJyTnKOTP5PU4pOAmXyv4hcBbuSPtHDYK\/iu\/\/E2c6CHAFUw1wNarXIXIvrpbmh7jjdy7wR1SXi+dNRSQ3qK6k7svPyB82ijBVj02nyB3knP+q+iyqf0bkFpwj9xlU\/wn0QeQd0OUoYxC5BFfc81Os9TDSD2WtBtm0eF4cMQ2IENRUiYnHUavcdMzBesY1t5A\/fBsQIayvE7UhNp3in2cdpwDnTXsZm05x8wmHf+f9fcY1twD8n1EANjcaS5RpGPrimeEgT+JC5ypw9AW7Nru8CngCuB90FsoaDcMcRDIdac8QRQ\/YdHodm0IYdlfVZSLyGMacSOsCej6qf0BkP6Dwolc+e95qoL946yv+tsewrhHsQru4+SSXT3D2veVILP6ciLyOMScBl+O0jNtAF0SMcSuBOeL7o1G9PqIj2B+ICgZwNCK7AjHQ80DG4qJkEJEDa+d\/eq9J5KS9vIJcE4tTPHYPx9n8+UcE1ZUk+g1CPM+C7IjIPTjt54+o3olICY5c\/36UlKp9UcS8KeLVhQ11JkynNFbcbQmAzWZEQpPKl1qumlTKj+98TNG8piTO5sLx7PvKlSiVvBE3Tjxgs\/V3l2D+zhEDco3vV6u1ec3oU3vQMhfi8+jaRmtEOUDN3PdSflH3Tr3IB7j38l+u+41IRgRFZADumPkszo42ttl9gxC5HpiKtXcDml613IdO1Q381kgmk43cBpvbQ\/tficbvF+OxmVJXtwwEU\/flvGzBiG0zuASoldGEPh+kN87Zcta2R+75ytwnZ5+HyDLgcdQuQUwvnBa9M3Cwm3dyDaoP4BIXclV1Zf7w0dfUzH2\/aNVz08gfuQM99zkUxFC47U7OD2Etle+9UZc7eNgXOf2H7BcJ1IU4Z\/K\/gQc0yKZtJi1Bfa1N9O7foupyI1f22feVq6qycsVSAG5rJy\/gllOS\/7tj1gUcH4sUqNptELkMZ3abg9OiG83BistU\/hQ4AnhEg9ATY+Tfv7wg6OybWovBq4si+ffHxfT9A2dra4583HFyKMZMz9Su\/UJtGIoxW6qHdga2cmXn2VI55v9NcKF7Is\/SWhmw\/xHYTIZYcXfEeKKqz7k0cOmOsy8X4swUR899cvZBwEzNZt\/HiCfG64cN\/5JauSyT03fgDxAZiqMvrUVkLKo\/wpUR6o\/xTsQYk+g\/mJwBQ6j9\/GPSK5dRtONuxHv0QYMM6dXLjYbB0zkDtlqGai3witowH6sN4vtpjHEashimHOWWwnmPv6jNNeAuofv\/f5w39SW8nDyAetB6VX5FU3r5BsQxFsf5\/YiG4aXG9zOKbnT91g0k6pTx41zcJToT9ERcsHpb9axW4uIjt40V9+gsKc93ADkBuBYxPfi\/idNQrlZru\/1Pf4UxFjGqLoa4nxjvLQ2CV1F9EPgIFyXxA+Ay4DcS842XyAmB5YgJcgdsBY4e9zBgEs6ReCgi1Ygs8ERmrZ390rlr33qlsmj7XSncZiwmFiesrwFrsekG6hd\/SaJ3\/7ziXfY5BdWbbTp1tnuOBIhbDzeU7Itaq2rXEdncePRB3HLyUV1S6\/8QXEUdO0TV5qraATglorGU2C6sC6tbAPpbnMDeXoSYYyGUECHYmHe2nsWi6oW1Nav8om4z1dq927h3MfBzFx8pozXI\/s7k5On5Za9zQ8k+m7mrlIhIXEomTEQjT7XakJkzZwJNqcmI8dj5X9P5Yx9p+n0jNihn1fjvUW08icXRINuUddYWQVHJxElNNIEmkXC0jc3QWG\/NxBPYMGCd\/VFaDXdan\/WulXa6rIVWIulKJkyMigpIi5Jdx\/zoHNLLv3HfEk80hUC5tmfb7I\/NidtOnwjA5JmzAmCRBtkc8f2rgFGo\/b6LF5d\/45x+a0GG2CDAxOLzrcv+8xHxnDDXqLKInKFB0CCxWA\/reX1qPp2zMNatRxDU1dDwzVdgDL0PLsUkcqj9\/GNWv\/wEBSO3R4yXUNVQPC9bMfsl6bH7fmlt1sG3nlpCF\/7v4rzHX0CtVXEhc\/1A\/oWzLHyGK97RvBzPByh3gE4DatOrV9Z7efk+ZMKbj\/\/eRimxrQpoDQMjfkw0yIaIeQiR3tEOsTPrtO4i4CyQV1H9R9hQryYW8xxpC5u3wsq6yrwhnifYMB80EGNSyZJSystmRDXCrFEV++5pzcL\/jIcGGRMVitignWqtoCri+za7ZgV+cY98BavpVEMymWwhxJITJkAYYvILJKxamw9iM2tW1ieTSWwY8sSTTzY+1CiGMNVgJRbzUPKADGrTyWRJk5BuFMxqrRFj8tz\/hg3JkhLrNp8nmu9QLQ5UTULdGENIXlR8YV2b3XcZtVZtTZVNTpiAiSUI62sBvCgmPOQ\/AlWQUJW4OBteAWIOxiXGJHARHv\/CadO9w3TqF+IZi7XBiPHjan8qwtn3lYtaq\/GeveskFgNXuSMcdMq5J4lQbDMZVr1Yjl9Q5KhMjUHDAJvNUDPvg3S2uvKSAZNOf6Pmq88k0asfU5L70IUuNIkcL2Yi2VcBOhpkd5wJbjAts4SXAYLIg6g9AzHfBDVVYmIxuynVtlo1GkssnpVYLMB4RYj8ANXrcYkrzausFEcL6ApEhnm5eeriE7dANqFG9h61YzWTvgHVp1B9HNUfIRQkSycgxuSK8f+fIBd5uXmxZhJ4kBjvehHTasEzMWY\/8bwbUT3IL+r+Z1SfECgXz\/sl0LtREJ776PNkV68AkbFh1drrQWaClvsFxX9EZIjxvGbP9M8QMVeI5x1MGN6OSwN+DJETIgL4RnnrAYeIMf\/CheY8aYx3M8pYL9F2gZWSCRPdhgT7ajZzG\/Ak6HTgl4j0GT\/+KKcli5SKMXeanNxxhCFBTSXieYeJMbeKyJj\/1OSfMn5vbCaNeKYB+ClqT8BFauyCiyIqBkpA3we9zsRiCsQQTFM2aSyOl5MLSBzYA9VCoMrEE6NNPCfmFxSRO2goseIeZFYto3beB1R\/9DZ5W40gVtzD1s3\/dA3\/sQ2qC\/\/1AjoW6yOx2GhgVDNK1eW4NTs0+vtq0B\/iSl69BtSH9bWSN2Q4Goa2uYnsWwnoGyceQFRapx64C5F64Bc4rXkZ8D7reJITuCiPwVirbI6KBa2L6F6o\/gmRHGA6SCXIVVi9BDQmnp9G6ANM1jBw\/METJuCIWOQkhNo2nj3CBZXLP0CGA+WIfA7yC+BvUSUNvrr1z8R69N4rihoYizAdkeeBY1BuQ6Tfsedc0NjcvYDzUK4CCYCXIo7mm0H232\/bEc4MghwMchciPRB5GOSJKDHiWpvNdmurMz6aPg0RcyRwD0h\/RB5GZDbI2SjXiPGKUssWA\/IZyN6oXg50M4mcfihXINIH4339n1wANpMSm0r5Jh6vwJjFwPO4KI4VwGTgnyCXoaTUWnXJopZzHnpKzp\/xqogx6uUVKM4OeBkie2sYnobILkFdjdbM+4BEnwF0220\/NAxZ\/cpTpFcsJb1qOUFtNRKLyz8O28XNrS1MWdCF\/15MLn+9Me55Fapf4U5zk3GBEvfjojcasQxlIarvejm5vxc\/ttqm04QN9dz6\/QmbZCZrk0lJ1Upq2eIgp\/\/g96MdYnS0W+TjSMN9HOfAn3GppDeIH\/s+aqsml7++JY6IuYg8YGKJ62wmFWBMjiOE5ycoU1XtHFyFmJOAvUomTfpagzAOHIUwBzHvtyUrcNrZa8DFqNSZRI5n06l5qPwJeByY7uUV5BLaS0CqEHMCNlzmbN7mNZRHUT1m0c3XR\/mmEgI5CP+UeOJ221AfiueVo1IOepiIvIAqGA7GbYA\/wdrlztJualF+h5iBtKhavE6O7FBS2gPV3yDyoRhzmoZhtYYh4vsfodwCPB7r3mtqzUdvf5q39baXo3ITcCbW9ojoK3+EDdf+R1eCGDDGBtVVYhKJQlx450sgPRC5ExgGDETkVCCDyEMa2tVifINIws8vTKm1vXH26nNxIU93iUiPoLaaNa8\/S\/GYPUj0GUC2eq3zGYghrK12rxchmUxyx3mnd0ml\/8M46+Z7iRV1p8+hR\/GHvoIqRlQHRUyEPlFRC5wf6KRIHlocJ8s1CMejPJepWPVq7RefkK1aGxWc2DS0GRen2az4hcUy5ai90DBYDFwC3ILL4uoRNbAu+qkCvU6DbJ0qniqbO95OgG+Ah9WGgbMLawrhQYQ46O7l06eDyNsIXwPfcxJAhxIxiaG2tu1nayWuskxdeXkZGgQhyFRgNar7OTFuBwN7gS7AhmOAI0TkCEeGRDXIAX1KSqKRUQN8g0g5YRj6hd3Akbt8A\/TN6dW3ka3sRkROd3m5sruInIDqgYAnjgx8vS5oGq1tgO1RvtQwHAccIZ53BKpxIETZT4NACrbbGYx5DOFh4DcgP0T4i82kP9zSDsINOl1ERcQCipi+iNkZ5KsohG4uMBWYgqNpvQH4npeTQ6y4uxWRtEbFXIEZoI0VgXwADbLEuvWkYfGXLJt2DxWvP4uGAS4sVIiC6nPAcY5MOOEkuvB\/FgIqUfk5xIiHyLYYGYHIFJzZbQ2ueHUvnFUhA\/zWJHLuB7kJeK\/2i08EkFhRN+I9em3yiaxN0b607H5d\/aqrKiXG66NhWIbqk+L7g4FGXtGhwK24sKRjxPMCtTYWFcy0m7cTqUC1qjGyonzGDJKlpSuxWo9LYMAkclfbhrrnQZKazfRFZF93rzwrRtp5ttQAqxrJaMqmTSVZOqES1TVRNQxQ7QGSH7H67bSexLQ4WtYYbkMThAaQTGN7kyUltvHfxBhMIkc1yGax9jTgcETyUFbjTEja7qnb8f\/mApMQOWy9tlQBaoOMlE+frsnS0gbgAeBUN248YxI5\/\/Ej\/U3HHQbAD278N3lDRswH\/VI8fzyO96IW+D7O5LY3jnFxgVp7ulq7VGKJZzXIFkTJVf1BTgf2FRGbWrpoTsWbL+5YtMNuvonFWPH04038FKpNUzQHl8XYFygLaqrWJEtK8Au7Me3+e7pE1v81qErYUN9Ie5GNFfd4OltVcUY0B8EpV3\/C+UZ2Bj5BdaFNp\/ogsqLxGY2P+zaZnG1qut132VtH\/vTyiFpS6sUYFd\/3cOmKd+OIbFZEwmAIMEI835h4TlaMF2yBbsxFJD7huBMAGH\/UUaCaC8SjhexK3CMzgR6I7I9yFMJsjMwva78idgLIaSw3n5wwAdQmQPNQ9+yIujQL3C6ef4R4\/pHRzxHi+weKH\/uZiSXSzYRoWxsNEYG8h9WLQc6O7M8nYUwJwo1t3910ey2utM+VzdoRtSW2v\/ixK0ws3lhoNQ\/l+wjfIHQDThE\/Zo486r8mplfWvvMaURTKalxW33LcCe5xYACq54N+ApQC+2oYnITIdbhyQqcB24vIXkBh9cfvDkktWehVffAmle+90VRDcL0QRcEl\/9yG6mPieScB3YKqCpLJJOOTXSF2\/1cgImoSOXb74UWqqkOB0VlXynApjmujcTX\/DqfgXowLllgB9J1y1F5MGT+u8Zpv7c9oU0DfddHZzSV\/FU6N3wY4FtUrUD0bx4fwMc5YvlRVf6lhUJhesYRzHnxqc\/ajxW0Kuwf1ta7+nueBMg6nDX0CuFhf4X1gAao\/wZGYzBDHI9vWEFmgB6oHClH4motxHgsyCOFDADHmG+BrVHfVIFuhYbBIw2BR8a7jvtFsdoxms71OeeyRdgZnXc2lxa+9rBqGOcA4hA9Nbt61qL6PDStxBXwNiG3cMDYQ+iLzceaXXWwmvVTDcJGGwSINghWazeyhQbYARE0iR1A9GZfMcQFwL8pkzWb28ET4r4BCok9\/NMiIZjOzUT0S1TNYx6q4MyK\/RszfcErCvcBvI2F9BLAQa9+z2Uw2s3a1l61c09PLy5fMquWkln+zrs9aHRmJgRyA6p2oPowxxwCFIpAsLe2SXv8HcPvZp3DTcYdxilsPDUC9KwXHocB04Geg1+FOclsDr6H6mXjeGvG8jxqf01gAdv0isN+ZgG6OKUfthU2nwNqPUD1bbbgIkV8Au6F6vEut1bnAh6jNmkSOiO9vzhUvkSD+rYg5HhiDchLwK4Q3MGZ244VeXkEFwjNRNEQD8HIn+CsE5DxEfgyMRcxRLtqBRYh5EkDiORUI\/8LVS7sO1YNQ3bdy9it\/BO5AOPCxcy+ImMRENuxrBcEAZuC4fUSMySAsQHV7W193TJQAdJgrz665asOhrKsTZ5xdu\/GAYxYj3AOcKMZcgdp9ne1ar8HxAexi0ylsKjUG1UsRHhExTwM3gtYAv8Pzuk848eT\/EhGNqrUCxBGZj+q7uDjoT3AENCfjqEfPRzXA8XgEwCqEn2sYHF7x5ou6YuZDZNaswMsvBGMc90abwrnF8Cdc33Mf8CDKBKCw9PgT\/kt2sS5sTlzw5Gw597HnRZy5YjFOsbsY6IO1UzQM74n+\/ktU52qQzbPplFc7\/9PvvC2ddi+qWkkt\/yaV03\/wfHEzPQs0oLoMYzJASkRmqggmJ9eI57uKIZsHq6Moi2dwR9\/uoAmQ90B+g9qKpnYHWcUZ9H+GK9S4tIMvdTZo4WFUTgW9GMhF+Aq4tM\/3jv6SGdNBrSLm36jNBz0LV8omBKlEuBrVe\/N69ojqPulyRL5CmvWHM4B+DSzz4gkQyaL8HVcQ9G+gVQgVIM+g5KJ6iYh8iKMzXAHypYhpNCUFwHWIeCgnOLJ4QpAVCL8BnhTfj2s2c5y7X\/4OhLkjtl\/QMP+Tq1EuBD0Q1Wn8h0PM7jjfRVGc8+BTapFUeulCydtq5Im4KgyHIzISeBhHMdArIs9PAJeg+jbITSae2BGRxZmKVQ3ieWQrVrUliGkpsdcvB6NRLTz9PVYHGi92y3+6f7qwxRCr\/+arbO7AoQrMwoUZf4AxRYLZV7PZf5pEIqM2BGMSKHrH+Wf85wS0zWTELyxmyvhx+tNn37NhuuFqEeOZeLzBBsFuoMsqP3hrCar02Osg1Wx2M05kvQ3lbvFjazQM\/40LwapD5HOsrVW1TZl1jlcEBWoQZka2zU68gpnADYgZiRCKyBdqbcWaV53pZsajj5AsKa23YXCN8WMPgQ4BLCILq+e8sbRo7Dju+tPljVy81wBxEbMu0UekBtUfqmrWzy+gbOrjJMePfw\/PPwZ0FEoMMV+ZRGKpTafvBIqx4bLo7utBb8WYCoCy6dNIlpSsFc\/7vYbh7SiDEMkg5kubql9lEjlEKdFTVPVaMVSUTZ9GydHHqBjvbg2DmSipKAPvvwI2k1aCDGJ8wVE4FqO6Esd\/cCkifXCmrj9Ht\/wFkdeA36nqtolefadLLF4tRtAg0LYGue2\/6\/qSPL1FkrC68N+CxjwPD6gysdg1ai0aBN0AHyNe2FAnGoZ4idy0bqazVacFtJdIWIzHuY89L2F9nZdZtTKb6D8g4wSgfKw2DLBWEKFi9kvc\/asLNudkrgaqUQvoN6h+07iOvLx8pj\/8EOPHjxdUPTFeHDgOYTFi3iovm97JV6jggtNXNU+PnP7QA01XlJfNIJlMKqqLVe1iADGG4l33a87bobSIX14ng4BVrlxsFE1gDKAVWH3TmUAUzWRA7Vfr3esEfTO7sSuRVBpGwfRfuexpxcsroGzaVEqOPibEOTKa3lf2+GMkSydkcLHXYP975M+t358AwFm33KsaZG8WzxdEuiNyK\/AgcCWqfaMwPMHaDxAZjcgzYsx0m06xvGw6id6FdN\/jgP+a7+rC\/wSaLwSDanztu29kCkdtj5dXUKlqp4oaVIwBy5SSfTbbwtlouX\/+9FdEPA9EsNksxnehphqGVH\/ynjTyNG9mAd0hkslkd+APwGiQMQiXxXr0vnXqv+\/QDu47E+QahCPLy8pmd\/Z9XVUrNh\/On\/GqC\/ZXG8d4BwFf2Uz6C+PHXMyqVbYu2Sf88ok3d0BkYc3c92vCVAN5Q7bGJHK4+fjvdXViFzYJUagdU47ai3MefMqoDTW1bLHeddHZnD\/9FbHZLDcde8hmk3Ubn+IiRhvJ1DQIREXkhgn7K8D3\/\/z3\/x4VzJgA1WqcdvgQ8KCtr+u4fSLvoFyOcw50Gl2CefPhhlKXGzR55qyMiDytqi7OVMSP9+ybTa9arvPuKyPeo8\/HItI1Fl34znD9kXs2lymK6rr5JaJsZrfx\/wcURiURmcSRSwAAAABJRU5ErkJggg==\";\n\n\/* ================================================================\n   PALETTE DE COULEURS \u2014 modifiez ici\n   bg       : fond de page (#070D18 = marine tres sombre)\n   accent   : teal principal (#72BDCE)\n   card     : fond des cartes\n   text     : texte principal\n   textSoft : texte secondaire\n   ================================================================ *\/\nconst C = {\n  \/\/ Backgrounds \u2014 deeper, richer navy\n  bg: \"#070D18\",\n  bgGrad: \"linear-gradient(160deg, #070D18 0%, #0A1420 50%, #070F1C 100%)\",\n  surface: \"#0C1624\",\n  surfaceLight: \"#111E2C\",\n  card: \"#0E1A28\",\n  cardHover: \"#132030\",\n  \/\/ Borders\n  border: \"#162433\",\n  borderLight: \"#1E3244\",\n  borderAccent: \"rgba(111,183,200,0.28)\",\n  \/\/ Text\n  white: \"#F5F9FB\",\n  text: \"#DCE8F0\",\n  textSoft: \"#8AAFC2\",\n  textDim: \"#4E7080\",\n  \/\/ Primary accent \u2014 refined teal\n  accent: \"#72BDCE\",\n  accentDark: \"#5CA4B5\",\n  accentDeep: \"#4890A2\",\n  accentGlow: \"rgba(114,189,206,0.10)\",\n  accentBorder: \"rgba(114,189,206,0.28)\",\n  accentLight: \"#90D0DF\",\n  \/\/ Status colors\n  green: \"#2ECC9A\",\n  greenBg: \"rgba(46,204,154,0.08)\",\n  greenBorder: \"rgba(46,204,154,0.24)\",\n  amber: \"#F4B942\",\n  amberBg: \"rgba(244,185,66,0.08)\",\n  amberBorder: \"rgba(244,185,66,0.24)\",\n  orange: \"#F07020\",\n  orangeBg: \"rgba(240,112,32,0.08)\",\n  orangeBorder: \"rgba(240,112,32,0.24)\",\n  red: \"#E84040\",\n  redBg: \"rgba(232,64,64,0.08)\",\n  redBorder: \"rgba(232,64,64,0.24)\"\n};\n\/* ================================================================\n   FIN DE LA ZONE DE CONFIGURATION UX BUILDER\n   Ne modifiez pas le code en dessous de cette ligne.\n   ================================================================ *\/\nfunction getLevel(score) {\n  if (score >= 85) return \"excellent\";\n  if (score >= 65) return \"good\";\n  if (score >= 45) return \"moderate\";\n  if (score >= 25) return \"weak\";\n  return \"critical\";\n}\nconst LEVEL_STYLES = {\n  excellent: {\n    color: C.green,\n    bg: C.greenBg,\n    border: C.greenBorder\n  },\n  good: {\n    color: \"#5CB85C\",\n    bg: C.greenBg,\n    border: C.greenBorder\n  },\n  moderate: {\n    color: C.amber,\n    bg: C.amberBg,\n    border: C.amberBorder\n  },\n  weak: {\n    color: C.orange,\n    bg: C.orangeBg,\n    border: C.orangeBorder\n  },\n  critical: {\n    color: C.red,\n    bg: C.redBg,\n    border: C.redBorder\n  }\n};\nconst lvlStyle = l => LEVEL_STYLES[l] || {\n  color: C.accent,\n  bg: C.accentGlow,\n  border: C.accentBorder\n};\nconst lvlColor = l => lvlStyle(l).color;\nconst lvlBg = l => lvlStyle(l).bg;\nconst lvlBorder = l => lvlStyle(l).border;\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   WEIGHTED RISK SCORING ALGORITHM\n   \n   Methodology inspired by DOJ\/COSO compliance risk frameworks\n   and Swiss criminal law (art. 102 CP) expectations:\n   \n   1. Each question has an inherent weight reflecting its importance\n      in criminal proceedings (based on what authorities examine).\n   2. Company SIZE acts as an \"exposure multiplier\":\n      - Larger firms = higher inherent risk (more complex org,\n        more regulatory scrutiny, higher expected standards)\n      - Missing a control in a large firm is MORE penalizing\n        because authorities expect proportional organization.\n   3. SECTOR risk multiplier reflects industry-specific exposure\n      to criminal proceedings (finance, construction = higher).\n   4. Final score = weighted protection score adjusted by multipliers.\n   \n   Score interpretation: higher = better protected, lower = more exposed.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n\/\/ Inherent weight per question (1-3 scale, reflecting importance in criminal proceedings)\nconst Q_WEIGHTS = [3,\n\/\/ Q1: Formalized procedures \u2014 foundational, first thing authorities check\n2,\n\/\/ Q2: Exhaustive risk identification \u2014 critical for art. 102 CP defense\n3,\n\/\/ Q3: Sufficient controls \u2014 core organizational duty\n2,\n\/\/ Q4: Legal risk audit in last 3 years \u2014 demonstrates ongoing diligence\n2,\n\/\/ Q5: Fraud training \u2014 key factor in employee-related offenses\n3,\n\/\/ Q6: Whistleblowing channel \u2014 expected standard by authorities\n3,\n\/\/ Q7: Responsibilities & decision processes defined \u2014 organizational clarity\n2,\n\/\/ Q8: Employee management procedures \u2014 labor law exposure\n2,\n\/\/ Q9: Rules on company resources \u2014 executive misconduct prevention\n3,\n\/\/ Q10: Third-party due diligence \u2014 corruption & external fraud prevention\n3,\n\/\/ Q11: Financial difficulty awareness \u2014 gestion fautive, paiement pr\u00e9f\u00e9rentiel\n3,\n\/\/ Q12: Decision documentation \u2014 primary defense element in investigations\n2,\n\/\/ Q13: Formal delegations of authority \u2014 clarity of responsibility chain\n3 \/\/ Q14: Crisis response plan \u2014 critical for first hours of investigation\n];\n\n\/\/ Size multiplier: larger companies face stricter expectations\n\/\/ A \"No\" answer is MORE penalizing for large companies\n\/\/ because art. 102 CP expects organization proportional to size\nconst SIZE_MULTIPLIERS = {\n  0: {\n    label: \"TPE\",\n    base: 1.00,\n    penalty: 0.85\n  },\n  \/\/ TPE: some tolerance, less complex\n  1: {\n    label: \"PME\",\n    base: 1.00,\n    penalty: 1.00\n  },\n  \/\/ PME: baseline reference\n  2: {\n    label: \"ETI\",\n    base: 1.00,\n    penalty: 1.15\n  },\n  \/\/ ETI: higher expectations\n  3: {\n    label: \"GE\",\n    base: 1.00,\n    penalty: 1.30\n  } \/\/ GE: strictest scrutiny\n};\n\n\/\/ Sector risk multiplier: inherent exposure varies by industry\nconst SECTOR_RISK = {\n  \"Finance & Banque\": 1.25,\n  \"Finance & Banking\": 1.25,\n  \"Construction\": 1.20,\n  \"Sant\u00e9 & Pharma\": 1.10,\n  \"Health & Pharma\": 1.10,\n  \"Technologie\": 1.05,\n  \"Technology\": 1.05,\n  \"Commerce & Distribution\": 1.00,\n  \"Retail & Distribution\": 1.00,\n  \"Industrie\": 1.10,\n  \"Industry\": 1.10,\n  \"Transport & Logistique\": 1.05,\n  \"Transport & Logistics\": 1.05,\n  \"\u00c9nergie & Environnement\": 1.10,\n  \"Energy & Environment\": 1.10,\n  \"Secteur public\": 1.15,\n  \"Public sector\": 1.15,\n  \"Immobilier\": 1.20,\n  \"Real Estate\": 1.20,\n  \"Services juridiques\": 1.15,\n  \"Legal Services\": 1.15,\n  \"Autre\": 1.00,\n  \"Other\": 1.00\n};\nconst SIZES_FR = [\"< 10\", \"10 \u2013 249\", \"250 \u2013 4\u202f999\", \"5\u202f000+\"];\nconst SIZES_EN = [\"< 10\", \"10 \u2013 249\", \"250 \u2013 4\u202f999\", \"5\u202f000+\"];\nfunction getSizeIndex(sizeStr) {\n  let idx = SIZES_FR.indexOf(sizeStr);\n  if (idx < 0) idx = SIZES_EN.indexOf(sizeStr);\n  return idx >= 0 ? idx : 1; \/\/ default PME\n}\n\n\/\/ Score a single Yes\/No question, applying the size penalty multiplier\nfunction scoreQuestion(answer, weight, penaltyMult) {\n  const qScore = answer === 0 ? 1.0 : 0.0;\n  const adjustedScore = Math.max(0, 1.0 - (1.0 - qScore) * penaltyMult);\n  return adjustedScore * weight;\n}\nfunction computeWeightedScore(answers, sizeStr, sectorStr) {\n  const sizeIdx = getSizeIndex(sizeStr);\n  const sizeMult = SIZE_MULTIPLIERS[sizeIdx];\n  const sectorMult = SECTOR_RISK[sectorStr] || 1.00;\n  let weightedTotal = 0,\n    weightedMax = 0;\n  answers.forEach((a, i) => {\n    weightedTotal += scoreQuestion(a, Q_WEIGHTS[i], sizeMult.penalty);\n    weightedMax += Q_WEIGHTS[i];\n  });\n  const rawScore = weightedTotal \/ weightedMax * 100;\n  const sectorAdjustment = 1.0 - (sectorMult - 1.0) * 0.5;\n  return Math.max(0, Math.min(100, Math.round(rawScore * sectorAdjustment)));\n}\nfunction computeWeightedCatScores(answers, categories, sizeStr) {\n  const sizeIdx = getSizeIndex(sizeStr);\n  const sizeMult = SIZE_MULTIPLIERS[sizeIdx];\n  return categories.map(cat => {\n    let weightedTotal = 0,\n      weightedMax = 0;\n    cat.questions.forEach(qi => {\n      weightedTotal += scoreQuestion(answers[qi], Q_WEIGHTS[qi], sizeMult.penalty);\n      weightedMax += Q_WEIGHTS[qi];\n    });\n    return {\n      name: cat.name,\n      score: Math.round(weightedTotal \/ weightedMax * 100)\n    };\n  });\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   NOUVELLES DONN\u00c9ES \u2014 POSITIONNEMENT (app2 fusion)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nconst SECTOR_BENCHMARKS = {\n  \"Finance & Banque\": {\n    avg: 62,\n    p25: 45,\n    p75: 78\n  },\n  \"Finance & Banking\": {\n    avg: 62,\n    p25: 45,\n    p75: 78\n  },\n  \"Construction\": {\n    avg: 43,\n    p25: 28,\n    p75: 58\n  },\n  \"Sant\u00e9 & Pharma\": {\n    avg: 57,\n    p25: 42,\n    p75: 72\n  },\n  \"Health & Pharma\": {\n    avg: 57,\n    p25: 42,\n    p75: 72\n  },\n  \"Technologie\": {\n    avg: 54,\n    p25: 38,\n    p75: 68\n  },\n  \"Technology\": {\n    avg: 54,\n    p25: 38,\n    p75: 68\n  },\n  \"Commerce & Distribution\": {\n    avg: 49,\n    p25: 32,\n    p75: 64\n  },\n  \"Retail & Distribution\": {\n    avg: 49,\n    p25: 32,\n    p75: 64\n  },\n  \"Industrie\": {\n    avg: 47,\n    p25: 30,\n    p75: 62\n  },\n  \"Industry\": {\n    avg: 47,\n    p25: 30,\n    p75: 62\n  },\n  \"Transport & Logistique\": {\n    avg: 46,\n    p25: 29,\n    p75: 61\n  },\n  \"Transport & Logistics\": {\n    avg: 46,\n    p25: 29,\n    p75: 61\n  },\n  \"\u00c9nergie & Environnement\": {\n    avg: 51,\n    p25: 35,\n    p75: 66\n  },\n  \"Energy & Environment\": {\n    avg: 51,\n    p25: 35,\n    p75: 66\n  },\n  \"Secteur public\": {\n    avg: 58,\n    p25: 40,\n    p75: 73\n  },\n  \"Public sector\": {\n    avg: 58,\n    p25: 40,\n    p75: 73\n  },\n  \"Immobilier\": {\n    avg: 52,\n    p25: 35,\n    p75: 67\n  },\n  \"Real Estate\": {\n    avg: 52,\n    p25: 35,\n    p75: 67\n  },\n  \"Services juridiques\": {\n    avg: 60,\n    p25: 44,\n    p75: 75\n  },\n  \"Legal Services\": {\n    avg: 60,\n    p25: 44,\n    p75: 75\n  },\n  \"Autre\": {\n    avg: 50,\n    p25: 33,\n    p75: 65\n  },\n  \"Other\": {\n    avg: 50,\n    p25: 33,\n    p75: 65\n  }\n};\nconst MICRO_RECS = [{\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Moyen\",\n  short: \"Proc\u00e9dures formalis\u00e9es\",\n  rec: \"\u00c9laborer un code de conduite et des proc\u00e9dures document\u00e9es effectivement appliqu\u00e9es. C'est le premier document contr\u00f4l\u00e9 lors d'une enqu\u00eate p\u00e9nale (art. 102 CP).\",\n  action: \"Mandater un avocat p\u00e9nal pour r\u00e9diger un code de conduite sur mesure\"\n}, {\n  w: 2,\n  priority: \"Haute\",\n  effort: \"Moyen\",\n  short: \"Cartographie des risques\",\n  rec: \"R\u00e9aliser une cartographie exhaustive des processus \u00e0 risque p\u00e9nal. Sans cette base, les contr\u00f4les restent lacunaires et ind\u00e9fendables.\",\n  action: \"Commander un audit de cartographie des risques p\u00e9naux\"\n}, {\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Moyen\",\n  short: \"Contr\u00f4les internes\",\n  rec: \"Renforcer les contr\u00f4les sur les processus identifi\u00e9s. D\u00e9ployer des contr\u00f4les compensatoires l\u00e0 o\u00f9 des contr\u00f4les primaires font d\u00e9faut.\",\n  action: \"D\u00e9finir et d\u00e9ployer un plan de contr\u00f4les internes prioris\u00e9s\"\n}, {\n  w: 2,\n  priority: \"Haute\",\n  effort: \"Faible\",\n  short: \"Audit juridique p\u00e9riodique\",\n  rec: \"Planifier un audit de conformit\u00e9 juridique dans les 6 prochains mois. La r\u00e9gularit\u00e9 d\u00e9montre la diligence exig\u00e9e du dirigeant.\",\n  action: \"Planifier un audit juridique avec un cabinet sp\u00e9cialis\u00e9\"\n}, {\n  w: 2,\n  priority: \"Haute\",\n  effort: \"Faible\",\n  short: \"Formations anti-fraude\",\n  rec: \"D\u00e9ployer un programme de formation annuel sur les risques p\u00e9naux. L'ignorance de la loi n'est jamais une d\u00e9fense recevable en mati\u00e8re p\u00e9nale.\",\n  action: \"Organiser des sessions de formation obligatoires pour les managers\"\n}, {\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Faible\",\n  short: \"Canal whistleblowing\",\n  rec: \"Mettre en place une ligne \u00e9thique confidentielle. Fortement recommand\u00e9 comme d\u00e9monstration de bonne gouvernance et \u00e9l\u00e9ment central d'une d\u00e9fense p\u00e9nale cr\u00e9dible.\",\n  action: \"D\u00e9ployer un outil de signalement anonyme certifi\u00e9\"\n}, {\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Faible\",\n  short: \"Clart\u00e9 des responsabilit\u00e9s\",\n  rec: \"Documenter l'organigramme d\u00e9cisionnel avec pr\u00e9cision. L'absence de tra\u00e7abilit\u00e9 est un facteur aggravant syst\u00e9matique lors de poursuites p\u00e9nales.\",\n  action: \"R\u00e9diger des fiches de postes et d\u00e9l\u00e9gations de comp\u00e9tences sign\u00e9es\"\n}, {\n  w: 2,\n  priority: \"Haute\",\n  effort: \"Moyen\",\n  short: \"Proc\u00e9dures RH & s\u00e9curit\u00e9\",\n  rec: \"Formaliser les proc\u00e9dures de gestion du personnel. Les manquements en droit du travail et s\u00e9curit\u00e9 engagent directement la responsabilit\u00e9 de l'employeur.\",\n  action: \"Auditer et mettre \u00e0 jour les proc\u00e9dures RH et le r\u00e8glement int\u00e9rieur\"\n}, {\n  w: 2,\n  priority: \"Haute\",\n  effort: \"Faible\",\n  short: \"Politique frais & ressources\",\n  rec: \"\u00c9tablir des r\u00e8gles \u00e9crites sur l'utilisation des ressources. En leur absence, contester juridiquement un abus devient complexe.\",\n  action: \"R\u00e9diger et faire signer une politique de gestion des frais de repr\u00e9sentation\"\n}, {\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Moyen\",\n  short: \"Due diligence partenaires\",\n  rec: \"Impl\u00e9menter un processus KYP (Know Your Partner) document\u00e9. La corruption commise par un tiers peut engager la responsabilit\u00e9 de l'entreprise mandante.\",\n  action: \"D\u00e9ployer un processus de due diligence tiers document\u00e9 et tra\u00e7able\"\n}, {\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Faible\",\n  short: \"Risques en cas de crise financi\u00e8re\",\n  rec: \"Former les dirigeants aux responsabilit\u00e9s p\u00e9nales lors de difficult\u00e9s financi\u00e8res. La m\u00e9connaissance des seuils et obligations aggrave l'exposition.\",\n  action: \"Organiser un s\u00e9minaire dirigeants sur la responsabilit\u00e9 p\u00e9nale financi\u00e8re\"\n}, {\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Faible\",\n  short: \"Documentation des d\u00e9cisions\",\n  rec: \"Instaurer un registre de proc\u00e8s-verbaux et validation formelle des d\u00e9cisions strat\u00e9giques. C'est la principale ligne de d\u00e9fense lors d'une enqu\u00eate p\u00e9nale.\",\n  action: \"Mettre en place un registre formel des d\u00e9cisions manag\u00e9riales\"\n}, {\n  w: 2,\n  priority: \"Haute\",\n  effort: \"Faible\",\n  short: \"D\u00e9l\u00e9gations de pouvoir\",\n  rec: \"Formaliser les d\u00e9l\u00e9gations de pouvoir par \u00e9crit. Sans d\u00e9l\u00e9gation document\u00e9e, toute responsabilit\u00e9 remonte automatiquement au dirigeant de droit.\",\n  action: \"R\u00e9diger et signer des d\u00e9l\u00e9gations de pouvoir formelles\"\n}, {\n  w: 3,\n  priority: \"Critique\",\n  effort: \"Moyen\",\n  short: \"Plan de r\u00e9action p\u00e9nal\",\n  rec: \"\u00c9laborer un protocole d'intervention pour perquisitions et enqu\u00eates. Les premi\u00e8res heures sont d\u00e9terminantes pour la construction de la d\u00e9fense.\",\n  action: \"Mandater un avocat p\u00e9nal pour un protocole de crise personnalis\u00e9\"\n}];\n\n\/\/ Inherent risk exposure 0-100 (independent of answers: sector \u00d7 size)\nfunction getRiskExposure(sector, size) {\n  const sm = SECTOR_RISK[sector] || 1.0;\n  const pen = SIZE_MULTIPLIERS[getSizeIndex(size)].penalty;\n  const s = Math.round((sm - 1.0) \/ 0.25 * 60 + 20);\n  const b = Math.round((pen - 0.85) \/ 0.45 * 20);\n  return Math.min(100, s + b);\n}\nfunction getQuadrant(rx, my) {\n  const hr = rx >= 50,\n    hm = my >= 50;\n  if (!hr && hm) return {\n    id: \"TL\",\n    label: \"Position s\u00e9curis\u00e9e\",\n    color: \"#34D399\",\n    desc: \"Risque inh\u00e9rent mod\u00e9r\u00e9 et maturit\u00e9 organisationnelle \u00e9lev\u00e9e. Maintenez vos dispositifs et planifiez des audits p\u00e9riodiques.\"\n  };\n  if (hr && hm) return {\n    id: \"TR\",\n    label: \"R\u00e9silience prouv\u00e9e\",\n    color: \"#6FB7C8\",\n    desc: \"Secteur fortement expos\u00e9 mais organisation robuste. Continuez \u00e0 renforcer et documenter vos dispositifs.\"\n  };\n  if (!hr && !hm) return {\n    id: \"BL\",\n    label: \"Vuln\u00e9rable mais peu expos\u00e9\",\n    color: \"#FBBF24\",\n    desc: \"Risque inh\u00e9rent limit\u00e9, mais maturit\u00e9 insuffisante. Formalisez rapidement vos proc\u00e9dures avant que votre contexte ne change.\"\n  };\n  return {\n    id: \"BR\",\n    label: \"Zone critique\",\n    color: \"#EF4444\",\n    desc: \"Secteur fortement expos\u00e9 et organisation insuffisante. Une intervention prioritaire avec un sp\u00e9cialiste est fortement recommand\u00e9e.\"\n  };\n}\nfunction Sparkline({\n  values,\n  color,\n  w = 90,\n  h = 28\n}) {\n  if (values.length < 2) return null;\n  const min = Math.min(...values);\n  const max = Math.max(...values);\n  const range = max - min || 1;\n  const pts = values.map((v, i) => `${i \/ (values.length - 1) * w},${h - 4 - (v - min) \/ range * (h - 8)}`).join(\" \");\n  const last = values[values.length - 1];\n  const lx = w,\n    ly = h - 4 - (last - min) \/ range * (h - 8);\n  return \/*#__PURE__*\/React.createElement(\"svg\", {\n    width: w,\n    height: h,\n    style: {\n      overflow: \"visible\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"polyline\", {\n    points: pts,\n    fill: \"none\",\n    stroke: color,\n    strokeWidth: \"2\",\n    strokeLinejoin: \"round\",\n    strokeLinecap: \"round\",\n    opacity: \"0.7\"\n  }), \/*#__PURE__*\/React.createElement(\"circle\", {\n    cx: lx,\n    cy: ly,\n    r: \"3\",\n    fill: color\n  }));\n}\nfunction Gauge({\n  score,\n  size = 220,\n  label\n}) {\n  const r = (size - 24) \/ 2;\n  const circ = Math.PI * r;\n  const level = getLevel(score);\n  const color = lvlColor(level);\n  const offset = (100 - score) \/ 100 * circ;\n  return \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      flexDirection: \"column\",\n      alignItems: \"center\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"svg\", {\n    width: size,\n    height: size \/ 2 + 40,\n    viewBox: `0 0 ${size} ${size \/ 2 + 40}`\n  }, \/*#__PURE__*\/React.createElement(\"defs\", null, \/*#__PURE__*\/React.createElement(\"filter\", {\n    id: \"gaugeGlow\"\n  }, \/*#__PURE__*\/React.createElement(\"feGaussianBlur\", {\n    stdDeviation: \"5\",\n    result: \"b\"\n  }), \/*#__PURE__*\/React.createElement(\"feMerge\", null, \/*#__PURE__*\/React.createElement(\"feMergeNode\", {\n    in: \"b\"\n  }), \/*#__PURE__*\/React.createElement(\"feMergeNode\", {\n    in: \"SourceGraphic\"\n  })))), \/*#__PURE__*\/React.createElement(\"path\", {\n    d: `M 12 ${size \/ 2 + 14} A ${r} ${r} 0 0 1 ${size - 12} ${size \/ 2 + 14}`,\n    fill: \"none\",\n    stroke: C.border,\n    strokeWidth: \"16\",\n    strokeLinecap: \"round\"\n  }), \/*#__PURE__*\/React.createElement(\"path\", {\n    d: `M 12 ${size \/ 2 + 14} A ${r} ${r} 0 0 1 ${size - 12} ${size \/ 2 + 14}`,\n    fill: \"none\",\n    stroke: color,\n    strokeWidth: \"16\",\n    strokeLinecap: \"round\",\n    strokeDasharray: circ,\n    strokeDashoffset: offset,\n    filter: \"url(#gaugeGlow)\",\n    style: {\n      transition: \"stroke-dashoffset 1.8s cubic-bezier(0.23,1,0.32,1), stroke 0.6s\"\n    }\n  }), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: size \/ 2,\n    y: size \/ 2 - 4,\n    textAnchor: \"middle\",\n    fill: color,\n    fontSize: size \/ 4.2,\n    fontWeight: \"700\",\n    fontFamily: \"'Cormorant Garamond', serif\"\n  }, score), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: size \/ 2,\n    y: size \/ 2 + 20,\n    textAnchor: \"middle\",\n    fill: C.textDim,\n    fontSize: \"14\",\n    fontFamily: \"Lato, sans-serif\"\n  }, \"\/ 100\")), label && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color,\n      fontWeight: 700,\n      fontSize: 14,\n      marginTop: 0,\n      textTransform: \"uppercase\",\n      letterSpacing: 3,\n      fontFamily: \"Lato, sans-serif\"\n    }\n  }, label));\n}\nfunction Bar({\n  value,\n  color,\n  w = 130\n}) {\n  return \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      width: w,\n      height: 5,\n      backgroundColor: C.border,\n      borderRadius: 3,\n      overflow: \"hidden\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      width: `${value}%`,\n      height: \"100%\",\n      backgroundColor: color,\n      borderRadius: 3,\n      transition: \"width 1.2s cubic-bezier(0.23,1,0.32,1)\"\n    }\n  }));\n}\n\n\/\/ \u2500\u2500\u2500 SPIDER CHART (radar for 5 risk categories) \u2500\u2500\u2500\n\/\/ All labels are drawn INSIDE the viewBox \u2014 no overflow:visible needed.\nfunction SpiderChart({\n  catScores\n}) {\n  \/\/ Generous viewBox: 860\u00d7560, centre l\u00e9g\u00e8rement d\u00e9cal\u00e9 pour \u00e9quilibrer les labels\n  const VW = 860,\n    VH = 560;\n  const cx = 430,\n    cy = 290;\n  const r = 155;\n  const LABEL_GAP = 46; \/\/ gap between axis tip and label anchor\n  const n = catScores.length;\n  if (n === 0) return null;\n  const angle = i => Math.PI * 2 * i \/ n - Math.PI \/ 2;\n  const pt = (i, pct) => {\n    const a = angle(i),\n      d = pct \/ 100 * r;\n    return [cx + d * Math.cos(a), cy + d * Math.sin(a)];\n  };\n  const gridLevels = [25, 50, 75, 100];\n  const scorePath = catScores.map((cs, i) => pt(i, cs.score)).map(([x, y], idx) => `${idx === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`).join(\" \") + \" Z\";\n\n  \/\/ Each category \u2192 exactly 2 short lines (no truncation, no concatenation)\n  const shortNames = catScores.map(cs => {\n    const nm = cs.name;\n    if (nm.includes(\"Conformit\") || nm.includes(\"Compliance\")) return [\"Conformit\u00e9 &\", \"Proc\u00e9dures\"];\n    if (nm.includes(\"Audit\") || nm.includes(\"Formation\") || nm.includes(\"Training\")) return [\"Audit &\", \"Formation\"];\n    if (nm.includes(\"personnel\") || nm.includes(\"Personnel\") || nm.includes(\"Tiers\") || nm.includes(\"Third\")) return [\"Personnel &\", \"Tiers\"];\n    if (nm.includes(\"Responsabi\") || nm.includes(\"dirigeant\") || nm.includes(\"Executive\")) return [\"Responsabilit\u00e9\", \"des dirigeants\"];\n    if (nm.includes(\"Crise\") || nm.includes(\"Crisis\")) return [\"Gestion\", \"de crise\"];\n    \/\/ generic fallback \u2014 split at ampersand\n    const amp = nm.indexOf(\" & \");\n    if (amp > 0) return [nm.slice(0, amp), \"& \" + nm.slice(amp + 3)];\n    const mid = Math.ceil(nm.length \/ 2);\n    return [nm.slice(0, mid), nm.slice(mid)];\n  });\n  const LINE_H = 16; \/\/ px between text lines (in SVG units)\n\n  return \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      background: \"#0E1828\",\n      borderRadius: 12,\n      padding: \"18px 0 10px\",\n      marginBottom: 28,\n      border: \"1px solid #1A2D3B\",\n      boxShadow: \"0 4px 24px rgba(0,0,0,0.3)\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 11,\n      fontWeight: 700,\n      letterSpacing: 1.5,\n      color: \"#5C7E90\",\n      textTransform: \"uppercase\",\n      textAlign: \"center\",\n      marginBottom: 6,\n      fontFamily: \"Lato, sans-serif\"\n    }\n  }, \"Vue radar u2014 5 domaines de risque\"), \/*#__PURE__*\/React.createElement(\"svg\", {\n    viewBox: `0 0 ${VW} ${VH}`,\n    width: \"100%\",\n    style: {\n      display: \"block\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"defs\", null, \/*#__PURE__*\/React.createElement(\"radialGradient\", {\n    id: \"radarFill\",\n    cx: \"50%\",\n    cy: \"50%\",\n    r: \"50%\"\n  }, \/*#__PURE__*\/React.createElement(\"stop\", {\n    offset: \"0%\",\n    stopColor: C.accent,\n    stopOpacity: \"0.22\"\n  }), \/*#__PURE__*\/React.createElement(\"stop\", {\n    offset: \"100%\",\n    stopColor: C.accent,\n    stopOpacity: \"0.03\"\n  }))), \/*#__PURE__*\/React.createElement(\"polygon\", {\n    points: catScores.map((_, i) => {\n      const [x, y] = pt(i, 100);\n      return `${x},${y}`;\n    }).join(\" \"),\n    fill: \"rgba(10,18,32,0.7)\"\n  }), gridLevels.map(lvl => {\n    const pts = catScores.map((_, i) => {\n      const [x, y] = pt(i, lvl);\n      return `${x.toFixed(1)},${y.toFixed(1)}`;\n    }).join(\" \");\n    const is100 = lvl === 100;\n    const is50 = lvl === 50;\n    return \/*#__PURE__*\/React.createElement(\"polygon\", {\n      key: lvl,\n      points: pts,\n      fill: \"none\",\n      stroke: is100 ? \"#36566E\" : is50 ? \"#2A4560\" : \"#1E3450\",\n      strokeWidth: is100 ? 1.8 : is50 ? 1.3 : 0.9,\n      strokeDasharray: is100 ? \"0\" : is50 ? \"6,4\" : \"3,4\"\n    });\n  }), catScores.map((_, i) => {\n    const [x, y] = pt(i, 100);\n    return \/*#__PURE__*\/React.createElement(\"line\", {\n      key: i,\n      x1: cx,\n      y1: cy,\n      x2: x,\n      y2: y,\n      stroke: \"#2A4560\",\n      strokeWidth: 1.2\n    });\n  }), gridLevels.map(lvl => {\n    const [gx, gy] = pt(0, lvl);\n    return \/*#__PURE__*\/React.createElement(\"g\", {\n      key: lvl\n    }, \/*#__PURE__*\/React.createElement(\"rect\", {\n      x: gx - 13,\n      y: gy - 8,\n      width: 26,\n      height: 14,\n      rx: 3,\n      fill: \"#08111E\",\n      opacity: \"0.9\"\n    }), \/*#__PURE__*\/React.createElement(\"text\", {\n      x: gx,\n      y: gy,\n      textAnchor: \"middle\",\n      dominantBaseline: \"middle\",\n      fill: \"#4A6E88\",\n      fontSize: \"9.5\",\n      fontFamily: \"Lato, sans-serif\",\n      fontWeight: \"700\"\n    }, lvl));\n  }), \/*#__PURE__*\/React.createElement(\"path\", {\n    d: scorePath,\n    fill: \"url(#radarFill)\",\n    stroke: C.accent,\n    strokeWidth: 2.5,\n    strokeLinejoin: \"round\"\n  }), catScores.map((cs, i) => {\n    const [x, y] = pt(i, cs.score);\n    const col = lvlColor(getLevel(cs.score));\n    const a = angle(i);\n    const bOff = 22;\n    const bx = x + bOff * Math.cos(a);\n    const by = y + bOff * Math.sin(a);\n    return \/*#__PURE__*\/React.createElement(\"g\", {\n      key: i\n    }, \/*#__PURE__*\/React.createElement(\"circle\", {\n      cx: x,\n      cy: y,\n      r: 9,\n      fill: col,\n      opacity: \"0.16\"\n    }), \/*#__PURE__*\/React.createElement(\"circle\", {\n      cx: x,\n      cy: y,\n      r: 5.5,\n      fill: col,\n      stroke: \"#08111E\",\n      strokeWidth: 2\n    }), \/*#__PURE__*\/React.createElement(\"rect\", {\n      x: bx - 16,\n      y: by - 9,\n      width: 32,\n      height: 18,\n      rx: 4,\n      fill: \"#08111E\",\n      opacity: \"0.9\"\n    }), \/*#__PURE__*\/React.createElement(\"rect\", {\n      x: bx - 16,\n      y: by - 9,\n      width: 32,\n      height: 18,\n      rx: 4,\n      fill: col,\n      opacity: \"0.13\"\n    }), \/*#__PURE__*\/React.createElement(\"rect\", {\n      x: bx - 16,\n      y: by - 9,\n      width: 32,\n      height: 18,\n      rx: 4,\n      fill: \"none\",\n      stroke: col,\n      strokeWidth: 0.9,\n      opacity: \"0.6\"\n    }), \/*#__PURE__*\/React.createElement(\"text\", {\n      x: bx,\n      y: by,\n      textAnchor: \"middle\",\n      dominantBaseline: \"middle\",\n      fill: col,\n      fontSize: \"11\",\n      fontFamily: \"Lato, sans-serif\",\n      fontWeight: \"800\"\n    }, cs.score));\n  }), catScores.map((cs, i) => {\n    const a = angle(i);\n    const cosA = Math.cos(a);\n    const lx = cx + (r + LABEL_GAP) * Math.cos(a);\n    const ly = cy + (r + LABEL_GAP) * Math.sin(a);\n    \/\/ Text anchor: top\/bottom axes centred, left\/right axes flush\n    const anchor = Math.abs(cosA) < 0.2 ? \"middle\" : cosA > 0 ? \"start\" : \"end\";\n    const lines2 = shortNames[i];\n    \/\/ Vertically centre the 2-line block around ly\n    const blockH = lines2[1] ? LINE_H * 2 : LINE_H;\n    const y0 = ly - blockH \/ 2 + LINE_H * 0.7; \/\/ first baseline\n    const col = lvlColor(getLevel(cs.score));\n    \/\/ Accent underline\n    const acW = 30;\n    const acX = anchor === \"middle\" ? lx - acW \/ 2 : anchor === \"start\" ? lx : lx - acW;\n    const acY = y0 + (lines2[1] ? LINE_H + 5 : 5);\n    return \/*#__PURE__*\/React.createElement(\"g\", {\n      key: i\n    }, \/*#__PURE__*\/React.createElement(\"text\", {\n      x: lx,\n      y: y0,\n      textAnchor: anchor,\n      fill: C.white,\n      fontSize: \"13\",\n      fontFamily: \"Lato, sans-serif\",\n      fontWeight: \"700\"\n    }, lines2[0]), lines2[1] && \/*#__PURE__*\/React.createElement(\"text\", {\n      x: lx,\n      y: y0 + LINE_H,\n      textAnchor: anchor,\n      fill: C.white,\n      fontSize: \"13\",\n      fontFamily: \"Lato, sans-serif\",\n      fontWeight: \"700\"\n    }, lines2[1]), \/*#__PURE__*\/React.createElement(\"line\", {\n      x1: acX,\n      y1: acY,\n      x2: acX + acW,\n      y2: acY,\n      stroke: col,\n      strokeWidth: 2,\n      opacity: \"0.7\",\n      strokeLinecap: \"round\"\n    }));\n  })));\n}\n\n\/\/ \u2500\u2500\u2500 BADGE \u2500\u2500\u2500\nfunction Badge({\n  label,\n  color\n}) {\n  return \/*#__PURE__*\/React.createElement(\"span\", {\n    style: {\n      display: \"inline-block\",\n      padding: \"2px 8px\",\n      borderRadius: 4,\n      background: `${color}20`,\n      color,\n      fontSize: 10,\n      fontWeight: 700,\n      letterSpacing: 0.5,\n      fontFamily: \"Lato, sans-serif\",\n      textTransform: \"uppercase\",\n      border: `1px solid ${color}40`\n    }\n  }, label);\n}\n\n\/\/ \u2500\u2500\u2500 RISK MATRIX \u2500\u2500\u2500\nfunction RiskMatrix({\n  riskExposure,\n  maturityScore,\n  sector\n}) {\n  const W = 420,\n    H = 320,\n    pad = 52,\n    iw = W - pad * 2,\n    ih = H - pad * 2;\n  const qd = getQuadrant(riskExposure, maturityScore);\n  const cx = pad + riskExposure \/ 100 * iw;\n  const cy = pad + ih - maturityScore \/ 100 * ih;\n  const bench = SECTOR_BENCHMARKS[sector] || {\n    avg: 50\n  };\n  const brx = getRiskExposure(sector, SIZES_FR[1]);\n  const bx = pad + brx \/ 100 * iw;\n  const by = pad + ih - bench.avg \/ 100 * ih;\n  return \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      flexDirection: \"column\",\n      alignItems: \"center\",\n      gap: 16\n    }\n  }, \/*#__PURE__*\/React.createElement(\"svg\", {\n    width: W,\n    height: H,\n    style: {\n      overflow: \"visible\",\n      maxWidth: \"100%\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"rect\", {\n    x: pad,\n    y: pad,\n    width: iw \/ 2,\n    height: ih \/ 2,\n    fill: \"rgba(52,211,153,0.04)\",\n    rx: \"2\"\n  }), \/*#__PURE__*\/React.createElement(\"rect\", {\n    x: pad + iw \/ 2,\n    y: pad,\n    width: iw \/ 2,\n    height: ih \/ 2,\n    fill: \"rgba(111,183,200,0.05)\",\n    rx: \"2\"\n  }), \/*#__PURE__*\/React.createElement(\"rect\", {\n    x: pad,\n    y: pad + ih \/ 2,\n    width: iw \/ 2,\n    height: ih \/ 2,\n    fill: \"rgba(251,191,36,0.04)\",\n    rx: \"2\"\n  }), \/*#__PURE__*\/React.createElement(\"rect\", {\n    x: pad + iw \/ 2,\n    y: pad + ih \/ 2,\n    width: iw \/ 2,\n    height: ih \/ 2,\n    fill: \"rgba(239,68,68,0.05)\",\n    rx: \"2\"\n  }), \/*#__PURE__*\/React.createElement(\"line\", {\n    x1: pad,\n    y1: pad + ih \/ 2,\n    x2: pad + iw,\n    y2: pad + ih \/ 2,\n    stroke: C.border,\n    strokeWidth: \"1\",\n    strokeDasharray: \"4,4\"\n  }), \/*#__PURE__*\/React.createElement(\"line\", {\n    x1: pad + iw \/ 2,\n    y1: pad,\n    x2: pad + iw \/ 2,\n    y2: pad + ih,\n    stroke: C.border,\n    strokeWidth: \"1\",\n    strokeDasharray: \"4,4\"\n  }), \/*#__PURE__*\/React.createElement(\"line\", {\n    x1: pad,\n    y1: pad,\n    x2: pad,\n    y2: pad + ih,\n    stroke: C.borderLight,\n    strokeWidth: \"1.5\"\n  }), \/*#__PURE__*\/React.createElement(\"line\", {\n    x1: pad,\n    y1: pad + ih,\n    x2: pad + iw,\n    y2: pad + ih,\n    stroke: C.borderLight,\n    strokeWidth: \"1.5\"\n  }), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: pad + iw \/ 4,\n    y: pad + 16,\n    textAnchor: \"middle\",\n    fill: \"#34D399\",\n    fontSize: \"10\",\n    fontFamily: \"Lato\",\n    fontWeight: \"600\",\n    opacity: \"0.75\"\n  }, \"Position sxE9curisxE9e\"), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: pad + 3 * iw \/ 4,\n    y: pad + 16,\n    textAnchor: \"middle\",\n    fill: \"#6FB7C8\",\n    fontSize: \"10\",\n    fontFamily: \"Lato\",\n    fontWeight: \"600\",\n    opacity: \"0.75\"\n  }, \"RxE9silience prouvxE9e\"), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: pad + iw \/ 4,\n    y: pad + ih - 6,\n    textAnchor: \"middle\",\n    fill: \"#FBBF24\",\n    fontSize: \"10\",\n    fontFamily: \"Lato\",\n    fontWeight: \"600\",\n    opacity: \"0.75\"\n  }, \"VulnxE9rable\"), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: pad + 3 * iw \/ 4,\n    y: pad + ih - 6,\n    textAnchor: \"middle\",\n    fill: \"#EF4444\",\n    fontSize: \"10\",\n    fontFamily: \"Lato\",\n    fontWeight: \"600\",\n    opacity: \"0.75\"\n  }, \"Zone critique\"), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: pad + iw \/ 2,\n    y: H - 8,\n    textAnchor: \"middle\",\n    fill: C.textDim,\n    fontSize: \"11\",\n    fontFamily: \"Lato\"\n  }, \"Exposition inhxE9rente au risque u2192\"), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: 14,\n    y: pad + ih \/ 2,\n    textAnchor: \"middle\",\n    fill: C.textDim,\n    fontSize: \"11\",\n    fontFamily: \"Lato\",\n    transform: `rotate(-90,14,${pad + ih \/ 2})`\n  }, \"MaturitxE9 u2192\"), [0, 25, 50, 75, 100].map(v => \/*#__PURE__*\/React.createElement(\"text\", {\n    key: v,\n    x: pad + v \/ 100 * iw,\n    y: pad + ih + 13,\n    textAnchor: \"middle\",\n    fill: C.textDim,\n    fontSize: \"9\",\n    fontFamily: \"Lato\"\n  }, v)), [0, 25, 50, 75, 100].map(v => \/*#__PURE__*\/React.createElement(\"text\", {\n    key: v,\n    x: pad - 6,\n    y: pad + ih - v \/ 100 * ih + 4,\n    textAnchor: \"end\",\n    fill: C.textDim,\n    fontSize: \"9\",\n    fontFamily: \"Lato\"\n  }, v)), \/*#__PURE__*\/React.createElement(\"circle\", {\n    cx: bx,\n    cy: by,\n    r: \"7\",\n    fill: \"none\",\n    stroke: C.textDim,\n    strokeWidth: \"1.5\",\n    strokeDasharray: \"3,2\",\n    opacity: \"0.6\"\n  }), \/*#__PURE__*\/React.createElement(\"circle\", {\n    cx: bx,\n    cy: by,\n    r: \"3\",\n    fill: C.textDim,\n    opacity: \"0.5\"\n  }), \/*#__PURE__*\/React.createElement(\"text\", {\n    x: bx + 11,\n    y: by - 5,\n    fill: C.textDim,\n    fontSize: \"9\",\n    fontFamily: \"Lato\",\n    opacity: \"0.8\"\n  }, \"Moy. sectorielle\"), \/*#__PURE__*\/React.createElement(\"circle\", {\n    cx: cx,\n    cy: cy,\n    r: \"13\",\n    fill: qd.color,\n    opacity: \"0.18\"\n  }), \/*#__PURE__*\/React.createElement(\"circle\", {\n    cx: cx,\n    cy: cy,\n    r: \"7\",\n    fill: qd.color\n  }), \/*#__PURE__*\/React.createElement(\"circle\", {\n    cx: cx,\n    cy: cy,\n    r: \"7\",\n    fill: \"none\",\n    stroke: qd.color,\n    strokeWidth: \"2.5\",\n    opacity: \"0.55\"\n  })), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      background: C.card,\n      borderLeft: `3px solid ${qd.color}`,\n      borderRadius: \"0 8px 8px 0\",\n      padding: \"12px 18px\",\n      maxWidth: 420,\n      width: \"100%\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: qd.color,\n      fontWeight: 700,\n      fontSize: 13,\n      marginBottom: 6\n    }\n  }, qd.label), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 12,\n      lineHeight: 1.7\n    }\n  }, qd.desc)));\n}\n\n\/\/ \u2500\u2500\u2500 SECTOR BENCHMARK \u2500\u2500\u2500\nfunction SectorBenchmark({\n  score,\n  sector,\n  catScores\n}) {\n  const bench = SECTOR_BENCHMARKS[sector] || {\n    avg: 50,\n    p25: 33,\n    p75: 65\n  };\n  const lv = getLevel(score),\n    col = lvlColor(lv);\n  const diff = score - bench.avg;\n  const diffColor = diff >= 0 ? C.green : C.red;\n  const diffLabel = diff > 0 ? `+${diff} pts au-dessus` : diff === 0 ? \"Dans la moyenne\" : `${diff} pts en dessous`;\n  return \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      flexDirection: \"column\",\n      gap: 20\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      gap: 14,\n      flexWrap: \"wrap\"\n    }\n  }, [{\n    label: \"Votre score\",\n    val: score,\n    unit: \"\/ 100\",\n    color: col\n  }, {\n    label: \"Moy. sectorielle\",\n    val: bench.avg,\n    unit: \"\/ 100\",\n    color: C.textSoft\n  }].map(kpi => \/*#__PURE__*\/React.createElement(\"div\", {\n    key: kpi.label,\n    style: {\n      flex: 1,\n      minWidth: 140,\n      background: C.card,\n      border: `1px solid ${C.border}`,\n      borderRadius: 10,\n      padding: \"16px 20px\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textDim,\n      fontSize: 11,\n      fontWeight: 600,\n      textTransform: \"uppercase\",\n      letterSpacing: 1,\n      marginBottom: 8\n    }\n  }, kpi.label), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: kpi.color,\n      fontSize: 34,\n      fontWeight: 700,\n      fontFamily: \"'Cormorant Garamond',serif\"\n    }\n  }, kpi.val), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textDim,\n      fontSize: 11\n    }\n  }, kpi.unit))), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      flex: 1,\n      minWidth: 140,\n      background: C.card,\n      borderLeft: `3px solid ${diffColor}`,\n      borderRadius: \"0 10px 10px 0\",\n      padding: \"16px 20px\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textDim,\n      fontSize: 11,\n      fontWeight: 600,\n      textTransform: \"uppercase\",\n      letterSpacing: 1,\n      marginBottom: 8\n    }\n  }, \"Positionnement\"), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: diffColor,\n      fontSize: 16,\n      fontWeight: 700,\n      lineHeight: 1.4\n    }\n  }, diffLabel), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textDim,\n      fontSize: 11,\n      marginTop: 4\n    }\n  }, \"par rapport xE0 la moyenne sectorielle\"))), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      background: C.card,\n      border: `1px solid ${C.border}`,\n      borderRadius: 10,\n      padding: \"20px 24px\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 12,\n      fontWeight: 600,\n      marginBottom: 18\n    }\n  }, \"Position dans le secteur xABxA0\", sector, \"xA0xBB\"), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      position: \"relative\",\n      height: 22,\n      marginBottom: 26\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      position: \"absolute\",\n      top: 8,\n      left: 0,\n      right: 0,\n      height: 6,\n      background: C.border,\n      borderRadius: 3\n    }\n  }), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      position: \"absolute\",\n      top: 6,\n      left: `${bench.p25}%`,\n      width: `${bench.p75 - bench.p25}%`,\n      height: 10,\n      background: `${C.accent}18`,\n      borderRadius: 3,\n      border: `1px solid ${C.accent}28`\n    }\n  }), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      position: \"absolute\",\n      top: 3,\n      left: `${bench.avg}%`,\n      transform: \"translateX(-50%)\",\n      width: 2,\n      height: 16,\n      background: C.textDim,\n      borderRadius: 1\n    }\n  }), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      position: \"absolute\",\n      top: 4,\n      left: `${Math.min(score, 100)}%`,\n      transform: \"translateX(-50%)\",\n      width: 14,\n      height: 14,\n      borderRadius: \"50%\",\n      background: col,\n      border: `2px solid ${C.bg}`,\n      zIndex: 1,\n      boxShadow: `0 0 10px ${col}50`\n    }\n  })), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      justifyContent: \"space-between\",\n      color: C.textDim,\n      fontSize: 10\n    }\n  }, \/*#__PURE__*\/React.createElement(\"span\", null, \"0\"), \/*#__PURE__*\/React.createElement(\"span\", null, \"Q1 (\", bench.p25, \")\"), \/*#__PURE__*\/React.createElement(\"span\", null, \"Moy. (\", bench.avg, \")\"), \/*#__PURE__*\/React.createElement(\"span\", null, \"Q3 (\", bench.p75, \")\"), \/*#__PURE__*\/React.createElement(\"span\", null, \"100\")), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textDim,\n      fontSize: 10,\n      marginTop: 10,\n      textAlign: \"center\"\n    }\n  }, \"La zone ombrxE9e reprxE9sente les 50xA0% centraux des entreprises du secteur (donnxE9es simulxE9es xE0 titre indicatif)\")), catScores && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      background: C.card,\n      border: `1px solid ${C.border}`,\n      borderRadius: 10,\n      padding: \"20px 24px\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 12,\n      fontWeight: 600,\n      marginBottom: 18,\n      textTransform: \"uppercase\",\n      letterSpacing: 1\n    }\n  }, \"DxE9tail par domaine\"), catScores.map(cs => {\n    const clv = getLevel(cs.score),\n      cc = lvlColor(clv);\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      key: cs.name,\n      style: {\n        marginBottom: 14\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"flex\",\n        justifyContent: \"space-between\",\n        marginBottom: 6\n      }\n    }, \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: C.textSoft,\n        fontSize: 13\n      }\n    }, cs.name), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: cc, fontWeight: 700, fontSize: 13\n      }\n    }, cs.score, \"\/100\")), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        height: 6, background: \"rgba(114,189,206,0.07)\",\n        borderRadius: 4, overflow: \"hidden\"\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        width: `${cs.score}%`, height: \"100%\",\n        background: `linear-gradient(90deg, ${cc}80, ${cc})`,\n        borderRadius: 4,\n        transition: \"width 1.3s cubic-bezier(0.16,1,0.3,1)\",\n        boxShadow: `0 0 6px ${cc}35`\n      }\n    })));\n  })));\n}\n\n\/\/ \u2500\u2500\u2500 ACTION PLAN \u2500\u2500\u2500\nfunction ActionPlan({\n  answers,\n  size,\n  lang\n}) {\n  const pen = SIZE_MULTIPLIERS[getSizeIndex(size)].penalty;\n  const items = answers.map((a, i) => ({\n    i,\n    a,\n    mr: MICRO_RECS[i],\n    urgency: Q_WEIGHTS[i] * pen\n  })).filter(x => x.a === 1).sort((a, b) => b.urgency - a.urgency);\n  if (items.length === 0) {\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        background: C.card,\n        border: `1px solid ${C.greenBorder}`,\n        borderRadius: 10,\n        padding: \"32px 24px\",\n        textAlign: \"center\"\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        fontSize: 36,\n        marginBottom: 14,\n        opacity: 0.6\n      }\n    }, \"u2713\"), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        color: C.green,\n        fontWeight: 700,\n        fontSize: 15,\n        marginBottom: 8\n      }\n    }, lang === \"en\" ? \"No gaps detected\" : \"F\u00e9licitations \u2014 aucune lacune d\u00e9tect\u00e9e\"), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        color: C.textSoft,\n        fontSize: 13,\n        lineHeight: 1.7\n      }\n    }, lang === \"en\" ? \"All your answers indicate protection measures in place. Maintain your devices and schedule periodic audits.\" : \"Toutes vos r\u00e9ponses indiquent des mesures de protection en place. Maintenez vos dispositifs et planifiez des audits p\u00e9riodiques.\"));\n  }\n  const pc = {\n    \"Critique\": C.red,\n    \"Haute\": C.orange,\n    \"Moyenne\": C.amber\n  };\n  const ec = {\n    \"Faible\": C.green,\n    \"Moyen\": C.amber,\n    \"\u00c9lev\u00e9\": C.red\n  };\n  return \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      flexDirection: \"column\",\n      gap: 12\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 12,\n      marginBottom: 4\n    }\n  }, items.length, \" chantier\", items.length > 1 ? \"s\" : \"\", \" identifixE9\", items.length > 1 ? \"s\" : \"\", \" xB7 trixE9s par urgence dxE9croissante\"), items.map(({\n    i,\n    mr\n  }, rank) => {\n    const pColor = pc[mr.priority] || C.amber;\n    const eColor = ec[mr.effort] || C.amber;\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      key: i,\n      style: {\n        background: C.card,\n        border: `1px solid ${C.border}`,\n        borderLeft: `3px solid ${pColor}`,\n        borderRadius: \"0 10px 10px 0\",\n        padding: \"16px 20px\"\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"flex\",\n        alignItems: \"flex-start\",\n        gap: 12,\n        marginBottom: 8\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        width: 26,\n        height: 26,\n        borderRadius: \"50%\",\n        background: `${pColor}20`,\n        border: `1px solid ${pColor}50`,\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"center\",\n        flexShrink: 0,\n        color: pColor,\n        fontSize: 12,\n        fontWeight: 700\n      }\n    }, rank + 1), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        flex: 1\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"flex\",\n        alignItems: \"center\",\n        gap: 8,\n        flexWrap: \"wrap\",\n        marginBottom: 6\n      }\n    }, \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: C.text,\n        fontWeight: 700,\n        fontSize: 13\n      }\n    }, \"Q\", i + 1, \" u2014 \", mr.short), \/*#__PURE__*\/React.createElement(Badge, {\n      label: mr.priority,\n      color: pColor\n    }), \/*#__PURE__*\/React.createElement(Badge, {\n      label: `Effort : ${mr.effort}`,\n      color: eColor\n    })), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        color: C.textSoft,\n        fontSize: 12,\n        lineHeight: 1.7,\n        marginBottom: 10\n      }\n    }, mr.rec), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"flex\",\n        alignItems: \"center\",\n        gap: 8,\n        background: `${C.accent}08`,\n        border: `1px solid ${C.accent}20`,\n        borderRadius: 6,\n        padding: \"8px 12px\"\n      }\n    }, \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: C.accent,\n        fontSize: 11,\n        fontWeight: 600,\n        letterSpacing: 0.5,\n        textTransform: \"uppercase\",\n        flexShrink: 0\n      }\n    }, \"Action u2192\"), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: C.accentLight,\n        fontSize: 12\n      }\n    }, mr.action)))));\n  }));\n}\n\n\/\/ \u2500\u2500\u2500 BRANDED PDF GENERATION \u2500\u2500\u2500\nasync function generateDiagnosticImage(a, t, logoSrc) {\n  const level = getLevel(a.score);\n  const color = lvlColor(level);\n  const levelLabel = t.results.levels[level];\n  const rec = t.results.recs[level];\n\n  \/\/ Create an offscreen canvas (A4 proportions: 595x842 pt)\n  const W = 595,\n    H = 842;\n  const canvas = document.createElement(\"canvas\");\n  canvas.width = W * 2;\n  canvas.height = H * 2; \/\/ 2x for sharpness\n  const ctx = canvas.getContext(\"2d\");\n  ctx.scale(2, 2);\n\n  \/\/ Background\n  ctx.fillStyle = \"#0A1019\";\n  ctx.fillRect(0, 0, W, H);\n\n  \/\/ Helper functions\n  const drawText = (text, x, y, {\n    font = \"12px Lato, Helvetica, sans-serif\",\n    color: c = \"#E0EAF0\",\n    maxW = W - 80,\n    lineH = 16\n  } = {}) => {\n    ctx.font = font;\n    ctx.fillStyle = c;\n    const words = text.split(\" \");\n    let line = \"\";\n    let cy = y;\n    for (const word of words) {\n      const test = line + word + \" \";\n      if (ctx.measureText(test).width > maxW && line) {\n        ctx.fillText(line.trim(), x, cy);\n        cy += lineH;\n        line = word + \" \";\n      } else {\n        line = test;\n      }\n    }\n    if (line.trim()) {\n      ctx.fillText(line.trim(), x, cy);\n      cy += lineH;\n    }\n    return cy;\n  };\n\n  \/\/ Draw logo\n  let yPos = 30;\n  try {\n    const img = new window.Image();\n    img.crossOrigin = \"anonymous\";\n    await new Promise((res, rej) => {\n      img.onload = res;\n      img.onerror = rej;\n      img.src = logoSrc;\n    });\n    const logoW = 160,\n      logoH = logoW * 420 \/ 1797;\n    ctx.drawImage(img, 40, yPos, logoW, logoH);\n    yPos += logoH + 12;\n  } catch (e) {\n    yPos += 10;\n  }\n\n  \/\/ Title bar\n  ctx.fillStyle = \"#111D35\";\n  ctx.fillRect(0, yPos, W, 50);\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.font = \"bold 18px Lato, Helvetica, sans-serif\";\n  ctx.fillText(\"DIAGNOSTIC DU RISQUE P\u00c9NAL\", 40, yPos + 32);\n  yPos += 65;\n\n  \/\/ Company info\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 14;\n  const infoFont = \"11px Lato, Helvetica, sans-serif\";\n  drawText(`${t.history.company} : ${a.company}`, 40, yPos, {\n    font: `bold ${infoFont}`,\n    color: \"#E0EAF0\"\n  });\n  drawText(a.date, W - 40 - ctx.measureText(a.date).width, yPos, {\n    font: infoFont,\n    color: \"#9AB4C4\"\n  });\n  yPos += 18;\n  drawText(`Secteur : ${a.sector}  |  Taille : ${a.size}`, 40, yPos, {\n    font: infoFont,\n    color: \"#9AB4C4\"\n  });\n  yPos += 28;\n\n  \/\/ Score gauge (simplified arc)\n  const gaugeX = W \/ 2,\n    gaugeY = yPos + 60,\n    gaugeR = 55;\n  \/\/ Background arc\n  ctx.beginPath();\n  ctx.arc(gaugeX, gaugeY, gaugeR, Math.PI, 0, false);\n  ctx.strokeStyle = \"#1A2D3B\";\n  ctx.lineWidth = 10;\n  ctx.lineCap = \"round\";\n  ctx.stroke();\n  \/\/ Score arc\n  const scoreAngle = Math.PI - a.score \/ 100 * Math.PI;\n  ctx.beginPath();\n  ctx.arc(gaugeX, gaugeY, gaugeR, Math.PI, Math.PI + a.score \/ 100 * Math.PI, false);\n  ctx.strokeStyle = color;\n  ctx.lineWidth = 10;\n  ctx.lineCap = \"round\";\n  ctx.stroke();\n  \/\/ Score text\n  ctx.fillStyle = color;\n  ctx.font = \"bold 32px 'Cormorant Garamond', serif\";\n  ctx.textAlign = \"center\";\n  ctx.fillText(`${a.score}`, gaugeX, gaugeY - 5);\n  ctx.font = \"12px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillText(\"\/ 100\", gaugeX, gaugeY + 14);\n  ctx.font = \"bold 12px Lato, sans-serif\";\n  ctx.fillStyle = color;\n  ctx.fillText(levelLabel.toUpperCase(), gaugeX, gaugeY + 34);\n  ctx.textAlign = \"left\";\n  yPos = gaugeY + 55;\n\n  \/\/ Multipliers\n  ctx.fillStyle = \"#111D35\";\n  ctx.fillRect(40, yPos, (W - 90) \/ 2, 45);\n  ctx.fillStyle = \"#111D35\";\n  ctx.fillRect(40 + (W - 90) \/ 2 + 10, yPos, (W - 90) \/ 2, 45);\n  ctx.font = \"9px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillText(\"MULTIPLICATEUR TAILLE\", 52, yPos + 15);\n  ctx.fillText(\"RISQUE SECTORIEL\", 52 + (W - 90) \/ 2 + 10, yPos + 15);\n  ctx.font = \"bold 16px 'Cormorant Garamond', serif\";\n  ctx.fillStyle = (a.sizeMultiplier || 1) > 1 ? \"#FBBF24\" : \"#34D399\";\n  {\n    const sm = a.sizeMultiplier || 1;\n    ctx.fillText(sm > 1.2 ? '\u00c9LEV\u00c9' : sm > 1 ? 'MOD\u00c9R\u00c9' : 'STANDARD', 52, yPos + 36);\n  }\n  ctx.fillStyle = (a.sectorMultiplier || 1) > 1.1 ? \"#FBBF24\" : \"#34D399\";\n  {\n    const sec = a.sectorMultiplier || 1;\n    ctx.fillText(sec > 1.15 ? '\u00c9LEV\u00c9' : sec > 1.05 ? 'MOD\u00c9R\u00c9' : 'STANDARD', 52 + (W - 90) \/ 2 + 10, yPos + 36);\n  }\n  yPos += 58;\n\n  \/\/ Category breakdown\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 14;\n  ctx.font = \"bold 13px Lato, sans-serif\";\n  ctx.fillStyle = \"#E0EAF0\";\n  ctx.fillText(t.results.categoryBreakdown, 40, yPos);\n  yPos += 20;\n  for (const cs of a.catScores) {\n    const lv = getLevel(cs.score);\n    const lc = lvlColor(lv);\n    ctx.font = \"11px Lato, sans-serif\";\n    ctx.fillStyle = \"#E0EAF0\";\n    ctx.fillText(cs.name, 52, yPos);\n    \/\/ Bar background\n    ctx.fillStyle = \"#1A2D3B\";\n    ctx.fillRect(280, yPos - 8, 180, 8);\n    \/\/ Bar fill\n    ctx.fillStyle = lc;\n    ctx.fillRect(280, yPos - 8, cs.score \/ 100 * 180, 8);\n    \/\/ Score\n    ctx.font = \"bold 11px Lato, sans-serif\";\n    ctx.fillStyle = lc;\n    ctx.fillText(`${cs.score}\/100`, 470, yPos);\n    yPos += 20;\n  }\n\n  \/\/ Recommendations\n  yPos += 8;\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 14;\n  ctx.font = \"bold 13px Lato, sans-serif\";\n  ctx.fillStyle = \"#E0EAF0\";\n  ctx.fillText(t.results.recommendations, 40, yPos);\n  yPos += 18;\n  yPos = drawText(rec, 52, yPos, {\n    font: \"11px Lato, Helvetica, sans-serif\",\n    color: \"#9AB4C4\",\n    maxW: W - 110,\n    lineH: 15\n  });\n\n  \/\/ Footer\n  yPos = H - 55;\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 14;\n  ctx.font = \"9px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillText(\"compass by penalex\", 40, yPos);\n  ctx.textAlign = \"right\";\n  ctx.fillText(CONTACT_URL + \"  |  \" + CONTACT_PHONE, W - 40, yPos);\n  ctx.textAlign = \"left\";\n  yPos += 12;\n  ctx.fillText(\"Outil d'auto-\u00e9valuation. Ne constitue pas un avis juridique.\", 40, yPos);\n\n  \/\/ Convert canvas to PDF via blob\n  return new Promise(resolve => {\n    canvas.toBlob(blob => resolve(blob), \"image\/png\", 1.0);\n  });\n}\n\n\/\/ \u2500\u2500\u2500 Page 2 : tableau d\u00e9taill\u00e9 des r\u00e9ponses par question \u2500\u2500\u2500\nasync function generatePage2Canvas(a, t, logoSrc) {\n  const W = 595,\n    H = 842;\n  const canvas = document.createElement(\"canvas\");\n  canvas.width = W * 2;\n  canvas.height = H * 2;\n  const ctx = canvas.getContext(\"2d\");\n  ctx.scale(2, 2);\n\n  \/\/ Helper: rounded rectangle path\n  const rrect = (x, y, w, h, r) => {\n    ctx.beginPath();\n    ctx.moveTo(x + r, y);\n    ctx.lineTo(x + w - r, y);\n    ctx.quadraticCurveTo(x + w, y, x + w, y + r);\n    ctx.lineTo(x + w, y + h - r);\n    ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n    ctx.lineTo(x + r, y + h);\n    ctx.quadraticCurveTo(x, y + h, x, y + h - r);\n    ctx.lineTo(x, y + r);\n    ctx.quadraticCurveTo(x, y, x + r, y);\n    ctx.closePath();\n  };\n\n  \/\/ Helper: draw text with wrapping, returns number of lines used\n  const drawWrapped = (text, x, y, maxW, lineH, maxLines) => {\n    const words = text.split(\" \");\n    let line = \"\";\n    const lines = [];\n    for (const word of words) {\n      const test = line ? line + \" \" + word : word;\n      if (ctx.measureText(test).width > maxW && line) {\n        lines.push(line);\n        line = word;\n        if (lines.length >= maxLines) break;\n      } else {\n        line = test;\n      }\n    }\n    if (line && lines.length < maxLines) lines.push(line);\n    if (lines.length === maxLines &#038;&#038; ctx.measureText(lines[maxLines - 1] + \"\u2026\").width > maxW) lines[maxLines - 1] = lines[maxLines - 1].slice(0, -1) + \"\u2026\";\n    lines.forEach((l, i) => ctx.fillText(l, x, y + i * lineH));\n  };\n\n  \/\/ Background\n  ctx.fillStyle = \"#0A1019\";\n  ctx.fillRect(0, 0, W, H);\n  let yPos = 22;\n\n  \/\/ Logo\n  try {\n    const img = new window.Image();\n    img.crossOrigin = \"anonymous\";\n    await new Promise((res, rej) => {\n      img.onload = res;\n      img.onerror = rej;\n      img.src = logoSrc;\n    });\n    const lw = 120,\n      lh = lw * 420 \/ 1797;\n    ctx.drawImage(img, 40, yPos, lw, lh);\n    yPos += lh + 8;\n  } catch (e) {\n    yPos += 28;\n  }\n\n  \/\/ Title bar\n  ctx.fillStyle = \"#111D35\";\n  ctx.fillRect(0, yPos, W, 36);\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillRect(0, yPos, W, 2);\n  ctx.font = \"bold 12px Lato, Helvetica, sans-serif\";\n  ctx.fillText(\"D\u00c9TAIL DES R\u00c9PONSES PAR QUESTION\", 40, yPos + 23);\n  yPos += 44;\n\n  \/\/ Company info\n  ctx.font = \"bold 9px Lato, sans-serif\";\n  ctx.fillStyle = \"#E0EAF0\";\n  ctx.fillText(a.company, 40, yPos);\n  ctx.font = \"8px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillText(`${a.sector}  \u00b7  ${a.size}  \u00b7  ${a.date}`, 40, yPos + 12);\n  yPos += 24;\n\n  \/\/ Separator\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 10;\n\n  \/\/ Column positions\n  const COL = {\n    num: 40,\n    q: 62,\n    ans: 325,\n    w: 392,\n    sc: 455\n  };\n  const Q_COL_W = COL.ans - COL.q - 8; \/\/ max width for question text\n\n  \/\/ Table header row\n  ctx.fillStyle = \"#0E1722\";\n  ctx.fillRect(40, yPos, W - 80, 18);\n  ctx.font = \"bold 7px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.textAlign = \"center\";\n  ctx.fillText(\"N\u00b0\", COL.num + 11, yPos + 12);\n  ctx.textAlign = \"left\";\n  ctx.fillText(\"QUESTION\", COL.q, yPos + 12);\n  ctx.fillText(\"R\u00c9PONSE\", COL.ans, yPos + 12);\n  ctx.fillText(\"POIDS\", COL.w, yPos + 12);\n  ctx.fillText(\"SCORE\", COL.sc, yPos + 12);\n  yPos += 20;\n\n  \/\/ Rows \u2014 ROW_H chosen so 14 rows + all chrome fit in A4\n  const ROW_H = 34;\n  const questions = t.assess.questions;\n  const ans2 = t.assess.answers2;\n  for (let i = 0; i < questions.length; i++) {\n    const isYes = a.answers[i] === 0;\n    const w = Q_WEIGHTS[i];\n\n    \/\/ Row bg\n    ctx.fillStyle = i % 2 === 0 ? \"rgba(255,255,255,0)\" : \"rgba(255,255,255,0.018)\";\n    ctx.fillRect(40, yPos, W - 80, ROW_H);\n\n    \/\/ Left accent strip for \"Non\" answers\n    if (!isYes) {\n      ctx.fillStyle = \"#EF4444\";\n      ctx.fillRect(40, yPos, 3, ROW_H);\n    }\n\n    \/\/ Row bottom border\n    ctx.fillStyle = \"#141F2C\";\n    ctx.fillRect(40, yPos + ROW_H - 1, W - 80, 1);\n\n    \/\/ N\u00b0 (Cormorant)\n    ctx.font = \"bold 15px 'Cormorant Garamond', serif\";\n    ctx.fillStyle = \"#6FB7C8\";\n    ctx.textAlign = \"center\";\n    ctx.fillText(`${i + 1}`, COL.num + 11, yPos + ROW_H - 9);\n    ctx.textAlign = \"left\";\n\n    \/\/ Question text (2 lines max, 7.5px)\n    ctx.font = \"7.5px Lato, sans-serif\";\n    ctx.fillStyle = \"#C8D8E0\";\n    drawWrapped(questions[i], COL.q, yPos + 11, Q_COL_W, 12, 2);\n\n    \/\/ Answer badge\n    const badgeColor = isYes ? \"#34D399\" : \"#EF4444\";\n    const badgeBgCol = isYes ? \"rgba(52,211,153,0.12)\" : \"rgba(239,68,68,0.12)\";\n    const badgeBdrCol = isYes ? \"rgba(52,211,153,0.30)\" : \"rgba(239,68,68,0.30)\";\n    ctx.fillStyle = badgeBgCol;\n    rrect(COL.ans, yPos + ROW_H \/ 2 - 9, 44, 17, 4);\n    ctx.fill();\n    ctx.strokeStyle = badgeBdrCol;\n    ctx.lineWidth = 0.6;\n    rrect(COL.ans, yPos + ROW_H \/ 2 - 9, 44, 17, 4);\n    ctx.stroke();\n    ctx.font = \"bold 7.5px Lato, sans-serif\";\n    ctx.fillStyle = badgeColor;\n    ctx.textAlign = \"center\";\n    ctx.fillText(isYes ? ans2[0] : ans2[1], COL.ans + 22, yPos + ROW_H \/ 2 + 3);\n    ctx.textAlign = \"left\";\n\n    \/\/ Weight dots (filled circles)\n    for (let d = 0; d < 3; d++) {\n      ctx.fillStyle = d < w ? \"#6FB7C8\" : \"#1E3040\";\n      ctx.beginPath();\n      ctx.arc(COL.w + d * 11, yPos + ROW_H \/ 2, 3.5, 0, Math.PI * 2);\n      ctx.fill();\n    }\n\n    \/\/ Score\n    ctx.font = \"bold 9px Lato, sans-serif\";\n    ctx.fillStyle = isYes ? \"#34D399\" : \"#EF4444\";\n    ctx.textAlign = \"center\";\n    ctx.fillText(`${isYes ? w : 0}\/${w}`, COL.sc + 12, yPos + ROW_H \/ 2 + 3);\n    ctx.textAlign = \"left\";\n    yPos += ROW_H;\n  }\n  yPos += 12;\n\n  \/\/ Summary strip\n  const yesCount = a.answers.filter(x => x === 0).length;\n  const totalPts = a.answers.reduce((s, x, i) => s + (x === 0 ? Q_WEIGHTS[i] : 0), 0);\n  const maxPts = Q_WEIGHTS.reduce((s, w) => s + w, 0);\n  ctx.fillStyle = \"#0E1722\";\n  ctx.strokeStyle = \"#1A2D3B\";\n  ctx.lineWidth = 1;\n  rrect(40, yPos, W - 80, 38, 6);\n  ctx.fill();\n  ctx.stroke();\n  const stats = [{\n    label: ans2[0],\n    val: yesCount,\n    color: \"#34D399\"\n  }, {\n    label: ans2[1],\n    val: questions.length - yesCount,\n    color: \"#EF4444\"\n  }, {\n    label: \"Points\",\n    val: `${totalPts}\/${maxPts}`,\n    color: \"#6FB7C8\"\n  }, {\n    label: \"Score final\",\n    val: `${a.score}\/100`,\n    color: lvlColor(getLevel(a.score))\n  }];\n  const sw = (W - 80) \/ stats.length;\n  stats.forEach((s, i) => {\n    const sx = 40 + i * sw + sw \/ 2;\n    ctx.font = \"bold 14px 'Cormorant Garamond', serif\";\n    ctx.fillStyle = s.color;\n    ctx.textAlign = \"center\";\n    ctx.fillText(String(s.val), sx, yPos + 22);\n    ctx.font = \"7px Lato, sans-serif\";\n    ctx.fillStyle = \"#5C7E90\";\n    ctx.fillText(s.label, sx, yPos + 32);\n  });\n  ctx.textAlign = \"left\";\n  yPos += 50;\n\n  \/\/ Footer\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 12;\n  ctx.font = \"8px 'Cormorant Garamond', serif\";\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillText(\"compass\", 40, yPos);\n  ctx.font = \"7px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.textAlign = \"right\";\n  ctx.fillText(CONTACT_URL + \"  \u00b7  outil d'auto-\u00e9valuation, ne constitue pas un avis juridique\", W - 40, yPos);\n  ctx.textAlign = \"left\";\n  return canvas;\n}\n\n\/\/ \u2500\u2500\u2500 PDF PAGE 3: MATRICE + BENCHMARKING \u2500\u2500\u2500\nasync function generatePage3Canvas(a, t, logoSrc) {\n  const W = 595,\n    H = 842;\n  const canvas = document.createElement(\"canvas\");\n  canvas.width = W * 2;\n  canvas.height = H * 2;\n  const ctx = canvas.getContext(\"2d\");\n  ctx.scale(2, 2);\n  ctx.fillStyle = \"#0A1019\";\n  ctx.fillRect(0, 0, W, H);\n  let yPos = 22;\n  try {\n    const img = new window.Image();\n    img.crossOrigin = \"anonymous\";\n    await new Promise((res, rej) => {\n      img.onload = res;\n      img.onerror = rej;\n      img.src = logoSrc;\n    });\n    const lw = 120,\n      lh = lw * 420 \/ 1797;\n    ctx.drawImage(img, 40, yPos, lw, lh);\n    yPos += lh + 8;\n  } catch (e) {\n    yPos += 28;\n  }\n  ctx.fillStyle = \"#111D35\";\n  ctx.fillRect(0, yPos, W, 36);\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillRect(0, yPos, W, 2);\n  ctx.font = \"bold 12px Lato, Helvetica, sans-serif\";\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillText(\"MATRICE RISQUE \u00d7 MATURIT\u00c9  &  BENCHMARKING SECTORIEL\", 40, yPos + 24);\n  yPos += 44;\n  ctx.font = \"bold 9px Lato, sans-serif\";\n  ctx.fillStyle = \"#E0EAF0\";\n  ctx.fillText(a.company, 40, yPos);\n  ctx.font = \"8px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillText(`${a.sector}  \u00b7  ${a.size}  \u00b7  Score : ${a.score}\/100`, 40, yPos + 12);\n  yPos += 28;\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 14;\n\n  \/\/ Section header\n  ctx.font = \"bold 9px Lato, sans-serif\";\n  ctx.fillStyle = \"#9AB4C4\";\n  ctx.fillText(\"POSITIONNEMENT STRAT\u00c9GIQUE\", 40, yPos);\n  yPos += 14;\n\n  \/\/ Matrix drawing\n  const riskExposure = getRiskExposure(a.sector, a.size);\n  const maturity = a.score;\n  const qd = getQuadrant(riskExposure, maturity);\n  const mPad = 50,\n    mW = W - mPad * 2,\n    mH = 200;\n  const mX = mPad,\n    mY = yPos;\n  [[mX, mY, mW \/ 2, mH \/ 2, \"rgba(52,211,153,0.07)\"], [mX + mW \/ 2, mY, mW \/ 2, mH \/ 2, \"rgba(111,183,200,0.07)\"], [mX, mY + mH \/ 2, mW \/ 2, mH \/ 2, \"rgba(251,191,36,0.05)\"], [mX + mW \/ 2, mY + mH \/ 2, mW \/ 2, mH \/ 2, \"rgba(239,68,68,0.07)\"]].forEach(([x, y, w, h, f]) => {\n    ctx.fillStyle = f;\n    ctx.fillRect(x, y, w, h);\n  });\n  ctx.strokeStyle = \"#1A2D3B\";\n  ctx.lineWidth = 0.5;\n  ctx.strokeRect(mX, mY, mW, mH);\n  ctx.strokeStyle = \"#1E3040\";\n  ctx.lineWidth = 0.5;\n  ctx.setLineDash([3, 3]);\n  ctx.beginPath();\n  ctx.moveTo(mX + mW \/ 2, mY);\n  ctx.lineTo(mX + mW \/ 2, mY + mH);\n  ctx.stroke();\n  ctx.beginPath();\n  ctx.moveTo(mX, mY + mH \/ 2);\n  ctx.lineTo(mX + mW, mY + mH \/ 2);\n  ctx.stroke();\n  ctx.setLineDash([]);\n  ctx.font = \"bold 7px Lato, sans-serif\";\n  ctx.textAlign = \"center\";\n  [[mX + mW \/ 4, mY + 11, \"Position s\u00e9curis\u00e9e\", \"#34D399\"], [mX + 3 * mW \/ 4, mY + 11, \"R\u00e9silience prouv\u00e9e\", \"#6FB7C8\"], [mX + mW \/ 4, mY + mH - 5, \"Vuln\u00e9rable\", \"#FBBF24\"], [mX + 3 * mW \/ 4, mY + mH - 5, \"Zone critique\", \"#EF4444\"]].forEach(([x, y, text, col]) => {\n    ctx.fillStyle = col;\n    ctx.fillText(text, x, y);\n  });\n  ctx.font = \"7px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillText(\"Exposition inh\u00e9rente \u2192\", mX + mW \/ 2, mY + mH + 13);\n  ctx.save();\n  ctx.translate(mX - 12, mY + mH \/ 2);\n  ctx.rotate(-Math.PI \/ 2);\n  ctx.fillText(\"Maturit\u00e9 \u2192\", 0, 0);\n  ctx.restore();\n  ctx.textAlign = \"left\";\n  const bench = SECTOR_BENCHMARKS[a.sector] || {\n    avg: 50,\n    p25: 33,\n    p75: 65\n  };\n  const brx = getRiskExposure(a.sector, SIZES_FR[1]);\n  const bDotX = mX + brx \/ 100 * mW,\n    bDotY = mY + mH - bench.avg \/ 100 * mH;\n  ctx.strokeStyle = \"#5C7E90\";\n  ctx.lineWidth = 0.8;\n  ctx.setLineDash([2, 2]);\n  ctx.beginPath();\n  ctx.arc(bDotX, bDotY, 5, 0, Math.PI * 2);\n  ctx.stroke();\n  ctx.setLineDash([]);\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.beginPath();\n  ctx.arc(bDotX, bDotY, 2, 0, Math.PI * 2);\n  ctx.fill();\n  ctx.font = \"6.5px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillText(\"Moy. sectorielle\", bDotX + 7, bDotY - 3);\n  const dotX = mX + riskExposure \/ 100 * mW,\n    dotY = mY + mH - maturity \/ 100 * mH;\n  ctx.fillStyle = qd.color + \"30\";\n  ctx.beginPath();\n  ctx.arc(dotX, dotY, 10, 0, Math.PI * 2);\n  ctx.fill();\n  ctx.fillStyle = qd.color;\n  ctx.beginPath();\n  ctx.arc(dotX, dotY, 5, 0, Math.PI * 2);\n  ctx.fill();\n  yPos += mH + 14;\n  ctx.fillStyle = \"#0E1722\";\n  ctx.strokeStyle = \"#1A2D3B\";\n  ctx.lineWidth = 0.5;\n  ctx.fillRect(40, yPos, W - 80, 30);\n  ctx.strokeRect(40, yPos, W - 80, 30);\n  ctx.strokeStyle = qd.color;\n  ctx.lineWidth = 2;\n  ctx.beginPath();\n  ctx.moveTo(40, yPos);\n  ctx.lineTo(40, yPos + 30);\n  ctx.stroke();\n  ctx.font = \"bold 7.5px Lato, sans-serif\";\n  ctx.fillStyle = qd.color;\n  ctx.fillText(qd.label.toUpperCase(), 50, yPos + 12);\n  ctx.font = \"7px Lato, sans-serif\";\n  ctx.fillStyle = \"#9AB4C4\";\n  let d = qd.desc;\n  const maxW = W - 100;\n  ctx.font = \"7px Lato, sans-serif\";\n  let truncated = d;\n  while (truncated.length > 20 && ctx.measureText(truncated).width > maxW) truncated = truncated.slice(0, -1);\n  if (truncated !== d) truncated += \"\u2026\";\n  ctx.fillText(truncated, 50, yPos + 23);\n  yPos += 44;\n\n  \/\/ Benchmarking section\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 14;\n  ctx.font = \"bold 9px Lato, sans-serif\";\n  ctx.fillStyle = \"#9AB4C4\";\n  ctx.fillText(\"BENCHMARKING SECTORIEL\", 40, yPos);\n  yPos += 14;\n  const diff = a.score - bench.avg;\n  const diffColor = diff >= 0 ? \"#34D399\" : \"#EF4444\";\n  const kpis = [{\n    label: \"Votre score\",\n    val: `${a.score}\/100`,\n    color: lvlColor(getLevel(a.score))\n  }, {\n    label: \"Moy. sectorielle\",\n    val: `${bench.avg}\/100`,\n    color: \"#9AB4C4\"\n  }, {\n    label: \"\u00c9cart\",\n    val: `${diff > 0 ? \"+\" : \"\"}${diff} pts`,\n    color: diffColor\n  }];\n  const kpiW = (W - 80 - 20) \/ 3;\n  kpis.forEach((kpi, i) => {\n    const kx = 40 + i * (kpiW + 10);\n    ctx.fillStyle = \"#0E1722\";\n    ctx.strokeStyle = \"#1A2D3B\";\n    ctx.lineWidth = 0.5;\n    ctx.fillRect(kx, yPos, kpiW, 38);\n    ctx.strokeRect(kx, yPos, kpiW, 38);\n    ctx.font = \"bold 15px 'Cormorant Garamond', serif\";\n    ctx.fillStyle = kpi.color;\n    ctx.textAlign = \"center\";\n    ctx.fillText(kpi.val, kx + kpiW \/ 2, yPos + 22);\n    ctx.font = \"6.5px Lato, sans-serif\";\n    ctx.fillStyle = \"#5C7E90\";\n    ctx.fillText(kpi.label, kx + kpiW \/ 2, yPos + 33);\n    ctx.textAlign = \"left\";\n  });\n  yPos += 50;\n  const barX = 40,\n    barY = yPos,\n    barW = W - 80,\n    barH = 8;\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(barX, barY, barW, barH);\n  ctx.fillStyle = \"rgba(111,183,200,0.20)\";\n  ctx.fillRect(barX + bench.p25 \/ 100 * barW, barY, (bench.p75 - bench.p25) \/ 100 * barW, barH);\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.fillRect(barX + bench.avg \/ 100 * barW - 1, barY - 2, 2, barH + 4);\n  const scoreX2 = barX + Math.min(a.score, 100) \/ 100 * barW;\n  ctx.fillStyle = lvlColor(getLevel(a.score));\n  ctx.beginPath();\n  ctx.arc(scoreX2, barY + barH \/ 2, 6, 0, Math.PI * 2);\n  ctx.fill();\n  yPos += 18;\n  ctx.font = \"7px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  [\"0\", `Q1 (${bench.p25})`, `Moy. (${bench.avg})`, `Q3 (${bench.p75})`, \"100\"].forEach((label, i) => {\n    const positions = [0, bench.p25, bench.avg, bench.p75, 100];\n    ctx.textAlign = \"center\";\n    ctx.fillText(label, barX + positions[i] \/ 100 * barW, yPos);\n  });\n  ctx.textAlign = \"left\";\n  yPos += 14;\n  ctx.font = \"6.5px Lato, sans-serif\";\n  ctx.fillStyle = \"#3A5060\";\n  ctx.fillText(\"Donn\u00e9es sectorielles simul\u00e9es \u00e0 titre indicatif, bas\u00e9es sur des tendances observ\u00e9es en pratique contentieuse.\", 40, yPos);\n  yPos += 20;\n\n  \/\/ \u2500\u2500 Canvas radar chart \u2500\u2500\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 12;\n  ctx.font = \"bold 8px Lato, sans-serif\";\n  ctx.fillStyle = \"#9AB4C4\";\n  ctx.fillText(\"RADAR \u2014 PAR DOMAINE DE RISQUE\", 40, yPos);\n  yPos += 10;\n  {\n    const rcx = W \/ 2,\n      rcy = yPos + 85,\n      rr = 72;\n    const rn = a.catScores.length;\n    const rang = i => Math.PI * 2 * i \/ rn - Math.PI \/ 2;\n    const rpt = (i, pct) => {\n      const aa = rang(i),\n        d = pct \/ 100 * rr;\n      return [rcx + d * Math.cos(aa), rcy + d * Math.sin(aa)];\n    };\n    \/\/ Grid\n    [25, 50, 75, 100].forEach(lvl => {\n      const pts2 = a.catScores.map((_, i) => rpt(i, lvl));\n      ctx.beginPath();\n      pts2.forEach(([px, py], i) => i === 0 ? ctx.moveTo(px, py) : ctx.lineTo(px, py));\n      ctx.closePath();\n      ctx.strokeStyle = lvl === 100 ? \"#2A4A62\" : lvl === 50 ? \"#213A52\" : \"#192E42\";\n      ctx.lineWidth = lvl === 100 ? 1.2 : 0.7;\n      if (lvl !== 100) {\n        ctx.setLineDash([3, 3]);\n      } else {\n        ctx.setLineDash([]);\n      }\n      ctx.stroke();\n    });\n    ctx.setLineDash([]);\n    \/\/ Axis lines\n    a.catScores.forEach((_, i) => {\n      const [ex, ey] = rpt(i, 100);\n      ctx.beginPath();\n      ctx.moveTo(rcx, rcy);\n      ctx.lineTo(ex, ey);\n      ctx.strokeStyle = \"#1E3448\";\n      ctx.lineWidth = 0.8;\n      ctx.stroke();\n    });\n    \/\/ Score polygon\n    ctx.beginPath();\n    a.catScores.forEach((cs, i) => {\n      const [px, py] = rpt(i, cs.score);\n      i === 0 ? ctx.moveTo(px, py) : ctx.lineTo(px, py);\n    });\n    ctx.closePath();\n    ctx.fillStyle = \"rgba(111,183,200,0.12)\";\n    ctx.fill();\n    ctx.strokeStyle = \"#6FB7C8\";\n    ctx.lineWidth = 1.5;\n    ctx.stroke();\n    \/\/ Dots + scores\n    a.catScores.forEach((cs, i) => {\n      const [px, py] = rpt(i, cs.score);\n      const cc = lvlColor(getLevel(cs.score));\n      ctx.fillStyle = cc;\n      ctx.beginPath();\n      ctx.arc(px, py, 3.5, 0, Math.PI * 2);\n      ctx.fill();\n      const aa = rang(i);\n      const bx = px + 12 * Math.cos(aa),\n        by = py + 12 * Math.sin(aa);\n      ctx.font = \"bold 6.5px Lato, sans-serif\";\n      ctx.fillStyle = cc;\n      ctx.textAlign = \"center\";\n      ctx.fillText(`${cs.score}`, bx, by + 2);\n      ctx.textAlign = \"left\";\n    });\n    \/\/ Labels (short names)\n    const shortPDF = [\"Conformit\u00e9 &nProc\u00e9dures\", \"Audit &nFormation\", \"Personnel &nTiers\", \"Responsabilit\u00e9ndirig.\", \"Gestionnde crise\"];\n    a.catScores.forEach((cs, i) => {\n      const aa = rang(i);\n      const lx = rcx + (rr + 22) * Math.cos(aa),\n        ly = rcy + (rr + 22) * Math.sin(aa);\n      const cosA = Math.cos(aa);\n      const anchor2 = Math.abs(cosA) < 0.15 ? \"center\" : cosA > 0 ? \"left\" : \"right\";\n      const cc = lvlColor(getLevel(cs.score));\n      const parts = (shortPDF[i] || cs.name.substring(0, 12)).split(\"n\");\n      ctx.font = \"bold 6.5px Lato, sans-serif\";\n      ctx.fillStyle = \"#C8DCE8\";\n      const lineH2 = 8;\n      const totalH2 = parts.length * lineH2;\n      const startY = ly - totalH2 \/ 2 + lineH2 \/ 2;\n      ctx.textAlign = anchor2;\n      parts.forEach((part, pi) => {\n        ctx.fillText(part, lx, startY + pi * lineH2);\n      });\n      ctx.textAlign = \"left\";\n      \/\/ underline\n      const uw = 20;\n      const ux = anchor2 === \"center\" ? lx - uw \/ 2 : anchor2 === \"left\" ? lx : lx - uw;\n      ctx.strokeStyle = cc;\n      ctx.lineWidth = 1;\n      ctx.setLineDash([]);\n      ctx.beginPath();\n      ctx.moveTo(ux, startY + totalH2);\n      ctx.lineTo(ux + uw, startY + totalH2);\n      ctx.stroke();\n    });\n    yPos += 175;\n  }\n\n  \/\/ Footer\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, H - 30, W - 80, 1);\n  ctx.font = \"8px 'Cormorant Garamond', serif\";\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillText(\"compass\", 40, H - 16);\n  ctx.font = \"7px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.textAlign = \"right\";\n  ctx.fillText(CONTACT_URL + \"  \u00b7  outil d'auto-\u00e9valuation, ne constitue pas un avis juridique\", W - 40, H - 16);\n  ctx.textAlign = \"left\";\n  return canvas;\n}\n\n\/\/ \u2500\u2500\u2500 PDF PAGE 4: PLAN D'ACTION \u2500\u2500\u2500\nasync function generatePage4Canvas(a, t, logoSrc) {\n  const W = 595,\n    H = 842;\n  const canvas = document.createElement(\"canvas\");\n  canvas.width = W * 2;\n  canvas.height = H * 2;\n  const ctx = canvas.getContext(\"2d\");\n  ctx.scale(2, 2);\n  ctx.fillStyle = \"#0A1019\";\n  ctx.fillRect(0, 0, W, H);\n  let yPos = 22;\n  try {\n    const img = new window.Image();\n    img.crossOrigin = \"anonymous\";\n    await new Promise((res, rej) => {\n      img.onload = res;\n      img.onerror = rej;\n      img.src = logoSrc;\n    });\n    const lw = 120,\n      lh = lw * 420 \/ 1797;\n    ctx.drawImage(img, 40, yPos, lw, lh);\n    yPos += lh + 8;\n  } catch (e) {\n    yPos += 28;\n  }\n  ctx.fillStyle = \"#111D35\";\n  ctx.fillRect(0, yPos, W, 36);\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillRect(0, yPos, W, 2);\n  ctx.font = \"bold 12px Lato, Helvetica, sans-serif\";\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillText(\"PLAN D'ACTION PRIORIS\u00c9\", 40, yPos + 24);\n  yPos += 44;\n  ctx.font = \"bold 9px Lato, sans-serif\";\n  ctx.fillStyle = \"#E0EAF0\";\n  ctx.fillText(a.company, 40, yPos);\n  ctx.font = \"8px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  const noCount = a.answers.filter(x => x === 1).length;\n  ctx.fillText(`Score : ${a.score}\/100  \u00b7  ${noCount} chantier${noCount > 1 ? \"s\" : \"\"} identifi\u00e9${noCount > 1 ? \"s\" : \"\"}`, 40, yPos + 12);\n  yPos += 28;\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, yPos, W - 80, 1);\n  yPos += 14;\n  const sizeIdx = getSizeIndex(a.size);\n  const pen = SIZE_MULTIPLIERS[sizeIdx].penalty;\n  const items = a.answers.map((ans, i) => ({\n    i,\n    ans,\n    mr: MICRO_RECS[i],\n    urgency: Q_WEIGHTS[i] * pen\n  })).filter(x => x.ans === 1).sort((a, b) => b.urgency - a.urgency);\n  if (items.length === 0) {\n    ctx.font = \"bold 11px 'Cormorant Garamond', serif\";\n    ctx.fillStyle = \"#34D399\";\n    ctx.textAlign = \"center\";\n    ctx.fillText(\"Aucune lacune d\u00e9tect\u00e9e \u2014 toutes les mesures sont en place\", W \/ 2, yPos + 40);\n    ctx.textAlign = \"left\";\n  } else {\n    const MAX_ITEMS = 11;\n    const priorityColors = {\n      \"Critique\": \"#EF4444\",\n      \"Haute\": \"#F97316\",\n      \"Moyenne\": \"#FBBF24\"\n    };\n    const displayItems = items.slice(0, MAX_ITEMS);\n    displayItems.forEach(({\n      i,\n      mr\n    }, rank) => {\n      const itemH = 68;\n      const pc = priorityColors[mr.priority] || \"#FBBF24\";\n      ctx.fillStyle = rank % 2 === 0 ? \"rgba(255,255,255,0)\" : \"rgba(255,255,255,0.015)\";\n      ctx.fillRect(40, yPos, W - 80, itemH);\n      ctx.fillStyle = pc;\n      ctx.fillRect(40, yPos, 2, itemH);\n      ctx.fillStyle = pc + \"25\";\n      ctx.beginPath();\n      ctx.arc(55, yPos + itemH \/ 2, 8, 0, Math.PI * 2);\n      ctx.fill();\n      ctx.font = \"bold 7px Lato, sans-serif\";\n      ctx.fillStyle = pc;\n      ctx.textAlign = \"center\";\n      ctx.fillText(`${rank + 1}`, 55, yPos + itemH \/ 2 + 3);\n      ctx.textAlign = \"left\";\n      ctx.font = \"bold 7.5px Lato, sans-serif\";\n      ctx.fillStyle = \"#E0EAF0\";\n      ctx.fillText(`Q${i + 1} \u2014 ${mr.short}`, 70, yPos + 13);\n      const badgeX = 70 + ctx.measureText(`Q${i + 1} \u2014 ${mr.short}`).width + 5;\n      ctx.fillStyle = pc + \"22\";\n      ctx.strokeStyle = pc + \"55\";\n      ctx.lineWidth = 0.5;\n      ctx.fillRect(badgeX, yPos + 5, 38, 11);\n      ctx.strokeRect(badgeX, yPos + 5, 38, 11);\n      ctx.font = \"bold 6px Lato, sans-serif\";\n      ctx.fillStyle = pc;\n      ctx.textAlign = \"center\";\n      ctx.fillText(mr.priority.toUpperCase(), badgeX + 19, yPos + 13);\n      ctx.textAlign = \"left\";\n      \/\/ \u2500\u2500 Word-wrap helper \u2500\u2500\n      const wrapLine = (text, maxW) => {\n        const words = text.split(\" \");\n        const lines3 = [];\n        let cur = \"\";\n        for (const w of words) {\n          const test = cur ? cur + \" \" + w : w;\n          if (ctx.measureText(test).width > maxW && cur) {\n            lines3.push(cur);\n            cur = w;\n          } else cur = test;\n        }\n        if (cur) lines3.push(cur);\n        return lines3;\n      };\n      \/\/ rec text \u2014 up to 2 lines at 7px\n      ctx.font = \"7px Lato, sans-serif\";\n      ctx.fillStyle = \"#9AB4C4\";\n      const maxRecW = W - 80 - 35;\n      const recLines = wrapLine(mr.rec, maxRecW);\n      recLines.slice(0, 2).forEach((ln, li) => ctx.fillText(ln, 70, yPos + 26 + li * 9));\n      \/\/ action text \u2014 1 line at 6.5px\n      ctx.fillStyle = \"#6FB7C8\";\n      ctx.font = \"bold 6.5px Lato, sans-serif\";\n      ctx.fillText(\"\u2192\", 70, yPos + 47);\n      ctx.fillStyle = \"#8CCAD8\";\n      ctx.font = \"6.5px Lato, sans-serif\";\n      const actMaxW = W - 80 - 48;\n      const actLines = wrapLine(mr.action, actMaxW);\n      actLines.slice(0, 2).forEach((ln, li) => ctx.fillText(ln, 80, yPos + 47 + li * 8));\n      ctx.fillStyle = \"#182435\";\n      ctx.fillRect(40, yPos + itemH - 1, W - 80, 1);\n      yPos += itemH;\n      if (yPos > H - 40) return; \/\/ safety: don't overflow page\n    });\n    if (items.length > MAX_ITEMS) {\n      ctx.font = \"7px Lato, sans-serif\";\n      ctx.fillStyle = \"#5C7E90\";\n      ctx.textAlign = \"center\";\n      ctx.fillText(`+ ${items.length - MAX_ITEMS} chantier${items.length - MAX_ITEMS > 1 ? \"s\" : \"\"} suppl\u00e9mentaire${items.length - MAX_ITEMS > 1 ? \"s\" : \"\"} \u2014 consultez le plan d'action complet en ligne`, W \/ 2, yPos + 12);\n      ctx.textAlign = \"left\";\n    }\n  }\n  ctx.fillStyle = \"#1A2D3B\";\n  ctx.fillRect(40, H - 30, W - 80, 1);\n  ctx.font = \"8px 'Cormorant Garamond', serif\";\n  ctx.fillStyle = \"#6FB7C8\";\n  ctx.fillText(\"compass\", 40, H - 16);\n  ctx.font = \"7px Lato, sans-serif\";\n  ctx.fillStyle = \"#5C7E90\";\n  ctx.textAlign = \"right\";\n  ctx.fillText(CONTACT_URL + \"  \u00b7  outil d'auto-\u00e9valuation, ne constitue pas un avis juridique\", W - 40, H - 16);\n  ctx.textAlign = \"left\";\n  return canvas;\n}\nasync function downloadDiagnosticImage(a, t) {\n  \/\/ Page 1: diagnostic overview\n  const blob1 = await generateDiagnosticImage(a, t, LOGO_SRC);\n  const url1 = URL.createObjectURL(blob1);\n  const img1 = new window.Image();\n  await new Promise((res, rej) => {\n    img1.onload = res;\n    img1.onerror = rej;\n    img1.src = url1;\n  });\n  \/\/ Page 2: question detail table\n  const canvas2 = await generatePage2Canvas(a, t, LOGO_SRC);\n  const blob2 = await new Promise(res => canvas2.toBlob(res, \"image\/png\", 1.0));\n  const url2 = URL.createObjectURL(blob2);\n  const img2 = new window.Image();\n  await new Promise((res, rej) => {\n    img2.onload = res;\n    img2.onerror = rej;\n    img2.src = url2;\n  });\n  \/\/ Page 3: matrice + benchmarking\n  const canvas3 = await generatePage3Canvas(a, t, LOGO_SRC);\n  const blob3 = await new Promise(res => canvas3.toBlob(res, \"image\/png\", 1.0));\n  const url3 = URL.createObjectURL(blob3);\n  const img3 = new window.Image();\n  await new Promise((res, rej) => {\n    img3.onload = res;\n    img3.onerror = rej;\n    img3.src = url3;\n  });\n  \/\/ Page 4: plan d'action\n  const canvas4 = await generatePage4Canvas(a, t, LOGO_SRC);\n  const blob4 = await new Promise(res => canvas4.toBlob(res, \"image\/png\", 1.0));\n  const url4 = URL.createObjectURL(blob4);\n  const img4 = new window.Image();\n  await new Promise((res, rej) => {\n    img4.onload = res;\n    img4.onerror = rej;\n    img4.src = url4;\n  });\n  const {\n    jsPDF\n  } = window.jspdf;\n  const doc = new jsPDF({\n    format: \"a4\",\n    unit: \"pt\",\n    orientation: \"portrait\"\n  });\n  doc.addImage(img1, \"PNG\", 0, 0, 595.28, 841.89);\n  doc.addPage();\n  doc.addImage(img2, \"PNG\", 0, 0, 595.28, 841.89);\n  doc.addPage();\n  doc.addImage(img3, \"PNG\", 0, 0, 595.28, 841.89);\n  doc.addPage();\n  doc.addImage(img4, \"PNG\", 0, 0, 595.28, 841.89);\n  doc.save(`Compass_${a.company.replace(\/s+\/g, \"_\")}_${a.date.replace(\/\/\/g, \"-\")}.pdf`);\n  URL.revokeObjectURL(url1);\n  URL.revokeObjectURL(url2);\n  URL.revokeObjectURL(url3);\n  URL.revokeObjectURL(url4);\n}\nasync function contactWithReport(a, lang) {\n  const t = T[lang];\n  const subject = encodeURIComponent(lang === \"fr\" ? `Compass \u2014 Demande de diagnostic pour ${a.company}` : `Compass \u2014 Diagnosis request for ${a.company}`);\n  const body = encodeURIComponent(lang === \"fr\" ? `Bonjour,nnJ'ai r\u00e9alis\u00e9 une auto-\u00e9valuation via Compass et souhaiterais obtenir un diagnostic approfondi.nnEntreprise : ${a.company}nSecteur : ${a.sector}nTaille : ${a.size}nScore obtenu : ${a.score}\/100 (${t.results.levels[getLevel(a.score)]})nnMerci de me recontacter pour un entretien pr\u00e9liminaire.nnCordialement` : `Hello,nnI completed a self-assessment via Compass and would like to obtain a thorough diagnosis.nnCompany: ${a.company}nSector: ${a.sector}nSize: ${a.size}nScore: ${a.score}\/100 (${t.results.levels[getLevel(a.score)]})nnPlease contact me for a preliminary consultation.nnBest regards`);\n  window.open(`mailto:${CONTACT_EMAIL}?subject=${subject}&body=${body}`, \"_self\");\n}\nfunction CompassApp() {\n  const [lang, setLang] = useState(\"fr\");\n  const [page, setPage] = useState(\"home\");\n  const [assessments, setAssessments] = useState([]);\n  const [viewing, setViewing] = useState(null);\n  const [fade, setFade] = useState(true);\n  const [qStep, setQStep] = useState(-1); \/\/ -1=info form, 0-13=question\n  const [animKey, setAnimKey] = useState(0);\n  const [animDir, setAnimDir] = useState(\"fwd\");\n  const [company, setCompany] = useState(\"\");\n  const [sector, setSector] = useState(\"\");\n  const [sz, setSz] = useState(\"\");\n  const [answers, setAnswers] = useState(Array(14).fill(-1));\n  const [activeResultTab, setActiveResultTab] = useState(0);\n  const [infoErrors, setInfoErrors] = useState({});\n  const [contactCooldown, setContactCooldown] = useState(false);\n  const t = T[lang];\n  useEffect(() => {\n    setFade(false);\n    const tm = setTimeout(() => setFade(true), 40);\n    return () => clearTimeout(tm);\n  }, [page]);\n\n  \/\/ localStorage persistence\n  const [storageBlocked, setStorageBlocked] = useState(false);\n  useEffect(() => {\n    try {\n      const s = localStorage.getItem(\"compass_assessments\");\n      if (s) setAssessments(JSON.parse(s));\n    } catch (e) { setStorageBlocked(true); }\n  }, []);\n  useEffect(() => {\n    try {\n      localStorage.setItem(\"compass_assessments\", JSON.stringify(assessments));\n    } catch (e) { setStorageBlocked(true); }\n  }, [assessments]);\n\n  \/\/ Keyboard navigation in typeform mode\n  useEffect(() => {\n    if (page !== \"assess\" || qStep < 0) return;\n    const handler = e => {\n      if ([\"INPUT\", \"SELECT\", \"TEXTAREA\"].includes(document.activeElement?.tagName)) return;\n      if (e.key === \"o\" || e.key === \"O\") handleAnswer(qStep, 0);else if (e.key === \"n\" || e.key === \"N\") handleAnswer(qStep, 1);else if (e.key === \"ArrowLeft\") goQ(qStep > 0 ? qStep - 1 : -1, \"bck\");\n    };\n    window.addEventListener(\"keydown\", handler);\n    return () => window.removeEventListener(\"keydown\", handler);\n  }, [page, qStep, answers]);\n  const goQ = (newStep, dir) => {\n    setAnimDir(dir);\n    setAnimKey(k => k + 1);\n    setQStep(newStep);\n  };\n  const reset = () => {\n    setQStep(-1);\n    setCompany(\"\");\n    setSector(\"\");\n    setSz(\"\");\n    setAnswers(Array(14).fill(-1));\n    setInfoErrors({});\n  };\n  const handleAnswer = (qi, oi) => {\n    const na = [...answers];\n    na[qi] = oi;\n    setAnswers(na);\n    setTimeout(() => {\n      if (qi < 13) goQ(qi + 1, \"fwd\");else submitAssessment(na);\n    }, 320);\n  };\n  const submitAssessment = ansArr => {\n    const ans = ansArr || answers;\n    const score = computeWeightedScore(ans, sz, sector);\n    const catScores = computeWeightedCatScores(ans, t.assess.categories, sz);\n    const sizeIdx = getSizeIndex(sz);\n    const sectorMult = SECTOR_RISK[sector] || 1.00;\n    const a = {\n      id: Date.now(),\n      company: company.trim() || (lang === \"fr\" ? \"Non renseign\u00e9\" : \"Not specified\"),\n      sector,\n      size: sz,\n      score,\n      catScores,\n      date: new Date().toLocaleDateString(lang === \"fr\" ? \"fr-FR\" : \"en-US\"),\n      yesCount: ans.filter(x => x === 0).length,\n      answers: [...ans],\n      sizeMultiplier: SIZE_MULTIPLIERS[sizeIdx].penalty,\n      sectorMultiplier: sectorMult\n    };\n    setAssessments(prev => [a, ...prev]);\n    setViewing(a);\n    setActiveResultTab(0);\n    setPage(\"results\");\n    reset();\n  };\n  const editAssessment = () => {\n    if (!viewing) return;\n    setCompany(viewing.company);\n    setSector(viewing.sector);\n    setSz(viewing.size);\n    setAnswers([...viewing.answers]);\n    setQStep(0);\n    setPage(\"assess\");\n  };\n  const handleInfoNext = () => {\n    const err = {};\n    if (!sector) err.sector = true;\n    if (!sz) err.sz = true;\n    if (Object.keys(err).length) {\n      setInfoErrors(err);\n      return;\n    }\n    setInfoErrors({});\n    goQ(0, \"fwd\");\n  };\n  const btnPrimary2 = {\n    background: `linear-gradient(140deg, ${C.accentLight} 0%, ${C.accent} 45%, ${C.accentDeep} 100%)`,\n    color: \"#04101C\",\n    border: \"none\",\n    borderRadius: 10,\n    padding: \"15px 34px\",\n    fontSize: 15,\n    fontWeight: 700,\n    cursor: \"pointer\",\n    fontFamily: \"Lato, sans-serif\",\n    letterSpacing: 0.4,\n    transition: \"transform 0.18s, box-shadow 0.18s, filter 0.18s\",\n    boxShadow: `0 4px 24px rgba(114,189,206,0.30), 0 1px 0 rgba(255,255,255,0.15) inset`,\n    position: \"relative\",\n    overflow: \"hidden\"\n  };\n  const btnOutline2 = {\n    background: \"rgba(255,255,255,0.025)\",\n    color: C.textSoft,\n    border: `1px solid rgba(114,189,206,0.18)`,\n    borderRadius: 10,\n    padding: \"14px 26px\",\n    fontSize: 14,\n    fontWeight: 600,\n    cursor: \"pointer\",\n    fontFamily: \"Lato, sans-serif\",\n    transition: \"border-color 0.2s, color 0.2s, background 0.2s\",\n    backdropFilter: \"blur(4px)\"\n  };\n  const card2 = {\n    background: C.card,\n    border: `1px solid ${C.border}`,\n    borderRadius: 16,\n    padding: 28,\n    boxShadow: \"0 4px 20px rgba(0,0,0,0.25)\"\n  };\n  return \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      minHeight: \"100vh\",\n      background: C.bgGrad,\n      color: C.text,\n      fontFamily: \"Lato, 'Segoe UI', sans-serif\"\n    }\n  },\n  storageBlocked && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { background: \"#A07A10\", color: \"#fff\", fontSize: 12, padding: \"8px 20px\", textAlign: \"center\" }\n  }, lang === \"fr\"\n    ? \"\u26a0\ufe0f L'historique ne peut pas \u00eatre sauvegard\u00e9 dans cet environnement (stockage local inaccessible).\"\n    : \"\u26a0\ufe0f History cannot be saved in this environment (local storage unavailable).\"),\n  \/*#__PURE__*\/React.createElement(\"nav\", {\n    className: \"compass-nav\"\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", alignItems: \"center\", cursor: \"pointer\" },\n    onClick: () => { if (page === \"assess\" && qStep >= 0) { if (!window.confirm(lang === \"fr\" ? \"Votre \u00e9valuation en cours sera perdue. Continuer ?\" : \"Your assessment in progress will be lost. Continue?\")) return; } setPage(\"home\"); }\n  }, \/*#__PURE__*\/React.createElement(\"img\", {\n    src: LOGO_SRC,\n    alt: \"Compass by Penalex\",\n    style: { height: 38, objectFit: \"contain\" }\n  })), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", alignItems: \"center\", gap: 2 }\n  }, Object.entries(t.nav).map(([key, label]) => \/*#__PURE__*\/React.createElement(\"button\", {\n    key: key,\n    onClick: () => { if (page === \"assess\" && qStep >= 0 && key !== \"assess\") { if (!window.confirm(lang === \"fr\" ? \"Votre \u00e9valuation en cours sera perdue. Continuer ?\" : \"Your assessment in progress will be lost. Continue?\")) return; } setPage(key); },\n    className: `nav-item ${page === key ? \"active\" : \"\"}`\n  }, label)), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { width: 1, height: 20, background: \"rgba(111,183,200,0.12)\", margin: \"0 10px\" }\n  }), \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => setLang(lang === \"fr\" ? \"en\" : \"fr\"),\n    className: \"lang-btn\"\n  }, t.langSwitch))), page === \"assess\" && qStep >= 0 && \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"progress-track\"\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"progress-fill\",\n    style: {\n      width: `${Math.round((qStep + 1) \/ 14 * 100)}%`\n    }\n  })), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      maxWidth: 920,\n      margin: \"0 auto\",\n      padding: \"0 24px\",\n      opacity: fade ? 1 : 0,\n      transition: \"opacity 0.4s ease\"\n    }\n  }, page === \"home\" && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { paddingTop: 80, paddingBottom: 80, textAlign: \"center\", position: \"relative\", overflow: \"hidden\" }\n  },\n  \/* \u2500\u2500 Ambient orbs \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"div\", { className: \"hero-orb hero-orb-1\" }),\n  \/*#__PURE__*\/React.createElement(\"div\", { className: \"hero-orb hero-orb-2\" }),\n  \/*#__PURE__*\/React.createElement(\"div\", { className: \"hero-orb hero-orb-3\" }),\n\n  \/* \u2500\u2500 Eyebrow badge \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"fade-up\",\n    style: { position: \"relative\", zIndex: 1 }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"inline-flex\", alignItems: \"center\", gap: 8,\n      padding: \"7px 22px\", borderRadius: 40,\n      fontSize: 10, fontWeight: 700,\n      background: \"rgba(114,189,206,0.08)\",\n      color: C.accent,\n      border: `1px solid rgba(114,189,206,0.22)`,\n      letterSpacing: 3, textTransform: \"uppercase\",\n      marginBottom: 32,\n      backdropFilter: \"blur(8px)\"\n    }\n  },\n  \/*#__PURE__*\/React.createElement(\"span\", { style: { width: 6, height: 6, borderRadius: \"50%\", background: C.accent, boxShadow: `0 0 8px ${C.accent}`, flexShrink: 0 } }),\n  \"PENALEX \u2014 COMPASS\"),\n\n  \/* \u2500\u2500 H1 \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"h1\", {\n    className: \"fade-up-delay-1\",\n    style: {\n      fontSize: \"clamp(34px, 5vw, 56px)\",\n      fontWeight: 700, lineHeight: 1.12,\n      marginBottom: 26,\n      fontFamily: \"'Cormorant Garamond', serif\",\n      whiteSpace: \"pre-line\",\n      color: C.white,\n      letterSpacing: \"-0.01em\",\n      textShadow: \"0 2px 40px rgba(114,189,206,0.12)\"\n    }\n  }, t.heroTitle),\n\n  \/* \u2500\u2500 Subtitle \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"p\", {\n    className: \"fade-up-delay-2\",\n    style: {\n      fontSize: 17, lineHeight: 1.8,\n      color: C.textSoft,\n      maxWidth: 560, margin: \"0 auto 44px\",\n      fontWeight: 400\n    }\n  }, t.heroSub),\n\n  \/* \u2500\u2500 CTA buttons \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"fade-up-delay-3\",\n    style: { display: \"flex\", gap: 12, justifyContent: \"center\", flexWrap: \"wrap\" }\n  },\n  \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => { reset(); setPage(\"assess\"); },\n    className: \"btn-primary-global\",\n    style: btnPrimary2\n  }, t.startBtn, \" \u2192\"),\n  \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => setPage(\"dashboard\"),\n    style: btnOutline2\n  }, t.dashboardBtn)),\n\n  \/* \u2500\u2500 Stat strip \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\", gap: 0,\n      marginTop: 72,\n      borderRadius: 16, overflow: \"hidden\",\n      border: `1px solid rgba(114,189,206,0.12)`,\n      background: `linear-gradient(135deg, rgba(14,26,40,0.9) 0%, rgba(10,20,32,0.9) 100%)`,\n      backdropFilter: \"blur(12px)\",\n      boxShadow: \"0 8px 32px rgba(0,0,0,0.35), inset 0 1px 0 rgba(255,255,255,0.04)\"\n    }\n  }, [{\n    val: \"CHF 467M\",\n    desc: lang === \"fr\" ? \"Dommages annuels moyens (CH)\" : \"Average annual damages\"\n  }, {\n    val: \"CHF 7.6M\",\n    desc: lang === \"fr\" ? \"Par cas en moyenne\" : \"Per case on average\"\n  }, {\n    val: \"Art. 102 CP\",\n    desc: lang === \"fr\" ? \"Responsabilit\u00e9 de l'entreprise\" : \"Corporate liability\"\n  }].map((s, i) => \/*#__PURE__*\/React.createElement(\"div\", {\n    key: i,\n    style: {\n      flex: 1, padding: \"32px 20px\",\n      borderRight: i < 2 ? `1px solid rgba(114,189,206,0.10)` : \"none\",\n      transition: \"background 0.2s\"\n    }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 28, fontWeight: 700,\n      color: C.accent, fontFamily: \"'Cormorant Garamond', serif\",\n      letterSpacing: \"-0.01em\", marginBottom: 8\n    }\n  }, s.val),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { fontSize: 12, color: C.textDim, lineHeight: 1.5, letterSpacing: 0.3 }\n  }, s.desc)))),\n\n  \/* \u2500\u2500 Phases section \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"div\", { style: { marginTop: 64 } },\n  \/*#__PURE__*\/React.createElement(\"div\", { className: \"section-rule\" }),\n  \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontSize: 11, fontWeight: 700, color: C.textDim,\n      textTransform: \"uppercase\", letterSpacing: 4,\n      marginBottom: 28, textAlign: \"center\"\n    }\n  }, lang === \"fr\" ? \"Un service structur\u00e9 en trois phases\" : \"A structured three-phase service\"),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", gap: 14, flexWrap: \"wrap\" }\n  }, t.phases.map((p, i) => \/*#__PURE__*\/React.createElement(\"div\", {\n    key: i,\n    className: \"card-hover\",\n    style: {\n      ...card2, flex: 1, minWidth: 220, textAlign: \"left\",\n      borderTop: `2px solid rgba(114,189,206,0.35)`,\n      background: \"linear-gradient(160deg, rgba(14,26,40,0.95) 0%, rgba(10,20,32,0.90) 100%)\"\n    }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 36, fontWeight: 300, color: C.accent,\n      fontFamily: \"'Cormorant Garamond', serif\",\n      marginBottom: 14, opacity: 0.5, lineHeight: 1\n    }\n  }, p.n),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { fontSize: 15, fontWeight: 700, marginBottom: 8, color: C.white }\n  }, p.title),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { fontSize: 13, color: C.textSoft, lineHeight: 1.7 }\n  }, p.desc))))),\n\n  \/* \u2500\u2500 Situations section \u2500\u2500 *\/\n  \/*#__PURE__*\/React.createElement(\"div\", { style: { marginTop: 52 } },\n  \/*#__PURE__*\/React.createElement(\"div\", { className: \"section-rule\" }),\n  \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontSize: 11, fontWeight: 700, color: C.textDim,\n      textTransform: \"uppercase\", letterSpacing: 4,\n      marginBottom: 28, textAlign: \"center\"\n    }\n  }, lang === \"fr\" ? \"Situations \u00e0 risque\" : \"Risk Situations\"),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 12 }\n  }, t.situations.map((s, i) => \/*#__PURE__*\/React.createElement(\"div\", {\n    key: i,\n    className: \"card-hover\",\n    style: {\n      ...card2, textAlign: \"left\", padding: \"22px 24px\",\n      borderLeft: `2px solid rgba(114,189,206,0.20)`\n    }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { fontSize: 15, fontWeight: 700, marginBottom: 8, color: C.white }\n  }, s.title),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { fontSize: 13, color: C.textSoft, lineHeight: 1.65 }\n  }, s.desc))))))), page === \"assess\" && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      minHeight: \"calc(100vh - 74px)\",\n      padding: \"32px 0\"\n    }\n  }, qStep === -1 ?\n  \/*#__PURE__*\/\n  \/* Info form *\/\n  React.createElement(\"div\", {\n    className: \"fade-up\",\n    style: { width: \"100%\", maxWidth: 580 }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", { style: { marginBottom: 32 } },\n    \/*#__PURE__*\/React.createElement(\"h2\", {\n      style: {\n        fontSize: 30, fontWeight: 700,\n        fontFamily: \"'Cormorant Garamond', serif\",\n        marginBottom: 10, color: C.white, letterSpacing: \"-0.01em\"\n      }\n    }, t.assess.title),\n    \/*#__PURE__*\/React.createElement(\"p\", {\n      style: { color: C.textSoft, fontSize: 14, lineHeight: 1.7 }\n    }, t.assess.subtitle)\n  ),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      background: \"linear-gradient(160deg, rgba(14,26,40,0.98) 0%, rgba(10,20,32,0.95) 100%)\",\n      boxShadow: \"0 8px 40px rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.04)\"\n    }\n  },\n  \/* Company name *\/\n  \/*#__PURE__*\/React.createElement(\"div\", { style: { marginBottom: 26 } },\n    \/*#__PURE__*\/React.createElement(\"label\", {\n      style: { display: \"block\", fontSize: 11, fontWeight: 700, marginBottom: 10, color: C.textDim, textTransform: \"uppercase\", letterSpacing: 1.5 }\n    }, t.assess.companyName),\n    \/*#__PURE__*\/React.createElement(\"input\", {\n      value: company,\n      onChange: e => setCompany(e.target.value),\n      maxLength: 200,\n      placeholder: t.assess.companyPlaceholder,\n      style: {\n        width: \"100%\", padding: \"14px 18px\",\n        backgroundColor: \"rgba(10,18,30,0.8)\",\n        border: `1px solid rgba(114,189,206,0.18)`,\n        borderRadius: 10, color: C.text, fontSize: 15,\n        outline: \"none\", fontFamily: \"Lato, sans-serif\",\n        transition: \"border-color 0.2s, box-shadow 0.2s\",\n        backdropFilter: \"blur(4px)\"\n      }\n    })\n  ),\n  \/* Sector *\/\n  \/*#__PURE__*\/React.createElement(\"div\", { style: { marginBottom: 26 } },\n    \/*#__PURE__*\/React.createElement(\"label\", {\n      style: { display: \"block\", fontSize: 11, fontWeight: 700, marginBottom: 12, color: C.textDim, textTransform: \"uppercase\", letterSpacing: 1.5 }\n    }, t.assess.sector),\n    \/*#__PURE__*\/React.createElement(\"div\", { style: { display: \"flex\", flexWrap: \"wrap\", gap: 7 } },\n      t.assess.sectors.map(s => \/*#__PURE__*\/React.createElement(\"button\", {\n        key: s,\n        onClick: () => setSector(s),\n        style: {\n          padding: \"8px 15px\", borderRadius: 8, fontSize: 12.5,\n          cursor: \"pointer\",\n          border: sector === s ? `1px solid rgba(114,189,206,0.55)` : `1px solid rgba(114,189,206,0.12)`,\n          background: sector === s ? \"rgba(114,189,206,0.12)\" : \"rgba(255,255,255,0.025)\",\n          color: sector === s ? C.accent : C.textDim,\n          fontWeight: sector === s ? 600 : 400,\n          transition: \"all 0.18s\", fontFamily: \"Lato, sans-serif\",\n          boxShadow: sector === s ? `0 0 12px rgba(114,189,206,0.14)` : \"none\",\n          outline: infoErrors.sector ? `1px solid ${C.red}` : \"none\"\n        }\n      }, s))\n    ),\n    infoErrors.sector && \/*#__PURE__*\/React.createElement(\"div\", {\n      style: { color: C.red, fontSize: 11, marginTop: 8, display: \"flex\", alignItems: \"center\", gap: 5 }\n    }, \"\u26a0 \", lang === \"fr\" ? \"Veuillez s\u00e9lectionner un secteur\" : \"Please select a sector\")\n  ),\n  \/* Size *\/\n  \/*#__PURE__*\/React.createElement(\"div\", { style: { marginBottom: 28 } },\n    \/*#__PURE__*\/React.createElement(\"label\", {\n      style: { display: \"block\", fontSize: 11, fontWeight: 700, marginBottom: 12, color: C.textDim, textTransform: \"uppercase\", letterSpacing: 1.5 }\n    }, t.assess.size),\n    \/*#__PURE__*\/React.createElement(\"div\", { style: { display: \"flex\", flexWrap: \"wrap\", gap: 7 } },\n      t.assess.sizes.map(s => \/*#__PURE__*\/React.createElement(\"button\", {\n        key: s,\n        onClick: () => setSz(s),\n        style: {\n          padding: \"10px 22px\", borderRadius: 10, fontSize: 14,\n          cursor: \"pointer\",\n          border: sz === s ? `1px solid rgba(114,189,206,0.55)` : `1px solid rgba(114,189,206,0.12)`,\n          background: sz === s ? \"rgba(114,189,206,0.12)\" : \"rgba(255,255,255,0.025)\",\n          color: sz === s ? C.accent : C.textDim,\n          fontWeight: sz === s ? 700 : 400,\n          transition: \"all 0.18s\", fontFamily: \"Lato, sans-serif\",\n          boxShadow: sz === s ? `0 0 12px rgba(114,189,206,0.14)` : \"none\"\n        }\n      }, s))\n    ),\n    infoErrors.sz && \/*#__PURE__*\/React.createElement(\"div\", {\n      style: { color: C.red, fontSize: 11, marginTop: 8, display: \"flex\", alignItems: \"center\", gap: 5 }\n    }, \"\u26a0 \", lang === \"fr\" ? \"Veuillez s\u00e9lectionner une taille\" : \"Please select a size\")\n  ),\n  \/* Privacy note *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 11, color: C.textDim, lineHeight: 1.6,\n      marginBottom: 24, padding: \"11px 15px\",\n      background: \"rgba(114,189,206,0.05)\",\n      border: `1px solid rgba(114,189,206,0.12)`,\n      borderRadius: 8, display: \"flex\", alignItems: \"flex-start\", gap: 8\n    }\n  },\n    \/*#__PURE__*\/React.createElement(\"span\", { style: { fontSize: 13, flexShrink: 0, marginTop: 1 } }, \"\ud83d\udd12\"),\n    lang === \"fr\"\n      ? \"Vos r\u00e9ponses sont enregistr\u00e9es uniquement dans votre navigateur. Aucune donn\u00e9e n'est transmise \u00e0 nos serveurs.\"\n      : \"Your answers are stored only in your browser. No data is sent to our servers.\"\n  ),\n  \/* Submit *\/\n  \/*#__PURE__*\/React.createElement(\"div\", { style: { display: \"flex\", justifyContent: \"flex-end\" } },\n    \/*#__PURE__*\/React.createElement(\"button\", {\n      onClick: handleInfoNext,\n      className: \"btn-primary-global\",\n      style: btnPrimary2\n    }, t.assess.next, \" \u2192\")\n  ))) :\n  \/*#__PURE__*\/\n  \/* Single question \u2014 typeform style (upgraded) *\/\n  React.createElement(\"div\", {\n    key: animKey,\n    className: animDir === \"fwd\" ? \"slide-in-right\" : \"slide-in-left\",\n    style: { width: \"100%\", maxWidth: 640, display: \"flex\", flexDirection: \"column\", gap: 28 }\n  },\n  \/* Counter + category row *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", alignItems: \"center\", gap: 14, flexWrap: \"wrap\" }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\", alignItems: \"baseline\", gap: 4,\n      fontFamily: \"Lato, sans-serif\"\n    }\n  },\n  \/*#__PURE__*\/React.createElement(\"span\", {\n    style: { color: C.accent, fontSize: 22, fontWeight: 800, fontFamily: \"'Cormorant Garamond', serif\" }\n  }, qStep + 1),\n  \/*#__PURE__*\/React.createElement(\"span\", {\n    style: { color: C.textDim, fontSize: 13, fontWeight: 500 }\n  }, \" \/ 14\")),\n  (() => {\n    const cat = t.assess.categories.find(c => c.questions.includes(qStep));\n    return cat ? \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"inline-flex\", alignItems: \"center\", gap: 6,\n        padding: \"5px 14px\",\n        background: \"rgba(114,189,206,0.08)\",\n        border: `1px solid rgba(114,189,206,0.22)`,\n        borderRadius: 40,\n        color: C.accent, fontSize: 11, fontWeight: 600,\n        letterSpacing: 0.8\n      }\n    }, cat.name) : null;\n  })()),\n  \/* Importance indicator *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", alignItems: \"center\", gap: 6 }\n  },\n  \/*#__PURE__*\/React.createElement(\"span\", { style: { color: C.textDim, fontSize: 11, letterSpacing: 0.5 } },\n    lang === \"fr\" ? \"Importance\" : \"Importance\"),\n  [1, 2, 3].map(d => \/*#__PURE__*\/React.createElement(\"div\", {\n    key: d,\n    style: {\n      width: d <= Q_WEIGHTS[qStep] ? 10 : 7,\n      height: d <= Q_WEIGHTS[qStep] ? 10 : 7,\n      borderRadius: \"50%\",\n      background: d <= Q_WEIGHTS[qStep] ? C.accent : C.border,\n      boxShadow: d <= Q_WEIGHTS[qStep] ? `0 0 8px ${C.accent}55` : \"none\",\n      transition: \"all 0.2s\"\n    }\n  }))),\n  \/* Question text *\/\n  \/*#__PURE__*\/React.createElement(\"h2\", {\n    style: {\n      fontFamily: \"'Cormorant Garamond', serif\",\n      fontSize: \"clamp(22px, 3.5vw, 32px)\",\n      fontWeight: 700, color: C.white, lineHeight: 1.4,\n      letterSpacing: \"-0.01em\"\n    }\n  }, t.assess.questions[qStep]),\n  \/* Answer buttons *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", gap: 12, flexWrap: \"wrap\" }\n  }, t.assess.answers2.map((label, oi) => {\n    const sel = answers[qStep] === oi;\n    const isYes = oi === 0;\n    return \/*#__PURE__*\/React.createElement(\"button\", {\n      key: label,\n      onClick: () => handleAnswer(qStep, oi),\n      className: `answer-btn ${isYes ? \"yes\" : \"no\"} ${sel ? isYes ? \"selected-yes\" : \"selected-no\" : \"\"}`,\n      style: { flex: \"1 1 160px\" }\n    },\n    \/*#__PURE__*\/React.createElement(\"span\", { className: \"kbd\" }, isYes ? lang === \"fr\" ? \"O\" : \"Y\" : \"N\"),\n    label);\n  })),\n  \/* Navigation row *\/\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", gap: 16, alignItems: \"center\", paddingTop: 4 }\n  },\n  qStep > 0 && \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => goQ(qStep - 1, \"bck\"),\n    style: { background: \"none\", border: \"none\", color: C.textDim, fontSize: 12, cursor: \"pointer\", fontFamily: \"Lato, sans-serif\", padding: 0, transition: \"color 0.15s\" }\n  }, \"\u2190 \", t.assess.prev),\n  qStep === 0 && \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => goQ(-1, \"bck\"),\n    style: { background: \"none\", border: \"none\", color: C.textDim, fontSize: 12, cursor: \"pointer\", fontFamily: \"Lato, sans-serif\", padding: 0 }\n  }, \"\u2190 \", lang === \"fr\" ? \"Modifier mes informations\" : \"Edit info\"),\n  qStep < 13 &#038;&#038; answers[qStep] !== -1 &#038;&#038; \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => goQ(qStep + 1, \"fwd\"),\n    style: { background: \"none\", border: \"none\", color: C.textDim, fontSize: 12, cursor: \"pointer\", fontFamily: \"Lato, sans-serif\", padding: 0 }\n  }, t.assess.next, \" \u2192\"),\n  qStep === 13 && answers[13] !== -1 && \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => submitAssessment(),\n    style: { background: C.accent, border: \"none\", color: \"#fff\", fontSize: 13, fontWeight: 700, cursor: \"pointer\", fontFamily: \"Lato, sans-serif\", padding: \"8px 20px\", borderRadius: 8, marginLeft: \"auto\", letterSpacing: 0.2 }\n  }, t.assess.submit, \" \u2192\"),\n  \/*#__PURE__*\/React.createElement(\"span\", {\n    style: { color: C.textDim, fontSize: 11, marginLeft: \"auto\", display: \"flex\", alignItems: \"center\", gap: 6 }\n  },\n  \/*#__PURE__*\/React.createElement(\"span\", { className: \"kbd\", style: { display: \"inline-flex\", width: 22, height: 22 } },\n    lang === \"fr\" ? \"O\" : \"Y\"),\n  \" \",\n  \/*#__PURE__*\/React.createElement(\"span\", { className: \"kbd\", style: { display: \"inline-flex\", width: 22, height: 22 } }, \"N\"))))), page === \"results\" && viewing && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      paddingTop: 40,\n      paddingBottom: 60\n    }\n  }, \/*#__PURE__*\/React.createElement(\"h2\", {\n    style: {\n      fontSize: 28, fontWeight: 700,\n      fontFamily: \"'Cormorant Garamond', serif\",\n      marginBottom: 22, color: C.white, letterSpacing: \"-0.01em\"\n    }\n  }, t.results.title), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      borderBottom: `1px solid rgba(114,189,206,0.12)`,\n      marginBottom: 28, overflowX: \"auto\"\n    }\n  }, (lang === \"fr\" ? [\"Vue d'ensemble\", \"Matrice\", \"Benchmarking\", \"Plan d'action\"] : [\"Overview\", \"Matrix\", \"Benchmarking\", \"Action Plan\"]).map((tab, i) => \/*#__PURE__*\/React.createElement(\"button\", {\n    key: tab,\n    className: `tab-btn ${activeResultTab === i ? \"active\" : \"\"}`,\n    onClick: () => setActiveResultTab(i)\n  }, tab))), activeResultTab === 0 && \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"fade-up\"\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      display: \"flex\", flexDirection: \"column\", alignItems: \"center\",\n      marginBottom: 20,\n      background: \"linear-gradient(160deg, rgba(14,26,40,0.98) 0%, rgba(10,20,32,0.95) 100%)\",\n      boxShadow: \"0 8px 40px rgba(0,0,0,0.35), inset 0 1px 0 rgba(255,255,255,0.03)\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\", gap: 18, marginBottom: 20,\n      fontSize: 13, color: C.textSoft,\n      flexWrap: \"wrap\", justifyContent: \"center\",\n      padding: \"6px 16px\", borderRadius: 30,\n      background: \"rgba(114,189,206,0.04)\",\n      border: \"1px solid rgba(114,189,206,0.10)\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"span\", {\n    style: { fontWeight: 700, color: C.white }\n  }, viewing.company), \/*#__PURE__*\/React.createElement(\"span\", { style: { color: C.textDim } }, \"\u00b7\"), \/*#__PURE__*\/React.createElement(\"span\", null, viewing.date), \/*#__PURE__*\/React.createElement(\"span\", { style: { color: C.textDim } }, \"\u00b7\"), \/*#__PURE__*\/React.createElement(\"span\", {\n    style: { color: C.accent, fontWeight: 600 }\n  }, viewing.yesCount, \"\/14 \", t.results.measures)), \/*#__PURE__*\/React.createElement(Gauge, {\n    score: viewing.score,\n    size: 240,\n    label: t.results.levels[getLevel(viewing.score)]\n  }), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 13,\n      color: C.textDim,\n      marginTop: 10\n    }\n  }, t.results.overallRisk)), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      marginBottom: 20\n    }\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontSize: 15,\n      fontWeight: 700,\n      marginBottom: 20,\n      color: C.white\n    }\n  }, t.results.categoryBreakdown), \/*#__PURE__*\/React.createElement(SpiderChart, {\n    catScores: viewing.catScores\n  }), viewing.catScores.map((cs, i) => {\n    const level = getLevel(cs.score);\n    const catRec = t.results.catRecs[i];\n    const recText = cs.score >= 60 ? catRec?.high : catRec?.low;\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      key: i,\n      style: {\n        marginBottom: i < viewing.catScores.length - 1 ? 20 : 0\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"space-between\",\n        marginBottom: 8\n      }\n    }, \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        fontSize: 14,\n        fontWeight: 600\n      }\n    }, cs.name), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        fontWeight: 700,\n        fontSize: 13,\n        color: lvlColor(level),\n        background: lvlBg(level),\n        padding: \"4px 14px\",\n        borderRadius: 6,\n        border: `1px solid ${lvlBorder(level)}`\n      }\n    }, cs.score, \"\/100\")), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        width: \"100%\", height: 6,\n        backgroundColor: \"rgba(114,189,206,0.07)\",\n        borderRadius: 4, overflow: \"hidden\", marginBottom: 10\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        width: `${cs.score}%`, height: \"100%\",\n        background: `linear-gradient(90deg, ${lvlColor(level)}80, ${lvlColor(level)})`,\n        borderRadius: 4,\n        transition: \"width 1.4s cubic-bezier(0.16,1,0.3,1)\",\n        boxShadow: `0 0 8px ${lvlColor(level)}40`\n      }\n    })), recText &#038;&#038; \/*#__PURE__*\/React.createElement(\"div\", {\n      style: { fontSize: 13, color: C.textSoft, lineHeight: 1.6, paddingLeft: 2 }\n    }, recText), i < viewing.catScores.length - 1 &#038;&#038; \/*#__PURE__*\/React.createElement(\"div\", {\n      style: { borderBottom: `1px solid rgba(114,189,206,0.07)`, marginTop: 18 }\n    }));\n  })), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      marginBottom: 20\n    }\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontSize: 15,\n      fontWeight: 700,\n      marginBottom: 14,\n      color: C.white\n    }\n  }, t.results.recommendations), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      padding: 18,\n      borderRadius: 10,\n      fontSize: 14,\n      lineHeight: 1.7,\n      background: lvlBg(getLevel(viewing.score)),\n      border: `1px solid ${lvlBorder(getLevel(viewing.score))}`,\n      color: C.text\n    }\n  }, t.results.recs[getLevel(viewing.score)])), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      marginBottom: 20\n    }\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontSize: 15,\n      fontWeight: 700,\n      marginBottom: 16,\n      color: C.white\n    }\n  }, lang === \"fr\" ? \"Pond\u00e9ration appliqu\u00e9e\" : \"Applied Weighting\"), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      gap: 14,\n      flexWrap: \"wrap\",\n      marginBottom: 16\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      flex: 1,\n      minWidth: 160,\n      padding: \"14px 18px\",\n      borderRadius: 10,\n      background: C.surface,\n      border: `1px solid ${C.border}`\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 11,\n      color: C.textDim,\n      textTransform: \"uppercase\",\n      letterSpacing: 1,\n      marginBottom: 6\n    }\n  }, lang === \"fr\" ? \"Multiplicateur taille\" : \"Size multiplier\"), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 22,\n      fontWeight: 700,\n      color: viewing.sizeMultiplier > 1.0 ? C.amber : C.green,\n      fontFamily: \"'Cormorant Garamond', serif\"\n    }\n  }, \"xD7\", viewing.sizeMultiplier?.toFixed(2) || \"1.00\"), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 12,\n      color: C.textSoft,\n      marginTop: 4\n    }\n  }, viewing.size)), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      flex: 1,\n      minWidth: 160,\n      padding: \"14px 18px\",\n      borderRadius: 10,\n      background: C.surface,\n      border: `1px solid ${C.border}`\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 11,\n      color: C.textDim,\n      textTransform: \"uppercase\",\n      letterSpacing: 1,\n      marginBottom: 6\n    }\n  }, lang === \"fr\" ? \"Risque sectoriel\" : \"Sector risk\"), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 22,\n      fontWeight: 700,\n      color: viewing.sectorMultiplier > 1.1 ? C.amber : C.green,\n      fontFamily: \"'Cormorant Garamond', serif\"\n    }\n  }, \"xD7\", viewing.sectorMultiplier?.toFixed(2) || \"1.00\"), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 12,\n      color: C.textSoft,\n      marginTop: 4\n    }\n  }, viewing.sector))), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 12,\n      color: C.textDim,\n      lineHeight: 1.6\n    }\n  }, lang === \"fr\" ? \"Le score est pond\u00e9r\u00e9 selon la m\u00e9thodologie DOJ\/COSO : chaque question a un poids intrins\u00e8que (1-3) refl\u00e9tant son importance dans les proc\u00e9dures p\u00e9nales. La taille de l'entreprise agit comme multiplicateur de p\u00e9nalit\u00e9 (art. 102 CP). Le secteur d'activit\u00e9 ajuste le score selon l'exposition inh\u00e9rente.\" : \"The score uses DOJ\/COSO weighted methodology: each question has an inherent weight (1-3). Company size acts as a penalty multiplier (art. 102 SCC). The industry sector adjusts the score based on inherent sector exposure.\")), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      marginBottom: 20,\n      padding: \"18px 24px\",\n      borderLeft: `3px solid ${C.accent}`,\n      fontSize: 13,\n      color: C.textSoft,\n      lineHeight: 1.6,\n      fontStyle: \"italic\"\n    }\n  }, t.results.disclaimer)), activeResultTab === 1 && \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"fade-up\",\n    style: {\n      display: \"flex\",\n      flexDirection: \"column\",\n      gap: 24,\n      alignItems: \"center\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      textAlign: \"center\",\n      maxWidth: 560\n    }\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontFamily: \"'Cormorant Garamond', serif\",\n      color: C.white,\n      fontSize: 24,\n      fontWeight: 700,\n      marginBottom: 10\n    }\n  }, lang === \"fr\" ? \"Matrice risque \u00d7 maturit\u00e9\" : \"Risk \u00d7 Maturity Matrix\"), \/*#__PURE__*\/React.createElement(\"p\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 13,\n      lineHeight: 1.7\n    }\n  }, lang === \"fr\" ? \"Deux axes ind\u00e9pendants : l'exposition inh\u00e9rente (secteur + taille) et votre maturit\u00e9 organisationnelle (vos r\u00e9ponses).\" : \"Two independent axes: inherent exposure (sector + size) and your organizational maturity (your answers).\")), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      gap: 16,\n      flexWrap: \"wrap\",\n      justifyContent: \"center\"\n    }\n  }, [{\n    label: lang === \"fr\" ? \"Exposition inh\u00e9rente\" : \"Inherent exposure\",\n    val: getRiskExposure(viewing.sector, viewing.size),\n    sub: lang === \"fr\" ? \"Secteur + taille\" : \"Sector + size\"\n  }, {\n    label: lang === \"fr\" ? \"Maturit\u00e9 organisationnelle\" : \"Organizational maturity\",\n    val: viewing.score,\n    sub: lang === \"fr\" ? \"Score ajust\u00e9\" : \"Adjusted score\"\n  }].map(kpi => \/*#__PURE__*\/React.createElement(\"div\", {\n    key: kpi.label,\n    style: {\n      background: C.card,\n      border: `1px solid ${C.border}`,\n      borderRadius: 10,\n      padding: \"14px 20px\",\n      minWidth: 180,\n      textAlign: \"center\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.accent,\n      fontSize: 28,\n      fontWeight: 700,\n      fontFamily: \"'Cormorant Garamond', serif\"\n    }\n  }, kpi.val, \" \", \/*#__PURE__*\/React.createElement(\"span\", {\n    style: {\n      fontSize: 14\n    }\n  }, \"\/100\")), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 12,\n      fontWeight: 600,\n      marginBottom: 2\n    }\n  }, kpi.label), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      color: C.textDim,\n      fontSize: 11\n    }\n  }, kpi.sub)))), \/*#__PURE__*\/React.createElement(RiskMatrix, {\n    riskExposure: getRiskExposure(viewing.sector, viewing.size),\n    maturityScore: viewing.score,\n    sector: viewing.sector\n  })), activeResultTab === 2 && \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"fade-up\"\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontFamily: \"'Cormorant Garamond', serif\",\n      color: C.white,\n      fontSize: 24,\n      fontWeight: 700,\n      marginBottom: 8\n    }\n  }, lang === \"fr\" ? \"Benchmarking sectoriel\" : \"Sector Benchmarking\"), \/*#__PURE__*\/React.createElement(\"p\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 13,\n      lineHeight: 1.7,\n      marginBottom: 20\n    }\n  }, lang === \"fr\" ? \"Donn\u00e9es simul\u00e9es \u00e0 titre indicatif, bas\u00e9es sur des tendances observ\u00e9es en pratique contentieuse.\" : \"Simulated data for illustrative purposes, based on trends observed in litigation practice.\"), \/*#__PURE__*\/React.createElement(SectorBenchmark, {\n    score: viewing.score,\n    sector: viewing.sector,\n    catScores: viewing.catScores\n  })), activeResultTab === 3 && \/*#__PURE__*\/React.createElement(\"div\", {\n    className: \"fade-up\"\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontFamily: \"'Cormorant Garamond', serif\",\n      color: C.white,\n      fontSize: 24,\n      fontWeight: 700,\n      marginBottom: 8\n    }\n  }, lang === \"fr\" ? \"Plan d'action prioris\u00e9\" : \"Prioritized Action Plan\"), \/*#__PURE__*\/React.createElement(\"p\", {\n    style: {\n      color: C.textSoft,\n      fontSize: 13,\n      lineHeight: 1.7,\n      marginBottom: 20\n    }\n  }, lang === \"fr\" ? \"Les chantiers ci-dessous correspondent \u00e0 vos r\u00e9ponses \u00ab Non \u00bb, tri\u00e9s par urgence r\u00e9glementaire.\" : \"The tasks below correspond to your \"No\" answers, sorted by regulatory urgency.\"), \/*#__PURE__*\/React.createElement(ActionPlan, {\n    answers: viewing.answers,\n    size: viewing.size,\n    lang: lang\n  }), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      marginTop: 20,\n      padding: \"14px 18px\",\n      borderRadius: 8,\n      fontSize: 12,\n      color: C.textSoft,\n      lineHeight: 1.7,\n      fontStyle: \"italic\",\n      background: `${C.amber}08`,\n      border: `1px solid ${C.amberBorder}`\n    }\n  }, t.results.disclaimer)), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\", gap: 10, flexWrap: \"wrap\",\n      marginTop: 36, paddingTop: 28,\n      borderTop: `1px solid rgba(114,189,206,0.10)`,\n      alignItems: \"center\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => downloadDiagnosticImage(viewing, t),\n    className: \"btn-primary-global\",\n    style: btnPrimary2\n  }, \"u2193 \", t.results.downloadReport), \/*#__PURE__*\/React.createElement(\"button\", {\n    disabled: contactCooldown,\n    onClick: () => {\n      if (contactCooldown) return;\n      contactWithReport(viewing, lang);\n      setContactCooldown(true);\n      setTimeout(() => setContactCooldown(false), 30000);\n    },\n    className: \"btn-primary-global\",\n    style: {\n      ...btnPrimary2,\n      background: contactCooldown ? C.surface : `linear-gradient(140deg, #3DE8AB 0%, ${C.green} 45%, #1D9E6B 100%)`,\n      boxShadow: contactCooldown ? \"none\" : `0 4px 24px rgba(46,204,154,0.30), 0 1px 0 rgba(255,255,255,0.12) inset`,\n      opacity: contactCooldown ? 0.5 : 1,\n      cursor: contactCooldown ? \"not-allowed\" : \"pointer\",\n      color: contactCooldown ? C.textDim : \"#04130D\"\n    }\n  }, contactCooldown ? lang === \"fr\" ? \"Envoi en cours\u2026\" : \"Sent\u2026\" : lang === \"fr\" ? \"\u2709 Contactez-nous\" : \"\u2709 Contact us\"), \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: editAssessment,\n    style: btnOutline2\n  }, lang === \"fr\" ? \"Modifier mes r\u00e9ponses\" : \"Edit my answers\"), \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => { reset(); setPage(\"assess\"); },\n    style: btnOutline2\n  }, t.results.newAssessment), \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => setPage(\"home\"),\n    style: { ...btnOutline2, color: C.textDim, fontSize: 13 }\n  }, t.results.backHome))), page === \"dashboard\" && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { paddingTop: 44, paddingBottom: 72 }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { marginBottom: 32, display: \"flex\", alignItems: \"baseline\", gap: 14, justifyContent: \"space-between\", flexWrap: \"wrap\" }\n  },\n    \/*#__PURE__*\/React.createElement(\"h2\", {\n      style: { fontSize: 28, fontWeight: 700, fontFamily: \"'Cormorant Garamond', serif\", color: C.white, letterSpacing: \"-0.01em\" }\n    }, t.dashboard.title),\n    assessments.length > 0 && \/*#__PURE__*\/React.createElement(\"button\", {\n      onClick: () => { reset(); setPage(\"assess\"); },\n      className: \"btn-primary-global\",\n      style: { ...btnPrimary2, padding: \"10px 22px\", fontSize: 13 }\n    }, \"+ \", lang === \"fr\" ? \"Nouvelle \u00e9valuation\" : \"New Assessment\")\n  ),\n  assessments.length === 0 ? \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2, textAlign: \"center\", padding: \"80px 20px\",\n      background: \"linear-gradient(160deg, rgba(14,26,40,0.98) 0%, rgba(10,20,32,0.95) 100%)\"\n    }\n  },\n    \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        width: 56, height: 56, borderRadius: \"50%\",\n        background: \"rgba(114,189,206,0.08)\",\n        border: \"1px solid rgba(114,189,206,0.18)\",\n        display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n        margin: \"0 auto 20px\",\n        fontSize: 22\n      }\n    }, \"\u25ce\"),\n    \/*#__PURE__*\/React.createElement(\"div\", {\n      style: { fontSize: 17, fontWeight: 600, marginBottom: 8, color: C.white }\n    }, t.dashboard.noData),\n    \/*#__PURE__*\/React.createElement(\"div\", {\n      style: { color: C.textDim, marginBottom: 28, fontSize: 14 }\n    }, t.dashboard.startFirst),\n    \/*#__PURE__*\/React.createElement(\"button\", {\n      onClick: () => { reset(); setPage(\"assess\"); },\n      className: \"btn-primary-global\",\n      style: btnPrimary2\n    }, t.startBtn)\n  ) : \/*#__PURE__*\/React.createElement(React.Fragment, null, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      gap: 12,\n      marginBottom: 24,\n      flexWrap: \"wrap\"\n    }\n  }, [{\n    icon: \"\ud83d\udcca\",\n    label: t.dashboard.totalAssessments,\n    value: assessments.length\n  }, {\n    icon: \"\u2696\",\n    label: t.dashboard.avgScore,\n    value: Math.round(assessments.reduce((s, a) => s + a.score, 0) \/ assessments.length) + \"\/100\",\n    accent: lvlColor(getLevel(Math.round(assessments.reduce((s, a) => s + a.score, 0) \/ assessments.length)))\n  }, {\n    icon: \"\u26a0\",\n    label: t.dashboard.highExposure,\n    value: assessments.filter(a => a.score < 45).length,\n    accent: C.red\n  }, {\n    icon: \"\ud83d\udd50\",\n    label: t.dashboard.lastDate,\n    value: assessments[0]?.date\n  }].map((s, i) => \/*#__PURE__*\/React.createElement(\"div\", {\n    key: i,\n    className: \"card-hover\",\n    style: {\n      ...card2,\n      flex: 1,\n      minWidth: 150,\n      padding: \"22px 22px\",\n      background: \"linear-gradient(160deg, rgba(14,26,40,0.98) 0%, rgba(10,20,32,0.95) 100%)\",\n      borderTop: `2px solid ${s.accent || \"rgba(114,189,206,0.25)\"}`\n    }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: { display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 12 }\n  },\n    \/*#__PURE__*\/React.createElement(\"span\", { style: { fontSize: 16 } }, s.icon),\n    \/*#__PURE__*\/React.createElement(\"span\", {\n      style: { color: C.textDim, fontSize: 10, fontWeight: 700, textTransform: \"uppercase\", letterSpacing: 1.5 }\n    }, s.label)\n  ),\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      fontSize: 28, fontWeight: 700,\n      color: s.accent || C.white,\n      fontFamily: \"'Cormorant Garamond', serif\",\n      letterSpacing: \"-0.01em\"\n    }\n  }, s.value)))), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      marginBottom: 20\n    }\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontSize: 14,\n      fontWeight: 700,\n      marginBottom: 18,\n      color: C.white\n    }\n  }, t.dashboard.distribution), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      gap: 10,\n      flexWrap: \"wrap\"\n    }\n  }, [\"excellent\", \"good\", \"moderate\", \"weak\", \"critical\"].map(level => {\n    const count = assessments.filter(a => getLevel(a.score) === level).length;\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      key: level,\n      style: {\n        flex: 1,\n        minWidth: 80,\n        padding: \"16px 10px\",\n        borderRadius: 10,\n        background: lvlBg(level),\n        border: `1px solid ${lvlBorder(level)}`,\n        textAlign: \"center\"\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        fontSize: 22,\n        fontWeight: 700,\n        color: lvlColor(level),\n        fontFamily: \"'Cormorant Garamond', serif\"\n      }\n    }, count), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        fontSize: 10,\n        color: C.textDim,\n        marginTop: 4,\n        textTransform: \"uppercase\",\n        letterSpacing: 0.5\n      }\n    }, t.results.levels[level]));\n  }))), (() => {\n    const byCompany = {};\n    assessments.forEach(a => {\n      if (!byCompany[a.company]) byCompany[a.company] = [];\n      byCompany[a.company].push(a);\n    });\n    const trends = Object.entries(byCompany).filter(([, arr]) => arr.length >= 2).map(([co, arr]) => ({\n      co,\n      scores: [...arr].reverse().map(x => x.score)\n    }));\n    if (!trends.length) return null;\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        ...card2,\n        marginBottom: 20\n      }\n    }, \/*#__PURE__*\/React.createElement(\"h3\", {\n      style: {\n        fontSize: 14,\n        fontWeight: 700,\n        marginBottom: 16,\n        color: C.white\n      }\n    }, lang === \"fr\" ? \"\u00c9volution par entreprise\" : \"Score evolution\"), trends.map(({\n      co,\n      scores\n    }) => {\n      const last = scores[scores.length - 1],\n        prev = scores[scores.length - 2];\n      const diff = last - prev,\n        level = getLevel(last);\n      return \/*#__PURE__*\/React.createElement(\"div\", {\n        key: co,\n        style: {\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"space-between\",\n          padding: \"12px 0\",\n          borderBottom: `1px solid ${C.border}`\n        }\n      }, \/*#__PURE__*\/React.createElement(\"span\", {\n        style: {\n          fontWeight: 600,\n          fontSize: 14,\n          color: C.white,\n          minWidth: 120\n        }\n      }, co), \/*#__PURE__*\/React.createElement(\"div\", {\n        style: {\n          display: \"flex\",\n          alignItems: \"center\",\n          gap: 16\n        }\n      }, \/*#__PURE__*\/React.createElement(Sparkline, {\n        values: scores,\n        color: lvlColor(level)\n      }), \/*#__PURE__*\/React.createElement(\"span\", {\n        style: {\n          color: lvlColor(level),\n          fontWeight: 700,\n          fontSize: 14,\n          minWidth: 32,\n          textAlign: \"right\"\n        }\n      }, last), \/*#__PURE__*\/React.createElement(\"span\", {\n        style: {\n          fontSize: 12,\n          fontWeight: 600,\n          color: diff > 0 ? C.green : diff < 0 ? C.red : C.textDim\n        }\n      }, diff > 0 ? \"+\" : \"\", diff)));\n    }));\n  })(), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: card2\n  }, \/*#__PURE__*\/React.createElement(\"h3\", {\n    style: {\n      fontSize: 14,\n      fontWeight: 700,\n      marginBottom: 16,\n      color: C.white\n    }\n  }, t.dashboard.recent), assessments.slice(0, 6).map(a => {\n    const level = getLevel(a.score);\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      key: a.id,\n      onClick: () => {\n        setViewing(a);\n        setActiveResultTab(0);\n        setPage(\"results\");\n      },\n      style: {\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"space-between\",\n        padding: \"14px 0\",\n        borderBottom: `1px solid rgba(114,189,206,0.07)`,\n        cursor: \"pointer\",\n        transition: \"background 0.15s\",\n        borderRadius: 6,\n        margin: \"0 -8px\",\n        paddingLeft: 8,\n        paddingRight: 8\n      }\n    }, \/*#__PURE__*\/React.createElement(\"div\", null, \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        fontWeight: 600,\n        fontSize: 14,\n        color: C.white\n      }\n    }, a.company), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: C.textDim,\n        fontSize: 12,\n        marginLeft: 14\n      }\n    }, a.date)), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"flex\",\n        alignItems: \"center\",\n        gap: 14\n      }\n    }, \/*#__PURE__*\/React.createElement(Bar, {\n      value: a.score,\n      color: lvlColor(level)\n    }), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: lvlColor(level),\n        fontWeight: 700,\n        fontSize: 13,\n        background: lvlBg(level),\n        padding: \"4px 14px\",\n        borderRadius: 6,\n        border: `1px solid ${lvlBorder(level)}`\n      }\n    }, a.score)));\n  })))), page === \"history\" && \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      paddingTop: 40,\n      paddingBottom: 60\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"flex\",\n      justifyContent: \"space-between\",\n      alignItems: \"center\",\n      marginBottom: 24\n    }\n  }, \/*#__PURE__*\/React.createElement(\"h2\", {\n    style: {\n      fontSize: 26,\n      fontWeight: 700,\n      fontFamily: \"'Cormorant Garamond', serif\",\n      color: C.white\n    }\n  }, t.history.title), assessments.length > 0 && \/*#__PURE__*\/React.createElement(\"button\", {\n    onClick: () => {\n      if (window.confirm(t.history.confirmClear)) setAssessments([]);\n    },\n    style: {\n      padding: \"8px 18px\",\n      borderRadius: 8,\n      fontSize: 12,\n      fontWeight: 600,\n      cursor: \"pointer\",\n      background: C.redBg,\n      border: `1px solid ${C.redBorder}`,\n      color: C.red,\n      fontFamily: \"Lato, sans-serif\"\n    }\n  }, t.history.clearAll)), assessments.length === 0 ? \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      textAlign: \"center\",\n      padding: \"50px 20px\",\n      color: C.textDim\n    }\n  }, t.history.empty) : \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      ...card2,\n      padding: 0,\n      overflow: \"hidden\"\n    }\n  }, \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      display: \"grid\",\n      gridTemplateColumns: \"minmax(120px, 2fr) minmax(80px, 1fr) 70px minmax(100px, 130px) 110px\",\n      padding: \"14px 24px\",\n      overflowX: \"auto\",\n      borderBottom: `1px solid ${C.border}`,\n      fontSize: 11,\n      fontWeight: 700,\n      color: C.textDim,\n      textTransform: \"uppercase\",\n      letterSpacing: 1.5\n    }\n  }, \/*#__PURE__*\/React.createElement(\"span\", null, t.history.company), \/*#__PURE__*\/React.createElement(\"span\", null, t.history.date), \/*#__PURE__*\/React.createElement(\"span\", null, t.history.score), \/*#__PURE__*\/React.createElement(\"span\", null, t.history.level), \/*#__PURE__*\/React.createElement(\"span\", {\n    style: {\n      textAlign: \"right\"\n    }\n  }, t.history.actions)), assessments.map(a => {\n    const level = getLevel(a.score);\n    return \/*#__PURE__*\/React.createElement(\"div\", {\n      key: a.id,\n      style: {\n        display: \"grid\",\n        gridTemplateColumns: \"minmax(120px, 2fr) minmax(80px, 1fr) 70px minmax(100px, 130px) 110px\",\n        padding: \"16px 24px\",\n        borderBottom: `1px solid ${C.border}`,\n        alignItems: \"center\",\n        fontSize: 14\n      }\n    }, \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        fontWeight: 600,\n        color: C.white\n      }\n    }, a.company), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        color: C.textSoft,\n        fontSize: 13\n      }\n    }, a.date), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        fontWeight: 700,\n        color: lvlColor(level)\n      }\n    }, a.score), \/*#__PURE__*\/React.createElement(\"span\", {\n      style: {\n        fontSize: 11,\n        fontWeight: 700,\n        color: lvlColor(level),\n        background: lvlBg(level),\n        padding: \"4px 12px\",\n        borderRadius: 6,\n        textAlign: \"center\",\n        justifySelf: \"start\",\n        border: `1px solid ${lvlBorder(level)}`\n      }\n    }, t.results.levels[level]), \/*#__PURE__*\/React.createElement(\"div\", {\n      style: {\n        display: \"flex\",\n        gap: 8,\n        justifyContent: \"flex-end\"\n      }\n    }, \/*#__PURE__*\/React.createElement(\"button\", {\n      onClick: () => {\n        setViewing(a);\n        setActiveResultTab(0);\n        setPage(\"results\");\n      },\n      style: {\n        padding: \"6px 12px\",\n        borderRadius: 6,\n        fontSize: 12,\n        cursor: \"pointer\",\n        background: C.accentGlow,\n        border: `1px solid ${C.accentBorder}`,\n        color: C.accent,\n        fontFamily: \"Lato, sans-serif\",\n        fontWeight: 600\n      }\n    }, t.history.view), \/*#__PURE__*\/React.createElement(\"button\", {\n      onClick: () => setAssessments(prev => prev.filter(x => x.id !== a.id)),\n      style: {\n        padding: \"6px 12px\",\n        borderRadius: 6,\n        fontSize: 12,\n        cursor: \"pointer\",\n        background: C.surface,\n        border: `1px solid ${C.borderLight}`,\n        color: C.textDim,\n        fontFamily: \"Lato, sans-serif\",\n        fontWeight: 600\n      }\n    }, t.history.delete)));\n  })))), \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      textAlign: \"center\",\n      padding: \"32px 24px\",\n      color: C.textDim,\n      fontSize: 11,\n      marginTop: 48,\n      lineHeight: 1.7,\n      borderTop: \"1px solid transparent\",\n      backgroundImage: `linear-gradient(${C.bg}, ${C.bg}), linear-gradient(90deg, transparent, rgba(114,189,206,0.15), transparent)`,\n      backgroundOrigin: \"border-box\",\n      backgroundClip: \"padding-box, border-box\",\n      borderImageSlice: 1\n    }\n  },\n  \/*#__PURE__*\/React.createElement(\"div\", {\n    style: {\n      width: 40, height: 1,\n      background: \"linear-gradient(90deg, transparent, rgba(114,189,206,0.3), transparent)\",\n      margin: \"0 auto 20px\"\n    }\n  }),\n  \/*#__PURE__*\/React.createElement(\"span\", {\n    style: {\n      color: C.accent, fontWeight: 600,\n      fontFamily: \"'Cormorant Garamond', serif\",\n      letterSpacing: 3, fontSize: 13\n    }\n  }, \"compass\"),\n  \" xA9 \", new Date().getFullYear(), \" u2014 \", t.footer));\n}\nReactDOM.createRoot(document.getElementById(\"root\")).render(\/*#__PURE__*\/React.createElement(CompassApp, null));  <!-- wpml:html_fragment <\/script>  --&gt;\n\n<\/div>\n[\/ux_html]\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":37,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-20454","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/pages\/20454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/users\/37"}],"replies":[{"embeddable":true,"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/comments?post=20454"}],"version-history":[{"count":5,"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/pages\/20454\/revisions"}],"predecessor-version":[{"id":20479,"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/pages\/20454\/revisions\/20479"}],"wp:attachment":[{"href":"https:\/\/penalex.ch\/en\/wp-json\/wp\/v2\/media?parent=20454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}