1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,6315,e=>{"use strict";let t={scan_form_placeholder:{en:"https://your-site.com",uk:"https://ваÑ-ÑайÑ.com"},scan_form_add_more:{en:"+ Add up to 2 more URLs (enables layout-stability check)",uk:"+ ÐодаÑи Ñе до 2 URL (Ð²Ð¼Ð¸ÐºÐ°Ñ Ð¿ÐµÑевÑÑÐºÑ layout-stability)"},scan_form_additional:{en:"Additional URL",uk:"ÐодаÑковий URL"},scan_form_another:{en:"+ Another URL",uk:"+ Ще один URL"},scan_form_submit:{en:"Run scan",uk:"ÐапÑÑÑиÑи ÑканÑваннÑ"},scan_form_working:{en:"Workingâ¦",uk:"ÐÑаÑÑÑâ¦"},scan_form_url_required:{en:"Please enter a URL.",uk:"ÐведÑÑÑ URL."},scan_form_verify_required:{en:"Please complete the verification.",uk:"ÐÑойдÑÑÑ Ð²ÐµÑиÑÑкаÑÑÑ."},scan_form_submission_failed:{en:"Submission failed",uk:"Ðе вдалоÑÑ Ð²ÑдпÑавиÑи"},scan_form_unknown_error:{en:"Unknown error",uk:"ÐевÑдома помилка"},scan_form_scan_failed:{en:"Scan failed.",uk:"СканÑÐ²Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ."},scan_form_timeout:{en:"Scan timed out. Try again.",uk:"СканÑÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑевиÑило лÑмÑÑ ÑаÑÑ. СпÑобÑйÑе Ñе."},scan_form_phase_queued:{en:"Queued â waiting for a workerâ¦",uk:"У ÑеÑÐ·Ñ â ÑÐµÐºÐ°Ñ Ð½Ð° воÑкеÑâ¦"},scan_form_phase_running:{en:"Scanning your page (Puppeteer + 6 checks)â¦",uk:"СканÑÑ ÑÑоÑÑÐ½ÐºÑ (Puppeteer + пеÑевÑÑки)â¦"},scan_form_phase_done:{en:"Done â redirectingâ¦",uk:"ÐоÑово â пеÑенапÑавлÑÑâ¦"},quick_fix_label:{en:"Quick fix:",uk:"Швидке випÑавленнÑ:"},get_stack_fix:{en:"Get stack-specific fix instructions â",uk:"ÐÑÑимаÑи ÑнÑÑÑÑкÑÑÑ Ð´Ð»Ñ Ð²Ð°Ñого ÑÑÐµÐºÑ â"},ps_heading:{en:"Want a detailed personalized report?",uk:"ÐоÑÑÑбен деÑалÑний звÑÑ?"},ps_intro_1:{en:"Get a comprehensive audit personalized to your detected tech stack. Pay what you want from $1 â",uk:"Ðовний аÑдиÑ, пеÑÑоналÑзований пÑд Ð²Ð°Ñ ÑÑек. ÐлаÑÑÑÑ ÑкÑлÑки Ñ
оÑеÑе вÑд $1 â"},ps_intro_2:{en:"100% of net profit â Ukraine ðºð¦",uk:"100% ÑиÑÑого пÑибÑÑÐºÑ â УкÑаÑна ðºð¦"},ps_intro_3:{en:" (acquiring, tax, and API costs not included).",uk:" (еквайÑинг, подаÑок Ñа API-виÑÑаÑи не вÑ
одÑÑÑ)."},ps_not_sure:{en:"Not sure?",uk:"СÑмнÑваÑÑеÑÑ?"},ps_see_example:{en:"See an example report â",uk:"ÐодивиÑиÑÑ Ð¿Ñиклад звÑÑÑ â"},ps_card_markdown_title:{en:"Markdown Audit Report",uk:"Markdown Audit-звÑÑ"},ps_card_markdown_blurb:{en:"Polished audit document personalized to your detected stack. Share with team or client.",uk:"ÐоÑовий до пÑблÑкаÑÑÑ Ð°ÑдиÑ-докÑÐ¼ÐµÐ½Ñ Ð¿Ñд Ð²Ð°Ñ ÑÑек. ÐодÑлÑÑÑÑÑ Ð· ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ñ Ð°Ð±Ð¾ клÑÑнÑом."},ps_card_spec_title:{en:"Developer Specification",uk:"Developer Specification"},ps_card_spec_blurb:{en:"Spec ready for Cursor / Claude Code / Copilot. Per-task files, acceptance criteria, tests.",uk:"Ð¡Ð¿ÐµÑ Ð³Ð¾Ñова Ð´Ð»Ñ Cursor / Claude Code / Copilot. Файли, кÑиÑеÑÑÑ, ÑеÑÑи по задаÑаÑ
."},ps_card_bundle_title:{en:"Bundle (both)",uk:"Bundle (обидва)"},ps_card_bundle_blurb:{en:"Get both products. Share the audit, hand the spec to your dev or AI agent.",uk:"ÐÑÑимайÑе обидва. ÐÑÐ´Ð¸Ñ â командÑ, ÑÐ¿ÐµÑ â ÑозÑÐ¾Ð±Ð½Ð¸ÐºÑ Ñи AI-агенÑÑ."},ps_card_from:{en:"From $",uk:"ÐÑд $"},ps_card_suggested:{en:"suggested $",uk:"Ñекомендовано $"},ps_modal_amount:{en:"You pay (USD)",uk:"Ðи плаÑиÑе (USD)"},ps_modal_aria_amount:{en:"Amount in USD",uk:"СÑма Ñ USD"},ps_modal_split_headline:{en:"100% of net profit â Ukraine",uk:"100% ÑиÑÑого пÑибÑÑÐºÑ â УкÑаÑна"},ps_modal_split_formula:{en:"We deduct acquiring fee, tax, and API costs first â what remains is net profit, and 100% of that goes to charity.",uk:"СпоÑаÑÐºÑ Ð²Ð¸ÑаÑ
овÑÑмо еквайÑинг, подаÑок Ñа API-виÑÑаÑи â Ñо залиÑаÑÑÑÑÑ, Ñе ÑиÑÑий пÑибÑÑок, Ñ 100% вÑд нÑого йде на благодÑйнÑÑÑÑ."}
1,ps_modal_charge_note:{en:"Charged in USD via Mono. Your bank converts to local currency at their rate.",uk:"СпиÑÑÑÑÑÑÑ Ð² USD ÑеÑез Mono. ÐÐ°Ñ Ð±Ð°Ð½Ðº конвеÑÑÑÑ Ñ Ð¼ÑÑÑÐµÐ²Ñ Ð²Ð°Ð»ÑÑÑ Ð·Ð° ÑвоÑм кÑÑÑом."},ps_modal_email_label:{en:"Email (for receipt + report delivery)",uk:"Email (Ð´Ð»Ñ ÐºÐ²Ð¸ÑанÑÑÑ + доÑÑавки звÑÑÑ)"},ps_modal_email_invalid:{en:"Enter a valid email.",uk:"ÐведÑÑÑ ÐºÐ¾ÑекÑний email."},ps_modal_redirecting:{en:"Redirecting...",uk:"ÐеÑенапÑавлÑÑ..."},ps_modal_pay_button:{en:"Pay $",uk:"ÐлаÑиÑи $"},ps_modal_pay_button_suffix:{en:" via Mono",uk:" ÑеÑез Mono"},ps_modal_cancel:{en:"Cancel",uk:"СкаÑÑваÑи"},ps_modal_close:{en:"Close",uk:"ÐакÑиÑи"},ps_modal_network_error:{en:"Network error.",uk:"Ðомилка меÑежÑ."},ps_modal_non_json:{en:"Server returned non-JSON (HTTP ",uk:"СеÑÐ²ÐµÑ Ð¿Ð¾Ð²ÐµÑнÑв не-JSON (HTTP "},ps_modal_init_failed:{en:"Payment init failed (HTTP ",uk:"Ðе вдалоÑÑ ÑнÑÑÑÑваÑи плаÑÑж (HTTP "},status_checking:{en:"Checking payment statusâ¦",uk:"ÐеÑевÑÑÑÑ ÑÑаÑÑÑ Ð¿Ð»Ð°ÑежÑâ¦"},status_cannot_check:{en:"Cannot check payment status",uk:"Ðе вдаÑÑÑÑÑ Ð¿ÐµÑевÑÑиÑи ÑÑаÑÑÑ Ð¿Ð»Ð°ÑежÑ"},status_awaiting:{en:"Awaiting payment confirmation",uk:"ÐÑÑкÑÑ Ð¿ÑдÑвеÑÐ´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð»Ð°ÑежÑ"},status_awaiting_body:{en:"We haven't received a confirmation from Mono yet. If you completed the payment, this may take a moment. If you cancelled, just ignore this â no charge made.",uk:"ÐÑдÑвеÑÐ´Ð¶ÐµÐ½Ð½Ñ Ð²Ñд Mono Ñе не оÑÑимано. ЯкÑо ви завеÑÑили плаÑÑж â поÑекайÑе кÑлÑка ÑекÑнд. ЯкÑо ÑкаÑÑвали â ÑгноÑÑйÑе, ÑпиÑÐµÐ½Ð½Ñ Ð½Ðµ бÑло."},status_payment_failed:{en:"Payment",uk:"ÐлаÑÑж"},status_no_charge:{en:"No charge was made. You can try again from the section above.",uk:"ÐоÑÑи не ÑпиÑано. ÐожеÑе ÑпÑобÑваÑи Ñе Ñаз виÑе."},status_refunded:{en:"Payment refunded",uk:"ÐлаÑÑж повеÑнÑÑо"},status_refunded_body:{en:"Something went wrong after the charge. We've refunded the amount automatically. Email us if you don't see it in your statement within a few business days.",uk:"ЩоÑÑ Ð¿ÑÑло не Ñак пÑÑÐ»Ñ ÑпиÑаннÑ. Ðи авÑомаÑиÑно повеÑнÑли коÑÑи. ÐапиÑÑÑÑ ÑкÑо не побаÑиÑе повеÑÐ½ÐµÐ½Ð½Ñ Ñ Ð²Ð¸Ð¿Ð¸ÑÑÑ Ð¿ÑоÑÑгом кÑлÑкоÑ
ÑобоÑиÑ
днÑв."},status_generating:{en:"Payment received â generating your report",uk:"ÐлаÑÑж оÑÑимано â генеÑÑÑ Ð²Ð°Ñ Ð·Ð²ÑÑ"},status_generating_body:{en:"This usually takes 20-40 seconds. We'll also email you a copy when ready.",uk:"ÐазвиÑай Ñе 20-40 ÑекÑнд. ÐопÑÑ Ð¿Ñийде на email коли бÑде гоÑово."},status_ready_one:{en:"Your report is ready",uk:"ÐÐ°Ñ Ð·Ð²ÑÑ Ð³Ð¾Ñовий"},status_ready_many:{en:"Your reports are ready",uk:"ÐаÑÑ Ð·Ð²ÑÑи гоÑовÑ"},status_ready_body:{en:"We've emailed a copy. You can also view + download below.",uk:"ÐопÑÑ Ð½Ð°Ð´ÑÑлана на email. ТÑÑ Ð¼Ð¾Ð¶Ð½Ð° пеÑеглÑнÑÑи + заванÑажиÑи."},status_chars_label:{en:"chars",uk:"Ñимв"},status_download_md:{en:"download .md",uk:"заванÑажиÑи .md"},share_label:{en:"Share this report",uk:"ÐодÑлиÑиÑÑ Ð·Ð²ÑÑом"},copy_url:{en:"Copy URL",uk:"ÐопÑÑваÑи URL"},copied:{en:"Copied!",uk:"СкопÑйовано!"}};e.s(["t",0,function(e,n="en"){let r=t[e];return r?r[n]??r.en??e:e}])},95057,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={formatUrl:function(){return i},formatWithValidation:function(){return l},urlObjectKeys:function(){return s}};for(var a in r)Object.defineProperty(n,a,{enumerable:!0,get:r[a]});let o=e.r(90809)._(e.r(98183)),u=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:n}=e,r=e.protocol||"",a=e.pathname||"",i=e.hash||"",s=e.query||"",l=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?l=t+e.host:n&&(l=t+(~n.indexOf(":")?`[${n}]`:n),e.port&&(l+=":"+e.port)),s&&"object"==typeof s&&(s=String(o.urlQueryToSearchParams(s)));let c=e.search||s&&`?${s}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||u.test(r))&&!1!==l?(l="//"+(l||""),a&&"/"!==a[0]&&(a="/"+a)):l||(l=""),i&&"#"!==i[0]&&(i="#"+i),c&&"?"!==c[0]&&(c="?"+c),a=a.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${r}${l}${a}${c}${i}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function l(e){return i(e)}},18581,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"useMergedRef",{enumerable:!0,get:function(){return a}});let r=e.r(71645);function a(e,t){let n=(0,r.useRef)(null),a=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=n.current;e&&(n.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(n.current=o(e,r)),t&&(a.current=o(t,r))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let n=e(t);return"function"==typeof n?n:()=>e(null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esMo
1dule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},73668,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isLocalURL",{enumerable:!0,get:function(){return o}});let r=e.r(18967),a=e.r(52817);function o(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),n=new URL(e,t);return n.origin===t&&(0,a.hasBasePath)(n.pathname)}catch(e){return!1}}},84508,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},22016,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return y},useLinkStatus:function(){return g}};for(var a in r)Object.defineProperty(n,a,{enumerable:!0,get:r[a]});let o=e.r(90809),u=e.r(43476),i=o._(e.r(71645)),s=e.r(95057),l=e.r(8372),c=e.r(18581),d=e.r(18967),f=e.r(5550);e.r(33525);let _=e.r(88540),p=e.r(91949),m=e.r(73668),h=e.r(9396);function y(t){var n,r;let a,o,y,[g,b]=(0,i.useOptimistic)(p.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:w,as:S,children:x,prefetch:P=null,passHref:j,replace:C,shallow:T,scroll:R,onClick:U,onMouseEnter:O,onTouchStart:L,legacyBehavior:A=!1,onNavigate:E,transitionTypes:M,ref:N,unstable_dynamicOnHover:$,...D}=t;a=x,A&&("string"==typeof a||"number"==typeof a)&&(a=(0,u.jsx)("a",{children:a}));let I=i.default.useContext(l.AppRouterContext),q=!1!==P,B=!1!==P?null===(r=P)||"auto"===r?h.FetchStrategy.PPR:h.FetchStrategy.Full:h.FetchStrategy.PPR,K="string"==typeof(n=S||w)?n:(0,s.formatUrl)(n);if(A){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=i.default.Children.only(a)}let W=A?o&&"object"==typeof o&&o.ref:N,F=i.default.useCallback(e=>(null!==I&&(v.current=(0,p.mountLinkInstance)(e,K,I,B,q,b)),()=>{v.current&&((0,p.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,p.unmountPrefetchableInstance)(e)}),[q,K,I,B,b]),Y={ref:(0,c.useMergedRef)(F,W),onClick(t){A||"function"!=typeof U||U(t),A&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!I||t.defaultPrevented||function(t,n,r,a,o,u,s){if("u">typeof window){let l,{nodeName:c}=t.currentTarget;if("A"===c.toUpperCase()&&((l=t.currentTarget.getAttribute("target"))&&"_self"!==l||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,m.isLocalURL)(n)){a&&(t.preventDefault(),location.replace(n));return}if(t.preventDefault(),u){let e=!1;if(u({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:d}=e.r(99781);i.default.startTransition(()=>{d(n,a?"replace":"push",!1===o?_.ScrollBehavior.NoScroll:_.ScrollBehavior.Default,r.current,s)})}}(t,K,v,C,R,E,M)},onMouseEnter(e){A||"function"!=typeof O||O(e),A&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),I&&q&&(0,p.onNavigationIntent)(e.currentTarget,!0===$)},onTouchStart:function(e){A||"function"!=typeof L||L(e),A&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),I&&q&&(0,p.onNavigationIntent)(e.currentTarget,!0===$)}};return(0,d.isAbsoluteUrl)(K)?Y.href=K:A&&!j&&("a"!==o.type||"href"in o.props)||(Y.href=(0,f.addBasePath)(K)),y=A?i.default.cloneElement(o,Y):(0,u.jsx)("a",{...D,...Y,children:a}),(0,u.jsx)(k.Provider,{value:g,children:y})}e.r(84508);let k=(0,i.createContext)(p.IDLE_LINK_STATUS),g=()=>(0,i.useContext)(k);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18566,(e,t,n)=>{t.exports=e.r(76562)},66861,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(18566);function a({siteKey:e,onToken:r}){let o=(0,n.useRef)(null),u=(0,n.useRef)(null);return((0,n.useEffect)(()=>
1{if(!e)return;let t=!1,n=()=>{if(!t){if(window.turnstile&&o.current){u.current=window.turnstile.render(o.current,{sitekey:e,callback:e=>r(e),"error-callback":()=>r(""),"expired-callback":()=>r("")});return}setTimeout(n,200)}};if(document.getElementById("cf-turnstile-script"))n();else{let e=document.createElement("script");e.id="cf-turnstile-script",e.src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit",e.async=!0,e.defer=!0,e.onload=n,document.head.appendChild(e)}return()=>{if(t=!0,u.current&&window.turnstile)try{window.turnstile.remove(u.current)}catch{}}},[e,r]),e)?(0,t.jsx)("div",{ref:o}):(0,t.jsx)("div",{className:"text-xs text-muted italic",children:"Turnstile site key not configured â scans bypass verification in dev mode."})}var o=e.i(6315);e.s(["default",0,function({turnstileSiteKey:e,lang:u="en"}){let i=(0,r.useRouter)(),[s,l]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[f,_]=(0,n.useState)(!1),[p,m]=(0,n.useState)(""),[h,y]=(0,n.useState)(!1),[k,g]=(0,n.useState)(null),[b,v]=(0,n.useState)("idle"),w=(0,n.useCallback)(e=>m(e),[]),S="uk"===u?"/uk/r":"/r",x=async t=>{if(t.preventDefault(),g(null),!s.trim())return void g((0,o.t)("scan_form_url_required",u));if(e&&!p)return void g((0,o.t)("scan_form_verify_required",u));y(!0),v("queued");try{let e=[s.trim(),...c.map(e=>e.trim()).filter(Boolean)].slice(0,3),t=await fetch("/agent-check/api/scan",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({urls:e,turnstileToken:p})});if(!t.ok){let e=await t.json().catch(()=>({error:(0,o.t)("scan_form_submission_failed",u)}));throw Error(e.error??(0,o.t)("scan_form_submission_failed",u))}let{jobId:n}=await t.json();window.dataLayer?.push({event:"agent_check_scan_submitted",url_count:e.length}),await P(n)}catch(e){g(e instanceof Error?e.message:(0,o.t)("scan_form_unknown_error",u)),y(!1),v("failed")}},P=async e=>{let t=Date.now()+9e4;for(;Date.now()<t;){await new Promise(e=>setTimeout(e,2e3));let t=await fetch(`/agent-check/api/scan/${e}/status`);if(!t.ok)continue;let n=await t.json();if(v(n.status),"done"===n.status&&n.slug){window.dataLayer?.push({event:"agent_check_scan_completed",slug:n.slug}),i.push(`${S}/${n.slug}`);return}if("failed"===n.status){g(n.error??(0,o.t)("scan_form_scan_failed",u)),y(!1);return}}g((0,o.t)("scan_form_timeout",u)),y(!1),v("failed")},j={idle:"",queued:(0,o.t)("scan_form_phase_queued",u),running:(0,o.t)("scan_form_phase_running",u),done:(0,o.t)("scan_form_phase_done",u),failed:""}[b];return(0,t.jsxs)("form",{onSubmit:x,className:"space-y-4",children:[(0,t.jsx)("input",{type:"url",required:!0,placeholder:(0,o.t)("scan_form_placeholder",u),value:s,onChange:e=>l(e.target.value),disabled:h,className:"input-text"}),f?(0,t.jsxs)("div",{className:"space-y-2",children:[c.map((e,n)=>(0,t.jsx)("input",{type:"url",placeholder:`${(0,o.t)("scan_form_additional",u)} ${n+1}`,value:e,onChange:e=>{let t=[...c];t[n]=e.target.value,d(t)},disabled:h,className:"input-text"},n)),c.length<2&&(0,t.jsx)("button",{type:"button",onClick:()=>d([...c,""]),className:"text-xs text-accent hover:underline",disabled:h,children:(0,o.t)("scan_form_another",u)})]}):(0,t.jsx)("button",{type:"button",onClick:()=>{_(!0),d([""])},className:"text-sm text-accent hover:underline",disabled:h,children:(0,o.t)("scan_form_add_more",u)}),(0,t.jsx)(a,{siteKey:e,onToken:w}),(0,t.jsx)("button",{type:"submit",disabled:h,className:"btn-primary w-full",children:h?j||(0,o.t)("scan_form_working",u):(0,o.t)("scan_form_submit",u)}),k&&(0,t.jsx)("div",{className:"text-sm text-poor",children:k}),h&&j&&(0,t.jsx)("div",{className:"text-sm text-muted",children:j})]})}],66861)}]);
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.