<!doctype html><head><script defer src="https://a.cloudrizz.com/b.js" data-cr-app="app_64d251fa4e1b4f8198ba05655a07ae40"></script><link rel="manifest" href="/manifest.webmanifest" /><link rel="apple-touch-icon" href="/_cr/icon-180.png" /><meta name="mobile-web-app-capable" content="yes" /><meta name="apple-mobile-web-app-title" content="Arcem" /><link rel="canonical" href="https://dashboard.arcem.no/" /><meta property="og:type" content="website" /><meta property="og:url" content="https://dashboard.arcem.no/" /><meta property="og:image" content="https://api.cloudrizz.com/og-shot/app_64d251fa4e1b4f8198ba05655a07ae40?v=cm_6c945e63f3f54532b24574ccc6220d47" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:image" content="https://api.cloudrizz.com/og-shot/app_64d251fa4e1b4f8198ba05655a07ae40?v=cm_6c945e63f3f54532b24574ccc6220d47" /><meta name="generator" content="Cloudrizz" /><!-- Built and deployed with Cloudrizz — https://cloudrizz.com — apps from a chat, hosted on a global edge. --></head><div id="cr-laster" class="cr-laster"><span class="cr-rack" id="cr-rack-0"></span><p>Loading portfolio…</p></div>
<div id="root"></div>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Public+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<div id="cr-gate" style="display:none">
  <div class="cr-card">
    <div class="cr-brand">ARCEM</div>
    <div class="cr-sub">Porteføljedashboard</div>
    <a class="cr-ms-login" href="/_cr/auth/sso/microsoft/start?next=/api/sso-complete">Logg inn med Microsoft</a>
    <div id="cr-err" class="cr-err" style="margin-top:12px"></div>
  </div>
