1import{u as C,C as F,c as n,d as b,a as e,t as s,F as h,e as P,E as f,f as p,p as y,w as M,b as O,R as D,r as B,k as m,o as i}from"./vendor-DcWJ6w6z.js";import{b as U}from"./index-CCKdGX-m.js";import{N as $,_ as j}from"./FooterSection-rWdslapY.js";import{u as A}from"./useSeo-DIGXrsw8.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const q={class:"dark-page min-h-screen flex flex-col"},E={class:"flex-1 pt-16"},I={class:"max-w-3xl mx-auto px-4 py-12"},W={class:"text-center mb-10"},z={class:"text-3xl sm:text-4xl font-bold",style:{color:"#f0f4ff"}},G={class:"text-sm mt-3 max-w-xl mx-auto",style:{color:"#8899bb"}},H={key:0,class:"text-center text-sm",style:{color:"#8899bb"}},J={key:1,class:"rounded-2xl p-8 text-center",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},K={class:"text-sm",style:{color:"#8899bb"}},Q={class:"grid sm:grid-cols-2 gap-3 mb-3"},X={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Y={class:"text-[11px] uppercase tracking-widest mb-1",style:{color:"#60a5fa"}},Z={class:"text-3xl font-bold",style:{color:"#34d399"}},ee={class:"text-[12px] mt-1",style:{color:"#8899bb"}},se={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},te={class:"text-[11px] uppercase tracking-widest mb-1",style:{color:"#60a5fa"}},oe={class:"ml-1 lowercase tracking-normal",style:{color:"#7f8fb3"}},ae={class:"text-[12px] mt-1",style:{color:"#8899bb"}},le={key:0,class:"rounded-2xl p-5 mb-3",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},ne={class:"text-[13px] mb-3",style:{color:"#cdd6f4"}},ie={class:"space-y-3"},ce={class:"flex justify-between text-[12px] mb-1"},re={style:{color:"#8899bb"}},de={style:{color:"#cdd6f4"}},ue={class:"h-2 rounded-full overflow-hidden",style:{background:"#0f1424"}},pe={class:"flex justify-between text-[12px] mb-1"},he={style:{color:"#8899bb"}},_e={style:{color:"#cdd6f4"}},fe={class:"h-2 rounded-full overflow-hidden",style:{background:"#0f1424"}},me={class:"text-[12px] mt-3",style:{color:"#7f8fb3"}},xe={key:1,class:"rounded-2xl p-5 mb-3",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},be={class:"flex items-center justify-between mb-2"},ye={class:"text-[13px]",style:{color:"#cdd6f4"}},ve={class:"flex gap-3 text-[11px]"},ge={style:{color:"#34d399"}},ke={style:{color:"#f87171"}},we=["viewBox"],Te=["points"],Pe=["points"],Be={class:"text-[11px] mt-1",style:{color:"#7f8fb3"}},Le={key:2,class:"grid sm:grid-cols-2 gap-3 mb-3"},Ne={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Se={class:"text-[12px] font-semibold mb-2",style:{color:"#f87171"}},Ve={class:"space-y-1.5"},Re={class:"font-mono break-all",style:{color:"#cdd6f4"}},Ce={key:0,class:"text-[11px] ml-1",style:{color:"#8899bb"}},Fe={class:"rounded-2xl p-5",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Me={class:"text-[12px] font-semibold mb-2",style:{color:"#34d399"}},Oe={class:"flex flex-wrap gap-1.5"},De={class:"text-[12px] font-semibold mt-4 mb-1",style:{color:"#d97706"}},Ue={class:"space-y-1"},$e={class:"font-mono",style:{color:"#cdd6f4"}},je={key:0,style:{color:"#8899bb"}},Ae={class:"text-[12px] mb-8",style:{color:"#7f8fb3"}},qe={class:"rounded-2xl p-6",style:{background:"#1a1a2e",border:"1px solid #2a3a5c"}},Ee={class:"text-base font-bold mb-3",style:{color:"#f0f4ff"}},Ie={class:"space-y-2.5 text-[13.5px]",style:{color:"#8899bb"}},We={class:"flex gap-2"},ze={class:"flex gap-2"},Ge={class:"flex gap-2"},He={class:"text-center mt-10"},L=600,x=90,es={__name:"BenchmarkView",setup(Je){const{locale:v}=C(),t=(o,a)=>v.value==="uk"?o:a;A("benchmark","/benchmark");const l=B(null),g=B(!0),d=m(()=>{var o;return((o=l.value)==null?void 0:o.detail)||null}),u=m(()=>{var o;return((o=d.value)==null?void 0:o.examples)||null}),_=m(()=>{var o;return(((o=l.value)==null?void 0:o.history)||[]).filter(a=>a.recall_pct!=null&&a.fpr_pct!=null)}),N=m(()=>{var a;const o=Number(((a=l.value)==null?void 0:a.fpr_pct)??0);return o<=1?"#34d399":o<=3?"#d97706":"#f87171"});function k(o){return Math.round(Number(o)*10)/10}function w(o,a){return a?Math.round(100*o/a):0}function S(o){try{return new Date(o).toLocaleDateString(v.value==="uk"?"uk-UA":"en-US",{dateStyle:"medium"})}catch{return o}}function T(o){const a=o.length;return a<2?"":o.map((c,r)=>{const V=r/(a-1)*L,R=x-Math.max(0,Math.min(100,Number(c)))/100*x;return`${V.toFixed(1)},${R.toFixed(1)}`}).join(" ")}return F(async()=>{try{l.value=(await U.get("/api/tools/benchmark")).data}catch{l.value=null}g.value=!1}),(o,a)=>(i(),n("div",q,[b($),e("div",E,[e("div",I,[e("div",W,[e("h1",z,s(t("ÐенÑмаÑк виÑвленнÑ","Detection benchmark")),1),e("p",G,s(t("ÐамÑÑÑÑ Ð·Ð°Ñв пÑо «ÑоÑнÑÑÑÑ» â вÑдÑвоÑÑваний ÑоÑижневий замÑÑ Ð½Ð° ÑеалÑниÑ
даниÑ
: ÑвÑжий ÑÑÑинг пÑоÑи Ñоп-легÑÑимниÑ
доменÑв.","Instead of an âaccuracyâ claim â a reproducible weekly measurement on real data: fresh phishing vs. top legitimate domains.")),1)]),g.value?(i(),n("div",H,s(t("ÐаванÑаженнÑâ¦","Loadingâ¦")),1)):!l.value||l.value.available===!1?(i(),n("div",J,[e("p",K,s(t("ÐеÑÑий пÑогÑн Ñе гоÑÑÑÑÑÑÑ â зайдÑÑÑ Ð·Ð³Ð¾Ð´Ð¾Ð¼.","The first run is being prepared â check back soon.")),1)])):(i(),n(h,{key:2},[e("div",Q,[e("div",X,[e("p",Y,s(t("ÐиÑвлено ÑÑÑингÑ","Phishing detected")),1),e("p",Z,s(k(l.value.recall_pct))+"%",1),e("p",ee,
1s(l.value.detected)+"/"+s(l.value.positive_n)+" "+s(t("ÑвÑжиÑ
ÑÑÑинговиÑ
URL (OpenPhish)","fresh phishing URLs (OpenPhish)")),1)]),e("div",se,[e("p",te,[P(s(t("Ð¥Ð¸Ð±Ð½Ñ ÑпÑаÑÑваннÑ","False-positive rate"))+" ",1),e("span",oe,"· "+s(t("головна меÑÑика","the metric that matters")),1)]),e("p",{class:"text-3xl font-bold",style:f({color:N.value})},s(k(l.value.fpr_pct))+"%",5),e("p",ae,s(l.value.false_positives)+"/"+s(l.value.negative_n)+" "+s(t("Ñоп-легÑÑимниÑ
доменÑв (Tranco)","top legitimate domains (Tranco)")),1)])]),d.value?(i(),n("div",le,[e("p",ne,s(t("Ð Ñого ÑкладаÑÑÑÑÑ Ð²Ð¸ÑвленнÑ","What the detection is made of")),1),e("div",ie,[e("div",null,[e("div",ce,[e("span",re,s(t("Ðже Ñ Ð·Ð¾Ð²Ð½ÑÑнÑÑ
базаÑ
(VirusTotal / Safe Browsing / PhishTank)","Already in external DBs (VirusTotal / Safe Browsing / PhishTank)")),1),e("span",de,s(d.value.external_n)+"/"+s(l.value.detected),1)]),e("div",ue,[e("div",{class:"h-full",style:f({width:w(d.value.external_n,l.value.detected)+"%",background:"#60a5fa"})},null,4)])]),e("div",null,[e("div",pe,[e("span",he,s(t("СпÑймав Ð½Ð°Ñ Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¹ Ñигнал (вÑк доменÑ, ÑмÑÑаÑÑÑ Ð±ÑендÑ)","Caught by our own signal (domain age, brand impersonation)")),1),e("span",_e,s(d.value.own_n)+"/"+s(l.value.detected),1)]),e("div",fe,[e("div",{class:"h-full",style:f({width:w(d.value.own_n,l.value.detected)+"%",background:"#34d399"})},null,4)])])]),e("p",me,s(t("ÐÑлÑÑÑÑÑÑ Ð²Ñдомого ÑÑÑÐ¸Ð½Ð³Ñ Ð²Ð¶Ðµ Ñ Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ
базаÑ
â ми пеÑевÑÑÑÑмо ÑÑ
ÑÑÑ Ð² Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð·Ð°Ð¿Ð¸ÑÑ. СкладнÑÑе не «кÑиÑаÑи вовк»: Ñаме ÑÐ¾Ð¼Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð° ÑиÑÑа â Ñ
Ð¸Ð±Ð½Ñ ÑпÑаÑÑваннÑ.","Most known phishing is already in the big databases â we query them all in one request. The hard part is not crying wolf: thatâs why the headline number is the false-positive rate.")),1)])):p("",!0),_.value.length>=2?(i(),n("div",xe,[e("div",be,[e("p",ye,s(t("ÐинамÑка пÑогонÑв","Runs over time")),1),e("div",ve,[e("span",ge,"â "+s(t("виÑвленнÑ","detection")),1),e("span",ke,"â "+s(t("Ñ
ибнÑ","false-pos")),1)])]),(i(),n("svg",{viewBox:`0 0 ${L} ${x}`,class:"w-full",style:f({height:x+"px"}),preserveAspectRatio:"none"},[e("polyline",{points:T(_.value.map(c=>c.recall_pct)),fill:"none",stroke:"#34d399","stroke-width":"2"},null,8,Te),e("polyline",{points:T(_.value.map(c=>c.fpr_pct)),fill:"none",stroke:"#f87171","stroke-width":"2"},null,8,Pe)],12,we)),e("p",Be,s(_.value.length)+" "+s(t("оÑÑаннÑÑ
пÑогонÑв","latest runs"))+" · "+s(t("Ñкала 0â100%","0â100% scale")),1)])):p("",!0),u.value?(i(),n("div",Le,[e("div",Ne,[e("p",Se,s(t("СпÑймано в ÑÑÐ¾Ð¼Ñ Ð¿ÑогонÑ","Caught in this run")),1),e("ul",Ve,[(i(!0),n(h,null,y(u.value.caught,(c,r)=>(i(),n("li",{key:r,class:"text-[12px]"},[e("span",Re,s(c.url),1),c.reason?(i(),n("span",Ce,"· "+s(c.reason),1)):p("",!0)]))),128))])]),e("div",Fe,[e("p",Me,s(t("ÐегÑÑÐ¸Ð¼Ð½Ñ â не помÑÑенÑ","Legitimate â not flagged")),1),e("div",Oe,[(i(!0),n(h,null,y(u.value.clean,(c,r)=>(i(),n("span",{key:r,class:"text-[11px] font-mono px-2 py-0.5 rounded-full",style:{background:"#0f1424",color:"#8899bb"}},s(c),1))),128))]),u.value.false_pos&&u.value.false_pos.length?(i(),n(h,{key:0},[e("p",De,s(t("Ð¥Ð¸Ð±Ð½Ñ ÑпÑаÑÑÐ²Ð°Ð½Ð½Ñ (ÑеÑно)","False positives (shown honestly)")),1),e("ul",Ue,[(i(!0),n(h,null,y(u.value.false_pos,(c,r)=>(i(),n("li",{key:r,class:"text-[11px]"},[e("span",$e,s(c.domain),1),c.reason?(i(),n("span",je," · "+s(c.reason),1)):p("",!0)]))),128))])],64)):p("",!0)])])):p("",!0),e("p",Ae,s(t("ÐÑÑаннÑй пÑогÑн","Last run"))+": "+s(S(l.value.ran_at))+" · "+s(t("оновлÑÑÑÑÑÑ ÑоÑижнÑ, авÑомаÑиÑно","updated weekly, automatically")),1),e("div",qe,[e("h2",Ee,s(t("ÐеÑодика","Method")),1),e("ul",Ie,[e("li",We,[a[0]||(a[0]=e("span",{style:{color:"#60a5fa"}},"â¢",-1)),e("span",null,s(t("ÐозиÑивний набÑÑ â ÑвÑÐ¶Ñ ÑÑÑÐ¸Ð½Ð³Ð¾Ð²Ñ URL з OpenPhish. ÐегаÑивний â Ñоп-легÑÑÐ¸Ð¼Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¸ з Tranco top-list. ÐибÑÑка ÑÑабÑлÑна в межаÑ
ÑÐ¸Ð¶Ð½Ñ (деÑеÑмÑнований seed).","Positive set: fresh phishing URLs from OpenPhish. Negative set: top legitimate domains from the Tranco list. The sample is stable within a week (deterministic seed).")),1)]),e("li",ze,[a[1]||(a[1]=e("span",{style:{color:"#60a5fa"}},"â¢",-1)),e("span",null,s(t("ÐÑогонÑÑмо Ñой Ñамий ÑепÑÑаÑÑйний ÑаÑ, Ñо й на ÑеалÑнÑй пеÑевÑÑÑÑ: VirusTotal + Safe Browsing + PhishTank + вÑк Ð´Ð¾Ð¼ÐµÐ½Ñ + ÑмÑÑаÑÑÑ Ð±ÑендÑ. ÐаÑÑ Ð²Ð»Ð°ÑÐ½Ñ Ð±Ð»Ð¾ÐºÐ»Ð¸ÑÑи ÑÑÑ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ â ÑнакÑе ÑÑÑинг з OpenPhish заÑаÑ
овÑвавÑÑ Ð± Ñам ÑобÑ.","We run the same reputation layer a real check uses: VirusTotal + Safe Browsing + PhishTank + domain age + brand impersonation. Our own blocklists are disabled here â otherwise OpenPhish phishing would count itself.")),1)]),e("li",Ge,[a[2]||(a[2]=e("span",{style:{color:"#60a5fa"}},"â¢",-1)),e("span",null,s(t("Ðомен вважаÑÑÑÑÑ Ð¿Ð¾Ð¼ÑÑеним, ÑкÑо risk ⥠50 (ÑÑÐ²ÐµÐ½Ñ Â«Ð¿ÑдозÑÑло»). Ð¥Ð¸Ð±Ð½Ñ ÑпÑаÑÑÐ²Ð°Ð½Ð½Ñ â головна меÑÑика: помилка на ÑÑÐ¶Ð¾Ð¼Ñ Ð´Ð¾Ð±ÑопоÑÑдоÑÐ½Ð¾Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ Ð´Ð¾ÑожÑа за пÑопÑÑк.","A domain counts as flagged if its risk ⥠50 (the âsuspiciousâ level). False positives are the headline metric â a mistake on someoneâs legitimate domain costs more than a miss.")),1)])])]),e("div",He,[b(O(D),{to:"/",class:"rounded-xl px-6 py-3 text-sm font-semibold inline-block",style:{background:"#2563eb",color:"#fff"}},{default:M(()=>[P(s(t("ÐеÑевÑÑиÑи ÑÐ²Ð¾Ñ Ð¿Ð¾ÑиланнÑ","Check your own link"))+" â ",1)]),_:1})])],64))])]),b(j)]))}};export{es as default};
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.