1<!DOCTYPE html><html dir="ltr" lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/brand-mark.svg"/><title>Arabic Text Shaper: How RTL and HarfBuzz Shaping Work</title><meta name="theme-color" content="#102f28"/><meta name="description" content="Learn how an Arabic text shaper handles RTL, joining, ligatures, Harakat and HarfBuzz glyph paths for accurate SVG and PDF exports."/><meta property="og:type" content="website"/><meta property="og:site_name" content="Arabic Calligraphy Studio"/><meta property="og:locale" content="en_US"/><meta property="og:locale:alternate" content="ar_AR"/><meta property="og:title" content="Arabic Text Shaper: How RTL and HarfBuzz Shaping Work"/><meta property="og:description" content="Learn how an Arabic text shaper handles RTL, joining, ligatures, Harakat and HarfBuzz glyph paths for accurate SVG and PDF exports."/><meta property="og:url" content="https://arabiccalligraphy.app/how-arabic-shaping-works"/><meta property="og:image" content="https://arabiccalligraphy.app/og.png"/><meta name="twitter:title" content="Arabic Text Shaper: How RTL and HarfBuzz Shaping Work"/><meta name="twitter:description" content="Learn how an Arabic text shaper handles RTL, joining, ligatures, Harakat and HarfBuzz glyph paths for accurate SVG and PDF exports."/><meta name="twitter:url" content="https://arabiccalligraphy.app/how-arabic-shaping-works"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:image" content="https://arabiccalligraphy.app/og.png"/><link rel="modulepreload" href="/assets/main-CAlPfnCw.js"/><link rel="modulepreload" href="/assets/how-arabic-shaping-works-CvtjoUk-.js"/><link rel="modulepreload" href="/assets/public-page-B_aQS6gK.js"/><link rel="modulepreload" href="/assets/IconVectorBezier2-gTXwLeb4.js"/><link rel="modulepreload" href="/assets/IconArrowRight-BI-fCxwy.js"/><link rel="icon" type="image/svg+xml" href="/brand-mark.svg"/><link rel="manifest" href="/manifest.json"/><link rel="canonical" href="https://arabiccalligraphy.app/how-arabic-shaping-works"/><link rel="alternate" hrefLang="en" href="https://arabiccalligraphy.app/how-arabic-shaping-works"/><link rel="alternate" hrefLang="ar" href="https://arabiccalligraphy.app/ar/how-arabic-shaping-works"/><link rel="alternate" hrefLang="x-default" href="https://arabiccalligraphy.app/how-arabic-shaping-works"/><link rel="stylesheet" href="/assets/styles-LOrYhEYK.css"/></head><body>
1<script>(function() { 2 try { 3 var theme = localStorage.getItem('theme') || 'light'; 4 var systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; 5 var resolved = theme === 'system' ? systemTheme : theme; 6 document.documentElement.classList.add(resolved); 7 } catch (e) { 8 document.documentElement.classList.add('light'); 9 } 10})();;document.currentScript.remove()</script>
10<div class="flex min-h-screen flex-col"><header class="sticky inset-x-0 top-0 z-40 py-4 transition-all duration-300"><div class="relative z-10"><div class="container mx-auto max-w-7xl px-4"><nav aria-label="Main navigation" class="hidden lg:flex lg:items-center lg:justify-between lg:gap-4"><a aria-label="Home" href="/" class="flex items-center gap-2 shrink-0"><img src="/brand-mark.svg" alt="Arabic Calligraphy Studio logo" class="size-8 rounded-md dark:hidden" width="32" height="32" decoding="async"/><img src="/brand-mark.svg" alt="Arabic Calligraphy Studio logo" class="size-8 rounded-md hidden dark:block" width="32" height="32" decoding="async"/><span class="text-xl font-semibold">Arabic Calligraphy Studio</span></a><nav data-slot="navigation-menu" class="group/navigation-menu relative flex max-w-max items-center flex-1 justify-center"><ul data-slot="navigation-menu-list" class="group flex flex-1 list-none items-center justify-center gap-0"><li data-slot="navigation-menu-item" class="relative"><a data-slot="navigation-menu-link" href="/studio" class="gap-2 p-2 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4 group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted bg-transparent">Studio</a></li><li data-slot="navigation-menu-item" class="relative"><a data-slot="navigation-menu-link" href="/templates" class="gap-2 p-2 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4 group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted bg-transparent">Templates</a></li><li data-slot="navigation-menu-item" class="relative"><a data-slot="navigation-menu-link" href="/fonts" class="gap-2 p-2 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4 group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted bg-transparent">Fonts</a></li><li data-slot="navigation-menu-item" class="relative"><a aria-current="page" data-slot="navigation-menu-link" class="gap-2 p-2 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4 group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted bg-transparent font-semibold text-primary active" href="/how-arabic-shaping-works" data-status="active">How it works</a></li><li data-slot="navigation-menu-item" class="relative">
10<a data-slot="navigation-menu-link" href="/license" class="gap-2 p-2 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4 group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted bg-transparent">License</a></li></ul></nav><div class="flex items-center gap-4 shrink-0"><button type="button" tabindex="0" aria-haspopup="menu" id="base-ui-_R_rmaoq_" data-slot="dropdown-menu-trigger" aria-label="language" class="flex size-8 shrink-0 items-center justify-center rounded-full border border-border bg-transparent p-0 hover:bg-accent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-language size-4"><path d="M9 6.371c0 4.418 -2.239 6.629 -5 6.629"></path><path d="M4 6.371h7"></path><path d="M5 9c0 2.144 2.252 3.908 6 4"></path><path d="M12 20l4 -9l4 9"></path><path d="M19.1 18h-6.2"></path><path d="M6.694 3l.793 .582"></path></svg></button><button type="button" tabindex="0" aria-haspopup="menu" id="base-ui-_R_tmaoq_" data-slot="dropdown-menu-trigger" aria-label="Toggle theme" class="flex size-8 shrink-0 items-center justify-center rounded-full border border-border bg-transparent p-0 hover:bg-accent"><span class="relative inline-flex size-4 items-center justify-center"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-sun size-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0"><path d="M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0"></path><path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-moon absolute size-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100"><path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454l0 .008"></path></svg></span></button></div></nav></div></div></header><main id="main-content" class="flex-1"><!--$--><header class="border-b px-4 py-16 sm:px-6 lg:py-20"><div class="mx-auto max-w-[1120px]"><p class="flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.16em] text-primary"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-vector-bezier-2 " aria-hidden="true"><path d="M3 4a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1l0 -2"></path><path d="M17 18a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1l0 -2"></path><path d="M7 5l7 0"></path><path d="M10 19l7 0"></path><path d="M8 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M14 5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M7 5.5a5 6.5 0 0 1 5 6.5a5 6.5 0 0 0 5 6.5"></path></svg>Technical guide</p><h1 class="mt-5 max-w-[18ch] text-5xl font-semibold leading-[0.98] tracking-[-0.05em] sm:text-6xl">How our Arabic text shaper works</h1><p class="mt-5 max-w-[64ch] text-base leading-7 text-muted-foreground">Arabic letters change form based on context. Harakat attach to base glyphs, mixed text follows the Unicode Bidirectional Algorithm, and each font has its own outlines. A text shaper resolves those relationships before anything is drawn.</p></div></header><main class="px-4 py-16 sm:px-6"><div class="mx-auto max-w-[920px]"><ol class="grid gap-px overflow-hidden rounded-2xl border bg-border md:grid-cols-2"><li class="bg-card p-6"><span class="font-mono text-xs text-primary">0<!-- -->1</span><h2 class="mt-8 text-xl font-semibold">Source text</h2><p class="mt-3 text-sm leading-6 text-muted-foreground">The Studio keeps the Unicode source string intact. It never reverses Arabic text to fake RTL.</p></li><li class="bg-card p-6"><span class="font-mono text-xs text-primary">0<!-- -->2</span><h2 class="mt-8 text-xl font-semibold">Visual runs</h2><p class="mt-3 text-sm leading-6 text-muted-foreground">bidi-js separates Arabic, Latin, numbers, punctuation, and URLs into the correct visual runs.</p></li><li class="bg-card p-6"><span class="font-mono text-xs text-primary">0<!-- -->3</span><h2 class="mt-8 text-xl font-semibold">Glyph shaping</h2><p class="mt-3 text-sm leading-6 text-muted-foreground">HarfBuzz applies script, direction, language, ligatures, joining forms, marks, and positioning.</p></li><li class="bg-card p-6"><span class="font-mono text-xs text-primary">0<!-- -->4</span><h2 class="mt-8 text-xl font-semibold">Outline lookup</h2><p class="mt-3 text-sm leading-6 text-muted-foreground">opentype.js reads each shaped glyph ID from the selected TTF and produces an explicit path.</p></li><li class="bg-card p-6"><span class="font-mono text-xs text-primary">0<!-- -->5</span><h2 class="mt-8 text-xl font-semibold">Scene composition</h2><p class="mt-3 text-sm leading-6 text-muted-foreground">The scene applies alignment, position, scale, rotation, fill, stroke, shadow, and canvas settings.</p></li><li class="bg-card p-6"><span class="font-mono text-xs text-primary">0<!-- -->6</span><h2 class="mt-8 text-xl font-semibold">Shared export</h2><p class="mt-3 text-sm leading-6 text-muted-foreground">The preview, PNG, SVG, and PDF all consume those same scene paths.</p></li></ol><section class="mt-12 rounded-2xl bg-[#102f28] p-7 text-[#fbf7ed]"><h2 class="text-2xl font-semibold">Why browser text is not enough</h2><p class="mt-4 text-sm leading-7 text-white/65">
10A browser text node, a canvas fillText call, and a PDF text layer can choose different shaping engines or font fallbacks. The Studio instead shapes once and passes explicit glyph paths to every output. That makes visual differences testable and keeps SVG independent from installed fonts.</p></section><section class="mt-12 grid gap-6 md:grid-cols-2"><article class="rounded-2xl border bg-card p-6 sm:p-8"><h2 class="text-2xl font-semibold">Source text vs. displayed glyphs</h2><p class="mt-4 text-sm leading-7 text-muted-foreground">Unicode stores the characters you typed; it does not require you to replace every Arabic letter with a visual presentation-form character. The shaping engine reads the text, direction, font tables and nearby characters, then selects and positions the correct glyphs. Keeping the source text intact preserves copying and editing.</p></article><article class="rounded-2xl border bg-card p-6 sm:p-8"><h2 class="text-2xl font-semibold">Why vector export needs shaping</h2><p class="mt-4 text-sm leading-7 text-muted-foreground">A browser can shape live text for the screen, but an SVG or PDF made from outlines needs exact glyph IDs, positions and advances. HarfBuzz supplies that layout data before the exporter converts each glyph to a path. This keeps joins, ligatures and Harakat consistent in a file that no longer depends on installed fonts.</p></article></section><section class="mt-12 rounded-2xl border border-[#b8874a]/35 bg-[#b8874a]/10 p-6 sm:p-8"><h2 class="text-2xl font-semibold">Try the Arabic shaping pipeline</h2><p class="mt-3 max-w-3xl text-sm leading-7 text-muted-foreground">Enter Arabic with diacritics, numbers or a Latin word in the editor, compare the preview, then export SVG to inspect the final paths. You can also compare all 12 included typefaces before choosing one.</p><div class="mt-5 flex flex-wrap gap-3"><a href="/studio" class="inline-flex min-h-11 items-center rounded-lg bg-primary px-5 text-sm font-semibold text-primary-foreground">Open the Arabic text shaper</a><a href="/fonts" class="inline-flex min-h-11 items-center rounded-lg border bg-card px-5 text-sm font-semibold">Compare Arabic fonts</a></div></section><section class="mt-12"><h2 class="text-2xl font-semibold">Primary technical references</h2><ul class="mt-5 grid gap-3 text-sm sm:grid-cols-3"><li><a class="underline decoration-primary/30 underline-offset-4" href="https://harfbuzz.github.io/what-is-harfbuzz.html" rel="noreferrer" target="_blank">HarfBuzz: What is HarfBuzz?</a></li><li><a class="underline decoration-primary/30 underline-offset-4" href="https://www.unicode.org/reports/tr9/" rel="noreferrer" target="_blank">Unicode Bidirectional Algorithm</a></li><li><a class="underline decoration-primary/30 underline-offset-4" href="https://learn.microsoft.com/en-us/typography/opentype/spec/arabicshaping" rel="noreferrer" target="_blank">OpenType Arabic shaping</a></li></ul></section></div></main><section class="px-4 py-16 sm:px-6"><div class="mx-auto flex max-w-[1120px] flex-col items-start justify-between gap-6 rounded-2xl bg-[#102f28] p-8 text-[#fbf7ed] sm:flex-row sm:items-center"><p class="max-w-xl text-lg font-medium">Open your text in the full path-based editor.</p><a href="/studio" class="inline-flex min-h-11 shrink-0 items-center gap-2 rounded-lg bg-[#fbf7ed] px-5 text-sm font-semibold text-[#102f28] hover:bg-white">Open Studio<svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-arrow-right " aria-hidden="true"><path d="M5 12l14 0"></path><path d="M13 18l6 -6"></path><path d="M13 6l6 6"></path></svg></a></div></section>
10<script></script>
10<!--/$--></main><footer class="border-t"><div class="container mx-auto max-w-7xl px-4"><div class="grid grid-cols-2 gap-8 py-16 md:grid-cols-6"><div class="col-span-full flex flex-col items-start md:col-span-2"><div class="flex items-center space-x-2"><img src="/brand-mark.svg" alt="Arabic Calligraphy Studio logo" class="size-8 rounded-md dark:hidden" width="32" height="32" decoding="async"/><img src="/brand-mark.svg" alt="Arabic Calligraphy Studio logo" class="size-8 rounded-md hidden dark:block" width="32" height="32" decoding="async"/><span class="text-xl font-semibold">Arabic Calligraphy Studio</span></div><p class="text-muted-foreground text-base py-2 md:pr-12">Correct Arabic shaping, local editing, and free path-based exports.</p></div><div class="col-span-1 md:col-span-1 flex flex-col items-start"><span class="text-sm font-semibold uppercase">Product</span><ul class="mt-4 list-inside space-y-3"><li><a href="/studio" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Studio</a></li><li><a href="/templates" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Templates</a></li><li><a href="/fonts" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Fonts</a></li></ul></div><div class="col-span-1 md:col-span-1 flex flex-col items-start"><span class="text-sm font-semibold uppercase">Resources</span><ul class="mt-4 list-inside space-y-3"><li><a data-active="true" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary active" href="/how-arabic-shaping-works" data-status="active" aria-current="page">How shaping works</a></li><li><a href="/license" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Font license</a></li></ul></div><div class="col-span-1 md:col-span-1 flex flex-col items-start"><span class="text-sm font-semibold uppercase">Safety</span><ul class="mt-4 list-inside space-y-3"><li><a href="/templates/tattoo" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Tattoo review guide</a></li><li><a href="/privacy" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Privacy</a></li></ul></div><div class="col-span-1 md:col-span-1 flex flex-col items-start"><span class="text-sm font-semibold uppercase">Legal</span><ul class="mt-4 list-inside space-y-3"><li><a href="/terms" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Terms</a></li><li><a href="/cookie" class="text-sm text-muted-foreground transition-colors duration-150 hover:text-primary focus-visible:text-primary data-[active=true]:font-semibold data-[active=true]:text-primary">Cookie policy</a></li></ul></div></div></div><div class="border-t py-8"><div class="container mx-auto max-w-7xl px-4 flex flex-col items-center justify-between gap-4 sm:flex-row"><span class="text-muted-foreground text-sm">© <!-- -->2026<!-- --> <!-- -->Arabic Calligraphy Studio<!-- -->.<!-- --> <!-- -->All Rights Reserved</span><span class="text-sm text-muted-foreground">No account. No uploads. No watermark.</span></div></div></footer></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section>
10<script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]}; 11;$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/main-CAlPfnCw.js"],assets:$R[5]=[$R[6]={tag:"script",attrs:$R[7]={type:"module",async:!0},children:"import(\"/assets/main-CAlPfnCw.js\")"}]},"/how-arabic-shaping-works":$R[8]={preloads:$R[9]=["/assets/how-arabic-shaping-works-CvtjoUk-.js","/assets/public-page-B_aQS6gK.js","/assets/IconVectorBezier2-gTXwLeb4.js","/assets/IconArrowRight-BI-fCxwy.js"]}}},matches:$R[10]=[$R[11]={i:"__root__/",u:1791228615181,s:"success",ssr:!0},$R[12]={i:"/how-arabic-shaping-works/how-arabic-shaping-works",u:1791228615181,s:"success",ssr:!0}],lastMatchId:"/how-arabic-shaping-works/how-arabic-shaping-works",dehydratedData:$R[13]={queryStream:$R[14]=($R[15]=(e) => new ReadableStream({ start: (r) => { 12 e.on({ next: (a2) => { 13 try { 14 r.enqueue(a2); 15 } catch (t) { 16 } 17 }, throw: (a2) => { 18 r.error(a2); 19 }, return: () => { 20 try { 21 r.close(); 22 } catch (a2) { 23 } 24 } }); 25} }))($R[16]=($R[17]=() => { 26 let e = [], r = [], t = true, n2 = false, a2 = 0, s = (l, g, S) => { 27 for (S = 0; S < a2; S++) r[S] && r[S][g](l); 28 }, i = (l, g, S, d) => { 29 for (g = 0, S = e.length; g < S; g++) d = e[g], !t && g === S - 1 ? l[n2 ? "return" : "throw"](d) : l.next(d); 30 }, u = (l, g) => (t && (g = a2++, r[g] = l), i(l), () => { 31 t && (r[g] = r[a2], r[a2--] = void 0); 32 }); 33 return { __SEROVAL_STREAM__: true, on: (l) => u(l), next: (l) => { 34 t && (e.push(l), s(l, "next")); 35 }, throw: (l) => { 36 t && (e.push(l), s(l, "throw"), t = false, n2 = false, r.length = 0); 37 }, return: (l) => { 38 t && (e.push(l), s(l, "return"), t = false, n2 = true, r.length = 0); 39 } }; 40})())}})($R["tsr"]);document.currentScript.remove()</script>
40<script type="module" async="">import("/assets/main-CAlPfnCw.js")</script>
40<script>($R=>$R[16].return(void 0))($R["tsr"]);$_TSR.e();document.currentScript.remove()</script>
40</body></html>
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.