1import{Y as e,o as t,q as n,t as r,u as i}from"./jsx-runtime-BTgOCYyl.js";import{t as a}from"./lib-BSGEjHjT.js";import{a as o,d as s,i as c,l,o as u,s as d,u as f}from"./src-Ch68KD4x.js";import{t as p}from"./utils-Dk_44zMo.js";import{t as m}from"./site-MYsyMqoc.js";import{t as h}from"./seo-DRHdbsX5.js";import{a as g,c as _,i as v,l as y,n as b,o as x,r as S,s as C,t as w,u as T}from"./network-map-core-CzftGhvK.js";var E=e(n(),1),D=r(),O=Math.max(...g.map(e=>e.x))-Math.min(...g.map(e=>e.x)),k=new Set(g.filter(e=>g.some(t=>t.pop.id!==e.pop.id&&t.x>e.x&&t.x-e.x<O*.2&&Math.abs(t.y-e.y)<O*.1)).map(e=>e.pop.id));function A(e,t,n){let r=(e-n.x)/n.w,i=(t-n.y)/n.h,a=i<.3,o=a?{marginTop:14}:{marginTop:-14},s=`-50%`;return r>.66?(o.right=`${(1-r)*100}%`,s=`0%`):r<.34?(o.left=`${r*100}%`,s=`0%`):o.left=`${r*100}%`,o.top=`${i*100}%`,o.transform=`translate(${s}, ${a?`0`:`-100%`})`,o}function j({statusData:e,className:t,variant:n=`full`,wide:r=!1,zoom:i=1}){let a=n===`full`,o=n===`full`,[s,l]=(0,E.useState)(null),[u,d]=(0,E.useState)(null),f=c(),{rootRef:m,vb:h}=x(r,i),y=(0,E.useMemo)(()=>(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`path`,{d:_,className:`fill-none stroke-border/25`,strokeWidth:.4}),C.map((e,t)=>(0,D.jsx)(`path`,{d:e,fill:`var(--map-land)`,fillOpacity:.5,stroke:`var(--map-line)`,strokeWidth:.6},t))]}),[]),w=t=>e?.pops?.find(e=>e.code===t.code),T=!!e?.pops?.length,O=u??s,j=g.find(e=>e.pop.id===O)??null;return(0,D.jsxs)(`div`,{ref:m,className:p(`relative w-full`,t),style:r?void 0:{aspectRatio:`${h.w} / ${h.h}`},children:[(0,D.jsx)(`div`,{className:p(`absolute inset-0 overflow-hidden`,a&&`rounded-2xl border border-border/40 bg-card/40`),children:(0,D.jsxs)(`svg`,{viewBox:`${h.x} ${h.y} ${h.w} ${h.h}`,className:`h-full w-full`,preserveAspectRatio:r?`xMidYMin meet`:`xMidYMid meet`,role:`img`,"aria-label":`Karmuz Network points of presence and encrypted backbone across Europe`,onClick:()=>d(null),children:[(0,D.jsx)(b,{}),y,S.map(e=>{let t=O===e.a||O===e.b;return(0,D.jsx)(`path`,{d:e.d,fill:`none`,stroke:`url(#km-arc)`,strokeWidth:t?2:1,strokeLinecap:`round`,className:p(`transition-[stroke-width,opacity] duration-300`,O&&!t?`opacity-25`:`opacity-90`,!f&&`km-arc-flow`)},e.id)}),g.map(e=>{let t=w(e.pop),n=v(t,T),r=O===e.pop.id,a=u===e.pop.id;return(0,D.jsxs)(`g`,{transform:`translate(${e.x},${e.y})`,className:`km-node cursor-pointer`,onMouseEnter:()=>l(e.pop.id),onMouseLeave:()=>l(t=>t===e.pop.id?null:t),onClick:t=>{t.stopPropagation(),d(t=>t===e.pop.id?null:e.pop.id)},tabIndex:o?0:-1,onFocus:()=>l(e.pop.id),onBlur:()=>l(null),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),d(t=>t===e.pop.id?null:e.pop.id))},role:`button`,"aria-hidden":!o,"aria-pressed":a,"aria-label":`${e.pop.name} POP`,children:[(0,D.jsx)(`circle`,{r:7,fill:`url(#km-glow)`,opacity:r?1:.8}),!f&&(0,D.jsx)(`circle`,{r:2.2,fill:`none`,stroke:n,strokeWidth:1,className:`km-pulse`}),(0,D.jsx)(`circle`,{r:r?4:3.2,fill:n,stroke:`var(--color-background)`,strokeWidth:1.1,className:`transition-all`}),a&&(0,D.jsx)(`circle`,{r:6,fill:`none`,stroke:n,strokeWidth:.8,opacity:.6}),(0,D.jsx)(`text`,{x:(k.has(e.pop.id)?-6:6)/i,y:-6/i,textAnchor:k.has(e.pop.id)?`end`:`start`,fontSize:9/i,className:`pointer-events-none fill-foreground font-semibold`,style:{paintOrder:`stroke`,stroke:`var(--color-background)`,strokeWidth:2.6/i},children:e.pop.name}),(0,D.jsx)(`circle`,{r:12,fill:`transparent`})]},e.pop.id)})]})}),j&&(0,D.jsx)(`div`,{className:`pointer-events-none absolute z-10 w-60`,style:A(j.x,j.y,h),children:(0,D.jsx)(M,{pop:j.pop,live:w(j.pop),pinned:u===j.pop.id,hasLive:T})})]})}function M({pop:e,live:t,pinned:n,hasLive:r}){let i=t?.status?t.status[0].toUpperCase()+t.status.slice(1):r?`Unknown`:`Live`,a=t&&(t.bgpEstablished!=null||t.prefixesV4!=null||t.prefixesV6!=null);return(0,D.jsxs)(`div`,{className:`rounded-xl border border-border/50 bg-popover/95 p-3 shadow-lg backdrop-blur-sm`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,D.jsx)(`span`,{className:`text-sm font-semibold text-foreground`,children:e.name}),(0,D.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground`,children:e.code})]}),(0,D.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[e.facility,` · `,e.role]}),(0,D.jsxs)(`div`,{className:`mt-2 flex items-center gap-1.5`,children:[(0,D.jsx)(`span`,{className:`inline-block h-2 w-2 rounded-full`,style:{background:v(t,r)}}),(0,D.jsx)(`span`,{className:`text-[11px] text-muted-foreground`,children:i})]}),a?(0,D.jsxs)(`div`,{className:`mt-2 grid grid-cols-2 gap-x-3 gap-y-1 border-t border-border/40 pt-2 text-[11px]`,children:[t?.bgpEstablished!=null&&(0,D.jsx)(N,{label:`sessions`,value:String(t.bgpEstablished)}),t?.prefixesV4!=null&&(0,D.jsx)(N,{label:`v4 prefixes`,value:P(t.prefixesV4)}),t?.prefixesV6!=null&&(0,D.jsx)(N,{label:`v6 prefixes`,value:P(t.prefixesV6)}),t?.rpki&&(0,D.jsx)(N,{label:`rpki`,value:t.rpki})]}):(0,D.jsx)(`div`,{className:`mt-2 space-y-0.5 border-t border-border/40 pt-2`,children:e.prefixes.map(e=>(0,D.jsx)(`div`,{className:`font-mono text-[10px] text-muted-foreground
1/80`,children:e},e))}),n&&(0,D.jsx)(`div`,{className:`mt-2 border-t border-border/40 pt-1.5 font-mono text-[9px] uppercase tracking-wide text-muted-foreground/60`,children:`pinned · tap map to dismiss`})]})}function N({label:e,value:t}){return(0,D.jsxs)(`div`,{className:`flex flex-col`,children:[(0,D.jsx)(`span`,{className:`font-mono text-foreground`,children:t}),(0,D.jsx)(`span`,{className:`text-[9px] uppercase tracking-wide text-muted-foreground/70`,children:e})]})}function P(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e5?0:1)}k`:String(e)}var F=e=>`/looking-glass${e?`?q=${encodeURIComponent(e)}`:``}`,I={fullBleedMap:!0},L=()=>h({title:`${m.name} (${m.asn}) - For packets & people`,description:m.description,path:`/`});function R(e,t){return e?.pops?.find(e=>e.code===t)}function z(e){return e?e.status===`down`?`down`:e.status===`degraded`?`degraded`:`up`:`unknown`}var B=[`zero`,`one`,`two`,`three`,`four`,`five`,`six`,`seven`,`eight`,`nine`,`ten`,`eleven`,`twelve`],V=(e=>e.charAt(0).toUpperCase()+e.slice(1))((e=>B[e]??String(e))(y.sites)),H=[{title:`Anycast, everywhere`,body:`The same prefixes are announced from every core city, so traffic lands at the nearest one - and reroutes to the next if a site drops. No single POP is a single point of failure.`},{title:`A private encrypted backbone`,body:`${V} European cities linked by our own encrypted mesh - real tunnels we run end to end, not a rented MPLS cloud.`},{title:`Clean, dual-stack routing`,body:`RPKI-validating on every session, bogons and martians filtered both ways, IPv4 and IPv6 as first-class citizens. We keep our table tidy.`}],U=t(function(){let{status:e,networkData:t,uptime:n,uptimeLabel:r}=i(),[c,p]=(0,E.useState)(``),h=new Set((t?.data??[]).filter(e=>e.operational).map(e=>e.ix_id)).size,g=e?.overall??`operational`,_=g===`operational`?`up`:g===`major_outage`?`down`:`degraded`,v=g===`operational`?`all systems nominal`:g===`major_outage`?`major outage`:`partially degraded`,b=e?.totals?.bgpEstablished,x=T.length,S=T.filter(t=>{let n=z(R(e,t.code));return n!==`down`&&n!==`unknown`}).length,C=e?g===`operational`?`All systems operational`:g===`major_outage`?`Major outage`:g===`partial`?`Partially degraded`:`Live status`:`Status unavailable`;function O(e){e.preventDefault(),window.location.assign(F(c.trim()||void 0))}return(0,D.jsx)(D.Fragment,{children:(0,D.jsxs)(`div`,{className:`relative`,children:[(0,D.jsx)(`div`,{className:`absolute inset-0 hidden lg:block`,children:(0,D.jsx)(j,{statusData:e,variant:`hero`,className:`h-full`,wide:!0,zoom:1.15})}),(0,D.jsxs)(`section`,{className:`pointer-events-none relative`,children:[(0,D.jsx)(`div`,{"aria-hidden":!0,className:`pointer-events-none absolute inset-0 -z-10`,style:{background:`radial-gradient(700px 380px at 78% -8%, var(--tint-brand), transparent 60%)`}}),(0,D.jsx)(`div`,{"aria-hidden":!0,className:`absolute inset-0 opacity-70 lg:hidden`,children:(0,D.jsx)(w,{statusData:e})}),(0,D.jsxs)(`div`,{className:`mx-auto grid max-w-[var(--content-max)] items-center gap-8 px-6 py-[clamp(48px,7vw,88px)] lg:min-h-[600px] lg:grid-cols-[1.05fr_1fr] lg:gap-12`,style:{paddingTop:`calc(var(--header-h-base) + clamp(48px,7vw,88px))`},children:[(0,D.jsxs)(`div`,{className:`pointer-events-auto relative z-10`,children:[(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-2 rounded-full border px-3 py-1.5 font-mono text-xs`,style:{borderColor:`var(--border-ok)`,background:`var(--tint-ok)`,color:`var(--state-ok)`},children:[(0,D.jsx)(s,{status:_,label:!1,pulse:!0}),v,` · live`]}),(0,D.jsxs)(`h1`,{className:`mt-5 font-display font-extrabold leading-[1.02]`,style:{fontSize:`clamp(34px,5.5vw,58px)`,letterSpacing:`-0.03em`},children:[`Across Europe.`,(0,D.jsx)(`br`,{}),`One `,(0,D.jsx)(`span`,{style:{color:`var(--brand)`},children:`encrypted`}),(0,D.jsx)(`br`,{}),`backbone.`]}),(0,D.jsx)(`p`,{className:`mt-5 max-w-md text-[var(--fs-lead)] leading-relaxed text-muted-foreground`,children:`A compact European network, run properly. Anycast, dual-stack, RPKI-validating - the backbone our own services run on, and open to selective peering.`}),(0,D.jsxs)(`div`,{className:`mt-7 flex flex-wrap gap-3`,children:[(0,D.jsx)(o,{as:a,to:`/peering`,children:`See peering policy â`}),(0,D.jsx)(o,{as:a,to:`/status`,variant:`ghost`,children:`Live status`})]}),(0,D.jsxs)(`div`,{className:`mt-9 flex flex-wrap gap-x-8 gap-y-4`,children:[(0,D.jsx)(f,{value:y.sites,label:`EU sites`}),(0,D.jsx)(f,{value:b==null?`â`:`~${b}`,label:`BGP sessions`}),(0,D.jsx)(f,{value:h>0?String(h):`â`,label:`exchanges`}),(0,D.jsx)(f,{value:`v4`,unit:`+v6`,label:`dual-stack`})]})]}
1),(0,D.jsx)(`div`,{"aria-hidden":!0,className:`hidden lg:block`})]})]}),(0,D.jsxs)(`section`,{className:`relative mx-auto max-w-[var(--content-max)] px-6 pt-[var(--section-y-tight)] pb-[var(--section-y-tight)]`,children:[(0,D.jsx)(`p`,{className:`eyebrow`,children:`How it works`}),(0,D.jsx)(`h2`,{className:`mt-3 max-w-2xl font-display text-[clamp(24px,3.5vw,36px)] font-extrabold tracking-tight text-foreground`,children:`A private, encrypted backbone - anycast to the nearest city.`}),(0,D.jsxs)(`p`,{className:`mt-3 max-w-2xl text-[var(--fs-lead)] leading-relaxed text-muted-foreground`,children:[V,` points of presence across Europe run on one encrypted mesh, each announcing the same anycast prefixes. Packets take the shortest path in, and the network routes around a site that goes quiet - no rented backbone, no shortcuts, just clean routing we run ourselves.`]}),(0,D.jsx)(`div`,{className:`mt-6 grid gap-4 md:grid-cols-3`,children:H.map(e=>(0,D.jsxs)(u,{accent:`accent`,hover:!0,pad:`lg`,children:[(0,D.jsx)(`h3`,{className:`font-display text-[19px] font-semibold text-foreground`,children:e.title}),(0,D.jsx)(`p`,{className:`mt-2 text-sm leading-relaxed text-muted-foreground`,children:e.body})]},e.title))})]}),(0,D.jsx)(`section`,{className:`relative mx-auto max-w-[var(--content-max)] px-6 pt-[var(--section-y)]`,children:(0,D.jsxs)(`div`,{className:`grid items-center gap-8 lg:grid-cols-[0.8fr_1.2fr]`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`p`,{className:`eyebrow`,children:`Built to a standard`}),(0,D.jsx)(`h2`,{className:`mt-3 font-display text-[clamp(24px,3.5vw,34px)] font-extrabold tracking-tight text-foreground`,children:`The network our own services run on.`})]}),(0,D.jsx)(`p`,{className:`text-[var(--fs-lead)] leading-relaxed text-muted-foreground`,children:`Karmuz is the backbone behind the things we build, so it's held to the standard we'd demand of any provider. Every session is RPKI-validated, every prefix carries a sane max-prefix, and nothing is oversubscribed. When something needs attention it reaches a person who can act on it, not a ticket queue. Small footprint, run seriously.`})]})}),(0,D.jsxs)(`section`,{className:`relative mx-auto max-w-[var(--content-max)] px-6 pt-[var(--section-y)]`,children:[(0,D.jsx)(`p`,{className:`eyebrow`,children:`Routing hygiene`}),(0,D.jsx)(`h2`,{className:`mt-3 max-w-2xl font-display text-[clamp(24px,3.5vw,34px)] font-extrabold tracking-tight text-foreground`,children:`Clean routing is the whole point.`}),(0,D.jsxs)(`div`,{className:`mt-4 grid gap-x-12 gap-y-4 text-[var(--fs-lead)] leading-relaxed text-muted-foreground lg:grid-cols-2`,children:[(0,D.jsx)(`p`,{children:`Every route Karmuz Network accepts is checked before it reaches the table. We run RPKI Route Origin Validation and drop RPKI-invalid announcements outright, so a hijacked or fat-fingered prefix never rides AS209990. On top of that, each peer and transit session carries a sensible max-prefix limit, and bogons, martians and unallocated space are rejected at the edge - on import and on export - so nothing leaks in either direction.`}),(0,D.jsx)(`p`,{children:`What we originate is held to the same bar. Our prefixes are covered by RPKI ROAs, routes carry BGP communities for predictable traffic engineering, and IPv4 and IPv6 are treated as equals - dual-stack everywhere, never an afterthought. The payoff is a network that behaves the way you expect: shortest-path anycast in, graceful failover when a site goes quiet, and no surprises for the networks we peer with.`})]}),(0,D.jsx)(`ul`,{className:`mt-6 grid gap-3 text-sm text-muted-foreground sm:grid-cols-2 lg:grid-cols-3`,children:[`RPKI ROV - invalids dropped`,`AS-path + prefix-length filters`,`Per-session max-prefix limits`,`Bogon + martian filtering, both ways`,`Signed ROAs on every prefix`,`MANRS-aligned operations`].map(e=>(0,D.jsxs)(`li`,{className:`flex items-start gap-2`,children:[(0,D.jsx)(`span`,{"aria-hidden":!0,style:{color:`var(--accent)`},children:`â`}),(0,D.jsx)(`span`,{children:e})]},e))})]}),(0,D.jsxs)(`section`,{className:`relative mx-auto max-w-[var(--content-max)] px-6 pt-[var(--section-y)]`,children:[(0,D.jsx)(`p`,{className:`eyebrow`,children:`Peering`}),(0,D.jsx)(`h2`,{className:`mt-3 max-w-2xl font-display text-[clamp(24px,3.5v
1w,34px)] font-extrabold tracking-tight text-foreground`,children:`Open, selective, and easy to reach.`}),(0,D.jsx)(`p`,{className:`mt-4 max-w-3xl text-[var(--fs-lead)] leading-relaxed text-muted-foreground`,children:`Karmuz Network keeps an open but selective peering policy and is present at several European internet exchanges, with room for private interconnects where the traffic justifies it. Opening a session is deliberately simple: find AS209990 on PeeringDB, match a few sensible requirements - a registered ASN, RPKI-signed and IRR-registered prefixes, and a shared exchange or a cross-connect - and send a request. We keep our PeeringDB record current, reply as people rather than a ticket queue, and turn sessions up quickly. Because the same backbone carries our own services, we care about the quality of every adjacency, not the raw count - a peer that improves latency or resilience for real users is always worth the session.`})]}),(0,D.jsxs)(`section`,{className:`relative mx-auto max-w-[var(--content-max)] px-6 pt-[var(--section-y)]`,children:[(0,D.jsx)(`p`,{className:`eyebrow`,children:`Live status`}),(0,D.jsx)(a,{to:`/status`,className:`group mt-4 block`,children:(0,D.jsxs)(u,{pad:`lg`,hover:!0,className:`relative overflow-hidden`,children:[(0,D.jsx)(`div`,{"aria-hidden":!0,className:`pointer-events-none absolute -right-16 -top-16 h-56 w-56 rounded-full`,style:{background:`var(--glow-brand)`,opacity:.35}}),(0,D.jsxs)(`div`,{className:`relative flex flex-wrap items-center justify-between gap-6`,children:[(0,D.jsxs)(`div`,{className:`min-w-0`,children:[(0,D.jsxs)(`div`,{className:`inline-flex items-center gap-2`,children:[(0,D.jsx)(s,{status:e?_:`unknown`,label:!1,pulse:_===`up`}),(0,D.jsx)(`span`,{className:`font-display text-[20px] font-semibold text-foreground`,children:C})]}),(0,D.jsxs)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:[S,` / `,x,` sites up`,b==null?``:` · ~${b} sessions`,e?.totals?.rpki?` · RPKI ${e.totals.rpki}`:``]})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-6`,children:[n?.[`90d`]!=null&&(0,D.jsxs)(`div`,{className:`text-right`,children:[(0,D.jsxs)(`div`,{className:`font-display text-[30px] font-extrabold leading-none tabular-nums text-foreground`,children:[n[`90d`],`%`]}),(0,D.jsx)(`div`,{className:`mt-1 field-label`,children:r})]}),(0,D.jsx)(`span`,{className:`font-medium transition-transform group-hover:translate-x-0.5`,style:{color:`var(--accent)`},children:`View status â`})]})]})]})})]}),(0,D.jsxs)(`section`,{className:`relative mx-auto max-w-[var(--content-max)] px-6 pt-[var(--section-y)]`,children:[(0,D.jsx)(`p`,{className:`eyebrow`,children:`Looking glass`}),(0,D.jsxs)(u,{pad:`lg`,className:`relative mt-4 overflow-hidden`,children:[(0,D.jsx)(`div`,{"aria-hidden":!0,className:`pointer-events-none absolute -bottom-16 -left-16 h-56 w-56 rounded-full`,style:{background:`var(--glow-brand)`,opacity:.3}}),(0,D.jsxs)(`div`,{className:`relative max-w-2xl`,children:[(0,D.jsx)(`h2`,{className:`font-display text-[clamp(22px,3vw,30px)] font-extrabold tracking-tight text-foreground`,children:`Run diagnostics from our edge.`}),(0,D.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:`DNS, WHOIS, TLS, ping and traceroute - one query, every angle.`})]}),(0,D.jsxs)(`form`,{onSubmit:O,className:`relative mt-5 flex flex-col gap-3 sm:flex-row sm:items-end`,children:[(0,D.jsx)(l,{mono:!0,value:c,onChange:e=>p(e.currentTarget.value),placeholder:`host, IP, prefix, or ASN`,autoComplete:`off`,spellCheck:!1,"aria-label":`Looking glass target`,style:{flex:1}}),(0,D.jsx)(o,{type:`submit`,style:{height:44},children:`Check â`})]}),(0,D.jsxs)(`div`,{className:`relative mt-4 flex flex-wrap items-center gap-2 font-mono text-xs`,children:[(0,D.jsx)(`span`,{className:`text-[var(--text-dim)]`,children:`try`}),[`1.1.1.1`,`cloudflare.com`].map(e=>(0,D.jsx)(`a`,{href:F(e),rel:`nofollow`,children:(0,D.jsx)(d,{tone:`neutral`,children:e})},e))]})]})]}),(0,D.jsx)(`section`,{className:`relative mx-auto max-w-[var(--content-max)] px-6 py-[var(--section-y)]`,children:(0,D.jsxs)(u,{pad:`lg`,className:`relative overflow-hidden`,style:{background:`linear-gradient(120deg, var(--tint-accent), var(--surface-card) 60%)`}
1,children:[(0,D.jsx)(`div`,{"aria-hidden":!0,className:`pointer-events-none absolute -right-16 -top-16 h-56 w-56 rounded-full`,style:{background:`var(--glow-brand)`,opacity:.5}}),(0,D.jsxs)(`div`,{className:`relative flex flex-wrap items-center justify-between gap-6`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h2`,{className:`font-display text-[clamp(22px,3vw,30px)] font-extrabold tracking-tight text-foreground`,children:`We choose our peers.`}),(0,D.jsx)(`p`,{className:`mt-2 max-w-md text-sm text-muted-foreground`,children:`Think we'd be a good fit? The policy has everything you need to open a session.`})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,D.jsx)(d,{tone:`brand`,children:m.asn}),(0,D.jsx)(o,{as:a,to:`/peering`,children:`Read peering policy â`})]})]})]})})]})})});export{U as default,I as handle,L as meta};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.