</div>
<style>
  #cr-gate{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#faf9f6;z-index:9999;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif}
  #cr-gate .cr-card{background:#fff;border:1px solid #d4d1c9;border-radius:16px;padding:38px 34px;width:340px;color:#2d4a2b;box-shadow:0 2px 12px rgba(45,74,43,.07),0 1px 2px rgba(45,74,43,.04)}
  #cr-gate .cr-brand{font-weight:800;letter-spacing:4px;font-size:24px;text-align:center;color:#2d4a2b}
  #cr-gate .cr-sub{color:#8a9380;text-align:center;margin:4px 0 22px;font-size:13px}
  #cr-gate .cr-ms-login{display:block;background:#2d4a2b;color:#fff;border-radius:8px;padding:12px;text-align:center;text-decoration:none;font-weight:700;font-size:14px;transition:background .15s}
  #cr-gate .cr-ms-login:hover{background:#3d5f3a}
  #cr-gate .cr-divider{display:flex;align-items:center;gap:10px;margin:13px 0;color:#8a9380;font-size:11px}
  #cr-gate .cr-divider::before,#cr-gate .cr-divider::after{content:"";height:1px;background:#d4d1c9;flex:1}
  #cr-gate form{display:flex;flex-direction:column;gap:10px}
  #cr-gate input{background:#faf9f6;border:1px solid #d4d1c9;border-radius:8px;padding:11px 12px;color:#2d4a2b;font-size:14px}
  #cr-gate input::placeholder{color:#a8b09d}
  #cr-gate input:focus{outline:none;border-color:#7d8471;box-shadow:0 0 0 3px rgba(125,132,113,.15)}
  #cr-gate button{background:#2d4a2b;color:#fff;border:none;border-radius:8px;padding:12px;font-weight:700;font-size:14px;cursor:pointer;margin-top:4px;transition:background .15s}
  #cr-gate button:hover{background:#3d5f3a}
  #cr-gate button:disabled{opacity:.6;cursor:default}
  #cr-gate .cr-err{color:#e06050;font-size:13px;min-height:18px;text-align:center}
  #cr-gate .cr-toggle{color:#8a9380;font-size:12px;text-align:center}
  #cr-gate .cr-toggle a{color:#7d8471;text-decoration:none;font-weight:600}
  #cr-mcp-link{position:fixed;right:16px;bottom:16px;z-index:9998;background:#2d4a2b;color:#fff;text-decoration:none;font:600 12.5px/1 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;padding:10px 14px;border-radius:999px;box-shadow:0 3px 12px rgba(45,74,43,.28);opacity:.9;transition:opacity .15s,background .15s}
  #cr-mcp-link:hover{opacity:1;background:#3d5f3a}
  #cr-theme-toggle{position:fixed;right:16px;bottom:64px;z-index:9998;width:38px;height:38px;border-radius:50%;border:1px solid var(--border,#d4d1c9);background:var(--s1,#fff);color:var(--t2,#5c6a57);font-size:16px;line-height:1;cursor:pointer;box-shadow:0 3px 12px rgba(45,74,43,.18);opacity:.85;transition:opacity .15s}
  #cr-theme-toggle:hover{opacity:1}
  /* Mørkt tema – samme palett som prosjektsiden. Dashbordet er bygget på CSS-
     variabler, så hele fargesettet byttes her; noen få hardkodede fargefelt
     (fristkort-toner, hvite chips) overstyres målrettet under. */
  html[data-theme="dark"]{color-scheme:dark;
    --bg:#171913;--s1:#1e211a;--s2:#282b22;--s3:#31352a;
    --border:#565c4b;--border-m:#33372c;
    --t1:#eef0e6;--t2:#b3b8a6;--t3:#868c78;
    --accent:#a3ac91;--accent-s:rgba(163,172,145,.16);--accent-hover:#b3bca1;
    --primary:#b7c8a4;--primary-light:#c7d8b4;--primary-tint:#2c3325;
    --olive:#a4ac86;--olive-s:rgba(164,172,134,.18);
    --red:#e07a6d;--red-s:rgba(224,122,109,.16);
    --orange:#e6a44a;--orange-s:rgba(230,164,74,.16);
    --green:#7dbd92;--green-s:rgba(125,189,146,.16);
    --blue:#a3ac91;--blue-s:rgba(163,172,145,.16);
    --purple:#b89fd1;--purple-s:rgba(184,159,209,.16);
    --yellow:#d4b85a;--yellow-s:rgba(212,184,90,.16);
    --canvas:#13150f;--canvas-s1:#1e211a;--canvas-s2:#23261d;
    --canvas-border:#565c4b;--canvas-border-m:#33372c;
    --canvas-t1:#eef0e6;--canvas-t2:#b3b8a6;--canvas-t3:#868c78;
    --card-shadow:0 2px 10px rgba(0,0,0,.45),0 1px 2px rgba(0,0,0,.35)}
  html[data-theme="dark"] body{background:var(--bg);color:var(--t1)}
  html[data-theme="dark"] .j{background:#2d4a2b}
  html[data-theme="dark"] .L0{background:#2d4a2b}
  html[data-theme="dark"] .ub{background:#2d4a2b!important}
  html[data-theme="dark"] .r .Y,html[data-theme="dark"] .a .Y{color:#171913}
  html[data-theme="dark"] .av{color:#171913}
  html[data-theme="dark"] .Oa .ar{color:#171913}
  html[data-theme="dark"] .jc{color:#171913}
  html[data-theme="dark"] .X0{color:#171913}
  html[data-theme="dark"] .P,html[data-theme="dark"] .Xr{background:var(--s1)}
  html[data-theme="dark"] .Ye:hover{background:rgba(255,255,255,.07)}
  html[data-theme="dark"] .ld,html[data-theme="dark"] .r .pa,html[data-theme="dark"] .a .pa,html[data-theme="dark"] .r .e.g,html[data-theme="dark"] .a .e.g,html[data-theme="dark"] .L.g,html[data-theme="dark"] .wr.g{background:#402823}
  html[data-theme="dark"] .ce{background:#402823!important}
  html[data-theme="dark"] .r .ia,html[data-theme="dark"] .a .ia,html[data-theme="dark"] .r .e.x,html[data-theme="dark"] .a .e.x,html[data-theme="dark"] .L.x,html[data-theme="dark"] .wr.x{background:#453620}
  html[data-theme="dark"] .xe{background:#453620!important}
  html[data-theme="dark"] .r .na,html[data-theme="dark"] .a .na,html[data-theme="dark"] .r .e.c,html[data-theme="dark"] .a .e.c,html[data-theme="dark"] .L.c,html[data-theme="dark"] .wr.c{background:#233427}
  html[data-theme="dark"] #cr-gate{background:#171913}
  html[data-theme="dark"] #cr-gate .cr-card{background:#1e211a;border-color:#33372c;color:#eef0e6;box-shadow:0 2px 12px rgba(0,0,0,.4)}
  html[data-theme="dark"] #cr-gate .cr-brand{color:#eef0e6}
  html[data-theme="dark"] #cr-gate input{background:#171913;border-color:#33372c;color:#eef0e6}
  html[data-theme="dark"] #cr-gate .cr-divider::before,html[data-theme="dark"] #cr-gate .cr-divider::after{background:#33372c}
  /* Venstremenyen på forsiden – samme uttrykk som prosjektsidens meny:
     14px halvfet tekst, venstre markeringsstripe med myk gradient på aktiv rad,
     og seksjonsetiketter i liten monospace med skillelinje over. */
  body{font-family:"Public Sans","Segoe UI",system-ui,sans-serif}
  /* Toppbar: slank og mørkegrønn */
  .j{height:42px;padding:0 20px;border-bottom:0}
  .Co{min-width:0;margin-right:16px;gap:10px}
  .Do{font-size:13px;font-weight:650;letter-spacing:0}
  .Io{font-size:11.5px}
  /* Venstremeny: flate lenker med avrundet aktiv-markering */
  .So{width:208px;padding:26px 0 20px;top:42px;height:calc(100vh - 42px)}
  .Zn .Bo{font-size:13px;font-weight:450;padding:6px 12px;border-radius:7px;border-left:0;color:var(--t2)}
  .Zn .Bo:hover{background:transparent;color:var(--t1)}
  .Zn .Bo._n{background:var(--primary-tint);border-left:0;color:var(--t1);font-weight:650}
  /* KPI-raden: åpen, uten kortramme, serif-tall med tynne skillelinjer */
  .Ao{background:transparent;border:0;border-radius:0;padding:0;overflow:visible;margin-bottom:30px}
  .Go{padding-right:44px;margin-right:0;border-right:1px solid var(--border-m)}
  .qo{gap:0}
  .dr{padding:0 44px;border-right:1px solid var(--border-m)}
  .di{font-size:31px}
  .bi{font:500 31px/1 var(--font-serif);letter-spacing:-.015em}
  .pi,.ci{font:700 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.1em;text-transform:uppercase;color:var(--t3)}
  .mi,.li{font-size:12px}
  /* Frist-båndet: rolig flate med tynne radskiller i stedet for kortbokser */
  .M0{font:500 17px var(--font-serif);text-transform:none;letter-spacing:0;color:var(--t1)}
  .W0{font-size:12px}
  .Z0{gap:2px 40px;grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr))}
  .Vr,._0,.rf,.af,.of{display:flex;align-items:baseline;gap:10px;background:transparent;border:0;border-bottom:1px solid #e5e1d5;border-radius:0;padding:5px 2px;min-width:0;cursor:pointer}
  html[data-theme="dark"] .Vr{border-bottom-color:var(--border-m)}
  .Vr:hover{background:rgba(0,0,0,.035)}
  html[data-theme="dark"] .Vr:hover{background:rgba(255,255,255,.06)}
  .ef{font:600 12px "SFMono-Regular",Consolas,"Liberation Mono",monospace}
  .df{letter-spacing:0;font-weight:600;font-size:11.5px;color:var(--t3)}
  /* Filterlinjen */
  .qr{border-radius:8px;font-size:12.5px;padding:7px 12px;flex:0 1 250px}
  .Lr{border-radius:8px;font-size:12.5px;padding:7px 10px}
  .ji{border-radius:8px;padding:0;gap:0;overflow:hidden}
  .Lo{border-radius:0;padding:6px 13px;font-size:12px}
  .Lo+.Lo{border-left:1px solid var(--border-m)}
  .Yi{background:var(--primary);color:#f2f0e9}
  html[data-theme="dark"] .Yi{background:var(--primary);color:#171913}
  /* Prosjektkort: tynn ramme, liten radius, tettere typografi */
  .Vi{grid-template-columns:repeat(auto-fill,minmax(295px,1fr));gap:18px}
  .No{border-radius:5px;padding:15px 17px 13px;gap:7px;border-color:var(--border)}
  .No:hover{transform:none;box-shadow:none;border-color:var(--t3)}
  .Xi{font-size:14.5px;font-weight:700}
  .dp{background:transparent;border:0;border-radius:0;padding:0}
  .cp{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:11.5px;line-height:1.5;color:var(--t3)}
  /* Tabellen */
  .Tr th{font:700 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.1em;padding:8px 10px;border-bottom:1px solid var(--border)}
  .Tr td{padding:11px 10px;border-bottom:1px solid var(--s2)}
  .Po:hover{background:var(--s2)}
  /* ===== Eksakt designmatch (runde 2) — fortsatt kun CSS ===== */
  /* Fristbåndet: de to gruppene side om side, mono-etiketter med fargedot */
  .H0{display:flex;flex-direction:column;gap:16px}
  @media (max-width:1000px){.frist-grupper{display:block!important}.frist-grupper>div+div{margin-top:14px}}
  /* Fristrader: dempede fargetoner fra designet */
  .tf{color:#c05a4c}
  .nf{color:#b07f3a}
  .if{color:#5c6a57}
  .pf{color:#a5ab99}
  html[data-theme="dark"] .tf{color:var(--red)}
  html[data-theme="dark"] .nf{color:var(--orange)}
  html[data-theme="dark"] .if{color:var(--green)}
  /* Kortenes frist: diskret dot + verdi i stedet for farget boks */
  .cf{background:transparent!important;border:0;padding:0;border-radius:0;justify-content:flex-start;gap:7px}
  .cf .bf{display:none}
  .cf .mf{font:650 12.5px "SFMono-Regular",Consolas,"Liberation Mono",monospace;display:inline-flex;align-items:center;gap:7px}
  .cf .mf::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:0 0 auto}
  .cf.xf{color:#c05a4c}
  .cf.gf{color:#b07f3a}
  .cf.ff{color:#5c6a57}
  .cf.vf{color:#a5ab99}
  html[data-theme="dark"] .cf.xf{color:var(--red)}
  html[data-theme="dark"] .cf.gf{color:var(--orange)}
  html[data-theme="dark"] .cf.ff{color:var(--green)}
  html[data-theme="dark"] .cf.vf{color:var(--t3)}
  .cf .uf{opacity:1;color:var(--t3);font-size:11px}
  .cf .hf{flex-basis:auto;margin-left:auto;margin-top:0;opacity:1;color:var(--t3);font-size:11px;text-align:right}
  /* KPI: rene mono-etiketter uten statusdot, MW-enhet på tallene */
  .ci .xi{display:none}
  .bi::after{content:" MW";font:400 12px "Public Sans","Segoe UI",system-ui,sans-serif;color:var(--t3);letter-spacing:0}
  /* Tegnekø: kompakt oppsummering høyre — ikke stort kø-panel */
  .ke{grid-template-columns:minmax(0,1fr) 200px;gap:0 44px}
  .ze{position:static}
  .Ss{background:transparent;border:0;border-radius:0;padding:0;gap:6px;align-items:flex-end;text-align:right}
  .Ss .Is,.Ss .Ya,.Ss .Us{display:none}
  .Ss .Vs{flex-direction:column;align-items:flex-end;gap:2px;width:100%}
  .Ss .Bs{font:700 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.1em;text-transform:uppercase;color:var(--t3)}
  .Ss .Cs{font:500 20px/1.2 var(--font-serif);color:var(--t2)}
  .Ss button.gl{width:auto;margin-top:2px;background:transparent;border:0;color:var(--t2);font-size:12px;padding:0}
  .Ss button.gl:hover{color:var(--t1);text-decoration:underline}
  @media (max-width:1100px){.ke{grid-template-columns:1fr}.Ss{align-items:flex-start;text-align:left}.Ss .Vs{align-items:flex-start}}
  /* Kortenes fase/prio som ren tekst i stedet for chips, som i designet */
  .Pi{background:transparent!important;border:0!important;padding:0;border-radius:0;font-size:12px;font-weight:500;color:var(--t2)}
  .Rr,.Pr{background:transparent;border:0;padding:0;border-radius:0;font-size:12px;font-weight:500;color:var(--t2)}
  /* ===== Reskin: Porteføljerapport, Tegnekø, Ressurspipeline ===== */
  /* Sidehode-bånd med serif-tittel og dempet intro */
  .Qu .Ro,.Zm .Ro,.Yb .Ro{background:var(--s2);padding:26px 44px 22px}
  .Qu .bp,.Zm .bp,.Yb .bp{font-weight:500;font-size:30px}
  .Qu .mp,.Zm .mp,.Yb .mp{font-size:12.5px;color:var(--t3)}
  .Qu .On,.Zm .Ln,.Yb .kn{padding:26px 44px 70px}
  /* Stat-bokser → åpne tallrader med serif-tall og hårlinjer */
  ._m{display:flex;flex-wrap:wrap;row-gap:16px;gap:0;border-bottom:1px solid var(--border-m);padding-bottom:18px}
  .ru{border:0;border-radius:0;background:transparent;padding:0 40px 0 0;margin-right:40px;border-right:1px solid var(--border-m)}
  .au{font-weight:500;font-size:24px}
  .ou{font:700 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.1em;color:var(--t3);margin-top:3px}
  .Wu{background:transparent;border:0;border-radius:0;padding:0 0 22px;border-bottom:1px solid var(--border-m);display:flex;flex-wrap:wrap;row-gap:16px;gap:0;overflow:visible}
  .wo{padding:0 44px 0 0;margin-right:44px;border-right:1px solid var(--border-m)}
  ._u{font-size:31px;font-weight:500}
  .Zu{font:700 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.1em;color:var(--t3)}
  .rh{font-size:12px}
  /* Kolonner: åpne, med mono-hode og hårlinje-understrek */
  .hu,.Gb{background:transparent;border:0;border-radius:0;overflow:visible}
  .wu,.Lb{background:transparent;border-bottom:1px solid var(--line-strong,#dcd8cb);padding:0 2px 8px}
  .zu,.Pb{font:700 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.1em;color:var(--t2)}
  .ju,.Rb{font:600 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;color:var(--t3)}
  .Vu,.Fb{font-style:italic;text-align:left;font-size:12px;padding:14px 2px}
  .Tb,.Yu{padding:12px 2px 8px}
  /* Fliser: hvite, skarp tynn ramme, 5px radius, ingen skygge */
  .P{border-radius:5px;border-color:var(--border);padding:13px 15px;box-shadow:none}
  .P:hover{transform:none;box-shadow:none;border-color:var(--t3)}
  .Xr{border-radius:5px;border-color:var(--border);box-shadow:none}
  .Xr:hover{transform:none;box-shadow:none;border-color:var(--t3)}
  /* Pills → ren mono-tekst i dempede farger */
  .Gu{background:transparent!important;border:0!important;padding:0;border-radius:0;font:700 9.5px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.08em;color:var(--t2)}
  .qu{color:var(--t2)}
  .Nu{color:#c05a4c}
  .Lu{color:var(--t3)}
  .Kb{background:transparent!important;border:0;padding:0;border-radius:0;font:700 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace}
  .Mb{color:#5c6a57}
  .Qb{color:#b07f3a}
  .Wb{color:var(--t3)}
  .nm{color:#c05a4c}
  .im{color:#b07f3a}
  .pm{color:#5c6a57}
  html[data-theme="dark"] .Nu,html[data-theme="dark"] .nm{color:var(--red)}
  html[data-theme="dark"] .Qb,html[data-theme="dark"] .im{color:var(--orange)}
  html[data-theme="dark"] .Mb,html[data-theme="dark"] .pm{color:var(--green)}
  /* Fremdrifts-/kapasitetsbarer: 5px spor, heldekkende aktiv + stripet planlagt */
  .Bm,.zh{height:5px;background:#e5e1d5;border-radius:2px}
  .Dm{background:#7d8471}
  .Im{background:repeating-linear-gradient(45deg,#a8ae9b 0 3px,#e5e1d5 3px 6px)}
  .Xm{background:repeating-linear-gradient(45deg,#c05a4c 0 3px,#e9cdc8 3px 6px);box-shadow:none}
  .jh{border-radius:2px}
  .Tm{background:#7d8471;height:5px}
  .Um{background:repeating-linear-gradient(45deg,#a8ae9b 0 3px,#e5e1d5 3px 6px);height:5px}
  .Em{background:repeating-linear-gradient(45deg,#c05a4c 0 3px,#e9cdc8 3px 6px);height:5px}
  html[data-theme="dark"] .Bm,html[data-theme="dark"] .zh{background:var(--s2)}
  /* PL-kapasitet-panelet: åpen liste i stedet for kortboks */
  .nu{background:transparent;border:0;border-radius:0;padding:0 4px 0 0}
  /* Pipeline-verktøylinjen: PL-kapasitet + Board/Liste til venstre, legg-til til høyre */
  .Yb .zi{border-bottom:1px solid var(--border-m);padding-bottom:16px}
  .Yb .zi>.ho{order:1}
  .Yb .zi>.ji{order:2}
  .Yb .zi>.l.Y{order:3;margin-left:auto!important}
  /* Porteføljerapport: åpne seksjoner, ramp-up på dempet bånd */
  .ah{background:transparent;border:0;border-radius:0;padding:0}
  .ah:has(.ph){background:var(--s2);border-radius:2px;padding:20px 24px 16px}
  .eh{font-weight:500;font-size:17px}
  .yh{font-weight:600}
  .kh{font:600 12.5px "SFMono-Regular",Consolas,"Liberation Mono",monospace}
  /* Mørk Arcem-toppbar på de tre sidene */
  .arcembar{display:flex;align-items:center;gap:13px;padding:0 20px;height:42px;flex:0 0 auto;background:var(--primary);color:#f2f0e9}
  .arcembar b{font-weight:650;font-size:13px}
  .arcembar span{color:rgba(242,240,233,.55);font-size:11.5px}
  /* Flis-chips (fase/pipeline-mål) → ren mono-tekst */
  .lm{background:transparent!important;border:0!important;padding:0;border-radius:0;font:700 9.5px "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.08em;color:var(--t2)}
  .cm{background:transparent!important;color:var(--t2)}
  .sm{gap:10px}
  ._i{background:transparent;padding:0;border-radius:0;font-size:11px;color:var(--t3)}
  ._i{background:transparent;border:0;padding:0;color:var(--t3);font-weight:500}
  .Oi{gap:8px}
  .rp{border-top:0;padding-top:2px}
  .Zn .Vo{font:700 9.5px/1.2 "SFMono-Regular",Consolas,"Liberation Mono",monospace;letter-spacing:.1em;text-transform:uppercase;color:var(--t3);padding:22px 12px 8px;margin-top:0;border-top:0}
  .Zn>.Vo:first-child{padding-top:0}
  /* Commercial-lenkene skytes inn som vanlige <a>, så de må kvitte seg med
     nettleserens understreking for å stå likt de øvrige menylenkene. */
  .Zn a[href^="/commercial/"],.Zn a[href^="/inaktive/"],.Zn a[href^="/konsernstruktur/"]{text-decoration:none}
  /* Spørsmålet «Skal prosjektet legges inn i konsernstrukturen?» etter at et
     nytt prosjekt er lagret (skriptet under). */
  #cr-ks-bg{position:fixed;inset:0;background:rgba(24,26,20,.44);display:flex;align-items:flex-start;justify-content:center;padding:70px 20px;z-index:9997;font-family:"Public Sans","Segoe UI",system-ui,sans-serif}
  #cr-ks{background:var(--s1,#fff);border:1px solid var(--border,#d4d1c9);width:520px;max-width:100%;box-shadow:0 24px 60px rgba(20,22,18,.22);color:var(--t1,#1f2420)}
  #cr-ks .h{padding:20px 26px 14px;border-bottom:1px solid var(--border-m,#e3e0d6)}
  #cr-ks .h b{font:400 21px Georgia,"Times New Roman",serif;display:block}
  #cr-ks .h span{font-size:13px;color:var(--t3,#8d8b80)}
  #cr-ks .b{padding:16px 26px 20px;display:grid;gap:10px}
  #cr-ks button{display:block;width:100%;text-align:left;background:var(--s1,#fff);border:1px solid var(--border,#d4d1c9);border-radius:4px;padding:13px 16px;cursor:pointer;color:inherit;font:inherit}
  #cr-ks button:hover{border-color:var(--primary,#2d4a2b);background:var(--primary-tint,#eaefe4)}
  #cr-ks button b{display:block;font-size:14.5px;font-weight:600}
  #cr-ks button span{display:block;font-size:12.5px;color:var(--t2,#5f6259);margin-top:3px}
  .Zn .ai{font:600 10px "SFMono-Regular",Consolas,"Liberation Mono",monospace;color:var(--t3)}
  /* Fristfeltet på forsiden: samme nøytrale flatetone som prosjektsidens
     seksjoner i stedet for grønn tint, så fargene er like på begge sider. */
  .H0{background:var(--s2);border:0;border-radius:2px;padding:22px 26px 18px}
  /* Varselbadgene «X forsinket»/«X risiko» (.Xt) og «Neste milepæl»-raden
     (.Mi) på prosjektkortene beregnes fra den gamle kvartalsbaserte
     fremdriftsplanen, som er erstattet av den nye prosjektsiden – skjules. */
  .Xt{display:none !important}
  .Mi{display:none !important}
  /* Medansvarlig-velgeren i tegnekø-dialogen (.Ce = chip, .yl = valgt,
     .kl = avatar): umarkerte navn dempes og grånes, så det er tydelig at
     de bare er valgmuligheter – kun chips med hake er faktisk medansvarlige. */
  .Ce:not(.yl){opacity:.5}
  .Ce:not(.yl) .kl{filter:grayscale(1);opacity:.75}
  .Ce:not(.yl):hover{opacity:1}
  .Ce:not(.yl):hover .kl{filter:none;opacity:1}
  /* Arkiverte prosjekter: kort (.No) og tabellrader (.Po) merkes med
     .cr-arkivert av skriptet under og vises dempet og grått. */
  .No.cr-arkivert,.Po.cr-arkivert{opacity:.5;filter:grayscale(1);transition:opacity .15s}
  .No.cr-arkivert{background:var(--s2)}
  .No.cr-arkivert:hover,.Po.cr-arkivert:hover{opacity:.8}
  /* Laster: et lite serverrack der strømmen går inn nederst og lysene pulserer
     nedenfra og opp. Brukes både før bundelen er lastet (#root) og i bundelens
     egne lastevisninger (.Kn > .ni), som skriptet under fyller med samme rack. */
  .cr-laster{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;gap:14px;background:var(--bg,#faf9f6);color:var(--t2,#5c6a57);font:14px "Public Sans","Segoe UI",system-ui,sans-serif}
  .cr-laster p{margin:0}
  /* Første lasting: mørk flate over hele siden, uansett tema. Den toner ut når
     dashbordet er tegnet under, så overgangen til den lyse forsiden blir myk. */
  #cr-laster{position:fixed;inset:0;z-index:10000;height:auto;background:#171913;color:#b3b8a6;transition:opacity .55s ease}
  #cr-laster.ut{opacity:0;pointer-events:none}
  #cr-laster .cr-rack{--rack:#272e23;--rack2:#323b2d;--enhet:#363f30;--kant:#55614c;--skinne:#46513f;--mast:#8f9984;--bakke:#33372c}
  #cr-laster .cr-rack .skap{stroke:#5a6650}
  #cr-laster .cr-rack .kabel{stroke:#3a4434}
  .Kn>.ni.cr-rack{width:auto;height:auto;background:none;border-radius:0}
  .cr-rack{display:block;line-height:0;--led:#35d07a;--rack:#20261d;--rack2:#2b3327;--enhet:#2f3829;--kant:#46513f;--skinne:#3a4434}
  html[data-theme="dark"] .cr-rack{--rack:#272e23;--rack2:#323b2d;--enhet:#363f30;--kant:#55614c;--skinne:#46513f}
  .cr-rack svg{width:152px;height:100px;overflow:visible}
  .cr-rack .sk1{stop-color:var(--rack)}
  .cr-rack .sk2{stop-color:var(--rack2)}
  .cr-rack .skap{stroke:#141812;stroke-width:.8}
  .cr-rack .topp,.cr-rack .sokkel{fill:#171c15}
  .cr-rack .spalte{stroke:#3a4434;stroke-width:1.2;stroke-linecap:round;stroke-dasharray:1.6 1.4}
  .cr-rack .skinne{fill:var(--skinne)}
  .cr-rack .skrue{fill:#171c15}
  .cr-rack .enhet{fill:var(--enhet);stroke:#161a14;stroke-width:.6}
  .cr-rack .kant{stroke:var(--kant);stroke-width:.6}
  .cr-rack .hull{opacity:.9}
  .cr-rack .vhull{fill:#151913}
  .cr-rack .disk{fill:#252c21;stroke:#4a5643;stroke-width:.35}
  .cr-rack .fot{fill:#141812}
  .cr-rack .pwr{fill:var(--led);filter:drop-shadow(0 0 1.4px var(--led));animation:crPwr 2.4s ease-in-out infinite}
  .cr-rack .ring{fill:none;stroke:var(--led);stroke-width:.7;opacity:0;transform-box:fill-box;transform-origin:center;animation:crRing 2.4s cubic-bezier(.2,0,.2,1) infinite}
  .cr-rack .akt{fill:#9ff2c0;filter:drop-shadow(0 0 1px #6be39d);animation:crAkt 1s steps(1,end) infinite}
  .cr-rack .kabel{fill:none;stroke:#2a3126;stroke-width:2;stroke-linecap:round}
  .cr-rack .strom{fill:none;stroke:var(--led);stroke-width:1.6;stroke-linecap:round;stroke-dasharray:3 8;filter:drop-shadow(0 0 1.2px var(--led));animation:crStrom .8s linear infinite}
  .cr-rack .glod{fill:var(--led);opacity:.06;filter:blur(4px);animation:crGlod 2.4s ease-in-out infinite}
  html[data-theme="dark"] .cr-rack .skap{stroke:#5a6650}
  html[data-theme="dark"] .cr-rack .kabel{stroke:#3a4434}
  .cr-rack .bakke{stroke:var(--bakke,#d9d5ca);stroke-width:.8}
  .cr-rack .mast{fill:none;stroke:var(--mast,#59634f);stroke-width:1.1;stroke-linejoin:round;stroke-linecap:round}
  .cr-rack .isol{fill:var(--mast,#59634f)}
  .cr-rack .ledning{fill:none;stroke:var(--mast,#59634f);stroke-width:.6;opacity:.7}
  .cr-rack .strom.nett{stroke-width:1.1;stroke-dasharray:2.5 9}
  .cr-rack .trafo{fill:#2b3327;stroke:#141812;stroke-width:.7}
  .cr-rack .ribbe{stroke:#46513f;stroke-width:1.1}
  .cr-rack .bosning{fill:#7d8873}
  .cr-rack .tlys{fill:var(--led);filter:drop-shadow(0 0 1.2px var(--led));animation:crPwr 1.2s ease-in-out infinite}
  html[data-theme="dark"] .cr-rack{--mast:#8f9984;--bakke:#33372c}
  @keyframes crPwr{0%,100%{opacity:.55}20%,45%{opacity:1}}
  @keyframes crRing{0%{transform:scale(.8);opacity:.75}70%,100%{transform:scale(3);opacity:0}}
  @keyframes crAkt{0%{opacity:.15}12%{opacity:1}24%{opacity:.2}38%{opacity:.95}50%{opacity:.15}66%{opacity:1}78%{opacity:.3}90%{opacity:.9}}
  @keyframes crStrom{to{stroke-dashoffset:-11}}
  @keyframes crGlod{0%,100%{opacity:.04}35%{opacity:.16}}
  @media (prefers-reduced-motion:reduce){.cr-rack .tlys,.cr-rack .pwr,.cr-rack .ring,.cr-rack .akt,.cr-rack .strom,.cr-rack .glod{animation:none}.cr-rack .ring{opacity:0}}
</style>
<script>
(function(){
  // Serverracket i lasteren (se .cr-rack i stilarket): mørkt skap med skinner,
  // fem enheter (én med diskskuffer) og ventilasjonshull. Hver enhet har et
  // strømlys som puster med en ring – i bølge nedenfra og opp, i takt med strømmen
  // i kabelen – og et aktivitetslys som blinker i sitt eget tempo. Til venstre står
  // en kraftmast og en transformator; strømmen går fra nettet, gjennom trafoen
  // og inn i racket.
  window.crRack=(function(){
    var n=0;
    return function(){
      var id='crr'+(n++),u='',i,y,h,d,ak=[[.9,.1],[.55,.4],[1.3,.25],[.7,.65],[1.05,0]];
      var enheter=[[14,8],[24,8],[34,16],[52,8],[62,8]];
      for(i=0;i<enheter.length;i++){
        y=enheter[i][0];h=enheter[i][1];d=((enheter.length-1-i)*0.18).toFixed(2);
        u+='<rect class="enhet" x="15" y="'+y+'" width="42" height="'+h+'" rx="1"/>'+
          '<path class="kant" d="M15.6 '+(y+0.6)+'h40.8"/>'+
          '<rect class="hull" x="40" y="'+(y+1.6)+'" width="14" height="'+(h-3.2)+'" fill="url(#'+id+'v)"/>';
        if(h>8){ // 2U med diskskuffer
          for(var k=0;k<4;k++)u+='<rect class="disk" x="'+(26.5+k*3.2)+'" y="'+(y+2)+'" width="2.4" height="'+(h-4)+'" rx=".4"/>';
        }
        u+='<circle class="ring" cx="19.5" cy="'+(y+h/2)+'" r="1.6" style="animation-delay:'+d+'s"/>'+
          '<circle class="pwr" cx="19.5" cy="'+(y+h/2)+'" r="1.25" style="animation-delay:'+d+'s"/>'+
          '<circle class="akt" cx="23.2" cy="'+(y+h/2)+'" r=".9" style="animation-duration:'+ak[i][0]+'s;animation-delay:'+ak[i][1]+'s"/>';
      }
      // Kraftmast (gittermast med to traverser) og transformator med kjøleribber.
      var mast='<path class="mast" d="M-52 88L-46.5 36L-41 88M-50.4 73h7.8M-49.2 62h5.4M-48.1 52h3.2M-50.4 73l6.6-11M-43.8 73l-5.4-11M-49.2 62l4.3-10M-43.8 62l-4.3-10M-54 44h15M-52 51h11M-46.5 36v-3"/>'+
        '<circle class="isol" cx="-54" cy="45.4" r=".8"/><circle class="isol" cx="-39" cy="45.4" r=".8"/><circle class="isol" cx="-52" cy="52.4" r=".8"/><circle class="isol" cx="-41" cy="52.4" r=".8"/>';
      var linje='M-78 49Q-66 53-54 45.4M-78 56Q-65 59-52 52.4M-39 45.4Q-30 52-26 69';
      var trafo='<path class="ledning" d="'+linje+'"/><path class="strom nett" d="M-78 49Q-66 53-54 45.4M-39 45.4Q-30 52-26 69"/>'+
        '<rect class="trafo" x="-33" y="72" width="16" height="15" rx="1.2"/>'+
        '<path class="ribbe" d="M-30.5 74.5v10M-27.5 74.5v10M-24.5 74.5v10M-21.5 74.5v10"/>'+
        '<rect class="bosning" x="-28.6" y="67.5" width="2.2" height="4.5" rx=".6"/><rect class="bosning" x="-23.6" y="67.5" width="2.2" height="4.5" rx=".6"/>'+
        '<circle class="tlys" cx="-19.6" cy="75" r=".9"/>';
      return '<svg viewBox="-80 0 152 100" aria-hidden="true">'+
        '<path class="bakke" d="M-80 87.6H72"/>'+mast+trafo+
        '<defs><pattern id="'+id+'v" width="2" height="2" patternUnits="userSpaceOnUse"><circle cx="1" cy="1" r=".45" class="vhull"/></pattern>'+
        '<linearGradient id="'+id+'g" x1="0" x2="1" y1="0" y2="0"><stop offset="0" class="sk1"/><stop offset=".5" class="sk2"/><stop offset="1" class="sk1"/></linearGradient></defs>'+
        '<ellipse class="glod" cx="36" cy="88" rx="30" ry="6"/>'+
        '<rect class="skap" x="9" y="4" width="54" height="80" rx="3" fill="url(#'+id+'g)"/>'+
        '<rect class="topp" x="9" y="4" width="54" height="6" rx="3"/>'+
        '<path class="spalte" d="M24 7h24"/>'+
        '<rect class="skinne" x="11.5" y="11" width="2" height="68"/><rect class="skinne" x="58.5" y="11" width="2" height="68"/>'+
        (function(){var s='';for(var j=0;j<17;j++)s+='<rect class="skrue" x="12.1" y="'+(12+j*4)+'" width=".8" height=".8"/><rect class="skrue" x="59.1" y="'+(12+j*4)+'" width=".8" height=".8"/>';return s;})()+
        u+
        '<rect class="sokkel" x="9" y="80" width="54" height="5" rx="1.5"/>'+
        '<rect class="fot" x="12" y="85" width="8" height="2.4" rx="1"/><rect class="fot" x="52" y="85" width="8" height="2.4" rx="1"/>'+
        '<path class="kabel" d="M-17 84h2q2 0 2 3v3q0 3 3 3H30q6 0 6-4v-4"/><path class="strom" d="M-17 84h2q2 0 2 3v3q0 3 3 3H30q6 0 6-4v-4"/>'+
        '</svg>';
    };
  })();
  // Lasteskjermen (#cr-laster) står over siden til bundelen har tegnet dashbordet,
  // og toner da ut. Bundelens egne lastevisninger senere (.Kn med prikken .ni,
  // f.eks. Pipeline) får samme rack på lys bunn.
  var r0=document.getElementById('cr-rack-0'); if(r0) r0.innerHTML=window.crRack();
  var dekke=document.getElementById('cr-laster');
  window.crFjernLaster=function(){
    if(!dekke||dekke.classList.contains('ut'))return;
    dekke.classList.add('ut');
    setTimeout(function(){if(dekke&&dekke.parentNode)dekke.parentNode.removeChild(dekke);},650);
  };
  function pynt(){
    var n=document.querySelectorAll('.Kn>.ni:not(.cr-rack)');
    for(var i=0;i<n.length;i++){n[i].classList.add('cr-rack');n[i].innerHTML=window.crRack();}
    // Dashbordet er klart når bundelen har tegnet noe som ikke er en lastevisning.
    if(rot.firstElementChild&&!rot.querySelector('.Kn'))window.crFjernLaster();
  }
  var rot=document.getElementById('root');
  if(rot&&window.MutationObserver)new MutationObserver(pynt).observe(rot,{childList:true,subtree:true});
  setTimeout(window.crFjernLaster,20000);
})();
(function(){
  // Delt temavalg med prosjektsiden (samme localStorage-nøkkel). Standard lyst.
  var KEY='prosjektside-theme';
  function cur(){try{return localStorage.getItem(KEY)==='dark'?'dark':'light';}catch(e){return 'light';}}
  function apply(){document.documentElement.dataset.theme=cur();}
  apply();
  window.addEventListener('storage',function(e){if(e.key===KEY)apply();});
  function addBtn(){
    if(document.getElementById('cr-theme-toggle'))return;
    // Ikke vis bryteren i innrammede faner på prosjektsiden – der styres temaet fra prosjektsidens meny.
    if(new URLSearchParams(location.search).has('innrammet'))return;
    var b=document.createElement('button');
    b.id='cr-theme-toggle';b.title='Bytt mellom lyst og mørkt tema';b.textContent='◐';
    b.addEventListener('click',function(){
      var next=cur()==='dark'?'light':'dark';
      document.body.style.transition='opacity .15s ease';
      document.body.style.opacity='0';
      setTimeout(function(){
        try{localStorage.setItem(KEY,next);}catch(e){}
        apply();
        requestAnimationFrame(function(){
          document.body.style.opacity='1';
          setTimeout(function(){document.body.style.transition='';document.body.style.opacity='';},220);
        });
      },160);
    });
    document.body.appendChild(b);
  }
  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',addBtn);else addBtn();
})();
(function(){
  // Prosjektside-ruting: klikk på et prosjektkort (bar prosjektrute) åpner den
  // nye prosjektsiden. Lenker med ?tab= (fanene i venstremargen på den nye
  // siden, og interne dyplenker som taskId) går til den klassiske visningen.
  function projGuard(){
    try{
      var m=location.hash.match(/#\/apps\/arcem-dashboard\/prosjekter\/([\w-]+)(?:\?([^#]*))?/);
      if(!m) return;
      // De innrammede fanene på prosjektsiden laster dashbordet i en iframe
      // med ?innrammet=<fane> – kun de skal vise klassisk visning her.
      if(location.search.indexOf('innrammet')!==-1) return;
      // Skjul siden med en gang så den gamle prosjektmalen ikke blinker
      // i overgangen til den nye prosjektsiden.
      document.documentElement.style.visibility='hidden';
      var hq=new URLSearchParams(m[2]||'');
      var tab=hq.get('tab');
      var url='/prosjektside/?id='+m[1];
      if(tab==='fremdrift'){
        url+='&vis=fremdrift';
      }else if(tab){
        url+='&fane='+encodeURIComponent(tab);
        hq.delete('tab');
        var rest=hq.toString();
        if(rest)url+='&dyp='+encodeURIComponent(rest);
      }
      location.replace(url);
    }catch(e){}
  }
  window.addEventListener('hashchange',projGuard);
  // Hvis dashbordet hentes tilbake fra bfcache (tilbakeknappen) må en eventuell
  // skjuling fra omdirigeringen over oppheves.
  window.addEventListener('pageshow',function(){document.documentElement.style.visibility='';});
  projGuard();
})();
(function(){
  // Commercial ligger som egen side under /commercial/, på samme måte som
  // prosjektsiden. Venstremenyen tegnes av den kompilerte bundelen, så lenken
  // må skytes inn i den. Bundelen tegner menyen på nytt ved navigasjon, derfor
  // gjentas innskuddet av en observer i stedet for å kjøre én gang.
  //
  // .Zn er menylisten, .Vo en seksjonsetikett og .Bo en menylenke - samme
  // minifiserte klassenavn som CSS-en over styler. Finner vi dem ikke, gjør vi
  // ingenting: da står dashbordet som før, og /commercial/ nås direkte.
  var ID='nav-commercial';
  // De tre CRM-seksjonene. DC Players ligger på /commercial/ selv; Investors
  // og Advisors er egne sider (eget HTML-skall, egen JS - se
  // commercial/investors.js og commercial/advisors.js), derfor fulle href-er
  // for alle tre i stedet for å anta samme rute-mønster.
  var PUNKTER=[
    ['DC Players', '/commercial/#/players'],
    ['Investors and lenders', '/commercial/investors/'],
    ['Advisors', '/commercial/advisors/'],
  ];
  function skyt(){
    var nav=document.querySelector('.So .Zn')||document.querySelector('.Zn');
    if(!nav||nav.querySelector('#'+ID))return;
    // Inaktive prosjekter hører hjemme i navigasjonsseksjonen, rett etter
    // Pipeline. Finner vi ikke Pipeline-lenken, legges den sist i listen.
    var pipe=Array.prototype.filter.call(nav.querySelectorAll('.Bo'),function(a){return a.textContent.trim()==='Pipeline';})[0];
    var ia=document.createElement('a');
    ia.className='Bo'; ia.href='/inaktive/'; ia.textContent='Inaktive prosjekter';
    if(pipe&&pipe.parentNode)pipe.parentNode.insertBefore(ia,pipe.nextSibling);else nav.appendChild(ia);
    // Konsernstruktur (selskaper, eierskap, opsjoner) ligger som egen side
    // under /konsernstruktur/, rett etter Inaktive prosjekter.
    var ks=document.createElement('a');
    ks.className='Bo'; ks.href='/konsernstruktur/'; ks.textContent='Konsernstruktur';
    ia.parentNode.insertBefore(ks,ia.nextSibling);
    var lab=document.createElement('span');
    lab.className='Vo'; lab.textContent='Commercial';
    nav.appendChild(lab);
    PUNKTER.forEach(function(p,i){
      var a=document.createElement('a');
      a.className='Bo';
      // Bare den første trenger id-en; den er markering for at innskuddet
      // allerede har skjedd, slik at observeren ikke legger til flere sett.
      if(i===0)a.id=ID;
      a.href=p[1];
      a.textContent=p[0];
      nav.appendChild(a);
    });
  }
  function start(){
    skyt();
    var rot=document.getElementById('root');
    if(!rot||!window.MutationObserver)return;
    new MutationObserver(skyt).observe(rot,{childList:true,subtree:true});
  }
  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',start);else start();
})();
(function(){
  // Arkiverte prosjekter grånes på forsiden. Kortene og tabellradene tegnes
  // av den kompilerte bundelen uten prosjekt-id i DOM-en, så vi kjenner dem
  // igjen på navnet: et kort (.No) eller en rad (.Po) som har et element med
  // nøyaktig samme tekst som et arkivert prosjekt får klassen .cr-arkivert.
  // Navn som også brukes av et aktivt prosjekt hoppes over, så et aktivt
  // prosjekt aldri grånes ved en feil. Lista hentes på nytt hver gang
  // dashbordet lagrer et prosjekt, slik at avkryssingen «Arkivert» slår inn
  // med en gang.
  var arkivert={},aktivNavn={};
  var planlagt=false;
  // Avkryssingen «Vis arkiverte» tegnes av bundelen; teksten byttes her.
  var GAMMEL='Vis arkiverte',NY='Vis arkiverte prosjekter/opsjon utløpt';
  function omdop(){
    var rot=document.getElementById('root');if(!rot)return;
    var w=document.createTreeWalker(rot,NodeFilter.SHOW_TEXT),n;
    while((n=w.nextNode())){if(n.nodeValue.trim()===GAMMEL)n.nodeValue=n.nodeValue.replace(GAMMEL,NY);}
  }
  function merk(){
    planlagt=false;
    omdop();
    var el=document.querySelectorAll('.No,.Po');
    for(var i=0;i<el.length;i++){
      // Grånes når kortet/raden viser et arkivert navn OG ikke navnet på et
      // aktivt prosjekt. «Project Gol» har undertekst «Gol» (= arkivert
      // duplikat), men også sitt eget aktive navn – og grånes derfor ikke.
      var e=el[i],harArkivert=false,harAktiv=false;
      var kand=e.querySelectorAll('*');
      for(var j=0;j<kand.length;j++){
        // Elementets egen tekst (uten barn som landskoden «NO» i tittelen).
        var k=kand[j],t='';
        for(var c=k.firstChild;c;c=c.nextSibling)if(c.nodeType===3)t+=c.nodeValue;
        t=t.trim();
        if(!t)continue;
        if(arkivert[t])harArkivert=true;
        if(aktivNavn[t])harAktiv=true;
      }
      e.classList.toggle('cr-arkivert',harArkivert&&!harAktiv);
    }
  }
  // Før innlogging svarer /api/projects 401. Så lenge lista ikke er hentet,
  // prøver vi igjen (maks hvert 3. sekund) når bundelen begynner å tegne.
  var lastet=false,sistForsok=0;
  function planlegg(){
    if(!lastet&&Date.now()-sistForsok>3000)hent();
    if(planlagt)return;planlagt=true;requestAnimationFrame(merk);
  }
  var ekteFetch=window.fetch.bind(window);
  async function hent(){
    sistForsok=Date.now();
    try{
      var r=await ekteFetch('/api/projects');
      if(!r.ok)return;
      lastet=true;
      var map=await r.json(),aktive={},ny={};
      Object.keys(map).forEach(function(k){
        var p=map[k];if(!p||!p.name)return;
        var n=String(p.name).trim();
        if(p.archived)ny[n]=true;else aktive[n]=true;
      });
      Object.keys(aktive).forEach(function(n){delete ny[n];});
      arkivert=ny;aktivNavn=aktive;planlegg();
    }catch(e){}
  }
  window.fetch=function(inp,init){
    var res=ekteFetch(inp,init);
    try{
      var url=typeof inp==='string'?inp:(inp&&inp.url)||'';
      var metode=((init&&init.method)||(inp&&inp.method)||'GET').toUpperCase();
      if(metode!=='GET'&&url.indexOf('/api/projects')!==-1)res.then(function(){setTimeout(hent,150);},function(){});
    }catch(e){}
    return res;
  };
  function start(){
    hent();
    var rot=document.getElementById('root');
    if(!rot||!window.MutationObserver)return;
    new MutationObserver(planlegg).observe(rot,{childList:true,subtree:true,characterData:true});
  }
  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',start);else start();
})();
(function(){
  // Nytt prosjekt → «Skal prosjektet legges inn i konsernstrukturen?».
  // Skjemaet for nytt prosjekt ligger i den kompilerte bundelen, så vi fanger
  // det opp på lagringen i stedet: før hver skrivende /api/projects-forespørsel
  // noterer vi hvilke prosjekt-id-er som finnes, og etterpå sjekker vi om det
  // kom en ny. Da vises spørsmålet med tre valg; de to første åpner
  // Konsernstruktur-siden med riktig dialog forhåndsutfylt.
  var kjente=null, henter=null;
  var ekte=window.fetch.bind(window);
  function ider(map){var s={};Object.keys(map||{}).forEach(function(k){var p=map[k];if(p&&p.id&&!p.parentProjectId)s[p.id]=p;});return s;}
  async function hentKjente(){
    try{var r=await ekte('/api/projects');if(r.ok){kjente=ider(await r.json());}}catch(e){}
  }
  function spor(p){
    if(document.getElementById('cr-ks-bg'))return;
    var bg=document.createElement('div');bg.id='cr-ks-bg';
    var navn=String(p.name||p.id);
    bg.innerHTML='<div id="cr-ks" role="dialog" aria-modal="true"><div class="h"><b>Skal prosjektet legges inn i konsernstrukturen?</b><span></span></div><div class="b">'+
      '<button type="button" data-v="opsjon"><b>Som opsjon</b><span>Registrer opsjonsavtalen i Opsjoner (kontrakt, frister, terminer). Opsjonen dukker opp i konsernstrukturen når avtalen er bekreftet.</span></button>'+
      '<button type="button" data-v="selskap"><b>Som SPV / selskap</b><span>Prosjektet ligger i et eget selskap. Selskapsnavn forhåndsutfylles fra SPV-feltet.</span></button>'+
      '<button type="button" data-v="nei"><b>Ikke nå</b><span>Prosjektet vises i «Prosjekter som ikke er i konsernstrukturen» til det legges inn.</span></button>'+
      '</div></div>';
    bg.querySelector('.h span').textContent=navn;
    bg.addEventListener('click',function(e){
      var b=e.target.closest('[data-v]');
      if(e.target===bg){bg.remove();return;}
      if(!b)return;
      var v=b.getAttribute('data-v');bg.remove();
      if(v==='nei')return;
      location.href=v==='opsjon'?'/opsjoner/?prosjekt='+encodeURIComponent(p.id):'/konsernstruktur/?leggTil='+encodeURIComponent(p.id)+'&som='+v;
    });
    document.body.appendChild(bg);
  }
  async function etterLagring(){
    try{
      var for_=kjente;
      var r=await ekte('/api/projects');if(!r.ok)return;
      var naa=ider(await r.json());
      kjente=naa;
      if(!for_)return;
      var nye=Object.keys(naa).filter(function(id){return !for_[id];});
      if(nye.length===1)spor(naa[nye[0]]);
    }catch(e){}
  }
  var forrigeFetch=window.fetch;
  window.fetch=function(inp,init){
    var url=typeof inp==='string'?inp:(inp&&inp.url)||'';
    var metode=((init&&init.method)||(inp&&inp.method)||'GET').toUpperCase();
    var skriver=metode!=='GET'&&url.indexOf('/api/projects')!==-1;
    if(skriver&&kjente===null&&!henter){henter=hentKjente();}
    var res=forrigeFetch(inp,init);
    if(skriver)res.then(function(){setTimeout(etterLagring,250);},function(){});
    return res;
  };
  // Foer innlogging svarer /api/projects 401; proev igjen til lista er hentet.
  var forsok=0;
  function start(){
    var t=setInterval(async function(){
      if(kjente!==null||forsok++>40){clearInterval(t);return;}
      if(!henter){henter=hentKjente().then(function(){henter=null;});}
    },1500);
  }
  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',start);else start();
})();
(function(){
  // Kun Microsoft-innlogging (Entra). Passordinnlogging og selvregistrering
  // er fjernet; /api/login og /api/signup er slaatt av.
  function el(id){return document.getElementById(id);}
  function addMcpLink(){
    if(document.getElementById('cr-mcp-link')) return;
    var a=document.createElement('a');
    a.id='cr-mcp-link'; a.href='/mcp';
    a.title='Koble Claude / MCP til dashboardet';
    a.textContent='MCP-oppsett ↗';
    document.body.appendChild(a);
  }
  function loadApp(){
    var g=el('cr-gate'); if(g) g.style.display='none';
    var l=document.createElement('link'); l.rel='stylesheet'; l.href='/bundle.css'; document.head.appendChild(l);
    var s=document.createElement('script'); s.src='/bundle.js'; document.body.appendChild(s);
    addMcpLink();
    // Opsjoner på forsiden (menylenke + porteføljepanel): samme modell som
    // /opsjoner/. Avtaledataene hentes fra /api/opsjoner (forside.js); skriptene lastes i rekkefølge.
    ['/opsjoner/modell.js','/opsjoner/forside.js'].reduce(function(p,src){
      return p.then(function(){return new Promise(function(ok){var x=document.createElement('script');x.src=src;x.onload=x.onerror=ok;document.body.appendChild(x);});});
    },Promise.resolve());
  }
  function showGate(){ el('cr-gate').style.display='flex'; if(window.crFjernLaster)window.crFjernLaster(); }
  function wire(){}
  async function boot(){
    try{ var r=await fetch('/api/me'); if(r.ok){ loadApp(); return; } }catch(e){}
    showGate(); wire();
    var ssoError=new URLSearchParams(location.search).get('cr_sso_error');
    if(ssoError==='domain_not_allowed'){
      el('cr-err').textContent='Kun @bonum.no- og @arcem.no-adresser har tilgang';
      history.replaceState(null,'',location.pathname+location.hash);
    } else if(ssoError==='access_revoked'){
      el('cr-err').textContent='Tilgangen din er trukket tilbake. Ta kontakt med IT.';
      history.replaceState(null,'',location.pathname+location.hash);
    }
  }
  if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',boot); else boot();
})();
</script>
<script src="/shared/process-nav.js"></script>
