From 6275e5cfa2b4879771af5c05a75299dee9df4c28 Mon Sep 17 00:00:00 2001 From: Marcel Gansfusz Date: Sat, 25 Jan 2025 00:38:36 +0100 Subject: [PATCH] Ive waitet way too long --- .gitignore | 1 + .nvim/rsync.toml_alt | 2 + VO_Mathematik_3.pdf | Bin 0 -> 1362428 bytes app.js | 348 + app/__pycache__/main.cpython-312.pyc | Bin 0 -> 1575 bytes app/__pycache__/main.cpython-313.pyc | Bin 0 -> 2430 bytes app/files/UE 9 (1).pdf | Bin 0 -> 924018 bytes app/files/türschild_ausdrucken.pdf | Bin 0 -> 49728 bytes app/main.py | 45 + app/main_flask.py_ | 21 + favicon/apple-touch-icon.png | Bin 0 -> 7578 bytes favicon/favicon-96x96.png | Bin 0 -> 4317 bytes favicon/favicon.ico | Bin 0 -> 15086 bytes favicon/favicon.svg | 29 + favicon/generated_from.txt | 1 + favicon/site.webmanifest | 21 + favicon/web-app-manifest-192x192.png | Bin 0 -> 8164 bytes favicon/web-app-manifest-512x512.png | Bin 0 -> 28931 bytes index.html | 77 + index_a.html | 368 + pdf.mjs | 21337 +++++++++ pdf.worker.mjs | 56901 +++++++++++++++++++++++++ run.txt | 1 + script.js | 47 + style.css | 74 + 25 files changed, 79273 insertions(+) create mode 100644 .gitignore create mode 100644 .nvim/rsync.toml_alt create mode 100644 VO_Mathematik_3.pdf create mode 100644 app.js create mode 100644 app/__pycache__/main.cpython-312.pyc create mode 100644 app/__pycache__/main.cpython-313.pyc create mode 100644 app/files/UE 9 (1).pdf create mode 100644 app/files/türschild_ausdrucken.pdf create mode 100644 app/main.py create mode 100644 app/main_flask.py_ create mode 100644 favicon/apple-touch-icon.png create mode 100644 favicon/favicon-96x96.png create mode 100644 favicon/favicon.ico create mode 100644 favicon/favicon.svg create mode 100644 favicon/generated_from.txt create mode 100644 favicon/site.webmanifest create mode 100644 favicon/web-app-manifest-192x192.png create mode 100644 favicon/web-app-manifest-512x512.png create mode 100644 index.html create mode 100644 index_a.html create mode 100644 pdf.mjs create mode 100644 pdf.worker.mjs create mode 100644 run.txt create mode 100644 script.js create mode 100644 style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..42ddb4a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +app/venv/ diff --git a/.nvim/rsync.toml_alt b/.nvim/rsync.toml_alt new file mode 100644 index 0000000..36960a4 --- /dev/null +++ b/.nvim/rsync.toml_alt @@ -0,0 +1,2 @@ +# remote_path="/srv/http/" +# remote_path="dev@10.0.0.25:/var/www/html/" diff --git a/VO_Mathematik_3.pdf b/VO_Mathematik_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9e952fd026604bae205f1f820443f448852b31f GIT binary patch literal 1362428 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
kv>?p@KB+zi*@9ravlb^#k>(;@?}jxejeoz_ax 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%0A#SX{K7?GM@LiY&Q`l7%aclI+~San1b)& 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�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

%kF{P<0T;f;*E@ox!?_{OE+Gt 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�IPo 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%0D{z;HdH4Z7 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 Umkq*e0MMl}YWj5TB|4-2AI)_hrT_o{ literal 0 HcmV?d00001 diff --git a/app.js b/app.js new file mode 100644 index 0000000..a2f332c --- /dev/null +++ b/app.js @@ -0,0 +1,348 @@ +class PDFView { + constructor(nameRoute) { + this.loadingTask = pdfjsLib.getDocument(nameRoute); + this.pdfDoc = null; + this.canvas = document.querySelector("#cnv"); + this.ctx = this.canvas.getContext("2d"); + this.scale = 1.5; + this.numPage = 1; + this.maxheight = + window.innerHeight - + document.getElementById("buttonsdiv").getBoundingClientRect().height; + this.maxwidth = document + .getElementById("cnvdiv") + .getBoundingClientRect().width; + this.rendering = false; + this.loadingTask.promise.then((pdfDoc_) => { + this.pdfDoc = pdfDoc_; + document.querySelector("#npages").innerHTML = this.pdfDoc.numPages; + this.GeneratePDF(); + }); + } + GeneratePDF() { + this.rendering = true; + this.pdfDoc.getPage(this.numPage).then((page) => { + let unscaled = page.getViewport({ scale: 1.0 }); + this.scale = Math.min( + this.maxheight / unscaled.height, + this.maxwidth / unscaled.width, + ); + }); + this.pdfDoc.getPage(this.numPage).then((page) => { + let viewport = page.getViewport({ scale: this.scale }); + this.canvas.height = viewport.height; + this.canvas.width = viewport.width; + + let renderContext = { + canvasContext: this.ctx, + viewport: viewport, + }; + doc.cnv.width = this.canvas.width; + doc.cnv.height = this.canvas.height; + document.getElementById("rightdiv").style.width = + ((doc.cnv.width / screen.width) * 100).toString() + "vw"; + document.getElementById("controldiv").style.width = + ((1 - doc.cnv.width / screen.width) * 100).toString() + "vw"; + doc.pagescales[this.numPage] = { + scale: this.scale, + width: doc.cnv.width, + height: doc.cnv.height, + }; + + var renderTask = page.render(renderContext); + renderTask.promise.then(() => { + doc.drawRects(); + this.rendering = false; + }); + }); + document.querySelector("#npage").innerHTML = this.numPage; + } + + WaitToRender() { + if (this.rendering) { + window.setTimeout(this.WaitToRender.bind(this), 100); + } else { + this.GeneratePDF(); + } + } + + PrevPage() { + if (this.numPage === 1) { + return; + } + this.numPage--; + this.WaitToRender(); + } + + NextPage() { + if (this.numPage >= this.pdfDoc.numPages) { + return; + } + this.numPage++; + this.WaitToRender(); + } + RenderPage() { + this.WaitToRender(); + } +} +class Rectangle { + constructor(canvas, sx, sy, ex, ey, color, alpha = 1) { + this.x = sx < ex ? sx : ex; + this.y = sy < ey ? sy : ey; + this.width = Math.abs(ex - sx); + this.height = Math.abs(ey - sy); + this.color = color; + this.context = canvas.getContext("2d"); + this.alpha = alpha; + } + draw() { + this.context.globalAlpha = this.alpha; + this.context.beginPath(); + this.context.rect(this.x, this.y, this.width, this.height); + this.context.fillStyle = this.color; + this.context.strokeStyle = "black"; + this.context.lineWidth = 1; + + this.context.fill(); + this.context.stroke(); + } + makeTuple() { + return [this.x, this.y, this.width, this.height]; + } +} +class PDFDocument { + constructor(filename) { + this.pdf = new PDFView(filename); + this.fname = filename; + this.rects = []; + this.cnv = document.querySelector("#drw_cnv"); + this.ctx = this.cnv.getContext("2d"); + this.temprect = new Rectangle(this.cnv, 0, 0, 0, 0, "white", 0); + this.pagescales = []; + this.startX = 0; + this.startY = 0; + } + drawAll() { + //context = cnv.getContext("2d"); + this.ctx.clearRect(0, 0, this.cnv.width, this.cnv.height); + //pdf.RenderPage(); + this.drawRects(); + } + drawRects() { + if (!(this.pdf.numPage in this.rects)) { + this.rects[this.pdf.numPage] = []; + } + this.temprect.draw(); + for (var i = 0; i < this.rects[this.pdf.numPage].length; i++) { + var shape = this.rects[this.pdf.numPage][i]; + shape.draw(); + } + } + addRect(endpos) { + var re = new Rectangle( + this.cnv, + this.startX, + this.startY, + endpos.x, + endpos.y, + "black", + ); + this.rects[this.pdf.numPage].push(re); + this.drawAll(); + } + clearCnv() { + this.rects[this.pdf.numPage] = []; + //context = cnv.getContext("2d"); + this.ctx.clearRect(0, 0, this.cnv.width, this.cnv.height); + //pdf.RenderPage(); + this.temprect = new Rectangle(this.cnv, 0, 0, 0, 0, "black", 0); + } + clearAll() { + this.rects = []; + this.clearCnv(); + } + get paramRects() { + let prects = []; + for (var k = 0; k < this.rects.length; k++) { + prects[k] = []; + //console.log(this.rects[k]); + if (this.rects[k] === undefined) { + continue; + } + //console.log(this.rects[k].length); + //console.log(0 < this.rects[k].length); + let len = this.rects[k].length; + for (var i = 0; i < len; i++) { + //console.log(this.rects[k][i]); + prects[k].push([this.rects[k][i].makeTuple()]); + //console.log(prects[k][i]); + } + } + return prects; + } +} +var mouseIsDown = false; +//var startX = 0; +//var startY = 0; +//var pdf; +//var cnv = document.querySelector("#drw_cnv"); +//var ctx = cnv.getContext("2d"); +//var rects = {}; +//var temprect = new Rectangle(cnv, 0, 0, 0, 0, "white", 0); +//var pagescales = {}; + +function getMousePos(cnv, eve) { + var rect = cnv.getBoundingClientRect(); + return { + x: eve.clientX - rect.left, + y: eve.clientY - rect.top, + }; +} +function mouseDown(eve) { + //console.log(eve); + if (eve.buttons != 1) { + return; + } + if (mouseIsDown) { + return; + } + mouseIsDown = true; + var pos = getMousePos(cnv, eve); + doc.startX = pos.x; + doc.startY = pos.y; +} +function mouseUp(eve) { + //console.log(eve); + if (eve.buttons != 0) { + return; + } + if (!mouseIsDown) { + return; + } + mouseIsDown = false; + doc.addRect(getMousePos(cnv, eve)); + doc.temprect = new Rectangle(doc.cnv, 0, 0, 0, 0, "black", 0); +} + +//var mousexy = 0; +function mouSexy(eve) { + if (mouseIsDown) { + var pos = getMousePos(doc.cnv, eve); + doc.temprect = new Rectangle( + doc.cnv, + doc.startX, + doc.startY, + pos.x, + pos.y, + "black", + 0.5, + ); + doc.drawAll(); + } +} +function scrollPage(eve) { + console.log(eve); + if (eve.ctrlKey) { + return; + } + if (eve.deltaY > 0) { + doc.pdf.NextPage(); + } else { + doc.pdf.PrevPage(); + } +} +const initDraw = () => { + var cnv = document.querySelector("#drw_cnv"); + cnv.addEventListener("mousedown", mouseDown, false); + cnv.addEventListener("mouseup", mouseUp, false); + cnv.addEventListener("mousemove", mouSexy, false); + cnv.addEventListener("wheel", scrollPage, false); +}; +function submitPdf(eve) { + eve.preventDefault(); + var formdata = new FormData(eve.target); + console.log(doc.paramRects); + formdata.append("rects", JSON.stringify(doc.paramRects)); + formdata.append("pagescales", JSON.stringify(doc.pagescales)); + formdata.append("fname", doc.fname); + console.log(formdata); + submitForm(formdata); +} +async function submitForm(formData) { + try { + const response = await fetch("http://127.0.0.1:8000/submit", { + method: "POST", + body: formData, + }); + //let responseJSON=await response.json(); + if (response.ok) { + console.log("Submit OK"); + console.log(response); + } else { + console.log("Submit failed"); + } + } catch (error) { + console.error("Error" + error); + } +} +function uploadPdf(eve) { + eve.preventDefault(); + const fileupload = document.querySelector("#filepicker"); + const file = fileupload.files[0]; + if (!file) { + alert("Please Choose a file"); + return; + } + const formData = new FormData(); + formData.append("file", file); + uploadFile(formData); +} +async function uploadFile(formData) { + try { + const response = await fetch("http://127.0.0.1:8000/uploadfile", { + method: "POST", + body: formData, + }); + let responseJSON = await response.json(); + + if (response.ok) { + console.log("upload OK " + responseJSON["filename"]); + console.log(response); + delete doc.pdf; + delete doc; + doc = new PDFDocument(responseJSON.path); + } else { + console.log("upload failed"); + } + } catch (error) { + console.error("Error: " + error); + } +} + +function initUpload() { + document.querySelector("#uploadform").addEventListener("submit", uploadPdf); + document.querySelector("#submitform").addEventListener("submit", submitPdf); +} +function initListeners() { + document.querySelector("#prev").addEventListener("click", function() { + doc.pdf.PrevPage(); + }); + document.querySelector("#next").addEventListener("click", function() { + doc.pdf.NextPage(); + }); + document.querySelector("#clr").addEventListener("click", function() { + doc.clearCnv(); + }); + document.querySelector("#ca").addEventListener("click", function() { + doc.clearAll(); + }); +} +const startPdf = () => { + doc = new PDFDocument("./VO_Mathematik_3.pdf"); + //pdf = new PDFView("./VO_Mathematik_3.pdf"); + initDraw(); + initUpload(); + initListeners(); +}; + +window.addEventListener("load", startPdf); diff --git a/app/__pycache__/main.cpython-312.pyc b/app/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38159ef517e4a7c85a181ff72045137b64ccbd70 GIT binary patch literal 1575 zcmZ`(TWB0r7(SPooteEwa$_r1w-=~W$xg)0lh1;fE&ML~UAn+I$0!T-!9iJ}MQKmYm9_y7A} zzO&z^QgOsr${qiPAoP=e2t_R1ce|i0A|2_tf-GFXnCqlMELxzJP!KG!Ao@01iCI!X z!iXS)u7~ag*^npu!oz`07XT&c;zn#82WDN`kk@ITV+39U2jHQqD|_g;fsF*j5Taiy zlS6ubq}86^_%EuMDHm+J>J>dhS1FS&7G3Yc>v<+z zG%E&+zgeqPi#pch+RA!)9EYLJ|^22pg=F-l(5nPIWu0*r!Pw2ViRR^}cW z6Zl>Vo8i|hfSiMG_c(~l2=g&uZx7K#Q4uB{MPJf7R>=sH{cvW3r$j4;tzst)?k;!B zK02vQR4qfRn-#t2lqR&gF{YIb@9LBd9#i95u~yTpqG{)9Gb~YZ3@H3659sg_a-UCwHB8&7xQA8~ac%bUP*KG2??KakNi+Ey$*GZE!;Gom>Fv=O!qD?v} zMTq^qiKG7d^oC3#AB;RX!c8V3ZGYDVFBP41vLQxs^w@^9Pw^(vQzO9<#pC zo(o=d&~)B1=Ls&JWdLPkwWmZ{GZ@#^Hx-)QUbGof`(D`l*5pg~dGP__J4ZeKyKi!y HhD`nj&(>dr literal 0 HcmV?d00001 diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e9e9fdc81888abc45a7b5839abc4d9bc3467e95 GIT binary patch literal 2430 zcmZ`)&2JM&6rb4-@2I@vZ}yR(~w zq(TZ%iL@7tTG~Y6kgA6U^}?~o!e0;zP@`25RIOBTGjgS>RS$h{Z6^@niSp*{Z{B4y&D&ZnaDV%RclZ5jYXiKk0Ul_8w>Q8$8sK{x;K4WJ1I=pZYY}%$bw&2R zz~n}#t(-QDyp^)FOoX?E3%Y69!dX3S+2W*1Hm}cQQY<|ko7W~|Sb%MGV?Vzz2WQjcYcHHGx&aNq&p59HN_a76zz3y+Oi{2Py5z>TuvDX5UK*R~? z2zXNsC`m@Q1A^1qs`qysCUu%8WRBk9M?^0%D9FP!?_QJO+M7=cN+~PKb=lb>UG@o!i+}Vcb{$QaM$G$#6BwTYM?tk|M+z*>N3Z9pPiwJEUOY@v{{rX!LqKy5SZEtD7X1xSPVmm2u}OhQaW!~8i0-p%{t`{!D2zQ(OT=3YUQgfa{vy|3G*``PRj&>-^Opp zzZ(9<-@SBxD-{00_nog4I<{=xy87kSpXQc6_*L;O8!J~z{sS9<$4c~m&z7v*lD?3N z(qlRJH&5KLKLqJ!{91f@`mSfgCR$4JrG;Zi2Q>+hk<`6y3e#p51S<57v-2aJDJn17!1!` z3ev^$S;(l9JKofCwrE-l1&v|5*dh+KX}b%lDa}l$V2sn-Z2{-_)8w>!6qste?@aF) z9Se^Qj!g~LG@!+(%56_F55>+vv28B@2~4tBV7g&NWQKjhB1rm?97J*m2|C2Evl-rI zqE##pu4;+=Q!wY%;4D3Fu%jTc7e%{)V0r%PAfkJ@ub5mvx}iN5PHlNxi)WWlYzm#V z;cjcEBauC}3lg9kQw-*kFr0dZ)5TmsY#AR;OV8C3BxT|KOciv7?l1)jCWYb1Fnmtz zwwgq=`Ycvk7aNcDAqk_5P{_kOD^4z0n&~`53@d8$rp25n?vV<7lWLgqP%fXDozYIP zBo=ObESO)6#__wCtSO8R+j7H(MPni z%(>_(y8dp3;EqyVRjAxr7wdmSLDNIKwv^W5(N$s1ReZ0cbeDO6p1a$M@2>{dI*P+3 zcc?4^1nzj-i|T54ZGUmRN$PHX+zdTDn&H aR;{(Um4l_`{goB~F@lbl=q($9#QqP@76SkP literal 0 HcmV?d00001 diff --git a/app/files/UE 9 (1).pdf b/app/files/UE 9 (1).pdf new file mode 100644 index 0000000000000000000000000000000000000000..2bfc86078d207ced65eab239e01d9fb06507eac6 GIT binary patch literal 924018 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%0Da^GDIt3? zHz{U=X>R#gvH2*U$8yL_-b;n;5~i<&7&f1BWDMW=V1Oa6t2s;Z1jLzIR_5!Je`w4w z;K(uDWwC5NM+fJXY5{}TS^ZM-a=V&_@cws3CEQecyvkH z&HV||moDHZ>1`h;Cc4e0f=ia^r6w{X3HBl;>P5E}q!07|RK16RX;7Q6yw+B#?i_-1 zx|-ZR5?F@~-8@qGmZd-X`y0!w1T5cRqv7yeMJF*_lbR{j6SlSrcg>kv1?Lwv4o!C& zVB{@sEMe@)sT8y;T5oX}j=tPY%HxUT38SiwaN=mfrHx3%K`7WqL>6|M^7vK!D8>Y} z-awEd7lZ)4V{7u9f6?n%2>KUdeYN{#BSH&LmhqtS zmM0ydpawVGx<+%mBt8^M&PA_6Gl4*ac;P-2o#)*Q^`jABYmVgZjT!OlN0<@i<{h!k zgxpa*PsLNP-A}+xcacEXl8F4Y806s6P3;Iv0G;da2_`u~laf$w7VoRwDn zuhb=4<*q#8_B84cD#vp|7L{->!e>@5R4c+19k>I%7&&Al_{1OxPhTUGX*d6FOIR|F zBS2j}6`Z%^$u&0Zuysa{On?LfVzIHT*V=s{?T+pM1UpI@SbO=rW8 z+z1f${fF#>aclub9j`<~is^WG_kqe_?QpL`*zSSSv5~}^2fft>P&@Hbd+{Ozv6EM42OQY-=RXfOw^z#QR z^$knZp%^H42sbWTRrjai1qR;e??u^J?rsFnlI%3G0s1OCX<7s9SSy3kYlXY&W9MjS zz?Hs>i;_KpvzhN$djBjioV6}IIu!Z+!Z>K{j!?z7X50C93T*gGRkkrTE<@VXZM#Le z-f`Fxq9xl`;#{8r_%5Y$tL%!sQN-4A__v;Rd@ccM18d~CrHFLa$iO+Zmvf$OF}(X^ z)?vj~W8ue(GaBl}y$v~3L6-=@>vV*1g>z#*L-f={@A;<3cZ2q(NY4N?+f2a7G7&B+{s%pCmoCZ4)mJUOrKRVp@aq=@p%zy4# zn_V@Yksr@6p>zF=xO|d~ldQpxUP-=R1Mw*~!jr0;DQdbK%kE6;C5GR&;in`BOn02? z;}-o3QHPdZFirnVgljVYuLXyex8sQp-fuO5?X~ODI%V)`YG~@ui)+s5x849dGyeKi z2hN^`S83>Sx_R=?rHcR3CX{&G`r`*7dx|$pWKdT{m&o&fE`9=6>60=mJ3gAnD@Ta; znUj6#-o-&a-*+Nfn^?kkOLM{JVrUob11>oVaX{R@3g3TnCh8FT3{AX><{tAY20B!Z ze|k~3+HORo%mp?e2ircz*Yd<7=_f+9c;5_b$JDfL#&-gSISB$X-K?+q6A|@ZIq`QO8Lw2_qOIrb+(~6&1SWyPhb$XbuwRu}5q@0rbD`#;{d|Z$9Ws=&^ZFbCig_B6yQ)Ge%fwNwAV557vcg(BLnx zm%LK^-6xBO?r^J@S#1ucN7_lzzlyFUHnkC}Iv##_qWj1arVl&?NlcqNO*w;ja^*&i zoJfU@(W`*ElEHDWf#6agKU=s<+9`i!;vH6;6EbV>Ft4~qc}N41O)&_!x(7X5#+39^ zMjfcoEau?B`<+X>DdNY4}uky+1E?f-Fxcz72LJj1uq4J$YRQe4sS)vQWm9}?w-SfI z{-DspB=^%cx>*1~<_6o}BOL#n8B1>r;Sm%8i^wFf@sri#RfXIM^n6qtdRC1SlJz`C zkGT0TFUJr09Y^5%03Cqu(dZ+$8w_B`i2aiIXtPe+v7h8^X45KTxVNbMkJ-tm?qR0d zn_Y;s(Mbur+gCqgqu_2q&(XuTB&x8>wB8n-t%80#$y4d9SU}}ASA9i~+j?M^+qhR4 z3#cyx`wY^3`o|*u`OQFZZqkHdz#e4`It8brfmq9uTih0_?>{2N z3mL*tD7i7gi#WKpghTaUOK6 zjJDxdxa)j`*)s;gMYOX+I<7{CH29yGf^#$8kWyItMTxk7D7@`VGT>E4A zxm5@*xxSjF@;>~`$u>|6B4JSVF|bsA-GSc3y77$gA+IW8i-yjHmv10ynUu2zmoH{E z-bn{}H^Gp>h6H<@`~?cf&N}b*0eZsL^+I*O9?8RWLJd(XEeY*Mja^d{rcrjSo+Dn* zi6>Xkb9zp}tn5^nC;Be%*Gobm`sH#`2WRsX$e4jB3_dF9_a3teD# z-xXX_iO)twCCEYc;6{(@S^_eB;$Gst&Bn9aa+-j?f~c$CC9LF16PCA@&;Sg;&io{) zPwB(B@O-Lx_q~OY9P;A4SaqU}e)}WVBT;Dlz-8u=Hw2zD$>)n1jO3#h3j>naGN;2F z@lWc#jFp?^zqe`4_)EKSB(1)PZK~WS_)`15SOm;!7k%qpZ> zhy<=SH;->lYrF7eMSE)E4Ss^_L9j*dc7OaPjO*#j9=Hsklsw)fA1h3waU&B@66L}q z__>u8=IeP!6&V;}AC8SBmQ)yG6BwLn!46m}(b^C+%qo>nUkB$ZuhMewR4Fu;_l>?- z4|yG&Cip8qQD~;iJ+8MoT*-RU%i2!4K%G;1Fyg#!>Nopwb@0~88z>+Xf>yw4S%I^O zk;sGy=d%ppMuPyG?{+{%7_xT$k!p^^;UK}j+h$ZW0muCnP zF#t(#F+$gvIg?<8B7DibX7v1L-oh_}+=y%P{6kJ?zN=J2-ZGlOyD(~ea8H3>U(d0k z<}Z7w*&gdrOu^6m1-CJIC&f9Jnl(CKV#ENy zeH0iQc26m1AI0>L@L0}g9hR&_HeR1FCP6#?`&XvRP$-2Uz#GWwiY;ZqY}kW&fD&_- zY+DBQN>C2C94GkVE1~fjX6Ngfgbe;I5j7iW_RrxENqceLZ>Jm*?ERv+^E&b&8xmkd z5A=8OZ6g9FS?Zz9@2D>v5yS2;4A=tl&O)(D#WVhSEX6ets|qr)V;7Ha4@7DL*skjN z3=D4>7@A!$Fh~1X#lJ#=BlbA4cqPF zXI*91kl`o3e7D=P{Wzd?%7$DRPhg2{-QdGPz6~Hwo^SBRqgJaT4`woxAjISx$WP}x zes=-!pjvz3m*V9EJn#ptTd=1SUb=T3TR2XtB=z@7IieY#6GTNq15<75xYT&)N34W{ zm}{-WMSqV>q9z?8E=zYhb4)IvQffkY(o8GI3|4F>@^{@WvB@R^4gmGIgd}M45rUYg z?C{ZqS@>sbE(C^;F-GjY~8@$^LK$q{Tk^s@S?el7<^m1V)5 zH)7dEQKYy*jv1h0yk1gjMtR3>a``j#TNa9Rc`syhXBA(CYDxo21pBaL8_$0q>9mXN zI5L{e2F7)s_zm?&3Jn%6YJ9ypcm7{$&h*kuUX3V40yin{%6c%EDI z*98jv2=|%@u?^IqL&O2NrtXe8_LFWnTl}xWD$xuYtR>}w&Pgh&t^)hK@&;(f6N^sKr+UE;MLRe{ROSS3wLP$(%GX|GuQd!wW5^HExW=FaW#Gq@>ItOF{< zel8WSC?J){`u=On8XB?coa$cN5l1I<|Hq&pgzpPa^U7GS)joeHS#Dq9*(3qIfLez({LX%P2WO@H;mYNDJU9P0XnB+n+T5D^F>N;$yT2f*wOAa$p84 z?87Fw^dsIWFWYOYyoJ9l%~fhA4#I`rKGqW%_3dOPCi>18AsR2x&AOtVvx*XM;G|!W z_y6lXSNaW=&^lb2XgMb9BAmq8;@rGO&VdBymAs0V|dc-#RSw25vi5^bNHY*E^g=gGZ^W(q^IL%PkgRObi!sp?f6%L_~mR zn*7=2V8Jv)``;l~TyhU|rB*yup7SX&L!}yu2LI8OS(GX=Zbr40;vH`s0S4p?rwX3t zgiuP6*npklXd`n0LFe$fp9H3TJ38g0RY(H>cx5sx%f|gAqdP}mDszq0 zv>u#VSwd<&`2x0J*`9~2hWlvYE*6d)C*ELoBddU&;mZcDX|-Bex=~{#rBWP(EH*(t z(1~4J{%jqELxOvfhIBmwPf|S*0jf<(E>y?Liv*em3k^1apNtj(g;8^~&3eH;Nz|u4 zX}rybf&bA^uLgLLz*|y?w+-@!(Z%z8@O}w0EYC_Zo|avs1BI_X$Z*rvgc>t2xs?gZsqzX!6)>6aU_IQho6(Zxg4!edD$tv~aQ z+XqkKlfI!>=VZ0>r-&x!23*2ybTTC$)~~{9NAFd!V$QBT`EnfR9TtM{%(}*|{}`h{ zN1or)w3IlHtm1JQ3hdf3j_SP^uZ2~=$^D5(kR?_QalQXr=ySP zX|;b8mzQ$%+t{_8`PtMmoQc*Le=e)Z6$j~P&P@0lU`aB>+hlndB`5g?a!*sJDJER4 z8VmbEI9bXtNpp?AluJ2aKNYWG+RV!j5}3zC_KMs})<7w#6K3dR)|=cL8WAE9|9 z1;aL^1x%@eYO8`Zcq95l6cd*7#ImB?WrZL_r;Sz;`@PGCLg!U6=L$EWIb#bo0zpWO zb>4VVA9wOOUOUAcrrI)V#1r{kxq0EEJomg6?_y{vV(IwU_$N&&O1THM2a4r^*^=Y-RCOcz< zX|Q`IeS@6QEh9i19#2(d&I++{4OFsc|_1{13yV z-_Tcbi}2sXfD*d}O|k?adF^N_;*)uHEOkZEUWQ@wn1iSNL2o7EYic&)3hQ!U>1<~r zD*;WFmwkdu?Dx?+S0>iLhp5E|c@!#1e`HpFB6G-4H zm>j5Zn~4tCdE8h>Tjqs0usH&pr^m>ev-|gCrZnGp?6~V26C1I%_rnXvI3#vDPqZPU zXk2$V|5Ba_*5yEeA^oTsKg^NGq|c({hibW?x?H3qI8-XM(2FVS)En7YIs+Z#mI%ER ztz4L#5q~U4g7UXF0ucsjX4>O{xsHH|nT5kXnvL7Y&c=zfcBs$EJVJr-Z6Pqv9I0Ni zWYQ$Ziv9)Aj*=2U*gwoSs3l>$g~v`*JY+sj@JE6vK4V1-v8=g(jGb+vG98me8xinPNSlkEN>k5!F zxJl5g?812;NTu1U+8cbx<76j@^@$cR8H)$UAFx;I$~ck9_(mZLCL3BEf*LLe^j?_Z zROs0_N_&bWW{l6YXL zlEJ7($b&AKDla1t@ROc;d$j17{`vOpI_4Cy%dXUzO5x4=m;Z!7)m&G$KTRV#SNoy8 zmC1uaga7%agQ(G0oYajnsh@f)z{}x|dujiZUS412faj+(;e@K0_|*|o)dZcPw{ z4vXrrvKRV0#jo(>2N1GhHw8`M&Z&Jl(YCT`w)+xJkEwv6VIO*rk+1g8*Kd*H2$E2< zT|tBw(QM29BaRKPx0#(WXu&a)9#-#F* zp#{pdcw~O}tK4hi&E;41jD1VAh*&u!Xu>`OO3Xu?;^dKYVT0Z-5_r)B_054Pxxm_^ zpPJ25F(pF>lR`T`BAuFmTwj*;*sV2Gln_sX{l~aM{1ODX6Mma$Z9m*6Dxd45vr_Me zLZk`FLm^6HKTGOWCxP9Zs!F0J_uoS{={8IDA-d{MVP&OJftg4slIP2FWCK zRu1S=&f$tkbH!zCG!)Kxcz3~Y^C~Y34j^VikF!5r^_8<-bUCs^5xqC!N6N2)z%D@Z zsLWvVrW>RxRMVLGUrgPgmO)Dpimy4jSyI78lSxHty??L#UlxTF%qemq8kw*7|3>EwuH?le<45cK;ytujZ zO8p6VED`U+uT$8Z(kNO7mtvY|(Qb(+*nv`~#>pZqL~CUY#C{pocU8;)ZxuKVu+plf z!XhxO@1of5v+3fLydH<-EiWKEWaXT%IA>2)8f1w!@#`60uR4)?tjTMX^-;smWKu_c zw%%XZ3hwF>$$5i)*h^Yp6 zK^MszZ5B;6jr|7z8g;q(E_DG=Z)R#{Y=pwYzIor~AxmMl3wPP3-5+~9Jzns?FrmDI zrHNN?vp;Yr-09mY@pXcJ3NhR${IR@NL{_X+K=+~_;Pv`g? zfKO6i_Gz-0(!Xb3{7~@-OYBD$jrzqR7drrQkw{?+zLsW7Tj)*IgS^Zo;HeN%DZA^f zJgUUkGQ+#$oEaRc@Y1n{85)s2Y1U^Z{Cb_XANagc6{)m~CdiU)`lh>x89DoX`YpIf?4GIXK(9f-p6JZz zoL`-Jx|oB;o!F)sNCd02hhNoJu3?&TFvpCYZoNjpev&`ezddv)$ir23E zyAvTGwf`pkWo6(Wcn-s9PIPaw{U=yc{FtfFo$jf?1_68~h(;tQKhqTRqeYnOgE2sK zMx`a`zsS+~@a3PCAhu1^8O@6IJGxz$*WNvFi#{*A-cJ{zTM#FbkH?x86iwEbXtgRQ{QKNz+ z+sW~tySohg!%=$~s1s_5Q0mD}$@bbGaT{jX64QRIKt{k_Zk9zyS6r9!bLfcoSmfmh zXd28%u!M|{h_U+hI;`a6b~FF5r60$_D&Hb2T71py*a*k9k`;5pfk=GdmCRf{oiriz zS7?C#PyyNWj&s%@)YS_?WHSn4i1AU5e39!p440tQeA>j{3eTWHOZP(Vd=hChyn`R` z%v4(e7BVX`VP*`-Q`xpXg4r6;3Ccg50Ag!{eDoXjWZqe`O|xS&5Rapfx#!j7eMXh? zw5~pH9_?h^OZ`8Nkg84XMwk)s=F*;}w)|;By4B9th^ebnGGx|B6GtQaqq%fFE?@aL~k$~R=?I43zX8!^7teB*$2$9(%f+_Y)Lhv>I-z6JagdGCR z!GQSuw>;&4DV_!dU$RpnKb@40tmfu?0x!pO(qbG)V5O(lA8@nZzct1M(6OZA&KLrv zy}NOIqAi_BzFNoY1Ex=IvPwv`L3v7Acb?#A!BpR?y_yN9Bkd>O_;O?doTR|I*+R3n zjJS;v#k=IZomY8NAYVNb2k z9?hzhQgeyf#)z(^PFB^5nbJ!xN}>eF73P(hY~-sl|GBvVz4(67J)6eIAO})<$%Gx5 z4bD=hrNBz$b9+*kIr8#=FCnf~)_!0a1qKdqK&=R*63w6qODO5ngidr?#3}jRY%DE| zqPlUsSkqF4d=u#TVi$kv@2FR4DAe3x-z&yI(gRgz&!8cZyJc1@LGz~qbb?M^sgH_5 zx6da$mFXS|+SBpYRmA?qg!pA$D;d|8-obf>JN^c>MmS4kc*&F(Ep3W7mIFg_&N}n4 z^oJa9kO==OHOqAI#iR>|bt9@a69u#(;`ojn4qzr%&Qso6ws5ww$3kbqX z?oI%i{CGmBD>dM533rxTs9aM_t>XoAltsWP!_4lQXENeg5kSg)b^V5saV))~hKZZ< z7!1zEJ|=uX8j7%y)rQU0Op#yk#{u9Ls^BL{v$fdqsIvmW0QC1sc*NOX5U)t16(Jyh zQn^hrD;o|*O_SSKylbO@8@q2t1H%9)uIfWnmw1FSo^7Ck$2{}pZPEFs@~Sv zC9!GzXaO`EEk|tOO}M8j91xj;Mo6|LliueKeT`^&U6$pEJYH=|(CS1|uqk3_Om(VjN(Y4KEDGw9LM@ftf)|FpRzA7ISta!bfcqhv z1IlvI{}v?SSmk-8ZX}M$fmlS90_dyxMwpUaUtpeiH5P&F_gK&A3!A~{fPWSmq?KU% zCY2Q6F=L5|Bgfh(r6$h3Ro3q>*!NQ)peLf;`VUTP0()}X9Qn0t0L6s4j%)dMUV5io zzt#D4;eWt>M&dz9lPS1C^#nqoMqJ_TwQvq34h44FLm^uWhP#5Zgyq7{9WRPTD#roB zw?^l7jjqopb9D9cfC)}7DR6fSDPc)vh-t(<95^Gc5~ItGki2?zi7dFSYM_!tIyt}h z+%!A@0)the%8)a0VMn^p1T@nOU4yVpLx+ zm%eLf@XX0!fZ+bZym;9B1`FFpmk)h=JcC(uUz+m~qC76AuK8o42=PfGlknbhInB44 z(RP@R_eD9t1w$s5FRhR80P{Ouos^is?$=uB4YP1;0!pA_X6cG^Z%lA~4Z#w`fTdS_ z2lLk^N|L%aBK${T%ZUkE;q9cMRSI~7V<8PX0Fx&S+%_alRr6e^^B+qs0sAppmfivhuDc&I~vMtXD z$y6KBM(lxDb|3FtS+)p><*G`TtWOjkuTxP23Ds0`s2+F3gYr6pKq$(N@CFH$k%pQ< zxyT?OYZTWIWK#Zb6c8WIB*S5xIM}t+Y1CI}qB?_6{tiZ53-L3MR*GhrO($oy;*Dop zQrb=|Q_Wq9XY4*Mle1<7L$*l^TLN&BzzC(mEb=7IHb89W;J$!qt5`@mOMLCeAsKPL zYzrghYr+DQ^=J3(!9BAv&f=0si(^26pQ#!*{`hJ%m(#`QQ2AwEf-Ntx^=a1qQ1LGR z@3^EvuIh9yPY3$^xhW^qtS__d|8jA|&J!v{^KF1ae{{2h%R=F}H~(!xVm) z+^U2?^<%dE6HiPR#xbjh%1gG`welfi%t_}njPBK5w#kdgq6$_0fnfdsi<_)C!`mn6 zch!V}3}0j^57hH-qpj!bOD#b_SSx~tTQ89{TY~fceH`s{tiF@FR!J$*-N_xq_}b<$)Vw7B1Nu92NEzC#;E2DDoq@915p1(&NvV z%Ad=MCr!^`lDAu9@nS26Yq=FR?#hf@boQC9ZtZ>+yEjiiQ*ul9dZ~1P7p!b9f}&bG z=JWbzYF!(4!pDDE;M||?TURBN-<7%Fa=SF;Ql6Vm+yTXxr10x@MPBflNew@ZOt19w zED9~HCz!5^B`)=AWoP66uF4r_#XzqcSk&*0c!Gv{Wx>}9DZ$8$>8N(x21YUS! zjomTO2I1FknGFpQjAV!XK6_Wx2yjsQ;6)F?_`Mq`e=@h<&YL~TBG2{KZAMsO`IG8a zhAhIBYKlg~X^!~E!tHdQWoS*q@bL72$q>bhtG%o3{;O`TU;eyT(8NFR*Au0YI;#r? zm1llehN#|VY>}|mPjRkx5WUPe=!X-eMR_Xd@(8Zy6crcKj=3T8>C<{!nJXHC55Xob zEid0S{4U^dxAqjR$QB>)g~WeSDW?BlZ3)nv9<$lxpU$w*s#nIH!-Ez?Xohv4_H1;k zl8zMj%=OHcFY$Y1-G_0}xhvur9lc;DrxGjdE&vHv^ik7F#uRIrI)3LFCO8Hp$<>#= zMec@~@KkmexJ|3I9N`2|PoXL}+ZX#7y0g=1TKVHgkFgKDKUF{JerbO1lF{(BCGy1L zwdgvN+!K4G5wCSrQS-mgn^lxog#`LaQr0BRZXJmw*P0C-z}Ff!PH~j6m)ve)$_dI%@hFZEH+AYQnKbs|MsBWJ-;RbC=wX%m2!b_#lm||Ea!G}qEyNk| z^d8teiS)SS$>!4X3}3+J!u-wOqA*2OQ27rU9yi~BImo7{Bqj(K-E03kE8@94hTxIVwm?l{a|II-VQ(9FWWOD;n;$ZiCEaf8UnH z1oqOMB(;~%I1i@_KE4DaZ!};}vq-PaaFjLk&rNz(B(Ky>J9AWY-78e;IBw`cpi+_y zx(iXJLRK7U#iw^(8P)P;-h00$rB!|KzWNmjx@tverILL%y=|~F<*3Ltc3|M8xu<*k zR5>Oh3@w!#&e2CK-p<*W_dE4eSfIXfTg5WeMPyx4$>@~Z{E*=8oGdUWCbYYb?O6JO zt+c)=)-m!A2XfgbF6W-rK6UCy$ZVWC*bv zxUT>Gtr8nqh_n)Z0^ygqIYTi>#*PZr>3pI&@<)!5-YMK z@g{u>5`NqfUYN6KNB@gR2Yb%8AhtR2J;fvU*PY2^h^)~kzOsjcmU03PRg<_*@uu6r z=4S&uRaGQ=j*9HWvmHL|srI?;!v2}d8iNB$vH9vVvEbY^q3_LfYrt8Y=iRV~Iy47M zv?fH+U@APK$_38Q#%#Nqw2F?8MG~=O`zrq&anj6@m2VA!B^y*Q08Rf zx1KVSMp-pPk#MyB5SBgPq+Z&^+KA=?^ncROslOS~nO#u9{2N1LaR%VU2>!pHgZaHB z7sZ@QMGsF~;`luoTTT`u(_^JP`PTC)_a00xRf!n~_J@OT)f|IaYORcyWMjv9@oF2B z9-Ymp6TSGT-`gmxekg0v)M5Be^&x>to*h0TOQwF5&9&$OvvLM}yhkH6^s$<$1ki*j zMAUqg+{WE}uAf8Ud&Z)E`?_p!FUPeq8IoR0bsydmE{W42BCB>&*xEFWjQI^}iLwu8 zCexB7^WRfY0k2O%b$~R4eY;mLi4Iqhnd6~7cLVHme01Q=b+?oY0ket6${q4fV6l{{7roLV(D@1fqMVwln&$}RI3bSS4F4`^sgi-FHs+DU~+&h@g z)R)2L%=hZd9xCi-@LKJnR~VCO$*Z$8|CxN3*rHuX54=e4QnI&SU?iMr%6Qa zg(q2MJe(-{YTDI|)G~Xl+()045onb>avi@H@N7j}ji6NfnMi3=Kn@g++^@|JK*mk9 z&3(&w#=H}fZ?^J!woGYtrD``9$VHaHPk}rRkK=LrEc_QquC*ON9USWzsDI8n*IJBq z@qdjc@H5T)VaJ~!_;^ctX3igc`Rdi)mz3@KnG>2ib2%I+fcY4q2IsCb#0yXNNEPp) zIik*KZ0a>jE<|#B(Y>{tXCKQw!Xd^5QT-nZxC>0AeFE&? z$OOFKf5@!prMY=A*K4)$`!aOH=vLxaFu@wfWktrtWZ+`(FVcsr5HQ zzPxj9g&lU9ZsBx^a69Jws>Gk-7Bl-J<^Jy5%CS~z!T(O2eURrmz`BN1s& z{~r(jUyceN&@Yfir*9ZnQ**BU>|+EkeOBX1Qiq*C&>Cqo@oHGs;oYdcc-_kG9`9lMiRnu~H#gqX>ZHQkE=DF}V2Xt|kbod@tAO}g-Y z^GW8DXc7{^Z?cgak0xo}z)&f;Xfi@#-%Jx2ei_`WV#@?p~&2`I)LtuT{Lyo)#W6$5~lJinWU8 z8-5}gcNNJRI6FFy{E(0PrOY`(MG+6CncxTEcE}YF{l)vtC=s*ecg_8-fDHXhVy??7 zMtSrgKE@q;ZPaF@l(B^ixf}%u`&FW2mX)#8vmDJE;M>IBna)*ZR8_;*59#VJ7o1Mg zs`?y$)fS924YQsrd{znMfHBY^+20UR*E-;*d0tdGB5^o1G&@B2k|Qo?`M zWG?6D!R|t|7RIN`VRwsf|DQ1bzgu1k>0j>lC${6KoIkocMV<*YZ6#Cg7sq-NjFyy9 zV;pNnDg=D}4a{}53d74X#ktma@Zh|RMQ1Gz^pD#?R>1P+e9DMMi7nqa`|&x?NN?2g zEFzIhsVPNa1ModVc|NPl!#VABr4o=68mivU`kckZX8q)?h!)onIUW8SN5h~C#D8H4 ze$v)ZqHw{CZ9D>I??=d|)`N@xtjl;~JUeIanG-1`Htuov{M$9@-hYEeZdIm|wl_p5 zUBKop{!b7kBh2AA2iP#;5ooynHWbI{XJAY<+b1jV=*^`3ZyRD%C(Kyku6X!!?=Bm` zv0n18!d-!OHV9ga;sZA=Y{4UKHDzR?TW+$C(das<^b!w;M5{KNnHg~YztSm)xo+aov)LOigBotY@wHM$>raV{lB_VCt zN2OO^z{U>i{b!sjn>2as{ zgI6*0%7~f$j&6cBz-~(7%&hGHU+U*Kt4R7a(KJ_&>5c=@T5G79UCWv+N~rD6X6R4# z;Ks{Bk4Qzt4uYc&Cre55k5m z(M8-!jciNKcE-MBkqJAdA>?DadiTOHDg-9ZMaP(K2WX+}MKMLNYaB|}r|llxrbG!iYzCTKfZ6!w6I2o@Uyxaao14_!u zETJiDii_BIQvAq;V+6L=%NP)tml`K30z4jyl0xUtoajE>v=us*#%kH4f1H3Y@b$MI z3;Nx(sdyk|_uTnWP+|p)iwp$=Q*wk9Ixc_Ou$qG^t^hT+^sL(=YQ5p5k`MFft^bZ; z;<{WE-J<6S1RH4Kppf27Y(&p)r1%J!DAb+d_pBDB~ptSG6;$n8irf*~m+dwD&#IrBuIS5?f)wf?O}F?F}hOn=V8eQCsxN z943i+@dy+DrG-hpt8tnVWg-?4X3`|PK zqh63}ggSri6rTddXr}1?QODBxeXH~u#gp<&gKCi=T4hhR^g2eOcY98*?f(;Q$&I|w zJV~4&&N8-B{3O~!q>sVg9MuY0V5y$fJyC#=u?_|}93%!jsqG;Wk1i1Peb+48NlUokv36Gx#@4g zi&xwgrc0Qm`zX-V68vO12eO~wJal6m!d&lh_eecU26r*6Ry;jv%I%j=z z&MkMf(S=UIYTQriLZ9q~TBbA3LFyHAZ^rv+DS~pJ5_~9MyCAWJH;&B_y!#{hD|-uZ zi0E513ZDEc`k^}!T)fkS?G$mm#~9mpR;p6HUEB?-!!zQNKR{gM6-v?XxVrFb)aB>& zL;iuM%_#!|img5$!u4&K_Tk^wO0#}bV#Aft<0jX=p!~7dM-z3YxBglgzEQ-jI)^0R zGxRL^$0IqCVEN0-XihyVvfOfEcV)5-Dnp9Dg zxjtLU5O)9%JYSVO_D>GguwL>HFmbD7u3M-2mKC-~pW-&vx*iQE0dgY9Gr@YV`6q{0 z4{Cb)T$0kD7#qEid z(dQOTYFX)gC2VNlA00a?S4tb2sp!yD`nKG3p@a!_=SO+WpzXOBsgS+Xa0-TWu~px^7@47`Jv34*kL` znZj+6b=SfCLWVv9I-Gc6!Ig|}&Dw^~=#PO5spVC_Dcb8aU{ip~*_$PRxYD`&(xM^v zCGT`15bq1)YzEP|%5`D2-E8C}dep2L+c3wels;FrIIbkPCmlIeJdvm+?yW<91e_a9 zcC}91?}nGW;UF)T7`3NGiA_RdiJSXPm!~KvBd0Cs89Z3&r3&f&I>FN+eruzdKqN^m zRY)N0R@u&Z(SNWITv@llx8b<@Q?HUJy1Q*nl!}Hkg{JsWe~~{rU>v>!DjDNMJH6D` z;h7`h8TqGSRcJId!7b3xDk5WJhN2$Xs=-2wPU4=&st?L%f>3~YJrVgH--unvJ;*4; zk>mHm%JM-majrO5WM|VbNYe1fB0cJ>I963P&7gMcmeH5Gn72r%1Y8)QIL&BLpBP5| zrj3so{eoGavD)HegO&-TYxf5<(Vu#9H`MH_u&t&}zoM`r$u)y^a?~U89&*U41UKrQ z3D0;J-bDD95n(h0(xK{yK`Op z`dm&qJ0nv-%RE~omy0P;Og3s8hl$QQaykJn-;n~>k8GBmYr=akJ!?joIQmT5R0hwN z51-%esJ(a9Ev0>`q)00oK(=ILm6n4T7FHV8o9q%FxwX+9ldA_k^@F%ps2}n&$vt0Y zTd8_LJcv?A;n^(979Wp|v# z<}0)_>~=zW7W3EN`>CW*`v$miry6QL#pDIXn-fV&ILFt^{59%rnda7H!-jywSi?Q=!QenJ zsuQIdno+XdFu5A)2kJo8s;=*N>M8U2URs}xD}wEte0-|&K3WR;Ac!0pbP_vS7Z$Gg zN5K0}BVS)OlkWM*+ExhvB;GQjQMzZIHxp4!y{6`^ax@T(WDm~hUh)B1b+c(|t2ph6 zd(C|G&EM&P4tQ`Q2;sE5<9z4Dl{=|HYcUEUYyA8gsSvyoyf5Q#rBcQE6RRs|K)TuT zN1f4ZUw?hwtSzdGOHrqgL2b}M@)Zdt7=fQOViCNZyP5QLiH-G^7n~_?6vb)gsa}T0 zC;f0e>utG{)>d7T%$pBGKjPC|GY`n9NCE^5-FfhlFM6R*gFwDb@X(@QBz?#2&A4*) zm2zFS$e$6QMp=Em488U5D^o&IJ}a> zG_T3_Cg$EbXpl*`S2Z$KCN{cOLbFy+M?CJX-&xS}YqgIq;0WWXo{5;Afdph<<^!a{ zSJNc)*Z^4(ZV5|Ke$J_>itgcf_ii2f+GzbA|Ij)HWMQmrIl(E5`n5Yg3F7v!G_>3# zBc^?cmE>NGGXj+ovaY`r>YGQFMo5h)?vJQ%KI%3ys0;7sbKTxKC2bEY_G=yf=Bo|i z!e(VC^;(VJkwVG$b;{(Q)8`1?_y-2O&XYSbRim+<%8#51I+jhpJC_eO>zSjj+uZTF zFG#zM+)8(@$%it@;c(pO{+81T&j&ksu*B(z$<^ zSlVdG^B8Gy;aq;D5=HUh`=yJ&mx{+^om+6dWvz`cvZxv#(`8*r?f%ueb9bvk|92Qx zO=9s8Z4F~LF8Q8q+Wj8=V?L+!HqUX{YBY5R8tlig%_r+Jp3-+Kxy`-l-^1W>8V{&4hBpzrl zuF#V`V)a;>vG~u2Upl6T1M%8;lff=$(xfQlmUGvjXWd>Yt=X{Ip|PZ0NfyC`DN;G& zOUGyX*m7#|lZwpFo24rPw-v5p-M~USD9U)kZ6_U8tak2Lqn#s3w-+s#Gp1B z$$`LaWuSZp24`Yb-21Kx5INdm6OvOQxt)D6Cv>DM^SV6Zqbf$N>E#{)SzZcX_S3Pd z5Nob^h1Wi4bn4Wo!S6H+pVLe6oizUPI92YI#1q+ySow8wR3g^T$W&oWu&eWjV0HNGZRn+SkpDAwZ;W%zh15Y85xp?6mw#F^Sje{H zZ25sA@qAzb^QV%uo$;lfIz=qHvdcTNup=v*lw+f;w|Ob6LGuP1+>!O{6bzGFCdL{wk~=In#6(ks@B-}J){IzhEs zP*s$4f!k&C7U--onyw~pxUa#muHwXUPJJzZ*+PY<{n zh@Vk6ay^xG#6+}p_8{ZH1iHYs!eVsBp`dPmD}-nZfuUy)&&_zcqPlH$uN}pd=GempJX?; z9tANlOjV~^j2Q57qp917GM|N%C|1sjJjjKq2w)rgPYTQsQYjhZJl@?%uyaMBQ_0y& zOv<7JjA^4vj5r&NxZiCQm{Pjtx{Iro#yTT{AR&KBHoI1iIU?nC3^Wo)VlVGsd7csd zy>CAX87zV$)GL=0c9`BLaxp zV`D;EgZ)|koWXO@Y`^<6KcyfetXlu28iekc`c(6DQtwg_GNcxklKmmU^$E{L3`i}8 z5*qbEt#Cd~$WY5B0Ua_4ijyUB8fR|@WE>d^DcYCd6D%VOvR}+BY8}X^%~5iFhXOKl z^ljc5YKVWTtL;sISY$7;m1pUJk1 z(xHCN26l4t7-Pb~DM#J+!+YYYijq?l%fpliroO5CeQRx_0M_67)A)~Z+tk*X=^zox zR0@&j?9|A^sg)U2@i|yOqlQ9pa62AYk16sYULF0}*AJNc{2pXmF#Gj`iM}j53 z{a;lFFz0sGOI+j%&|lo3Ogy{Khyt(hC0#HW4tdxSB6HSP4fL2vz9s<)`IX&vLqO(c z5mBNv6AYg-@uVv~l(UH!e*h7(m}p@=l*LoL_&hI}(Z1F;uIHT)a=yWoJMN4u*hM>B z7ZhIzbl40h>E3oQZ zYX>0>v#HA6DgT6+1BNk6*32ie{LR+stl>g4JPY00&eNczLwqp#)Bc1^uhW5c9f&{C z&NJaUzZPMIftv;LhmdO^KbKtSo<&+D)RJbXK$wN*yy~)o5m!>@Q-wc!hC8w(!A*Cp zfnO#(_|ZV$W>2+LUFu8EXxLqTKZIVO0E7+#UA*Ik{D6Q-~N zYu0A`^qP{zvWad(^ukeoNK}Cy8$(lCTA#_YiadcD4{iS4 zozm{F5>Qm^djpb7gX_M=|K&X{?Pz{5DaNFv5k~N%!%mXZqtfzsF(PV0sZJvs z2(_@xtQPm%ky^JILY+NGrB+b}2V#p3-h6y}hM^<88T=oEJF@+qSL***a7S?meRoi( z;J<|o77NYGVp z&~*SLDij(iqaZZ8f1_YhkOeSi;GW4OiE5k zP0Py%g~}){DJ`q5t8Zv*YHn%m?&TCUR~eZ z-rfItczjy|z=DBX{qqBEK#}Xh{`~ww;12?S5cq?@9|Zm&@CSiE2>e0d4+4J>_=CV7 z1pXlK2Z28b{6XLk0)G(rgTNmI{vhxNfj^zG5#Gx@_}2*u{s{DdQ8R=mJ8aF~S0B4^p8 zxctqJ`ima*A7e)a{4dd?{+S*1_v9!<2ry9NL7@JPAms=Dp%$94S_t#oMr?)}Rgpz& z;16+p)=+vLzAoNmbz2;CPCgNyEvU8q_?P3P{7L;%*+J%q%v#h zN5g4jZ&pLkDmEA%yc&zEbcwWmixFkppBqFsV7wTs#}Q{ZkCPp44Ipx*+1%`^+(k%m*6=i^Q@N)&zxbPW$hnT|!H+D8}pL8KlL z_y}+)fbFD=flwT@1R<{_JiU+FC5EPUk~N&!NKmRjefy|lnNH%?miDQf_Vy$u6M-(8ZEJv~g3L<0S5H>PEWNl=ShuwLO29qZ zw^_%>38=>pV308UT$a(19YJ?yjh$u5~ix0Vporf?7W-IN_JyGqThZjJi#t34_gHOsJ7og$1<2_hw9@~u8 z{_C}WRomPQ%&f{)3sh^?Oa^LQwx+iDVPo0>V26`3Kta1Hyun*o^ob>D95u>a#8ZRI zbFUSjHB*n+EY`?zOvPRRi@JhPO)HLGb6v7p)N?R+&*Z7*duhIM^DIj`RmU}1TNG)l z#GN(Ad7uFPjEWB1BcW6`ew$;;u6DGAP0=*akS=M8hQ~r{PkSGt5TKpc@&)M#ud$^7 zVZB}u9ou+$cgOzM%o0%tUl}WcBqnJ`9fdSlBHsQui-Wx!DODQP_k$c4~i>bzh@?`Bfy@R zpP9xMs26F3zYer0G|(p<3KYO$QxbPIt?1*;Xmq8;x(`Yx(IdcQ8HMl1&xY{MGx6mf zazRVxRAi1&y}eCP^{~GARy)dbnLy_-vZ4nMyl9N7`{lr`_0t)Pi6SUe#l{SR>FUf| zc(dI#S+sK!KS+Z)KUXTE$i<&yimZR_Uej3xMn|)4w0NT-f_v7CN%D(}= zFVcGOGLh4bl8=)yj5B7_g>436sPkj_@UZ*O-6gEy}Z& znW_(74D5Gxj6K%G0Msjp0vumC-vF^vZ-AGd&wYv#b8;b!X9Sg1n}HFiTCG*_(3N1p zySrE4dfxLvcw0bD&?|km=8?9)GXZmX2=PClhDgX_ChjS*Z3nUos(ek45@%)j0qKg@ z6ilAz%Ch4g!tc3@Ir$^F;)|3HYnG!$@z-mVUB%Iy#c^v(#9&2hEhi@1hlCe12!y_- zqItR6hUt_FH0=i_3=SYq#B6^}Tewn9+8ky>knEs;!n-5y4oh8`_hVWRrgXYSB4^yu z6m=QlshRKP%V7$8cbbP zlJyPTdAa8W&2yF(kC=4($X}g`89t{X-C`QN0i^0@C+V!Z4NbVU9QFAb*iflYRq)s6{)Sl68?U^j4%Ei#I@An=rSLY1l#GBt2z)0Gx1Bj3Y)+rxRa)PRqq=;p_~ylC;D8 zJA#5N)AxR~!&OJ-ZWC2Oc9$VbiXV6j_nr@ou$omw_f%^XW| zLyHx|$Acq$I5lg-woavc)f}sS9HUP2TojdK8FPxbUdiO0#889B@xo>YHS@7sW2 z&}=3T@r0kuAW(D-^N&5a)xopPVu0ipZpM$wY-}a3d^6VfpZr9s3|H)Aob1i!23?XB zS>nfWx>+jQY^U*Gv@-1#tOL6Zr;m4FeQ2B>_&&kQ|(u_{g zxML}lq#`4vEycskThW$5P5M}$F;wzPjTNdX*s9XXv@TdWs3~PPM)G(b18jsv)CZs9 zFm`l6)HvRL=y|p5tkTz!C5y1m99O>`-bBw%%fH{!>X%9HA(_la`#X7`{S@Dig|d%? z8A+d(BnYR_5UsTKgt+u3U^ut5B&@xJH{SphE+&q#SzKz?>d8L%_3deJ#c8`me!IjY zJE~KWWzdpcM`jS=zhd72M6IST-tb2sZ56w_WViX9h4yi&!ph6te8$ycHBXE6zA}|{ z0{EJXq&J5pcZ2rRj=oR?zHcw^6K??M0p_wXc!s0U_7FwnK5y7Rs!48{=Lh!8pOb=l zB@sNvs0DGoBf7io+ll&)`)u1lrok>kRYGm^su8J$&hP%|Z6;VaE%O-Q*^w zl})-Vq+3?;TVe)ku7%z0J&Cr*9Supd!)}mOlSepjHOvZ8s{p8R04^mTt2@aV)4*C4z6}&C^n0w9RT3qrGZ$&FPQJ6SoUWA2KiJYEU#*UOT(%Ac_T-67v z32UlZB?Z^)Q@HM!UjPpSzfUK7al`#w9qmxA}=cBbg3btJX>y2Le!X7 z>R1}jR5_Uk0o$yWI;wRSV~OqS$VDLmC*hBpLIC$#VvmP#J3)w%Wb__ zOJt8!Z=zxxGGm^ zhKh*L-3oAtu{Gs5alQtuY+rBZyvpuxMEj%Eu7qU*R>V_rYoflGvO`^gCSQHm#cE;2 zEsvxc$Or&$W?`->_D{ICtV82>-$ZBp-?!IXM{PG()NI_`_sN*mu3O;c$?aYU^^=be zrEG)&4iQQ?=$H@FqFn8*$pmW(;9br*AfM9qUPrJsCl$>_#&-q?fkY-SxTV%YJRZ+T zfoKxT%30VuuW^+Q!J3$ZPjULlC z;iXmeJ86d^4skydoN&mM3R~CpZ0L#D@Lj=I8N<4{(sh6N%(+hwd!}{+38-*64K?d-))u#11F z@^I9Vs2oFWZlWNVa*+<{s(PD~umnO{uEqRojr40P%);7h$R#GlNiu4MuZem}GFW>* zaCn{QR%)34BF2K_sf}!W9y<3@@%x<@vVDuq`z6ol6nW@LXQg00l$Nq{Pxy6l%N8%7 z(64a;TI8owp}kiLEQDd7xc+@h;MH~g3un={(=WYj@hr4871AJ$4J=5`C@DJES$0KQ zOWn&)Tt11qh)&n1;l1p0^l)yU_aLm_Gs|mUBX^gThF%@uAM)dZC2zJ&_y6=wsKDJ= zi#+P#rW|Z$8xh&VQ5`F`@1>lbiWfH3zE zsM$O9{ku(rwb+t5+0`iy^->CbY}zsm3Emz{3YssfWx?S4E#;@^=*=92R+-z~vC0yy zvCEWGZR(|F(2a}81u?(Jd5bqie!~op$S7Gtq(6N|Bb)LE+Ab%_nFn*SjXKcyDCK9j z04xO`9p0uNGrzZrqKIQ|ijnnryeU3Vo6-gCiR=dVl8m|C#^4BP8p_Lm<^3uhV5^CJ zNE@Br`syaOr*t(`q^bt9hlsO{0oGveYLDDuZiV|9JwJ}^3iiH|{E+3zLilcGp8$JA59$y-(w-8kP9*H9tF5S`fskp-87T)>sI zgk$6~3N~}2=jmMKFf_Y2?Q}S2mTxyS@|@v(Ij1EC-_VbYTGg=%`sh%n)*kq)uX*UY4lb1tN9K9X!C%FnB>J4AHId z>A7VQeShvQdCO1rWs*3%PZo(Wf?M>mD~5xNV$0k{`>YX{;#7eKbh&prdgx;?=>mk+ zq``uaikx6_BN%s-d7$7?wL-Zn$e*C0Eh*R8`N%q@YZ5}y2gMEpXC@$So{pCz`EGwW zQuH$Om}e)-a+x&b`>qzJD04!P5HX)>SLTVV5zfsAl=JjDP7~5d59G)4@QnDF7%Mss z;-g@I&0x#7g(G_G)j1Cjo}B7uElxuli9wo@#L#kWK{w4;RBQt@9%PTIBvrj;xGK;z z4;_os;vn4d-y?$?Me+0bf~x9Ta@51G88CE3yRf*Wr=tBGrV5#sO6uLXx7)|}3MGLd zkUJPBYD=XD>GV#tf!1i@mDiA6`y^?ABjHl(+~D)ilO6o+?Vj_j#mka>@x`)rq6Gf2 zOS008AP-jcNsSljFJAB1N^!I=_+%w=kkcLZadB@(5#bauHfw&~R0-mn_~)&_P`ae? zPN5GD?x^Vt;BcwT<@?@sP4^b9xqS0Euj0Nf_h2YmickYrhNEvUqN2T5kJ_s9;s=*q z>O3@(w66q4(2xwy*Ym4swfz7PmTq2OfLzee!jc$p_u} zUaWA+f&94Hro4=ONJGBoSvS&e=A9(^&uD{n*=<*Wz(RoYjvtc*cFpX$S9Do z#l5(!+1Zde(TA2#3IUUGVTo$&CKk^1dP<&*pIUqN75&O2cn4N##mC)^6 z-L48Pd57coh79Yf*^dI8^#5t%5`G6mj#6oFU)Hw?m5Gm5*|qer<8zJkTyF5*#!H&V z^$Ux_a=uV;?wBj_cPT(azRtMAe5u_~Kir6gvLP7&Bqq;Ppdi;P@Kp)Z^e4-Vxj~p! zF02}fI_VAckVFOhF;ca65|QcfQbroMea=Z3B-kdjaQTrn^on448cFzb8KZ{9y)mn0p(%l*G_BM^xztV^&snqtmju*-j zN|JmccY$uvDo$ED?nN^0%_BEPIF6FhX{a|yv$~YQ(6^J+jwd0DF@x}^J-0OtQL7GS z7lu3;I*t+pQ~-;GTnA zXQ%g*z~=c*)nQ#9i$d8px5MY0@50Z=L@>ndTD?le ztj8gGE5YNqpj~^d)`CG>@IviFT!6s1zAEmln1&zGUd!^6rNWjDOG-ZD1DeamHcmlk zVcR9)6o(vz_4X(7)P7_K@eY7frX`wI+xahv&aQZ|8Wuh?3MO$5pk_yb(A^y^`UoZU z2n2Eu4@!6KzG!@Z2}11~AUC^p;gtr^WL+|rwrrkEN^Xdq7Doca?T4+@`P)oCmQNoN zHV4b^mHe)5Wb~TF?QlHzrs84Wu&~e5Mnc#PUh4FzAL_yv9&i#4+DtKVn*`ug+wC7e8X2g92~NNXC#1* zR{FDu<{AJ`vBGOCbRpVf!bIh11ZHL)pYrD>J!8u2r41Rp%X5cILuBeuCNk1o+$MI`$c2J|<0FmavqC719%Lbhhe@p25ni=nI4SR~y)Un6+?e zwGb6|k(x3d0UUV(BjOH~cB!({BHEW}mln|e!|sy}=+uYucD2cF^)Rig-JIU}Ag;^q z?#xJVn(QpCvRG@>Id@ssB#Jh2OFUtx@#G5SDhD}uO**)xSwoc+Ep`{vss?ADFHx>n zEt$(Fkz%%-#OyL=IL5(V-rS;ei&sYpU_j=79A$PH%)g1>HVA}x2m^e)#UG{V=U!am z+@ugL(Wzht5@%Y4V(S?QK$@oQITvEt9VRo3@=z*^hY2U{=RStDmBlB3!uTO6P_5rxc_ZE}JPRS&|>ca1G;pSO&A zzh3cq8S+a3PR%OrnrHZC8|cZ*nE2iI9HX@j>i@NjST?P$CHFDq5{0>F^XCiAC?lZ} zWG*DQI8mM-S=1b?{~{VlgAG(TS9k-MES@ahIV~Xz03i-l4|3qM7w3E&W$v7=ajfa1 zByNh{07eV$&?vRQUGz2+j!~UFKN3#~a%I&}iRiO8K;2DAaH>(K4gG}s58vpH+wuf? zD6&HJl*Zquibd-gV2<~YBfSFS7%C3mvS>(4iqE;xX5cvC3DH_5;^ z5krz*bioPQKDLqQX}FV3WeQ++_E~2*Fljaa`4RnhEuTimL!axYCk9`EYgKr)yVQ0JxHGP z%vH={&srN^yE4BX3F3Q&lpYEo;~D2TbiZSA5a97qp5|R@NdD0yEq2)g3(yE{$2|e1JauAt&88*B zGyVg(_Bc~+i`2OvM%s+L>XRrmtf_UdChe)QsxXA^KjU1U#2)U6UmYbe#3`nRLlOqC z$+nuPs2zT7bzNIq3%n?`sW?5yRNbRU_%MLTg_jiusIa1!M&GH@`u<}slfD2QgGr=9 zDTw1xX;J_d8X8KVQT6yktbu&*PVDiqQXQ1yh#d@NxuylyeeLHMPD42OXG6${32-E? z2}$yRRfwTar%_tRGOvTxS0enz(L*qH+IC1fWuu

xHSl>#f)bC)D81qROz)7>EYt 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�G6-PezB=Cg<<;cq+!>c30 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

<+to=H{) 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

nAz4PSkGwzw7s?Ud17$BX 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 NWqf7;X{vC| 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 + + + diff --git a/index_a.html b/index_a.html new file mode 100644 index 0000000..766401d --- /dev/null +++ b/index_a.html @@ -0,0 +1,368 @@ + + + + + + Apache2 Debian Default Page: It works + + + +
+ + +
+ + +
+
+ It works! +
+
+

+ This is the default welcome page used to test the correct + operation of the Apache2 server after installation on Debian systems. + If you can read this page, it means that the Apache HTTP server installed at + this site is working properly. You should replace this file (located at + /var/www/html/index.html) before continuing to operate your HTTP server. +

+ + +

+ If you are a normal user of this web site and don't know what this page is + about, this probably means that the site is currently unavailable due to + maintenance. + If the problem persists, please contact the site's administrator. +

+ +
+
+
+ Configuration Overview +
+
+

+ Debian's Apache2 default configuration is different from the + upstream default configuration, and split into several files optimized for + interaction with Debian tools. The configuration system is + fully documented in + /usr/share/doc/apache2/README.Debian.gz. Refer to this for the full + documentation. Documentation for the web server itself can be + found by accessing the manual if the apache2-doc + package was installed on this server. + +

+

+ The configuration layout for an Apache2 web server installation on Debian systems is as follows: +

+
+/etc/apache2/
+|-- apache2.conf
+|       `--  ports.conf
+|-- mods-enabled
+|       |-- *.load
+|       `-- *.conf
+|-- conf-enabled
+|       `-- *.conf
+|-- sites-enabled
+|       `-- *.conf
+          
+
    +
  • + apache2.conf is the main configuration + file. It puts the pieces together by including all remaining configuration + files when starting up the web server. +
  • + +
  • + ports.conf is always included from the + main configuration file. It is used to determine the listening ports for + incoming connections, and this file can be customized anytime. +
  • + +
  • + Configuration files in the mods-enabled/, + conf-enabled/ and sites-enabled/ directories contain + particular configuration snippets which manage modules, global configuration + fragments, or virtual host configurations, respectively. +
  • + +
  • + They are activated by symlinking available + configuration files from their respective + *-available/ counterparts. These should be managed + by using our helpers + + a2enmod, + a2dismod, + + + a2ensite, + a2dissite, + + and + + a2enconf, + a2disconf + . See their respective man pages for detailed information. +
  • + +
  • + The binary is called apache2. Due to the use of + environment variables, in the default configuration, apache2 needs to be + started/stopped with /etc/init.d/apache2 or apache2ctl. + Calling /usr/bin/apache2 directly will not work with the + default configuration. +
  • +
+
+ +
+
+ Document Roots +
+ +
+

+ By default, Debian does not allow access through the web browser to + any file apart of those located in /var/www, + public_html + directories (when enabled) and /usr/share (for web + applications). If your site is using a web document root + located elsewhere (such as in /srv) you may need to whitelist your + document root directory in /etc/apache2/apache2.conf. +

+

+ The default Debian document root is /var/www/html. You + can make your own virtual hosts under /var/www. This is different + to previous releases which provides better security out of the box. +

+
+ +
+
+ Reporting Problems +
+
+

+ Please use the reportbug tool to report bugs in the + Apache2 package with Debian. However, check existing bug reports before reporting a new bug. +

+

+ Please report bugs specific to modules (such as PHP and others) + to respective packages, not to the web server itself. +

+
+ + + + +
+
+
+
+ + + diff --git a/pdf.mjs b/pdf.mjs new file mode 100644 index 0000000..c9f1e70 --- /dev/null +++ b/pdf.mjs @@ -0,0 +1,21337 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = globalThis.pdfjsLib = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + AbortException: () => (/* reexport */ AbortException), + AnnotationEditorLayer: () => (/* reexport */ AnnotationEditorLayer), + AnnotationEditorParamsType: () => (/* reexport */ AnnotationEditorParamsType), + AnnotationEditorType: () => (/* reexport */ AnnotationEditorType), + AnnotationEditorUIManager: () => (/* reexport */ AnnotationEditorUIManager), + AnnotationLayer: () => (/* reexport */ AnnotationLayer), + AnnotationMode: () => (/* reexport */ AnnotationMode), + ColorPicker: () => (/* reexport */ ColorPicker), + DOMSVGFactory: () => (/* reexport */ DOMSVGFactory), + DrawLayer: () => (/* reexport */ DrawLayer), + FeatureTest: () => (/* reexport */ util_FeatureTest), + GlobalWorkerOptions: () => (/* reexport */ GlobalWorkerOptions), + ImageKind: () => (/* reexport */ util_ImageKind), + InvalidPDFException: () => (/* reexport */ InvalidPDFException), + MissingPDFException: () => (/* reexport */ MissingPDFException), + OPS: () => (/* reexport */ OPS), + OutputScale: () => (/* reexport */ OutputScale), + PDFDataRangeTransport: () => (/* reexport */ PDFDataRangeTransport), + PDFDateString: () => (/* reexport */ PDFDateString), + PDFWorker: () => (/* reexport */ PDFWorker), + PasswordResponses: () => (/* reexport */ PasswordResponses), + PermissionFlag: () => (/* reexport */ PermissionFlag), + PixelsPerInch: () => (/* reexport */ PixelsPerInch), + RenderingCancelledException: () => (/* reexport */ RenderingCancelledException), + TextLayer: () => (/* reexport */ TextLayer), + UnexpectedResponseException: () => (/* reexport */ UnexpectedResponseException), + Util: () => (/* reexport */ Util), + VerbosityLevel: () => (/* reexport */ VerbosityLevel), + XfaLayer: () => (/* reexport */ XfaLayer), + build: () => (/* reexport */ build), + createValidAbsoluteUrl: () => (/* reexport */ createValidAbsoluteUrl), + fetchData: () => (/* reexport */ fetchData), + getDocument: () => (/* reexport */ getDocument), + getFilenameFromUrl: () => (/* reexport */ getFilenameFromUrl), + getPdfFilenameFromUrl: () => (/* reexport */ getPdfFilenameFromUrl), + getXfaPageViewport: () => (/* reexport */ getXfaPageViewport), + isDataScheme: () => (/* reexport */ isDataScheme), + isPdfFile: () => (/* reexport */ isPdfFile), + noContextMenu: () => (/* reexport */ noContextMenu), + normalizeUnicode: () => (/* reexport */ normalizeUnicode), + setLayerDimensions: () => (/* reexport */ setLayerDimensions), + shadow: () => (/* reexport */ shadow), + stopEvent: () => (/* reexport */ stopEvent), + version: () => (/* reexport */ version) +}); + +;// ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_DEFAULT_COLOR: 32, + HIGHLIGHT_THICKNESS: 33, + HIGHLIGHT_FREE: 34, + HIGHLIGHT_SHOW_ALL: 35, + DRAW_STEP: 41 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +const util_ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch {} + return null; +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); + } +} +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function objectFromMap(map) { + const obj = Object.create(null); + for (const [key, value] of map) { + obj[key] = value; + } + return obj; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } +} +class util_FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get platform() { + if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { + return shadow(this, "platform", { + isMac: navigator.platform.includes("Mac"), + isWindows: navigator.platform.includes("Win"), + isFirefox: typeof navigator?.userAgent === "string" && navigator.userAgent.includes("Firefox") + }); + } + return shadow(this, "platform", { + isMac: false, + isWindows: false, + isFirefox: false + }); + } + static get isCSSRoundSupported() { + return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + } +} +const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; + } + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = this.applyTransform(r, m); + const p2 = this.applyTransform(r.slice(2, 4), m); + const p3 = this.applyTransform([r[0], r[3]], m); + const p4 = this.applyTransform([r[2], r[1]], m); + return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + const c = m[2] * transpose[0] + m[3] * transpose[2]; + const d = m[2] * transpose[1] + m[3] * transpose[3]; + const first = (a + d) / 2; + const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + if (minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + } else { + minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; + } + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + return minMax; + } +} +const PDFStringTranslateTable = (/* unused pure expression or super */ null && ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac])); +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (!decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate(date = new Date()) { + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +const FontRenderOps = { + BEZIER_CURVE_TO: 0, + MOVE_TO: 1, + LINE_TO: 2, + QUADRATIC_CURVE_TO: 3, + RESTORE: 4, + SAVE: 5, + SCALE: 6, + TRANSFORM: 7, + TRANSLATE: 8 +}; +function toHexUtil(arr) { + if (Uint8Array.prototype.toHex) { + return arr.toHex(); + } + return Array.from(arr, num => hexNumbers[num]).join(""); +} +function toBase64Util(arr) { + if (Uint8Array.prototype.toBase64) { + return arr.toBase64(); + } + return btoa(bytesToString(arr)); +} +function fromBase64Util(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str); + } + return stringToBytes(atob(str)); +} +if (typeof Promise.try !== "function") { + Promise.try = function (fn, ...args) { + return new Promise(resolve => { + resolve(fn(...args)); + }); + }; +} + +;// ./src/display/display_utils.js + +const SVG_NS = "http://www.w3.org/2000/svg"; +class PixelsPerInch { + static CSS = 96.0; + static PDF = 72.0; + static PDF_TO_CSS_UNITS = this.CSS / this.PDF; +} +async function fetchData(url, type = "text") { + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); + } + switch (type) { + case "arraybuffer": + return response.arrayBuffer(); + case "blob": + return response.blob(); + case "json": + return response.json(); + } + return response.text(); + } + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = type; + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + switch (type) { + case "arraybuffer": + case "blob": + case "json": + resolve(request.response); + return; + } + resolve(request.responseText); + return; + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class PageViewport { + constructor({ + viewBox, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + }) { + this.viewBox = viewBox; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + const centerX = (viewBox[2] + viewBox[0]) / 2; + const centerY = (viewBox[3] + viewBox[1]) / 2; + let rotateA, rotateB, rotateC, rotateD; + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + case 0: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + default: + throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + let offsetCanvasX, offsetCanvasY; + let width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = (viewBox[3] - viewBox[1]) * scale; + height = (viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = (viewBox[2] - viewBox[0]) * scale; + height = (viewBox[3] - viewBox[1]) * scale; + } + this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; + this.width = width; + this.height = height; + } + get rawDims() { + const { + viewBox + } = this; + return shadow(this, "rawDims", { + pageWidth: viewBox[2] - viewBox[0], + pageHeight: viewBox[3] - viewBox[1], + pageX: viewBox[0], + pageY: viewBox[1] + }); + } + clone({ + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.viewBox.slice(), + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + return Util.applyTransform([x, y], this.transform); + } + convertToViewportRectangle(rect) { + const topLeft = Util.applyTransform([rect[0], rect[1]], this.transform); + const bottomRight = Util.applyTransform([rect[2], rect[3]], this.transform); + return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; + } + convertToPdfPoint(x, y) { + return Util.applyInverseTransform([x, y], this.transform); + } +} +class RenderingCancelledException extends BaseException { + constructor(msg, extraDelay = 0) { + super(msg, "RenderingCancelledException"); + this.extraDelay = extraDelay; + } +} +function isDataScheme(url) { + const ii = url.length; + let i = 0; + while (i < ii && url[i].trim() === "") { + i++; + } + return url.substring(i, i + 5).toLowerCase() === "data:"; +} +function isPdfFile(filename) { + return typeof filename === "string" && /\.pdf$/i.test(filename); +} +function getFilenameFromUrl(url) { + [url] = url.split(/[#?]/, 1); + return url.substring(url.lastIndexOf("/") + 1); +} +function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { + if (typeof url !== "string") { + return defaultFilename; + } + if (isDataScheme(url)) { + warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + const splitURI = reURI.exec(url); + let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0]; + if (suggestedFilename.includes("%")) { + try { + suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; + } catch {} + } + } + return suggestedFilename || defaultFilename; +} +class StatTimer { + started = Object.create(null); + times = []; + time(name) { + if (name in this.started) { + warn(`Timer is already running for ${name}`); + } + this.started[name] = Date.now(); + } + timeEnd(name) { + if (!(name in this.started)) { + warn(`Timer has not been started for ${name}`); + } + this.times.push({ + name, + start: this.started[name], + end: Date.now() + }); + delete this.started[name]; + } + toString() { + const outBuf = []; + let longest = 0; + for (const { + name + } of this.times) { + longest = Math.max(name.length, longest); + } + for (const { + name, + start, + end + } of this.times) { + outBuf.push(`${name.padEnd(longest)} ${end - start}ms\n`); + } + return outBuf.join(""); + } +} +function isValidFetchUrl(url, baseUrl) { + try { + const { + protocol + } = baseUrl ? new URL(url, baseUrl) : new URL(url); + return protocol === "http:" || protocol === "https:"; + } catch { + return false; + } +} +function noContextMenu(e) { + e.preventDefault(); +} +function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +class PDFDateString { + static #regex; + static toDateObject(input) { + if (!input || typeof input !== "string") { + return null; + } + this.#regex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + const matches = this.#regex.exec(input); + if (!matches) { + return null; + } + const year = parseInt(matches[1], 10); + let month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + let day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + let hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + let minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + let second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + const universalTimeRelation = matches[7] || "Z"; + let offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + let offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + if (universalTimeRelation === "-") { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === "+") { + hour -= offsetHour; + minute -= offsetMinute; + } + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } +} +function getXfaPageViewport(xfaPage, { + scale = 1, + rotation = 0 +}) { + const { + width, + height + } = xfaPage.attributes.style; + const viewBox = [0, 0, parseInt(width), parseInt(height)]; + return new PageViewport({ + viewBox, + scale, + rotation + }); +} +function getRGB(color) { + if (color.startsWith("#")) { + const colorRGB = parseInt(color.slice(1), 16); + return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff]; + } + if (color.startsWith("rgb(")) { + return color.slice(4, -1).split(",").map(x => parseInt(x)); + } + if (color.startsWith("rgba(")) { + return color.slice(5, -1).split(",").map(x => parseInt(x)).slice(0, 3); + } + warn(`Not a valid color format: "${color}"`); + return [0, 0, 0]; +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + document.body.append(span); + for (const name of colors.keys()) { + span.style.color = name; + const computedColor = window.getComputedStyle(span).color; + colors.set(name, getRGB(computedColor)); + } + span.remove(); +} +function getCurrentTransform(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform(); + return [a, b, c, d, e, f]; +} +function getCurrentTransformInverse(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform().invertSelf(); + return [a, b, c, d, e, f]; +} +function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { + if (viewport instanceof PageViewport) { + const { + pageWidth, + pageHeight + } = viewport.rawDims; + const { + style + } = div; + const useRound = util_FeatureTest.isCSSRoundSupported; + const w = `var(--scale-factor) * ${pageWidth}px`, + h = `var(--scale-factor) * ${pageHeight}px`; + const widthStr = useRound ? `round(down, ${w}, var(--scale-round-x, 1px))` : `calc(${w})`, + heightStr = useRound ? `round(down, ${h}, var(--scale-round-y, 1px))` : `calc(${h})`; + if (!mustFlip || viewport.rotation % 180 === 0) { + style.width = widthStr; + style.height = heightStr; + } else { + style.width = heightStr; + style.height = widthStr; + } + } + if (mustRotate) { + div.setAttribute("data-main-rotation", viewport.rotation); + } +} +class OutputScale { + constructor() { + const pixelRatio = window.devicePixelRatio || 1; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } + get symmetric() { + return this.sx === this.sy; + } +} + +;// ./src/display/editor/toolbar.js + +class EditorToolbar { + #toolbar = null; + #colorPicker = null; + #editor; + #buttons = null; + #altText = null; + static #l10nRemove = null; + constructor(editor) { + this.#editor = editor; + EditorToolbar.#l10nRemove ||= Object.freeze({ + freetext: "pdfjs-editor-remove-freetext-button", + highlight: "pdfjs-editor-remove-highlight-button", + ink: "pdfjs-editor-remove-ink-button", + stamp: "pdfjs-editor-remove-stamp-button" + }); + } + render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.classList.add("editToolbar", "hidden"); + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#editor._uiManager._signal; + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + const position = this.#editor.toolbarPosition; + if (position) { + const { + style + } = editToolbar; + const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; + } + this.#addDeleteButton(); + return editToolbar; + } + get div() { + return this.#toolbar; + } + static #pointerDown(e) { + e.stopPropagation(); + } + #focusIn(e) { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + } + #focusOut(e) { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + } + #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; + element.addEventListener("focusin", this.#focusIn.bind(this), { + capture: true, + signal + }); + element.addEventListener("focusout", this.#focusOut.bind(this), { + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal + }); + } + hide() { + this.#toolbar.classList.add("hidden"); + this.#colorPicker?.hideDropdown(); + } + show() { + this.#toolbar.classList.remove("hidden"); + this.#altText?.shown(); + } + #addDeleteButton() { + const { + editorType, + _uiManager + } = this.#editor; + const button = document.createElement("button"); + button.className = "delete"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", EditorToolbar.#l10nRemove[editorType]); + this.#addListenersToElement(button); + button.addEventListener("click", e => { + _uiManager.delete(); + }, { + signal: _uiManager._signal + }); + this.#buttons.append(button); + } + get #divider() { + const divider = document.createElement("div"); + divider.className = "divider"; + return divider; + } + async addAltText(altText) { + const button = await altText.render(); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + this.#altText = altText; + } + addColorPicker(colorPicker) { + this.#colorPicker = colorPicker; + const button = colorPicker.renderButton(); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + } + remove() { + this.#toolbar.remove(); + this.#colorPicker?.destroy(); + this.#colorPicker = null; + } +} +class HighlightToolbar { + #buttons = null; + #toolbar = null; + #uiManager; + constructor(uiManager) { + this.#uiManager = uiManager; + } + #render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal: this.#uiManager._signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + this.#addHighlightButton(); + return editToolbar; + } + #getLastPoint(boxes, isLTR) { + let lastY = 0; + let lastX = 0; + for (const box of boxes) { + const y = box.y + box.height; + if (y < lastY) { + continue; + } + const x = box.x + (isLTR ? box.width : 0); + if (y > lastY) { + lastX = x; + lastY = y; + continue; + } + if (isLTR) { + if (x > lastX) { + lastX = x; + } + } else if (x < lastX) { + lastX = x; + } + } + return [isLTR ? 1 - lastX : lastX, lastY]; + } + show(parent, boxes, isLTR) { + const [x, y] = this.#getLastPoint(boxes, isLTR); + const { + style + } = this.#toolbar ||= this.#render(); + parent.append(this.#toolbar); + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; + } + hide() { + this.#toolbar.remove(); + } + #addHighlightButton() { + const button = document.createElement("button"); + button.className = "highlightButton"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", `pdfjs-highlight-floating-button1`); + const span = document.createElement("span"); + button.append(span); + span.className = "visuallyHidden"; + span.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label"); + const signal = this.#uiManager._signal; + button.addEventListener("contextmenu", noContextMenu, { + signal + }); + button.addEventListener("click", () => { + this.#uiManager.highlightSelection("floating_button"); + }, { + signal + }); + this.#buttons.append(button); + } +} + +;// ./src/display/editor/tools.js + + + +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +function opacityToHex(opacity) { + return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, "0"); +} +class IdManager { + #id = 0; + get id() { + return `${AnnotationEditorPrefix}${this.#id++}`; + } +} +class ImageManager { + #baseId = getUuid(); + #id = 0; + #cache = null; + static get _isSVGFittingCanvas() { + const svg = `data:image/svg+xml;charset=UTF-8,`; + const canvas = new OffscreenCanvas(1, 3); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + const image = new Image(); + image.src = svg; + const promise = image.decode().then(() => { + ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); + return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; + }); + return shadow(this, "_isSVGFittingCanvas", promise); + } + async #get(key, rawData) { + this.#cache ||= new Map(); + let data = this.#cache.get(key); + if (data === null) { + return null; + } + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + try { + data ||= { + bitmap: null, + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 0, + isSvg: false + }; + let image; + if (typeof rawData === "string") { + data.url = rawData; + image = await fetchData(rawData, "blob"); + } else if (rawData instanceof File) { + image = data.file = rawData; + } else if (rawData instanceof Blob) { + image = rawData; + } + if (image.type === "image/svg+xml") { + const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; + const fileReader = new FileReader(); + const imageElement = new Image(); + const imagePromise = new Promise((resolve, reject) => { + imageElement.onload = () => { + data.bitmap = imageElement; + data.isSvg = true; + resolve(); + }; + fileReader.onload = async () => { + const url = data.svgUrl = fileReader.result; + imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; + }; + imageElement.onerror = fileReader.onerror = reject; + }); + fileReader.readAsDataURL(image); + await imagePromise; + } else { + data.bitmap = await createImageBitmap(image); + } + data.refCounter = 1; + } catch (e) { + warn(e); + data = null; + } + this.#cache.set(key, data); + if (data) { + this.#cache.set(data.id, data); + } + return data; + } + async getFromFile(file) { + const { + lastModified, + name, + size, + type + } = file; + return this.#get(`${lastModified}_${name}_${size}_${type}`, file); + } + async getFromUrl(url) { + return this.#get(url, url); + } + async getFromBlob(id, blobPromise) { + const blob = await blobPromise; + return this.#get(id, blob); + } + async getFromId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return null; + } + if (data.bitmap) { + data.refCounter += 1; + return data; + } + if (data.file) { + return this.getFromFile(data.file); + } + if (data.blobPromise) { + const { + blobPromise + } = data; + delete data.blobPromise; + return this.getFromBlob(data.id, blobPromise); + } + return this.getFromUrl(data.url); + } + getFromCanvas(id, canvas) { + this.#cache ||= new Map(); + let data = this.#cache.get(id); + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + const offscreen = new OffscreenCanvas(canvas.width, canvas.height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(canvas, 0, 0); + data = { + bitmap: offscreen.transferToImageBitmap(), + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 1, + isSvg: false + }; + this.#cache.set(id, data); + this.#cache.set(data.id, data); + return data; + } + getSvgUrl(id) { + const data = this.#cache.get(id); + if (!data?.isSvg) { + return null; + } + return data.svgUrl; + } + deleteId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return; + } + data.refCounter -= 1; + if (data.refCounter !== 0) { + return; + } + const { + bitmap + } = data; + if (!data.url && !data.file) { + const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); + const ctx = canvas.getContext("bitmaprenderer"); + ctx.transferFromImageBitmap(bitmap); + data.blobPromise = canvas.convertToBlob(); + } + bitmap.close?.(); + data.bitmap = null; + } + isValidId(id) { + return id.startsWith(`image_${this.#baseId}_`); + } +} +class CommandManager { + #commands = []; + #locked = false; + #maxSize; + #position = -1; + constructor(maxSize = 128) { + this.#maxSize = maxSize; + } + add({ + cmd, + undo, + post, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + }) { + if (mustExec) { + cmd(); + } + if (this.#locked) { + return; + } + const save = { + cmd, + undo, + post, + type + }; + if (this.#position === -1) { + if (this.#commands.length > 0) { + this.#commands.length = 0; + } + this.#position = 0; + this.#commands.push(save); + return; + } + if (overwriteIfSameType && this.#commands[this.#position].type === type) { + if (keepUndo) { + save.undo = this.#commands[this.#position].undo; + } + this.#commands[this.#position] = save; + return; + } + const next = this.#position + 1; + if (next === this.#maxSize) { + this.#commands.splice(0, 1); + } else { + this.#position = next; + if (next < this.#commands.length) { + this.#commands.splice(next); + } + } + this.#commands.push(save); + } + undo() { + if (this.#position === -1) { + return; + } + this.#locked = true; + const { + undo, + post + } = this.#commands[this.#position]; + undo(); + post?.(); + this.#locked = false; + this.#position -= 1; + } + redo() { + if (this.#position < this.#commands.length - 1) { + this.#position += 1; + this.#locked = true; + const { + cmd, + post + } = this.#commands[this.#position]; + cmd(); + post?.(); + this.#locked = false; + } + } + hasSomethingToUndo() { + return this.#position !== -1; + } + hasSomethingToRedo() { + return this.#position < this.#commands.length - 1; + } + cleanType(type) { + if (this.#position === -1) { + return; + } + for (let i = this.#position; i >= 0; i--) { + if (this.#commands[i].type !== type) { + this.#commands.splice(i + 1, this.#position - i); + this.#position = i; + return; + } + } + this.#commands.length = 0; + this.#position = -1; + } + destroy() { + this.#commands = null; + } +} +class KeyboardManager { + constructor(callbacks) { + this.buffer = []; + this.callbacks = new Map(); + this.allKeys = new Set(); + const { + isMac + } = util_FeatureTest.platform; + for (const [keys, callback, options = {}] of callbacks) { + for (const key of keys) { + const isMacKey = key.startsWith("mac+"); + if (isMac && isMacKey) { + this.callbacks.set(key.slice(4), { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } else if (!isMac && !isMacKey) { + this.callbacks.set(key, { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } + } + } + } + #serialize(event) { + if (event.altKey) { + this.buffer.push("alt"); + } + if (event.ctrlKey) { + this.buffer.push("ctrl"); + } + if (event.metaKey) { + this.buffer.push("meta"); + } + if (event.shiftKey) { + this.buffer.push("shift"); + } + this.buffer.push(event.key); + const str = this.buffer.join("+"); + this.buffer.length = 0; + return str; + } + exec(self, event) { + if (!this.allKeys.has(event.key)) { + return; + } + const info = this.callbacks.get(this.#serialize(event)); + if (!info) { + return; + } + const { + callback, + options: { + bubbles = false, + args = [], + checker = null + } + } = info; + if (checker && !checker(self, event)) { + return; + } + callback.bind(self, ...args, event)(); + if (!bubbles) { + stopEvent(event); + } + } +} +class ColorManager { + static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + getColorValues(colors); + return shadow(this, "_colors", colors); + } + convert(color) { + const rgb = getRGB(color); + if (!window.matchMedia("(forced-colors: active)").matches) { + return rgb; + } + for (const [name, RGB] of this._colors) { + if (RGB.every((x, i) => x === rgb[i])) { + return ColorManager._colorsMapping.get(name); + } + } + return rgb; + } + getHexCode(name) { + const rgb = this._colors.get(name); + if (!rgb) { + return name; + } + return Util.makeHexColor(...rgb); + } +} +class AnnotationEditorUIManager { + #abortController = new AbortController(); + #activeEditor = null; + #allEditors = new Map(); + #allLayers = new Map(); + #altTextManager = null; + #annotationStorage = null; + #changedExistingAnnotations = null; + #commandManager = new CommandManager(); + #copyPasteAC = null; + #currentDrawingSession = null; + #currentPageIndex = 0; + #deletedAnnotationsElementIds = new Set(); + #draggingEditors = null; + #editorTypes = null; + #editorsToRescale = new Set(); + _editorUndoBar = null; + #enableHighlightFloatingButton = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #filterFactory = null; + #focusMainContainerTimeoutId = null; + #focusManagerAC = null; + #highlightColors = null; + #highlightWhenShiftUp = false; + #highlightToolbar = null; + #idManager = new IdManager(); + #isEnabled = false; + #isWaiting = false; + #keyboardManagerAC = null; + #lastActiveElement = null; + #mainHighlightColorPicker = null; + #mlManager = null; + #mode = AnnotationEditorType.NONE; + #selectedEditors = new Set(); + #selectedTextNode = null; + #pageColors = null; + #showAllStates = null; + #previousStates = { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false, + hasSelectedText: false + }; + #translation = [0, 0]; + #translationTimeoutId = null; + #container = null; + #viewer = null; + #updateModeCapability = null; + static TRANSLATE_SMALL = 1; + static TRANSLATE_BIG = 10; + static get _keyboardManager() { + const proto = AnnotationEditorUIManager.prototype; + const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); + const textInputChecker = (_self, { + target: el + }) => { + if (el instanceof HTMLInputElement) { + const { + type + } = el; + return type !== "text" && type !== "number"; + } + return true; + }; + const small = this.TRANSLATE_SMALL; + const big = this.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { + checker: textInputChecker + }], [["ctrl+z", "mac+meta+z"], proto.undo, { + checker: textInputChecker + }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { + checker: textInputChecker + }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { + checker: textInputChecker + }], [["Enter", "mac+Enter"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled + }], [[" ", "mac+ "], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) + }], [["Escape", "mac+Escape"], proto.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], proto.translateSelectedEditors, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto.translateSelectedEditors, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto.translateSelectedEditors, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { + args: [0, big], + checker: arrowChecker + }]])); + } + constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar) { + const signal = this._signal = this.#abortController.signal; + this.#container = container; + this.#viewer = viewer; + this.#altTextManager = altTextManager; + this._eventBus = eventBus; + eventBus._on("editingaction", this.onEditingAction.bind(this), { + signal + }); + eventBus._on("pagechanging", this.onPageChanging.bind(this), { + signal + }); + eventBus._on("scalechanging", this.onScaleChanging.bind(this), { + signal + }); + eventBus._on("rotationchanging", this.onRotationChanging.bind(this), { + signal + }); + eventBus._on("setpreference", this.onSetPreference.bind(this), { + signal + }); + eventBus._on("switchannotationeditorparams", evt => this.updateParams(evt.type, evt.value), { + signal + }); + this.#addSelectionListener(); + this.#addDragAndDropListeners(); + this.#addKeyboardManager(); + this.#annotationStorage = pdfDocument.annotationStorage; + this.#filterFactory = pdfDocument.filterFactory; + this.#pageColors = pageColors; + this.#highlightColors = highlightColors || null; + this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#enableUpdatedAddImage = enableUpdatedAddImage; + this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage; + this.#mlManager = mlManager || null; + this.viewParameters = { + realScale: PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + this.isShiftKeyDown = false; + this._editorUndoBar = editorUndoBar || null; + } + destroy() { + this.#updateModeCapability?.resolve(); + this.#updateModeCapability = null; + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; + for (const layer of this.#allLayers.values()) { + layer.destroy(); + } + this.#allLayers.clear(); + this.#allEditors.clear(); + this.#editorsToRescale.clear(); + this.#activeEditor = null; + this.#selectedEditors.clear(); + this.#commandManager.destroy(); + this.#altTextManager?.destroy(); + this.#highlightToolbar?.hide(); + this.#highlightToolbar = null; + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + this.#focusMainContainerTimeoutId = null; + } + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + this.#translationTimeoutId = null; + } + this._editorUndoBar?.destroy(); + } + combinedSignal(ac) { + return AbortSignal.any([this._signal, ac.signal]); + } + get mlManager() { + return this.#mlManager; + } + get useNewAltTextFlow() { + return this.#enableUpdatedAddImage; + } + get useNewAltTextWhenAddingImage() { + return this.#enableNewAltTextWhenAddingImage; + } + get hcmFilter() { + return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); + } + get direction() { + return shadow(this, "direction", getComputedStyle(this.#container).direction); + } + get highlightColors() { + return shadow(this, "highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => pair.split("=").map(x => x.trim()))) : null); + } + get highlightColorNames() { + return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); + } + setCurrentDrawingSession(layer) { + if (layer) { + this.unselectAll(); + this.disableUserSelect(true); + } else { + this.disableUserSelect(false); + } + this.#currentDrawingSession = layer; + } + setMainHighlightColorPicker(colorPicker) { + this.#mainHighlightColorPicker = colorPicker; + } + editAltText(editor, firstTime = false) { + this.#altTextManager?.editAltText(this, editor, firstTime); + } + switchToMode(mode, callback) { + this._eventBus.on("annotationeditormodechanged", callback, { + once: true, + signal: this._signal + }); + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode + }); + } + setPreference(name, value) { + this._eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + onSetPreference({ + name, + value + }) { + switch (name) { + case "enableNewAltTextWhenAddingImage": + this.#enableNewAltTextWhenAddingImage = value; + break; + } + } + onPageChanging({ + pageNumber + }) { + this.#currentPageIndex = pageNumber - 1; + } + focusMainContainer() { + this.#container.focus(); + } + findParent(x, y) { + for (const layer of this.#allLayers.values()) { + const { + x: layerX, + y: layerY, + width, + height + } = layer.div.getBoundingClientRect(); + if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { + return layer; + } + } + return null; + } + disableUserSelect(value = false) { + this.#viewer.classList.toggle("noUserSelect", value); + } + addShouldRescale(editor) { + this.#editorsToRescale.add(editor); + } + removeShouldRescale(editor) { + this.#editorsToRescale.delete(editor); + } + onScaleChanging({ + scale + }) { + this.commitOrRemove(); + this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of this.#editorsToRescale) { + editor.onScaleChanging(); + } + this.#currentDrawingSession?.onScaleChanging(); + } + onRotationChanging({ + pagesRotation + }) { + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + #getAnchorElementForSelection({ + anchorNode + }) { + return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; + } + #getLayerForTextLayer(textLayer) { + const { + currentLayer + } = this; + if (currentLayer.hasTextLayer(textLayer)) { + return currentLayer; + } + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + return layer; + } + } + return null; + } + highlightSelection(methodOfCreation = "") { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const text = selection.toString(); + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + selection.empty(); + const layer = this.#getLayerForTextLayer(textLayer); + const isNoneMode = this.#mode === AnnotationEditorType.NONE; + const callback = () => { + layer?.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text + }); + if (isNoneMode) { + this.showAllEditors("highlight", true, true); + } + }; + if (isNoneMode) { + this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback); + return; + } + callback(); + } + #displayHighlightToolbar() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + this.#highlightToolbar ||= new HighlightToolbar(this); + this.#highlightToolbar.show(textLayer, boxes, this.direction === "ltr"); + } + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { + this.#annotationStorage.setValue(editor.id, editor); + } + } + #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + const { + anchorNode + } = selection; + if (anchorNode === this.#selectedTextNode) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + if (!textLayer) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + this.#highlightToolbar?.hide(); + this.#selectedTextNode = anchorNode; + this.#dispatchUpdateStates({ + hasSelectedText: true + }); + if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) { + return; + } + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.showAllEditors("highlight", true, true); + } + this.#highlightWhenShiftUp = this.isShiftKeyDown; + if (!this.isShiftKeyDown) { + const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null; + activeLayer?.toggleDrawing(); + const ac = new AbortController(); + const signal = this.combinedSignal(ac); + const pointerup = e => { + if (e.type === "pointerup" && e.button !== 0) { + return; + } + ac.abort(); + activeLayer?.toggleDrawing(true); + if (e.type === "pointerup") { + this.#onSelectEnd("main_toolbar"); + } + }; + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); + } + } + #onSelectEnd(methodOfCreation = "") { + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.highlightSelection(methodOfCreation); + } else if (this.#enableHighlightFloatingButton) { + this.#displayHighlightToolbar(); + } + } + #addSelectionListener() { + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); + } + #addFocusManager() { + if (this.#focusManagerAC) { + return; + } + this.#focusManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#focusManagerAC); + window.addEventListener("focus", this.focus.bind(this), { + signal + }); + window.addEventListener("blur", this.blur.bind(this), { + signal + }); + } + #removeFocusManager() { + this.#focusManagerAC?.abort(); + this.#focusManagerAC = null; + } + blur() { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + if (!this.hasSelection) { + return; + } + const { + activeElement + } = document; + for (const editor of this.#selectedEditors) { + if (editor.div.contains(activeElement)) { + this.#lastActiveElement = [editor, activeElement]; + editor._focusEventsAllowed = false; + break; + } + } + } + focus() { + if (!this.#lastActiveElement) { + return; + } + const [lastEditor, lastActiveElement] = this.#lastActiveElement; + this.#lastActiveElement = null; + lastActiveElement.addEventListener("focusin", () => { + lastEditor._focusEventsAllowed = true; + }, { + once: true, + signal: this._signal + }); + lastActiveElement.focus(); + } + #addKeyboardManager() { + if (this.#keyboardManagerAC) { + return; + } + this.#keyboardManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#keyboardManagerAC); + window.addEventListener("keydown", this.keydown.bind(this), { + signal + }); + window.addEventListener("keyup", this.keyup.bind(this), { + signal + }); + } + #removeKeyboardManager() { + this.#keyboardManagerAC?.abort(); + this.#keyboardManagerAC = null; + } + #addCopyPasteListeners() { + if (this.#copyPasteAC) { + return; + } + this.#copyPasteAC = new AbortController(); + const signal = this.combinedSignal(this.#copyPasteAC); + document.addEventListener("copy", this.copy.bind(this), { + signal + }); + document.addEventListener("cut", this.cut.bind(this), { + signal + }); + document.addEventListener("paste", this.paste.bind(this), { + signal + }); + } + #removeCopyPasteListeners() { + this.#copyPasteAC?.abort(); + this.#copyPasteAC = null; + } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } + addEditListeners() { + this.#addKeyboardManager(); + this.#addCopyPasteListeners(); + } + removeEditListeners() { + this.#removeKeyboardManager(); + this.#removeCopyPasteListeners(); + } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; + } + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); + return; + } + } + } + } + copy(event) { + event.preventDefault(); + this.#activeEditor?.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of this.#selectedEditors) { + const serialized = editor.serialize(true); + if (serialized) { + editors.push(serialized); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + async paste(event) { + event.preventDefault(); + const { + clipboardData + } = event; + for (const item of clipboardData.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + return; + } + } + } + let data = clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + warn(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = this.currentLayer; + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = await layer.deserialize(editor); + if (!deserializedEditor) { + return; + } + newEditors.push(deserializedEditor); + } + const cmd = () => { + for (const editor of newEditors) { + this.#addEditorToLayer(editor); + } + this.#selectEditors(newEditors); + }; + const undo = () => { + for (const editor of newEditors) { + editor.remove(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } catch (ex) { + warn(`paste: "${ex.message}".`); + } + } + keydown(event) { + if (!this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = true; + } + if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } + } + keyup(event) { + if (this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + } + } + onEditingAction({ + name + }) { + switch (name) { + case "undo": + case "redo": + case "delete": + case "selectAll": + this[name](); + break; + case "highlightSelection": + this.highlightSelection("context_menu"); + break; + } + } + #dispatchUpdateStates(details) { + const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); + if (hasChanged) { + this._eventBus.dispatch("annotationeditorstateschanged", { + source: this, + details: Object.assign(this.#previousStates, details) + }); + if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); + } + } + } + #dispatchUpdateUI(details) { + this._eventBus.dispatch("annotationeditorparamschanged", { + source: this, + details + }); + } + setEditingState(isEditing) { + if (isEditing) { + this.#addFocusManager(); + this.#addCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: this.#mode !== AnnotationEditorType.NONE, + isEmpty: this.#isEmpty(), + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + hasSelectedEditor: false + }); + } else { + this.#removeFocusManager(); + this.#removeCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: false + }); + this.disableUserSelect(false); + } + } + registerEditorTypes(types) { + if (this.#editorTypes) { + return; + } + this.#editorTypes = types; + for (const editorType of this.#editorTypes) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + } + getId() { + return this.#idManager.id; + } + get currentLayer() { + return this.#allLayers.get(this.#currentPageIndex); + } + getLayer(pageIndex) { + return this.#allLayers.get(pageIndex); + } + get currentPageIndex() { + return this.#currentPageIndex; + } + addLayer(layer) { + this.#allLayers.set(layer.pageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } + } + removeLayer(layer) { + this.#allLayers.delete(layer.pageIndex); + } + async updateMode(mode, editId = null, isFromKeyboard = false) { + if (this.#mode === mode) { + return; + } + if (this.#updateModeCapability) { + await this.#updateModeCapability.promise; + if (!this.#updateModeCapability) { + return; + } + } + this.#updateModeCapability = Promise.withResolvers(); + this.#mode = mode; + if (mode === AnnotationEditorType.NONE) { + this.setEditingState(false); + this.#disableAll(); + this._editorUndoBar?.hide(); + this.#updateModeCapability.resolve(); + return; + } + this.setEditingState(true); + await this.#enableAll(); + this.unselectAll(); + for (const layer of this.#allLayers.values()) { + layer.updateMode(mode); + } + if (!editId) { + if (isFromKeyboard) { + this.addNewEditorFromKeyboard(); + } + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + if (editor.annotationElementId === editId) { + this.setSelected(editor); + editor.enterInEditMode(); + } else { + editor.unselect(); + } + } + this.#updateModeCapability.resolve(); + } + addNewEditorFromKeyboard() { + if (this.currentLayer.canCreateNewEmptyEditor()) { + this.currentLayer.addNewEditor(); + } + } + updateToolbar(mode) { + if (mode === this.#mode) { + return; + } + this._eventBus.dispatch("switchannotationeditormode", { + source: this, + mode + }); + } + updateParams(type, value) { + if (!this.#editorTypes) { + return; + } + switch (type) { + case AnnotationEditorParamsType.CREATE: + this.currentLayer.addNewEditor(); + return; + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + this.#mainHighlightColorPicker?.updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + this._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + type: "highlight", + action: "toggle_visibility" + } + } + }); + (this.#showAllStates ||= new Map()).set(type, value); + this.showAllEditors("highlight", value); + break; + } + for (const editor of this.#selectedEditors) { + editor.updateParams(type, value); + } + for (const editorType of this.#editorTypes) { + editorType.updateDefaultParams(type, value); + } + } + showAllEditors(type, visible, updateButton = false) { + for (const editor of this.#allEditors.values()) { + if (editor.editorType === type) { + editor.show(visible); + } + } + const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; + if (state !== visible) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); + } + } + enableWaiting(mustWait = false) { + if (this.#isWaiting === mustWait) { + return; + } + this.#isWaiting = mustWait; + for (const layer of this.#allLayers.values()) { + if (mustWait) { + layer.disableClick(); + } else { + layer.enableClick(); + } + layer.div.classList.toggle("waiting", mustWait); + } + } + async #enableAll() { + if (!this.#isEnabled) { + this.#isEnabled = true; + const promises = []; + for (const layer of this.#allLayers.values()) { + promises.push(layer.enable()); + } + await Promise.all(promises); + for (const editor of this.#allEditors.values()) { + editor.enable(); + } + } + } + #disableAll() { + this.unselectAll(); + if (this.#isEnabled) { + this.#isEnabled = false; + for (const layer of this.#allLayers.values()) { + layer.disable(); + } + for (const editor of this.#allEditors.values()) { + editor.disable(); + } + } + } + getEditors(pageIndex) { + const editors = []; + for (const editor of this.#allEditors.values()) { + if (editor.pageIndex === pageIndex) { + editors.push(editor); + } + } + return editors; + } + getEditor(id) { + return this.#allEditors.get(id); + } + addEditor(editor) { + this.#allEditors.set(editor.id, editor); + } + removeEditor(editor) { + if (editor.div.contains(document.activeElement)) { + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + } + this.#focusMainContainerTimeoutId = setTimeout(() => { + this.focusMainContainer(); + this.#focusMainContainerTimeoutId = null; + }, 0); + } + this.#allEditors.delete(editor.id); + this.unselect(editor); + if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { + this.#annotationStorage?.remove(editor.id); + } + } + addDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.add(editor.annotationElementId); + this.addChangedExistingAnnotation(editor); + editor.deleted = true; + } + isDeletedAnnotationElement(annotationElementId) { + return this.#deletedAnnotationsElementIds.has(annotationElementId); + } + removeDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); + this.removeChangedExistingAnnotation(editor); + editor.deleted = false; + } + #addEditorToLayer(editor) { + const layer = this.#allLayers.get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + } + } + setActiveEditor(editor) { + if (this.#activeEditor === editor) { + return; + } + this.#activeEditor = editor; + if (editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + get #lastSelectedEditor() { + let ed = null; + for (ed of this.#selectedEditors) {} + return ed; + } + updateUI(editor) { + if (this.#lastSelectedEditor === editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + updateUIForDefaultProperties(editorType) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + toggleSelected(editor) { + if (this.#selectedEditors.has(editor)) { + this.#selectedEditors.delete(editor); + editor.unselect(); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + return; + } + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + setSelected(editor) { + this.#currentDrawingSession?.commitOrRemove(); + for (const ed of this.#selectedEditors) { + if (ed !== editor) { + ed.unselect(); + } + } + this.#selectedEditors.clear(); + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + isSelected(editor) { + return this.#selectedEditors.has(editor); + } + get firstSelectedEditor() { + return this.#selectedEditors.values().next().value; + } + unselect(editor) { + editor.unselect(); + this.#selectedEditors.delete(editor); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + get hasSelection() { + return this.#selectedEditors.size !== 0; + } + get isEnterHandled() { + return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; + } + undo() { + this.#commandManager.undo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: this.#isEmpty() + }); + this._editorUndoBar?.hide(); + } + redo() { + this.#commandManager.redo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + isEmpty: this.#isEmpty() + }); + } + addCommands(params) { + this.#commandManager.add(params); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: false, + isEmpty: this.#isEmpty() + }); + } + cleanUndoStack(type) { + this.#commandManager.cleanType(type); + } + #isEmpty() { + if (this.#allEditors.size === 0) { + return true; + } + if (this.#allEditors.size === 1) { + for (const editor of this.#allEditors.values()) { + return editor.isEmpty(); + } + } + return false; + } + delete() { + this.commitOrRemove(); + const drawingEditor = this.currentLayer?.endDrawingSession(true); + if (!this.hasSelection && !drawingEditor) { + return; + } + const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors]; + const cmd = () => { + this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length); + for (const editor of editors) { + editor.remove(); + } + }; + const undo = () => { + for (const editor of editors) { + this.#addEditorToLayer(editor); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + commitOrRemove() { + this.#activeEditor?.commitOrRemove(); + } + hasSomethingToControl() { + return this.#activeEditor || this.hasSelection; + } + #selectEditors(editors) { + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + this.#selectedEditors.add(editor); + editor.select(); + } + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + selectAll() { + for (const editor of this.#selectedEditors) { + editor.commit(); + } + this.#selectEditors(this.#allEditors.values()); + } + unselectAll() { + if (this.#activeEditor) { + this.#activeEditor.commitOrRemove(); + if (this.#mode !== AnnotationEditorType.NONE) { + return; + } + } + if (this.#currentDrawingSession?.commitOrRemove()) { + return; + } + if (!this.hasSelection) { + return; + } + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + this.#dispatchUpdateStates({ + hasSelectedEditor: false + }); + } + translateSelectedEditors(x, y, noCommit = false) { + if (!noCommit) { + this.commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + this.#translation[0] += x; + this.#translation[1] += y; + const [totalX, totalY] = this.#translation; + const editors = [...this.#selectedEditors]; + const TIME_TO_WAIT = 1000; + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + } + this.#translationTimeoutId = setTimeout(() => { + this.#translationTimeoutId = null; + this.#translation[0] = this.#translation[1] = 0; + this.addCommands({ + cmd: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(totalX, totalY); + } + } + }, + undo: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(-totalX, -totalY); + } + } + }, + mustExec: false + }); + }, TIME_TO_WAIT); + for (const editor of editors) { + editor.translateInPage(x, y); + } + } + setUpDragSession() { + if (!this.hasSelection) { + return; + } + this.disableUserSelect(true); + this.#draggingEditors = new Map(); + for (const editor of this.#selectedEditors) { + this.#draggingEditors.set(editor, { + savedX: editor.x, + savedY: editor.y, + savedPageIndex: editor.pageIndex, + newX: 0, + newY: 0, + newPageIndex: -1 + }); + } + } + endDragSession() { + if (!this.#draggingEditors) { + return false; + } + this.disableUserSelect(false); + const map = this.#draggingEditors; + this.#draggingEditors = null; + let mustBeAddedInUndoStack = false; + for (const [{ + x, + y, + pageIndex + }, value] of map) { + value.newX = x; + value.newY = y; + value.newPageIndex = pageIndex; + mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; + } + if (!mustBeAddedInUndoStack) { + return false; + } + const move = (editor, x, y, pageIndex) => { + if (this.#allEditors.has(editor.id)) { + const parent = this.#allLayers.get(pageIndex); + if (parent) { + editor._setParentAndPosition(parent, x, y); + } else { + editor.pageIndex = pageIndex; + editor.x = x; + editor.y = y; + } + } + }; + this.addCommands({ + cmd: () => { + for (const [editor, { + newX, + newY, + newPageIndex + }] of map) { + move(editor, newX, newY, newPageIndex); + } + }, + undo: () => { + for (const [editor, { + savedX, + savedY, + savedPageIndex + }] of map) { + move(editor, savedX, savedY, savedPageIndex); + } + }, + mustExec: true + }); + return true; + } + dragSelectedEditors(tx, ty) { + if (!this.#draggingEditors) { + return; + } + for (const editor of this.#draggingEditors.keys()) { + editor.drag(tx, ty); + } + } + rebuild(editor) { + if (editor.parent === null) { + const parent = this.getLayer(editor.pageIndex); + if (parent) { + parent.changeParent(editor); + parent.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + editor.rebuild(); + } + } else { + editor.parent.addOrRebuild(editor); + } + } + get isEditorHandlingKeyboard() { + return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); + } + isActive(editor) { + return this.#activeEditor === editor; + } + getActive() { + return this.#activeEditor; + } + getMode() { + return this.#mode; + } + get imageManager() { + return shadow(this, "imageManager", new ImageManager()); + } + getSelectionBoxes(textLayer) { + if (!textLayer) { + return null; + } + const selection = document.getSelection(); + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { + return null; + } + } + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + let rotator; + switch (textLayer.getAttribute("data-main-rotation")) { + case "90": + rotator = (x, y, w, h) => ({ + x: (y - layerY) / parentHeight, + y: 1 - (x + w - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + case "180": + rotator = (x, y, w, h) => ({ + x: 1 - (x + w - layerX) / parentWidth, + y: 1 - (y + h - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + case "270": + rotator = (x, y, w, h) => ({ + x: 1 - (y + h - layerY) / parentHeight, + y: (x - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + default: + rotator = (x, y, w, h) => ({ + x: (x - layerX) / parentWidth, + y: (y - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + } + const boxes = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + for (const { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + boxes.push(rotator(x, y, width, height)); + } + } + return boxes.length === 0 ? null : boxes; + } + addChangedExistingAnnotation({ + annotationElementId, + id + }) { + (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id); + } + removeChangedExistingAnnotation({ + annotationElementId + }) { + this.#changedExistingAnnotations?.delete(annotationElementId); + } + renderAnnotationElement(annotation) { + const editorId = this.#changedExistingAnnotations?.get(annotation.data.id); + if (!editorId) { + return; + } + const editor = this.#annotationStorage.getRawValue(editorId); + if (!editor) { + return; + } + if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) { + return; + } + editor.renderAnnotationElement(annotation); + } +} + +;// ./src/display/editor/alt_text.js + +class AltText { + #altText = null; + #altTextDecorative = false; + #altTextButton = null; + #altTextButtonLabel = null; + #altTextTooltip = null; + #altTextTooltipTimeout = null; + #altTextWasFromKeyBoard = false; + #badge = null; + #editor = null; + #guessedText = null; + #textWithDisclaimer = null; + #useNewAltTextFlow = false; + static #l10nNewButton = null; + static _l10n = null; + constructor(editor) { + this.#editor = editor; + this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow; + AltText.#l10nNewButton ||= Object.freeze({ + added: "pdfjs-editor-new-alt-text-added-button", + "added-label": "pdfjs-editor-new-alt-text-added-button-label", + missing: "pdfjs-editor-new-alt-text-missing-button", + "missing-label": "pdfjs-editor-new-alt-text-missing-button-label", + review: "pdfjs-editor-new-alt-text-to-review-button", + "review-label": "pdfjs-editor-new-alt-text-to-review-button-label" + }); + } + static initialize(l10n) { + AltText._l10n ??= l10n; + } + async render() { + const altText = this.#altTextButton = document.createElement("button"); + altText.className = "altText"; + altText.tabIndex = "0"; + const label = this.#altTextButtonLabel = document.createElement("span"); + altText.append(label); + if (this.#useNewAltTextFlow) { + altText.classList.add("new"); + altText.setAttribute("data-l10n-id", AltText.#l10nNewButton.missing); + label.setAttribute("data-l10n-id", AltText.#l10nNewButton["missing-label"]); + } else { + altText.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"); + label.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"); + } + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal + }); + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + this.#editor._uiManager.editAltText(this.#editor); + if (this.#useNewAltTextFlow) { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_clicked", + data: { + label: this.#label + } + }); + } + }; + altText.addEventListener("click", onClick, { + capture: true, + signal + }); + altText.addEventListener("keydown", event => { + if (event.target === altText && event.key === "Enter") { + this.#altTextWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + await this.#setState(); + return altText; + } + get #label() { + return this.#altText && "added" || this.#altText === null && this.guessedText && "review" || "missing"; + } + finish() { + if (!this.#altTextButton) { + return; + } + this.#altTextButton.focus({ + focusVisible: this.#altTextWasFromKeyBoard + }); + this.#altTextWasFromKeyBoard = false; + } + isEmpty() { + if (this.#useNewAltTextFlow) { + return this.#altText === null; + } + return !this.#altText && !this.#altTextDecorative; + } + hasData() { + if (this.#useNewAltTextFlow) { + return this.#altText !== null || !!this.#guessedText; + } + return this.isEmpty(); + } + get guessedText() { + return this.#guessedText; + } + async setGuessedText(guessedText) { + if (this.#altText !== null) { + return; + } + this.#guessedText = guessedText; + this.#textWithDisclaimer = await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", { + generatedAltText: guessedText + }); + this.#setState(); + } + toggleAltTextBadge(visibility = false) { + if (!this.#useNewAltTextFlow || this.#altText) { + this.#badge?.remove(); + this.#badge = null; + return; + } + if (!this.#badge) { + const badge = this.#badge = document.createElement("div"); + badge.className = "noAltTextBadge"; + this.#editor.div.append(badge); + } + this.#badge.classList.toggle("hidden", !visibility); + } + serialize(isForCopying) { + let altText = this.#altText; + if (!isForCopying && this.#guessedText === altText) { + altText = this.#textWithDisclaimer; + } + return { + altText, + decorative: this.#altTextDecorative, + guessedText: this.#guessedText, + textWithDisclaimer: this.#textWithDisclaimer + }; + } + get data() { + return { + altText: this.#altText, + decorative: this.#altTextDecorative + }; + } + set data({ + altText, + decorative, + guessedText, + textWithDisclaimer, + cancel = false + }) { + if (guessedText) { + this.#guessedText = guessedText; + this.#textWithDisclaimer = textWithDisclaimer; + } + if (this.#altText === altText && this.#altTextDecorative === decorative) { + return; + } + if (!cancel) { + this.#altText = altText; + this.#altTextDecorative = decorative; + } + this.#setState(); + } + toggle(enabled = false) { + if (!this.#altTextButton) { + return; + } + if (!enabled && this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextButton.disabled = !enabled; + } + shown() { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_displayed", + data: { + label: this.#label + } + }); + } + destroy() { + this.#altTextButton?.remove(); + this.#altTextButton = null; + this.#altTextButtonLabel = null; + this.#altTextTooltip = null; + this.#badge?.remove(); + this.#badge = null; + } + async #setState() { + const button = this.#altTextButton; + if (!button) { + return; + } + if (this.#useNewAltTextFlow) { + button.classList.toggle("done", !!this.#altText); + button.setAttribute("data-l10n-id", AltText.#l10nNewButton[this.#label]); + this.#altTextButtonLabel?.setAttribute("data-l10n-id", AltText.#l10nNewButton[`${this.#label}-label`]); + if (!this.#altText) { + this.#altTextTooltip?.remove(); + return; + } + } else { + if (!this.#altText && !this.#altTextDecorative) { + button.classList.remove("done"); + this.#altTextTooltip?.remove(); + return; + } + button.classList.add("done"); + button.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button"); + } + let tooltip = this.#altTextTooltip; + if (!tooltip) { + this.#altTextTooltip = tooltip = document.createElement("span"); + tooltip.className = "tooltip"; + tooltip.setAttribute("role", "tooltip"); + tooltip.id = `alt-text-tooltip-${this.#editor.id}`; + const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true + }); + button.addEventListener("mouseenter", () => { + this.#altTextTooltipTimeout = setTimeout(() => { + this.#altTextTooltipTimeout = null; + this.#altTextTooltip.classList.add("show"); + this.#editor._reportTelemetry({ + action: "alt_text_tooltip" + }); + }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal + }); + button.addEventListener("mouseleave", () => { + if (this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextTooltip?.classList.remove("show"); + }, { + signal + }); + } + if (this.#altTextDecorative) { + tooltip.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip"); + } else { + tooltip.removeAttribute("data-l10n-id"); + tooltip.textContent = this.#altText; + } + if (!tooltip.parentNode) { + button.append(tooltip); + } + const element = this.#editor.getImageForAltText(); + element?.setAttribute("aria-describedby", tooltip.id); + } +} + +;// ./src/display/editor/editor.js + + + + + +class AnnotationEditor { + #accessibilityData = null; + #allResizerDivs = null; + #altText = null; + #disabled = false; + #dragPointerId = null; + #dragPointerType = ""; + #keepAspectRatio = false; + #resizersDiv = null; + #lastPointerCoords = null; + #savedDimensions = null; + #focusAC = null; + #focusedResizerName = ""; + #hasBeenClicked = false; + #initialRect = null; + #isEditing = false; + #isInEditMode = false; + #isResizerEnabledForKeyboard = false; + #moveInDOMTimeout = null; + #prevDragX = 0; + #prevDragY = 0; + #telemetryTimeouts = null; + _editToolbar = null; + _initialOptions = Object.create(null); + _initialData = null; + _isVisible = true; + _uiManager = null; + _focusEventsAllowed = true; + static _l10n = null; + static _l10nResizer = null; + #isDraggable = false; + #zIndex = AnnotationEditor._zIndex++; + static _borderLineWidth = -1; + static _colorManager = new ColorManager(); + static _zIndex = 1; + static _telemetryTimeout = 1000; + static get _resizerKeyboardManager() { + const resize = AnnotationEditor.prototype._resizeWithKeyboard; + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], resize, { + args: [-small, 0] + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { + args: [-big, 0] + }], [["ArrowRight", "mac+ArrowRight"], resize, { + args: [small, 0] + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { + args: [big, 0] + }], [["ArrowUp", "mac+ArrowUp"], resize, { + args: [0, -small] + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { + args: [0, -big] + }], [["ArrowDown", "mac+ArrowDown"], resize, { + args: [0, small] + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { + args: [0, big] + }], [["Escape", "mac+Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); + } + constructor(parameters) { + this.parent = parameters.parent; + this.id = parameters.id; + this.width = this.height = null; + this.pageIndex = parameters.parent.pageIndex; + this.name = parameters.name; + this.div = null; + this._uiManager = parameters.uiManager; + this.annotationElementId = null; + this._willKeepAspectRatio = false; + this._initialOptions.isCentered = parameters.isCentered; + this._structTreeParentId = null; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = this.parent.viewport; + this.rotation = rotation; + this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; + this.pageDimensions = [pageWidth, pageHeight]; + this.pageTranslation = [pageX, pageY]; + const [width, height] = this.parentDimensions; + this.x = parameters.x / width; + this.y = parameters.y / height; + this.isAttachedToDOM = false; + this.deleted = false; + } + get editorType() { + return Object.getPrototypeOf(this).constructor._type; + } + static get isDrawer() { + return false; + } + static get _defaultLineColor() { + return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + static deleteAnnotationElement(editor) { + const fakeEditor = new FakeEditor({ + id: editor.parent.getNextId(), + parent: editor.parent, + uiManager: editor._uiManager + }); + fakeEditor.annotationElementId = editor.annotationElementId; + fakeEditor.deleted = true; + fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + } + static initialize(l10n, _uiManager) { + AnnotationEditor._l10n ??= l10n; + AnnotationEditor._l10nResizer ||= Object.freeze({ + topLeft: "pdfjs-editor-resizer-top-left", + topMiddle: "pdfjs-editor-resizer-top-middle", + topRight: "pdfjs-editor-resizer-top-right", + middleRight: "pdfjs-editor-resizer-middle-right", + bottomRight: "pdfjs-editor-resizer-bottom-right", + bottomMiddle: "pdfjs-editor-resizer-bottom-middle", + bottomLeft: "pdfjs-editor-resizer-bottom-left", + middleLeft: "pdfjs-editor-resizer-middle-left" + }); + if (AnnotationEditor._borderLineWidth !== -1) { + return; + } + const style = getComputedStyle(document.documentElement); + AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + } + static updateDefaultParams(_type, _value) {} + static get defaultPropertiesToUpdate() { + return []; + } + static isHandlingMimeForPasting(mime) { + return false; + } + static paste(item, parent) { + unreachable("Not implemented"); + } + get propertiesToUpdate() { + return []; + } + get _isDraggable() { + return this.#isDraggable; + } + set _isDraggable(value) { + this.#isDraggable = value; + this.div?.classList.toggle("draggable", value); + } + get isEnterHandled() { + return true; + } + center() { + const [pageWidth, pageHeight] = this.pageDimensions; + switch (this.parentRotation) { + case 90: + this.x -= this.height * pageHeight / (pageWidth * 2); + this.y += this.width * pageWidth / (pageHeight * 2); + break; + case 180: + this.x += this.width / 2; + this.y += this.height / 2; + break; + case 270: + this.x += this.height * pageHeight / (pageWidth * 2); + this.y -= this.width * pageWidth / (pageHeight * 2); + break; + default: + this.x -= this.width / 2; + this.y -= this.height / 2; + break; + } + this.fixAndSetPosition(); + } + addCommands(params) { + this._uiManager.addCommands(params); + } + get currentLayer() { + return this._uiManager.currentLayer; + } + setInBackground() { + this.div.style.zIndex = 0; + } + setInForeground() { + this.div.style.zIndex = this.#zIndex; + } + setParent(parent) { + if (parent !== null) { + this.pageIndex = parent.pageIndex; + this.pageDimensions = parent.pageDimensions; + } else { + this.#stopResizing(); + } + this.parent = parent; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.#hasBeenClicked) { + this.parent.setSelected(this); + } else { + this.#hasBeenClicked = false; + } + } + focusout(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.isAttachedToDOM) { + return; + } + const target = event.relatedTarget; + if (target?.closest(`#${this.id}`)) { + return; + } + event.preventDefault(); + if (!this.parent?.isMultipleSelection) { + this.commitOrRemove(); + } + } + commitOrRemove() { + if (this.isEmpty()) { + this.remove(); + } else { + this.commit(); + } + } + commit() { + this.addToAnnotationStorage(); + } + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + setAt(x, y, tx, ty) { + const [width, height] = this.parentDimensions; + [tx, ty] = this.screenToPageTranslation(tx, ty); + this.x = (x + tx) / width; + this.y = (y + ty) / height; + this.fixAndSetPosition(); + } + #translate([width, height], x, y) { + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this._onTranslating(this.x, this.y); + this.fixAndSetPosition(); + } + translate(x, y) { + this.#translate(this.parentDimensions, x, y); + } + translateInPage(x, y) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.#translate(this.pageDimensions, x, y); + this.div.scrollIntoView({ + block: "nearest" + }); + } + drag(tx, ty) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + const { + div, + parentDimensions: [parentWidth, parentHeight] + } = this; + this.x += tx / parentWidth; + this.y += ty / parentHeight; + if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { + const { + x, + y + } = this.div.getBoundingClientRect(); + if (this.parent.findNewParent(this, x, y)) { + this.x -= Math.floor(this.x); + this.y -= Math.floor(this.y); + } + } + let { + x, + y + } = this; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + const { + style + } = div; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this._onTranslating(x, y); + div.scrollIntoView({ + block: "nearest" + }); + } + _onTranslating(x, y) {} + _onTranslated(x, y) {} + get _hasBeenMoved() { + return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y); + } + get _hasBeenResized() { + return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height); + } + getBaseTranslation() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + _borderLineWidth + } = AnnotationEditor; + const x = _borderLineWidth / parentWidth; + const y = _borderLineWidth / parentHeight; + switch (this.rotation) { + case 90: + return [-x, y]; + case 180: + return [x, y]; + case 270: + return [x, -y]; + default: + return [-x, -y]; + } + } + get _mustFixPosition() { + return true; + } + fixAndSetPosition(rotation = this.rotation) { + const { + div: { + style + }, + pageDimensions: [pageWidth, pageHeight] + } = this; + let { + x, + y, + width, + height + } = this; + width *= pageWidth; + height *= pageHeight; + x *= pageWidth; + y *= pageHeight; + if (this._mustFixPosition) { + switch (rotation) { + case 0: + x = Math.max(0, Math.min(pageWidth - width, x)); + y = Math.max(0, Math.min(pageHeight - height, y)); + break; + case 90: + x = Math.max(0, Math.min(pageWidth - height, x)); + y = Math.min(pageHeight, Math.max(width, y)); + break; + case 180: + x = Math.min(pageWidth, Math.max(width, x)); + y = Math.min(pageHeight, Math.max(height, y)); + break; + case 270: + x = Math.min(pageWidth, Math.max(height, x)); + y = Math.max(0, Math.min(pageHeight - width, y)); + break; + } + } + this.x = x /= pageWidth; + this.y = y /= pageHeight; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this.moveInDOM(); + } + static #rotatePoint(x, y, angle) { + switch (angle) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } + } + screenToPageTranslation(x, y) { + return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); + } + pageTranslationToScreen(x, y) { + return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); + } + #getRotationMatrix(rotation) { + switch (rotation) { + case 90: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; + } + case 180: + return [-1, 0, 0, -1]; + case 270: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; + } + default: + return [1, 0, 0, 1]; + } + } + get parentScale() { + return this._uiManager.viewParameters.realScale; + } + get parentRotation() { + return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; + } + get parentDimensions() { + const { + parentScale, + pageDimensions: [pageWidth, pageHeight] + } = this; + return [pageWidth * parentScale, pageHeight * parentScale]; + } + setDims(width, height) { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + style + } = this.div; + style.width = `${(100 * width / parentWidth).toFixed(2)}%`; + if (!this.#keepAspectRatio) { + style.height = `${(100 * height / parentHeight).toFixed(2)}%`; + } + } + fixDims() { + const { + style + } = this.div; + const { + height, + width + } = style; + const widthPercent = width.endsWith("%"); + const heightPercent = !this.#keepAspectRatio && height.endsWith("%"); + if (widthPercent && heightPercent) { + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + if (!widthPercent) { + style.width = `${(100 * parseFloat(width) / parentWidth).toFixed(2)}%`; + } + if (!this.#keepAspectRatio && !heightPercent) { + style.height = `${(100 * parseFloat(height) / parentHeight).toFixed(2)}%`; + } + } + getInitialTranslation() { + return [0, 0]; + } + #createResizers() { + if (this.#resizersDiv) { + return; + } + this.#resizersDiv = document.createElement("div"); + this.#resizersDiv.classList.add("resizers"); + const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; + for (const name of classes) { + const div = document.createElement("div"); + this.#resizersDiv.append(div); + div.classList.add("resizer", name); + div.setAttribute("data-resizer-name", name); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.tabIndex = -1; + } + this.div.prepend(this.#resizersDiv); + } + #resizerPointerdown(name, event) { + event.preventDefault(); + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#altText?.toggle(false); + const savedDraggable = this._isDraggable; + this._isDraggable = false; + this.#lastPointerCoords = [event.screenX, event.screenY]; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + this.parent.togglePointerEvents(false); + window.addEventListener("pointermove", this.#resizerPointermove.bind(this, name), { + passive: true, + capture: true, + signal + }); + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const savedParentCursor = this.parent.div.style.cursor; + const savedCursor = this.div.style.cursor; + this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; + const pointerUpCallback = () => { + ac.abort(); + this.parent.togglePointerEvents(true); + this.#altText?.toggle(true); + this._isDraggable = savedDraggable; + this.parent.div.style.cursor = savedParentCursor; + this.div.style.cursor = savedCursor; + this.#addResizeToUndoStack(); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + #resize(x, y, width, height) { + this.width = width; + this.height = height; + this.x = x; + this.y = y; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(parentWidth * width, parentHeight * height); + this.fixAndSetPosition(); + this._onResized(); + } + _onResized() {} + #addResizeToUndoStack() { + if (!this.#savedDimensions) { + return; + } + const { + savedX, + savedY, + savedWidth, + savedHeight + } = this.#savedDimensions; + this.#savedDimensions = null; + const newX = this.x; + const newY = this.y; + const newWidth = this.width; + const newHeight = this.height; + if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.addCommands({ + cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight), + undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight), + mustExec: true + }); + } + #resizerPointermove(name, event) { + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + const round = x => Math.round(x * 10000) / 10000; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); + const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; + let getPoint; + let getOpposite; + let isDiagonal = false; + let isHorizontal = false; + switch (name) { + case "topLeft": + isDiagonal = true; + getPoint = (w, h) => [0, 0]; + getOpposite = (w, h) => [w, h]; + break; + case "topMiddle": + getPoint = (w, h) => [w / 2, 0]; + getOpposite = (w, h) => [w / 2, h]; + break; + case "topRight": + isDiagonal = true; + getPoint = (w, h) => [w, 0]; + getOpposite = (w, h) => [0, h]; + break; + case "middleRight": + isHorizontal = true; + getPoint = (w, h) => [w, h / 2]; + getOpposite = (w, h) => [0, h / 2]; + break; + case "bottomRight": + isDiagonal = true; + getPoint = (w, h) => [w, h]; + getOpposite = (w, h) => [0, 0]; + break; + case "bottomMiddle": + getPoint = (w, h) => [w / 2, h]; + getOpposite = (w, h) => [w / 2, 0]; + break; + case "bottomLeft": + isDiagonal = true; + getPoint = (w, h) => [0, h]; + getOpposite = (w, h) => [w, 0]; + break; + case "middleLeft": + isHorizontal = true; + getPoint = (w, h) => [0, h / 2]; + getOpposite = (w, h) => [w, h / 2]; + break; + } + const point = getPoint(savedWidth, savedHeight); + const oppositePoint = getOpposite(savedWidth, savedHeight); + let transfOppositePoint = transf(...oppositePoint); + const oppositeX = round(savedX + transfOppositePoint[0]); + const oppositeY = round(savedY + transfOppositePoint[1]); + let ratioX = 1; + let ratioY = 1; + let deltaX, deltaY; + if (!event.fromKeyboard) { + const { + screenX, + screenY + } = event; + const [lastScreenX, lastScreenY] = this.#lastPointerCoords; + [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY); + this.#lastPointerCoords[0] = screenX; + this.#lastPointerCoords[1] = screenY; + } else { + ({ + deltaX, + deltaY + } = event); + } + [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); + if (isDiagonal) { + const oldDiag = Math.hypot(savedWidth, savedHeight); + ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + } else if (isHorizontal) { + ratioX = Math.max(minWidth, Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))) / savedWidth; + } else { + ratioY = Math.max(minHeight, Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))) / savedHeight; + } + const newWidth = round(savedWidth * ratioX); + const newHeight = round(savedHeight * ratioY); + transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); + const newX = oppositeX - transfOppositePoint[0]; + const newY = oppositeY - transfOppositePoint[1]; + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.fixAndSetPosition(); + this._onResizing(); + } + _onResizing() {} + altTextFinish() { + this.#altText?.finish(); + } + async addEditToolbar() { + if (this._editToolbar || this.#isInEditMode) { + return this._editToolbar; + } + this._editToolbar = new EditorToolbar(this); + this.div.append(this._editToolbar.render()); + if (this.#altText) { + await this._editToolbar.addAltText(this.#altText); + } + return this._editToolbar; + } + removeEditToolbar() { + if (!this._editToolbar) { + return; + } + this._editToolbar.remove(); + this._editToolbar = null; + this.#altText?.destroy(); + } + addContainer(container) { + const editToolbarDiv = this._editToolbar?.div; + if (editToolbarDiv) { + editToolbarDiv.before(container); + } else { + this.div.append(container); + } + } + getClientDimensions() { + return this.div.getBoundingClientRect(); + } + async addAltTextButton() { + if (this.#altText) { + return; + } + AltText.initialize(AnnotationEditor._l10n); + this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } + await this.addEditToolbar(); + } + get altTextData() { + return this.#altText?.data; + } + set altTextData(data) { + if (!this.#altText) { + return; + } + this.#altText.data = data; + } + get guessedAltText() { + return this.#altText?.guessedText; + } + async setGuessedAltText(text) { + await this.#altText?.setGuessedText(text); + } + serializeAltText(isForCopying) { + return this.#altText?.serialize(isForCopying); + } + hasAltText() { + return !!this.#altText && !this.#altText.isEmpty(); + } + hasAltTextData() { + return this.#altText?.hasData() ?? false; + } + render() { + this.div = document.createElement("div"); + this.div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + this.div.className = this.name; + this.div.setAttribute("id", this.id); + this.div.tabIndex = this.#disabled ? -1 : 0; + if (!this._isVisible) { + this.div.classList.add("hidden"); + } + this.setInForeground(); + this.#addFocusListeners(); + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.parentRotation % 180 !== 0) { + this.div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; + this.div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; + } + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + bindEvents(this, this.div, ["pointerdown"]); + this._uiManager._editorUndoBar?.hide(); + return this.div; + } + pointerdown(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; + } + this.#hasBeenClicked = true; + if (this._isDraggable) { + this.#setUpDragSession(event); + return; + } + this.#selectOnPointerEvent(event); + } + get isSelected() { + return this._uiManager.isSelected(this); + } + #selectOnPointerEvent(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } + } + #setUpDragSession(event) { + const { + isSelected + } = this; + this._uiManager.setUpDragSession(); + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + const opts = { + capture: true, + passive: false, + signal + }; + const cancelDrag = e => { + ac.abort(); + this.#dragPointerId = null; + this.#hasBeenClicked = false; + if (!this._uiManager.endDragSession()) { + this.#selectOnPointerEvent(e); + } + }; + if (isSelected) { + this.#prevDragX = event.clientX; + this.#prevDragY = event.clientY; + this.#dragPointerId = event.pointerId; + this.#dragPointerType = event.pointerType; + window.addEventListener("pointermove", e => { + const { + clientX: x, + clientY: y, + pointerId + } = e; + if (pointerId !== this.#dragPointerId) { + stopEvent(e); + return; + } + const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); + this.#prevDragX = x; + this.#prevDragY = y; + this._uiManager.dragSelectedEditors(tx, ty); + }, opts); + window.addEventListener("touchmove", stopEvent, opts); + window.addEventListener("pointerdown", e => { + if (e.isPrimary && e.pointerType === this.#dragPointerType) { + cancelDrag(e); + } + stopEvent(e); + }, opts); + } + this._onStartDragging(); + const pointerUpCallback = e => { + if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) { + cancelDrag(e); + this._onStopDragging(); + return; + } + stopEvent(e); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + _onStartDragging() {} + _onStopDragging() {} + moveInDOM() { + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + } + this.#moveInDOMTimeout = setTimeout(() => { + this.#moveInDOMTimeout = null; + this.parent?.moveEditorInDOM(this); + }, 0); + } + _setParentAndPosition(parent, x, y) { + parent.changeParent(this); + this.x = x; + this.y = y; + this.fixAndSetPosition(); + this._onTranslated(); + } + getRect(tx, ty, rotation = this.rotation) { + const scale = this.parentScale; + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const shiftX = tx / scale; + const shiftY = ty / scale; + const x = this.x * pageWidth; + const y = this.y * pageHeight; + const width = this.width * pageWidth; + const height = this.height * pageHeight; + switch (rotation) { + case 0: + return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; + case 90: + return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; + case 180: + return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; + case 270: + return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; + default: + throw new Error("Invalid rotation"); + } + } + getRectInCurrentCoords(rect, pageHeight) { + const [x1, y1, x2, y2] = rect; + const width = x2 - x1; + const height = y2 - y1; + switch (this.rotation) { + case 0: + return [x1, pageHeight - y2, width, height]; + case 90: + return [x1, pageHeight - y1, height, width]; + case 180: + return [x2, pageHeight - y1, width, height]; + case 270: + return [x2, pageHeight - y2, height, width]; + default: + throw new Error("Invalid rotation"); + } + } + onceAdded() {} + isEmpty() { + return false; + } + enableEditMode() { + this.#isInEditMode = true; + } + disableEditMode() { + this.#isInEditMode = false; + } + isInEditMode() { + return this.#isInEditMode; + } + shouldGetKeyboardEvents() { + return this.#isResizerEnabledForKeyboard; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + get isOnScreen() { + const { + top, + left, + bottom, + right + } = this.getClientDimensions(); + const { + innerHeight, + innerWidth + } = window; + return left < innerWidth && right > 0 && top < innerHeight && bottom > 0; + } + #addFocusListeners() { + if (this.#focusAC || !this.div) { + return; + } + this.#focusAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#focusAC); + this.div.addEventListener("focusin", this.focusin.bind(this), { + signal + }); + this.div.addEventListener("focusout", this.focusout.bind(this), { + signal + }); + } + rebuild() { + this.#addFocusListeners(); + } + rotate(_angle) {} + resize() {} + serializeDeleted() { + return { + id: this.annotationElementId, + deleted: true, + pageIndex: this.pageIndex, + popupRef: this._initialData?.popupRef || "" + }; + } + serialize(isForCopying = false, context = null) { + unreachable("An editor must be serializable"); + } + static async deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: parent.getNextId(), + uiManager + }); + editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); + editor.x = x / pageWidth; + editor.y = y / pageHeight; + editor.width = width / pageWidth; + editor.height = height / pageHeight; + return editor; + } + get hasBeenModified() { + return !!this.annotationElementId && (this.deleted || this.serialize() !== null); + } + remove() { + this.#focusAC?.abort(); + this.#focusAC = null; + if (!this.isEmpty()) { + this.commit(); + } + if (this.parent) { + this.parent.remove(this); + } else { + this._uiManager.removeEditor(this); + } + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + this.#moveInDOMTimeout = null; + } + this.#stopResizing(); + this.removeEditToolbar(); + if (this.#telemetryTimeouts) { + for (const timeout of this.#telemetryTimeouts.values()) { + clearTimeout(timeout); + } + this.#telemetryTimeouts = null; + } + this.parent = null; + } + get isResizable() { + return false; + } + makeResizable() { + if (this.isResizable) { + this.#createResizers(); + this.#resizersDiv.classList.remove("hidden"); + bindEvents(this, this.div, ["keydown"]); + } + } + get toolbarPosition() { + return null; + } + keydown(event) { + if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + return; + } + this._uiManager.setSelected(this); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const children = this.#resizersDiv.children; + if (!this.#allResizerDivs) { + this.#allResizerDivs = Array.from(children); + const boundResizerKeydown = this.#resizerKeydown.bind(this); + const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; + for (const div of this.#allResizerDivs) { + const name = div.getAttribute("data-resizer-name"); + div.setAttribute("role", "spinbutton"); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); + div.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + const first = this.#allResizerDivs[0]; + let firstPosition = 0; + for (const div of children) { + if (div === first) { + break; + } + firstPosition++; + } + const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); + if (nextFirstPosition !== firstPosition) { + if (nextFirstPosition < firstPosition) { + for (let i = 0; i < firstPosition - nextFirstPosition; i++) { + this.#resizersDiv.append(this.#resizersDiv.firstChild); + } + } else if (nextFirstPosition > firstPosition) { + for (let i = 0; i < nextFirstPosition - firstPosition; i++) { + this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild); + } + } + let i = 0; + for (const child of children) { + const div = this.#allResizerDivs[i++]; + const name = div.getAttribute("data-resizer-name"); + child.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + this.#setResizerTabIndex(0); + this.#isResizerEnabledForKeyboard = true; + this.#resizersDiv.firstChild.focus({ + focusVisible: true + }); + event.preventDefault(); + event.stopImmediatePropagation(); + } + #resizerKeydown(event) { + AnnotationEditor._resizerKeyboardManager.exec(this, event); + } + #resizerBlur(event) { + if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { + this.#stopResizing(); + } + } + #resizerFocus(name) { + this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + } + #setResizerTabIndex(value) { + if (!this.#allResizerDivs) { + return; + } + for (const div of this.#allResizerDivs) { + div.tabIndex = value; + } + } + _resizeWithKeyboard(x, y) { + if (!this.#isResizerEnabledForKeyboard) { + return; + } + this.#resizerPointermove(this.#focusedResizerName, { + deltaX: x, + deltaY: y, + fromKeyboard: true + }); + } + #stopResizing() { + this.#isResizerEnabledForKeyboard = false; + this.#setResizerTabIndex(-1); + this.#addResizeToUndoStack(); + } + _stopResizingWithKeyboard() { + this.#stopResizing(); + this.div.focus(); + } + select() { + this.makeResizable(); + this.div?.classList.add("selectedEditor"); + if (!this._editToolbar) { + this.addEditToolbar().then(() => { + if (this.div?.classList.contains("selectedEditor")) { + this._editToolbar?.show(); + } + }); + return; + } + this._editToolbar?.show(); + this.#altText?.toggleAltTextBadge(false); + } + unselect() { + this.#resizersDiv?.classList.add("hidden"); + this.div?.classList.remove("selectedEditor"); + if (this.div?.contains(document.activeElement)) { + this._uiManager.currentLayer.div.focus({ + preventScroll: true + }); + } + this._editToolbar?.hide(); + this.#altText?.toggleAltTextBadge(true); + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + enterInEditMode() {} + getImageForAltText() { + return null; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return this.#isEditing; + } + set isEditing(value) { + this.#isEditing = value; + if (!this.parent) { + return; + } + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } + setAspectRatio(width, height) { + this.#keepAspectRatio = true; + const aspectRatio = width / height; + const { + style + } = this.div; + style.aspectRatio = aspectRatio; + style.height = "auto"; + } + static get MIN_SIZE() { + return 16; + } + static canCreateNewEmptyEditor() { + return true; + } + get telemetryInitialData() { + return { + action: "added" + }; + } + get telemetryFinalData() { + return null; + } + _reportTelemetry(data, mustWait = false) { + if (mustWait) { + this.#telemetryTimeouts ||= new Map(); + const { + action + } = data; + let timeout = this.#telemetryTimeouts.get(action); + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => { + this._reportTelemetry(data); + this.#telemetryTimeouts.delete(action); + if (this.#telemetryTimeouts.size === 0) { + this.#telemetryTimeouts = null; + } + }, AnnotationEditor._telemetryTimeout); + this.#telemetryTimeouts.set(action, timeout); + return; + } + data.type ||= this.editorType; + this._uiManager._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + show(visible = this._isVisible) { + this.div.classList.toggle("hidden", !visible); + this._isVisible = visible; + } + enable() { + if (this.div) { + this.div.tabIndex = 0; + } + this.#disabled = false; + } + disable() { + if (this.div) { + this.div.tabIndex = -1; + } + this.#disabled = true; + } + renderAnnotationElement(annotation) { + let content = annotation.container.querySelector(".annotationContent"); + if (!content) { + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + annotation.container.prepend(content); + } else if (content.nodeName === "CANVAS") { + const canvas = content; + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + canvas.before(content); + } + return content; + } + resetAnnotationElement(annotation) { + const { + firstChild + } = annotation.container; + if (firstChild?.nodeName === "DIV" && firstChild.classList.contains("annotationContent")) { + firstChild.remove(); + } + } +} +class FakeEditor extends AnnotationEditor { + constructor(params) { + super(params); + this.annotationElementId = params.annotationElementId; + this.deleted = true; + } + serialize() { + return this.serializeDeleted(); + } +} + +;// ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/display/annotation_storage.js + + + +const SerializableEmpty = Object.freeze({ + map: null, + hash: "", + transfer: undefined +}); +class AnnotationStorage { + #modified = false; + #modifiedIds = null; + #storage = new Map(); + constructor() { + this.onSetModified = null; + this.onResetModified = null; + this.onAnnotationEditor = null; + } + getValue(key, defaultValue) { + const value = this.#storage.get(key); + if (value === undefined) { + return defaultValue; + } + return Object.assign(defaultValue, value); + } + getRawValue(key) { + return this.#storage.get(key); + } + remove(key) { + this.#storage.delete(key); + if (this.#storage.size === 0) { + this.resetModified(); + } + if (typeof this.onAnnotationEditor === "function") { + for (const value of this.#storage.values()) { + if (value instanceof AnnotationEditor) { + return; + } + } + this.onAnnotationEditor(null); + } + } + setValue(key, value) { + const obj = this.#storage.get(key); + let modified = false; + if (obj !== undefined) { + for (const [entry, val] of Object.entries(value)) { + if (obj[entry] !== val) { + modified = true; + obj[entry] = val; + } + } + } else { + modified = true; + this.#storage.set(key, value); + } + if (modified) { + this.#setModified(); + } + if (value instanceof AnnotationEditor && typeof this.onAnnotationEditor === "function") { + this.onAnnotationEditor(value.constructor._type); + } + } + has(key) { + return this.#storage.has(key); + } + getAll() { + return this.#storage.size > 0 ? objectFromMap(this.#storage) : null; + } + setAll(obj) { + for (const [key, val] of Object.entries(obj)) { + this.setValue(key, val); + } + } + get size() { + return this.#storage.size; + } + #setModified() { + if (!this.#modified) { + this.#modified = true; + if (typeof this.onSetModified === "function") { + this.onSetModified(); + } + } + } + resetModified() { + if (this.#modified) { + this.#modified = false; + if (typeof this.onResetModified === "function") { + this.onResetModified(); + } + } + } + get print() { + return new PrintAnnotationStorage(this); + } + get serializable() { + if (this.#storage.size === 0) { + return SerializableEmpty; + } + const map = new Map(), + hash = new MurmurHash3_64(), + transfer = []; + const context = Object.create(null); + let hasBitmap = false; + for (const [key, val] of this.#storage) { + const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val; + if (serialized) { + map.set(key, serialized); + hash.update(`${key}:${JSON.stringify(serialized)}`); + hasBitmap ||= !!serialized.bitmap; + } + } + if (hasBitmap) { + for (const value of map.values()) { + if (value.bitmap) { + transfer.push(value.bitmap); + } + } + } + return map.size > 0 ? { + map, + hash: hash.hexdigest(), + transfer + } : SerializableEmpty; + } + get editorStats() { + let stats = null; + const typeToEditor = new Map(); + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor)) { + continue; + } + const editorStats = value.telemetryFinalData; + if (!editorStats) { + continue; + } + const { + type + } = editorStats; + if (!typeToEditor.has(type)) { + typeToEditor.set(type, Object.getPrototypeOf(value).constructor); + } + stats ||= Object.create(null); + const map = stats[type] ||= new Map(); + for (const [key, val] of Object.entries(editorStats)) { + if (key === "type") { + continue; + } + let counters = map.get(key); + if (!counters) { + counters = new Map(); + map.set(key, counters); + } + const count = counters.get(val) ?? 0; + counters.set(val, count + 1); + } + } + for (const [type, editor] of typeToEditor) { + stats[type] = editor.computeTelemetryFinalData(stats[type]); + } + return stats; + } + resetModifiedIds() { + this.#modifiedIds = null; + } + get modifiedIds() { + if (this.#modifiedIds) { + return this.#modifiedIds; + } + const ids = []; + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor) || !value.annotationElementId || !value.serialize()) { + continue; + } + ids.push(value.annotationElementId); + } + return this.#modifiedIds = { + ids: new Set(ids), + hash: ids.join(",") + }; + } +} +class PrintAnnotationStorage extends AnnotationStorage { + #serializable; + constructor(parent) { + super(); + const { + map, + hash, + transfer + } = parent.serializable; + const clone = structuredClone(map, transfer ? { + transfer + } : null); + this.#serializable = { + map: clone, + hash, + transfer + }; + } + get print() { + unreachable("Should not call PrintAnnotationStorage.print"); + } + get serializable() { + return this.#serializable; + } + get modifiedIds() { + return shadow(this, "modifiedIds", { + ids: new Set(), + hash: "" + }); + } +} + +;// ./src/display/font_loader.js + +class FontLoader { + #systemFonts = new Set(); + constructor({ + ownerDocument = globalThis.document, + styleElement = null + }) { + this._document = ownerDocument; + this.nativeFontFaces = new Set(); + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; + } + addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.add(nativeFontFace); + this._document.fonts.add(nativeFontFace); + } + removeNativeFontFace(nativeFontFace) { + this.nativeFontFaces.delete(nativeFontFace); + this._document.fonts.delete(nativeFontFace); + } + insertRule(rule) { + if (!this.styleElement) { + this.styleElement = this._document.createElement("style"); + this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); + } + const styleSheet = this.styleElement.sheet; + styleSheet.insertRule(rule, styleSheet.cssRules.length); + } + clear() { + for (const nativeFontFace of this.nativeFontFaces) { + this._document.fonts.delete(nativeFontFace); + } + this.nativeFontFaces.clear(); + this.#systemFonts.clear(); + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = null; + } + } + async loadSystemFont({ + systemFontInfo: info, + _inspectFont + }) { + if (!info || this.#systemFonts.has(info.loadedName)) { + return; + } + assert(!this.disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); + if (this.isFontLoadingAPISupported) { + const { + loadedName, + src, + style + } = info; + const fontFace = new FontFace(loadedName, src, style); + this.addNativeFontFace(fontFace); + try { + await fontFace.load(); + this.#systemFonts.add(loadedName); + _inspectFont?.(info); + } catch { + warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); + this.removeNativeFontFace(fontFace); + } + return; + } + unreachable("Not implemented: loadSystemFont without the Font Loading API."); + } + async bind(font) { + if (font.attached || font.missingFile && !font.systemFontInfo) { + return; + } + font.attached = true; + if (font.systemFontInfo) { + await this.loadSystemFont(font); + return; + } + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); + font.disableFontFace = true; + throw ex; + } + } + return; + } + const rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + if (this.isSyncFontLoadingSupported) { + return; + } + await new Promise(resolve => { + const request = this._queueLoadingCallback(resolve); + this._prepareFontLoadEvent(font, request); + }); + } + } + get isFontLoadingAPISupported() { + const hasFonts = !!this._document?.fonts; + return shadow(this, "isFontLoadingAPISupported", hasFonts); + } + get isSyncFontLoadingSupported() { + let supported = false; + if (isNodeJS) { + supported = true; + } else if (typeof navigator !== "undefined" && typeof navigator?.userAgent === "string" && /Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent)) { + supported = true; + } + return shadow(this, "isSyncFontLoadingSupported", supported); + } + _queueLoadingCallback(callback) { + function completeRequest() { + assert(!request.done, "completeRequest() cannot be called twice."); + request.done = true; + while (loadingRequests.length > 0 && loadingRequests[0].done) { + const otherRequest = loadingRequests.shift(); + setTimeout(otherRequest.callback, 0); + } + } + const { + loadingRequests + } = this; + const request = { + done: false, + complete: completeRequest, + callback + }; + loadingRequests.push(request); + return request; + } + get _loadTestFont() { + const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); + return shadow(this, "_loadTestFont", testFont); + } + _prepareFontLoadEvent(font, request) { + function int32(data, offset) { + return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + } + function spliceString(s, offset, remove, insert) { + const chunk1 = s.substring(0, offset); + const chunk2 = s.substring(offset + remove); + return chunk1 + insert + chunk2; + } + let i, ii; + const canvas = this._document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + let called = 0; + function isFontReady(name, callback) { + if (++called > 30) { + warn("Load test font never loaded."); + callback(); + return; + } + ctx.font = "30px " + name; + ctx.fillText(".", 0, 20); + const imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; + } + setTimeout(isFontReady.bind(null, name, callback)); + } + const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; + let data = this._loadTestFont; + const COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + const CFF_CHECKSUM_OFFSET = 16; + const XXXX_VALUE = 0x58585858; + let checksum = int32(data, CFF_CHECKSUM_OFFSET); + for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + } + if (i < loadTestFontId.length) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); + const url = `url(data:font/opentype;base64,${btoa(data)});`; + const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; + this.insertRule(rule); + const div = this._document.createElement("div"); + div.style.visibility = "hidden"; + div.style.width = div.style.height = "10px"; + div.style.position = "absolute"; + div.style.top = div.style.left = "0px"; + for (const name of [font.loadedName, loadTestFontId]) { + const span = this._document.createElement("span"); + span.textContent = "Hi"; + span.style.fontFamily = name; + div.append(span); + } + this._document.body.append(div); + isFontReady(loadTestFontId, () => { + div.remove(); + request.complete(); + }); + } +} +class FontFaceObject { + constructor(translatedData, { + disableFontFace = false, + inspectFont = null + }) { + this.compiledGlyphs = Object.create(null); + for (const i in translatedData) { + this[i] = translatedData[i]; + } + this.disableFontFace = disableFontFace === true; + this._inspectFont = inspectFont; + } + createNativeFontFace() { + if (!this.data || this.disableFontFace) { + return null; + } + let nativeFontFace; + if (!this.cssFontInfo) { + nativeFontFace = new FontFace(this.loadedName, this.data, {}); + } else { + const css = { + weight: this.cssFontInfo.fontWeight + }; + if (this.cssFontInfo.italicAngle) { + css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + } + nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); + } + this._inspectFont?.(this); + return nativeFontFace; + } + createFontFaceRule() { + if (!this.data || this.disableFontFace) { + return null; + } + const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`; + let rule; + if (!this.cssFontInfo) { + rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; + } else { + let css = `font-weight: ${this.cssFontInfo.fontWeight};`; + if (this.cssFontInfo.italicAngle) { + css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; + } + rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; + } + this._inspectFont?.(this, url); + return rule; + } + getPathGenerator(objs, character) { + if (this.compiledGlyphs[character] !== undefined) { + return this.compiledGlyphs[character]; + } + let cmds; + try { + cmds = objs.get(this.loadedName + "_path_" + character); + } catch (ex) { + warn(`getPathGenerator - ignoring character: "${ex}".`); + } + if (!Array.isArray(cmds) || cmds.length === 0) { + return this.compiledGlyphs[character] = function (c, size) {}; + } + const commands = []; + for (let i = 0, ii = cmds.length; i < ii;) { + switch (cmds[i++]) { + case FontRenderOps.BEZIER_CURVE_TO: + { + const [a, b, c, d, e, f] = cmds.slice(i, i + 6); + commands.push(ctx => ctx.bezierCurveTo(a, b, c, d, e, f)); + i += 6; + } + break; + case FontRenderOps.MOVE_TO: + { + const [a, b] = cmds.slice(i, i + 2); + commands.push(ctx => ctx.moveTo(a, b)); + i += 2; + } + break; + case FontRenderOps.LINE_TO: + { + const [a, b] = cmds.slice(i, i + 2); + commands.push(ctx => ctx.lineTo(a, b)); + i += 2; + } + break; + case FontRenderOps.QUADRATIC_CURVE_TO: + { + const [a, b, c, d] = cmds.slice(i, i + 4); + commands.push(ctx => ctx.quadraticCurveTo(a, b, c, d)); + i += 4; + } + break; + case FontRenderOps.RESTORE: + commands.push(ctx => ctx.restore()); + break; + case FontRenderOps.SAVE: + commands.push(ctx => ctx.save()); + break; + case FontRenderOps.SCALE: + assert(commands.length === 2, "Scale command is only valid at the third position."); + break; + case FontRenderOps.TRANSFORM: + { + const [a, b, c, d, e, f] = cmds.slice(i, i + 6); + commands.push(ctx => ctx.transform(a, b, c, d, e, f)); + i += 6; + } + break; + case FontRenderOps.TRANSLATE: + { + const [a, b] = cmds.slice(i, i + 2); + commands.push(ctx => ctx.translate(a, b)); + i += 2; + } + break; + } + } + commands.push(ctx => ctx.closePath()); + return this.compiledGlyphs[character] = function glyphDrawer(ctx, size) { + commands[0](ctx); + commands[1](ctx); + ctx.scale(size, -size); + for (let i = 2, ii = commands.length; i < ii; i++) { + commands[i](ctx); + } + }; + } +} + +;// ./src/display/canvas_factory.js + +class BaseCanvasFactory { + #enableHWA = false; + constructor({ + enableHWA = false + }) { + this.#enableHWA = enableHWA; + } + create(width, height) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + const canvas = this._createCanvas(width, height); + return { + canvas, + context: canvas.getContext("2d", { + willReadFrequently: !this.#enableHWA + }) + }; + } + reset(canvasAndContext, width, height) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + canvasAndContext.canvas.width = width; + canvasAndContext.canvas.height = height; + } + destroy(canvasAndContext) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + canvasAndContext.canvas.width = 0; + canvasAndContext.canvas.height = 0; + canvasAndContext.canvas = null; + canvasAndContext.context = null; + } + _createCanvas(width, height) { + unreachable("Abstract method `_createCanvas` called."); + } +} +class DOMCanvasFactory extends BaseCanvasFactory { + constructor({ + ownerDocument = globalThis.document, + enableHWA = false + }) { + super({ + enableHWA + }); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} + +;// ./src/display/cmap_reader_factory.js + + +class BaseCMapReaderFactory { + constructor({ + baseUrl = null, + isCompressed = true + }) { + this.baseUrl = baseUrl; + this.isCompressed = isCompressed; + } + async fetch({ + name + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided."); + } + if (!name) { + throw new Error("CMap name must be specified."); + } + const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : ""); + return this._fetch(url).then(cMapData => ({ + cMapData, + isCompressed: this.isCompressed + })).catch(reason => { + throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + const data = await fetchData(url, this.isCompressed ? "arraybuffer" : "text"); + return data instanceof ArrayBuffer ? new Uint8Array(data) : stringToBytes(data); + } +} + +;// ./src/display/filter_factory.js + + +class BaseFilterFactory { + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + addAlphaFilter(map) { + return "none"; + } + addLuminosityFilter(map) { + return "none"; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + return "none"; + } + destroy(keepHCM = false) {} +} +class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; + #_cache; + #_defs; + #docId; + #document; + #_hcmCache; + #id = 0; + constructor({ + docId, + ownerDocument = globalThis.document + }) { + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #hcmCache() { + return this.#_hcmCache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); + } + return this.#_defs; + } + #createTables(maps) { + if (maps.length === 1) { + const mapR = maps[0]; + const buffer = new Array(256); + for (let i = 0; i < 256; i++) { + buffer[i] = mapR[i] / 255; + } + const table = buffer.join(","); + return [table, table, table]; + } + const [mapR, mapG, mapB] = maps; + const bufferR = new Array(256); + const bufferG = new Array(256); + const bufferB = new Array(256); + for (let i = 0; i < 256; i++) { + bufferR[i] = mapR[i] / 255; + bufferG[i] = mapG[i] / 255; + bufferB[i] = mapB[i] / 255; + } + return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; + } + #createUrl(id) { + if (this.#baseUrl === undefined) { + this.#baseUrl = ""; + const url = this.#document.URL; + if (url !== this.#document.baseURI) { + if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + } else { + this.#baseUrl = url.split("#", 1)[0]; + } + } + } + return `url(${this.#baseUrl}#${id})`; + } + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + const [tableR, tableG, tableB] = this.#createTables(maps); + const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapConversion(tableR, tableG, tableB, filter); + return url; + } + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + const filterName = "base"; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const fgRGB = this.#getRGB(fgColor); + fgColor = Util.makeHexColor(...fgRGB); + const bgRGB = this.#getRGB(bgColor); + bgColor = Util.makeHexColor(...bgRGB); + this.#defs.style.color = ""; + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return info.url; + } + const map = new Array(256); + for (let i = 0; i <= 255; i++) { + const x = i / 255; + map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; + } + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addTransferMapConversion(table, table, table, filter); + this.#addGrayConversion(filter); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + addAlphaFilter(map) { + let value = this.#cache.get(map); + if (value) { + return value; + } + const [tableA] = this.#createTables([map]); + const key = `alpha_${tableA}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_alpha_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapAlphaConversion(tableA, filter); + return url; + } + addLuminosityFilter(map) { + let value = this.#cache.get(map || "luminosity"); + if (value) { + return value; + } + let tableA, key; + if (map) { + [tableA] = this.#createTables([map]); + key = `luminosity_${tableA}`; + } else { + key = "luminosity"; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addLuminosityConversion(filter); + if (map) { + this.#addTransferMapAlphaConversion(tableA, filter); + } + return url; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); + let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); + let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); + let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this)); + if (bgGray < fgGray) { + [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; + } + this.#defs.style.color = ""; + const getSteps = (fg, bg, n) => { + const arr = new Array(256); + const step = (bgGray - fgGray) / n; + const newStart = fg / 255; + const newStep = (bg - fg) / (255 * n); + let prev = 0; + for (let i = 0; i <= n; i++) { + const k = Math.round(fgGray + i * step); + const value = newStart + i * newStep; + for (let j = prev; j <= k; j++) { + arr[j] = value; + } + prev = k + 1; + } + for (let i = prev; i < 256; i++) { + arr[i] = arr[prev - 1]; + } + return arr.join(","); + }; + const id = `g_${this.#docId}_hcm_${filterName}_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addGrayConversion(filter); + this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + destroy(keepHCM = false) { + if (keepHCM && this.#_hcmCache?.size) { + return; + } + this.#_defs?.parentNode.parentNode.remove(); + this.#_defs = null; + this.#_cache?.clear(); + this.#_cache = null; + this.#_hcmCache?.clear(); + this.#_hcmCache = null; + this.#id = 0; + } + #addLuminosityConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"); + filter.append(feColorMatrix); + } + #addGrayConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + } + #createFilter(id) { + const filter = this.#document.createElementNS(SVG_NS, "filter"); + filter.setAttribute("color-interpolation-filters", "sRGB"); + filter.setAttribute("id", id); + this.#defs.append(filter); + return filter; + } + #appendFeFunc(feComponentTransfer, func, table) { + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + #addTransferMapConversion(rTable, gTable, bTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); + this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); + this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + } + #addTransferMapAlphaConversion(aTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable); + } + #getRGB(color) { + this.#defs.style.color = color; + return getRGB(getComputedStyle(this.#defs).getPropertyValue("color")); + } +} + +;// ./src/display/standard_fontdata_factory.js + + +class BaseStandardFontDataFactory { + constructor({ + baseUrl = null + }) { + this.baseUrl = baseUrl; + } + async fetch({ + filename + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `standardFontDataUrl` API parameter is provided."); + } + if (!filename) { + throw new Error("Font filename must be specified."); + } + const url = `${this.baseUrl}${filename}`; + return this._fetch(url).catch(reason => { + throw new Error(`Unable to load font data at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + const data = await fetchData(url, "arraybuffer"); + return new Uint8Array(data); + } +} + +;// ./src/display/node_utils.js + + + + + +async function node_utils_fetchData(url) { + const fs = process.getBuiltinModule("fs"); + const data = await fs.promises.readFile(url); + return new Uint8Array(data); +} +class NodeFilterFactory extends BaseFilterFactory {} +class NodeCanvasFactory extends BaseCanvasFactory { + _createCanvas(width, height) { + const require = process.getBuiltinModule("module").createRequire(import.meta.url); + const canvas = require("@napi-rs/canvas"); + return canvas.createCanvas(width, height); + } +} +class NodeCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} +class NodeStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} + +;// ./src/display/pattern_helper.js + + +const PathType = { + FILL: "Fill", + STROKE: "Stroke", + SHADING: "Shading" +}; +function applyBoundingBox(ctx, bbox) { + if (!bbox) { + return; + } + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + const region = new Path2D(); + region.rect(bbox[0], bbox[1], width, height); + ctx.clip(region); +} +class BaseShadingPattern { + getPattern() { + unreachable("Abstract method `getPattern` called."); + } +} +class RadialAxialShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._type = IR[1]; + this._bbox = IR[2]; + this._colorStops = IR[3]; + this._p0 = IR[4]; + this._p1 = IR[5]; + this._r0 = IR[6]; + this._r1 = IR[7]; + this.matrix = null; + } + _createGradient(ctx) { + let grad; + if (this._type === "axial") { + grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]); + } else if (this._type === "radial") { + grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1); + } + for (const colorStop of this._colorStops) { + grad.addColorStop(colorStop[0], colorStop[1]); + } + return grad; + } + getPattern(ctx, owner, inverse, pathType) { + let pattern; + if (pathType === PathType.STROKE || pathType === PathType.FILL) { + const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0]; + const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1; + const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1; + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.beginPath(); + tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]); + inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); + tmpCtx.transform(...owner.baseTransform); + if (this.matrix) { + tmpCtx.transform(...this.matrix); + } + applyBoundingBox(tmpCtx, this._bbox); + tmpCtx.fillStyle = this._createGradient(tmpCtx); + tmpCtx.fill(); + pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); + const domMatrix = new DOMMatrix(inverse); + pattern.setTransform(domMatrix); + } else { + applyBoundingBox(ctx, this._bbox); + pattern = this._createGradient(ctx); + } + return pattern; + } +} +function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { + const coords = context.coords, + colors = context.colors; + const bytes = data.data, + rowSize = data.width * 4; + let tmp; + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + if (coords[p2 + 1] > coords[p3 + 1]) { + tmp = p2; + p2 = p3; + p3 = tmp; + tmp = c2; + c2 = c3; + c3 = tmp; + } + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + const x1 = (coords[p1] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + if (y1 >= y3) { + return; + } + const c1r = colors[c1], + c1g = colors[c1 + 1], + c1b = colors[c1 + 2]; + const c2r = colors[c2], + c2g = colors[c2 + 1], + c2b = colors[c2 + 2]; + const c3r = colors[c3], + c3g = colors[c3 + 1], + c3b = colors[c3 + 2]; + const minY = Math.round(y1), + maxY = Math.round(y3); + let xa, car, cag, cab; + let xb, cbr, cbg, cbb; + for (let y = minY; y <= maxY; y++) { + if (y < y2) { + const k = y < y1 ? 0 : (y1 - y) / (y1 - y2); + xa = x1 - (x1 - x2) * k; + car = c1r - (c1r - c2r) * k; + cag = c1g - (c1g - c2g) * k; + cab = c1b - (c1b - c2b) * k; + } else { + let k; + if (y > y3) { + k = 1; + } else if (y2 === y3) { + k = 0; + } else { + k = (y2 - y) / (y2 - y3); + } + xa = x2 - (x2 - x3) * k; + car = c2r - (c2r - c3r) * k; + cag = c2g - (c2g - c3g) * k; + cab = c2b - (c2b - c3b) * k; + } + let k; + if (y < y1) { + k = 0; + } else if (y > y3) { + k = 1; + } else { + k = (y1 - y) / (y1 - y3); + } + xb = x1 - (x1 - x3) * k; + cbr = c1r - (c1r - c3r) * k; + cbg = c1g - (c1g - c3g) * k; + cbb = c1b - (c1b - c3b) * k; + const x1_ = Math.round(Math.min(xa, xb)); + const x2_ = Math.round(Math.max(xa, xb)); + let j = rowSize * y + x1_ * 4; + for (let x = x1_; x <= x2_; x++) { + k = (xa - x) / (xa - xb); + if (k < 0) { + k = 0; + } else if (k > 1) { + k = 1; + } + bytes[j++] = car - (car - cbr) * k | 0; + bytes[j++] = cag - (cag - cbg) * k | 0; + bytes[j++] = cab - (cab - cbb) * k | 0; + bytes[j++] = 255; + } + } +} +function drawFigure(data, figure, context) { + const ps = figure.coords; + const cs = figure.colors; + let i, ii; + switch (figure.type) { + case "lattice": + const verticesPerRow = figure.verticesPerRow; + const rows = Math.floor(ps.length / verticesPerRow) - 1; + const cols = verticesPerRow - 1; + for (i = 0; i < rows; i++) { + let q = i * verticesPerRow; + for (let j = 0; j < cols; j++, q++) { + drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); + drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); + } + } + break; + case "triangles": + for (i = 0, ii = ps.length; i < ii; i += 3) { + drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); + } + break; + default: + throw new Error("illegal figure"); + } +} +class MeshShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._coords = IR[2]; + this._colors = IR[3]; + this._figures = IR[4]; + this._bounds = IR[5]; + this._bbox = IR[7]; + this._background = IR[8]; + this.matrix = null; + } + _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) { + const EXPECTED_SCALE = 1.1; + const MAX_PATTERN_SIZE = 3000; + const BORDER_SIZE = 2; + const offsetX = Math.floor(this._bounds[0]); + const offsetY = Math.floor(this._bounds[1]); + const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; + const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const scaleX = boundsWidth / width; + const scaleY = boundsHeight / height; + const context = { + coords: this._coords, + colors: this._colors, + offsetX: -offsetX, + offsetY: -offsetY, + scaleX: 1 / scaleX, + scaleY: 1 / scaleY + }; + const paddedWidth = width + BORDER_SIZE * 2; + const paddedHeight = height + BORDER_SIZE * 2; + const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight); + const tmpCtx = tmpCanvas.context; + const data = tmpCtx.createImageData(width, height); + if (backgroundColor) { + const bytes = data.data; + for (let i = 0, ii = bytes.length; i < ii; i += 4) { + bytes[i] = backgroundColor[0]; + bytes[i + 1] = backgroundColor[1]; + bytes[i + 2] = backgroundColor[2]; + bytes[i + 3] = 255; + } + } + for (const figure of this._figures) { + drawFigure(data, figure, context); + } + tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); + const canvas = tmpCanvas.canvas; + return { + canvas, + offsetX: offsetX - BORDER_SIZE * scaleX, + offsetY: offsetY - BORDER_SIZE * scaleY, + scaleX, + scaleY + }; + } + getPattern(ctx, owner, inverse, pathType) { + applyBoundingBox(ctx, this._bbox); + let scale; + if (pathType === PathType.SHADING) { + scale = Util.singularValueDecompose2dScale(getCurrentTransform(ctx)); + } else { + scale = Util.singularValueDecompose2dScale(owner.baseTransform); + if (this.matrix) { + const matrixScale = Util.singularValueDecompose2dScale(this.matrix); + scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; + } + } + const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases); + if (pathType !== PathType.SHADING) { + ctx.setTransform(...owner.baseTransform); + if (this.matrix) { + ctx.transform(...this.matrix); + } + } + ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); + return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + } +} +class DummyShadingPattern extends BaseShadingPattern { + getPattern() { + return "hotpink"; + } +} +function getShadingPattern(IR) { + switch (IR[0]) { + case "RadialAxial": + return new RadialAxialShadingPattern(IR); + case "Mesh": + return new MeshShadingPattern(IR); + case "Dummy": + return new DummyShadingPattern(); + } + throw new Error(`Unknown IR type: ${IR[0]}`); +} +const PaintType = { + COLORED: 1, + UNCOLORED: 2 +}; +class TilingPattern { + static MAX_PATTERN_SIZE = 3000; + constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) { + this.operatorList = IR[2]; + this.matrix = IR[3]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.color = color; + this.ctx = ctx; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + } + createPatternCanvas(owner) { + const { + bbox, + operatorList, + paintType, + tilingType, + color, + canvasGraphicsFactory + } = this; + let { + xstep, + ystep + } = this; + xstep = Math.abs(xstep); + ystep = Math.abs(ystep); + info("TilingType: " + tilingType); + const x0 = bbox[0], + y0 = bbox[1], + x1 = bbox[2], + y1 = bbox[3]; + const width = x1 - x0; + const height = y1 - y0; + const matrixScale = Util.singularValueDecompose2dScale(this.matrix); + const curMatrixScale = Util.singularValueDecompose2dScale(this.baseTransform); + const combinedScaleX = matrixScale[0] * curMatrixScale[0]; + const combinedScaleY = matrixScale[1] * curMatrixScale[1]; + let canvasWidth = width, + canvasHeight = height, + redrawHorizontally = false, + redrawVertically = false; + const xScaledStep = Math.ceil(xstep * combinedScaleX); + const yScaledStep = Math.ceil(ystep * combinedScaleY); + const xScaledWidth = Math.ceil(width * combinedScaleX); + const yScaledHeight = Math.ceil(height * combinedScaleY); + if (xScaledStep >= xScaledWidth) { + canvasWidth = xstep; + } else { + redrawHorizontally = true; + } + if (yScaledStep >= yScaledHeight) { + canvasHeight = ystep; + } else { + redrawVertically = true; + } + const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size); + const tmpCtx = tmpCanvas.context; + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + graphics.groupLevel = owner.groupLevel; + this.setFillAndStrokeStyleToContext(graphics, paintType, color); + tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0); + graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); + tmpCtx.save(); + this.clipBbox(graphics, x0, y0, x1, y1); + graphics.baseTransform = getCurrentTransform(graphics.ctx); + graphics.executeOperatorList(operatorList); + graphics.endDrawing(); + tmpCtx.restore(); + if (redrawHorizontally || redrawVertically) { + const image = tmpCanvas.canvas; + if (redrawHorizontally) { + canvasWidth = xstep; + } + if (redrawVertically) { + canvasHeight = ystep; + } + const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const xSize = dimx2.size; + const ySize = dimy2.size; + const tmpCanvas2 = owner.cachedCanvases.getCanvas("pattern-workaround", xSize, ySize); + const tmpCtx2 = tmpCanvas2.context; + const ii = redrawHorizontally ? Math.floor(width / xstep) : 0; + const jj = redrawVertically ? Math.floor(height / ystep) : 0; + for (let i = 0; i <= ii; i++) { + for (let j = 0; j <= jj; j++) { + tmpCtx2.drawImage(image, xSize * i, ySize * j, xSize, ySize, 0, 0, xSize, ySize); + } + } + return { + canvas: tmpCanvas2.canvas, + scaleX: dimx2.scale, + scaleY: dimy2.scale, + offsetX: x0, + offsetY: y0 + }; + } + return { + canvas: tmpCanvas.canvas, + scaleX: dimx.scale, + scaleY: dimy.scale, + offsetX: x0, + offsetY: y0 + }; + } + getSizeAndScale(step, realOutputSize, scale) { + const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); + let size = Math.ceil(step * scale); + if (size >= maxSize) { + size = maxSize; + } else { + scale = size / step; + } + return { + scale, + size + }; + } + clipBbox(graphics, x0, y0, x1, y1) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); + graphics.current.updateRectMinMax(getCurrentTransform(graphics.ctx), [x0, y0, x1, y1]); + graphics.clip(); + graphics.endPath(); + } + setFillAndStrokeStyleToContext(graphics, paintType, color) { + const context = graphics.ctx, + current = graphics.current; + switch (paintType) { + case PaintType.COLORED: + const ctx = this.ctx; + context.fillStyle = ctx.fillStyle; + context.strokeStyle = ctx.strokeStyle; + current.fillColor = ctx.fillStyle; + current.strokeColor = ctx.strokeStyle; + break; + case PaintType.UNCOLORED: + const cssColor = Util.makeHexColor(color[0], color[1], color[2]); + context.fillStyle = cssColor; + context.strokeStyle = cssColor; + current.fillColor = cssColor; + current.strokeColor = cssColor; + break; + default: + throw new FormatError(`Unsupported paint type: ${paintType}`); + } + } + getPattern(ctx, owner, inverse, pathType) { + let matrix = inverse; + if (pathType !== PathType.SHADING) { + matrix = Util.transform(matrix, owner.baseTransform); + if (this.matrix) { + matrix = Util.transform(matrix, this.matrix); + } + } + const temporaryPatternCanvas = this.createPatternCanvas(owner); + let domMatrix = new DOMMatrix(matrix); + domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); + pattern.setTransform(domMatrix); + return pattern; + } +} + +;// ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/display/canvas.js + + + + +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const EXECUTION_TIME = 15; +const EXECUTION_STEPS = 10; +const MAX_SIZE_TO_COMPILE = 1000; +const FULL_CHUNK_HEIGHT = 16; +function mirrorContextOperations(ctx, destCtx) { + if (ctx._removeMirroring) { + throw new Error("Context is already forwarding operations."); + } + ctx.__originalSave = ctx.save; + ctx.__originalRestore = ctx.restore; + ctx.__originalRotate = ctx.rotate; + ctx.__originalScale = ctx.scale; + ctx.__originalTranslate = ctx.translate; + ctx.__originalTransform = ctx.transform; + ctx.__originalSetTransform = ctx.setTransform; + ctx.__originalResetTransform = ctx.resetTransform; + ctx.__originalClip = ctx.clip; + ctx.__originalMoveTo = ctx.moveTo; + ctx.__originalLineTo = ctx.lineTo; + ctx.__originalBezierCurveTo = ctx.bezierCurveTo; + ctx.__originalRect = ctx.rect; + ctx.__originalClosePath = ctx.closePath; + ctx.__originalBeginPath = ctx.beginPath; + ctx._removeMirroring = () => { + ctx.save = ctx.__originalSave; + ctx.restore = ctx.__originalRestore; + ctx.rotate = ctx.__originalRotate; + ctx.scale = ctx.__originalScale; + ctx.translate = ctx.__originalTranslate; + ctx.transform = ctx.__originalTransform; + ctx.setTransform = ctx.__originalSetTransform; + ctx.resetTransform = ctx.__originalResetTransform; + ctx.clip = ctx.__originalClip; + ctx.moveTo = ctx.__originalMoveTo; + ctx.lineTo = ctx.__originalLineTo; + ctx.bezierCurveTo = ctx.__originalBezierCurveTo; + ctx.rect = ctx.__originalRect; + ctx.closePath = ctx.__originalClosePath; + ctx.beginPath = ctx.__originalBeginPath; + delete ctx._removeMirroring; + }; + ctx.save = function ctxSave() { + destCtx.save(); + this.__originalSave(); + }; + ctx.restore = function ctxRestore() { + destCtx.restore(); + this.__originalRestore(); + }; + ctx.translate = function ctxTranslate(x, y) { + destCtx.translate(x, y); + this.__originalTranslate(x, y); + }; + ctx.scale = function ctxScale(x, y) { + destCtx.scale(x, y); + this.__originalScale(x, y); + }; + ctx.transform = function ctxTransform(a, b, c, d, e, f) { + destCtx.transform(a, b, c, d, e, f); + this.__originalTransform(a, b, c, d, e, f); + }; + ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { + destCtx.setTransform(a, b, c, d, e, f); + this.__originalSetTransform(a, b, c, d, e, f); + }; + ctx.resetTransform = function ctxResetTransform() { + destCtx.resetTransform(); + this.__originalResetTransform(); + }; + ctx.rotate = function ctxRotate(angle) { + destCtx.rotate(angle); + this.__originalRotate(angle); + }; + ctx.clip = function ctxRotate(rule) { + destCtx.clip(rule); + this.__originalClip(rule); + }; + ctx.moveTo = function (x, y) { + destCtx.moveTo(x, y); + this.__originalMoveTo(x, y); + }; + ctx.lineTo = function (x, y) { + destCtx.lineTo(x, y); + this.__originalLineTo(x, y); + }; + ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + }; + ctx.rect = function (x, y, width, height) { + destCtx.rect(x, y, width, height); + this.__originalRect(x, y, width, height); + }; + ctx.closePath = function () { + destCtx.closePath(); + this.__originalClosePath(); + }; + ctx.beginPath = function () { + destCtx.beginPath(); + this.__originalBeginPath(); + }; +} +class CachedCanvases { + constructor(canvasFactory) { + this.canvasFactory = canvasFactory; + this.cache = Object.create(null); + } + getCanvas(id, width, height) { + let canvasEntry; + if (this.cache[id] !== undefined) { + canvasEntry = this.cache[id]; + this.canvasFactory.reset(canvasEntry, width, height); + } else { + canvasEntry = this.canvasFactory.create(width, height); + this.cache[id] = canvasEntry; + } + return canvasEntry; + } + delete(id) { + delete this.cache[id]; + } + clear() { + for (const id in this.cache) { + const canvasEntry = this.cache[id]; + this.canvasFactory.destroy(canvasEntry); + delete this.cache[id]; + } + } +} +function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { + const [a, b, c, d, tx, ty] = getCurrentTransform(ctx); + if (b === 0 && c === 0) { + const tlX = destX * a + tx; + const rTlX = Math.round(tlX); + const tlY = destY * d + ty; + const rTlY = Math.round(tlY); + const brX = (destX + destW) * a + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destY + destH) * d + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight); + ctx.setTransform(a, b, c, d, tx, ty); + return [rWidth, rHeight]; + } + if (a === 0 && d === 0) { + const tlX = destY * c + tx; + const rTlX = Math.round(tlX); + const tlY = destX * b + ty; + const rTlY = Math.round(tlY); + const brX = (destY + destH) * c + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destX + destW) * b + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth); + ctx.setTransform(a, b, c, d, tx, ty); + return [rHeight, rWidth]; + } + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH); + const scaleX = Math.hypot(a, b); + const scaleY = Math.hypot(c, d); + return [scaleX * destW, scaleY * destH]; +} +function compileType3Glyph(imgData) { + const { + width, + height + } = imgData; + if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { + return null; + } + const POINT_TO_PROCESS_LIMIT = 1000; + const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); + const width1 = width + 1; + let points = new Uint8Array(width1 * (height + 1)); + let i, j, j0; + const lineSize = width + 7 & ~7; + let data = new Uint8Array(lineSize * height), + pos = 0; + for (const elem of imgData.data) { + let mask = 128; + while (mask > 0) { + data[pos++] = elem & mask ? 0 : 255; + mask >>= 1; + } + } + let count = 0; + pos = 0; + if (data[pos] !== 0) { + points[0] = 1; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j] = data[pos] ? 2 : 1; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j] = 2; + ++count; + } + for (i = 1; i < height; i++) { + pos = i * lineSize; + j0 = i * width1; + if (data[pos - lineSize] !== data[pos]) { + points[j0] = data[pos] ? 1 : 8; + ++count; + } + let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + for (j = 1; j < width; j++) { + sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); + if (POINT_TYPES[sum]) { + points[j0 + j] = POINT_TYPES[sum]; + ++count; + } + pos++; + } + if (data[pos - lineSize] !== data[pos]) { + points[j0 + j] = data[pos] ? 2 : 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + } + pos = lineSize * (height - 1); + j0 = i * width1; + if (data[pos] !== 0) { + points[j0] = 8; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j0 + j] = data[pos] ? 4 : 8; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j0 + j] = 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); + const path = new Path2D(); + for (i = 0; count && i <= height; i++) { + let p = i * width1; + const end = p + width; + while (p < end && !points[p]) { + p++; + } + if (p === end) { + continue; + } + path.moveTo(p % width1, i); + const p0 = p; + let type = points[p]; + do { + const step = steps[type]; + do { + p += step; + } while (!points[p]); + const pp = points[p]; + if (pp !== 5 && pp !== 10) { + type = pp; + points[p] = 0; + } else { + type = pp & 0x33 * type >> 4; + points[p] &= type >> 2 | type << 2; + } + path.lineTo(p % width1, p / width1 | 0); + if (!points[p]) { + --count; + } + } while (p0 !== p); + --i; + } + data = null; + points = null; + const drawOutline = function (c) { + c.save(); + c.scale(1 / width, -1 / height); + c.translate(0, -height); + c.fill(path); + c.beginPath(); + c.restore(); + }; + return drawOutline; +} +class CanvasExtraState { + constructor(width, height) { + this.alphaIsShape = false; + this.fontSize = 0; + this.fontSizeScale = 1; + this.textMatrix = IDENTITY_MATRIX; + this.textMatrixScale = 1; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.leading = 0; + this.x = 0; + this.y = 0; + this.lineX = 0; + this.lineY = 0; + this.charSpacing = 0; + this.wordSpacing = 0; + this.textHScale = 1; + this.textRenderingMode = TextRenderingMode.FILL; + this.textRise = 0; + this.fillColor = "#000000"; + this.strokeColor = "#000000"; + this.patternFill = false; + this.patternStroke = false; + this.fillAlpha = 1; + this.strokeAlpha = 1; + this.lineWidth = 1; + this.activeSMask = null; + this.transferMaps = "none"; + this.startNewPathAndClipBox([0, 0, width, height]); + } + clone() { + const clone = Object.create(this); + clone.clipBox = this.clipBox.slice(); + return clone; + } + setCurrentPoint(x, y) { + this.x = x; + this.y = y; + } + updatePathMinMax(transform, x, y) { + [x, y] = Util.applyTransform([x, y], transform); + this.minX = Math.min(this.minX, x); + this.minY = Math.min(this.minY, y); + this.maxX = Math.max(this.maxX, x); + this.maxY = Math.max(this.maxY, y); + } + updateRectMinMax(transform, rect) { + const p1 = Util.applyTransform(rect, transform); + const p2 = Util.applyTransform(rect.slice(2), transform); + const p3 = Util.applyTransform([rect[0], rect[3]], transform); + const p4 = Util.applyTransform([rect[2], rect[1]], transform); + this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]); + this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]); + this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]); + this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]); + } + updateScalingPathMinMax(transform, minMax) { + Util.scaleMinMax(transform, minMax); + this.minX = Math.min(this.minX, minMax[0]); + this.minY = Math.min(this.minY, minMax[1]); + this.maxX = Math.max(this.maxX, minMax[2]); + this.maxY = Math.max(this.maxY, minMax[3]); + } + updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + const box = Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax); + if (minMax) { + return; + } + this.updateRectMinMax(transform, box); + } + getPathBoundingBox(pathType = PathType.FILL, transform = null) { + const box = [this.minX, this.minY, this.maxX, this.maxY]; + if (pathType === PathType.STROKE) { + if (!transform) { + unreachable("Stroke bounding box must include transform."); + } + const scale = Util.singularValueDecompose2dScale(transform); + const xStrokePad = scale[0] * this.lineWidth / 2; + const yStrokePad = scale[1] * this.lineWidth / 2; + box[0] -= xStrokePad; + box[1] -= yStrokePad; + box[2] += xStrokePad; + box[3] += yStrokePad; + } + return box; + } + updateClipFromPath() { + const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox()); + this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); + } + isEmptyClip() { + return this.minX === Infinity; + } + startNewPathAndClipBox(box) { + this.clipBox = box; + this.minX = Infinity; + this.minY = Infinity; + this.maxX = 0; + this.maxY = 0; + } + getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) { + return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + } +} +function putBinaryImageData(ctx, imgData) { + if (imgData instanceof ImageData) { + ctx.putImageData(imgData, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0, + destPos; + const src = imgData.data; + const dest = chunkImgData.data; + let i, j, thisChunkHeight, elemsInThisChunk; + if (imgData.kind === util_ImageKind.GRAYSCALE_1BPP) { + const srcLength = src.byteLength; + const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); + const dest32DataLength = dest32.length; + const fullSrcDiff = width + 7 >> 3; + const white = 0xffffffff; + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + for (i = 0; i < totalChunks; i++) { + thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + destPos = 0; + for (j = 0; j < thisChunkHeight; j++) { + const srcDiff = srcLength - srcPos; + let k = 0; + const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; + const kEndUnrolled = kEnd & ~7; + let mask = 0; + let srcByte = 0; + for (; k < kEndUnrolled; k += 8) { + srcByte = src[srcPos++]; + dest32[destPos++] = srcByte & 128 ? white : black; + dest32[destPos++] = srcByte & 64 ? white : black; + dest32[destPos++] = srcByte & 32 ? white : black; + dest32[destPos++] = srcByte & 16 ? white : black; + dest32[destPos++] = srcByte & 8 ? white : black; + dest32[destPos++] = srcByte & 4 ? white : black; + dest32[destPos++] = srcByte & 2 ? white : black; + dest32[destPos++] = srcByte & 1 ? white : black; + } + for (; k < kEnd; k++) { + if (mask === 0) { + srcByte = src[srcPos++]; + mask = 128; + } + dest32[destPos++] = srcByte & mask ? white : black; + mask >>= 1; + } + } + while (destPos < dest32DataLength) { + dest32[destPos++] = 0; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else if (imgData.kind === util_ImageKind.RGBA_32BPP) { + j = 0; + elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + for (i = 0; i < fullChunks; i++) { + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + srcPos += elemsInThisChunk; + ctx.putImageData(chunkImgData, 0, j); + j += FULL_CHUNK_HEIGHT; + } + if (i < totalChunks) { + elemsInThisChunk = width * partialChunkHeight * 4; + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + ctx.putImageData(chunkImgData, 0, j); + } + } else if (imgData.kind === util_ImageKind.RGB_24BPP) { + thisChunkHeight = FULL_CHUNK_HEIGHT; + elemsInThisChunk = width * thisChunkHeight; + for (i = 0; i < totalChunks; i++) { + if (i >= fullChunks) { + thisChunkHeight = partialChunkHeight; + elemsInThisChunk = width * thisChunkHeight; + } + destPos = 0; + for (j = elemsInThisChunk; j--;) { + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = 255; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else { + throw new Error(`bad image kind: ${imgData.kind}`); + } +} +function putBinaryImageMask(ctx, imgData) { + if (imgData.bitmap) { + ctx.drawImage(imgData.bitmap, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + for (let i = 0; i < totalChunks; i++) { + const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + ({ + srcPos + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: thisChunkHeight, + nonBlackColor: 0 + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } +} +function copyCtxState(sourceCtx, destCtx) { + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"]; + for (const property of properties) { + if (sourceCtx[property] !== undefined) { + destCtx[property] = sourceCtx[property]; + } + } + if (sourceCtx.setLineDash !== undefined) { + destCtx.setLineDash(sourceCtx.getLineDash()); + destCtx.lineDashOffset = sourceCtx.lineDashOffset; + } +} +function resetCtxToDefault(ctx) { + ctx.strokeStyle = ctx.fillStyle = "#000000"; + ctx.fillRule = "nonzero"; + ctx.globalAlpha = 1; + ctx.lineWidth = 1; + ctx.lineCap = "butt"; + ctx.lineJoin = "miter"; + ctx.miterLimit = 10; + ctx.globalCompositeOperation = "source-over"; + ctx.font = "10px sans-serif"; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([]); + ctx.lineDashOffset = 0; + } + if (!isNodeJS) { + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + } +} +function getImageSmoothingEnabled(transform, interpolate) { + if (interpolate) { + return true; + } + const scale = Util.singularValueDecompose2dScale(transform); + scale[0] = Math.fround(scale[0]); + scale[1] = Math.fround(scale[1]); + const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * PixelsPerInch.PDF_TO_CSS_UNITS); + return scale[0] <= actualScale && scale[1] <= actualScale; +} +const LINE_CAP_STYLES = ["butt", "round", "square"]; +const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; +const NORMAL_CLIP = {}; +const EO_CLIP = {}; +class CanvasGraphics { + constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, { + optionalContentConfig, + markedContentStack = null + }, annotationCanvasMap, pageColors) { + this.ctx = canvasCtx; + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.stateStack = []; + this.pendingClip = null; + this.pendingEOFill = false; + this.res = null; + this.xobjs = null; + this.commonObjs = commonObjs; + this.objs = objs; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this.groupStack = []; + this.processingType3 = null; + this.baseTransform = null; + this.baseTransformStack = []; + this.groupLevel = 0; + this.smaskStack = []; + this.smaskCounter = 0; + this.tempSMask = null; + this.suspendedCtx = null; + this.contentVisible = true; + this.markedContentStack = markedContentStack || []; + this.optionalContentConfig = optionalContentConfig; + this.cachedCanvases = new CachedCanvases(this.canvasFactory); + this.cachedPatterns = new Map(); + this.annotationCanvasMap = annotationCanvasMap; + this.viewportScale = 1; + this.outputScaleX = 1; + this.outputScaleY = 1; + this.pageColors = pageColors; + this._cachedScaleForStroking = [-1, 0]; + this._cachedGetSinglePixelWidth = null; + this._cachedBitmapsMap = new Map(); + } + getObject(data, fallback = null) { + if (typeof data === "string") { + return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); + } + return fallback; + } + beginDrawing({ + transform, + viewport, + transparency = false, + background = null + }) { + const width = this.ctx.canvas.width; + const height = this.ctx.canvas.height; + const savedFillStyle = this.ctx.fillStyle; + this.ctx.fillStyle = background || "#ffffff"; + this.ctx.fillRect(0, 0, width, height); + this.ctx.fillStyle = savedFillStyle; + if (transparency) { + const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); + this.compositeCtx = this.ctx; + this.transparentCanvas = transparentCanvas.canvas; + this.ctx = transparentCanvas.context; + this.ctx.save(); + this.ctx.transform(...getCurrentTransform(this.compositeCtx)); + } + this.ctx.save(); + resetCtxToDefault(this.ctx); + if (transform) { + this.ctx.transform(...transform); + this.outputScaleX = transform[0]; + this.outputScaleY = transform[0]; + } + this.ctx.transform(...viewport.transform); + this.viewportScale = viewport.scale; + this.baseTransform = getCurrentTransform(this.ctx); + } + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + let i = executionStartIdx || 0; + const argsArrayLen = argsArray.length; + if (argsArrayLen === i) { + return i; + } + const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; + const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + let steps = 0; + const commonObjs = this.commonObjs; + const objs = this.objs; + let fnId; + while (true) { + if (stepper !== undefined && i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + fnId = fnArray[i]; + if (fnId !== OPS.dependency) { + this[fnId].apply(this, argsArray[i]); + } else { + for (const depObjId of argsArray[i]) { + const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } + i++; + if (i === argsArrayLen) { + return i; + } + if (chunkOperations && ++steps > EXECUTION_STEPS) { + if (Date.now() > endTime) { + continueCallback(); + return i; + } + steps = 0; + } + } + } + #restoreInitialState() { + while (this.stateStack.length || this.inSMaskMode) { + this.restore(); + } + this.current.activeSMask = null; + this.ctx.restore(); + if (this.transparentCanvas) { + this.ctx = this.compositeCtx; + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.drawImage(this.transparentCanvas, 0, 0); + this.ctx.restore(); + this.transparentCanvas = null; + } + } + endDrawing() { + this.#restoreInitialState(); + this.cachedCanvases.clear(); + this.cachedPatterns.clear(); + for (const cache of this._cachedBitmapsMap.values()) { + for (const canvas of cache.values()) { + if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) { + canvas.width = canvas.height = 0; + } + } + cache.clear(); + } + this._cachedBitmapsMap.clear(); + this.#drawFilter(); + } + #drawFilter() { + if (this.pageColors) { + const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background); + if (hcmFilterId !== "none") { + const savedFilter = this.ctx.filter; + this.ctx.filter = hcmFilterId; + this.ctx.drawImage(this.ctx.canvas, 0, 0); + this.ctx.filter = savedFilter; + } + } + } + _scaleImage(img, inverseTransform) { + const width = img.width ?? img.displayWidth; + const height = img.height ?? img.displayHeight; + let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); + let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + let paintWidth = width, + paintHeight = height; + let tmpCanvasId = "prescale1"; + let tmpCanvas, tmpCtx; + while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { + let newWidth = paintWidth, + newHeight = paintHeight; + if (widthScale > 2 && paintWidth > 1) { + newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2); + widthScale /= paintWidth / newWidth; + } + if (heightScale > 2 && paintHeight > 1) { + newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : Math.ceil(paintHeight) / 2; + heightScale /= paintHeight / newHeight; + } + tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); + tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, newWidth, newHeight); + tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + img = tmpCanvas.canvas; + paintWidth = newWidth; + paintHeight = newHeight; + tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1"; + } + return { + img, + paintWidth, + paintHeight + }; + } + _createMaskCanvas(img) { + const ctx = this.ctx; + const { + width, + height + } = img; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const currentTransform = getCurrentTransform(ctx); + let cache, cacheKey, scaled, maskCanvas; + if ((img.bitmap || img.data) && img.count > 1) { + const mainKey = img.bitmap || img.data.buffer; + cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); + cache = this._cachedBitmapsMap.get(mainKey); + if (!cache) { + cache = new Map(); + this._cachedBitmapsMap.set(mainKey, cache); + } + const cachedImage = cache.get(cacheKey); + if (cachedImage && !isPatternFill) { + const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); + const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); + return { + canvas: cachedImage, + offsetX, + offsetY + }; + } + scaled = cachedImage; + } + if (!scaled) { + maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + putBinaryImageMask(maskCanvas.context, img); + } + let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox([0, 0, width, height], maskToCanvas); + const drawnWidth = Math.round(maxX - minX) || 1; + const drawnHeight = Math.round(maxY - minY) || 1; + const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); + const fillCtx = fillCanvas.context; + const offsetX = minX; + const offsetY = minY; + fillCtx.translate(-offsetX, -offsetY); + fillCtx.transform(...maskToCanvas); + if (!scaled) { + scaled = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx)); + scaled = scaled.img; + if (cache && isPatternFill) { + cache.set(cacheKey, scaled); + } + } + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate); + drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + fillCtx.globalCompositeOperation = "source-in"; + const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) : fillColor; + fillCtx.fillRect(0, 0, width, height); + if (cache && !isPatternFill) { + this.cachedCanvases.delete("fillCanvas"); + cache.set(cacheKey, fillCanvas.canvas); + } + return { + canvas: fillCanvas.canvas, + offsetX: Math.round(offsetX), + offsetY: Math.round(offsetY) + }; + } + setLineWidth(width) { + if (width !== this.current.lineWidth) { + this._cachedScaleForStroking[0] = -1; + } + this.current.lineWidth = width; + this.ctx.lineWidth = width; + } + setLineCap(style) { + this.ctx.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(style) { + this.ctx.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(limit) { + this.ctx.miterLimit = limit; + } + setDash(dashArray, dashPhase) { + const ctx = this.ctx; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + } + setRenderingIntent(intent) {} + setFlatness(flatness) {} + setGState(states) { + for (const [key, value] of states) { + switch (key) { + case "LW": + this.setLineWidth(value); + break; + case "LC": + this.setLineCap(value); + break; + case "LJ": + this.setLineJoin(value); + break; + case "ML": + this.setMiterLimit(value); + break; + case "D": + this.setDash(value[0], value[1]); + break; + case "RI": + this.setRenderingIntent(value); + break; + case "FL": + this.setFlatness(value); + break; + case "Font": + this.setFont(value[0], value[1]); + break; + case "CA": + this.current.strokeAlpha = value; + break; + case "ca": + this.current.fillAlpha = value; + this.ctx.globalAlpha = value; + break; + case "BM": + this.ctx.globalCompositeOperation = value; + break; + case "SMask": + this.current.activeSMask = value ? this.tempSMask : null; + this.tempSMask = null; + this.checkSMaskState(); + break; + case "TR": + this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value); + break; + } + } + } + get inSMaskMode() { + return !!this.suspendedCtx; + } + checkSMaskState() { + const inSMaskMode = this.inSMaskMode; + if (this.current.activeSMask && !inSMaskMode) { + this.beginSMaskMode(); + } else if (!this.current.activeSMask && inSMaskMode) { + this.endSMaskMode(); + } + } + beginSMaskMode() { + if (this.inSMaskMode) { + throw new Error("beginSMaskMode called while already in smask mode"); + } + const drawnWidth = this.ctx.canvas.width; + const drawnHeight = this.ctx.canvas.height; + const cacheId = "smaskGroupAt" + this.groupLevel; + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + this.suspendedCtx = this.ctx; + this.ctx = scratchCanvas.context; + const ctx = this.ctx; + ctx.setTransform(...getCurrentTransform(this.suspendedCtx)); + copyCtxState(this.suspendedCtx, ctx); + mirrorContextOperations(ctx, this.suspendedCtx); + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + } + endSMaskMode() { + if (!this.inSMaskMode) { + throw new Error("endSMaskMode called while not in smask mode"); + } + this.ctx._removeMirroring(); + copyCtxState(this.ctx, this.suspendedCtx); + this.ctx = this.suspendedCtx; + this.suspendedCtx = null; + } + compose(dirtyBox) { + if (!this.current.activeSMask) { + return; + } + if (!dirtyBox) { + dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; + } else { + dirtyBox[0] = Math.floor(dirtyBox[0]); + dirtyBox[1] = Math.floor(dirtyBox[1]); + dirtyBox[2] = Math.ceil(dirtyBox[2]); + dirtyBox[3] = Math.ceil(dirtyBox[3]); + } + const smask = this.current.activeSMask; + const suspendedCtx = this.suspendedCtx; + this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox); + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); + this.ctx.restore(); + } + composeSMask(ctx, smask, layerCtx, layerBox) { + const layerOffsetX = layerBox[0]; + const layerOffsetY = layerBox[1]; + const layerWidth = layerBox[2] - layerOffsetX; + const layerHeight = layerBox[3] - layerOffsetY; + if (layerWidth === 0 || layerHeight === 0) { + return; + } + this.genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY); + ctx.save(); + ctx.globalAlpha = 1; + ctx.globalCompositeOperation = "source-over"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(layerCtx.canvas, 0, 0); + ctx.restore(); + } + genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { + let maskCanvas = maskCtx.canvas; + let maskX = layerOffsetX - maskOffsetX; + let maskY = layerOffsetY - maskOffsetY; + if (backdrop) { + const backdropRGB = Util.makeHexColor(...backdrop); + if (maskX < 0 || maskY < 0 || maskX + width > maskCanvas.width || maskY + height > maskCanvas.height) { + const canvas = this.cachedCanvases.getCanvas("maskExtension", width, height); + const ctx = canvas.context; + ctx.drawImage(maskCanvas, -maskX, -maskY); + ctx.globalCompositeOperation = "destination-atop"; + ctx.fillStyle = backdropRGB; + ctx.fillRect(0, 0, width, height); + ctx.globalCompositeOperation = "source-over"; + maskCanvas = canvas.canvas; + maskX = maskY = 0; + } else { + maskCtx.save(); + maskCtx.globalAlpha = 1; + maskCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(maskX, maskY, width, height); + maskCtx.clip(clip); + maskCtx.globalCompositeOperation = "destination-atop"; + maskCtx.fillStyle = backdropRGB; + maskCtx.fillRect(maskX, maskY, width, height); + maskCtx.restore(); + } + } + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + if (subtype === "Alpha" && transferMap) { + layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap); + } else if (subtype === "Luminosity") { + layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap); + } + const clip = new Path2D(); + clip.rect(layerOffsetX, layerOffsetY, width, height); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(maskCanvas, maskX, maskY, width, height, layerOffsetX, layerOffsetY, width, height); + layerCtx.restore(); + } + save() { + if (this.inSMaskMode) { + copyCtxState(this.ctx, this.suspendedCtx); + this.suspendedCtx.save(); + } else { + this.ctx.save(); + } + const old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + } + restore() { + if (this.stateStack.length === 0 && this.inSMaskMode) { + this.endSMaskMode(); + } + if (this.stateStack.length !== 0) { + this.current = this.stateStack.pop(); + if (this.inSMaskMode) { + this.suspendedCtx.restore(); + copyCtxState(this.suspendedCtx, this.ctx); + } else { + this.ctx.restore(); + } + this.checkSMaskState(); + this.pendingClip = null; + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + } + transform(a, b, c, d, e, f) { + this.ctx.transform(a, b, c, d, e, f); + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + constructPath(ops, args, minMax) { + const ctx = this.ctx; + const current = this.current; + let x = current.x, + y = current.y; + let startX, startY; + const currentTransform = getCurrentTransform(ctx); + const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0; + const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null; + for (let i = 0, j = 0, ii = ops.length; i < ii; i++) { + switch (ops[i] | 0) { + case OPS.rectangle: + x = args[j++]; + y = args[j++]; + const width = args[j++]; + const height = args[j++]; + const xw = x + width; + const yh = y + height; + ctx.moveTo(x, y); + if (width === 0 || height === 0) { + ctx.lineTo(xw, yh); + } else { + ctx.lineTo(xw, y); + ctx.lineTo(xw, yh); + ctx.lineTo(x, yh); + } + if (!isScalingMatrix) { + current.updateRectMinMax(currentTransform, [x, y, xw, yh]); + } + ctx.closePath(); + break; + case OPS.moveTo: + x = args[j++]; + y = args[j++]; + ctx.moveTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case OPS.lineTo: + x = args[j++]; + y = args[j++]; + ctx.lineTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case OPS.curveTo: + startX = x; + startY = y; + x = args[j + 4]; + y = args[j + 5]; + ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier); + j += 6; + break; + case OPS.curveTo2: + startX = x; + startY = y; + ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); + current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier); + x = args[j + 2]; + y = args[j + 3]; + j += 4; + break; + case OPS.curveTo3: + startX = x; + startY = y; + x = args[j + 2]; + y = args[j + 3]; + ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier); + j += 4; + break; + case OPS.closePath: + ctx.closePath(); + break; + } + } + if (isScalingMatrix) { + current.updateScalingPathMinMax(currentTransform, minMaxForBezier); + } + current.setCurrentPoint(x, y); + } + closePath() { + this.ctx.closePath(); + } + stroke(consumePath = true) { + const ctx = this.ctx; + const strokeColor = this.current.strokeColor; + ctx.globalAlpha = this.current.strokeAlpha; + if (this.contentVisible) { + if (typeof strokeColor === "object" && strokeColor?.getPattern) { + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE); + this.rescaleAndStroke(false); + ctx.restore(); + } else { + this.rescaleAndStroke(true); + } + } + if (consumePath) { + this.consumePath(this.current.getClippedPathBoundingBox()); + } + ctx.globalAlpha = this.current.fillAlpha; + } + closeStroke() { + this.closePath(); + this.stroke(); + } + fill(consumePath = true) { + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; + if (isPatternFill) { + ctx.save(); + ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + needRestore = true; + } + const intersect = this.current.getClippedPathBoundingBox(); + if (this.contentVisible && intersect !== null) { + if (this.pendingEOFill) { + ctx.fill("evenodd"); + this.pendingEOFill = false; + } else { + ctx.fill(); + } + } + if (needRestore) { + ctx.restore(); + } + if (consumePath) { + this.consumePath(intersect); + } + } + eoFill() { + this.pendingEOFill = true; + this.fill(); + } + fillStroke() { + this.fill(false); + this.stroke(false); + this.consumePath(); + } + eoFillStroke() { + this.pendingEOFill = true; + this.fillStroke(); + } + closeFillStroke() { + this.closePath(); + this.fillStroke(); + } + closeEOFillStroke() { + this.pendingEOFill = true; + this.closePath(); + this.fillStroke(); + } + endPath() { + this.consumePath(); + } + clip() { + this.pendingClip = NORMAL_CLIP; + } + eoClip() { + this.pendingClip = EO_CLIP; + } + beginText() { + this.current.textMatrix = IDENTITY_MATRIX; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + endText() { + const paths = this.pendingTextPaths; + const ctx = this.ctx; + if (paths === undefined) { + ctx.beginPath(); + return; + } + ctx.save(); + ctx.beginPath(); + for (const path of paths) { + ctx.setTransform(...path.transform); + ctx.translate(path.x, path.y); + path.addToPath(ctx, path.fontSize); + } + ctx.restore(); + ctx.clip(); + ctx.beginPath(); + delete this.pendingTextPaths; + } + setCharSpacing(spacing) { + this.current.charSpacing = spacing; + } + setWordSpacing(spacing) { + this.current.wordSpacing = spacing; + } + setHScale(scale) { + this.current.textHScale = scale / 100; + } + setLeading(leading) { + this.current.leading = -leading; + } + setFont(fontRefName, size) { + const fontObj = this.commonObjs.get(fontRefName); + const current = this.current; + if (!fontObj) { + throw new Error(`Can't find font for ${fontRefName}`); + } + current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + warn("Invalid font matrix for font " + fontRefName); + } + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + this.current.font = fontObj; + this.current.fontSize = size; + if (fontObj.isType3Font) { + return; + } + const name = fontObj.loadedName || "sans-serif"; + const typeface = fontObj.systemFontInfo?.css || `"${name}", ${fontObj.fallbackName}`; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + let browserFontSize = size; + if (size < MIN_FONT_SIZE) { + browserFontSize = MIN_FONT_SIZE; + } else if (size > MAX_FONT_SIZE) { + browserFontSize = MAX_FONT_SIZE; + } + this.current.fontSizeScale = size / browserFontSize; + this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; + } + setTextRenderingMode(mode) { + this.current.textRenderingMode = mode; + } + setTextRise(rise) { + this.current.textRise = rise; + } + moveText(x, y) { + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + } + setLeadingMoveText(x, y) { + this.setLeading(-y); + this.moveText(x, y); + } + setTextMatrix(a, b, c, d, e, f) { + this.current.textMatrix = [a, b, c, d, e, f]; + this.current.textMatrixScale = Math.hypot(a, b); + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + nextLine() { + this.moveText(0, this.current.leading); + } + paintChar(character, x, y, patternFillTransform, patternStrokeTransform) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const textRenderingMode = current.textRenderingMode; + const fontSize = current.fontSize / current.fontSizeScale; + const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + const patternFill = current.patternFill && !font.missingFile; + const patternStroke = current.patternStroke && !font.missingFile; + let addToPath; + if (font.disableFontFace || isAddToPathSet || patternFill || patternStroke) { + addToPath = font.getPathGenerator(this.commonObjs, character); + } + if (font.disableFontFace || patternFill || patternStroke) { + ctx.save(); + ctx.translate(x, y); + ctx.beginPath(); + addToPath(ctx, fontSize); + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternFillTransform) { + ctx.setTransform(...patternFillTransform); + } + ctx.fill(); + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternStrokeTransform) { + ctx.setTransform(...patternStrokeTransform); + } + ctx.stroke(); + } + ctx.restore(); + } else { + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.fillText(character, x, y); + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.strokeText(character, x, y); + } + } + if (isAddToPathSet) { + const paths = this.pendingTextPaths ||= []; + paths.push({ + transform: getCurrentTransform(ctx), + x, + y, + fontSize, + addToPath + }); + } + } + get isFontSubpixelAAEnabled() { + const { + context: ctx + } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); + ctx.scale(1.5, 1); + ctx.fillText("I", 0, 10); + const data = ctx.getImageData(0, 0, 10, 10).data; + let enabled = false; + for (let i = 3; i < data.length; i += 4) { + if (data[i] > 0 && data[i] < 255) { + enabled = true; + break; + } + } + return shadow(this, "isFontSubpixelAAEnabled", enabled); + } + showText(glyphs) { + const current = this.current; + const font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + const fontSize = current.fontSize; + if (fontSize === 0) { + return undefined; + } + const ctx = this.ctx; + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const glyphsLength = glyphs.length; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const defaultVMetrics = font.defaultVMetrics; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { + ctx.scale(textHScale, 1); + } + let patternFillTransform, patternStrokeTransform; + if (current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + patternFillTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + if (current.patternStroke) { + ctx.save(); + const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE); + patternStrokeTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.strokeStyle = pattern; + } + let lineWidth = current.lineWidth; + const scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + lineWidth = this.getSinglePixelWidth(); + } + } else { + lineWidth /= scale; + } + if (fontSizeScale !== 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + ctx.lineWidth = lineWidth; + if (font.isInvalidPDFjsFont) { + const chars = []; + let width = 0; + for (const glyph of glyphs) { + chars.push(glyph.unicode); + width += glyph.width; + } + ctx.fillText(chars.join(""), 0, 0); + current.x += width * widthAdvanceScale * textHScale; + ctx.restore(); + this.compose(); + return undefined; + } + let x = 0, + i; + for (i = 0; i < glyphsLength; ++i) { + const glyph = glyphs[i]; + if (typeof glyph === "number") { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + let restoreNeeded = false; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + const accent = glyph.accent; + let scaledX, scaledY; + let width = glyph.width; + if (vertical) { + const vmetric = glyph.vmetric || defaultVMetrics; + const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale; + const vy = vmetric[2] * widthAdvanceScale; + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; + } else { + scaledX = x / fontSizeScale; + scaledY = 0; + } + if (font.remeasure && width > 0) { + const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + if (width < measuredWidth && this.isFontSubpixelAAEnabled) { + const characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; + } else if (width !== measuredWidth) { + scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; + } + } + if (this.contentVisible && (glyph.isInFont || font.missingFile)) { + if (simpleFillText && !accent) { + ctx.fillText(character, scaledX, scaledY); + } else { + this.paintChar(character, scaledX, scaledY, patternFillTransform, patternStrokeTransform); + if (accent) { + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform); + } + } + } + const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection; + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + ctx.restore(); + this.compose(); + return undefined; + } + showType3Text(glyphs) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + const fontDirection = current.fontDirection; + const spacingDir = font.vertical ? 1 : -1; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const textHScale = current.textHScale * fontDirection; + const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y); + ctx.scale(textHScale, fontDirection); + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (typeof glyph === "number") { + spacingLength = spacingDir * glyph * fontSize / 1000; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; + } + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const operatorList = font.charProcOperatorList[glyph.operatorListId]; + if (!operatorList) { + warn(`Type3 character "${glyph.operatorListId}" is not available.`); + continue; + } + if (this.contentVisible) { + this.processingType3 = glyph; + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform(...fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + } + const transformed = Util.applyTransform([glyph.width, 0], fontMatrix); + width = transformed[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + this.processingType3 = null; + } + setCharWidth(xWidth, yWidth) {} + setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { + this.ctx.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(); + this.endPath(); + } + getColorN_Pattern(IR) { + let pattern; + if (IR[0] === "TilingPattern") { + const color = IR[1]; + const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); + const canvasGraphicsFactory = { + createCanvasGraphics: ctx => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig: this.optionalContentConfig, + markedContentStack: this.markedContentStack + }) + }; + pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = this._getPattern(IR[1], IR[2]); + } + return pattern; + } + setStrokeColorN() { + this.current.strokeColor = this.getColorN_Pattern(arguments); + this.current.patternStroke = true; + } + setFillColorN() { + this.current.fillColor = this.getColorN_Pattern(arguments); + this.current.patternFill = true; + } + setStrokeRGBColor(r, g, b) { + this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(r, g, b); + this.current.patternStroke = false; + } + setStrokeTransparent() { + this.ctx.strokeStyle = this.current.strokeColor = "transparent"; + this.current.patternStroke = false; + } + setFillRGBColor(r, g, b) { + this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b); + this.current.patternFill = false; + } + setFillTransparent() { + this.ctx.fillStyle = this.current.fillColor = "transparent"; + this.current.patternFill = false; + } + _getPattern(objId, matrix = null) { + let pattern; + if (this.cachedPatterns.has(objId)) { + pattern = this.cachedPatterns.get(objId); + } else { + pattern = getShadingPattern(this.getObject(objId)); + this.cachedPatterns.set(objId, pattern); + } + if (matrix) { + pattern.matrix = matrix; + } + return pattern; + } + shadingFill(objId) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + this.save(); + const pattern = this._getPattern(objId); + ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING); + const inv = getCurrentTransformInverse(ctx); + if (inv) { + const { + width, + height + } = ctx.canvas; + const [x0, y0, x1, y1] = Util.getAxialAlignedBoundingBox([0, 0, width, height], inv); + this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.compose(this.current.getClippedPathBoundingBox()); + this.restore(); + } + beginInlineImage() { + unreachable("Should not call beginInlineImage"); + } + beginImageData() { + unreachable("Should not call beginImageData"); + } + paintFormXObjectBegin(matrix, bbox) { + if (!this.contentVisible) { + return; + } + this.save(); + this.baseTransformStack.push(this.baseTransform); + if (matrix) { + this.transform(...matrix); + } + this.baseTransform = getCurrentTransform(this.ctx); + if (bbox) { + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + this.ctx.rect(bbox[0], bbox[1], width, height); + this.current.updateRectMinMax(getCurrentTransform(this.ctx), bbox); + this.clip(); + this.endPath(); + } + } + paintFormXObjectEnd() { + if (!this.contentVisible) { + return; + } + this.restore(); + this.baseTransform = this.baseTransformStack.pop(); + } + beginGroup(group) { + if (!this.contentVisible) { + return; + } + this.save(); + if (this.inSMaskMode) { + this.endSMaskMode(); + this.current.activeSMask = null; + } + const currentCtx = this.ctx; + if (!group.isolated) { + info("TODO: Support non-isolated groups."); + } + if (group.knockout) { + warn("Knockout groups not supported."); + } + const currentTransform = getCurrentTransform(currentCtx); + if (group.matrix) { + currentCtx.transform(...group.matrix); + } + if (!group.bbox) { + throw new Error("Bounding box is required."); + } + let bounds = Util.getAxialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx)); + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); + let cacheId = "groupAt" + this.groupLevel; + if (group.smask) { + cacheId += "_smask_" + this.smaskCounter++ % 2; + } + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + const groupCtx = scratchCanvas.context; + groupCtx.translate(-offsetX, -offsetY); + groupCtx.transform(...currentTransform); + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX, + offsetY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null, + startTransformInverse: null + }); + } else { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.save(); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this.groupStack.push(currentCtx); + this.groupLevel++; + } + endGroup(group) { + if (!this.contentVisible) { + return; + } + this.groupLevel--; + const groupCtx = this.ctx; + const ctx = this.groupStack.pop(); + this.ctx = ctx; + this.ctx.imageSmoothingEnabled = false; + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + this.restore(); + } else { + this.ctx.restore(); + const currentMtx = getCurrentTransform(this.ctx); + this.restore(); + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + const dirtyBox = Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx); + this.ctx.drawImage(groupCtx.canvas, 0, 0); + this.ctx.restore(); + this.compose(dirtyBox); + } + } + beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { + this.#restoreInitialState(); + resetCtxToDefault(this.ctx); + this.ctx.save(); + this.save(); + if (this.baseTransform) { + this.ctx.setTransform(...this.baseTransform); + } + if (rect) { + const width = rect[2] - rect[0]; + const height = rect[3] - rect[1]; + if (hasOwnCanvas && this.annotationCanvasMap) { + transform = transform.slice(); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + rect = rect.slice(); + rect[0] = rect[1] = 0; + rect[2] = width; + rect[3] = height; + const [scaleX, scaleY] = Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx)); + const { + viewportScale + } = this; + const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale); + const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale); + this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight); + const { + canvas, + context + } = this.annotationCanvas; + this.annotationCanvasMap.set(id, canvas); + this.annotationCanvas.savedCtx = this.ctx; + this.ctx = context; + this.ctx.save(); + this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); + resetCtxToDefault(this.ctx); + } else { + resetCtxToDefault(this.ctx); + this.endPath(); + this.ctx.rect(rect[0], rect[1], width, height); + this.ctx.clip(); + this.ctx.beginPath(); + } + } + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.transform(...transform); + this.transform(...matrix); + } + endAnnotation() { + if (this.annotationCanvas) { + this.ctx.restore(); + this.#drawFilter(); + this.ctx = this.annotationCanvas.savedCtx; + delete this.annotationCanvas.savedCtx; + delete this.annotationCanvas; + } + } + paintImageMaskXObject(img) { + if (!this.contentVisible) { + return; + } + const count = img.count; + img = this.getObject(img.data, img); + img.count = count; + const ctx = this.ctx; + const glyph = this.processingType3; + if (glyph) { + if (glyph.compiled === undefined) { + glyph.compiled = compileType3Glyph(img); + } + if (glyph.compiled) { + glyph.compiled(ctx); + return; + } + } + const mask = this._createMaskCanvas(img); + const maskCanvas = mask.canvas; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectRepeat(img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { + if (!this.contentVisible) { + return; + } + img = this.getObject(img.data, img); + const ctx = this.ctx; + ctx.save(); + const currentTransform = getCurrentTransform(ctx); + ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); + const mask = this._createMaskCanvas(img); + ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + const [x, y] = Util.applyTransform([0, 0], trans); + ctx.drawImage(mask.canvas, x, y); + } + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectGroup(images) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + for (const image of images) { + const { + data, + width, + height, + transform + } = image; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; + maskCtx.save(); + const img = this.getObject(data, image); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = "source-in"; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + ctx.save(); + ctx.transform(...transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintImageXObject(objId) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + this.paintInlineImageXObject(imgData); + } + paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + const width = imgData.width; + const height = imgData.height; + const map = []; + for (let i = 0, ii = positions.length; i < ii; i += 2) { + map.push({ + transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], + x: 0, + y: 0, + w: width, + h: height + }); + } + this.paintInlineImageXObjectGroup(imgData, map); + } + applyTransferMapsToCanvas(ctx) { + if (this.current.transferMaps !== "none") { + ctx.filter = this.current.transferMaps; + ctx.drawImage(ctx.canvas, 0, 0); + ctx.filter = "none"; + } + return ctx.canvas; + } + applyTransferMapsToBitmap(imgData) { + if (this.current.transferMaps === "none") { + return imgData.bitmap; + } + const { + bitmap, + width, + height + } = imgData; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.filter = this.current.transferMaps; + tmpCtx.drawImage(bitmap, 0, 0); + tmpCtx.filter = "none"; + return tmpCanvas.canvas; + } + paintInlineImageXObject(imgData) { + if (!this.contentVisible) { + return; + } + const width = imgData.width; + const height = imgData.height; + const ctx = this.ctx; + this.save(); + if (!isNodeJS) { + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + } + ctx.scale(1 / width, -1 / height); + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = this.applyTransferMapsToBitmap(imgData); + } else if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { + imgToPaint = imgData; + } else { + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate); + drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + this.compose(); + this.restore(); + } + paintInlineImageXObjectGroup(imgData, map) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = imgData.bitmap; + } else { + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + for (const entry of map) { + ctx.save(); + ctx.transform(...entry.transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintSolidColorImageMask() { + if (!this.contentVisible) { + return; + } + this.ctx.fillRect(0, 0, 1, 1); + this.compose(); + } + markPoint(tag) {} + markPointProps(tag, properties) {} + beginMarkedContent(tag) { + this.markedContentStack.push({ + visible: true + }); + } + beginMarkedContentProps(tag, properties) { + if (tag === "OC") { + this.markedContentStack.push({ + visible: this.optionalContentConfig.isVisible(properties) + }); + } else { + this.markedContentStack.push({ + visible: true + }); + } + this.contentVisible = this.isContentVisible(); + } + endMarkedContent() { + this.markedContentStack.pop(); + this.contentVisible = this.isContentVisible(); + } + beginCompat() {} + endCompat() {} + consumePath(clipBox) { + const isEmpty = this.current.isEmptyClip(); + if (this.pendingClip) { + this.current.updateClipFromPath(); + } + if (!this.pendingClip) { + this.compose(clipBox); + } + const ctx = this.ctx; + if (this.pendingClip) { + if (!isEmpty) { + if (this.pendingClip === EO_CLIP) { + ctx.clip("evenodd"); + } else { + ctx.clip(); + } + } + this.pendingClip = null; + } + this.current.startNewPathAndClipBox(this.current.clipBox); + ctx.beginPath(); + } + getSinglePixelWidth() { + if (!this._cachedGetSinglePixelWidth) { + const m = getCurrentTransform(this.ctx); + if (m[1] === 0 && m[2] === 0) { + this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); + } else { + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const normX = Math.hypot(m[0], m[2]); + const normY = Math.hypot(m[1], m[3]); + this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet; + } + } + return this._cachedGetSinglePixelWidth; + } + getScaleForStroking() { + if (this._cachedScaleForStroking[0] === -1) { + const { + lineWidth + } = this.current; + const { + a, + b, + c, + d + } = this.ctx.getTransform(); + let scaleX, scaleY; + if (b === 0 && c === 0) { + const normX = Math.abs(a); + const normY = Math.abs(d); + if (normX === normY) { + if (lineWidth === 0) { + scaleX = scaleY = 1 / normX; + } else { + const scaledLineWidth = normX * lineWidth; + scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1; + } + } else if (lineWidth === 0) { + scaleX = 1 / normX; + scaleY = 1 / normY; + } else { + const scaledXLineWidth = normX * lineWidth; + const scaledYLineWidth = normY * lineWidth; + scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1; + scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1; + } + } else { + const absDet = Math.abs(a * d - b * c); + const normX = Math.hypot(a, b); + const normY = Math.hypot(c, d); + if (lineWidth === 0) { + scaleX = normY / absDet; + scaleY = normX / absDet; + } else { + const baseArea = lineWidth * absDet; + scaleX = normY > baseArea ? normY / baseArea : 1; + scaleY = normX > baseArea ? normX / baseArea : 1; + } + } + this._cachedScaleForStroking[0] = scaleX; + this._cachedScaleForStroking[1] = scaleY; + } + return this._cachedScaleForStroking; + } + rescaleAndStroke(saveRestore) { + const { + ctx + } = this; + const { + lineWidth + } = this.current; + const [scaleX, scaleY] = this.getScaleForStroking(); + ctx.lineWidth = lineWidth || 1; + if (scaleX === 1 && scaleY === 1) { + ctx.stroke(); + return; + } + const dashes = ctx.getLineDash(); + if (saveRestore) { + ctx.save(); + } + ctx.scale(scaleX, scaleY); + if (dashes.length > 0) { + const scale = Math.max(scaleX, scaleY); + ctx.setLineDash(dashes.map(x => x / scale)); + ctx.lineDashOffset /= scale; + } + ctx.stroke(); + if (saveRestore) { + ctx.restore(); + } + } + isContentVisible() { + for (let i = this.markedContentStack.length - 1; i >= 0; i--) { + if (!this.markedContentStack[i].visible) { + return false; + } + } + return true; + } +} +for (const op in OPS) { + if (CanvasGraphics.prototype[op] !== undefined) { + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; + } +} + +;// ./src/display/worker_options.js +class GlobalWorkerOptions { + static #port = null; + static #src = ""; + static get workerPort() { + return this.#port; + } + static set workerPort(val) { + if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { + throw new Error("Invalid `workerPort` type."); + } + this.#port = val; + } + static get workerSrc() { + return this.#src; + } + static set workerSrc(val) { + if (typeof val !== "string") { + throw new Error("Invalid `workerSrc` type."); + } + this.#src = val; + } +} + +;// ./src/shared/message_handler.js + +const CallbackKind = { + UNKNOWN: 0, + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + UNKNOWN: 0, + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(reason) { + if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (reason.name) { + case "AbortException": + return new AbortException(reason.message); + case "MissingPDFException": + return new MissingPDFException(reason.message); + case "PasswordException": + return new PasswordException(reason.message, reason.code); + case "UnexpectedResponseException": + return new UnexpectedResponseException(reason.message, reason.status); + case "UnknownErrorException": + return new UnknownErrorException(reason.message, reason.details); + default: + return new UnknownErrorException(reason.message, reason.toString()); + } +} +class MessageHandler { + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + Promise.try(action, data.data, streamSink).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/display/metadata.js + +class Metadata { + #metadataMap; + #data; + constructor({ + parsedData, + rawData + }) { + this.#metadataMap = parsedData; + this.#data = rawData; + } + getRaw() { + return this.#data; + } + get(name) { + return this.#metadataMap.get(name) ?? null; + } + getAll() { + return objectFromMap(this.#metadataMap); + } + has(name) { + return this.#metadataMap.has(name); + } +} + +;// ./src/display/optional_content_config.js + + +const INTERNAL = Symbol("INTERNAL"); +class OptionalContentGroup { + #isDisplay = false; + #isPrint = false; + #userSet = false; + #visible = true; + constructor(renderingIntent, { + name, + intent, + usage, + rbGroups + }) { + this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY); + this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + this.name = name; + this.intent = intent; + this.usage = usage; + this.rbGroups = rbGroups; + } + get visible() { + if (this.#userSet) { + return this.#visible; + } + if (!this.#visible) { + return false; + } + const { + print, + view + } = this.usage; + if (this.#isDisplay) { + return view?.viewState !== "OFF"; + } else if (this.#isPrint) { + return print?.printState !== "OFF"; + } + return true; + } + _setVisible(internal, visible, userSet = false) { + if (internal !== INTERNAL) { + unreachable("Internal method `_setVisible` called."); + } + this.#userSet = userSet; + this.#visible = visible; + } +} +class OptionalContentConfig { + #cachedGetHash = null; + #groups = new Map(); + #initialHash = null; + #order = null; + constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) { + this.renderingIntent = renderingIntent; + this.name = null; + this.creator = null; + if (data === null) { + return; + } + this.name = data.name; + this.creator = data.creator; + this.#order = data.order; + for (const group of data.groups) { + this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group)); + } + if (data.baseState === "OFF") { + for (const group of this.#groups.values()) { + group._setVisible(INTERNAL, false); + } + } + for (const on of data.on) { + this.#groups.get(on)._setVisible(INTERNAL, true); + } + for (const off of data.off) { + this.#groups.get(off)._setVisible(INTERNAL, false); + } + this.#initialHash = this.getHash(); + } + #evaluateVisibilityExpression(array) { + const length = array.length; + if (length < 2) { + return true; + } + const operator = array[0]; + for (let i = 1; i < length; i++) { + const element = array[i]; + let state; + if (Array.isArray(element)) { + state = this.#evaluateVisibilityExpression(element); + } else if (this.#groups.has(element)) { + state = this.#groups.get(element).visible; + } else { + warn(`Optional content group not found: ${element}`); + return true; + } + switch (operator) { + case "And": + if (!state) { + return false; + } + break; + case "Or": + if (state) { + return true; + } + break; + case "Not": + return !state; + default: + return true; + } + } + return operator === "And"; + } + isVisible(group) { + if (this.#groups.size === 0) { + return true; + } + if (!group) { + info("Optional content group not defined."); + return true; + } + if (group.type === "OCG") { + if (!this.#groups.has(group.id)) { + warn(`Optional content group not found: ${group.id}`); + return true; + } + return this.#groups.get(group.id).visible; + } else if (group.type === "OCMD") { + if (group.expression) { + return this.#evaluateVisibilityExpression(group.expression); + } + if (!group.policy || group.policy === "AnyOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return false; + } + } + return true; + } else if (group.policy === "AnyOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return false; + } + } + return true; + } + warn(`Unknown optional content policy ${group.policy}.`); + return true; + } + warn(`Unknown group type ${group.type}.`); + return true; + } + setVisibility(id, visible = true, preserveRB = true) { + const group = this.#groups.get(id); + if (!group) { + warn(`Optional content group not found: ${id}`); + return; + } + if (preserveRB && visible && group.rbGroups.length) { + for (const rbGroup of group.rbGroups) { + for (const otherId of rbGroup) { + if (otherId !== id) { + this.#groups.get(otherId)?._setVisible(INTERNAL, false, true); + } + } + } + } + group._setVisible(INTERNAL, !!visible, true); + this.#cachedGetHash = null; + } + setOCGState({ + state, + preserveRB + }) { + let operator; + for (const elem of state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + const group = this.#groups.get(elem); + if (!group) { + continue; + } + switch (operator) { + case "ON": + this.setVisibility(elem, true, preserveRB); + break; + case "OFF": + this.setVisibility(elem, false, preserveRB); + break; + case "Toggle": + this.setVisibility(elem, !group.visible, preserveRB); + break; + } + } + this.#cachedGetHash = null; + } + get hasInitialVisibility() { + return this.#initialHash === null || this.getHash() === this.#initialHash; + } + getOrder() { + if (!this.#groups.size) { + return null; + } + if (this.#order) { + return this.#order.slice(); + } + return [...this.#groups.keys()]; + } + getGroups() { + return this.#groups.size > 0 ? objectFromMap(this.#groups) : null; + } + getGroup(id) { + return this.#groups.get(id) || null; + } + getHash() { + if (this.#cachedGetHash !== null) { + return this.#cachedGetHash; + } + const hash = new MurmurHash3_64(); + for (const [id, group] of this.#groups) { + hash.update(`${id}:${group.visible}`); + } + return this.#cachedGetHash = hash.hexdigest(); + } +} + +;// ./src/display/transport_stream.js + + +class PDFDataTransportStream { + constructor(pdfDataRangeTransport, { + disableRange = false, + disableStream = false + }) { + assert(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); + const { + length, + initialData, + progressiveDone, + contentDispositionFilename + } = pdfDataRangeTransport; + this._queuedChunks = []; + this._progressiveDone = progressiveDone; + this._contentDispositionFilename = contentDispositionFilename; + if (initialData?.length > 0) { + const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer; + this._queuedChunks.push(buffer); + } + this._pdfDataRangeTransport = pdfDataRangeTransport; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; + this._contentLength = length; + this._fullRequestReader = null; + this._rangeReaders = []; + pdfDataRangeTransport.addRangeListener((begin, chunk) => { + this._onReceiveData({ + begin, + chunk + }); + }); + pdfDataRangeTransport.addProgressListener((loaded, total) => { + this._onProgress({ + loaded, + total + }); + }); + pdfDataRangeTransport.addProgressiveReadListener(chunk => { + this._onReceiveData({ + chunk + }); + }); + pdfDataRangeTransport.addProgressiveDoneListener(() => { + this._onProgressiveDone(); + }); + pdfDataRangeTransport.transportReady(); + } + _onReceiveData({ + begin, + chunk + }) { + const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer; + if (begin === undefined) { + if (this._fullRequestReader) { + this._fullRequestReader._enqueue(buffer); + } else { + this._queuedChunks.push(buffer); + } + } else { + const found = this._rangeReaders.some(function (rangeReader) { + if (rangeReader._begin !== begin) { + return false; + } + rangeReader._enqueue(buffer); + return true; + }); + assert(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + } + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + _onProgress(evt) { + if (evt.total === undefined) { + this._rangeReaders[0]?.onProgress?.({ + loaded: evt.loaded + }); + } else { + this._fullRequestReader?.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + } + } + _onProgressiveDone() { + this._fullRequestReader?.progressiveDone(); + this._progressiveDone = true; + } + _removeRangeReader(reader) { + const i = this._rangeReaders.indexOf(reader); + if (i >= 0) { + this._rangeReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once."); + const queuedChunks = this._queuedChunks; + this._queuedChunks = null; + return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename); + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFDataTransportStreamRangeReader(this, begin, end); + this._pdfDataRangeTransport.requestDataRange(begin, end); + this._rangeReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeReaders.slice(0)) { + reader.cancel(reason); + } + this._pdfDataRangeTransport.abort(); + } +} +class PDFDataTransportStreamReader { + constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) { + this._stream = stream; + this._done = progressiveDone || false; + this._filename = isPdfFile(contentDispositionFilename) ? contentDispositionFilename : null; + this._queuedChunks = queuedChunks || []; + this._loaded = 0; + for (const chunk of this._queuedChunks) { + this._loaded += chunk.byteLength; + } + this._requests = []; + this._headersReady = Promise.resolve(); + stream._fullRequestReader = this; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunks.push(chunk); + } + this._loaded += chunk.byteLength; + } + get headersReady() { + return this._headersReady; + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._stream._isRangeSupported; + } + get isStreamingSupported() { + return this._stream._isStreamingSupported; + } + get contentLength() { + return this._stream._contentLength; + } + async read() { + if (this._queuedChunks.length > 0) { + const chunk = this._queuedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + progressiveDone() { + if (this._done) { + return; + } + this._done = true; + } +} +class PDFDataTransportStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._begin = begin; + this._end = end; + this._queuedChunk = null; + this._requests = []; + this._done = false; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + const requestsCapability = this._requests.shift(); + requestsCapability.resolve({ + value: chunk, + done: false + }); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + this._done = true; + this._stream._removeRangeReader(this); + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._queuedChunk) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._stream._removeRangeReader(this); + } +} + +;// ./src/display/content_disposition.js + +function getFilenameFromContentDispositionHeader(contentDisposition) { + let needsEncodingFixup = true; + let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = unescape(filename); + filename = rfc5987decode(filename); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + tmp = rfc2231getparam(contentDisposition); + if (tmp) { + const filename = rfc2047decode(tmp); + return fixupEncoding(filename); + } + tmp = toParamRegExp("filename", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + function toParamRegExp(attributePattern, flags) { + return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + } + function textdecode(encoding, value) { + if (encoding) { + if (!/^[\x00-\xFF]+$/.test(value)) { + return value; + } + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch {} + } + return value; + } + function fixupEncoding(value) { + if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { + value = textdecode("utf-8", value); + if (needsEncodingFixup) { + value = textdecode("iso-8859-1", value); + } + } + return value; + } + function rfc2231getparam(contentDispositionStr) { + const matches = []; + let match; + const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); + while ((match = iter.exec(contentDispositionStr)) !== null) { + let [, n, quot, part] = match; + n = parseInt(n, 10); + if (n in matches) { + if (n === 0) { + break; + } + continue; + } + matches[n] = [quot, part]; + } + const parts = []; + for (let n = 0; n < matches.length; ++n) { + if (!(n in matches)) { + break; + } + let [quot, part] = matches[n]; + part = rfc2616unquote(part); + if (quot) { + part = unescape(part); + if (n === 0) { + part = rfc5987decode(part); + } + } + parts.push(part); + } + return parts.join(""); + } + function rfc2616unquote(value) { + if (value.startsWith('"')) { + const parts = value.slice(1).split('\\"'); + for (let i = 0; i < parts.length; ++i) { + const quotindex = parts[i].indexOf('"'); + if (quotindex !== -1) { + parts[i] = parts[i].slice(0, quotindex); + parts.length = i + 1; + } + parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); + } + value = parts.join('"'); + } + return value; + } + function rfc5987decode(extvalue) { + const encodingend = extvalue.indexOf("'"); + if (encodingend === -1) { + return extvalue; + } + const encoding = extvalue.slice(0, encodingend); + const langvalue = extvalue.slice(encodingend + 1); + const value = langvalue.replace(/^[^']*'/, ""); + return textdecode(encoding, value); + } + function rfc2047decode(value) { + if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { + return value; + } + return value.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replaceAll("_", " "); + text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch {} + return textdecode(charset, text); + }); + } + return ""; +} + +;// ./src/display/network_utils.js + + + +function createHeaders(isHttp, httpHeaders) { + const headers = new Headers(); + if (!isHttp || !httpHeaders || typeof httpHeaders !== "object") { + return headers; + } + for (const key in httpHeaders) { + const val = httpHeaders[key]; + if (val !== undefined) { + headers.append(key, val); + } + } + return headers; +} +function getResponseOrigin(url) { + try { + return new URL(url).origin; + } catch {} + return null; +} +function validateRangeRequestCapabilities({ + responseHeaders, + isHttp, + rangeChunkSize, + disableRange +}) { + const returnValues = { + allowRangeRequests: false, + suggestedLength: undefined + }; + const length = parseInt(responseHeaders.get("Content-Length"), 10); + if (!Number.isInteger(length)) { + return returnValues; + } + returnValues.suggestedLength = length; + if (length <= 2 * rangeChunkSize) { + return returnValues; + } + if (disableRange || !isHttp) { + return returnValues; + } + if (responseHeaders.get("Accept-Ranges") !== "bytes") { + return returnValues; + } + const contentEncoding = responseHeaders.get("Content-Encoding") || "identity"; + if (contentEncoding !== "identity") { + return returnValues; + } + returnValues.allowRangeRequests = true; + return returnValues; +} +function extractFilenameFromHeader(responseHeaders) { + const contentDisposition = responseHeaders.get("Content-Disposition"); + if (contentDisposition) { + let filename = getFilenameFromContentDispositionHeader(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch {} + } + if (isPdfFile(filename)) { + return filename; + } + } + return null; +} +function createResponseStatusError(status, url) { + if (status === 404 || status === 0 && url.startsWith("file:")) { + return new MissingPDFException('Missing PDF "' + url + '".'); + } + return new UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status); +} +function validateResponseStatus(status) { + return status === 200 || status === 206; +} + +;// ./src/display/fetch_stream.js + + +function createFetchOptions(headers, withCredentials, abortController) { + return { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" + }; +} +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; + } + if (val instanceof ArrayBuffer) { + return val; + } + warn(`getArrayBuffer - unexpected data format: ${val}`); + return new Uint8Array(val).buffer; +} +class PDFFetchStream { + _responseOrigin = null; + constructor(source) { + this.source = source; + this.isHttp = /^https?:/i.test(source.url); + this.headers = createHeaders(this.isHttp, source.httpHeaders); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFFetchStreamReader(this); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFFetchStreamRangeReader(this, begin, end); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFFetchStreamReader { + constructor(stream) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + this._filename = null; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._contentLength = source.length; + this._headersCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._abortController = new AbortController(); + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + const headers = new Headers(stream.headers); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + stream._responseOrigin = getResponseOrigin(response.url); + if (!validateResponseStatus(response.status)) { + throw createResponseStatusError(response.status, url); + } + this._reader = response.body.getReader(); + this._headersCapability.resolve(); + const responseHeaders = response.headers; + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + }).catch(this._headersCapability.reject); + this.onProgress = null; + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} +class PDFFetchStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._readCapability = Promise.withResolvers(); + this._isStreamingSupported = !source.disableStream; + this._abortController = new AbortController(); + const headers = new Headers(stream.headers); + headers.append("Range", `bytes=${begin}-${end - 1}`); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + const responseOrigin = getResponseOrigin(response.url); + if (responseOrigin !== stream._responseOrigin) { + throw new Error(`Expected range response-origin "${responseOrigin}" to match "${stream._responseOrigin}".`); + } + if (!validateResponseStatus(response.status)) { + throw createResponseStatusError(response.status, url); + } + this._readCapability.resolve(); + this._reader = response.body.getReader(); + }).catch(this._readCapability.reject); + this.onProgress = null; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} + +;// ./src/display/network.js + + +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function network_getArrayBuffer(xhr) { + const data = xhr.response; + if (typeof data !== "string") { + return data; + } + return stringToBytes(data).buffer; +} +class NetworkManager { + _responseOrigin = null; + constructor({ + url, + httpHeaders, + withCredentials + }) { + this.url = url; + this.isHttp = /^https?:/i.test(url); + this.headers = createHeaders(this.isHttp, httpHeaders); + this.withCredentials = withCredentials || false; + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + } + requestRange(begin, end, listeners) { + const args = { + begin, + end + }; + for (const prop in listeners) { + args[prop] = listeners[prop]; + } + return this.request(args); + } + requestFull(listeners) { + return this.request(listeners); + } + request(args) { + const xhr = new XMLHttpRequest(); + const xhrId = this.currXhrId++; + const pendingRequest = this.pendingRequests[xhrId] = { + xhr + }; + xhr.open("GET", this.url); + xhr.withCredentials = this.withCredentials; + for (const [key, val] of this.headers) { + xhr.setRequestHeader(key, val); + } + if (this.isHttp && "begin" in args && "end" in args) { + xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); + pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; + } else { + pendingRequest.expectedStatus = OK_RESPONSE; + } + xhr.responseType = "arraybuffer"; + if (args.onError) { + xhr.onerror = function (evt) { + args.onError(xhr.status); + }; + } + xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); + xhr.onprogress = this.onProgress.bind(this, xhrId); + pendingRequest.onHeadersReceived = args.onHeadersReceived; + pendingRequest.onDone = args.onDone; + pendingRequest.onError = args.onError; + pendingRequest.onProgress = args.onProgress; + xhr.send(null); + return xhrId; + } + onProgress(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + pendingRequest.onProgress?.(evt); + } + onStateChange(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + const xhr = pendingRequest.xhr; + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + if (xhr.readyState !== 4) { + return; + } + if (!(xhrId in this.pendingRequests)) { + return; + } + delete this.pendingRequests[xhrId]; + if (xhr.status === 0 && this.isHttp) { + pendingRequest.onError?.(xhr.status); + return; + } + const xhrStatus = xhr.status || OK_RESPONSE; + const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { + pendingRequest.onError?.(xhr.status); + return; + } + const chunk = network_getArrayBuffer(xhr); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + pendingRequest.onDone({ + begin: parseInt(matches[1], 10), + chunk + }); + } else if (chunk) { + pendingRequest.onDone({ + begin: 0, + chunk + }); + } else { + pendingRequest.onError?.(xhr.status); + } + } + getRequestXhr(xhrId) { + return this.pendingRequests[xhrId].xhr; + } + isPendingRequest(xhrId) { + return xhrId in this.pendingRequests; + } + abortRequest(xhrId) { + const xhr = this.pendingRequests[xhrId].xhr; + delete this.pendingRequests[xhrId]; + xhr.abort(); + } +} +class PDFNetworkStream { + constructor(source) { + this._source = source; + this._manager = new NetworkManager(source); + this._rangeChunkSize = source.rangeChunkSize; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + _onRangeRequestReaderClosed(reader) { + const i = this._rangeRequestReaders.indexOf(reader); + if (i >= 0) { + this._rangeRequestReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); + reader.onClosed = this._onRangeRequestReaderClosed.bind(this); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFNetworkStreamFullRequestReader { + constructor(manager, source) { + this._manager = manager; + const args = { + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = source.url; + this._fullRequestId = manager.requestFull(args); + this._headersCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._contentLength = source.length; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = false; + this._isRangeSupported = false; + this._cachedChunks = []; + this._requests = []; + this._done = false; + this._storedError = undefined; + this._filename = null; + this.onProgress = null; + } + _onHeadersReceived() { + const fullRequestXhrId = this._fullRequestId; + const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); + this._manager._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL); + const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders(); + const responseHeaders = new Headers(rawResponseHeaders ? rawResponseHeaders.trim().split(/[\r\n]+/).map(x => { + const [key, ...val] = x.split(": "); + return [key, val.join(": ")]; + }) : []); + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: this._manager.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + if (allowRangeRequests) { + this._isRangeSupported = true; + } + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (this._isRangeSupported) { + this._manager.abortRequest(fullRequestXhrId); + } + this._headersCapability.resolve(); + } + _onDone(data) { + if (data) { + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: data.chunk, + done: false + }); + } else { + this._cachedChunks.push(data.chunk); + } + } + this._done = true; + if (this._cachedChunks.length > 0) { + return; + } + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + _onError(status) { + this._storedError = createResponseStatusError(status, this._url); + this._headersCapability.reject(this._storedError); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._cachedChunks.length = 0; + } + _onProgress(evt) { + this.onProgress?.({ + loaded: evt.loaded, + total: evt.lengthComputable ? evt.total : this._contentLength + }); + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get contentLength() { + return this._contentLength; + } + get headersReady() { + return this._headersCapability.promise; + } + async read() { + await this._headersCapability.promise; + if (this._storedError) { + throw this._storedError; + } + if (this._cachedChunks.length > 0) { + const chunk = this._cachedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + this._headersCapability.reject(reason); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._fullRequestId)) { + this._manager.abortRequest(this._fullRequestId); + } + this._fullRequestReader = null; + } +} +class PDFNetworkStreamRangeRequestReader { + constructor(manager, begin, end) { + this._manager = manager; + const args = { + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = manager.url; + this._requestId = manager.requestRange(begin, end, args); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this._storedError = undefined; + this.onProgress = null; + this.onClosed = null; + } + _onHeadersReceived() { + const responseOrigin = getResponseOrigin(this._manager.getRequestXhr(this._requestId)?.responseURL); + if (responseOrigin !== this._manager._responseOrigin) { + this._storedError = new Error(`Expected range response-origin "${responseOrigin}" to match "${this._manager._responseOrigin}".`); + this._onError(0); + } + } + _close() { + this.onClosed?.(this); + } + _onDone(data) { + const chunk = data.chunk; + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._close(); + } + _onError(status) { + this._storedError ??= createResponseStatusError(status, this._url); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._queuedChunk = null; + } + _onProgress(evt) { + if (!this.isStreamingSupported) { + this.onProgress?.({ + loaded: evt.loaded + }); + } + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._queuedChunk !== null) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._requestId)) { + this._manager.abortRequest(this._requestId); + } + this._close(); + } +} + +;// ./src/display/node_stream.js + +const urlRegex = /^[a-z][a-z0-9\-+.]+:/i; +function parseUrlOrPath(sourceUrl) { + if (urlRegex.test(sourceUrl)) { + return new URL(sourceUrl); + } + const url = process.getBuiltinModule("url"); + return new URL(url.pathToFileURL(sourceUrl)); +} +class PDFNodeStream { + constructor(source) { + this.source = source; + this.url = parseUrlOrPath(source.url); + assert(this.url.protocol === "file:", "PDFNodeStream only supports file:// URLs."); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNodeStreamFsFullReader(this); + return this._fullRequestReader; + } + getRangeReader(start, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const rangeReader = new PDFNodeStreamFsRangeReader(this, start, end); + this._rangeRequestReaders.push(rangeReader); + return rangeReader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFNodeStreamFsFullReader { + constructor(stream) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + const source = stream.source; + this._contentLength = source.length; + this._loaded = 0; + this._filename = null; + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + this._headersCapability = Promise.withResolvers(); + const fs = process.getBuiltinModule("fs"); + fs.promises.lstat(this._url).then(stat => { + this._contentLength = stat.size; + this._setReadableStream(fs.createReadStream(this._url)); + this._headersCapability.resolve(); + }, error => { + if (error.code === "ENOENT") { + error = new MissingPDFException(`Missing PDF "${this._url}".`); + } + this._storedError = error; + this._headersCapability.reject(error); + }); + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (!this._isStreamingSupported && this._isRangeSupported) { + this._error(new AbortException("streaming is disabled")); + } + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +class PDFNodeStreamFsRangeReader { + constructor(stream, start, end) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + this._loaded = 0; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + const source = stream.source; + this._isStreamingSupported = !source.disableStream; + const fs = process.getBuiltinModule("fs"); + this._setReadableStream(fs.createReadStream(this._url, { + start, + end: end - 1 + })); + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} + +;// ./src/display/text_layer.js + + +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +const DEFAULT_FONT_ASCENT = 0.8; +class TextLayer { + #capability = Promise.withResolvers(); + #container = null; + #disableProcessItems = false; + #fontInspectorEnabled = !!globalThis.FontInspector?.enabled; + #lang = null; + #layoutTextParams = null; + #pageHeight = 0; + #pageWidth = 0; + #reader = null; + #rootContainer = null; + #rotation = 0; + #scale = 0; + #styleCache = Object.create(null); + #textContentItemsStr = []; + #textContentSource = null; + #textDivs = []; + #textDivProperties = new WeakMap(); + #transform = null; + static #ascentCache = new Map(); + static #canvasContexts = new Map(); + static #canvasCtxFonts = new WeakMap(); + static #minFontSize = null; + static #pendingTextLayers = new Set(); + constructor({ + textContentSource, + container, + viewport + }) { + if (textContentSource instanceof ReadableStream) { + this.#textContentSource = textContentSource; + } else if (typeof textContentSource === "object") { + this.#textContentSource = new ReadableStream({ + start(controller) { + controller.enqueue(textContentSource); + controller.close(); + } + }); + } else { + throw new Error('No "textContentSource" parameter specified.'); + } + this.#container = this.#rootContainer = container; + this.#scale = viewport.scale * (globalThis.devicePixelRatio || 1); + this.#rotation = viewport.rotation; + this.#layoutTextParams = { + div: null, + properties: null, + ctx: null + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this.#pageWidth = pageWidth; + this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); + setLayerDimensions(container, viewport); + this.#capability.promise.finally(() => { + TextLayer.#pendingTextLayers.delete(this); + this.#layoutTextParams = null; + this.#styleCache = null; + }).catch(() => {}); + } + static get fontFamilyMap() { + const { + isWindows, + isFirefox + } = util_FeatureTest.platform; + return shadow(this, "fontFamilyMap", new Map([["sans-serif", `${isWindows && isFirefox ? "Calibri, " : ""}sans-serif`], ["monospace", `${isWindows && isFirefox ? "Lucida Console, " : ""}monospace`]])); + } + render() { + const pump = () => { + this.#reader.read().then(({ + value, + done + }) => { + if (done) { + this.#capability.resolve(); + return; + } + this.#lang ??= value.lang; + Object.assign(this.#styleCache, value.styles); + this.#processItems(value.items); + pump(); + }, this.#capability.reject); + }; + this.#reader = this.#textContentSource.getReader(); + TextLayer.#pendingTextLayers.add(this); + pump(); + return this.#capability.promise; + } + update({ + viewport, + onBefore = null + }) { + const scale = viewport.scale * (globalThis.devicePixelRatio || 1); + const rotation = viewport.rotation; + if (rotation !== this.#rotation) { + onBefore?.(); + this.#rotation = rotation; + setLayerDimensions(this.#rootContainer, { + rotation + }); + } + if (scale !== this.#scale) { + onBefore?.(); + this.#scale = scale; + const params = { + div: null, + properties: null, + ctx: TextLayer.#getCtx(this.#lang) + }; + for (const div of this.#textDivs) { + params.properties = this.#textDivProperties.get(div); + params.div = div; + this.#layout(params); + } + } + } + cancel() { + const abortEx = new AbortException("TextLayer task cancelled."); + this.#reader?.cancel(abortEx).catch(() => {}); + this.#reader = null; + this.#capability.reject(abortEx); + } + get textDivs() { + return this.#textDivs; + } + get textContentItemsStr() { + return this.#textContentItemsStr; + } + #processItems(items) { + if (this.#disableProcessItems) { + return; + } + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); + const textDivs = this.#textDivs, + textContentItemsStr = this.#textContentItemsStr; + for (const item of items) { + if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) { + warn("Ignoring additional textDivs for performance reasons."); + this.#disableProcessItems = true; + return; + } + if (item.str === undefined) { + if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { + const parent = this.#container; + this.#container = document.createElement("span"); + this.#container.classList.add("markedContent"); + if (item.id !== null) { + this.#container.setAttribute("id", `${item.id}`); + } + parent.append(this.#container); + } else if (item.type === "endMarkedContent") { + this.#container = this.#container.parentNode; + } + continue; + } + textContentItemsStr.push(item.str); + this.#appendText(item); + } + } + #appendText(geom) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + this.#textDivs.push(textDiv); + const tx = Util.transform(this.#transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = this.#styleCache[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily; + fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily; + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, this.#lang); + let left, top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + fontAscent * Math.sin(angle); + top = tx[5] - fontAscent * Math.cos(angle); + } + const scaleFactorStr = "calc(var(--scale-factor)*"; + const divStyle = textDiv.style; + if (this.#container === this.#rootContainer) { + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + } else { + divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; + divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; + } + divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; + divStyle.fontFamily = fontFamily; + textDivProperties.fontSize = fontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (this.#fontInspectorEnabled) { + textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName; + } + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); + } + let shouldScaleText = false; + if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { + shouldScaleText = true; + } + } + if (shouldScaleText) { + textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + } + this.#textDivProperties.set(textDiv, textDivProperties); + this.#layoutTextParams.div = textDiv; + this.#layoutTextParams.properties = textDivProperties; + this.#layout(this.#layoutTextParams); + if (textDivProperties.hasText) { + this.#container.append(textDiv); + } + if (textDivProperties.hasEOL) { + const br = document.createElement("br"); + br.setAttribute("role", "presentation"); + this.#container.append(br); + } + } + #layout(params) { + const { + div, + properties, + ctx + } = params; + const { + style + } = div; + let transform = ""; + if (TextLayer.#minFontSize > 1) { + transform = `scale(${1 / TextLayer.#minFontSize})`; + } + if (properties.canvasWidth !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const { + canvasWidth, + fontSize + } = properties; + TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily); + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + transform = `scaleX(${canvasWidth * this.#scale / width}) ${transform}`; + } + } + if (properties.angle !== 0) { + transform = `rotate(${properties.angle}deg) ${transform}`; + } + if (transform.length > 0) { + style.transform = transform; + } + } + static cleanup() { + if (this.#pendingTextLayers.size > 0) { + return; + } + this.#ascentCache.clear(); + for (const { + canvas + } of this.#canvasContexts.values()) { + canvas.remove(); + } + this.#canvasContexts.clear(); + } + static #getCtx(lang = null) { + let ctx = this.#canvasContexts.get(lang ||= ""); + if (!ctx) { + const canvas = document.createElement("canvas"); + canvas.className = "hiddenCanvasElement"; + canvas.lang = lang; + document.body.append(canvas); + ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: true + }); + this.#canvasContexts.set(lang, ctx); + this.#canvasCtxFonts.set(ctx, { + size: 0, + family: "" + }); + } + return ctx; + } + static #ensureCtxFont(ctx, size, family) { + const cached = this.#canvasCtxFonts.get(ctx); + if (size === cached.size && family === cached.family) { + return; + } + ctx.font = `${size}px ${family}`; + cached.size = size; + cached.family = family; + } + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; + } + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.style.position = "absolute"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } + static #getAscent(fontFamily, lang) { + const cachedAscent = this.#ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = this.#getCtx(lang); + ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE; + this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily); + const metrics = ctx.measureText(""); + let ascent = metrics.fontBoundingBoxAscent; + let descent = Math.abs(metrics.fontBoundingBoxDescent); + if (ascent) { + const ratio = ascent / (ascent + descent); + this.#ascentCache.set(fontFamily, ratio); + ctx.canvas.width = ctx.canvas.height = 0; + return ratio; + } + ctx.strokeStyle = "red"; + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("g", 0, 0); + let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + descent = 0; + for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) { + if (pixels[i] > 0) { + descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("A", 0, DEFAULT_FONT_SIZE); + pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + ascent = 0; + for (let i = 0, ii = pixels.length; i < ii; i += 4) { + if (pixels[i] > 0) { + ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.canvas.width = ctx.canvas.height = 0; + const ratio = ascent ? ascent / (ascent + descent) : DEFAULT_FONT_ASCENT; + this.#ascentCache.set(fontFamily, ratio); + return ratio; + } +} + +;// ./src/display/xfa_text.js +class XfaText { + static textContent(xfa) { + const items = []; + const output = { + items, + styles: Object.create(null) + }; + function walk(node) { + if (!node) { + return; + } + let str = null; + const name = node.name; + if (name === "#text") { + str = node.value; + } else if (!XfaText.shouldBuildText(name)) { + return; + } else if (node?.attributes?.textContent) { + str = node.attributes.textContent; + } else if (node.value) { + str = node.value; + } + if (str !== null) { + items.push({ + str + }); + } + if (!node.children) { + return; + } + for (const child of node.children) { + walk(child); + } + } + walk(xfa); + return output; + } + static shouldBuildText(name) { + return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + } +} + +;// ./src/display/api.js + + + + + + + + + + + + + + + + + + + + +const DEFAULT_RANGE_CHUNK_SIZE = 65536; +const RENDERING_CANCELLED_TIMEOUT = 100; +const DELAYED_CLEANUP_TIMEOUT = 5000; +const DefaultCanvasFactory = isNodeJS ? NodeCanvasFactory : DOMCanvasFactory; +const DefaultCMapReaderFactory = isNodeJS ? NodeCMapReaderFactory : DOMCMapReaderFactory; +const DefaultFilterFactory = isNodeJS ? NodeFilterFactory : DOMFilterFactory; +const DefaultStandardFontDataFactory = isNodeJS ? NodeStandardFontDataFactory : DOMStandardFontDataFactory; +function getDocument(src = {}) { + if (typeof src === "string" || src instanceof URL) { + src = { + url: src + }; + } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) { + src = { + data: src + }; + } + const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; + const url = src.url ? getUrlProp(src.url) : null; + const data = src.data ? getDataProp(src.data) : null; + const httpHeaders = src.httpHeaders || null; + const withCredentials = src.withCredentials === true; + const password = src.password ?? null; + const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; + const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : DEFAULT_RANGE_CHUNK_SIZE; + let worker = src.worker instanceof PDFWorker ? src.worker : null; + const verbosity = src.verbosity; + const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; + const cMapUrl = typeof src.cMapUrl === "string" ? src.cMapUrl : null; + const cMapPacked = src.cMapPacked !== false; + const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory; + const standardFontDataUrl = typeof src.standardFontDataUrl === "string" ? src.standardFontDataUrl : null; + const StandardFontDataFactory = src.StandardFontDataFactory || DefaultStandardFontDataFactory; + const ignoreErrors = src.stopAtErrors !== true; + const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; + const isEvalSupported = src.isEvalSupported !== false; + const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; + const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : !isNodeJS && (util_FeatureTest.platform.isFirefox || !globalThis.chrome); + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; + const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS; + const fontExtraProperties = src.fontExtraProperties === true; + const enableXfa = src.enableXfa === true; + const ownerDocument = src.ownerDocument || globalThis.document; + const disableRange = src.disableRange === true; + const disableStream = src.disableStream === true; + const disableAutoFetch = src.disableAutoFetch === true; + const pdfBug = src.pdfBug === true; + const CanvasFactory = src.CanvasFactory || DefaultCanvasFactory; + const FilterFactory = src.FilterFactory || DefaultFilterFactory; + const enableHWA = src.enableHWA === true; + const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; + const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; + const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : CMapReaderFactory === DOMCMapReaderFactory && StandardFontDataFactory === DOMStandardFontDataFactory && cMapUrl && standardFontDataUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI); + if (src.canvasFactory) { + deprecated("`canvasFactory`-instance option, please use `CanvasFactory` instead."); + } + if (src.filterFactory) { + deprecated("`filterFactory`-instance option, please use `FilterFactory` instead."); + } + const styleElement = null; + setVerbosityLevel(verbosity); + const transportFactory = { + canvasFactory: new CanvasFactory({ + ownerDocument, + enableHWA + }), + filterFactory: new FilterFactory({ + docId, + ownerDocument + }), + cMapReaderFactory: useWorkerFetch ? null : new CMapReaderFactory({ + baseUrl: cMapUrl, + isCompressed: cMapPacked + }), + standardFontDataFactory: useWorkerFetch ? null : new StandardFontDataFactory({ + baseUrl: standardFontDataUrl + }) + }; + if (!worker) { + const workerParams = { + verbosity, + port: GlobalWorkerOptions.workerPort + }; + worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); + task._worker = worker; + } + const docParams = { + docId, + apiVersion: "4.9.155", + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions: { + maxImageSize, + disableFontFace, + ignoreErrors, + isEvalSupported, + isOffscreenCanvasSupported, + isImageDecoderSupported, + canvasMaxAreaInBytes, + fontExtraProperties, + useSystemFonts, + cMapUrl: useWorkerFetch ? cMapUrl : null, + standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null + } + }; + const transportParams = { + disableFontFace, + fontExtraProperties, + ownerDocument, + pdfBug, + styleElement, + loadingParams: { + disableAutoFetch, + enableXfa + } + }; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null); + let networkStream; + if (rangeTransport) { + networkStream = new PDFDataTransportStream(rangeTransport, { + disableRange, + disableStream + }); + } else if (!data) { + if (!url) { + throw new Error("getDocument - no `url` parameter provided."); + } + let NetworkStream; + if (isNodeJS) { + if (isValidFetchUrl(url)) { + if (typeof fetch === "undefined" || typeof Response === "undefined" || !("body" in Response.prototype)) { + throw new Error("getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`."); + } + NetworkStream = PDFFetchStream; + } else { + NetworkStream = PDFNodeStream; + } + } else { + NetworkStream = isValidFetchUrl(url) ? PDFFetchStream : PDFNetworkStream; + } + networkStream = new NetworkStream({ + url, + length, + httpHeaders, + withCredentials, + rangeChunkSize, + disableRange, + disableStream + }); + } + return workerIdPromise.then(workerId => { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const messageHandler = new MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory); + task._transport = transport; + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject); + return task; +} +function getUrlProp(val) { + if (val instanceof URL) { + return val.href; + } + try { + return new URL(val, window.location).href; + } catch { + if (isNodeJS && typeof val === "string") { + return val; + } + } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); +} +function getDataProp(val) { + if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { + throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); + } + if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { + return val; + } + if (typeof val === "string") { + return stringToBytes(val); + } + if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { + return new Uint8Array(val); + } + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); +} +function isRefProxy(ref) { + return typeof ref === "object" && Number.isInteger(ref?.num) && ref.num >= 0 && Number.isInteger(ref?.gen) && ref.gen >= 0; +} +class PDFDocumentLoadingTask { + static #docId = 0; + constructor() { + this._capability = Promise.withResolvers(); + this._transport = null; + this._worker = null; + this.docId = `d${PDFDocumentLoadingTask.#docId++}`; + this.destroyed = false; + this.onPassword = null; + this.onProgress = null; + } + get promise() { + return this._capability.promise; + } + async destroy() { + this.destroyed = true; + try { + if (this._worker?.port) { + this._worker._pendingDestroy = true; + } + await this._transport?.destroy(); + } catch (ex) { + if (this._worker?.port) { + delete this._worker._pendingDestroy; + } + throw ex; + } + this._transport = null; + this._worker?.destroy(); + this._worker = null; + } +} +class PDFDataRangeTransport { + constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + this._rangeListeners = []; + this._progressListeners = []; + this._progressiveReadListeners = []; + this._progressiveDoneListeners = []; + this._readyCapability = Promise.withResolvers(); + } + addRangeListener(listener) { + this._rangeListeners.push(listener); + } + addProgressListener(listener) { + this._progressListeners.push(listener); + } + addProgressiveReadListener(listener) { + this._progressiveReadListeners.push(listener); + } + addProgressiveDoneListener(listener) { + this._progressiveDoneListeners.push(listener); + } + onDataRange(begin, chunk) { + for (const listener of this._rangeListeners) { + listener(begin, chunk); + } + } + onDataProgress(loaded, total) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressListeners) { + listener(loaded, total); + } + }); + } + onDataProgressiveRead(chunk) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveReadListeners) { + listener(chunk); + } + }); + } + onDataProgressiveDone() { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveDoneListeners) { + listener(); + } + }); + } + transportReady() { + this._readyCapability.resolve(); + } + requestDataRange(begin, end) { + unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); + } + abort() {} +} +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; + } + get annotationStorage() { + return this._transport.annotationStorage; + } + get canvasFactory() { + return this._transport.canvasFactory; + } + get filterFactory() { + return this._transport.filterFactory; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + get allXfaHtml() { + return this._transport._htmlForXfa; + } + getPage(pageNumber) { + return this._transport.getPage(pageNumber); + } + getPageIndex(ref) { + return this._transport.getPageIndex(ref); + } + getDestinations() { + return this._transport.getDestinations(); + } + getDestination(id) { + return this._transport.getDestination(id); + } + getPageLabels() { + return this._transport.getPageLabels(); + } + getPageLayout() { + return this._transport.getPageLayout(); + } + getPageMode() { + return this._transport.getPageMode(); + } + getViewerPreferences() { + return this._transport.getViewerPreferences(); + } + getOpenAction() { + return this._transport.getOpenAction(); + } + getAttachments() { + return this._transport.getAttachments(); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getOptionalContentConfig(renderingIntent); + } + getPermissions() { + return this._transport.getPermissions(); + } + getMetadata() { + return this._transport.getMetadata(); + } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { + return this._transport.getData(); + } + saveDocument() { + return this._transport.saveDocument(); + } + getDownloadInfo() { + return this._transport.downloadInfoCapability.promise; + } + cleanup(keepLoadedFonts = false) { + return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + } + destroy() { + return this.loadingTask.destroy(); + } + cachedPageNumber(ref) { + return this._transport.cachedPageNumber(ref); + } + get loadingParams() { + return this._transport.loadingParams; + } + get loadingTask() { + return this._transport.loadingTask; + } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + hasJSActions() { + return this._transport.hasJSActions(); + } + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } +} +class PDFPageProxy { + #delayedCleanupTimeout = null; + #pendingCleanup = false; + constructor(pageIndex, pageInfo, transport, pdfBug = false) { + this._pageIndex = pageIndex; + this._pageInfo = pageInfo; + this._transport = transport; + this._stats = pdfBug ? new StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._maybeCleanupAfterRender = false; + this._intentStates = new Map(); + this.destroyed = false; + } + get pageNumber() { + return this._pageIndex + 1; + } + get rotate() { + return this._pageInfo.rotate; + } + get ref() { + return this._pageInfo.ref; + } + get userUnit() { + return this._pageInfo.userUnit; + } + get view() { + return this._pageInfo.view; + } + getViewport({ + scale, + rotation = this.rotate, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.view, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get filterFactory() { + return this._transport.filterFactory; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + return this._transport._htmlForXfa?.children[this._pageIndex] || null; + } + render({ + canvasContext, + viewport, + intent = "display", + annotationMode = AnnotationMode.ENABLE, + transform = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null, + isEditing = false + }) { + this._stats?.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing); + const { + renderingIntent, + cacheKey + } = intentArgs; + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); + optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); + let intentState = this._intentStates.get(cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(cacheKey, intentState); + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + intentState.displayReadyCapability = Promise.withResolvers(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + const complete = error => { + intentState.renderTasks.delete(internalRenderTask); + if (this._maybeCleanupAfterRender || intentPrint) { + this.#pendingCleanup = true; + } + this.#tryCleanup(!intentPrint); + if (error) { + internalRenderTask.capability.reject(error); + this._abortOperatorList({ + intentState, + reason: error instanceof Error ? error : new Error(error) + }); + } else { + internalRenderTask.capability.resolve(); + } + if (this._stats) { + this._stats.timeEnd("Rendering"); + this._stats.timeEnd("Overall"); + if (globalThis.Stats?.enabled) { + globalThis.Stats.add(this.pageNumber, this._stats); + } + } + }; + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvasContext, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors + }); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { + if (this.destroyed) { + complete(); + return; + } + this._stats?.time("Rendering"); + if (!(optionalContentConfig.renderingIntent & renderingIntent)) { + throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); + } + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; + } + getOperatorList({ + intent = "display", + annotationMode = AnnotationMode.ENABLE, + printAnnotationStorage = null, + isEditing = false + } = {}) { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } + } + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true); + let intentState = this._intentStates.get(intentArgs.cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(intentArgs.cacheKey, intentState); + } + let opListTask; + if (!intentState.opListReadCapability) { + opListTask = Object.create(null); + opListTask.operatorListChanged = operatorListChanged; + intentState.opListReadCapability = Promise.withResolvers(); + (intentState.renderTasks ||= new Set()).add(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + return intentState.opListReadCapability.promise; + } + streamTextContent({ + includeMarkedContent = false, + disableNormalization = false + } = {}) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageIndex: this._pageIndex, + includeMarkedContent: includeMarkedContent === true, + disableNormalization: disableNormalization === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size(textContent) { + return textContent.items.length; + } + }); + } + getTextContent(params = {}) { + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => XfaText.textContent(xfa)); + } + const readableStream = this.streamTextContent(params); + return new Promise(function (resolve, reject) { + function pump() { + reader.read().then(function ({ + value, + done + }) { + if (done) { + resolve(textContent); + return; + } + textContent.lang ??= value.lang; + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); + pump(); + }, reject); + } + const reader = readableStream.getReader(); + const textContent = { + items: [], + styles: Object.create(null), + lang: null + }; + pump(); + }); + } + getStructTree() { + return this._transport.getStructTree(this._pageIndex); + } + _destroy() { + this.destroyed = true; + const waitOn = []; + for (const intentState of this._intentStates.values()) { + this._abortOperatorList({ + intentState, + reason: new Error("Page was destroyed."), + force: true + }); + if (intentState.opListReadCapability) { + continue; + } + for (const internalRenderTask of intentState.renderTasks) { + waitOn.push(internalRenderTask.completed); + internalRenderTask.cancel(); + } + } + this.objs.clear(); + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); + return Promise.all(waitOn); + } + cleanup(resetStats = false) { + this.#pendingCleanup = true; + const success = this.#tryCleanup(false); + if (resetStats && success) { + this._stats &&= new StatTimer(); + } + return success; + } + #tryCleanup(delayed = false) { + this.#abortDelayedCleanup(); + if (!this.#pendingCleanup || this.destroyed) { + return false; + } + if (delayed) { + this.#delayedCleanupTimeout = setTimeout(() => { + this.#delayedCleanupTimeout = null; + this.#tryCleanup(false); + }, DELAYED_CLEANUP_TIMEOUT); + return false; + } + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } + } + this._intentStates.clear(); + this.objs.clear(); + this.#pendingCleanup = false; + return true; + } + #abortDelayedCleanup() { + if (this.#delayedCleanupTimeout) { + clearTimeout(this.#delayedCleanupTimeout); + this.#delayedCleanupTimeout = null; + } + } + _startRenderPage(transparency, cacheKey) { + const intentState = this._intentStates.get(cacheKey); + if (!intentState) { + return; + } + this._stats?.timeEnd("Page Request"); + intentState.displayReadyCapability?.resolve(transparency); + } + _renderPageChunk(operatorListChunk, intentState) { + for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { + intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); + intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); + } + intentState.operatorList.lastChunk = operatorListChunk.lastChunk; + intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + if (operatorListChunk.lastChunk) { + this.#tryCleanup(true); + } + } + _pumpOperatorList({ + renderingIntent, + cacheKey, + annotationStorageSerializable, + modifiedIds + }) { + const { + map, + transfer + } = annotationStorageSerializable; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageIndex: this._pageIndex, + intent: renderingIntent, + cacheKey, + annotationStorage: map, + modifiedIds + }, transfer); + const reader = readableStream.getReader(); + const intentState = this._intentStates.get(cacheKey); + intentState.streamReader = reader; + const pump = () => { + reader.read().then(({ + value, + done + }) => { + if (done) { + intentState.streamReader = null; + return; + } + if (this._transport.destroyed) { + return; + } + this._renderPageChunk(value, intentState); + pump(); + }, reason => { + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + this.#tryCleanup(true); + } + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(reason); + } else if (intentState.opListReadCapability) { + intentState.opListReadCapability.reject(reason); + } else { + throw reason; + } + }); + }; + pump(); + } + _abortOperatorList({ + intentState, + reason, + force = false + }) { + if (!intentState.streamReader) { + return; + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + if (!force) { + if (intentState.renderTasks.size > 0) { + return; + } + if (reason instanceof RenderingCancelledException) { + let delay = RENDERING_CANCELLED_TIMEOUT; + if (reason.extraDelay > 0 && reason.extraDelay < 1000) { + delay += reason.extraDelay; + } + intentState.streamReaderCancelTimeout = setTimeout(() => { + intentState.streamReaderCancelTimeout = null; + this._abortOperatorList({ + intentState, + reason, + force: true + }); + }, delay); + return; + } + } + intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {}); + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + for (const [curCacheKey, curIntentState] of this._intentStates) { + if (curIntentState === intentState) { + this._intentStates.delete(curCacheKey); + break; + } + } + this.cleanup(); + } + get stats() { + return this._stats; + } +} +class LoopbackPort { + #listeners = new Map(); + #deferred = Promise.resolve(); + postMessage(obj, transfer) { + const event = { + data: structuredClone(obj, transfer ? { + transfer + } : null) + }; + this.#deferred.then(() => { + for (const [listener] of this.#listeners) { + listener.call(this, event); + } + }); + } + addEventListener(name, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + warn("LoopbackPort - cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.removeEventListener(name, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + this.#listeners.set(listener, rmAbort); + } + removeEventListener(name, listener) { + const rmAbort = this.#listeners.get(listener); + rmAbort?.(); + this.#listeners.delete(listener); + } + terminate() { + for (const [, rmAbort] of this.#listeners) { + rmAbort?.(); + } + this.#listeners.clear(); + } +} +class PDFWorker { + static #fakeWorkerId = 0; + static #isWorkerDisabled = false; + static #workerPorts; + static { + if (isNodeJS) { + this.#isWorkerDisabled = true; + GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + } + this._isSameOrigin = (baseUrl, otherUrl) => { + let base; + try { + base = new URL(baseUrl); + if (!base.origin || base.origin === "null") { + return false; + } + } catch { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + this._createCDNWrapper = url => { + const wrapper = `await import("${url}");`; + return URL.createObjectURL(new Blob([wrapper], { + type: "text/javascript" + })); + }; + } + constructor({ + name = null, + port = null, + verbosity = getVerbosityLevel() + } = {}) { + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + this._readyCapability = Promise.withResolvers(); + this._port = null; + this._webWorker = null; + this._messageHandler = null; + if (port) { + if (PDFWorker.#workerPorts?.has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); + } + (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this); + this._initializeFromPort(port); + return; + } + this._initialize(); + } + get promise() { + return this._readyCapability.promise; + } + #resolve() { + this._readyCapability.resolve(); + this._messageHandler.send("configure", { + verbosity: this.verbosity + }); + } + get port() { + return this._port; + } + get messageHandler() { + return this._messageHandler; + } + _initializeFromPort(port) { + this._port = port; + this._messageHandler = new MessageHandler("main", "worker", port); + this._messageHandler.on("ready", function () {}); + this.#resolve(); + } + _initialize() { + if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this._setupFakeWorker(); + return; + } + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorker._isSameOrigin(window.location.href, workerSrc)) { + workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + } else { + this._setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this._webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("test", data => { + ac.abort(); + if (this.destroyed || !data) { + terminateEarly(); + return; + } + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + this.#resolve(); + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch { + this._setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch { + info("The worker has been disabled."); + } + this._setupFakeWorker(); + } + _setupFakeWorker() { + if (!PDFWorker.#isWorkerDisabled) { + warn("Setting up fake worker."); + PDFWorker.#isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this._port = port; + const id = `fake${PDFWorker.#fakeWorkerId++}`; + const workerHandler = new MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + this._messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); + }).catch(reason => { + this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); + } + destroy() { + this.destroyed = true; + this._webWorker?.terminate(); + this._webWorker = null; + PDFWorker.#workerPorts?.delete(this._port); + this._port = null; + this._messageHandler?.destroy(); + this._messageHandler = null; + } + static fromPort(params) { + if (!params?.port) { + throw new Error("PDFWorker.fromPort - invalid method signature."); + } + const cachedPort = this.#workerPorts?.get(params.port); + if (cachedPort) { + if (cachedPort._pendingDestroy) { + throw new Error("PDFWorker.fromPort - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); + } + return cachedPort; + } + return new PDFWorker(params); + } + static get workerSrc() { + if (GlobalWorkerOptions.workerSrc) { + return GlobalWorkerOptions.workerSrc; + } + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get #mainThreadWorkerMessageHandler() { + try { + return globalThis.pdfjsWorker?.WorkerMessageHandler || null; + } catch { + return null; + } + } + static get _setupFakeWorkerGlobal() { + const loader = async () => { + if (this.#mainThreadWorkerMessageHandler) { + return this.#mainThreadWorkerMessageHandler; + } + const worker = await import(/*webpackIgnore: true*/this.workerSrc); + return worker.WorkerMessageHandler; + }; + return shadow(this, "_setupFakeWorkerGlobal", loader()); + } +} +class WorkerTransport { + #methodPromises = new Map(); + #pageCache = new Map(); + #pagePromises = new Map(); + #pageRefCache = new Map(); + #passwordCapability = null; + constructor(messageHandler, loadingTask, networkStream, params, factory) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader({ + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this.loadingParams = params.loadingParams; + this._params = params; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.cMapReaderFactory = factory.cMapReaderFactory; + this.standardFontDataFactory = factory.standardFontDataFactory; + this.destroyed = false; + this.destroyCapability = null; + this._networkStream = networkStream; + this._fullReader = null; + this._lastProgress = null; + this.downloadInfoCapability = Promise.withResolvers(); + this.setupMessageHandler(); + } + #cacheSimpleMethod(name, data = null) { + const cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, data); + this.#methodPromises.set(name, promise); + return promise; + } + get annotationStorage() { + return shadow(this, "annotationStorage", new AnnotationStorage()); + } + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) { + let renderingIntent = RenderingIntentFlag.DISPLAY; + let annotationStorageSerializable = SerializableEmpty; + switch (intent) { + case "any": + renderingIntent = RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = RenderingIntentFlag.PRINT; + break; + default: + warn(`getRenderingIntent - invalid intent: ${intent}`); + } + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + switch (annotationMode) { + case AnnotationMode.DISABLE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case AnnotationMode.ENABLE: + break; + case AnnotationMode.ENABLE_FORMS: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case AnnotationMode.ENABLE_STORAGE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; + annotationStorageSerializable = annotationStorage.serializable; + break; + default: + warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + } + if (isEditing) { + renderingIntent += RenderingIntentFlag.IS_EDITING; + } + if (isOpList) { + renderingIntent += RenderingIntentFlag.OPLIST; + } + const { + ids: modifiedIds, + hash: modifiedIdsHash + } = annotationStorage.modifiedIds; + const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash]; + return { + renderingIntent, + cacheKey: cacheKeyBuf.join("_"), + annotationStorageSerializable, + modifiedIds + }; + } + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = Promise.withResolvers(); + this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback")); + const waitOn = []; + for (const page of this.#pageCache.values()) { + waitOn.push(page._destroy()); + } + this.#pageCache.clear(); + this.#pagePromises.clear(); + this.#pageRefCache.clear(); + if (this.hasOwnProperty("annotationStorage")) { + this.annotationStorage.resetModified(); + } + const terminated = this.messageHandler.sendWithPromise("Terminate", null); + waitOn.push(terminated); + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); + this.fontLoader.clear(); + this.#methodPromises.clear(); + this.filterFactory.destroy(); + TextLayer.cleanup(); + this._networkStream?.cancelAllRequests(new AbortException("Worker was terminated.")); + this.messageHandler?.destroy(); + this.messageHandler = null; + this.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; + } + setupMessageHandler() { + const { + messageHandler, + loadingTask + } = this; + messageHandler.on("GetReader", (data, sink) => { + assert(this._networkStream, "GetReader - no `IPDFStream` instance available."); + this._fullReader = this._networkStream.getFullReader(); + this._fullReader.onProgress = evt => { + this._lastProgress = { + loaded: evt.loaded, + total: evt.total + }; + }; + sink.onPull = () => { + this._fullReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + this._fullReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("ReaderHeadersReady", async data => { + await this._fullReader.headersReady; + const { + isStreamingSupported, + isRangeSupported, + contentLength + } = this._fullReader; + if (!isStreamingSupported || !isRangeSupported) { + if (this._lastProgress) { + loadingTask.onProgress?.(this._lastProgress); + } + this._fullReader.onProgress = evt => { + loadingTask.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + }; + } + return { + isStreamingSupported, + isRangeSupported, + contentLength + }; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + assert(this._networkStream, "GetRangeReader - no `IPDFStream` instance available."); + const rangeReader = this._networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); + return; + } + sink.onPull = () => { + rangeReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + rangeReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("GetDoc", ({ + pdfInfo + }) => { + this._numPages = pdfInfo.numPages; + this._htmlForXfa = pdfInfo.htmlForXfa; + delete pdfInfo.htmlForXfa; + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); + }); + messageHandler.on("DocException", function (ex) { + let reason; + switch (ex.name) { + case "PasswordException": + reason = new PasswordException(ex.message, ex.code); + break; + case "InvalidPDFException": + reason = new InvalidPDFException(ex.message); + break; + case "MissingPDFException": + reason = new MissingPDFException(ex.message); + break; + case "UnexpectedResponseException": + reason = new UnexpectedResponseException(ex.message, ex.status); + break; + case "UnknownErrorException": + reason = new UnknownErrorException(ex.message, ex.details); + break; + default: + unreachable("DocException - expected a valid Error."); + } + loadingTask._capability.reject(reason); + }); + messageHandler.on("PasswordRequest", exception => { + this.#passwordCapability = Promise.withResolvers(); + if (loadingTask.onPassword) { + const updatePassword = password => { + if (password instanceof Error) { + this.#passwordCapability.reject(password); + } else { + this.#passwordCapability.resolve({ + password + }); + } + }; + try { + loadingTask.onPassword(updatePassword, exception.code); + } catch (ex) { + this.#passwordCapability.reject(ex); + } + } else { + this.#passwordCapability.reject(new PasswordException(exception.message, exception.code)); + } + return this.#passwordCapability.promise; + }); + messageHandler.on("DataLoaded", data => { + loadingTask.onProgress?.({ + loaded: data.length, + total: data.length + }); + this.downloadInfoCapability.resolve(data); + }); + messageHandler.on("StartRenderPage", data => { + if (this.destroyed) { + return; + } + const page = this.#pageCache.get(data.pageIndex); + page._startRenderPage(data.transparency, data.cacheKey); + }); + messageHandler.on("commonobj", ([id, type, exportedData]) => { + if (this.destroyed) { + return null; + } + if (this.commonObjs.has(id)) { + return null; + } + switch (type) { + case "Font": + const { + disableFontFace, + fontExtraProperties, + pdfBug + } = this._params; + if ("error" in exportedData) { + const exportedError = exportedData.error; + warn(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + const inspectFont = pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; + const font = new FontFaceObject(exportedData, { + disableFontFace, + inspectFont + }); + this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { + id + })).finally(() => { + if (!fontExtraProperties && font.data) { + font.data = null; + } + this.commonObjs.resolve(id, font); + }); + break; + case "CopyLocalImage": + const { + imageRef + } = exportedData; + assert(imageRef, "The imageRef must be defined."); + for (const pageProxy of this.#pageCache.values()) { + for (const [, data] of pageProxy.objs) { + if (data?.ref !== imageRef) { + continue; + } + if (!data.dataLen) { + return null; + } + this.commonObjs.resolve(id, structuredClone(data)); + return data.dataLen; + } + } + break; + case "FontPath": + case "Image": + case "Pattern": + this.commonObjs.resolve(id, exportedData); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + return null; + }); + messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { + if (this.destroyed) { + return; + } + const pageProxy = this.#pageCache.get(pageIndex); + if (pageProxy.objs.has(id)) { + return; + } + if (pageProxy._intentStates.size === 0) { + imageData?.bitmap?.close(); + return; + } + switch (type) { + case "Image": + pageProxy.objs.resolve(id, imageData); + if (imageData?.dataLen > MAX_IMAGE_SIZE_TO_CACHE) { + pageProxy._maybeCleanupAfterRender = true; + } + break; + case "Pattern": + pageProxy.objs.resolve(id, imageData); + break; + default: + throw new Error(`Got unknown object type ${type}`); + } + }); + messageHandler.on("DocProgress", data => { + if (this.destroyed) { + return; + } + loadingTask.onProgress?.({ + loaded: data.loaded, + total: data.total + }); + }); + messageHandler.on("FetchBuiltInCMap", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + if (!this.cMapReaderFactory) { + throw new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter."); + } + return this.cMapReaderFactory.fetch(data); + }); + messageHandler.on("FetchStandardFontData", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + if (!this.standardFontDataFactory) { + throw new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter."); + } + return this.standardFontDataFactory.fetch(data); + }); + } + getData() { + return this.messageHandler.sendWithPromise("GetData", null); + } + saveDocument() { + if (this.annotationStorage.size <= 0) { + warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); + } + const { + map, + transfer + } = this.annotationStorage.serializable; + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: map, + filename: this._fullReader?.filename ?? null + }, transfer).finally(() => { + this.annotationStorage.resetModified(); + }); + } + getPage(pageNumber) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { + return Promise.reject(new Error("Invalid page request.")); + } + const pageIndex = pageNumber - 1, + cachedPromise = this.#pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise("GetPage", { + pageIndex + }).then(pageInfo => { + if (this.destroyed) { + throw new Error("Transport destroyed"); + } + if (pageInfo.refStr) { + this.#pageRefCache.set(pageInfo.refStr, pageNumber); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug); + this.#pageCache.set(pageIndex, page); + return page; + }); + this.#pagePromises.set(pageIndex, promise); + return promise; + } + getPageIndex(ref) { + if (!isRefProxy(ref)) { + return Promise.reject(new Error("Invalid pageIndex request.")); + } + return this.messageHandler.sendWithPromise("GetPageIndex", { + num: ref.num, + gen: ref.gen + }); + } + getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise("GetAnnotations", { + pageIndex, + intent + }); + } + getFieldObjects() { + return this.#cacheSimpleMethod("GetFieldObjects"); + } + hasJSActions() { + return this.#cacheSimpleMethod("HasJSActions"); + } + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { + return this.messageHandler.sendWithPromise("GetDestinations", null); + } + getDestination(id) { + if (typeof id !== "string") { + return Promise.reject(new Error("Invalid destination request.")); + } + return this.messageHandler.sendWithPromise("GetDestination", { + id + }); + } + getPageLabels() { + return this.messageHandler.sendWithPromise("GetPageLabels", null); + } + getPageLayout() { + return this.messageHandler.sendWithPromise("GetPageLayout", null); + } + getPageMode() { + return this.messageHandler.sendWithPromise("GetPageMode", null); + } + getViewerPreferences() { + return this.messageHandler.sendWithPromise("GetViewerPreferences", null); + } + getOpenAction() { + return this.messageHandler.sendWithPromise("GetOpenAction", null); + } + getAttachments() { + return this.messageHandler.sendWithPromise("GetAttachments", null); + } + getDocJSActions() { + return this.#cacheSimpleMethod("GetDocJSActions"); + } + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex + }); + } + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex + }); + } + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); + } + getOptionalContentConfig(renderingIntent) { + return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent)); + } + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); + } + getMetadata() { + const name = "GetMetadata", + cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, null).then(results => ({ + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null, + contentDispositionFilename: this._fullReader?.filename ?? null, + contentLength: this._fullReader?.contentLength ?? null + })); + this.#methodPromises.set(name, promise); + return promise; + } + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); + } + async startCleanup(keepLoadedFonts = false) { + if (this.destroyed) { + return; + } + await this.messageHandler.sendWithPromise("Cleanup", null); + for (const page of this.#pageCache.values()) { + const cleanupSuccessful = page.cleanup(); + if (!cleanupSuccessful) { + throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); + } + } + this.commonObjs.clear(); + if (!keepLoadedFonts) { + this.fontLoader.clear(); + } + this.#methodPromises.clear(); + this.filterFactory.destroy(true); + TextLayer.cleanup(); + } + cachedPageNumber(ref) { + if (!isRefProxy(ref)) { + return null; + } + const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; + return this.#pageRefCache.get(refStr) ?? null; + } +} +const INITIAL_DATA = Symbol("INITIAL_DATA"); +class PDFObjects { + #objs = Object.create(null); + #ensureObj(objId) { + return this.#objs[objId] ||= { + ...Promise.withResolvers(), + data: INITIAL_DATA + }; + } + get(objId, callback = null) { + if (callback) { + const obj = this.#ensureObj(objId); + obj.promise.then(() => callback(obj.data)); + return null; + } + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + } + return obj.data; + } + has(objId) { + const obj = this.#objs[objId]; + return !!obj && obj.data !== INITIAL_DATA; + } + resolve(objId, data = null) { + const obj = this.#ensureObj(objId); + obj.data = data; + obj.resolve(); + } + clear() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + data?.bitmap?.close(); + } + this.#objs = Object.create(null); + } + *[Symbol.iterator]() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + if (data === INITIAL_DATA) { + continue; + } + yield [objId, data]; + } + } +} +class RenderTask { + #internalRenderTask = null; + constructor(internalRenderTask) { + this.#internalRenderTask = internalRenderTask; + this.onContinue = null; + } + get promise() { + return this.#internalRenderTask.capability.promise; + } + cancel(extraDelay = 0) { + this.#internalRenderTask.cancel(null, extraDelay); + } + get separateAnnots() { + const { + separateAnnots + } = this.#internalRenderTask.operatorList; + if (!separateAnnots) { + return false; + } + const { + annotationCanvasMap + } = this.#internalRenderTask; + return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; + } +} +class InternalRenderTask { + #rAF = null; + static #canvasInUse = new WeakSet(); + constructor({ + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + filterFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null + }) { + this.callback = callback; + this.params = params; + this.objs = objs; + this.commonObjs = commonObjs; + this.annotationCanvasMap = annotationCanvasMap; + this.operatorListIdx = null; + this.operatorList = operatorList; + this._pageIndex = pageIndex; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this._pdfBug = pdfBug; + this.pageColors = pageColors; + this.running = false; + this.graphicsReadyCallback = null; + this.graphicsReady = false; + this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; + this.cancelled = false; + this.capability = Promise.withResolvers(); + this.task = new RenderTask(this); + this._cancelBound = this.cancel.bind(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + this._canvas = params.canvasContext.canvas; + } + get completed() { + return this.capability.promise.catch(function () {}); + } + initializeGraphics({ + transparency = false, + optionalContentConfig + }) { + if (this.cancelled) { + return; + } + if (this._canvas) { + if (InternalRenderTask.#canvasInUse.has(this._canvas)) { + throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + } + InternalRenderTask.#canvasInUse.add(this._canvas); + } + if (this._pdfBug && globalThis.StepperManager?.enabled) { + this.stepper = globalThis.StepperManager.create(this._pageIndex); + this.stepper.init(this.operatorList); + this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); + } + const { + canvasContext, + viewport, + transform, + background + } = this.params; + this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors); + this.gfx.beginDrawing({ + transform, + viewport, + transparency, + background + }); + this.operatorListIdx = 0; + this.graphicsReady = true; + this.graphicsReadyCallback?.(); + } + cancel(error = null, extraDelay = 0) { + this.running = false; + this.cancelled = true; + this.gfx?.endDrawing(); + if (this.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; + } + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(error || new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay)); + } + operatorListChanged() { + if (!this.graphicsReady) { + this.graphicsReadyCallback ||= this._continueBound; + return; + } + this.stepper?.updateOperatorList(this.operatorList); + if (this.running) { + return; + } + this._continue(); + } + _continue() { + this.running = true; + if (this.cancelled) { + return; + } + if (this.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); + } + } + _scheduleNext() { + if (this._useRequestAnimationFrame) { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; + this._nextBound().catch(this._cancelBound); + }); + } else { + Promise.resolve().then(this._nextBound).catch(this._cancelBound); + } + } + async _next() { + if (this.cancelled) { + return; + } + this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(); + } + } + } +} +const version = "4.9.155"; +const build = "a4eb8407c"; + +;// ./src/shared/scripting_utils.js +function makeColorComp(n) { + return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return Math.max(0, Math.min(255, 255 * x)); +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} + +;// ./src/display/svg_factory.js + + +class BaseSVGFactory { + create(width, height, skipDimensions = false) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid SVG dimensions"); + } + const svg = this._createSVG("svg:svg"); + svg.setAttribute("version", "1.1"); + if (!skipDimensions) { + svg.setAttribute("width", `${width}px`); + svg.setAttribute("height", `${height}px`); + } + svg.setAttribute("preserveAspectRatio", "none"); + svg.setAttribute("viewBox", `0 0 ${width} ${height}`); + return svg; + } + createElement(type) { + if (typeof type !== "string") { + throw new Error("Invalid SVG element type"); + } + return this._createSVG(type); + } + _createSVG(type) { + unreachable("Abstract method `_createSVG` called."); + } +} +class DOMSVGFactory extends BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} + +;// ./src/display/xfa_layer.js + +class XfaLayer { + static setupStorage(html, id, element, storage, intent) { + const storedData = storage.getValue(id, { + value: null + }); + switch (element.name) { + case "textarea": + if (storedData.value !== null) { + html.textContent = storedData.value; + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + break; + case "input": + if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { + if (storedData.value === element.attributes.xfaOn) { + html.setAttribute("checked", true); + } else if (storedData.value === element.attributes.xfaOff) { + html.removeAttribute("checked"); + } + if (intent === "print") { + break; + } + html.addEventListener("change", event => { + storage.setValue(id, { + value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") + }); + }); + } else { + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + } + break; + case "select": + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } else if (option.attributes.hasOwnProperty("selected")) { + delete option.attributes.selected; + } + } + } + html.addEventListener("input", event => { + const options = event.target.options; + const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; + storage.setValue(id, { + value + }); + }); + break; + } + } + static setAttributes({ + html, + element, + storage = null, + intent, + linkService + }) { + const { + attributes + } = element; + const isHTMLAnchorElement = html instanceof HTMLAnchorElement; + if (attributes.type === "radio") { + attributes.name = `${attributes.name}-${intent}`; + } + for (const [key, value] of Object.entries(attributes)) { + if (value === null || value === undefined) { + continue; + } + switch (key) { + case "class": + if (value.length) { + html.setAttribute(key, value.join(" ")); + } + break; + case "dataId": + break; + case "id": + html.setAttribute("data-element-id", value); + break; + case "style": + Object.assign(html.style, value); + break; + case "textContent": + html.textContent = value; + break; + default: + if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { + html.setAttribute(key, value); + } + } + } + if (isHTMLAnchorElement) { + linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); + } + if (storage && attributes.dataId) { + this.setupStorage(html, attributes.dataId, element, storage); + } + } + static render(parameters) { + const storage = parameters.annotationStorage; + const linkService = parameters.linkService; + const root = parameters.xfaHtml; + const intent = parameters.intent || "display"; + const rootHtml = document.createElement(root.name); + if (root.attributes) { + this.setAttributes({ + html: rootHtml, + element: root, + intent, + linkService + }); + } + const isNotForRichText = intent !== "richText"; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (isNotForRichText) { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + if (root.children.length === 0) { + if (root.value) { + const node = document.createTextNode(root.value); + rootHtml.append(node); + if (isNotForRichText && XfaText.shouldBuildText(root.name)) { + textDivs.push(node); + } + } + return { + textDivs + }; + } + const stack = [[root, -1, rootHtml]]; + while (stack.length > 0) { + const [parent, i, html] = stack.at(-1); + if (i + 1 === parent.children.length) { + stack.pop(); + continue; + } + const child = parent.children[++stack.at(-1)[1]]; + if (child === null) { + continue; + } + const { + name + } = child; + if (name === "#text") { + const node = document.createTextNode(child.value); + textDivs.push(node); + html.append(node); + continue; + } + const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name); + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children?.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (isNotForRichText && XfaText.shouldBuildText(name)) { + textDivs.push(node); + } + childHtml.append(node); + } + } + for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { + el.setAttribute("readOnly", true); + } + return { + textDivs + }; + } + static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + parameters.div.style.transform = transform; + parameters.div.hidden = false; + } +} + +;// ./src/display/annotation_layer.js + + + + + + +const DEFAULT_TAB_INDEX = 1000; +const annotation_layer_DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +function getRectDims(rect) { + return { + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; +} +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case AnnotationType.WIDGET: + const fieldType = parameters.data.fieldType; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotationElement(parameters); + case "Btn": + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + return new PushButtonWidgetAnnotationElement(parameters); + case "Ch": + return new ChoiceWidgetAnnotationElement(parameters); + case "Sig": + return new SignatureWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case AnnotationType.INK: + return new InkAnnotationElement(parameters); + case AnnotationType.POLYGON: + return new PolygonAnnotationElement(parameters); + case AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + #updates = null; + #hasBorder = false; + #popupElement = null; + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderForms = parameters.renderForms; + this.svgFactory = parameters.svgFactory; + this.annotationStorage = parameters.annotationStorage; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + this.parent = parameters.parent; + if (isRenderable) { + this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this._createQuadrilaterals(); + } + } + static _hasPopupData({ + titleObj, + contentsObj, + richText + }) { + return !!(titleObj?.str || contentsObj?.str || richText?.str); + } + get _isEditable() { + return this.data.isEditable; + } + get hasPopupData() { + return AnnotationElement._hasPopupData(this.data); + } + updateEdited(params) { + if (!this.container) { + return; + } + this.#updates ||= { + rect: this.data.rect.slice(0) + }; + const { + rect + } = params; + if (rect) { + this.#setRectEdited(rect); + } + this.#popupElement?.popup.updateEdited(params); + } + resetEdited() { + if (!this.#updates) { + return; + } + this.#setRectEdited(this.#updates.rect); + this.#popupElement?.popup.resetEdited(); + this.#updates = null; + } + #setRectEdited(rect) { + const { + container: { + style + }, + data: { + rect: currentRect, + rotation + }, + parent: { + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } + } = this; + currentRect?.splice(0, 4, ...rect); + const { + width, + height + } = getRectDims(rect); + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`; + if (rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation); + } + } + _createContainer(ignoreBorder) { + const { + data, + parent: { + page, + viewport + } + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + if (!(this instanceof WidgetAnnotationElement)) { + container.tabIndex = DEFAULT_TAB_INDEX; + } + const { + style + } = container; + style.zIndex = this.parent.zIndex++; + if (data.alternativeText) { + container.title = data.alternativeText; + } + if (data.noRotate) { + container.classList.add("norotate"); + } + if (!data.rect || this instanceof PopupAnnotationElement) { + const { + rotation + } = data; + if (!data.hasOwnCanvas && rotation !== 0) { + this.setRotation(rotation, container); + } + return container; + } + const { + width, + height + } = getRectDims(data.rect); + if (!ignoreBorder && data.borderStyle.width > 0) { + style.borderWidth = `${data.borderStyle.width}px`; + const horizontalRadius = data.borderStyle.horizontalCornerRadius; + const verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`; + style.borderRadius = radius; + } else if (this instanceof RadioButtonWidgetAnnotationElement) { + const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`; + style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + style.borderStyle = "solid"; + break; + case AnnotationBorderStyleType.DASHED: + style.borderStyle = "dashed"; + break; + case AnnotationBorderStyleType.BEVELED: + warn("Unimplemented border style: beveled"); + break; + case AnnotationBorderStyleType.INSET: + warn("Unimplemented border style: inset"); + break; + case AnnotationBorderStyleType.UNDERLINE: + style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + this.#hasBorder = true; + style.borderColor = Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); + } else { + style.borderWidth = 0; + } + } + const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle, container = this.container) { + if (!this.data.rect) { + return; + } + const { + pageWidth, + pageHeight + } = this.parent.viewport.rawDims; + const { + width, + height + } = getRectDims(this.data.rect); + let elementWidth, elementHeight; + if (angle % 180 === 0) { + elementWidth = 100 * width / pageWidth; + elementHeight = 100 * height / pageHeight; + } else { + elementWidth = 100 * height / pageWidth; + elementHeight = 100 * width / pageHeight; + } + container.style.width = `${elementWidth}%`; + container.style.height = `${elementHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + const colorType = color[0]; + const colorArray = color.slice(1); + event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); + this.annotationStorage.setValue(this.data.id, { + [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) + }); + }; + return shadow(this, "_commonActions", { + display: event => { + const { + display + } = event.detail; + const hidden = display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noView: hidden, + noPrint: display === 1 || display === 2 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + noPrint: !event.detail.print + }); + }, + hidden: event => { + const { + hidden + } = event.detail; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noPrint: hidden, + noView: hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + event.target.disabled = event.detail.readonly; + }, + required: event => { + this._setRequired(event.target, event.detail.required); + }, + bgColor: event => { + setColor("bgColor", "backgroundColor", event); + }, + fillColor: event => { + setColor("fillColor", "backgroundColor", event); + }, + fgColor: event => { + setColor("fgColor", "color", event); + }, + textColor: event => { + setColor("textColor", "color", event); + }, + borderColor: event => { + setColor("borderColor", "borderColor", event); + }, + strokeColor: event => { + setColor("strokeColor", "borderColor", event); + }, + rotation: event => { + const angle = event.detail.rotation; + this.setRotation(angle); + this.annotationStorage.setValue(this.data.id, { + rotation: angle + }); + } + }); + } + _dispatchEventFromSandbox(actions, jsEvent) { + const commonActions = this._commonActions; + for (const name of Object.keys(jsEvent.detail)) { + const action = actions[name] || commonActions[name]; + action?.(jsEvent); + } + } + _setDefaultPropertiesFromJS(element) { + if (!this.enableScripting) { + return; + } + const storedData = this.annotationStorage.getRawValue(this.data.id); + if (!storedData) { + return; + } + const commonActions = this._commonActions; + for (const [actionName, detail] of Object.entries(storedData)) { + const action = commonActions[actionName]; + if (action) { + const eventProxy = { + detail: { + [actionName]: detail + }, + target: element + }; + action(eventProxy); + delete storedData[actionName]; + } + } + } + _createQuadrilaterals() { + if (!this.container) { + return; + } + const { + quadPoints + } = this.data; + if (!quadPoints) { + return; + } + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x)); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); + if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { + return; + } + } + const { + style + } = this.container; + let svgBuffer; + if (this.#hasBorder) { + const { + borderColor, + borderWidth + } = style; + style.borderWidth = 0; + svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; + this.container.classList.add("hasBorder"); + } + const width = rectTrX - rectBlX; + const height = rectTrY - rectBlY; + const { + svgFactory + } = this; + const svg = svgFactory.createElement("svg"); + svg.classList.add("quadrilateralsContainer"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const clipPath = svgFactory.createElement("clipPath"); + const id = `clippath_${this.data.id}`; + clipPath.setAttribute("id", id); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + defs.append(clipPath); + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; + const rect = svgFactory.createElement("rect"); + const x = (blX - rectBlX) / width; + const y = (rectTrY - trY) / height; + const rectWidth = (trX - blX) / width; + const rectHeight = (trY - blY) / height; + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", rectWidth); + rect.setAttribute("height", rectHeight); + clipPath.append(rect); + svgBuffer?.push(``); + } + if (this.#hasBorder) { + svgBuffer.push(`')`); + style.backgroundImage = svgBuffer.join(""); + } + this.container.append(svg); + this.container.style.clipPath = `url(#${id})`; + } + _createPopup() { + const { + data + } = this; + const popup = this.#popupElement = new PopupAnnotationElement({ + data: { + color: data.color, + titleObj: data.titleObj, + modificationDate: data.modificationDate, + contentsObj: data.contentsObj, + richText: data.richText, + parentRect: data.rect, + borderStyle: 0, + id: `popup_${data.id}`, + rotation: data.rotation + }, + parent: this.parent, + elements: [this] + }); + this.parent.div.append(popup.render()); + } + render() { + unreachable("Abstract method `AnnotationElement.render` called"); + } + _getElementsByName(name, skipId = null) { + const fields = []; + if (this._fieldObjects) { + const fieldObj = this._fieldObjects[name]; + if (fieldObj) { + for (const { + page, + id, + exportValues + } of fieldObj) { + if (page === -1) { + continue; + } + if (id === skipId) { + continue; + } + const exportValue = typeof exportValues === "string" ? exportValues : null; + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (domElement && !GetElementsByNameSet.has(domElement)) { + warn(`_getElementsByName - element not allowed: ${id}`); + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + } + return fields; + } + for (const domElement of document.getElementsByName(name)) { + const { + exportValue + } = domElement; + const id = domElement.getAttribute("data-element-id"); + if (id === skipId) { + continue; + } + if (!GetElementsByNameSet.has(domElement)) { + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } + show() { + if (this.container) { + this.container.hidden = false; + } + this.popup?.maybeShow(); + } + hide() { + if (this.container) { + this.container.hidden = true; + } + this.popup?.forceHide(); + } + getElementsToTriggerPopup() { + return this.container; + } + addHighlightArea() { + const triggers = this.getElementsToTriggerPopup(); + if (Array.isArray(triggers)) { + for (const element of triggers) { + element.classList.add("highlightArea"); + } + } else { + triggers.classList.add("highlightArea"); + } + } + _editOnDoubleClick() { + if (!this._isEditable) { + return; + } + const { + annotationEditorType: mode, + data: { + id: editId + } + } = this; + this.container.addEventListener("dblclick", () => { + this.linkService.eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode, + editId + }); + }); + } +} +class LinkAnnotationElement extends AnnotationElement { + constructor(parameters, options = null) { + super(parameters, { + isRenderable: true, + ignoreBorder: !!options?.ignoreBorder, + createQuadrilaterals: true + }); + this.isTooltipOnly = parameters.data.isTooltipOnly; + } + render() { + const { + data, + linkService + } = this; + const link = document.createElement("a"); + link.setAttribute("data-element-id", data.id); + let isBound = false; + if (data.url) { + linkService.addLinkAttributes(link, data.url, data.newWindow); + isBound = true; + } else if (data.action) { + this._bindNamedAction(link, data.action); + isBound = true; + } else if (data.attachment) { + this.#bindAttachment(link, data.attachment, data.attachmentDest); + isBound = true; + } else if (data.setOCGState) { + this.#bindSetOCGState(link, data.setOCGState); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest); + isBound = true; + } else { + if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + isBound = true; + } + if (data.resetForm) { + this._bindResetFormAction(link, data.resetForm); + isBound = true; + } else if (this.isTooltipOnly && !isBound) { + this._bindLink(link, ""); + isBound = true; + } + } + this.container.classList.add("linkAnnotation"); + if (isBound) { + this.container.append(link); + } + return this.container; + } + #setInternalLink() { + this.container.setAttribute("data-internal-link", ""); + } + _bindLink(link, destination) { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + this.#setInternalLink(); + } + } + _bindNamedAction(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + this.#setInternalLink(); + } + #bindAttachment(link, attachment, dest = null) { + link.href = this.linkService.getAnchorUrl(""); + if (attachment.description) { + link.title = attachment.description; + } + link.onclick = () => { + this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest); + return false; + }; + this.#setInternalLink(); + } + #bindSetOCGState(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + this.#setInternalLink(); + } + _bindJSAction(link, data) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + for (const name of Object.keys(data.actions)) { + const jsName = map.get(name); + if (!jsName) { + continue; + } + link[jsName] = () => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: data.id, + name + } + }); + return false; + }; + } + if (!link.onclick) { + link.onclick = () => false; + } + this.#setInternalLink(); + } + _bindResetFormAction(link, resetForm) { + const otherClickAction = link.onclick; + if (!otherClickAction) { + link.href = this.linkService.getAnchorUrl(""); + } + this.#setInternalLink(); + if (!this._fieldObjects) { + warn(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); + if (!otherClickAction) { + link.onclick = () => false; + } + return; + } + link.onclick = () => { + otherClickAction?.(); + const { + fields: resetFormFields, + refs: resetFormRefs, + include + } = resetForm; + const allFields = []; + if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { + const fieldIds = new Set(resetFormRefs); + for (const fieldName of resetFormFields) { + const fields = this._fieldObjects[fieldName] || []; + for (const { + id + } of fields) { + fieldIds.add(id); + } + } + for (const fields of Object.values(this._fieldObjects)) { + for (const field of fields) { + if (fieldIds.has(field.id) === include) { + allFields.push(field); + } + } + } + } else { + for (const fields of Object.values(this._fieldObjects)) { + allFields.push(...fields); + } + } + const storage = this.annotationStorage; + const allIds = []; + for (const field of allFields) { + const { + id + } = field; + allIds.push(id); + switch (field.type) { + case "text": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + case "checkbox": + case "radiobutton": + { + const value = field.defaultValue === field.exportValues; + storage.setValue(id, { + value + }); + break; + } + case "combobox": + case "listbox": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + default: + continue; + } + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (!domElement) { + continue; + } else if (!GetElementsByNameSet.has(domElement)) { + warn(`_bindResetFormAction - element not allowed: ${id}`); + continue; + } + domElement.dispatchEvent(new Event("resetform")); + } + if (this.enableScripting) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: "app", + ids: allIds, + name: "ResetForm" + } + }); + } + return false; + }; + } +} +class TextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + } + render() { + this.container.classList.add("textAnnotation"); + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); + image.setAttribute("data-l10n-args", JSON.stringify({ + type: this.data.name + })); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + return this.container; + } + showElementAndHideCanvas(element) { + if (this.data.hasOwnCanvas) { + if (element.previousSibling?.nodeName === "CANVAS") { + element.previousSibling.hidden = true; + } + element.hidden = false; + } + } + _getKeyModifier(event) { + return util_FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + } + _setEventListener(element, elementData, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + if (baseName === "blur") { + if (!elementData.focused || !event.relatedTarget) { + return; + } + elementData.focused = false; + } else if (baseName === "focus") { + if (elementData.focused) { + return; + } + elementData.focused = true; + } + if (!valueGetter) { + return; + } + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, elementData, names, getter) { + for (const [baseName, eventName] of names) { + if (eventName === "Action" || this.data.actions?.[eventName]) { + if (eventName === "Focus" || eventName === "Blur") { + elementData ||= { + focused: false + }; + } + this._setEventListener(element, elementData, baseName, eventName, getter); + if (eventName === "Focus" && !this.data.actions?.Blur) { + this._setEventListener(element, elementData, "blur", "Blur", null); + } else if (eventName === "Blur" && !this.data.actions?.Focus) { + this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + } + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : Util.makeHexColor(color[0], color[1], color[2]); + } + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontColor + } = this.data.defaultAppearanceData; + const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE; + const style = element.style; + let computedFontSize; + const BORDER_SIZE = 2; + const roundToOneDecimal = x => Math.round(10 * x) / 10; + if (this.data.multiLine) { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR)); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR)); + } + style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`; + style.color = Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); + if (this.data.textAlignment !== null) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + } + _setRequired(element, isRequired) { + if (isRequired) { + element.setAttribute("required", true); + } else { + element.removeAttribute("required"); + } + element.setAttribute("aria-required", isRequired); + } +} +class TextWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + super(parameters, { + isRenderable + }); + } + setPropertyOnSiblings(base, key, value, keyInStorage) { + const storage = this.annotationStorage; + for (const element of this._getElementsByName(base.name, base.id)) { + if (element.domElement) { + element.domElement[key] = value; + } + storage.setValue(element.id, { + [keyInStorage]: value + }); + } + } + render() { + const storage = this.annotationStorage; + const id = this.data.id; + this.container.classList.add("textWidgetAnnotation"); + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; + if (fieldFormattedValues && this.data.comb) { + fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + const elementData = { + userValue: textContent, + formattedValue: fieldFormattedValues, + lastCommittedValue: null, + commitKey: 1, + focused: false + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = fieldFormattedValues ?? textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = "text"; + element.setAttribute("value", fieldFormattedValues ?? textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = DEFAULT_TAB_INDEX; + this._setRequired(element, this.data.required); + if (maxLen) { + element.maxLength = maxLen; + } + element.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + this.setPropertyOnSiblings(element, "value", event.target.value, "value"); + elementData.formattedValue = null; + }); + element.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue ?? ""; + element.value = elementData.userValue = defaultValue; + elementData.formattedValue = null; + }); + let blurListener = event => { + const { + formattedValue + } = elementData; + if (formattedValue !== null && formattedValue !== undefined) { + event.target.value = formattedValue; + } + event.target.scrollLeft = 0; + }; + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("focus", event => { + if (elementData.focused) { + return; + } + const { + target + } = event; + if (elementData.userValue) { + target.value = elementData.userValue; + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + if (!this.data.actions?.Focus) { + elementData.focused = true; + } + }); + element.addEventListener("updatefromsandbox", jsEvent => { + this.showElementAndHideCanvas(jsEvent.target); + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + storage.setValue(id, { + value: elementData.userValue.toString() + }); + event.target.value = elementData.userValue; + }, + formattedValue(event) { + const { + formattedValue + } = event.detail; + elementData.formattedValue = formattedValue; + if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { + event.target.value = formattedValue; + } + storage.setValue(id, { + formattedValue + }); + }, + selRange(event) { + event.target.setSelectionRange(...event.detail.selRange); + }, + charLimit: event => { + const { + charLimit + } = event.detail; + const { + target + } = event; + if (charLimit === 0) { + target.removeAttribute("maxLength"); + return; + } + target.setAttribute("maxLength", charLimit); + let value = elementData.userValue; + if (!value || value.length <= charLimit) { + return; + } + value = value.slice(0, charLimit); + target.value = elementData.userValue = value; + storage.setValue(id, { + value + }); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: 1, + selStart: target.selectionStart, + selEnd: target.selectionEnd + } + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + element.addEventListener("keydown", event => { + elementData.commitKey = 1; + let commitKey = -1; + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter" && !this.data.multiLine) { + commitKey = 2; + } else if (event.key === "Tab") { + elementData.commitKey = 3; + } + if (commitKey === -1) { + return; + } + const { + value + } = event.target; + if (elementData.lastCommittedValue === value) { + return; + } + elementData.lastCommittedValue = value; + elementData.userValue = value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (!elementData.focused || !event.relatedTarget) { + return; + } + if (!this.data.actions?.Blur) { + elementData.focused = false; + } + const { + value + } = event.target; + elementData.userValue = value; + if (elementData.lastCommittedValue !== value) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: elementData.commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + _blurListener(event); + }); + if (this.data.actions?.Keystroke) { + element.addEventListener("beforeinput", event => { + elementData.lastCommittedValue = null; + const { + data, + target + } = event; + const { + value, + selectionStart, + selectionEnd + } = target; + let selStart = selectionStart, + selEnd = selectionEnd; + switch (event.inputType) { + case "deleteWordBackward": + { + const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/); + if (match) { + selStart -= match[0].length; + } + break; + } + case "deleteWordForward": + { + const match = value.substring(selectionStart).match(/^[^\w]*\w*/); + if (match) { + selEnd += match[0].length; + } + break; + } + case "deleteContentBackward": + if (selectionStart === selectionEnd) { + selStart -= 1; + } + break; + case "deleteContentForward": + if (selectionStart === selectionEnd) { + selEnd += 1; + } + break; + } + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + change: data || "", + willCommit: false, + selStart, + selEnd + } + }); + }); + } + this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + if (blurListener) { + element.addEventListener("blur", blurListener); + } + if (this.data.comb) { + const fieldWidth = this.data.rect[2] - this.data.rect[0]; + const combWidth = fieldWidth / maxLen; + element.classList.add("comb"); + element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`; + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.hasOwnCanvas + }); + } +} +class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.exportValue === data.fieldValue + }).value; + if (typeof value === "string") { + value = value !== "Off"; + storage.setValue(id, { + value + }); + } + this.container.classList.add("buttonWidgetAnnotation", "checkBox"); + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "checkbox"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.setAttribute("exportValue", data.exportValue); + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const checkbox of this._getElementsByName(name, id)) { + const curChecked = checked && checkbox.exportValue === data.exportValue; + if (checkbox.domElement) { + checkbox.domElement.checked = curChecked; + } + storage.setValue(checkbox.id, { + value: curChecked + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue || "Off"; + event.target.checked = defaultValue === data.exportValue; + }); + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + event.target.checked = event.detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("buttonWidgetAnnotation", "radioButton"); + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.fieldValue === data.buttonValue + }).value; + if (typeof value === "string") { + value = value !== data.buttonValue; + storage.setValue(id, { + value + }); + } + if (value) { + for (const radio of this._getElementsByName(data.fieldName, id)) { + storage.setValue(radio.id, { + value: false + }); + } + } + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "radio"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const radio of this._getElementsByName(name, id)) { + storage.setValue(radio.id, { + value: false + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue; + event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + }); + if (this.enableScripting && this.hasJSActions) { + const pdfButtonValue = data.buttonValue; + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value: event => { + const checked = pdfButtonValue === event.detail.value; + for (const radio of this._getElementsByName(event.target.name)) { + const curChecked = checked && radio.id === id; + if (radio.domElement) { + radio.domElement.checked = curChecked; + } + storage.setValue(radio.id, { + value: curChecked + }); + } + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { + constructor(parameters) { + super(parameters, { + ignoreBorder: parameters.data.hasAppearance + }); + } + render() { + const container = super.render(); + container.classList.add("buttonWidgetAnnotation", "pushButton"); + const linkElement = container.lastChild; + if (this.enableScripting && this.hasJSActions && linkElement) { + this._setDefaultPropertiesFromJS(linkElement); + linkElement.addEventListener("updatefromsandbox", jsEvent => { + this._dispatchEventFromSandbox({}, jsEvent); + }); + } + return container; + } +} +class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("choiceWidgetAnnotation"); + const storage = this.annotationStorage; + const id = this.data.id; + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + const selectElement = document.createElement("select"); + GetElementsByNameSet.add(selectElement); + selectElement.setAttribute("data-element-id", id); + selectElement.disabled = this.data.readOnly; + this._setRequired(selectElement, this.data.required); + selectElement.name = this.data.fieldName; + selectElement.tabIndex = DEFAULT_TAB_INDEX; + let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + selectElement.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue; + for (const option of selectElement.options) { + option.selected = option.value === defaultValue; + } + }); + for (const option of this.data.options) { + const optionElement = document.createElement("option"); + optionElement.textContent = option.displayValue; + optionElement.value = option.exportValue; + if (storedData.value.includes(option.exportValue)) { + optionElement.setAttribute("selected", true); + addAnEmptyEntry = false; + } + selectElement.append(optionElement); + } + let removeEmptyEntry = null; + if (addAnEmptyEntry) { + const noneOptionElement = document.createElement("option"); + noneOptionElement.value = " "; + noneOptionElement.setAttribute("hidden", true); + noneOptionElement.setAttribute("selected", true); + selectElement.prepend(noneOptionElement); + removeEmptyEntry = () => { + noneOptionElement.remove(); + selectElement.removeEventListener("input", removeEmptyEntry); + removeEmptyEntry = null; + }; + selectElement.addEventListener("input", removeEmptyEntry); + } + const getValue = isExport => { + const name = isExport ? "value" : "textContent"; + const { + options, + multiple + } = selectElement; + if (!multiple) { + return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; + } + return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + }; + let selectedValues = getValue(false); + const getItems = event => { + const options = event.target.options; + return Array.prototype.map.call(options, option => ({ + displayValue: option.textContent, + exportValue: option.value + })); + }; + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + removeEmptyEntry?.(); + const value = event.detail.value; + const values = new Set(Array.isArray(value) ? value : [value]); + for (const option of selectElement.options) { + option.selected = values.has(option.value); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + multipleSelection(event) { + selectElement.multiple = true; + }, + remove(event) { + const options = selectElement.options; + const index = event.detail.remove; + options[index].selected = false; + selectElement.remove(index); + if (options.length > 0) { + const i = Array.prototype.findIndex.call(options, option => option.selected); + if (i === -1) { + options[0].selected = true; + } + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + clear(event) { + while (selectElement.length !== 0) { + selectElement.remove(0); + } + storage.setValue(id, { + value: null, + items: [] + }); + selectedValues = getValue(false); + }, + insert(event) { + const { + index, + displayValue, + exportValue + } = event.detail.insert; + const selectChild = selectElement.children[index]; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + if (selectChild) { + selectChild.before(optionElement); + } else { + selectElement.append(optionElement); + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + items(event) { + const { + items + } = event.detail; + while (selectElement.length !== 0) { + selectElement.remove(0); + } + for (const item of items) { + const { + displayValue, + exportValue + } = item; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + selectElement.append(optionElement); + } + if (selectElement.options.length > 0) { + selectElement.options[0].selected = true; + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + indices(event) { + const indices = new Set(event.detail.indices); + for (const option of event.target.options) { + option.selected = indices.has(option.index); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + editable(event) { + event.target.disabled = !event.detail.editable; + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + selectElement.addEventListener("input", event => { + const exportValue = getValue(true); + const change = getValue(false); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + change, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(true) + }); + }); + } + if (this.data.combo) { + this._setTextStyle(selectElement); + } else {} + this._setBackgroundColor(selectElement); + this._setDefaultPropertiesFromJS(selectElement); + this.container.append(selectElement); + return this.container; + } +} +class PopupAnnotationElement extends AnnotationElement { + constructor(parameters) { + const { + data, + elements + } = parameters; + super(parameters, { + isRenderable: AnnotationElement._hasPopupData(data) + }); + this.elements = elements; + this.popup = null; + } + render() { + this.container.classList.add("popupAnnotation"); + const popup = this.popup = new PopupElement({ + container: this.container, + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText, + rect: this.data.rect, + parentRect: this.data.parentRect || null, + parent: this.parent, + elements: this.elements, + open: this.data.open + }); + const elementIds = []; + for (const element of this.elements) { + element.popup = popup; + element.container.ariaHasPopup = "dialog"; + elementIds.push(element.data.id); + element.addHighlightArea(); + } + this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(",")); + return this.container; + } +} +class PopupElement { + #boundKeyDown = this.#keyDown.bind(this); + #boundHide = this.#hide.bind(this); + #boundShow = this.#show.bind(this); + #boundToggle = this.#toggle.bind(this); + #color = null; + #container = null; + #contentsObj = null; + #dateObj = null; + #elements = null; + #parent = null; + #parentRect = null; + #pinned = false; + #popup = null; + #position = null; + #rect = null; + #richText = null; + #titleObj = null; + #updates = null; + #wasVisible = false; + constructor({ + container, + color, + elements, + titleObj, + modificationDate, + contentsObj, + richText, + parent, + rect, + parentRect, + open + }) { + this.#container = container; + this.#titleObj = titleObj; + this.#contentsObj = contentsObj; + this.#richText = richText; + this.#parent = parent; + this.#color = color; + this.#rect = rect; + this.#parentRect = parentRect; + this.#elements = elements; + this.#dateObj = PDFDateString.toDateObject(modificationDate); + this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); + for (const element of this.trigger) { + element.addEventListener("click", this.#boundToggle); + element.addEventListener("mouseenter", this.#boundShow); + element.addEventListener("mouseleave", this.#boundHide); + element.classList.add("popupTriggerArea"); + } + for (const element of elements) { + element.container?.addEventListener("keydown", this.#boundKeyDown); + } + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + } + render() { + if (this.#popup) { + return; + } + const popup = this.#popup = document.createElement("div"); + popup.className = "popup"; + if (this.#color) { + const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color); + if (CSS.supports("background-color", "color-mix(in srgb, red 30%, white)")) { + popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; + } else { + const BACKGROUND_ENLIGHT = 0.7; + popup.style.backgroundColor = Util.makeHexColor(...this.#color.map(c => Math.floor(BACKGROUND_ENLIGHT * (255 - c) + c))); + } + } + const header = document.createElement("span"); + header.className = "header"; + const title = document.createElement("h1"); + header.append(title); + ({ + dir: title.dir, + str: title.textContent + } = this.#titleObj); + popup.append(header); + if (this.#dateObj) { + const modificationDate = document.createElement("span"); + modificationDate.classList.add("popupDate"); + modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"); + modificationDate.setAttribute("data-l10n-args", JSON.stringify({ + dateObj: this.#dateObj.valueOf() + })); + header.append(modificationDate); + } + const html = this.#html; + if (html) { + XfaLayer.render({ + xfaHtml: html, + intent: "richText", + div: popup + }); + popup.lastChild.classList.add("richText", "popupContent"); + } else { + const contents = this._formatContents(this.#contentsObj); + popup.append(contents); + } + this.#container.append(popup); + } + get #html() { + const richText = this.#richText; + const contentsObj = this.#contentsObj; + if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { + return this.#richText.html || null; + } + return null; + } + get #fontSize() { + return this.#html?.attributes?.style?.fontSize || 0; + } + get #fontColor() { + return this.#html?.attributes?.style?.color || null; + } + #makePopupContent(text) { + const popupLines = []; + const popupContent = { + str: text, + html: { + name: "div", + attributes: { + dir: "auto" + }, + children: [{ + name: "p", + children: popupLines + }] + } + }; + const lineAttributes = { + style: { + color: this.#fontColor, + fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--scale-factor))` : "" + } + }; + for (const line of text.split("\n")) { + popupLines.push({ + name: "span", + value: line, + attributes: lineAttributes + }); + } + return popupContent; + } + _formatContents({ + str, + dir + }) { + const p = document.createElement("p"); + p.classList.add("popupContent"); + p.dir = dir; + const lines = str.split(/(?:\r\n?|\n)/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + return p; + } + #keyDown(event) { + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + return; + } + if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { + this.#toggle(); + } + } + updateEdited({ + rect, + popupContent + }) { + this.#updates ||= { + contentsObj: this.#contentsObj, + richText: this.#richText + }; + if (rect) { + this.#position = null; + } + if (popupContent) { + this.#richText = this.#makePopupContent(popupContent); + this.#contentsObj = null; + } + this.#popup?.remove(); + this.#popup = null; + } + resetEdited() { + if (!this.#updates) { + return; + } + ({ + contentsObj: this.#contentsObj, + richText: this.#richText + } = this.#updates); + this.#updates = null; + this.#popup?.remove(); + this.#popup = null; + this.#position = null; + } + #setPosition() { + if (this.#position !== null) { + return; + } + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.#parent; + let useParentRect = !!this.#parentRect; + let rect = useParentRect ? this.#parentRect : this.#rect; + for (const element of this.#elements) { + if (!rect || Util.intersect(element.data.rect, rect) !== null) { + rect = element.data.rect; + useParentRect = true; + break; + } + } + const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); + const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; + const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; + const popupLeft = normalizedRect[0] + parentWidth; + const popupTop = normalizedRect[1]; + this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]; + const { + style + } = this.#container; + style.left = `${this.#position[0]}%`; + style.top = `${this.#position[1]}%`; + } + #toggle() { + this.#pinned = !this.#pinned; + if (this.#pinned) { + this.#show(); + this.#container.addEventListener("click", this.#boundToggle); + this.#container.addEventListener("keydown", this.#boundKeyDown); + } else { + this.#hide(); + this.#container.removeEventListener("click", this.#boundToggle); + this.#container.removeEventListener("keydown", this.#boundKeyDown); + } + } + #show() { + if (!this.#popup) { + this.render(); + } + if (!this.isVisible) { + this.#setPosition(); + this.#container.hidden = false; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) + 1000; + } else if (this.#pinned) { + this.#container.classList.add("focused"); + } + } + #hide() { + this.#container.classList.remove("focused"); + if (this.#pinned || !this.isVisible) { + return; + } + this.#container.hidden = true; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) - 1000; + } + forceHide() { + this.#wasVisible = this.isVisible; + if (!this.#wasVisible) { + return; + } + this.#container.hidden = true; + } + maybeShow() { + if (!this.#wasVisible) { + return; + } + if (!this.#popup) { + this.#show(); + } + this.#wasVisible = false; + this.#container.hidden = false; + } + get isVisible() { + return this.#container.hidden === false; + } +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.textContent = parameters.data.textContent; + this.textPosition = parameters.data.textPosition; + this.annotationEditorType = AnnotationEditorType.FREETEXT; + } + render() { + this.container.classList.add("freeTextAnnotation"); + if (this.textContent) { + const content = document.createElement("div"); + content.classList.add("annotationTextContent"); + content.setAttribute("role", "comment"); + for (const line of this.textContent) { + const lineSpan = document.createElement("span"); + lineSpan.textContent = line; + content.append(lineSpan); + } + this.container.append(content); + } + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class LineAnnotationElement extends AnnotationElement { + #line = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("lineAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const line = this.#line = this.svgFactory.createElement("svg:line"); + line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); + line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); + line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); + line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); + line.setAttribute("stroke-width", data.borderStyle.width || 1); + line.setAttribute("stroke", "transparent"); + line.setAttribute("fill", "transparent"); + svg.append(line); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#line; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class SquareAnnotationElement extends AnnotationElement { + #square = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("squareAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.#square = this.svgFactory.createElement("svg:rect"); + square.setAttribute("x", borderWidth / 2); + square.setAttribute("y", borderWidth / 2); + square.setAttribute("width", width - borderWidth); + square.setAttribute("height", height - borderWidth); + square.setAttribute("stroke-width", borderWidth || 1); + square.setAttribute("stroke", "transparent"); + square.setAttribute("fill", "transparent"); + svg.append(square); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#square; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class CircleAnnotationElement extends AnnotationElement { + #circle = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("circleAnnotation"); + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.#circle = this.svgFactory.createElement("svg:ellipse"); + circle.setAttribute("cx", width / 2); + circle.setAttribute("cy", height / 2); + circle.setAttribute("rx", width / 2 - borderWidth / 2); + circle.setAttribute("ry", height / 2 - borderWidth / 2); + circle.setAttribute("stroke-width", borderWidth || 1); + circle.setAttribute("stroke", "transparent"); + circle.setAttribute("fill", "transparent"); + svg.append(circle); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#circle; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolylineAnnotationElement extends AnnotationElement { + #polyline = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + vertices, + borderStyle, + popupRef + } + } = this; + if (!vertices) { + return this.container; + } + const { + width, + height + } = getRectDims(rect); + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#polyline; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("caretAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + #polylinesGroupElement = null; + #polylines = []; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + this.annotationEditorType = this.data.it === "InkHighlight" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK; + } + #getTransform(rotation, rect) { + switch (rotation) { + case 90: + return { + transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + case 180: + return { + transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + case 270: + return { + transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + default: + return { + transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + } + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + rotation, + inkLists, + borderStyle, + popupRef + } + } = this; + const { + transform, + width, + height + } = this.#getTransform(rotation, rect); + const svg = this.svgFactory.create(width, height, true); + const g = this.#polylinesGroupElement = this.svgFactory.createElement("svg:g"); + svg.append(g); + g.setAttribute("stroke-width", borderStyle.width || 1); + g.setAttribute("stroke-linecap", "round"); + g.setAttribute("stroke-linejoin", "round"); + g.setAttribute("stroke-miterlimit", 10); + g.setAttribute("stroke", "transparent"); + g.setAttribute("fill", "transparent"); + g.setAttribute("transform", transform); + for (let i = 0, ii = inkLists.length; i < ii; i++) { + const polyline = this.svgFactory.createElement(this.svgElementName); + this.#polylines.push(polyline); + polyline.setAttribute("points", inkLists[i].join(",")); + g.append(polyline); + } + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(svg); + this._editOnDoubleClick(); + return this.container; + } + updateEdited(params) { + super.updateEdited(params); + const { + thickness, + points, + rect + } = params; + const g = this.#polylinesGroupElement; + if (thickness >= 0) { + g.setAttribute("stroke-width", thickness || 1); + } + if (points) { + for (let i = 0, ii = this.#polylines.length; i < ii; i++) { + this.#polylines[i].setAttribute("points", points[i].join(",")); + } + } + if (rect) { + const { + transform, + width, + height + } = this.#getTransform(this.data.rotation, rect); + const root = g.parentElement; + root.setAttribute("viewBox", `0 0 ${width} ${height}`); + g.setAttribute("transform", transform); + } + } + getElementsToTriggerPopup() { + return this.#polylines; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + this.annotationEditorType = AnnotationEditorType.HIGHLIGHT; + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("highlightAnnotation"); + this._editOnDoubleClick(); + return this.container; + } +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("underlineAnnotation"); + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("squigglyAnnotation"); + return this.container; + } +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("strikeoutAnnotation"); + return this.container; + } +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.annotationEditorType = AnnotationEditorType.STAMP; + } + render() { + this.container.classList.add("stampAnnotation"); + this.container.setAttribute("role", "img"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class FileAttachmentAnnotationElement extends AnnotationElement { + #trigger = null; + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + const { + file + } = this.data; + this.filename = file.filename; + this.content = file.content; + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + ...file + }); + } + render() { + this.container.classList.add("fileAttachmentAnnotation"); + const { + container, + data + } = this; + let trigger; + if (data.hasAppearance || data.fillAlpha === 0) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; + if (data.fillAlpha && data.fillAlpha < 1) { + trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + } + } + trigger.addEventListener("dblclick", this.#download.bind(this)); + this.#trigger = trigger; + const { + isMac + } = util_FeatureTest.platform; + container.addEventListener("keydown", evt => { + if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { + this.#download(); + } + }); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } else { + trigger.classList.add("popupTriggerArea"); + } + container.append(trigger); + return container; + } + getElementsToTriggerPopup() { + return this.#trigger; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } + #download() { + this.downloadManager?.openOrDownloadData(this.content, this.filename); + } +} +class AnnotationLayer { + #accessibilityManager = null; + #annotationCanvasMap = null; + #editableAnnotations = new Map(); + #structTreeLayer = null; + constructor({ + div, + accessibilityManager, + annotationCanvasMap, + annotationEditorUIManager, + page, + viewport, + structTreeLayer + }) { + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationCanvasMap = annotationCanvasMap; + this.#structTreeLayer = structTreeLayer || null; + this.page = page; + this.viewport = viewport; + this.zIndex = 0; + this._annotationEditorUIManager = annotationEditorUIManager; + } + hasEditableAnnotations() { + return this.#editableAnnotations.size > 0; + } + async #appendElement(element, id) { + const contentElement = element.firstChild || element; + const annotationId = contentElement.id = `${AnnotationPrefix}${id}`; + const ariaAttributes = await this.#structTreeLayer?.getAriaAttributes(annotationId); + if (ariaAttributes) { + for (const [key, value] of ariaAttributes) { + contentElement.setAttribute(key, value); + } + } + this.div.append(element); + this.#accessibilityManager?.moveElementInDOM(this.div, element, contentElement, false); + } + async render(params) { + const { + annotations + } = params; + const layer = this.div; + setLayerDimensions(layer, this.viewport); + const popupToElements = new Map(); + const elementParams = { + data: null, + layer, + linkService: params.linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new DOMSVGFactory(), + annotationStorage: params.annotationStorage || new AnnotationStorage(), + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects, + parent: this, + elements: null + }; + for (const data of annotations) { + if (data.noHTML) { + continue; + } + const isPopupAnnotation = data.annotationType === AnnotationType.POPUP; + if (!isPopupAnnotation) { + const { + width, + height + } = getRectDims(data.rect); + if (width <= 0 || height <= 0) { + continue; + } + } else { + const elements = popupToElements.get(data.id); + if (!elements) { + continue; + } + elementParams.elements = elements; + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + if (!isPopupAnnotation && data.popupRef) { + const elements = popupToElements.get(data.popupRef); + if (!elements) { + popupToElements.set(data.popupRef, [element]); + } else { + elements.push(element); + } + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + await this.#appendElement(rendered, data.id); + if (element._isEditable) { + this.#editableAnnotations.set(element.data.id, element); + this._annotationEditorUIManager?.renderAnnotationElement(element); + } + } + this.#setAnnotationCanvasMap(); + } + update({ + viewport + }) { + const layer = this.div; + this.viewport = viewport; + setLayerDimensions(layer, { + rotation: viewport.rotation + }); + this.#setAnnotationCanvasMap(); + layer.hidden = false; + } + #setAnnotationCanvasMap() { + if (!this.#annotationCanvasMap) { + return; + } + const layer = this.div; + for (const [id, canvas] of this.#annotationCanvasMap) { + const element = layer.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; + } + canvas.className = "annotationContent"; + const { + firstChild + } = element; + if (!firstChild) { + element.append(canvas); + } else if (firstChild.nodeName === "CANVAS") { + firstChild.replaceWith(canvas); + } else if (!firstChild.classList.contains("annotationContent")) { + firstChild.before(canvas); + } else { + firstChild.after(canvas); + } + } + this.#annotationCanvasMap.clear(); + } + getEditableAnnotations() { + return Array.from(this.#editableAnnotations.values()); + } + getEditableAnnotation(id) { + return this.#editableAnnotations.get(id); + } +} + +;// ./src/display/editor/freetext.js + + + + +const EOL_PATTERN = /\r\n?|\n/g; +class FreeTextEditor extends AnnotationEditor { + #color; + #content = ""; + #editorDivId = `${this.id}-editor`; + #editModeAC = null; + #fontSize; + static _freeTextDefaultContent = ""; + static _internalPadding = 0; + static _defaultColor = null; + static _defaultFontSize = 10; + static get _keyboardManager() { + const proto = FreeTextEditor.prototype; + const arrowChecker = self => self.isEmpty(); + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { + bubbles: true + }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], proto.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], proto._translateEmpty, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto._translateEmpty, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto._translateEmpty, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto._translateEmpty, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { + args: [0, big], + checker: arrowChecker + }]])); + } + static _type = "freetext"; + static _editorType = AnnotationEditorType.FREETEXT; + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + this.#color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; + } + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + this.#updateFontSize(value); + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + this.#updateColor(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.#color]]; + } + #updateFontSize(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`; + this.translate(0, -(size - this.#fontSize) * this.parentScale); + this.#fontSize = size; + this.#setEditorDimensions(); + }; + const savedFontsize = this.#fontSize; + this.addCommands({ + cmd: setFontsize.bind(this, fontSize), + undo: setFontsize.bind(this, savedFontsize), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); + } + #updateColor(color) { + const setColor = col => { + this.#color = this.editorDiv.style.color = col; + }; + const savedColor = this.#color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + _translateEmpty(x, y) { + this._uiManager.translateSelectedEditors(x, y, true); + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + enableEditMode() { + if (this.isInEditMode()) { + return; + } + this.parent.setEditingState(false); + this.parent.updateToolbar(AnnotationEditorType.FREETEXT); + super.enableEditMode(); + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this._isDraggable = false; + this.div.removeAttribute("aria-activedescendant"); + this.#editModeAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#editModeAC); + this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), { + signal + }); + this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), { + signal + }); + this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), { + signal + }); + this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), { + signal + }); + this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), { + signal + }); + } + disableEditMode() { + if (!this.isInEditMode()) { + return; + } + this.parent.setEditingState(true); + super.disableEditMode(); + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", this.#editorDivId); + this._isDraggable = true; + this.#editModeAC?.abort(); + this.#editModeAC = null; + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freetextEditing"); + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } + } + onceAdded() { + if (this.width) { + return; + } + this.enableEditMode(); + this.editorDiv.focus(); + if (this._initialOptions?.isCentered) { + this.center(); + } + this._initialOptions = null; + } + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + if (this.parent) { + this.parent.setEditingState(true); + this.parent.div.classList.add("freetextEditing"); + } + super.remove(); + } + #extractText() { + const buffer = []; + this.editorDiv.normalize(); + let prevChild = null; + for (const child of this.editorDiv.childNodes) { + if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === "BR") { + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + prevChild = child; + } + return buffer.join("\n"); + } + #setEditorDimensions() { + const [parentWidth, parentHeight] = this.parentDimensions; + let rect; + if (this.isAttachedToDOM) { + rect = this.div.getBoundingClientRect(); + } else { + const { + currentLayer, + div + } = this; + const savedDisplay = div.style.display; + const savedVisibility = div.classList.contains("hidden"); + div.classList.remove("hidden"); + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + div.classList.toggle("hidden", savedVisibility); + } + if (this.rotation % 180 === this.parentRotation % 180) { + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; + } else { + this.width = rect.height / parentWidth; + this.height = rect.width / parentHeight; + } + this.fixAndSetPosition(); + } + commit() { + if (!this.isInEditMode()) { + return; + } + super.commit(); + this.disableEditMode(); + const savedText = this.#content; + const newText = this.#content = this.#extractText().trimEnd(); + if (savedText === newText) { + return; + } + const setText = text => { + this.#content = text; + if (!text) { + this.remove(); + return; + } + this.#setContent(); + this._uiManager.rebuild(this); + this.#setEditorDimensions(); + }; + this.addCommands({ + cmd: () => { + setText(newText); + }, + undo: () => { + setText(savedText); + }, + mustExec: false + }); + this.#setEditorDimensions(); + } + shouldGetKeyboardEvents() { + return this.isInEditMode(); + } + enterInEditMode() { + this.enableEditMode(); + this.editorDiv.focus(); + } + dblclick(event) { + this.enterInEditMode(); + } + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enterInEditMode(); + event.preventDefault(); + } + } + editorDivKeydown(event) { + FreeTextEditor._keyboardManager.exec(this, event); + } + editorDivFocus(event) { + this.isEditing = true; + } + editorDivBlur(event) { + this.isEditing = false; + } + editorDivInput(event) { + this.parent.div.classList.toggle("freetextEditing", this.isEmpty()); + } + disableEditing() { + this.editorDiv.setAttribute("role", "comment"); + this.editorDiv.removeAttribute("aria-multiline"); + } + enableEditing() { + this.editorDiv.setAttribute("role", "textbox"); + this.editorDiv.setAttribute("aria-multiline", true); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", this.#editorDivId); + this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"); + this.editorDiv.setAttribute("data-l10n-attrs", "default-content"); + this.enableEditing(); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; + style.color = this.#color; + this.div.append(this.editorDiv); + this.overlayDiv = document.createElement("div"); + this.overlayDiv.classList.add("overlay", "enabled"); + this.div.append(this.overlayDiv); + bindEvents(this, this.div, ["dblclick", "keydown"]); + if (this.width) { + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.annotationElementId) { + const { + position + } = this._initialData; + let [tx, ty] = this.getInitialTranslation(); + [tx, ty] = this.pageTranslationToScreen(tx, ty); + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + let posX, posY; + switch (this.rotation) { + case 0: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY + this.height - (position[1] - pageY) / pageHeight; + break; + case 90: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [ty, -tx]; + break; + case 180: + posX = baseX - this.width + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [-tx, -ty]; + break; + case 270: + posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; + posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; + [tx, ty] = [-ty, tx]; + break; + } + this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); + } else { + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + } + this.#setContent(); + this._isDraggable = true; + this.editorDiv.contentEditable = false; + } else { + this._isDraggable = false; + this.editorDiv.contentEditable = true; + } + return this.div; + } + static #getNodeContent(node) { + return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + } + editorDivPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const { + types + } = clipboardData; + if (types.length === 1 && types[0] === "text/plain") { + return; + } + event.preventDefault(); + const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); + if (!paste) { + return; + } + const selection = window.getSelection(); + if (!selection.rangeCount) { + return; + } + this.editorDiv.normalize(); + selection.deleteFromDocument(); + const range = selection.getRangeAt(0); + if (!paste.includes("\n")) { + range.insertNode(document.createTextNode(paste)); + this.editorDiv.normalize(); + selection.collapseToStart(); + return; + } + const { + startContainer, + startOffset + } = range; + const bufferBefore = []; + const bufferAfter = []; + if (startContainer.nodeType === Node.TEXT_NODE) { + const parent = startContainer.parentElement; + bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); + if (parent !== this.editorDiv) { + let buffer = bufferBefore; + for (const child of this.editorDiv.childNodes) { + if (child === parent) { + buffer = bufferAfter; + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); + } else if (startContainer === this.editorDiv) { + let buffer = bufferBefore; + let i = 0; + for (const child of this.editorDiv.childNodes) { + if (i++ === startOffset) { + buffer = bufferAfter; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; + this.#setContent(); + const newRange = new Range(); + let beforeLength = bufferBefore.reduce((acc, line) => acc + line.length, 0); + for (const { + firstChild + } of this.editorDiv.childNodes) { + if (firstChild.nodeType === Node.TEXT_NODE) { + const length = firstChild.nodeValue.length; + if (beforeLength <= length) { + newRange.setStart(firstChild, beforeLength); + newRange.setEnd(firstChild, beforeLength); + break; + } + beforeLength -= length; + } + } + selection.removeAllRanges(); + selection.addRange(newRange); + } + #setContent() { + this.editorDiv.replaceChildren(); + if (!this.#content) { + return; + } + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + this.editorDiv.append(div); + } + } + #serializeContent() { + return this.#content.replaceAll("\xa0", " "); + } + static #deserializeContent(content) { + return content.replaceAll(" ", "\xa0"); + } + get contentDiv() { + return this.editorDiv; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof FreeTextAnnotationElement) { + const { + data: { + defaultAppearanceData: { + fontSize, + fontColor + }, + rect, + rotation, + id, + popupRef + }, + textContent, + textPosition, + parent: { + page: { + pageNumber + } + } + } = data; + if (!textContent || textContent.length === 0) { + return null; + } + initialData = data = { + annotationType: AnnotationEditorType.FREETEXT, + color: Array.from(fontColor), + fontSize, + value: textContent.join("\n"), + position: textPosition, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.#fontSize = data.fontSize; + editor.#color = Util.makeHexColor(...data.color); + editor.#content = FreeTextEditor.#deserializeContent(data.value); + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + const rect = this.getRect(padding, padding); + const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.#color); + const serialized = { + annotationType: AnnotationEditorType.FREETEXT, + color, + fontSize: this.#fontSize, + value: this.#serializeContent(), + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + value, + fontSize, + color, + pageIndex + } = this._initialData; + return this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const content = super.renderAnnotationElement(annotation); + if (this.deleted) { + return content; + } + const { + style + } = content; + style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; + style.color = this.#color; + content.replaceChildren(); + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + content.append(div); + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + annotation.updateEdited({ + rect: this.getRect(padding, padding), + popupContent: this.#content + }); + return content; + } + resetAnnotationElement(annotation) { + super.resetAnnotationElement(annotation); + annotation.resetEdited(); + } +} + +;// ./src/display/editor/drawers/outline.js + +class Outline { + static PRECISION = 1e-4; + toSVGPath() { + unreachable("Abstract method `toSVGPath` must be implemented."); + } + get box() { + unreachable("Abstract getter `box` must be implemented."); + } + serialize(_bbox, _rotation) { + unreachable("Abstract method `serialize` must be implemented."); + } + static _rescale(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i] * sx; + dest[i + 1] = ty + src[i + 1] * sy; + } + return dest; + } + static _rescaleAndSwap(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i + 1] * sx; + dest[i + 1] = ty + src[i] * sy; + } + return dest; + } + static _translate(src, tx, ty, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i]; + dest[i + 1] = ty + src[i + 1]; + } + return dest; + } + static svgRound(x) { + return Math.round(x * 10000); + } + static _normalizePoint(x, y, parentWidth, parentHeight, rotation) { + switch (rotation) { + case 90: + return [1 - y / parentWidth, x / parentHeight]; + case 180: + return [1 - x / parentWidth, 1 - y / parentHeight]; + case 270: + return [y / parentWidth, 1 - x / parentHeight]; + default: + return [x / parentWidth, y / parentHeight]; + } + } + static _normalizePagePoint(x, y, rotation) { + switch (rotation) { + case 90: + return [1 - y, x]; + case 180: + return [1 - x, 1 - y]; + case 270: + return [y, 1 - x]; + default: + return [x, y]; + } + } + static createBezierPoints(x1, y1, x2, y2, x3, y3) { + return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2]; + } +} + +;// ./src/display/editor/drawers/freedraw.js + + +class FreeDrawOutliner { + #box; + #bottom = []; + #innerMargin; + #isLTR; + #top = []; + #last = new Float32Array(18); + #lastX; + #lastY; + #min; + #min_dist; + #scaleFactor; + #thickness; + #points = []; + static #MIN_DIST = 8; + static #MIN_DIFF = 2; + static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF; + constructor({ + x, + y + }, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + this.#box = box; + this.#thickness = thickness * scaleFactor; + this.#isLTR = isLTR; + this.#last.set([NaN, NaN, NaN, NaN, x, y], 6); + this.#innerMargin = innerMargin; + this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor; + this.#min = FreeDrawOutliner.#MIN * scaleFactor; + this.#scaleFactor = scaleFactor; + this.#points.push(x, y); + } + isEmpty() { + return isNaN(this.#last[8]); + } + #getLastCoords() { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [x, y, width, height] = this.#box; + return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height]; + } + add({ + x, + y + }) { + this.#lastX = x; + this.#lastY = y; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + let [x1, y1, x2, y2] = this.#last.subarray(8, 12); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(diffX, diffY); + if (d < this.#min) { + return false; + } + const diffD = d - this.#min_dist; + const K = diffD / d; + const shiftX = K * diffX; + const shiftY = K * diffY; + let x0 = x1; + let y0 = y1; + x1 = x2; + y1 = y2; + x2 += shiftX; + y2 += shiftY; + this.#points?.push(x, y); + const nX = -shiftY / diffD; + const nY = shiftX / diffD; + const thX = nX * this.#thickness; + const thY = nY * this.#thickness; + this.#last.set(this.#last.subarray(2, 8), 0); + this.#last.set([x2 + thX, y2 + thY], 4); + this.#last.set(this.#last.subarray(14, 18), 12); + this.#last.set([x2 - thX, y2 - thY], 16); + if (isNaN(this.#last[6])) { + if (this.#top.length === 0) { + this.#last.set([x1 + thX, y1 + thY], 2); + this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight); + this.#last.set([x1 - thX, y1 - thY], 14); + this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + return !this.isEmpty(); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)); + if (angle < Math.PI / 2) { + [x1, y1, x2, y2] = this.#last.subarray(2, 6); + this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x1, y1, x0, y0] = this.#last.subarray(14, 18); + this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight); + return true; + } + [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6); + this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18); + this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + return true; + } + toSVGPath() { + if (this.isEmpty()) { + return ""; + } + const top = this.#top; + const bottom = this.#bottom; + if (isNaN(this.#last[6]) && !this.isEmpty()) { + return this.#toSVGPathTwoPoints(); + } + const buffer = []; + buffer.push(`M${top[4]} ${top[5]}`); + for (let i = 6; i < top.length; i += 6) { + if (isNaN(top[i])) { + buffer.push(`L${top[i + 4]} ${top[i + 5]}`); + } else { + buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`); + } + } + this.#toSVGPathEnd(buffer); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + if (isNaN(bottom[i])) { + buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`); + } else { + buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`); + } + } + this.#toSVGPathStart(buffer); + return buffer.join(" "); + } + #toSVGPathTwoPoints() { + const [x, y, width, height] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + } + #toSVGPathStart(buffer) { + const bottom = this.#bottom; + buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + } + #toSVGPathEnd(buffer) { + const [x, y, width, height] = this.#box; + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + } + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } + getOutlines() { + const top = this.#top; + const bottom = this.#bottom; + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const points = new Float32Array((this.#points?.length ?? 0) + 2); + for (let i = 0, ii = points.length - 2; i < ii; i += 2) { + points[i] = (this.#points[i] - layerX) / layerWidth; + points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight; + } + points[points.length - 2] = (this.#lastX - layerX) / layerWidth; + points[points.length - 1] = (this.#lastY - layerY) / layerHeight; + if (isNaN(last[6]) && !this.isEmpty()) { + return this.#getOutlineTwoPoints(points); + } + const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length); + let N = top.length; + for (let i = 0; i < N; i += 2) { + if (isNaN(top[i])) { + outline[i] = outline[i + 1] = NaN; + continue; + } + outline[i] = top[i]; + outline[i + 1] = top[i + 1]; + } + N = this.#getOutlineEnd(outline, N); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + for (let j = 0; j < 6; j += 2) { + if (isNaN(bottom[i + j])) { + outline[N] = outline[N + 1] = NaN; + N += 2; + continue; + } + outline[N] = bottom[i + j]; + outline[N + 1] = bottom[i + j + 1]; + N += 2; + } + } + this.#getOutlineStart(outline, N); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineTwoPoints(points) { + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + const outline = new Float32Array(36); + outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineStart(outline, pos) { + const bottom = this.#bottom; + outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos); + return pos += 6; + } + #getOutlineEnd(outline, pos) { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos); + return pos += 24; + } +} +class FreeDrawOutline extends Outline { + #box; + #bbox = new Float32Array(4); + #innerMargin; + #isLTR; + #points; + #scaleFactor; + #outline; + constructor(outline, points, box, scaleFactor, innerMargin, isLTR) { + super(); + this.#outline = outline; + this.#points = points; + this.#box = box; + this.#scaleFactor = scaleFactor; + this.#innerMargin = innerMargin; + this.#isLTR = isLTR; + this.lastPoint = [NaN, NaN]; + this.#computeMinMax(isLTR); + const [x, y, width, height] = this.#bbox; + for (let i = 0, ii = outline.length; i < ii; i += 2) { + outline[i] = (outline[i] - x) / width; + outline[i + 1] = (outline[i + 1] - y) / height; + } + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = (points[i] - x) / width; + points[i + 1] = (points[i + 1] - y) / height; + } + } + toSVGPath() { + const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`]; + for (let i = 6, ii = this.#outline.length; i < ii; i += 6) { + if (isNaN(this.#outline[i])) { + buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + continue; + } + buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + } + buffer.push("Z"); + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], rotation) { + const width = trX - blX; + const height = trY - blY; + let outline; + let points; + switch (rotation) { + case 0: + outline = Outline._rescale(this.#outline, blX, trY, width, -height); + points = Outline._rescale(this.#points, blX, trY, width, -height); + break; + case 90: + outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height); + points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height); + break; + case 180: + outline = Outline._rescale(this.#outline, trX, blY, -width, height); + points = Outline._rescale(this.#points, trX, blY, -width, height); + break; + case 270: + outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height); + points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height); + break; + } + return { + outline: Array.from(outline), + points: [Array.from(points)] + }; + } + #computeMinMax(isLTR) { + const outline = this.#outline; + let lastX = outline[4]; + let lastY = outline[5]; + let minX = lastX; + let minY = lastY; + let maxX = lastX; + let maxY = lastY; + let lastPointX = lastX; + let lastPointY = lastY; + const ltrCallback = isLTR ? Math.max : Math.min; + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + minX = Math.min(minX, outline[i + 4]); + minY = Math.min(minY, outline[i + 5]); + maxX = Math.max(maxX, outline[i + 4]); + maxY = Math.max(maxY, outline[i + 5]); + if (lastPointY < outline[i + 5]) { + lastPointX = outline[i + 4]; + lastPointY = outline[i + 5]; + } else if (lastPointY === outline[i + 5]) { + lastPointX = ltrCallback(lastPointX, outline[i + 4]); + } + } else { + const bbox = Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6)); + minX = Math.min(minX, bbox[0]); + minY = Math.min(minY, bbox[1]); + maxX = Math.max(maxX, bbox[2]); + maxY = Math.max(maxY, bbox[3]); + if (lastPointY < bbox[3]) { + lastPointX = bbox[2]; + lastPointY = bbox[3]; + } else if (lastPointY === bbox[3]) { + lastPointX = ltrCallback(lastPointX, bbox[2]); + } + } + lastX = outline[i + 4]; + lastY = outline[i + 5]; + } + const bbox = this.#bbox; + bbox[0] = minX - this.#innerMargin; + bbox[1] = minY - this.#innerMargin; + bbox[2] = maxX - minX + 2 * this.#innerMargin; + bbox[3] = maxY - minY + 2 * this.#innerMargin; + this.lastPoint = [lastPointX, lastPointY]; + } + get box() { + return this.#bbox; + } + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeDrawOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } + getNewOutline(thickness, innerMargin) { + const [x, y, width, height] = this.#bbox; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const sx = width * layerWidth; + const sy = height * layerHeight; + const tx = x * layerWidth + layerX; + const ty = y * layerHeight + layerY; + const outliner = this.newOutliner({ + x: this.#points[0] * sx + tx, + y: this.#points[1] * sy + ty + }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin); + for (let i = 2; i < this.#points.length; i += 2) { + outliner.add({ + x: this.#points[i] * sx + tx, + y: this.#points[i + 1] * sy + ty + }); + } + return outliner.getOutlines(); + } +} + +;// ./src/display/editor/drawers/highlight.js + + +class HighlightOutliner { + #box; + #lastPoint; + #verticalEdges = []; + #intervals = []; + constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + const NUMBER_OF_DIGITS = 4; + const EPSILON = 10 ** -NUMBER_OF_DIGITS; + for (const { + x, + y, + width, + height + } of boxes) { + const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; + const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; + const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; + const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; + const left = [x1, y1, y2, true]; + const right = [x2, y1, y2, false]; + this.#verticalEdges.push(left, right); + minX = Math.min(minX, x1); + maxX = Math.max(maxX, x2); + minY = Math.min(minY, y1); + maxY = Math.max(maxY, y2); + } + const bboxWidth = maxX - minX + 2 * innerMargin; + const bboxHeight = maxY - minY + 2 * innerMargin; + const shiftedMinX = minX - innerMargin; + const shiftedMinY = minY - innerMargin; + const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); + const lastPoint = [lastEdge[0], lastEdge[2]]; + for (const edge of this.#verticalEdges) { + const [x, y1, y2] = edge; + edge[0] = (x - shiftedMinX) / bboxWidth; + edge[1] = (y1 - shiftedMinY) / bboxHeight; + edge[2] = (y2 - shiftedMinY) / bboxHeight; + } + this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]); + this.#lastPoint = lastPoint; + } + getOutlines() { + this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); + const outlineVerticalEdges = []; + for (const edge of this.#verticalEdges) { + if (edge[3]) { + outlineVerticalEdges.push(...this.#breakEdge(edge)); + this.#insert(edge); + } else { + this.#remove(edge); + outlineVerticalEdges.push(...this.#breakEdge(edge)); + } + } + return this.#getOutlines(outlineVerticalEdges); + } + #getOutlines(outlineVerticalEdges) { + const edges = []; + const allEdges = new Set(); + for (const edge of outlineVerticalEdges) { + const [x, y1, y2] = edge; + edges.push([x, y1, edge], [x, y2, edge]); + } + edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); + for (let i = 0, ii = edges.length; i < ii; i += 2) { + const edge1 = edges[i][2]; + const edge2 = edges[i + 1][2]; + edge1.push(edge2); + edge2.push(edge1); + allEdges.add(edge1); + allEdges.add(edge2); + } + const outlines = []; + let outline; + while (allEdges.size > 0) { + const edge = allEdges.values().next().value; + let [x, y1, y2, edge1, edge2] = edge; + allEdges.delete(edge); + let lastPointX = x; + let lastPointY = y1; + outline = [x, y2]; + outlines.push(outline); + while (true) { + let e; + if (allEdges.has(edge1)) { + e = edge1; + } else if (allEdges.has(edge2)) { + e = edge2; + } else { + break; + } + allEdges.delete(e); + [x, y1, y2, edge1, edge2] = e; + if (lastPointX !== x) { + outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); + lastPointX = x; + } + lastPointY = lastPointY === y1 ? y2 : y1; + } + outline.push(lastPointX, lastPointY); + } + return new HighlightOutline(outlines, this.#box, this.#lastPoint); + } + #binarySearch(y) { + const array = this.#intervals; + let start = 0; + let end = array.length - 1; + while (start <= end) { + const middle = start + end >> 1; + const y1 = array[middle][0]; + if (y1 === y) { + return middle; + } + if (y1 < y) { + start = middle + 1; + } else { + end = middle - 1; + } + } + return end + 1; + } + #insert([, y1, y2]) { + const index = this.#binarySearch(y1); + this.#intervals.splice(index, 0, [y1, y2]); + } + #remove([, y1, y2]) { + const index = this.#binarySearch(y1); + for (let i = index; i < this.#intervals.length; i++) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + for (let i = index - 1; i >= 0; i--) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + } + #breakEdge(edge) { + const [x, y1, y2] = edge; + const results = [[x, y1, y2]]; + const index = this.#binarySearch(y2); + for (let i = 0; i < index; i++) { + const [start, end] = this.#intervals[i]; + for (let j = 0, jj = results.length; j < jj; j++) { + const [, y3, y4] = results[j]; + if (end <= y3 || y4 <= start) { + continue; + } + if (y3 >= start) { + if (y4 > end) { + results[j][1] = end; + } else { + if (jj === 1) { + return []; + } + results.splice(j, 1); + j--; + jj--; + } + continue; + } + results[j][2] = start; + if (y4 > end) { + results.push([x, end, y4]); + } + } + } + return results; + } +} +class HighlightOutline extends Outline { + #box; + #outlines; + constructor(outlines, box, lastPoint) { + super(); + this.#outlines = outlines; + this.#box = box; + this.lastPoint = lastPoint; + } + toSVGPath() { + const buffer = []; + for (const polygon of this.#outlines) { + let [prevX, prevY] = polygon; + buffer.push(`M${prevX} ${prevY}`); + for (let i = 2; i < polygon.length; i += 2) { + const x = polygon[i]; + const y = polygon[i + 1]; + if (x === prevX) { + buffer.push(`V${y}`); + prevY = y; + } else if (y === prevY) { + buffer.push(`H${x}`); + prevX = x; + } + } + buffer.push("Z"); + } + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], _rotation) { + const outlines = []; + const width = trX - blX; + const height = trY - blY; + for (const outline of this.#outlines) { + const points = new Array(outline.length); + for (let i = 0; i < outline.length; i += 2) { + points[i] = blX + outline[i] * width; + points[i + 1] = trY - outline[i + 1] * height; + } + outlines.push(points); + } + return outlines; + } + get box() { + return this.#box; + } + get classNamesForOutlining() { + return ["highlightOutline"]; + } +} +class FreeHighlightOutliner extends FreeDrawOutliner { + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } +} +class FreeHighlightOutline extends FreeDrawOutline { + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeHighlightOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } +} + +;// ./src/display/editor/color_picker.js + + + +class ColorPicker { + #button = null; + #buttonSwatch = null; + #defaultColor; + #dropdown = null; + #dropdownWasFromKeyboard = false; + #isMainColorPicker = false; + #editor = null; + #eventBus; + #openDropdownAC = null; + #uiManager = null; + #type; + static #l10nColor = null; + static get _keyboardManager() { + return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape", "mac+Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home", "mac+Home"], ColorPicker.prototype._moveToBeginning], [["End", "mac+End"], ColorPicker.prototype._moveToEnd]])); + } + constructor({ + editor = null, + uiManager = null + }) { + if (editor) { + this.#isMainColorPicker = false; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_COLOR; + this.#editor = editor; + } else { + this.#isMainColorPicker = true; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR; + } + this.#uiManager = editor?._uiManager || uiManager; + this.#eventBus = this.#uiManager._eventBus; + this.#defaultColor = editor?.color || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + ColorPicker.#l10nColor ||= Object.freeze({ + blue: "pdfjs-editor-colorpicker-blue", + green: "pdfjs-editor-colorpicker-green", + pink: "pdfjs-editor-colorpicker-pink", + red: "pdfjs-editor-colorpicker-red", + yellow: "pdfjs-editor-colorpicker-yellow" + }); + } + renderButton() { + const button = this.#button = document.createElement("button"); + button.className = "colorPicker"; + button.tabIndex = "0"; + button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); + button.setAttribute("aria-haspopup", true); + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + const swatch = this.#buttonSwatch = document.createElement("span"); + swatch.className = "swatch"; + swatch.setAttribute("aria-hidden", true); + swatch.style.backgroundColor = this.#defaultColor; + button.append(swatch); + return button; + } + renderMainDropdown() { + const dropdown = this.#dropdown = this.#getDropdownRoot(); + dropdown.setAttribute("aria-orientation", "horizontal"); + dropdown.setAttribute("aria-labelledby", "highlightColorPickerLabel"); + return dropdown; + } + #getDropdownRoot() { + const div = document.createElement("div"); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.className = "dropdown"; + div.role = "listbox"; + div.setAttribute("aria-multiselectable", false); + div.setAttribute("aria-orientation", "vertical"); + div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown"); + for (const [name, color] of this.#uiManager.highlightColors) { + const button = document.createElement("button"); + button.tabIndex = "0"; + button.role = "option"; + button.setAttribute("data-color", color); + button.title = name; + button.setAttribute("data-l10n-id", ColorPicker.#l10nColor[name]); + const swatch = document.createElement("span"); + button.append(swatch); + swatch.className = "swatch"; + swatch.style.backgroundColor = color; + button.setAttribute("aria-selected", color === this.#defaultColor); + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); + div.append(button); + } + div.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + return div; + } + #colorSelect(color, event) { + event.stopPropagation(); + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: this.#type, + value: color + }); + } + _colorSelectFromKeyboard(event) { + if (event.target === this.#button) { + this.#openDropdown(event); + return; + } + const color = event.target.getAttribute("data-color"); + if (!color) { + return; + } + this.#colorSelect(color, event); + } + _moveToNext(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + if (event.target === this.#button) { + this.#dropdown.firstChild?.focus(); + return; + } + event.target.nextSibling?.focus(); + } + _moveToPrevious(event) { + if (event.target === this.#dropdown?.firstChild || event.target === this.#button) { + if (this.#isDropdownVisible) { + this._hideDropdownFromKeyboard(); + } + return; + } + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + } + event.target.previousSibling?.focus(); + } + _moveToBeginning(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.firstChild?.focus(); + } + _moveToEnd(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.lastChild?.focus(); + } + #keyDown(event) { + ColorPicker._keyboardManager.exec(this, event); + } + #openDropdown(event) { + if (this.#isDropdownVisible) { + this.hideDropdown(); + return; + } + this.#dropdownWasFromKeyboard = event.detail === 0; + if (!this.#openDropdownAC) { + this.#openDropdownAC = new AbortController(); + window.addEventListener("pointerdown", this.#pointerDown.bind(this), { + signal: this.#uiManager.combinedSignal(this.#openDropdownAC) + }); + } + if (this.#dropdown) { + this.#dropdown.classList.remove("hidden"); + return; + } + const root = this.#dropdown = this.#getDropdownRoot(); + this.#button.append(root); + } + #pointerDown(event) { + if (this.#dropdown?.contains(event.target)) { + return; + } + this.hideDropdown(); + } + hideDropdown() { + this.#dropdown?.classList.add("hidden"); + this.#openDropdownAC?.abort(); + this.#openDropdownAC = null; + } + get #isDropdownVisible() { + return this.#dropdown && !this.#dropdown.classList.contains("hidden"); + } + _hideDropdownFromKeyboard() { + if (this.#isMainColorPicker) { + return; + } + if (!this.#isDropdownVisible) { + this.#editor?.unselect(); + return; + } + this.hideDropdown(); + this.#button.focus({ + preventScroll: true, + focusVisible: this.#dropdownWasFromKeyboard + }); + } + updateColor(color) { + if (this.#buttonSwatch) { + this.#buttonSwatch.style.backgroundColor = color; + } + if (!this.#dropdown) { + return; + } + const i = this.#uiManager.highlightColors.values(); + for (const child of this.#dropdown.children) { + child.setAttribute("aria-selected", i.next().value === color); + } + } + destroy() { + this.#button?.remove(); + this.#button = null; + this.#buttonSwatch = null; + this.#dropdown?.remove(); + this.#dropdown = null; + } +} + +;// ./src/display/editor/highlight.js + + + + + + + +class HighlightEditor extends AnnotationEditor { + #anchorNode = null; + #anchorOffset = 0; + #boxes; + #clipPathId = null; + #colorPicker = null; + #focusOutlines = null; + #focusNode = null; + #focusOffset = 0; + #highlightDiv = null; + #highlightOutlines = null; + #id = null; + #isFreeHighlight = false; + #lastPoint = null; + #opacity; + #outlineId = null; + #text = ""; + #thickness; + #methodOfCreation = ""; + static _defaultColor = null; + static _defaultOpacity = 1; + static _defaultThickness = 12; + static _type = "highlight"; + static _editorType = AnnotationEditorType.HIGHLIGHT; + static _freeHighlightId = -1; + static _freeHighlight = null; + static _freeHighlightClipId = ""; + static get _keyboardManager() { + const proto = HighlightEditor.prototype; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], proto._moveCaret, { + args: [0] + }], [["ArrowRight", "mac+ArrowRight"], proto._moveCaret, { + args: [1] + }], [["ArrowUp", "mac+ArrowUp"], proto._moveCaret, { + args: [2] + }], [["ArrowDown", "mac+ArrowDown"], proto._moveCaret, { + args: [3] + }]])); + } + constructor(params) { + super({ + ...params, + name: "highlightEditor" + }); + this.color = params.color || HighlightEditor._defaultColor; + this.#thickness = params.thickness || HighlightEditor._defaultThickness; + this.#opacity = params.opacity || HighlightEditor._defaultOpacity; + this.#boxes = params.boxes || null; + this.#methodOfCreation = params.methodOfCreation || ""; + this.#text = params.text || ""; + this._isDraggable = false; + if (params.highlightId > -1) { + this.#isFreeHighlight = true; + this.#createFreeOutlines(params); + this.#addToDrawLayer(); + } else if (this.#boxes) { + this.#anchorNode = params.anchorNode; + this.#anchorOffset = params.anchorOffset; + this.#focusNode = params.focusNode; + this.#focusOffset = params.focusOffset; + this.#createOutlines(); + this.#addToDrawLayer(); + this.rotate(this.rotation); + } + } + get telemetryInitialData() { + return { + action: "added", + type: this.#isFreeHighlight ? "free_highlight" : "highlight", + color: this._uiManager.highlightColorNames.get(this.color), + thickness: this.#thickness, + methodOfCreation: this.#methodOfCreation + }; + } + get telemetryFinalData() { + return { + type: "highlight", + color: this._uiManager.highlightColorNames.get(this.color) + }; + } + static computeTelemetryFinalData(data) { + return { + numberOfColors: data.get("color").size + }; + } + #createOutlines() { + const outliner = new HighlightOutliner(this.#boxes, 0.001); + this.#highlightOutlines = outliner.getOutlines(); + [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box; + const outlinerForOutline = new HighlightOutliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr"); + this.#focusOutlines = outlinerForOutline.getOutlines(); + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]; + } + #createFreeOutlines({ + highlightOutlines, + highlightId, + clipPathId + }) { + this.#highlightOutlines = highlightOutlines; + const extraThickness = 1.5; + this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025); + if (highlightId >= 0) { + this.#id = highlightId; + this.#clipPathId = clipPathId; + this.parent.drawLayer.finalizeDraw(highlightId, { + bbox: highlightOutlines.box, + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.#outlineId = this.parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: true + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, true); + } else if (this.parent) { + const angle = this.parent.viewport.rotation; + this.parent.drawLayer.updateProperties(this.#id, { + bbox: HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360), + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + path: { + d: this.#focusOutlines.toSVGPath() + } + }); + } + const [x, y, width, height] = highlightOutlines.box; + switch (this.rotation) { + case 0: + this.x = x; + this.y = y; + this.width = width; + this.height = height; + break; + case 90: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = y; + this.y = 1 - x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + case 180: + this.x = 1 - x; + this.y = 1 - y; + this.width = width; + this.height = height; + break; + case 270: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = 1 - y; + this.y = x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + } + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066"; + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + HighlightEditor._defaultColor = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + HighlightEditor._defaultThickness = value; + break; + } + } + translateInPage(x, y) {} + get toolbarPosition() { + return this.#lastPoint; + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + this.#updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + this.#updateThickness(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]]; + } + #updateColor(color) { + const setColorAndOpacity = (col, opa) => { + this.color = col; + this.#opacity = opa; + this.parent?.drawLayer.updateProperties(this.#id, { + root: { + fill: col, + "fill-opacity": opa + } + }); + this.#colorPicker?.updateColor(col); + }; + const savedColor = this.color; + const savedOpacity = this.#opacity; + this.addCommands({ + cmd: setColorAndOpacity.bind(this, color, HighlightEditor._defaultOpacity), + undo: setColorAndOpacity.bind(this, savedColor, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "color_changed", + color: this._uiManager.highlightColorNames.get(color) + }, true); + } + #updateThickness(thickness) { + const savedThickness = this.#thickness; + const setThickness = th => { + this.#thickness = th; + this.#changeThickness(th); + }; + this.addCommands({ + cmd: setThickness.bind(this, thickness), + undo: setThickness.bind(this, savedThickness), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "thickness_changed", + thickness + }, true); + } + async addEditToolbar() { + const toolbar = await super.addEditToolbar(); + if (!toolbar) { + return null; + } + if (this._uiManager.highlightColors) { + this.#colorPicker = new ColorPicker({ + editor: this + }); + toolbar.addColorPicker(this.#colorPicker); + } + return toolbar; + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + fixAndSetPosition() { + return super.fixAndSetPosition(this.#getRotation()); + } + getBaseTranslation() { + return [0, 0]; + } + getRect(tx, ty) { + return super.getRect(tx, ty, this.#getRotation()); + } + onceAdded() { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + this.div.focus(); + } + remove() { + this.#cleanDrawLayer(); + this._reportTelemetry({ + action: "deleted" + }); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this.#cleanDrawLayer(); + } else if (parent) { + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + this.show(this._isVisible); + if (mustBeSelected) { + this.select(); + } + } + #changeThickness(thickness) { + if (!this.#isFreeHighlight) { + return; + } + this.#createFreeOutlines({ + highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2) + }); + this.fixAndSetPosition(); + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + } + #cleanDrawLayer() { + if (this.#id === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this.#id); + this.#id = null; + this.parent.drawLayer.remove(this.#outlineId); + this.#outlineId = null; + } + #addToDrawLayer(parent = this.parent) { + if (this.#id !== null) { + return; + } + ({ + id: this.#id, + clipPathId: this.#clipPathId + } = parent.drawLayer.draw({ + bbox: this.#highlightOutlines.box, + root: { + viewBox: "0 0 1 1", + fill: this.color, + "fill-opacity": this.#opacity + }, + rootClass: { + highlight: true, + free: this.#isFreeHighlight + }, + path: { + d: this.#highlightOutlines.toSVGPath() + } + }, false, true)); + this.#outlineId = parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: this.#isFreeHighlight + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, this.#isFreeHighlight); + if (this.#highlightDiv) { + this.#highlightDiv.style.clipPath = this.#clipPathId; + } + } + static #rotateBbox([x, y, width, height], angle) { + switch (angle) { + case 90: + return [1 - y - height, x, height, width]; + case 180: + return [1 - x - width, 1 - y - height, width, height]; + case 270: + return [y, 1 - x - width, height, width]; + } + return [x, y, width, height]; + } + rotate(angle) { + const { + drawLayer + } = this.parent; + let box; + if (this.#isFreeHighlight) { + angle = (angle - this.rotation + 360) % 360; + box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle); + } else { + box = HighlightEditor.#rotateBbox([this.x, this.y, this.width, this.height], angle); + } + drawLayer.updateProperties(this.#id, { + bbox: box, + root: { + "data-main-rotation": angle + } + }); + drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + root: { + "data-main-rotation": angle + } + }); + } + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + if (this.#text) { + div.setAttribute("aria-label", this.#text); + div.setAttribute("role", "mark"); + } + if (this.#isFreeHighlight) { + div.classList.add("free"); + } else { + this.div.addEventListener("keydown", this.#keydown.bind(this), { + signal: this._uiManager._signal + }); + } + const highlightDiv = this.#highlightDiv = document.createElement("div"); + div.append(highlightDiv); + highlightDiv.setAttribute("aria-hidden", "true"); + highlightDiv.className = "internal"; + highlightDiv.style.clipPath = this.#clipPathId; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]); + this.enableEditing(); + return div; + } + pointerover() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: true + } + }); + } + } + pointerleave() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false + } + }); + } + } + #keydown(event) { + HighlightEditor._keyboardManager.exec(this, event); + } + _moveCaret(direction) { + this.parent.unselect(this); + switch (direction) { + case 0: + case 2: + this.#setCaret(true); + break; + case 1: + case 3: + this.#setCaret(false); + break; + } + } + #setCaret(start) { + if (!this.#anchorNode) { + return; + } + const selection = window.getSelection(); + if (start) { + selection.setPosition(this.#anchorNode, this.#anchorOffset); + } else { + selection.setPosition(this.#focusNode, this.#focusOffset); + } + } + select() { + super.select(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false, + selected: true + } + }); + } + unselect() { + super.unselect(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + selected: false + } + }); + if (!this.#isFreeHighlight) { + this.#setCaret(false); + } + } + get _mustFixPosition() { + return !this.#isFreeHighlight; + } + show(visible = this._isVisible) { + super.show(visible); + if (this.parent) { + this.parent.drawLayer.updateProperties(this.#id, { + rootClass: { + hidden: !visible + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hidden: !visible + } + }); + } + } + #getRotation() { + return this.#isFreeHighlight ? this.rotation : 0; + } + #serializeBoxes() { + if (this.#isFreeHighlight) { + return null; + } + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const boxes = this.#boxes; + const quadPoints = new Float32Array(boxes.length * 8); + let i = 0; + for (const { + x, + y, + width, + height + } of boxes) { + const sx = x * pageWidth + pageX; + const sy = (1 - y) * pageHeight + pageY; + quadPoints[i] = quadPoints[i + 4] = sx; + quadPoints[i + 1] = quadPoints[i + 3] = sy; + quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; + quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight; + i += 8; + } + return quadPoints; + } + #serializeOutlines(rect) { + return this.#highlightOutlines.serialize(rect, this.#getRotation()); + } + static startHighlighting(parent, isLTR, { + target: textLayer, + x, + y + }) { + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + const ac = new AbortController(); + const signal = parent.combinedSignal(ac); + const pointerUpCallback = e => { + ac.abort(); + this.#endHighlight(parent, e); + }; + window.addEventListener("blur", pointerUpCallback, { + signal + }); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("pointerdown", stopEvent, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + textLayer.addEventListener("pointermove", this.#highlightMove.bind(this, parent), { + signal + }); + this._freeHighlight = new FreeHighlightOutliner({ + x, + y + }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001); + ({ + id: this._freeHighlightId, + clipPathId: this._freeHighlightClipId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: this._defaultColor, + "fill-opacity": this._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: this._freeHighlight.toSVGPath() + } + }, true, true)); + } + static #highlightMove(parent, event) { + if (this._freeHighlight.add(event)) { + parent.drawLayer.updateProperties(this._freeHighlightId, { + path: { + d: this._freeHighlight.toSVGPath() + } + }); + } + } + static #endHighlight(parent, event) { + if (!this._freeHighlight.isEmpty()) { + parent.createAndAddNewEditor(event, false, { + highlightId: this._freeHighlightId, + highlightOutlines: this._freeHighlight.getOutlines(), + clipPathId: this._freeHighlightClipId, + methodOfCreation: "main_toolbar" + }); + } else { + parent.drawLayer.remove(this._freeHighlightId); + } + this._freeHighlightId = -1; + this._freeHighlight = null; + this._freeHighlightClipId = ""; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof HighlightAnnotationElement) { + const { + data: { + quadPoints, + rect, + rotation, + id, + color, + opacity, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + opacity, + quadPoints, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } else if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + borderStyle: { + rawWidth: thickness + }, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + thickness, + inkLists, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const { + color, + quadPoints, + inkLists, + opacity + } = data; + const editor = await super.deserialize(data, parent, uiManager); + editor.color = Util.makeHexColor(...color); + editor.#opacity = opacity || 1; + if (inkLists) { + editor.#thickness = data.thickness; + } + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [pageX, pageY] = editor.pageTranslation; + if (quadPoints) { + const boxes = editor.#boxes = []; + for (let i = 0; i < quadPoints.length; i += 8) { + boxes.push({ + x: (quadPoints[i] - pageX) / pageWidth, + y: 1 - (quadPoints[i + 1] - pageY) / pageHeight, + width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, + height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight + }); + } + editor.#createOutlines(); + editor.#addToDrawLayer(); + editor.rotate(editor.rotation); + } else if (inkLists) { + editor.#isFreeHighlight = true; + const points = inkLists[0]; + const point = { + x: points[0] - pageX, + y: pageHeight - (points[1] - pageY) + }; + const outliner = new FreeHighlightOutliner(point, [0, 0, pageWidth, pageHeight], 1, editor.#thickness / 2, true, 0.001); + for (let i = 0, ii = points.length; i < ii; i += 2) { + point.x = points[i] - pageX; + point.y = pageHeight - (points[i + 1] - pageY); + outliner.add(point); + } + const { + id, + clipPathId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: editor.color, + "fill-opacity": editor._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: outliner.toSVGPath() + } + }, true, true); + editor.#createFreeOutlines({ + highlightOutlines: outliner.getOutlines(), + highlightId: id, + clipPathId + }); + editor.#addToDrawLayer(); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty() || isForCopying) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const rect = this.getRect(0, 0); + const color = AnnotationEditor._colorManager.convert(this.color); + const serialized = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color, + opacity: this.#opacity, + thickness: this.#thickness, + quadPoints: this.#serializeBoxes(), + outlines: this.#serializeOutlines(rect), + pageIndex: this.pageIndex, + rect, + rotation: this.#getRotation(), + structTreeParentId: this._structTreeParentId + }; + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color + } = this._initialData; + return serialized.color.some((c, i) => c !== color[i]); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/draw.js + + + +class DrawingOptions { + #svgProperties = Object.create(null); + updateProperty(name, value) { + this[name] = value; + this.updateSVGProperty(name, value); + } + updateProperties(properties) { + if (!properties) { + return; + } + for (const [name, value] of Object.entries(properties)) { + this.updateProperty(name, value); + } + } + updateSVGProperty(name, value) { + this.#svgProperties[name] = value; + } + toSVGProperties() { + const root = this.#svgProperties; + this.#svgProperties = Object.create(null); + return { + root + }; + } + reset() { + this.#svgProperties = Object.create(null); + } + updateAll(options = this) { + this.updateProperties(options); + } + clone() { + unreachable("Not implemented"); + } +} +class DrawingEditor extends AnnotationEditor { + #drawOutlines = null; + #mustBeCommitted; + _drawId = null; + static _currentDrawId = -1; + static _currentDraw = null; + static _currentDrawingOptions = null; + static _currentParent = null; + static _INNER_MARGIN = 3; + constructor(params) { + super(params); + this.#mustBeCommitted = params.mustBeCommitted || false; + if (params.drawOutlines) { + this.#createDrawOutlines(params); + this.#addToDrawLayer(); + } + } + #createDrawOutlines({ + drawOutlines, + drawId, + drawingOptions + }) { + this.#drawOutlines = drawOutlines; + this._drawingOptions ||= drawingOptions; + if (drawId >= 0) { + this._drawId = drawId; + this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties); + } else { + this._drawId = this.#createDrawing(drawOutlines, this.parent); + } + this.#updateBbox(drawOutlines.box); + } + #createDrawing(drawOutlines, parent) { + const { + id + } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, false); + return id; + } + static _mergeSVGProperties(p1, p2) { + const p1Keys = new Set(Object.keys(p1)); + for (const [key, value] of Object.entries(p2)) { + if (p1Keys.has(key)) { + Object.assign(p1[key], value); + } else { + p1[key] = value; + } + } + return p1; + } + static getDefaultDrawingOptions(_options) { + unreachable("Not implemented"); + } + static get typesMap() { + unreachable("Not implemented"); + } + static get isDrawer() { + return true; + } + static get supportMultipleDrawings() { + return false; + } + static updateDefaultParams(type, value) { + const propertyName = this.typesMap.get(type); + if (propertyName) { + this._defaultDrawingOptions.updateProperty(propertyName, value); + } + if (this._currentParent) { + this._currentDraw.updateProperty(propertyName, value); + this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + } + updateParams(type, value) { + const propertyName = this.constructor.typesMap.get(type); + if (propertyName) { + this._updateProperty(type, propertyName, value); + } + } + static get defaultPropertiesToUpdate() { + const properties = []; + const options = this._defaultDrawingOptions; + for (const [type, name] of this.typesMap) { + properties.push([type, options[name]]); + } + return properties; + } + get propertiesToUpdate() { + const properties = []; + const { + _drawingOptions + } = this; + for (const [type, name] of this.constructor.typesMap) { + properties.push([type, _drawingOptions[name]]); + } + return properties; + } + _updateProperty(type, name, value) { + const options = this._drawingOptions; + const savedValue = options[name]; + const setter = val => { + options.updateProperty(name, val); + const bbox = this.#drawOutlines.updateProperty(name, val); + if (bbox) { + this.#updateBbox(bbox); + } + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + }; + this.addCommands({ + cmd: setter.bind(this, value), + undo: setter.bind(this, savedValue), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type, + overwriteIfSameType: true, + keepUndo: true + }); + } + _onResizing() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onResized() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onTranslating(x, y) { + this.parent?.drawLayer.updateProperties(this._drawId, { + bbox: this.#rotateBox(x, y) + }); + } + _onTranslated() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), { + bbox: this.#rotateBox() + })); + } + _onStartDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: true + } + }); + } + _onStopDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: false + } + }); + } + commit() { + super.commit(); + this.disableEditMode(); + this.disableEditing(); + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + getBaseTranslation() { + return [0, 0]; + } + get isResizable() { + return true; + } + onceAdded() { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + this._isDraggable = true; + if (this.#mustBeCommitted) { + this.#mustBeCommitted = false; + this.commit(); + this.parent.setSelected(this); + if (this.isOnScreen) { + this.div.focus(); + } + } + } + remove() { + this.#cleanDrawLayer(); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + this.#updateBbox(this.#drawOutlines.box); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this._uiManager.removeShouldRescale(this); + this.#cleanDrawLayer(); + } else if (parent) { + this._uiManager.addShouldRescale(this); + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + if (mustBeSelected) { + this.select(); + } + } + #cleanDrawLayer() { + if (this._drawId === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this._drawId); + this._drawId = null; + this._drawingOptions.reset(); + } + #addToDrawLayer(parent = this.parent) { + if (this._drawId !== null && this.parent === parent) { + return; + } + if (this._drawId !== null) { + this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer); + return; + } + this._drawingOptions.updateAll(); + this._drawId = this.#createDrawing(this.#drawOutlines, parent); + } + #convertToParentSpace([x, y, width, height]) { + const { + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [y, 1 - x, width * (pH / pW), height * (pW / pH)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [1 - y, x, width * (pH / pW), height * (pW / pH)]; + default: + return [x, y, width, height]; + } + } + #convertToDrawSpace() { + const { + x, + y, + width, + height, + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + #updateBbox(bbox) { + [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox); + if (this.div) { + this.fixAndSetPosition(); + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + } + this._onResized(); + } + #rotateBox() { + const { + x, + y, + width, + height, + rotation, + parentRotation, + parentDimensions: [pW, pH] + } = this; + switch ((rotation * 4 + parentRotation) / 90) { + case 1: + return [1 - y - height, x, height, width]; + case 2: + return [1 - x - width, 1 - y - height, width, height]; + case 3: + return [y, 1 - x - width, height, width]; + case 4: + return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 5: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 6: + return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)]; + case 7: + return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 8: + return [x - width, y - height, width, height]; + case 9: + return [1 - y, x - width, height, width]; + case 10: + return [1 - x, 1 - y, width, height]; + case 11: + return [y - height, 1 - x, height, width]; + case 12: + return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)]; + case 13: + return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 14: + return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 15: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + rotate() { + if (!this.parent) { + return; + } + this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({ + bbox: this.#rotateBox() + }, this.#drawOutlines.updateRotation((this.parentRotation - this.rotation + 360) % 360))); + } + onScaleChanging() { + if (!this.parent) { + return; + } + this.#updateBbox(this.#drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale)); + } + static onScaleChangingWhenDrawing() {} + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + div.classList.add("draw"); + const drawDiv = document.createElement("div"); + div.append(drawDiv); + drawDiv.setAttribute("aria-hidden", "true"); + drawDiv.className = "internal"; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + this._uiManager.addShouldRescale(this); + this.disableEditing(); + return div; + } + static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) { + unreachable("Not implemented"); + } + static startDrawing(parent, uiManager, _isLTR, { + target, + offsetX: x, + offsetY: y + }) { + const { + viewport: { + rotation + } + } = parent; + const { + width: parentWidth, + height: parentHeight + } = target.getBoundingClientRect(); + const ac = new AbortController(); + const signal = parent.combinedSignal(ac); + window.addEventListener("pointerup", e => { + ac.abort(); + parent.toggleDrawing(true); + this._endDraw(e); + }, { + signal + }); + window.addEventListener("pointerdown", stopEvent, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + target.addEventListener("pointermove", this._drawMove.bind(this), { + signal + }); + parent.toggleDrawing(); + uiManager._editorUndoBar?.hide(); + if (this._currentDraw) { + parent.drawLayer.updateProperties(this._currentDrawId, this._currentDraw.startNew(x, y, parentWidth, parentHeight, rotation)); + return; + } + uiManager.updateUIForDefaultProperties(this); + this._currentDraw = this.createDrawerInstance(x, y, parentWidth, parentHeight, rotation); + this._currentDrawingOptions = this.getDefaultDrawingOptions(); + this._currentParent = parent; + ({ + id: this._currentDrawId + } = parent.drawLayer.draw(this._mergeSVGProperties(this._currentDrawingOptions.toSVGProperties(), this._currentDraw.defaultSVGProperties), true, false)); + } + static _drawMove({ + offsetX, + offsetY + }) { + this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._currentDraw.add(offsetX, offsetY)); + } + static _endDraw({ + offsetX, + offsetY + }) { + const parent = this._currentParent; + parent.drawLayer.updateProperties(this._currentDrawId, this._currentDraw.end(offsetX, offsetY)); + if (this.supportMultipleDrawings) { + const draw = this._currentDraw; + const drawId = this._currentDrawId; + const lastElement = draw.getLastElement(); + parent.addCommands({ + cmd: () => { + parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement)); + }, + undo: () => { + parent.drawLayer.updateProperties(drawId, draw.removeLastElement()); + }, + mustExec: false, + type: AnnotationEditorParamsType.DRAW_STEP + }); + return; + } + this.endDrawing(false); + } + static endDrawing(isAborted) { + const parent = this._currentParent; + if (!parent) { + return null; + } + parent.toggleDrawing(true); + parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP); + if (!this._currentDraw.isEmpty()) { + const { + pageDimensions: [pageWidth, pageHeight], + scale + } = parent; + const editor = parent.createAndAddNewEditor({ + offsetX: 0, + offsetY: 0 + }, false, { + drawId: this._currentDrawId, + drawOutlines: this._currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN), + drawingOptions: this._currentDrawingOptions, + mustBeCommitted: !isAborted + }); + this._cleanup(); + return editor; + } + parent.drawLayer.remove(this._currentDrawId); + this._cleanup(); + return null; + } + static _cleanup() { + this._currentDrawId = -1; + this._currentDraw = null; + this._currentDrawingOptions = null; + this._currentParent = null; + } + createDrawingOptions(_data) {} + static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerWidth, _data) { + unreachable("Not implemented"); + } + static async deserialize(data, parent, uiManager) { + const { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = parent.viewport; + const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data); + const editor = await super.deserialize(data, parent, uiManager); + editor.createDrawingOptions(data); + editor.#createDrawOutlines({ + drawOutlines + }); + editor.#addToDrawLayer(); + editor.onScaleChanging(); + editor.rotate(); + return editor; + } + serializeDraw(isForCopying) { + const [pageX, pageY] = this.pageTranslation; + const [pageWidth, pageHeight] = this.pageDimensions; + return this.#drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/drawers/inkdraw.js + + +class InkDrawOutliner { + #last = new Float64Array(6); + #line; + #lines; + #rotation; + #thickness; + #points; + #lastSVGPath = ""; + #lastIndex = 0; + #outlines = new InkDrawOutline(); + #parentWidth; + #parentHeight; + constructor(x, y, parentWidth, parentHeight, rotation, thickness) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + this.#thickness = thickness; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + this.#lines = [{ + line, + points: this.#points + }]; + this.#last.set(line, 0); + } + updateProperty(name, value) { + if (name === "stroke-width") { + this.#thickness = value; + } + } + #normalizePoint(x, y) { + return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation); + } + isEmpty() { + return !this.#lines || this.#lines.length === 0; + } + add(x, y) { + [x, y] = this.#normalizePoint(x, y); + const [x1, y1, x2, y2] = this.#last.subarray(2, 6); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY); + if (d <= 2) { + return null; + } + this.#points.push(x, y); + if (isNaN(x1)) { + this.#last.set([x2, y2, x, y], 2); + this.#line.push(NaN, NaN, NaN, NaN, x, y); + return { + path: { + d: this.toSVGPath() + } + }; + } + if (isNaN(this.#last[0])) { + this.#line.splice(6, 6); + } + this.#last.set([x1, y1, x2, y2, x, y], 0); + this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y)); + return { + path: { + d: this.toSVGPath() + } + }; + } + end(x, y) { + const change = this.add(x, y); + if (change) { + return change; + } + if (this.#points.length === 2) { + return { + path: { + d: this.toSVGPath() + } + }; + } + return null; + } + startNew(x, y, parentWidth, parentHeight, rotation) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + const last = this.#lines.at(-1); + if (last) { + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + } + this.#lines.push({ + line, + points: this.#points + }); + this.#last.set(line, 0); + this.#lastIndex = 0; + this.toSVGPath(); + return null; + } + getLastElement() { + return this.#lines.at(-1); + } + setLastElement(element) { + if (!this.#lines) { + return this.#outlines.setLastElement(element); + } + this.#lines.push(element); + this.#line = element.line; + this.#points = element.points; + this.#lastIndex = 0; + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + if (!this.#lines) { + return this.#outlines.removeLastElement(); + } + this.#lines.pop(); + this.#lastSVGPath = ""; + for (let i = 0, ii = this.#lines.length; i < ii; i++) { + const { + line, + points + } = this.#lines[i]; + this.#line = line; + this.#points = points; + this.#lastIndex = 0; + this.toSVGPath(); + } + return { + path: { + d: this.#lastSVGPath + } + }; + } + toSVGPath() { + const firstX = Outline.svgRound(this.#line[4]); + const firstY = Outline.svgRound(this.#line[5]); + if (this.#points.length === 2) { + this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`; + return this.#lastSVGPath; + } + if (this.#points.length <= 6) { + const i = this.#lastSVGPath.lastIndexOf("M"); + this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`; + this.#lastIndex = 6; + } + if (this.#points.length === 4) { + const secondX = Outline.svgRound(this.#line[10]); + const secondY = Outline.svgRound(this.#line[11]); + this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`; + this.#lastIndex = 12; + return this.#lastSVGPath; + } + const buffer = []; + if (this.#lastIndex === 0) { + buffer.push(`M ${firstX} ${firstY}`); + this.#lastIndex = 6; + } + for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + this.#lastSVGPath += buffer.join(" "); + this.#lastIndex = this.#line.length; + return this.#lastSVGPath; + } + getOutlines(parentWidth, parentHeight, scale, innerMargin) { + const last = this.#lines.at(-1); + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin); + this.#last = null; + this.#line = null; + this.#lines = null; + this.#lastSVGPath = null; + return this.#outlines; + } + get defaultSVGProperties() { + return { + root: { + viewBox: "0 0 10000 10000" + }, + rootClass: { + draw: true + }, + bbox: [0, 0, 1, 1] + }; + } +} +class InkDrawOutline extends Outline { + #bbox; + #currentRotation = 0; + #innerMargin; + #lines; + #parentWidth; + #parentHeight; + #parentScale; + #rotation; + #thickness; + build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#parentScale = parentScale; + this.#rotation = rotation; + this.#thickness = thickness; + this.#innerMargin = innerMargin ?? 0; + this.#lines = lines; + this.#computeBbox(); + } + setLastElement(element) { + this.#lines.push(element); + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + this.#lines.pop(); + return { + path: { + d: this.toSVGPath() + } + }; + } + toSVGPath() { + const buffer = []; + for (const { + line + } of this.#lines) { + buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`); + if (line.length === 6) { + buffer.push("Z"); + continue; + } + if (line.length === 12) { + buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`); + continue; + } + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + } + return buffer.join(""); + } + serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) { + const serializedLines = []; + const serializedPoints = []; + const [x, y, width, height] = this.#getBBoxWithNoMargin(); + let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn; + switch (this.#rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = pageX; + ty = pageY + pageHeight; + sx = pageWidth; + sy = -pageHeight; + x1 = pageX + x * pageWidth; + y1 = pageY + (1 - y - height) * pageHeight; + x2 = pageX + (x + width) * pageWidth; + y2 = pageY + (1 - y) * pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX; + ty = pageY; + sx = pageWidth; + sy = pageHeight; + x1 = pageX + y * pageWidth; + y1 = pageY + x * pageHeight; + x2 = pageX + (y + height) * pageWidth; + y2 = pageY + (x + width) * pageHeight; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX + pageWidth; + ty = pageY; + sx = -pageWidth; + sy = pageHeight; + x1 = pageX + (1 - x - width) * pageWidth; + y1 = pageY + y * pageHeight; + x2 = pageX + (1 - x) * pageWidth; + y2 = pageY + (y + height) * pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX + pageWidth; + ty = pageY + pageHeight; + sx = -pageWidth; + sy = -pageHeight; + x1 = pageX + (1 - y - height) * pageWidth; + y1 = pageY + (1 - x - width) * pageHeight; + x2 = pageX + (1 - y) * pageWidth; + y2 = pageY + (1 - x) * pageHeight; + break; + } + for (const { + line, + points + } of this.#lines) { + serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null)); + serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null)); + } + return { + lines: serializedLines, + points: serializedPoints, + rect: [x1, y1, x2, y2] + }; + } + static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, { + paths: { + lines, + points + }, + rotation, + thickness + }) { + const newLines = []; + let tx, ty, sx, sy, rescaleFn; + switch (rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = -pageX / pageWidth; + ty = pageY / pageHeight + 1; + sx = 1 / pageWidth; + sy = -1 / pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = -pageY / pageHeight; + ty = -pageX / pageWidth; + sx = 1 / pageHeight; + sy = 1 / pageWidth; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX / pageWidth + 1; + ty = -pageY / pageHeight; + sx = -1 / pageWidth; + sy = 1 / pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageY / pageHeight + 1; + ty = pageX / pageWidth + 1; + sx = -1 / pageHeight; + sy = -1 / pageWidth; + break; + } + if (!lines) { + lines = []; + for (const point of points) { + const len = point.length; + if (len === 2) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])); + continue; + } + if (len === 4) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]])); + continue; + } + const line = new Float32Array(3 * (len - 2)); + lines.push(line); + let [x1, y1, x2, y2] = point.subarray(0, 4); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = point[i]; + const y = point[i + 1]; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + } + for (let i = 0, ii = lines.length; i < ii; i++) { + newLines.push({ + line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy), + points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy) + }); + } + const outlines = new InkDrawOutline(); + outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin); + return outlines; + } + #getMarginComponents(thickness = this.#thickness) { + const margin = this.#innerMargin + thickness / 2 * this.#parentScale; + return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth]; + } + #getBBoxWithNoMargin() { + const [x, y, width, height] = this.#bbox; + const [marginX, marginY] = this.#getMarginComponents(0); + return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY]; + } + #computeBbox() { + const bbox = this.#bbox = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); + for (const { + line + } of this.#lines) { + if (line.length <= 12) { + for (let i = 4, ii = line.length; i < ii; i += 6) { + const [x, y] = line.subarray(i, i + 2); + bbox[0] = Math.min(bbox[0], x); + bbox[1] = Math.min(bbox[1], y); + bbox[2] = Math.max(bbox[2], x); + bbox[3] = Math.max(bbox[3], y); + } + continue; + } + let lastX = line[4], + lastY = line[5]; + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6); + Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox); + lastX = x; + lastY = y; + } + } + const [marginX, marginY] = this.#getMarginComponents(); + bbox[0] = Math.min(1, Math.max(0, bbox[0] - marginX)); + bbox[1] = Math.min(1, Math.max(0, bbox[1] - marginY)); + bbox[2] = Math.min(1, Math.max(0, bbox[2] + marginX)); + bbox[3] = Math.min(1, Math.max(0, bbox[3] + marginY)); + bbox[2] -= bbox[0]; + bbox[3] -= bbox[1]; + } + get box() { + return this.#bbox; + } + updateProperty(name, value) { + if (name === "stroke-width") { + return this.#updateThickness(value); + } + return null; + } + #updateThickness(thickness) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#thickness = thickness; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY]; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateParentDimensions([width, height], scale) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#parentWidth = width; + this.#parentHeight = height; + this.#parentScale = scale; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const diffMarginX = newMarginX - oldMarginX; + const diffMarginY = newMarginY - oldMarginY; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateRotation(rotation) { + this.#currentRotation = rotation; + return { + path: { + transform: this.rotationTransform + } + }; + } + get viewBox() { + return this.#bbox.map(Outline.svgRound).join(" "); + } + get defaultProperties() { + const [x, y] = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}` + } + }; + } + get rotationTransform() { + const [,, width, height] = this.#bbox; + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0; + switch (this.#currentRotation) { + case 90: + b = height / width; + c = -width / height; + e = width; + break; + case 180: + a = -1; + d = -1; + e = width; + f = height; + break; + case 270: + b = -height / width; + c = width / height; + f = height; + break; + default: + return ""; + } + return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`; + } + getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const [x, y, width, height] = this.#bbox; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + return { + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: `${this.rotationTransform} translate(${tx} ${ty})` + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const s2x = width / newWidth; + const s2y = height / newHeight; + return { + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`, + transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})` + } + }; + } + getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const bbox = this.#bbox; + const [x, y, width, height] = bbox; + bbox[0] = newX; + bbox[1] = newY; + bbox[2] = newWidth; + bbox[3] = newHeight; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const tx = -s1x * (x + marginX) + newX + marginX; + const ty = -s1y * (y + marginY) + newY + marginY; + if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) { + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, s1x, s1y, line); + Outline._rescale(points, tx, ty, s1x, s1y, points); + } + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + getPathTranslatedSVGProperties([newX, newY], parentDimensions) { + const [newParentWidth, newParentHeight] = parentDimensions; + const bbox = this.#bbox; + const tx = newX - bbox[0]; + const ty = newY - bbox[1]; + if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) { + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + } else { + const sx = this.#parentWidth / newParentWidth; + const sy = this.#parentHeight / newParentHeight; + this.#parentWidth = newParentWidth; + this.#parentHeight = newParentHeight; + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, sx, sy, line); + Outline._rescale(points, tx, ty, sx, sy, points); + } + bbox[2] *= sx; + bbox[3] *= sy; + } + bbox[0] = newX; + bbox[1] = newY; + return { + root: { + viewBox: this.viewBox + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}` + } + }; + } + get defaultSVGProperties() { + const bbox = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + rootClass: { + draw: true + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`, + transform: this.rotationTransform || null + }, + bbox + }; + } +} + +;// ./src/display/editor/ink.js + + + + + +class InkDrawingOptions extends DrawingOptions { + #viewParameters; + constructor(viewerParameters) { + super(); + this.#viewParameters = viewerParameters; + super.updateProperties({ + fill: "none", + stroke: AnnotationEditor._defaultLineColor, + "stroke-opacity": 1, + "stroke-width": 1, + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-miterlimit": 10 + }); + } + updateSVGProperty(name, value) { + if (name === "stroke-width") { + value ??= this["stroke-width"]; + value *= this.#viewParameters.realScale; + } + super.updateSVGProperty(name, value); + } + clone() { + const clone = new InkDrawingOptions(this.#viewParameters); + clone.updateAll(this); + return clone; + } +} +class InkEditor extends DrawingEditor { + static _type = "ink"; + static _editorType = AnnotationEditorType.INK; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + this._willKeepAspectRatio = true; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return true; + } + static get typesMap() { + return shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.INK_THICKNESS, "stroke-width"], [AnnotationEditorParamsType.INK_COLOR, "stroke"], [AnnotationEditorParamsType.INK_OPACITY, "stroke-opacity"]])); + } + static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) { + return new InkDrawOutliner(x, y, parentWidth, parentHeight, rotation, this._defaultDrawingOptions["stroke-width"]); + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + opacity, + borderStyle: { + rawWidth: thickness + }, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.INK, + color: Array.from(color), + thickness, + opacity, + paths: { + points: inkLists + }, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + return editor; + } + onScaleChanging() { + if (!this.parent) { + return; + } + super.onScaleChanging(); + const { + _drawId, + _drawingOptions, + parent + } = this; + _drawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties()); + } + static onScaleChangingWhenDrawing() { + const parent = this._currentParent; + if (!parent) { + return; + } + super.onScaleChangingWhenDrawing(); + this._defaultDrawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + createDrawingOptions({ + color, + thickness, + opacity + }) { + this._drawingOptions = InkEditor.getDefaultDrawingOptions({ + stroke: Util.makeHexColor(...color), + "stroke-width": thickness, + "stroke-opacity": opacity + }); + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const { + lines, + points, + rect + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + stroke, + "stroke-opacity": opacity, + "stroke-width": thickness + } + } = this; + const serialized = { + annotationType: AnnotationEditorType.INK, + color: AnnotationEditor._colorManager.convert(stroke), + opacity, + thickness, + paths: { + lines, + points + }, + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color, + thickness, + opacity, + pageIndex + } = this._initialData; + return this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const { + points, + rect + } = this.serializeDraw(false); + annotation.updateEdited({ + rect, + thickness: this._drawingOptions["stroke-width"], + points + }); + return null; + } +} + +;// ./src/display/editor/stamp.js + + + + +class StampEditor extends AnnotationEditor { + #bitmap = null; + #bitmapId = null; + #bitmapPromise = null; + #bitmapUrl = null; + #bitmapFile = null; + #bitmapFileName = ""; + #canvas = null; + #observer = null; + #resizeTimeoutId = null; + #isSvg = false; + #hasBeenAddedInUndoStack = false; + static _type = "stamp"; + static _editorType = AnnotationEditorType.STAMP; + constructor(params) { + super({ + ...params, + name: "stampEditor" + }); + this.#bitmapUrl = params.bitmapUrl; + this.#bitmapFile = params.bitmapFile; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static get supportedTypes() { + const types = ["apng", "avif", "bmp", "gif", "jpeg", "png", "svg+xml", "webp", "x-icon"]; + return shadow(this, "supportedTypes", types.map(type => `image/${type}`)); + } + static get supportedTypesStr() { + return shadow(this, "supportedTypesStr", this.supportedTypes.join(",")); + } + static isHandlingMimeForPasting(mime) { + return this.supportedTypes.includes(mime); + } + static paste(item, parent) { + parent.pasteEditor(AnnotationEditorType.STAMP, { + bitmapFile: item.getAsFile() + }); + } + altTextFinish() { + if (this._uiManager.useNewAltTextFlow) { + this.div.hidden = false; + } + super.altTextFinish(); + } + get telemetryFinalData() { + return { + type: "stamp", + hasAltText: !!this.altTextData?.altText + }; + } + static computeTelemetryFinalData(data) { + const hasAltTextStats = data.get("hasAltText"); + return { + hasAltText: hasAltTextStats.get(true) ?? 0, + hasNoAltText: hasAltTextStats.get(false) ?? 0 + }; + } + #getBitmapFetched(data, fromId = false) { + if (!data) { + this.remove(); + return; + } + this.#bitmap = data.bitmap; + if (!fromId) { + this.#bitmapId = data.id; + this.#isSvg = data.isSvg; + } + if (data.file) { + this.#bitmapFileName = data.file.name; + } + this.#createCanvas(); + } + #getBitmapDone() { + this.#bitmapPromise = null; + this._uiManager.enableWaiting(false); + if (!this.#canvas) { + return; + } + if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._editToolbar.hide(); + this._uiManager.editAltText(this, true); + return; + } + if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: false, + alt_text_type: "empty" + } + }); + try { + this.mlGuessAltText(); + } catch {} + } + this.div.focus(); + } + async mlGuessAltText(imageData = null, updateAltTextData = true) { + if (this.hasAltTextData()) { + return null; + } + const { + mlManager + } = this._uiManager; + if (!mlManager) { + throw new Error("No ML."); + } + if (!(await mlManager.isEnabledFor("altText"))) { + throw new Error("ML isn't enabled for alt text."); + } + const { + data, + width, + height + } = imageData || this.copyCanvas(null, null, true).imageData; + const response = await mlManager.guess({ + name: "altText", + request: { + data, + width, + height, + channels: data.length / (width * height) + } + }); + if (!response) { + throw new Error("No response from the AI service."); + } + if (response.error) { + throw new Error("Error from the AI service."); + } + if (response.cancel) { + return null; + } + if (!response.output) { + throw new Error("No valid response from the AI service."); + } + const altText = response.output; + await this.setGuessedAltText(altText); + if (updateAltTextData && !this.hasAltTextData()) { + this.altTextData = { + alt: altText, + decorative: false + }; + } + return altText; + } + #getBitmap() { + if (this.#bitmapId) { + this._uiManager.enableWaiting(true); + this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapUrl) { + const url = this.#bitmapUrl; + this.#bitmapUrl = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapFile) { + const file = this.#bitmapFile; + this.#bitmapFile = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + const input = document.createElement("input"); + input.type = "file"; + input.accept = StampEditor.supportedTypesStr; + const signal = this._uiManager._signal; + this.#bitmapPromise = new Promise(resolve => { + input.addEventListener("change", async () => { + if (!input.files || input.files.length === 0) { + this.remove(); + } else { + this._uiManager.enableWaiting(true); + const data = await this._uiManager.imageManager.getFromFile(input.files[0]); + this._reportTelemetry({ + action: "pdfjs.image.image_selected", + data: { + alt_text_modal: this._uiManager.useNewAltTextFlow + } + }); + this.#getBitmapFetched(data); + } + resolve(); + }, { + signal + }); + input.addEventListener("cancel", () => { + this.remove(); + resolve(); + }, { + signal + }); + }).finally(() => this.#getBitmapDone()); + input.click(); + } + remove() { + if (this.#bitmapId) { + this.#bitmap = null; + this._uiManager.imageManager.deleteId(this.#bitmapId); + this.#canvas?.remove(); + this.#canvas = null; + this.#observer?.disconnect(); + this.#observer = null; + if (this.#resizeTimeoutId) { + clearTimeout(this.#resizeTimeoutId); + this.#resizeTimeoutId = null; + } + } + super.remove(); + } + rebuild() { + if (!this.parent) { + if (this.#bitmapId) { + this.#getBitmap(); + } + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (this.#bitmapId && this.#canvas === null) { + this.#getBitmap(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + onceAdded() { + this._isDraggable = true; + this.div.focus(); + } + isEmpty() { + return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId); + } + get isResizable() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.div.hidden = true; + this.div.setAttribute("role", "figure"); + this.addAltTextButton(); + if (this.#bitmap) { + this.#createCanvas(); + } else { + this.#getBitmap(); + } + if (this.width && !this.annotationElementId) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + } + return this.div; + } + #createCanvas() { + const { + div + } = this; + let { + width, + height + } = this.#bitmap; + const [pageWidth, pageHeight] = this.pageDimensions; + const MAX_RATIO = 0.75; + if (this.width) { + width = this.width * pageWidth; + height = this.height * pageHeight; + } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { + const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); + width *= factor; + height *= factor; + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(width * parentWidth / pageWidth, height * parentHeight / pageHeight); + this._uiManager.enableWaiting(false); + const canvas = this.#canvas = document.createElement("canvas"); + canvas.setAttribute("role", "img"); + this.addContainer(canvas); + if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) { + div.hidden = false; + } + this.#drawBitmap(width, height); + this.#createObserver(); + if (!this.#hasBeenAddedInUndoStack) { + this.parent.addUndoableEditor(this); + this.#hasBeenAddedInUndoStack = true; + } + this._reportTelemetry({ + action: "inserted_image" + }); + if (this.#bitmapFileName) { + canvas.setAttribute("aria-label", this.#bitmapFileName); + } + } + copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) { + if (!maxDataDimension) { + maxDataDimension = 224; + } + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + const outputScale = new OutputScale(); + let bitmap = this.#bitmap; + let width = bitmapWidth, + height = bitmapHeight; + let canvas = null; + if (maxPreviewDimension) { + if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) { + const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight); + width = Math.floor(bitmapWidth * ratio); + height = Math.floor(bitmapHeight * ratio); + } + canvas = document.createElement("canvas"); + const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx); + const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(scaledWidth, scaledHeight); + } + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + let white = "white", + black = "#cfcfd8"; + if (this._uiManager.hcmFilter !== "none") { + black = "black"; + } else if (window.matchMedia?.("(prefers-color-scheme: dark)").matches) { + white = "#8f8f9d"; + black = "#42414d"; + } + const boxDim = 15; + const boxDimWidth = boxDim * outputScale.sx; + const boxDimHeight = boxDim * outputScale.sy; + const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2); + const patternCtx = pattern.getContext("2d"); + patternCtx.fillStyle = white; + patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2); + patternCtx.fillStyle = black; + patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight); + patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight); + ctx.fillStyle = ctx.createPattern(pattern, "repeat"); + ctx.fillRect(0, 0, scaledWidth, scaledHeight); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + let imageData = null; + if (createImageData) { + let dataWidth, dataHeight; + if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) { + dataWidth = bitmap.width; + dataHeight = bitmap.height; + } else { + bitmap = this.#bitmap; + if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) { + const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight); + dataWidth = Math.floor(bitmapWidth * ratio); + dataHeight = Math.floor(bitmapHeight * ratio); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(dataWidth, dataHeight); + } + } + } + const offscreen = new OffscreenCanvas(dataWidth, dataHeight); + const offscreenCtx = offscreen.getContext("2d", { + willReadFrequently: true + }); + offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight); + imageData = { + width: dataWidth, + height: dataHeight, + data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data + }; + } + return { + canvas, + width, + height, + imageData + }; + } + #setDimensions(width, height) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.width = width / parentWidth; + this.height = height / parentHeight; + if (this._initialOptions?.isCentered) { + this.center(); + } else { + this.fixAndSetPosition(); + } + this._initialOptions = null; + if (this.#resizeTimeoutId !== null) { + clearTimeout(this.#resizeTimeoutId); + } + const TIME_TO_WAIT = 200; + this.#resizeTimeoutId = setTimeout(() => { + this.#resizeTimeoutId = null; + this.#drawBitmap(width, height); + }, TIME_TO_WAIT); + } + #scaleBitmap(width, height) { + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + let newWidth = bitmapWidth; + let newHeight = bitmapHeight; + let bitmap = this.#bitmap; + while (newWidth > 2 * width || newHeight > 2 * height) { + const prevWidth = newWidth; + const prevHeight = newHeight; + if (newWidth > 2 * width) { + newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2); + } + if (newHeight > 2 * height) { + newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = offscreen.transferToImageBitmap(); + } + return bitmap; + } + #drawBitmap(width, height) { + const outputScale = new OutputScale(); + const scaledWidth = Math.ceil(width * outputScale.sx); + const scaledHeight = Math.ceil(height * outputScale.sy); + const canvas = this.#canvas; + if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) { + return; + } + canvas.width = scaledWidth; + canvas.height = scaledHeight; + const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight); + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + getImageForAltText() { + return this.#canvas; + } + #serializeBitmap(toUrl) { + if (toUrl) { + if (this.#isSvg) { + const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); + if (url) { + return url; + } + } + const canvas = document.createElement("canvas"); + ({ + width: canvas.width, + height: canvas.height + } = this.#bitmap); + const ctx = canvas.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0); + return canvas.toDataURL(); + } + if (this.#isSvg) { + const [pageWidth, pageHeight] = this.pageDimensions; + const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS); + const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS); + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); + return offscreen.transferToImageBitmap(); + } + return structuredClone(this.#bitmap); + } + #createObserver() { + if (!this._uiManager._signal) { + return; + } + this.#observer = new ResizeObserver(entries => { + const rect = entries[0].contentRect; + if (rect.width && rect.height) { + this.#setDimensions(rect.width, rect.height); + } + }); + this.#observer.observe(this.div); + this._uiManager._signal.addEventListener("abort", () => { + this.#observer?.disconnect(); + this.#observer = null; + }, { + once: true + }); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof StampAnnotationElement) { + const { + data: { + rect, + rotation, + id, + structParent, + popupRef + }, + container, + parent: { + page: { + pageNumber + } + } + } = data; + const canvas = container.querySelector("canvas"); + const imageData = uiManager.imageManager.getFromCanvas(container.id, canvas); + canvas.remove(); + const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get("aria-label") || ""; + initialData = data = { + annotationType: AnnotationEditorType.STAMP, + bitmapId: imageData.id, + bitmap: imageData.bitmap, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + accessibilityData: { + decorative: false, + altText + }, + isSvg: false, + structParent, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + const { + rect, + bitmap, + bitmapUrl, + bitmapId, + isSvg, + accessibilityData + } = data; + if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { + editor.#bitmapId = bitmapId; + if (bitmap) { + editor.#bitmap = bitmap; + } + } else { + editor.#bitmapUrl = bitmapUrl; + } + editor.#isSvg = isSvg; + const [parentWidth, parentHeight] = editor.pageDimensions; + editor.width = (rect[2] - rect[0]) / parentWidth; + editor.height = (rect[3] - rect[1]) / parentHeight; + editor.annotationElementId = data.id || null; + if (accessibilityData) { + editor.altTextData = accessibilityData; + } + editor._initialData = initialData; + editor.#hasBeenAddedInUndoStack = !!initialData; + return editor; + } + serialize(isForCopying = false, context = null) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const serialized = { + annotationType: AnnotationEditorType.STAMP, + bitmapId: this.#bitmapId, + pageIndex: this.pageIndex, + rect: this.getRect(0, 0), + rotation: this.rotation, + isSvg: this.#isSvg, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + serialized.bitmapUrl = this.#serializeBitmap(true); + serialized.accessibilityData = this.serializeAltText(true); + return serialized; + } + const { + decorative, + altText + } = this.serializeAltText(false); + if (!decorative && altText) { + serialized.accessibilityData = { + type: "Figure", + alt: altText + }; + } + if (this.annotationElementId) { + const changes = this.#hasElementChanged(serialized); + if (changes.isSame) { + return null; + } + if (changes.isSameAltText) { + delete serialized.accessibilityData; + } else { + serialized.accessibilityData.structParent = this._initialData.structParent ?? -1; + } + } + serialized.id = this.annotationElementId; + if (context === null) { + return serialized; + } + context.stamps ||= new Map(); + const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; + if (!context.stamps.has(this.#bitmapId)) { + context.stamps.set(this.#bitmapId, { + area, + serialized + }); + serialized.bitmap = this.#serializeBitmap(false); + } else if (this.#isSvg) { + const prevData = context.stamps.get(this.#bitmapId); + if (area > prevData.area) { + prevData.area = area; + prevData.serialized.bitmap.close(); + prevData.serialized.bitmap = this.#serializeBitmap(false); + } + } + return serialized; + } + #hasElementChanged(serialized) { + const { + pageIndex, + accessibilityData: { + altText + } + } = this._initialData; + const isSamePageIndex = serialized.pageIndex === pageIndex; + const isSameAltText = (serialized.accessibilityData?.alt || "") === altText; + return { + isSame: !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText, + isSameAltText + }; + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } +} + +;// ./src/display/editor/annotation_editor_layer.js + + + + + + + +class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; + #annotationLayer = null; + #clickAC = null; + #editorFocusTimeoutId = null; + #editors = new Map(); + #hadPointerDown = false; + #isDisabling = false; + #drawingAC = null; + #textLayer = null; + #textSelectionAC = null; + #uiManager; + static _initialized = false; + static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor].map(type => [type._editorType, type])); + constructor({ + uiManager, + pageIndex, + div, + structTreeLayer, + accessibilityManager, + annotationLayer, + drawLayer, + textLayer, + viewport, + l10n + }) { + const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + for (const editorType of editorTypes) { + editorType.initialize(l10n, uiManager); + } + } + uiManager.registerEditorTypes(editorTypes); + this.#uiManager = uiManager; + this.pageIndex = pageIndex; + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationLayer = annotationLayer; + this.viewport = viewport; + this.#textLayer = textLayer; + this.drawLayer = drawLayer; + this._structTree = structTreeLayer; + this.#uiManager.addLayer(this); + } + get isEmpty() { + return this.#editors.size === 0; + } + get isInvisible() { + return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE; + } + updateToolbar(mode) { + this.#uiManager.updateToolbar(mode); + } + updateMode(mode = this.#uiManager.getMode()) { + this.#cleanup(); + switch (mode) { + case AnnotationEditorType.NONE: + this.disableTextSelection(); + this.togglePointerEvents(false); + this.toggleAnnotationLayerPointerEvents(true); + this.disableClick(); + return; + case AnnotationEditorType.INK: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + break; + case AnnotationEditorType.HIGHLIGHT: + this.enableTextSelection(); + this.togglePointerEvents(false); + this.disableClick(); + break; + default: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + } + this.toggleAnnotationLayerPointerEvents(false); + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); + } + this.div.hidden = false; + } + hasTextLayer(textLayer) { + return textLayer === this.#textLayer?.div; + } + setEditingState(isEditing) { + this.#uiManager.setEditingState(isEditing); + } + addCommands(params) { + this.#uiManager.addCommands(params); + } + cleanUndoStack(type) { + this.#uiManager.cleanUndoStack(type); + } + toggleDrawing(enabled = false) { + this.div.classList.toggle("drawing", !enabled); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + toggleAnnotationLayerPointerEvents(enabled = false) { + this.#annotationLayer?.div.classList.toggle("disabled", !enabled); + } + async enable() { + this.div.tabIndex = 0; + this.togglePointerEvents(true); + const annotationElementIds = new Set(); + for (const editor of this.#editors.values()) { + editor.enableEditing(); + editor.show(true); + if (editor.annotationElementId) { + this.#uiManager.removeChangedExistingAnnotation(editor); + annotationElementIds.add(editor.annotationElementId); + } + } + if (!this.#annotationLayer) { + return; + } + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { + continue; + } + if (annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = await this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); + } + } + disable() { + this.#isDisabling = true; + this.div.tabIndex = -1; + this.togglePointerEvents(false); + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#editors.values()) { + editor.disableEditing(); + if (!editor.annotationElementId) { + continue; + } + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; + } else { + resetAnnotations.set(editor.annotationElementId, editor); + } + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); + } + if (this.#annotationLayer) { + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + const { + id + } = editable.data; + if (this.#uiManager.isDeletedAnnotationElement(id)) { + continue; + } + let editor = resetAnnotations.get(id); + if (editor) { + editor.resetAnnotationElement(editable); + editor.show(false); + editable.show(); + continue; + } + editor = changedAnnotations.get(id); + if (editor) { + this.#uiManager.addChangedExistingAnnotation(editor); + if (editor.renderAnnotationElement(editable)) { + editor.show(false); + } + } + editable.show(); + } + } + this.#cleanup(); + if (this.isEmpty) { + this.div.hidden = true; + } + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.remove(`${editorType._type}Editing`); + } + this.disableTextSelection(); + this.toggleAnnotationLayerPointerEvents(true); + this.#isDisabling = false; + } + getEditableAnnotation(id) { + return this.#annotationLayer?.getEditableAnnotation(id) || null; + } + setActiveEditor(editor) { + const currentActive = this.#uiManager.getActive(); + if (currentActive === editor) { + return; + } + this.#uiManager.setActiveEditor(editor); + } + enableTextSelection() { + this.div.tabIndex = -1; + if (this.#textLayer?.div && !this.#textSelectionAC) { + this.#textSelectionAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textSelectionAC); + this.#textLayer.div.addEventListener("pointerdown", this.#textLayerPointerDown.bind(this), { + signal + }); + this.#textLayer.div.classList.add("highlighting"); + } + } + disableTextSelection() { + this.div.tabIndex = 0; + if (this.#textLayer?.div && this.#textSelectionAC) { + this.#textSelectionAC.abort(); + this.#textSelectionAC = null; + this.#textLayer.div.classList.remove("highlighting"); + } + } + #textLayerPointerDown(event) { + this.#uiManager.unselectAll(); + const { + target + } = event; + if (target === this.#textLayer.div || (target.getAttribute("role") === "img" || target.classList.contains("endOfContent")) && this.#textLayer.div.contains(target)) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#uiManager.showAllEditors("highlight", true, true); + this.#textLayer.div.classList.add("free"); + this.toggleDrawing(); + HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", { + target: this.#textLayer.div, + x: event.x, + y: event.y + }); + this.#textLayer.div.addEventListener("pointerup", () => { + this.#textLayer.div.classList.remove("free"); + this.toggleDrawing(true); + }, { + once: true, + signal: this.#uiManager._signal + }); + event.preventDefault(); + } + } + enableClick() { + if (this.#clickAC) { + return; + } + this.#clickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#clickAC); + this.div.addEventListener("pointerdown", this.pointerdown.bind(this), { + signal + }); + this.div.addEventListener("pointerup", this.pointerup.bind(this), { + signal + }); + } + disableClick() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + attach(editor) { + this.#editors.set(editor.id, editor); + const { + annotationElementId + } = editor; + if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { + this.#uiManager.removeDeletedAnnotationElement(editor); + } + } + detach(editor) { + this.#editors.delete(editor.id); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + if (!this.#isDisabling && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + } + } + remove(editor) { + this.detach(editor); + this.#uiManager.removeEditor(editor); + editor.div.remove(); + editor.isAttachedToDOM = false; + } + changeParent(editor) { + if (editor.parent === this) { + return; + } + if (editor.parent && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId); + AnnotationEditor.deleteAnnotationElement(editor); + editor.annotationElementId = null; + } + this.attach(editor); + editor.parent?.detach(editor); + editor.setParent(this); + if (editor.div && editor.isAttachedToDOM) { + editor.div.remove(); + this.div.append(editor.div); + } + } + add(editor) { + if (editor.parent === this && editor.isAttachedToDOM) { + return; + } + this.changeParent(editor); + this.#uiManager.addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + editor.fixAndSetPosition(); + editor.onceAdded(); + this.#uiManager.addToAnnotationStorage(editor); + editor._reportTelemetry(editor.telemetryInitialData); + } + moveEditorInDOM(editor) { + if (!editor.isAttachedToDOM) { + return; + } + const { + activeElement + } = document; + if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { + editor._focusEventsAllowed = false; + this.#editorFocusTimeoutId = setTimeout(() => { + this.#editorFocusTimeoutId = null; + if (!editor.div.contains(document.activeElement)) { + editor.div.addEventListener("focusin", () => { + editor._focusEventsAllowed = true; + }, { + once: true, + signal: this.#uiManager._signal + }); + activeElement.focus(); + } else { + editor._focusEventsAllowed = true; + } + }, 0); + } + editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.parent ||= this; + editor.rebuild(); + editor.show(); + } else { + this.add(editor); + } + } + addUndoableEditor(editor) { + const cmd = () => editor._uiManager.rebuild(editor); + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getNextId() { + return this.#uiManager.getId(); + } + get #currentEditorType() { + return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + } + combinedSignal(ac) { + return this.#uiManager.combinedSignal(ac); + } + #createNewEditor(params) { + const editorType = this.#currentEditorType; + return editorType ? new editorType.prototype.constructor(params) : null; + } + canCreateNewEmptyEditor() { + return this.#currentEditorType?.canCreateNewEmptyEditor(); + } + pasteEditor(mode, params) { + this.#uiManager.updateToolbar(mode); + this.#uiManager.updateMode(mode); + const { + offsetX, + offsetY + } = this.#getCenterPoint(); + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: offsetX, + y: offsetY, + uiManager: this.#uiManager, + isCentered: true, + ...params + }); + if (editor) { + this.add(editor); + } + } + async deserialize(data) { + return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null; + } + createAndAddNewEditor(event, isCentered, data = {}) { + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: this.#uiManager, + isCentered, + ...data + }); + if (editor) { + this.add(editor); + } + return editor; + } + #getCenterPoint() { + const { + x, + y, + width, + height + } = this.div.getBoundingClientRect(); + const tlX = Math.max(0, x); + const tlY = Math.max(0, y); + const brX = Math.min(window.innerWidth, x + width); + const brY = Math.min(window.innerHeight, y + height); + const centerX = (tlX + brX) / 2 - x; + const centerY = (tlY + brY) / 2 - y; + const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; + return { + offsetX, + offsetY + }; + } + addNewEditor() { + this.createAndAddNewEditor(this.#getCenterPoint(), true); + } + setSelected(editor) { + this.#uiManager.setSelected(editor); + } + toggleSelected(editor) { + this.#uiManager.toggleSelected(editor); + } + unselect(editor) { + this.#uiManager.unselect(editor); + } + pointerup(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + if (!this.#hadPointerDown) { + return; + } + this.#hadPointerDown = false; + if (this.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) { + return; + } + if (!this.#allowClick) { + this.#allowClick = true; + return; + } + if (this.#uiManager.getMode() === AnnotationEditorType.STAMP) { + this.#uiManager.unselectAll(); + return; + } + this.createAndAddNewEditor(event, false); + } + pointerdown(event) { + if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) { + this.enableTextSelection(); + } + if (this.#hadPointerDown) { + this.#hadPointerDown = false; + return; + } + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + this.#hadPointerDown = true; + if (this.#currentEditorType?.isDrawer) { + this.startDrawingSession(event); + return; + } + const editor = this.#uiManager.getActive(); + this.#allowClick = !editor || editor.isEmpty(); + } + startDrawingSession(event) { + this.div.focus(); + if (this.#drawingAC) { + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + return; + } + this.#uiManager.setCurrentDrawingSession(this); + this.#drawingAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#drawingAC); + this.div.addEventListener("blur", ({ + relatedTarget + }) => { + if (relatedTarget && !this.div.contains(relatedTarget)) { + this.commitOrRemove(); + } + }, { + signal + }); + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + } + endDrawingSession(isAborted = false) { + if (!this.#drawingAC) { + return null; + } + this.#uiManager.setCurrentDrawingSession(null); + this.#drawingAC.abort(); + this.#drawingAC = null; + return this.#currentEditorType.endDrawing(isAborted); + } + findNewParent(editor, x, y) { + const layer = this.#uiManager.findParent(x, y); + if (layer === null || layer === this) { + return false; + } + layer.changeParent(editor); + return true; + } + commitOrRemove() { + if (this.#drawingAC) { + this.endDrawingSession(); + return true; + } + return false; + } + onScaleChanging() { + if (!this.#drawingAC) { + return; + } + this.#currentEditorType.onScaleChangingWhenDrawing(this); + } + destroy() { + this.commitOrRemove(); + if (this.#uiManager.getActive()?.parent === this) { + this.#uiManager.commitOrRemove(); + this.#uiManager.setActiveEditor(null); + } + if (this.#editorFocusTimeoutId) { + clearTimeout(this.#editorFocusTimeoutId); + this.#editorFocusTimeoutId = null; + } + for (const editor of this.#editors.values()) { + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + editor.setParent(null); + editor.isAttachedToDOM = false; + editor.div.remove(); + } + this.div = null; + this.#editors.clear(); + this.#uiManager.removeLayer(this); + } + #cleanup() { + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } + } + render({ + viewport + }) { + this.viewport = viewport; + setLayerDimensions(this.div, viewport); + for (const editor of this.#uiManager.getEditors(this.pageIndex)) { + this.add(editor); + editor.rebuild(); + } + this.updateMode(); + } + update({ + viewport + }) { + this.#uiManager.commitOrRemove(); + this.#cleanup(); + const oldRotation = this.viewport.rotation; + const rotation = viewport.rotation; + this.viewport = viewport; + setLayerDimensions(this.div, { + rotation + }); + if (oldRotation !== rotation) { + for (const editor of this.#editors.values()) { + editor.rotate(rotation); + } + } + } + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; + } + get scale() { + return this.#uiManager.viewParameters.realScale; + } +} + +;// ./src/display/draw_layer.js + + +class DrawLayer { + #parent = null; + #id = 0; + #mapping = new Map(); + #toUpdate = new Map(); + constructor({ + pageIndex + }) { + this.pageIndex = pageIndex; + } + setParent(parent) { + if (!this.#parent) { + this.#parent = parent; + return; + } + if (this.#parent !== parent) { + if (this.#mapping.size > 0) { + for (const root of this.#mapping.values()) { + root.remove(); + parent.append(root); + } + } + this.#parent = parent; + } + } + static get _svgFactory() { + return shadow(this, "_svgFactory", new DOMSVGFactory()); + } + static #setBox(element, [x, y, width, height]) { + const { + style + } = element; + style.top = `${100 * y}%`; + style.left = `${100 * x}%`; + style.width = `${100 * width}%`; + style.height = `${100 * height}%`; + } + #createSVG() { + const svg = DrawLayer._svgFactory.create(1, 1, true); + this.#parent.append(svg); + svg.setAttribute("aria-hidden", true); + return svg; + } + #createClipPath(defs, pathId) { + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + defs.append(clipPath); + const clipPathId = `clip_${pathId}`; + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + const clipPathUse = DrawLayer._svgFactory.createElement("use"); + clipPath.append(clipPathUse); + clipPathUse.setAttribute("href", `#${pathId}`); + clipPathUse.classList.add("clip"); + return clipPathId; + } + #updateProperties(element, properties) { + for (const [key, value] of Object.entries(properties)) { + if (value === null) { + element.removeAttribute(key); + } else { + element.setAttribute(key, value); + } + } + } + draw(properties, isPathUpdatable = false, hasClip = false) { + const id = this.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + if (isPathUpdatable) { + this.#toUpdate.set(id, path); + } + const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null; + const use = DrawLayer._svgFactory.createElement("use"); + root.append(use); + use.setAttribute("href", `#${pathId}`); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return { + id, + clipPathId: `url(#${clipPathId})` + }; + } + drawOutline(properties, mustRemoveSelfIntersections) { + const id = this.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + let maskId; + if (mustRemoveSelfIntersections) { + const mask = DrawLayer._svgFactory.createElement("mask"); + defs.append(mask); + maskId = `mask_p${this.pageIndex}_${id}`; + mask.setAttribute("id", maskId); + mask.setAttribute("maskUnits", "objectBoundingBox"); + const rect = DrawLayer._svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("fill", "white"); + const use = DrawLayer._svgFactory.createElement("use"); + mask.append(use); + use.setAttribute("href", `#${pathId}`); + use.setAttribute("stroke", "none"); + use.setAttribute("fill", "black"); + use.setAttribute("fill-rule", "nonzero"); + use.classList.add("mask"); + } + const use1 = DrawLayer._svgFactory.createElement("use"); + root.append(use1); + use1.setAttribute("href", `#${pathId}`); + if (maskId) { + use1.setAttribute("mask", `url(#${maskId})`); + } + const use2 = use1.cloneNode(); + root.append(use2); + use1.classList.add("mainOutline"); + use2.classList.add("secondaryOutline"); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return id; + } + finalizeDraw(id, properties) { + this.#toUpdate.delete(id); + this.updateProperties(id, properties); + } + updateProperties(elementOrId, properties) { + if (!properties) { + return; + } + const { + root, + bbox, + rootClass, + path + } = properties; + const element = typeof elementOrId === "number" ? this.#mapping.get(elementOrId) : elementOrId; + if (!element) { + return; + } + if (root) { + this.#updateProperties(element, root); + } + if (bbox) { + DrawLayer.#setBox(element, bbox); + } + if (rootClass) { + const { + classList + } = element; + for (const [className, value] of Object.entries(rootClass)) { + classList.toggle(className, value); + } + } + if (path) { + const defs = element.firstChild; + const pathElement = defs.firstChild; + this.#updateProperties(pathElement, path); + } + } + updateParent(id, layer) { + if (layer === this) { + return; + } + const root = this.#mapping.get(id); + if (!root) { + return; + } + layer.#parent.append(root); + this.#mapping.delete(id); + layer.#mapping.set(id, root); + } + remove(id) { + this.#toUpdate.delete(id); + if (this.#parent === null) { + return; + } + this.#mapping.get(id).remove(); + this.#mapping.delete(id); + } + destroy() { + this.#parent = null; + for (const root of this.#mapping.values()) { + root.remove(); + } + this.#mapping.clear(); + this.#toUpdate.clear(); + } +} + +;// ./src/pdf.js + + + + + + + + + + + + + +const pdfjsVersion = "4.9.155"; +const pdfjsBuild = "a4eb8407c"; +{ + globalThis.pdfjsTestingUtils = { + HighlightOutliner: HighlightOutliner + }; +} + +var __webpack_exports__AbortException = __webpack_exports__.AbortException; +var __webpack_exports__AnnotationEditorLayer = __webpack_exports__.AnnotationEditorLayer; +var __webpack_exports__AnnotationEditorParamsType = __webpack_exports__.AnnotationEditorParamsType; +var __webpack_exports__AnnotationEditorType = __webpack_exports__.AnnotationEditorType; +var __webpack_exports__AnnotationEditorUIManager = __webpack_exports__.AnnotationEditorUIManager; +var __webpack_exports__AnnotationLayer = __webpack_exports__.AnnotationLayer; +var __webpack_exports__AnnotationMode = __webpack_exports__.AnnotationMode; +var __webpack_exports__ColorPicker = __webpack_exports__.ColorPicker; +var __webpack_exports__DOMSVGFactory = __webpack_exports__.DOMSVGFactory; +var __webpack_exports__DrawLayer = __webpack_exports__.DrawLayer; +var __webpack_exports__FeatureTest = __webpack_exports__.FeatureTest; +var __webpack_exports__GlobalWorkerOptions = __webpack_exports__.GlobalWorkerOptions; +var __webpack_exports__ImageKind = __webpack_exports__.ImageKind; +var __webpack_exports__InvalidPDFException = __webpack_exports__.InvalidPDFException; +var __webpack_exports__MissingPDFException = __webpack_exports__.MissingPDFException; +var __webpack_exports__OPS = __webpack_exports__.OPS; +var __webpack_exports__OutputScale = __webpack_exports__.OutputScale; +var __webpack_exports__PDFDataRangeTransport = __webpack_exports__.PDFDataRangeTransport; +var __webpack_exports__PDFDateString = __webpack_exports__.PDFDateString; +var __webpack_exports__PDFWorker = __webpack_exports__.PDFWorker; +var __webpack_exports__PasswordResponses = __webpack_exports__.PasswordResponses; +var __webpack_exports__PermissionFlag = __webpack_exports__.PermissionFlag; +var __webpack_exports__PixelsPerInch = __webpack_exports__.PixelsPerInch; +var __webpack_exports__RenderingCancelledException = __webpack_exports__.RenderingCancelledException; +var __webpack_exports__TextLayer = __webpack_exports__.TextLayer; +var __webpack_exports__UnexpectedResponseException = __webpack_exports__.UnexpectedResponseException; +var __webpack_exports__Util = __webpack_exports__.Util; +var __webpack_exports__VerbosityLevel = __webpack_exports__.VerbosityLevel; +var __webpack_exports__XfaLayer = __webpack_exports__.XfaLayer; +var __webpack_exports__build = __webpack_exports__.build; +var __webpack_exports__createValidAbsoluteUrl = __webpack_exports__.createValidAbsoluteUrl; +var __webpack_exports__fetchData = __webpack_exports__.fetchData; +var __webpack_exports__getDocument = __webpack_exports__.getDocument; +var __webpack_exports__getFilenameFromUrl = __webpack_exports__.getFilenameFromUrl; +var __webpack_exports__getPdfFilenameFromUrl = __webpack_exports__.getPdfFilenameFromUrl; +var __webpack_exports__getXfaPageViewport = __webpack_exports__.getXfaPageViewport; +var __webpack_exports__isDataScheme = __webpack_exports__.isDataScheme; +var __webpack_exports__isPdfFile = __webpack_exports__.isPdfFile; +var __webpack_exports__noContextMenu = __webpack_exports__.noContextMenu; +var __webpack_exports__normalizeUnicode = __webpack_exports__.normalizeUnicode; +var __webpack_exports__setLayerDimensions = __webpack_exports__.setLayerDimensions; +var __webpack_exports__shadow = __webpack_exports__.shadow; +var __webpack_exports__stopEvent = __webpack_exports__.stopEvent; +var __webpack_exports__version = __webpack_exports__.version; +export { __webpack_exports__AbortException as AbortException, __webpack_exports__AnnotationEditorLayer as AnnotationEditorLayer, __webpack_exports__AnnotationEditorParamsType as AnnotationEditorParamsType, __webpack_exports__AnnotationEditorType as AnnotationEditorType, __webpack_exports__AnnotationEditorUIManager as AnnotationEditorUIManager, __webpack_exports__AnnotationLayer as AnnotationLayer, __webpack_exports__AnnotationMode as AnnotationMode, __webpack_exports__ColorPicker as ColorPicker, __webpack_exports__DOMSVGFactory as DOMSVGFactory, __webpack_exports__DrawLayer as DrawLayer, __webpack_exports__FeatureTest as FeatureTest, __webpack_exports__GlobalWorkerOptions as GlobalWorkerOptions, __webpack_exports__ImageKind as ImageKind, __webpack_exports__InvalidPDFException as InvalidPDFException, __webpack_exports__MissingPDFException as MissingPDFException, __webpack_exports__OPS as OPS, __webpack_exports__OutputScale as OutputScale, __webpack_exports__PDFDataRangeTransport as PDFDataRangeTransport, __webpack_exports__PDFDateString as PDFDateString, __webpack_exports__PDFWorker as PDFWorker, __webpack_exports__PasswordResponses as PasswordResponses, __webpack_exports__PermissionFlag as PermissionFlag, __webpack_exports__PixelsPerInch as PixelsPerInch, __webpack_exports__RenderingCancelledException as RenderingCancelledException, __webpack_exports__TextLayer as TextLayer, __webpack_exports__UnexpectedResponseException as UnexpectedResponseException, __webpack_exports__Util as Util, __webpack_exports__VerbosityLevel as VerbosityLevel, __webpack_exports__XfaLayer as XfaLayer, __webpack_exports__build as build, __webpack_exports__createValidAbsoluteUrl as createValidAbsoluteUrl, __webpack_exports__fetchData as fetchData, __webpack_exports__getDocument as getDocument, __webpack_exports__getFilenameFromUrl as getFilenameFromUrl, __webpack_exports__getPdfFilenameFromUrl as getPdfFilenameFromUrl, __webpack_exports__getXfaPageViewport as getXfaPageViewport, __webpack_exports__isDataScheme as isDataScheme, __webpack_exports__isPdfFile as isPdfFile, __webpack_exports__noContextMenu as noContextMenu, __webpack_exports__normalizeUnicode as normalizeUnicode, __webpack_exports__setLayerDimensions as setLayerDimensions, __webpack_exports__shadow as shadow, __webpack_exports__stopEvent as stopEvent, __webpack_exports__version as version }; + +//# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff --git a/pdf.worker.mjs b/pdf.worker.mjs new file mode 100644 index 0000000..dc596cc --- /dev/null +++ b/pdf.worker.mjs @@ -0,0 +1,56901 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = globalThis.pdfjsWorker = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + WorkerMessageHandler: () => (/* reexport */ WorkerMessageHandler) +}); + +;// ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_DEFAULT_COLOR: 32, + HIGHLIGHT_THICKNESS: 33, + HIGHLIGHT_FREE: 34, + HIGHLIGHT_SHOW_ALL: 35, + DRAW_STEP: 41 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +const ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch {} + return null; +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); + } +} +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function objectFromMap(map) { + const obj = Object.create(null); + for (const [key, value] of map) { + obj[key] = value; + } + return obj; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } +} +class FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get platform() { + if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { + return shadow(this, "platform", { + isMac: navigator.platform.includes("Mac"), + isWindows: navigator.platform.includes("Win"), + isFirefox: typeof navigator?.userAgent === "string" && navigator.userAgent.includes("Firefox") + }); + } + return shadow(this, "platform", { + isMac: false, + isWindows: false, + isFirefox: false + }); + } + static get isCSSRoundSupported() { + return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + } +} +const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; + } + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = this.applyTransform(r, m); + const p2 = this.applyTransform(r.slice(2, 4), m); + const p3 = this.applyTransform([r[0], r[3]], m); + const p4 = this.applyTransform([r[2], r[1]], m); + return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + const c = m[2] * transpose[0] + m[3] * transpose[2]; + const d = m[2] * transpose[1] + m[3] * transpose[3]; + const first = (a + d) / 2; + const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + if (minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + } else { + minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; + } + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + return minMax; + } +} +const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (!decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate(date = new Date()) { + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +const FontRenderOps = { + BEZIER_CURVE_TO: 0, + MOVE_TO: 1, + LINE_TO: 2, + QUADRATIC_CURVE_TO: 3, + RESTORE: 4, + SAVE: 5, + SCALE: 6, + TRANSFORM: 7, + TRANSLATE: 8 +}; +function toHexUtil(arr) { + if (Uint8Array.prototype.toHex) { + return arr.toHex(); + } + return Array.from(arr, num => hexNumbers[num]).join(""); +} +function toBase64Util(arr) { + if (Uint8Array.prototype.toBase64) { + return arr.toBase64(); + } + return btoa(bytesToString(arr)); +} +function fromBase64Util(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str); + } + return stringToBytes(atob(str)); +} +if (typeof Promise.try !== "function") { + Promise.try = function (fn, ...args) { + return new Promise(resolve => { + resolve(fn(...args)); + }); + }; +} + +;// ./src/core/primitives.js + +const CIRCULAR_REF = Symbol("CIRCULAR_REF"); +const EOF = Symbol("EOF"); +let CmdCache = Object.create(null); +let NameCache = Object.create(null); +let RefCache = Object.create(null); +function clearPrimitiveCaches() { + CmdCache = Object.create(null); + NameCache = Object.create(null); + RefCache = Object.create(null); +} +class Name { + constructor(name) { + this.name = name; + } + static get(name) { + return NameCache[name] ||= new Name(name); + } +} +class Cmd { + constructor(cmd) { + this.cmd = cmd; + } + static get(cmd) { + return CmdCache[cmd] ||= new Cmd(cmd); + } +} +const nonSerializable = function nonSerializableClosure() { + return nonSerializable; +}; +class Dict { + constructor(xref = null) { + this._map = new Map(); + this.xref = xref; + this.objId = null; + this.suppressEncryption = false; + this.__nonSerializable__ = nonSerializable; + } + assignXref(newXref) { + this.xref = newXref; + } + get size() { + return this._map.size; + } + get(key1, key2, key3) { + let value = this._map.get(key1); + if (value === undefined && key2 !== undefined) { + value = this._map.get(key2); + if (value === undefined && key3 !== undefined) { + value = this._map.get(key3); + } + } + if (value instanceof Ref && this.xref) { + return this.xref.fetch(value, this.suppressEncryption); + } + return value; + } + async getAsync(key1, key2, key3) { + let value = this._map.get(key1); + if (value === undefined && key2 !== undefined) { + value = this._map.get(key2); + if (value === undefined && key3 !== undefined) { + value = this._map.get(key3); + } + } + if (value instanceof Ref && this.xref) { + return this.xref.fetchAsync(value, this.suppressEncryption); + } + return value; + } + getArray(key1, key2, key3) { + let value = this._map.get(key1); + if (value === undefined && key2 !== undefined) { + value = this._map.get(key2); + if (value === undefined && key3 !== undefined) { + value = this._map.get(key3); + } + } + if (value instanceof Ref && this.xref) { + value = this.xref.fetch(value, this.suppressEncryption); + } + if (Array.isArray(value)) { + value = value.slice(); + for (let i = 0, ii = value.length; i < ii; i++) { + if (value[i] instanceof Ref && this.xref) { + value[i] = this.xref.fetch(value[i], this.suppressEncryption); + } + } + } + return value; + } + getRaw(key) { + return this._map.get(key); + } + getKeys() { + return [...this._map.keys()]; + } + getRawValues() { + return [...this._map.values()]; + } + set(key, value) { + this._map.set(key, value); + } + has(key) { + return this._map.has(key); + } + *[Symbol.iterator]() { + for (const [key, value] of this._map) { + yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value]; + } + } + static get empty() { + const emptyDict = new Dict(null); + emptyDict.set = (key, value) => { + unreachable("Should not call `set` on the empty dictionary."); + }; + return shadow(this, "empty", emptyDict); + } + static merge({ + xref, + dictArray, + mergeSubDicts = false + }) { + const mergedDict = new Dict(xref), + properties = new Map(); + for (const dict of dictArray) { + if (!(dict instanceof Dict)) { + continue; + } + for (const [key, value] of dict._map) { + let property = properties.get(key); + if (property === undefined) { + property = []; + properties.set(key, property); + } else if (!mergeSubDicts || !(value instanceof Dict)) { + continue; + } + property.push(value); + } + } + for (const [name, values] of properties) { + if (values.length === 1 || !(values[0] instanceof Dict)) { + mergedDict._map.set(name, values[0]); + continue; + } + const subDict = new Dict(xref); + for (const dict of values) { + for (const [key, value] of dict._map) { + if (!subDict._map.has(key)) { + subDict._map.set(key, value); + } + } + } + if (subDict.size > 0) { + mergedDict._map.set(name, subDict); + } + } + properties.clear(); + return mergedDict.size > 0 ? mergedDict : Dict.empty; + } + clone() { + const dict = new Dict(this.xref); + for (const key of this.getKeys()) { + dict.set(key, this.getRaw(key)); + } + return dict; + } + delete(key) { + delete this._map[key]; + } +} +class Ref { + constructor(num, gen) { + this.num = num; + this.gen = gen; + } + toString() { + if (this.gen === 0) { + return `${this.num}R`; + } + return `${this.num}R${this.gen}`; + } + static fromString(str) { + const ref = RefCache[str]; + if (ref) { + return ref; + } + const m = /^(\d+)R(\d*)$/.exec(str); + if (!m || m[1] === "0") { + return null; + } + return RefCache[str] = new Ref(parseInt(m[1]), !m[2] ? 0 : parseInt(m[2])); + } + static get(num, gen) { + const key = gen === 0 ? `${num}R` : `${num}R${gen}`; + return RefCache[key] ||= new Ref(num, gen); + } +} +class RefSet { + constructor(parent = null) { + this._set = new Set(parent?._set); + } + has(ref) { + return this._set.has(ref.toString()); + } + put(ref) { + this._set.add(ref.toString()); + } + remove(ref) { + this._set.delete(ref.toString()); + } + [Symbol.iterator]() { + return this._set.values(); + } + clear() { + this._set.clear(); + } +} +class RefSetCache { + constructor() { + this._map = new Map(); + } + get size() { + return this._map.size; + } + get(ref) { + return this._map.get(ref.toString()); + } + has(ref) { + return this._map.has(ref.toString()); + } + put(ref, obj) { + this._map.set(ref.toString(), obj); + } + putAlias(ref, aliasRef) { + this._map.set(ref.toString(), this.get(aliasRef)); + } + [Symbol.iterator]() { + return this._map.values(); + } + clear() { + this._map.clear(); + } + *values() { + yield* this._map.values(); + } + *items() { + for (const [ref, value] of this._map) { + yield [Ref.fromString(ref), value]; + } + } +} +function isName(v, name) { + return v instanceof Name && (name === undefined || v.name === name); +} +function isCmd(v, cmd) { + return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); +} +function isDict(v, type) { + return v instanceof Dict && (type === undefined || isName(v.get("Type"), type)); +} +function isRefsEqual(v1, v2) { + return v1.num === v2.num && v1.gen === v2.gen; +} + +;// ./src/core/base_stream.js + +class BaseStream { + get length() { + unreachable("Abstract getter `length` accessed"); + } + get isEmpty() { + unreachable("Abstract getter `isEmpty` accessed"); + } + get isDataLoaded() { + return shadow(this, "isDataLoaded", true); + } + getByte() { + unreachable("Abstract method `getByte` called"); + } + getBytes(length) { + unreachable("Abstract method `getBytes` called"); + } + async getImageData(length, decoderOptions) { + return this.getBytes(length, decoderOptions); + } + async asyncGetBytes() { + unreachable("Abstract method `asyncGetBytes` called"); + } + get isAsync() { + return false; + } + get canAsyncDecodeImageFromBuffer() { + return false; + } + async getTransferableImage() { + return null; + } + peekByte() { + const peekedByte = this.getByte(); + if (peekedByte !== -1) { + this.pos--; + } + return peekedByte; + } + peekBytes(length) { + const bytes = this.getBytes(length); + this.pos -= bytes.length; + return bytes; + } + getUint16() { + const b0 = this.getByte(); + const b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + } + getInt32() { + const b0 = this.getByte(); + const b1 = this.getByte(); + const b2 = this.getByte(); + const b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + } + getByteRange(begin, end) { + unreachable("Abstract method `getByteRange` called"); + } + getString(length) { + return bytesToString(this.getBytes(length)); + } + skip(n) { + this.pos += n || 1; + } + reset() { + unreachable("Abstract method `reset` called"); + } + moveStart() { + unreachable("Abstract method `moveStart` called"); + } + makeSubStream(start, length, dict = null) { + unreachable("Abstract method `makeSubStream` called"); + } + getBaseStreams() { + return null; + } +} + +;// ./src/core/core_utils.js + + + +const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; +const MAX_INT_32 = 2 ** 31 - 1; +const MIN_INT_32 = -(2 ** 31); +function getLookupTableFactory(initializer) { + let lookup; + return function () { + if (initializer) { + lookup = Object.create(null); + initializer(lookup); + initializer = null; + } + return lookup; + }; +} +class MissingDataException extends BaseException { + constructor(begin, end) { + super(`Missing data [${begin}, ${end})`, "MissingDataException"); + this.begin = begin; + this.end = end; + } +} +class ParserEOFException extends BaseException { + constructor(msg) { + super(msg, "ParserEOFException"); + } +} +class XRefEntryException extends BaseException { + constructor(msg) { + super(msg, "XRefEntryException"); + } +} +class XRefParseException extends BaseException { + constructor(msg) { + super(msg, "XRefParseException"); + } +} +function arrayBuffersToBytes(arr) { + const length = arr.length; + if (length === 0) { + return new Uint8Array(0); + } + if (length === 1) { + return new Uint8Array(arr[0]); + } + let dataLength = 0; + for (let i = 0; i < length; i++) { + dataLength += arr[i].byteLength; + } + const data = new Uint8Array(dataLength); + let pos = 0; + for (let i = 0; i < length; i++) { + const item = new Uint8Array(arr[i]); + data.set(item, pos); + pos += item.byteLength; + } + return data; +} +function getInheritableProperty({ + dict, + key, + getArray = false, + stopWhenFound = true +}) { + let values; + const visited = new RefSet(); + while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) { + if (dict.objId) { + visited.put(dict.objId); + } + const value = getArray ? dict.getArray(key) : dict.get(key); + if (value !== undefined) { + if (stopWhenFound) { + return value; + } + (values ||= []).push(value); + } + dict = dict.get("Parent"); + } + return values; +} +function getParentToUpdate(dict, ref, xref) { + const visited = new RefSet(); + const firstDict = dict; + const result = { + dict: null, + ref: null + }; + while (dict instanceof Dict && !visited.has(ref)) { + visited.put(ref); + if (dict.has("T")) { + break; + } + ref = dict.getRaw("Parent"); + if (!(ref instanceof Ref)) { + return result; + } + dict = xref.fetch(ref); + } + if (dict instanceof Dict && dict !== firstDict) { + result.dict = dict; + result.ref = ref; + } + return result; +} +const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; +function toRomanNumerals(number, lowerCase = false) { + assert(Number.isInteger(number) && number > 0, "The number should be a positive integer."); + const roman = "M".repeat(number / 1000 | 0) + ROMAN_NUMBER_MAP[number % 1000 / 100 | 0] + ROMAN_NUMBER_MAP[10 + (number % 100 / 10 | 0)] + ROMAN_NUMBER_MAP[20 + number % 10]; + return lowerCase ? roman.toLowerCase() : roman; +} +function log2(x) { + return x > 0 ? Math.ceil(Math.log2(x)) : 0; +} +function readInt8(data, offset) { + return data[offset] << 24 >> 24; +} +function readUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; +} +function readUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; +} +function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; +} +function isBooleanArray(arr, len) { + return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean"); +} +function isNumberArray(arr, len) { + if (Array.isArray(arr)) { + return (len === null || arr.length === len) && arr.every(x => typeof x === "number"); + } + return ArrayBuffer.isView(arr) && (arr.length === 0 || typeof arr[0] === "number") && (len === null || arr.length === len); +} +function lookupMatrix(arr, fallback) { + return isNumberArray(arr, 6) ? arr : fallback; +} +function lookupRect(arr, fallback) { + return isNumberArray(arr, 4) ? arr : fallback; +} +function lookupNormalRect(arr, fallback) { + return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback; +} +function parseXFAPath(path) { + const positionPattern = /(.+)\[(\d+)\]$/; + return path.split(".").map(component => { + const m = component.match(positionPattern); + if (m) { + return { + name: m[1], + pos: parseInt(m[2], 10) + }; + } + return { + name: component, + pos: 0 + }; + }); +} +function escapePDFName(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`#${char.toString(16)}`); + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); +} +function escapeString(str) { + return str.replaceAll(/([()\\\n\r])/g, match => { + if (match === "\n") { + return "\\n"; + } else if (match === "\r") { + return "\\r"; + } + return `\\${match}`; + }); +} +function _collectJS(entry, xref, list, parents) { + if (!entry) { + return; + } + let parent = null; + if (entry instanceof Ref) { + if (parents.has(entry)) { + return; + } + parent = entry; + parents.put(parent); + entry = xref.fetch(entry); + } + if (Array.isArray(entry)) { + for (const element of entry) { + _collectJS(element, xref, list, parents); + } + } else if (entry instanceof Dict) { + if (isName(entry.get("S"), "JavaScript")) { + const js = entry.get("JS"); + let code; + if (js instanceof BaseStream) { + code = js.getString(); + } else if (typeof js === "string") { + code = js; + } + code &&= stringToPDFString(code).replaceAll("\x00", ""); + if (code) { + list.push(code); + } + } + _collectJS(entry.getRaw("Next"), xref, list, parents); + } + if (parent) { + parents.remove(parent); + } +} +function collectActions(xref, dict, eventType) { + const actions = Object.create(null); + const additionalActionsDicts = getInheritableProperty({ + dict, + key: "AA", + stopWhenFound: false + }); + if (additionalActionsDicts) { + for (let i = additionalActionsDicts.length - 1; i >= 0; i--) { + const additionalActions = additionalActionsDicts[i]; + if (!(additionalActions instanceof Dict)) { + continue; + } + for (const key of additionalActions.getKeys()) { + const action = eventType[key]; + if (!action) { + continue; + } + const actionDict = additionalActions.getRaw(key); + const parents = new RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions[action] = list; + } + } + } + } + if (dict.has("A")) { + const actionDict = dict.get("A"); + const parents = new RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions.Action = list; + } + } + return objectSize(actions) > 0 ? actions : null; +} +const XMLEntities = { + 0x3c: "<", + 0x3e: ">", + 0x26: "&", + 0x22: """, + 0x27: "'" +}; +function* codePointIter(str) { + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { + i++; + } + yield char; + } +} +function encodeToXmlString(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + if (0x20 <= char && char <= 0x7e) { + const entity = XMLEntities[char]; + if (entity) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(entity); + start = i + 1; + } + } else { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`&#x${char.toString(16).toUpperCase()};`); + if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { + i++; + } + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); +} +function validateFontName(fontFamily, mustWarn = false) { + const m = /^("|').*("|')$/.exec(fontFamily); + if (m && m[1] === m[2]) { + const re = new RegExp(`[^\\\\]${m[1]}`); + if (re.test(fontFamily.slice(1, -1))) { + if (mustWarn) { + warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`); + } + return false; + } + } else { + for (const ident of fontFamily.split(/[ \t]+/)) { + if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { + if (mustWarn) { + warn(`FontFamily contains invalid : ${fontFamily}.`); + } + return false; + } + } + } + return true; +} +function validateCSSFont(cssFontInfo) { + const DEFAULT_CSS_FONT_OBLIQUE = "14"; + const DEFAULT_CSS_FONT_WEIGHT = "400"; + const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "normal", "bold", "bolder", "lighter"]); + const { + fontFamily, + fontWeight, + italicAngle + } = cssFontInfo; + if (!validateFontName(fontFamily, true)) { + return false; + } + const weight = fontWeight ? fontWeight.toString() : ""; + cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT; + const angle = parseFloat(italicAngle); + cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : italicAngle.toString(); + return true; +} +function recoverJsURL(str) { + const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; + const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); + const jsUrl = regex.exec(str); + if (jsUrl?.[2]) { + return { + url: jsUrl[2], + newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true" + }; + } + return null; +} +function numberToString(value) { + if (Number.isInteger(value)) { + return value.toString(); + } + const roundedValue = Math.round(value * 100); + if (roundedValue % 100 === 0) { + return (roundedValue / 100).toString(); + } + if (roundedValue % 10 === 0) { + return value.toFixed(1); + } + return value.toFixed(2); +} +function getNewAnnotationsMap(annotationStorage) { + if (!annotationStorage) { + return null; + } + const newAnnotationsByPage = new Map(); + for (const [key, value] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; + } + let annotations = newAnnotationsByPage.get(value.pageIndex); + if (!annotations) { + annotations = []; + newAnnotationsByPage.set(value.pageIndex, annotations); + } + annotations.push(value); + } + return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; +} +function stringToAsciiOrUTF16BE(str) { + return isAscii(str) ? str : stringToUTF16String(str, true); +} +function isAscii(str) { + return /^[\x00-\x7F]*$/.test(str); +} +function stringToUTF16HexString(str) { + const buf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(hexNumbers[char >> 8 & 0xff], hexNumbers[char & 0xff]); + } + return buf.join(""); +} +function stringToUTF16String(str, bigEndian = false) { + const buf = []; + if (bigEndian) { + buf.push("\xFE\xFF"); + } + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff)); + } + return buf.join(""); +} +function getRotationMatrix(rotation, width, height) { + switch (rotation) { + case 90: + return [0, 1, -1, 0, width, 0]; + case 180: + return [-1, 0, 0, -1, width, height]; + case 270: + return [0, -1, 1, 0, 0, height]; + default: + throw new Error("Invalid rotation"); + } +} +function getSizeInBytes(x) { + return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8); +} + +;// ./src/core/stream.js + + +class Stream extends BaseStream { + constructor(arrayBuffer, start, length, dict) { + super(); + this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); + this.start = start || 0; + this.pos = this.start; + this.end = start + length || this.bytes.length; + this.dict = dict; + } + get length() { + return this.end - this.start; + } + get isEmpty() { + return this.length === 0; + } + getByte() { + if (this.pos >= this.end) { + return -1; + } + return this.bytes[this.pos++]; + } + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + return bytes.subarray(pos, strEnd); + } + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + this.pos = end; + return bytes.subarray(pos, end); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + return this.bytes.subarray(begin, end); + } + reset() { + this.pos = this.start; + } + moveStart() { + this.start = this.pos; + } + makeSubStream(start, length, dict = null) { + return new Stream(this.bytes.buffer, start, length, dict); + } +} +class StringStream extends Stream { + constructor(str) { + super(stringToBytes(str)); + } +} +class NullStream extends Stream { + constructor() { + super(new Uint8Array(0)); + } +} + +;// ./src/core/chunked_stream.js + + + +class ChunkedStream extends Stream { + constructor(length, chunkSize, manager) { + super(new Uint8Array(length), 0, length, null); + this.chunkSize = chunkSize; + this._loadedChunks = new Set(); + this.numChunks = Math.ceil(length / chunkSize); + this.manager = manager; + this.progressiveDataLength = 0; + this.lastSuccessfulEnsureByteChunk = -1; + } + getMissingChunks() { + const chunks = []; + for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + chunks.push(chunk); + } + } + return chunks; + } + get numChunksLoaded() { + return this._loadedChunks.size; + } + get isDataLoaded() { + return this.numChunksLoaded === this.numChunks; + } + onReceiveData(begin, chunk) { + const chunkSize = this.chunkSize; + if (begin % chunkSize !== 0) { + throw new Error(`Bad begin offset: ${begin}`); + } + const end = begin + chunk.byteLength; + if (end % chunkSize !== 0 && end !== this.bytes.length) { + throw new Error(`Bad end offset: ${end}`); + } + this.bytes.set(new Uint8Array(chunk), begin); + const beginChunk = Math.floor(begin / chunkSize); + const endChunk = Math.floor((end - 1) / chunkSize) + 1; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + onReceiveProgressiveData(data) { + let position = this.progressiveDataLength; + const beginChunk = Math.floor(position / this.chunkSize); + this.bytes.set(new Uint8Array(data), position); + position += data.byteLength; + this.progressiveDataLength = position; + const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + ensureByte(pos) { + if (pos < this.progressiveDataLength) { + return; + } + const chunk = Math.floor(pos / this.chunkSize); + if (chunk > this.numChunks) { + return; + } + if (chunk === this.lastSuccessfulEnsureByteChunk) { + return; + } + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(pos, pos + 1); + } + this.lastSuccessfulEnsureByteChunk = chunk; + } + ensureRange(begin, end) { + if (begin >= end) { + return; + } + if (end <= this.progressiveDataLength) { + return; + } + const beginChunk = Math.floor(begin / this.chunkSize); + if (beginChunk > this.numChunks) { + return; + } + const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(begin, end); + } + } + } + nextEmptyChunk(beginChunk) { + const numChunks = this.numChunks; + for (let i = 0; i < numChunks; ++i) { + const chunk = (beginChunk + i) % numChunks; + if (!this._loadedChunks.has(chunk)) { + return chunk; + } + } + return null; + } + hasChunk(chunk) { + return this._loadedChunks.has(chunk); + } + getByte() { + const pos = this.pos; + if (pos >= this.end) { + return -1; + } + if (pos >= this.progressiveDataLength) { + this.ensureByte(pos); + } + return this.bytes[this.pos++]; + } + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + if (strEnd > this.progressiveDataLength) { + this.ensureRange(pos, strEnd); + } + return bytes.subarray(pos, strEnd); + } + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + if (end > this.progressiveDataLength) { + this.ensureRange(pos, end); + } + this.pos = end; + return bytes.subarray(pos, end); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + if (end > this.progressiveDataLength) { + this.ensureRange(begin, end); + } + return this.bytes.subarray(begin, end); + } + makeSubStream(start, length, dict = null) { + if (length) { + if (start + length > this.progressiveDataLength) { + this.ensureRange(start, start + length); + } + } else if (start >= this.progressiveDataLength) { + this.ensureByte(start); + } + function ChunkedStreamSubstream() {} + ChunkedStreamSubstream.prototype = Object.create(this); + ChunkedStreamSubstream.prototype.getMissingChunks = function () { + const chunkSize = this.chunkSize; + const beginChunk = Math.floor(this.start / chunkSize); + const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; + const missingChunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + missingChunks.push(chunk); + } + } + return missingChunks; + }; + Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { + get() { + if (this.numChunksLoaded === this.numChunks) { + return true; + } + return this.getMissingChunks().length === 0; + }, + configurable: true + }); + const subStream = new ChunkedStreamSubstream(); + subStream.pos = subStream.start = start; + subStream.end = start + length || this.end; + subStream.dict = dict; + return subStream; + } + getBaseStreams() { + return [this]; + } +} +class ChunkedStreamManager { + constructor(pdfNetworkStream, args) { + this.length = args.length; + this.chunkSize = args.rangeChunkSize; + this.stream = new ChunkedStream(this.length, this.chunkSize, this); + this.pdfNetworkStream = pdfNetworkStream; + this.disableAutoFetch = args.disableAutoFetch; + this.msgHandler = args.msgHandler; + this.currRequestId = 0; + this._chunksNeededByRequest = new Map(); + this._requestsByChunk = new Map(); + this._promisesByRequest = new Map(); + this.progressiveDataLength = 0; + this.aborted = false; + this._loadedStreamCapability = Promise.withResolvers(); + } + sendRequest(begin, end) { + const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); + if (!rangeReader.isStreamingSupported) { + rangeReader.onProgress = this.onProgress.bind(this); + } + let chunks = [], + loaded = 0; + return new Promise((resolve, reject) => { + const readChunk = ({ + value, + done + }) => { + try { + if (done) { + const chunkData = arrayBuffersToBytes(chunks); + chunks = null; + resolve(chunkData); + return; + } + loaded += value.byteLength; + if (rangeReader.isStreamingSupported) { + this.onProgress({ + loaded + }); + } + chunks.push(value); + rangeReader.read().then(readChunk, reject); + } catch (e) { + reject(e); + } + }; + rangeReader.read().then(readChunk, reject); + }).then(data => { + if (this.aborted) { + return; + } + this.onReceiveData({ + chunk: data, + begin + }); + }); + } + requestAllChunks(noFetch = false) { + if (!noFetch) { + const missingChunks = this.stream.getMissingChunks(); + this._requestChunks(missingChunks); + } + return this._loadedStreamCapability.promise; + } + _requestChunks(chunks) { + const requestId = this.currRequestId++; + const chunksNeeded = new Set(); + this._chunksNeededByRequest.set(requestId, chunksNeeded); + for (const chunk of chunks) { + if (!this.stream.hasChunk(chunk)) { + chunksNeeded.add(chunk); + } + } + if (chunksNeeded.size === 0) { + return Promise.resolve(); + } + const capability = Promise.withResolvers(); + this._promisesByRequest.set(requestId, capability); + const chunksToRequest = []; + for (const chunk of chunksNeeded) { + let requestIds = this._requestsByChunk.get(chunk); + if (!requestIds) { + requestIds = []; + this._requestsByChunk.set(chunk, requestIds); + chunksToRequest.push(chunk); + } + requestIds.push(requestId); + } + if (chunksToRequest.length > 0) { + const groupedChunksToRequest = this.groupChunks(chunksToRequest); + for (const groupedChunk of groupedChunksToRequest) { + const begin = groupedChunk.beginChunk * this.chunkSize; + const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); + this.sendRequest(begin, end).catch(capability.reject); + } + } + return capability.promise.catch(reason => { + if (this.aborted) { + return; + } + throw reason; + }); + } + getStream() { + return this.stream; + } + requestRange(begin, end) { + end = Math.min(end, this.length); + const beginChunk = this.getBeginChunk(begin); + const endChunk = this.getEndChunk(end); + const chunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + chunks.push(chunk); + } + return this._requestChunks(chunks); + } + requestRanges(ranges = []) { + const chunksToRequest = []; + for (const range of ranges) { + const beginChunk = this.getBeginChunk(range.begin); + const endChunk = this.getEndChunk(range.end); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!chunksToRequest.includes(chunk)) { + chunksToRequest.push(chunk); + } + } + } + chunksToRequest.sort(function (a, b) { + return a - b; + }); + return this._requestChunks(chunksToRequest); + } + groupChunks(chunks) { + const groupedChunks = []; + let beginChunk = -1; + let prevChunk = -1; + for (let i = 0, ii = chunks.length; i < ii; ++i) { + const chunk = chunks[i]; + if (beginChunk < 0) { + beginChunk = chunk; + } + if (prevChunk >= 0 && prevChunk + 1 !== chunk) { + groupedChunks.push({ + beginChunk, + endChunk: prevChunk + 1 + }); + beginChunk = chunk; + } + if (i + 1 === chunks.length) { + groupedChunks.push({ + beginChunk, + endChunk: chunk + 1 + }); + } + prevChunk = chunk; + } + return groupedChunks; + } + onProgress(args) { + this.msgHandler.send("DocProgress", { + loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, + total: this.length + }); + } + onReceiveData(args) { + const chunk = args.chunk; + const isProgressive = args.begin === undefined; + const begin = isProgressive ? this.progressiveDataLength : args.begin; + const end = begin + chunk.byteLength; + const beginChunk = Math.floor(begin / this.chunkSize); + const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); + if (isProgressive) { + this.stream.onReceiveProgressiveData(chunk); + this.progressiveDataLength = end; + } else { + this.stream.onReceiveData(begin, chunk); + } + if (this.stream.isDataLoaded) { + this._loadedStreamCapability.resolve(this.stream); + } + const loadedRequests = []; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + const requestIds = this._requestsByChunk.get(curChunk); + if (!requestIds) { + continue; + } + this._requestsByChunk.delete(curChunk); + for (const requestId of requestIds) { + const chunksNeeded = this._chunksNeededByRequest.get(requestId); + if (chunksNeeded.has(curChunk)) { + chunksNeeded.delete(curChunk); + } + if (chunksNeeded.size > 0) { + continue; + } + loadedRequests.push(requestId); + } + } + if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { + let nextEmptyChunk; + if (this.stream.numChunksLoaded === 1) { + const lastChunk = this.stream.numChunks - 1; + if (!this.stream.hasChunk(lastChunk)) { + nextEmptyChunk = lastChunk; + } + } else { + nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); + } + if (Number.isInteger(nextEmptyChunk)) { + this._requestChunks([nextEmptyChunk]); + } + } + for (const requestId of loadedRequests) { + const capability = this._promisesByRequest.get(requestId); + this._promisesByRequest.delete(requestId); + capability.resolve(); + } + this.msgHandler.send("DocProgress", { + loaded: this.stream.numChunksLoaded * this.chunkSize, + total: this.length + }); + } + onError(err) { + this._loadedStreamCapability.reject(err); + } + getBeginChunk(begin) { + return Math.floor(begin / this.chunkSize); + } + getEndChunk(end) { + return Math.floor((end - 1) / this.chunkSize) + 1; + } + abort(reason) { + this.aborted = true; + this.pdfNetworkStream?.cancelAllRequests(reason); + for (const capability of this._promisesByRequest.values()) { + capability.reject(reason); + } + } +} + +;// ./src/core/colorspace.js + + + + +function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) { + const COMPONENTS = 3; + alpha01 = alpha01 !== 1 ? 0 : alpha01; + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let newIndex = 0, + oldIndex; + const xScaled = new Uint16Array(w2); + const w1Scanline = w1 * COMPONENTS; + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; + } + for (let i = 0; i < h2; i++) { + const py = Math.floor(i * yRatio) * w1Scanline; + for (let j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + newIndex += alpha01; + } + } +} +function resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) { + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let newIndex = 0; + const xScaled = new Uint16Array(w2); + if (alpha01 === 1) { + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0; i < h2; i++) { + const buf = src32.subarray(Math.floor(i * yRatio) * w1); + for (let j = 0; j < w2; j++) { + dest32[newIndex++] |= buf[xScaled[j]] & rgbMask; + } + } + } else { + const COMPONENTS = 4; + const w1Scanline = w1 * COMPONENTS; + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; + } + for (let i = 0; i < h2; i++) { + const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline); + for (let j = 0; j < w2; j++) { + const oldIndex = xScaled[j]; + dest[newIndex++] = buf[oldIndex]; + dest[newIndex++] = buf[oldIndex + 1]; + dest[newIndex++] = buf[oldIndex + 2]; + } + } + } +} +function copyRgbaImage(src, dest, alpha01) { + if (alpha01 === 1) { + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0, ii = src32.length; i < ii; i++) { + dest32[i] |= src32[i] & rgbMask; + } + } else { + let j = 0; + for (let i = 0, ii = src.length; i < ii; i += 4) { + dest[j++] = src[i]; + dest[j++] = src[i + 1]; + dest[j++] = src[i + 2]; + } + } +} +class ColorSpace { + constructor(name, numComps) { + this.name = name; + this.numComps = numComps; + } + getRgb(src, srcOffset) { + const rgb = new Uint8ClampedArray(3); + this.getRgbItem(src, srcOffset, rgb, 0); + return rgb; + } + getRgbItem(src, srcOffset, dest, destOffset) { + unreachable("Should not call ColorSpace.getRgbItem"); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + unreachable("Should not call ColorSpace.getRgbBuffer"); + } + getOutputLength(inputLength, alpha01) { + unreachable("Should not call ColorSpace.getOutputLength"); + } + isPassthrough(bits) { + return false; + } + isDefaultDecode(decodeMap, bpc) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + } + fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + const count = originalWidth * originalHeight; + let rgbBuf = null; + const numComponentColors = 1 << bpc; + const needsResizing = originalHeight !== height || originalWidth !== width; + if (this.isPassthrough(bpc)) { + rgbBuf = comps; + } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") { + const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); + for (let i = 0; i < numComponentColors; i++) { + allColors[i] = i; + } + const colorMap = new Uint8ClampedArray(numComponentColors * 3); + this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0); + if (!needsResizing) { + let destPos = 0; + for (let i = 0; i < count; ++i) { + const key = comps[i] * 3; + dest[destPos++] = colorMap[key]; + dest[destPos++] = colorMap[key + 1]; + dest[destPos++] = colorMap[key + 2]; + destPos += alpha01; + } + } else { + rgbBuf = new Uint8Array(count * 3); + let rgbPos = 0; + for (let i = 0; i < count; ++i) { + const key = comps[i] * 3; + rgbBuf[rgbPos++] = colorMap[key]; + rgbBuf[rgbPos++] = colorMap[key + 1]; + rgbBuf[rgbPos++] = colorMap[key + 2]; + } + } + } else if (!needsResizing) { + this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01); + } else { + rgbBuf = new Uint8ClampedArray(count * 3); + this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0); + } + if (rgbBuf) { + if (needsResizing) { + resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01); + } else { + let destPos = 0, + rgbPos = 0; + for (let i = 0, ii = width * actualHeight; i < ii; i++) { + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + destPos += alpha01; + } + } + } + } + get usesZeroToOneRange() { + return shadow(this, "usesZeroToOneRange", true); + } + static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) { + if (!localColorSpaceCache) { + throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.'); + } + if (!parsedColorSpace) { + throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.'); + } + let csName, csRef; + if (cacheKey instanceof Ref) { + csRef = cacheKey; + cacheKey = xref.fetch(cacheKey); + } + if (cacheKey instanceof Name) { + csName = cacheKey.name; + } + if (csName || csRef) { + localColorSpaceCache.set(csName, csRef, parsedColorSpace); + } + } + static getCached(cacheKey, xref, localColorSpaceCache) { + if (!localColorSpaceCache) { + throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.'); + } + if (cacheKey instanceof Ref) { + const localColorSpace = localColorSpaceCache.getByRef(cacheKey); + if (localColorSpace) { + return localColorSpace; + } + try { + cacheKey = xref.fetch(cacheKey); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + } + } + if (cacheKey instanceof Name) { + const localColorSpace = localColorSpaceCache.getByName(cacheKey.name); + if (localColorSpace) { + return localColorSpace; + } + } + return null; + } + static async parseAsync({ + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache + }) { + const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; + } + static parse({ + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache + }) { + const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache); + if (cachedColorSpace) { + return cachedColorSpace; + } + const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; + } + static _parse(cs, xref, resources = null, pdfFunctionFactory) { + cs = xref.fetchIfRef(cs); + if (cs instanceof Name) { + switch (cs.name) { + case "G": + case "DeviceGray": + return this.singletons.gray; + case "RGB": + case "DeviceRGB": + return this.singletons.rgb; + case "DeviceRGBA": + return this.singletons.rgba; + case "CMYK": + case "DeviceCMYK": + return this.singletons.cmyk; + case "Pattern": + return new PatternCS(null); + default: + if (resources instanceof Dict) { + const colorSpaces = resources.get("ColorSpace"); + if (colorSpaces instanceof Dict) { + const resourcesCS = colorSpaces.get(cs.name); + if (resourcesCS) { + if (resourcesCS instanceof Name) { + return this._parse(resourcesCS, xref, resources, pdfFunctionFactory); + } + cs = resourcesCS; + break; + } + } + } + warn(`Unrecognized ColorSpace: ${cs.name}`); + return this.singletons.gray; + } + } + if (Array.isArray(cs)) { + const mode = xref.fetchIfRef(cs[0]).name; + let params, numComps, baseCS, whitePoint, blackPoint, gamma; + switch (mode) { + case "G": + case "DeviceGray": + return this.singletons.gray; + case "RGB": + case "DeviceRGB": + return this.singletons.rgb; + case "CMYK": + case "DeviceCMYK": + return this.singletons.cmyk; + case "CalGray": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.get("Gamma"); + return new CalGrayCS(whitePoint, blackPoint, gamma); + case "CalRGB": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.getArray("Gamma"); + const matrix = params.getArray("Matrix"); + return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); + case "ICCBased": + const stream = xref.fetchIfRef(cs[1]); + const dict = stream.dict; + numComps = dict.get("N"); + const alt = dict.get("Alternate"); + if (alt) { + const altCS = this._parse(alt, xref, resources, pdfFunctionFactory); + if (altCS.numComps === numComps) { + return altCS; + } + warn("ICCBased color space: Ignoring incorrect /Alternate entry."); + } + if (numComps === 1) { + return this.singletons.gray; + } else if (numComps === 3) { + return this.singletons.rgb; + } else if (numComps === 4) { + return this.singletons.cmyk; + } + break; + case "Pattern": + baseCS = cs[1] || null; + if (baseCS) { + baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory); + } + return new PatternCS(baseCS); + case "I": + case "Indexed": + baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory); + const hiVal = Math.max(0, Math.min(xref.fetchIfRef(cs[2]), 255)); + const lookup = xref.fetchIfRef(cs[3]); + return new IndexedCS(baseCS, hiVal, lookup); + case "Separation": + case "DeviceN": + const name = xref.fetchIfRef(cs[1]); + numComps = Array.isArray(name) ? name.length : 1; + baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory); + const tintFn = pdfFunctionFactory.create(cs[3]); + return new AlternateCS(numComps, baseCS, tintFn); + case "Lab": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + const range = params.getArray("Range"); + return new LabCS(whitePoint, blackPoint, range); + default: + warn(`Unimplemented ColorSpace object: ${mode}`); + return this.singletons.gray; + } + } + warn(`Unrecognized ColorSpace object: ${cs}`); + return this.singletons.gray; + } + static isDefaultDecode(decode, numComps) { + if (!Array.isArray(decode)) { + return true; + } + if (numComps * 2 !== decode.length) { + warn("The decode map is not the correct length"); + return true; + } + for (let i = 0, ii = decode.length; i < ii; i += 2) { + if (decode[i] !== 0 || decode[i + 1] !== 1) { + return false; + } + } + return true; + } + static get singletons() { + return shadow(this, "singletons", { + get gray() { + return shadow(this, "gray", new DeviceGrayCS()); + }, + get rgb() { + return shadow(this, "rgb", new DeviceRgbCS()); + }, + get rgba() { + return shadow(this, "rgba", new DeviceRgbaCS()); + }, + get cmyk() { + return shadow(this, "cmyk", new DeviceCmykCS()); + } + }); + } +} +class AlternateCS extends ColorSpace { + constructor(numComps, base, tintFn) { + super("Alternate", numComps); + this.base = base; + this.tintFn = tintFn; + this.tmpBuf = new Float32Array(base.numComps); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const tmpBuf = this.tmpBuf; + this.tintFn(src, srcOffset, tmpBuf, 0); + this.base.getRgbItem(tmpBuf, 0, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const tintFn = this.tintFn; + const base = this.base; + const scale = 1 / ((1 << bits) - 1); + const baseNumComps = base.numComps; + const usesZeroToOneRange = base.usesZeroToOneRange; + const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0; + let pos = isPassthrough ? destOffset : 0; + const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count); + const numComps = this.numComps; + const scaled = new Float32Array(numComps); + const tinted = new Float32Array(baseNumComps); + let i, j; + for (i = 0; i < count; i++) { + for (j = 0; j < numComps; j++) { + scaled[j] = src[srcOffset++] * scale; + } + tintFn(scaled, 0, tinted, 0); + if (usesZeroToOneRange) { + for (j = 0; j < baseNumComps; j++) { + baseBuf[pos++] = tinted[j] * 255; + } + } else { + base.getRgbItem(tinted, 0, baseBuf, pos); + pos += baseNumComps; + } + } + if (!isPassthrough) { + base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); + } + } + getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01); + } +} +class PatternCS extends ColorSpace { + constructor(baseCS) { + super("Pattern", null); + this.base = baseCS; + } + isDefaultDecode(decodeMap, bpc) { + unreachable("Should not call PatternCS.isDefaultDecode"); + } +} +class IndexedCS extends ColorSpace { + constructor(base, highVal, lookup) { + super("Indexed", 1); + this.base = base; + const length = base.numComps * (highVal + 1); + this.lookup = new Uint8Array(length); + if (lookup instanceof BaseStream) { + const bytes = lookup.getBytes(length); + this.lookup.set(bytes); + } else if (typeof lookup === "string") { + for (let i = 0; i < length; ++i) { + this.lookup[i] = lookup.charCodeAt(i) & 0xff; + } + } else { + throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`); + } + } + getRgbItem(src, srcOffset, dest, destOffset) { + const numComps = this.base.numComps; + const start = src[srcOffset] * numComps; + this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const base = this.base; + const numComps = base.numComps; + const outputDelta = base.getOutputLength(numComps, alpha01); + const lookup = this.lookup; + for (let i = 0; i < count; ++i) { + const lookupPos = src[srcOffset++] * numComps; + base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); + destOffset += outputDelta; + } + } + getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); + } + isDefaultDecode(decodeMap, bpc) { + if (!Array.isArray(decodeMap)) { + return true; + } + if (decodeMap.length !== 2) { + warn("Decode map length is not correct"); + return true; + } + if (!Number.isInteger(bpc) || bpc < 1) { + warn("Bits per component is not correct"); + return true; + } + return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1; + } +} +class DeviceGrayCS extends ColorSpace { + constructor() { + super("DeviceGray", 1); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const c = src[srcOffset] * 255; + dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 255 / ((1 << bits) - 1); + let j = srcOffset, + q = destOffset; + for (let i = 0; i < count; ++i) { + const c = scale * src[j++]; + dest[q++] = c; + dest[q++] = c; + dest[q++] = c; + q += alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + } +} +class DeviceRgbCS extends ColorSpace { + constructor() { + super("DeviceRGB", 3); + } + getRgbItem(src, srcOffset, dest, destOffset) { + dest[destOffset] = src[srcOffset] * 255; + dest[destOffset + 1] = src[srcOffset + 1] * 255; + dest[destOffset + 2] = src[srcOffset + 2] * 255; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + if (bits === 8 && alpha01 === 0) { + dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); + return; + } + const scale = 255 / ((1 << bits) - 1); + let j = srcOffset, + q = destOffset; + for (let i = 0; i < count; ++i) { + dest[q++] = scale * src[j++]; + dest[q++] = scale * src[j++]; + dest[q++] = scale * src[j++]; + q += alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } + isPassthrough(bits) { + return bits === 8; + } +} +class DeviceRgbaCS extends ColorSpace { + constructor() { + super("DeviceRGBA", 4); + } + getOutputLength(inputLength, _alpha01) { + return inputLength * 4; + } + isPassthrough(bits) { + return bits === 8; + } + fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + if (originalHeight !== height || originalWidth !== width) { + resizeRgbaImage(comps, dest, originalWidth, originalHeight, width, height, alpha01); + } else { + copyRgbaImage(comps, dest, alpha01); + } + } +} +class DeviceCmykCS extends ColorSpace { + constructor() { + super("DeviceCMYK", 4); + } + #toRgb(src, srcOffset, srcScale, dest, destOffset) { + const c = src[srcOffset] * srcScale; + const m = src[srcOffset + 1] * srcScale; + const y = src[srcOffset + 2] * srcScale; + const k = src[srcOffset + 3] * srcScale; + dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747); + dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578); + dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367); + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, 1, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; i++) { + this.#toRgb(src, srcOffset, scale, dest, destOffset); + srcOffset += 4; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength / 4 * (3 + alpha01) | 0; + } +} +class CalGrayCS extends ColorSpace { + constructor(whitePoint, blackPoint, gamma) { + super("CalGray", 1); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space CalGray"); + } + [this.XW, this.YW, this.ZW] = whitePoint; + [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; + this.G = gamma || 1; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + info(`Invalid BlackPoint for ${this.name}, falling back to default.`); + this.XB = this.YB = this.ZB = 0; + } + if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { + warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`); + } + if (this.G < 1) { + info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`); + this.G = 1; + } + } + #toRgb(src, srcOffset, dest, destOffset, scale) { + const A = src[srcOffset] * scale; + const AG = A ** this.G; + const L = this.YW * AG; + const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0); + dest[destOffset] = val; + dest[destOffset + 1] = val; + dest[destOffset + 2] = val; + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + this.#toRgb(src, srcOffset, dest, destOffset, scale); + srcOffset += 1; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + } +} +class CalRGBCS extends ColorSpace { + static #BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]); + static #BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]); + static #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]); + static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); + static #tempNormalizeMatrix = new Float32Array(3); + static #tempConvertMatrix1 = new Float32Array(3); + static #tempConvertMatrix2 = new Float32Array(3); + static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0; + constructor(whitePoint, blackPoint, gamma, matrix) { + super("CalRGB", 3); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space CalRGB"); + } + const [XW, YW, ZW] = this.whitePoint = whitePoint; + const [XB, YB, ZB] = this.blackPoint = blackPoint || new Float32Array(3); + [this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]); + [this.MXA, this.MYA, this.MZA, this.MXB, this.MYB, this.MZB, this.MXC, this.MYC, this.MZC] = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); + if (XW < 0 || ZW < 0 || YW !== 1) { + throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); + } + if (XB < 0 || YB < 0 || ZB < 0) { + info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default."); + this.blackPoint = new Float32Array(3); + } + if (this.GR < 0 || this.GG < 0 || this.GB < 0) { + info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`); + this.GR = this.GG = this.GB = 1; + } + } + #matrixProduct(a, b, result) { + result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; + result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; + } + #toFlat(sourceWhitePoint, LMS, result) { + result[0] = LMS[0] * 1 / sourceWhitePoint[0]; + result[1] = LMS[1] * 1 / sourceWhitePoint[1]; + result[2] = LMS[2] * 1 / sourceWhitePoint[2]; + } + #toD65(sourceWhitePoint, LMS, result) { + const D65X = 0.95047; + const D65Y = 1; + const D65Z = 1.08883; + result[0] = LMS[0] * D65X / sourceWhitePoint[0]; + result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; + result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; + } + #sRGBTransferFunction(color) { + if (color <= 0.0031308) { + return this.#adjustToRange(0, 1, 12.92 * color); + } + if (color >= 0.99554525) { + return 1; + } + return this.#adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055); + } + #adjustToRange(min, max, value) { + return Math.max(min, Math.min(max, value)); + } + #decodeL(L) { + if (L < 0) { + return -this.#decodeL(-L); + } + if (L > 8.0) { + return ((L + 16) / 116) ** 3; + } + return L * CalRGBCS.#DECODE_L_CONSTANT; + } + #compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { + if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) { + result[0] = XYZ_Flat[0]; + result[1] = XYZ_Flat[1]; + result[2] = XYZ_Flat[2]; + return; + } + const zeroDecodeL = this.#decodeL(0); + const X_DST = zeroDecodeL; + const X_SRC = this.#decodeL(sourceBlackPoint[0]); + const Y_DST = zeroDecodeL; + const Y_SRC = this.#decodeL(sourceBlackPoint[1]); + const Z_DST = zeroDecodeL; + const Z_SRC = this.#decodeL(sourceBlackPoint[2]); + const X_Scale = (1 - X_DST) / (1 - X_SRC); + const X_Offset = 1 - X_Scale; + const Y_Scale = (1 - Y_DST) / (1 - Y_SRC); + const Y_Offset = 1 - Y_Scale; + const Z_Scale = (1 - Z_DST) / (1 - Z_SRC); + const Z_Offset = 1 - Z_Scale; + result[0] = XYZ_Flat[0] * X_Scale + X_Offset; + result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; + result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; + } + #normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { + if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { + result[0] = XYZ_In[0]; + result[1] = XYZ_In[1]; + result[2] = XYZ_In[2]; + return; + } + const LMS = result; + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_Flat = CalRGBCS.#tempNormalizeMatrix; + this.#toFlat(sourceWhitePoint, LMS, LMS_Flat); + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); + } + #normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { + const LMS = result; + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_D65 = CalRGBCS.#tempNormalizeMatrix; + this.#toD65(sourceWhitePoint, LMS, LMS_D65); + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); + } + #toRgb(src, srcOffset, dest, destOffset, scale) { + const A = this.#adjustToRange(0, 1, src[srcOffset] * scale); + const B = this.#adjustToRange(0, 1, src[srcOffset + 1] * scale); + const C = this.#adjustToRange(0, 1, src[srcOffset + 2] * scale); + const AGR = A === 1 ? 1 : A ** this.GR; + const BGG = B === 1 ? 1 : B ** this.GG; + const CGB = C === 1 ? 1 : C ** this.GB; + const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB; + const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB; + const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB; + const XYZ = CalRGBCS.#tempConvertMatrix1; + XYZ[0] = X; + XYZ[1] = Y; + XYZ[2] = Z; + const XYZ_Flat = CalRGBCS.#tempConvertMatrix2; + this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat); + const XYZ_Black = CalRGBCS.#tempConvertMatrix1; + this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black); + const XYZ_D65 = CalRGBCS.#tempConvertMatrix2; + this.#normalizeWhitePointToD65(CalRGBCS.#FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); + const SRGB = CalRGBCS.#tempConvertMatrix1; + this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); + dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255; + dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255; + dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255; + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + this.#toRgb(src, srcOffset, dest, destOffset, scale); + srcOffset += 3; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } +} +class LabCS extends ColorSpace { + constructor(whitePoint, blackPoint, range) { + super("Lab", 3); + if (!whitePoint) { + throw new FormatError("WhitePoint missing - required for color space Lab"); + } + [this.XW, this.YW, this.ZW] = whitePoint; + [this.amin, this.amax, this.bmin, this.bmax] = range || [-100, 100, -100, 100]; + [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + throw new FormatError("Invalid WhitePoint components, no fallback available"); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + info("Invalid BlackPoint, falling back to default"); + this.XB = this.YB = this.ZB = 0; + } + if (this.amin > this.amax || this.bmin > this.bmax) { + info("Invalid Range, falling back to defaults"); + this.amin = -100; + this.amax = 100; + this.bmin = -100; + this.bmax = 100; + } + } + #fn_g(x) { + return x >= 6 / 29 ? x ** 3 : 108 / 841 * (x - 4 / 29); + } + #decode(value, high1, low2, high2) { + return low2 + value * (high2 - low2) / high1; + } + #toRgb(src, srcOffset, maxVal, dest, destOffset) { + let Ls = src[srcOffset]; + let as = src[srcOffset + 1]; + let bs = src[srcOffset + 2]; + if (maxVal !== false) { + Ls = this.#decode(Ls, maxVal, 0, 100); + as = this.#decode(as, maxVal, this.amin, this.amax); + bs = this.#decode(bs, maxVal, this.bmin, this.bmax); + } + if (as > this.amax) { + as = this.amax; + } else if (as < this.amin) { + as = this.amin; + } + if (bs > this.bmax) { + bs = this.bmax; + } else if (bs < this.bmin) { + bs = this.bmin; + } + const M = (Ls + 16) / 116; + const L = M + as / 500; + const N = M - bs / 200; + const X = this.XW * this.#fn_g(L); + const Y = this.YW * this.#fn_g(M); + const Z = this.ZW * this.#fn_g(N); + let r, g, b; + if (this.ZW < 1) { + r = X * 3.1339 + Y * -1.617 + Z * -0.4906; + g = X * -0.9785 + Y * 1.916 + Z * 0.0333; + b = X * 0.072 + Y * -0.229 + Z * 1.4057; + } else { + r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; + g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; + b = X * 0.0557 + Y * -0.204 + Z * 1.057; + } + dest[destOffset] = Math.sqrt(r) * 255; + dest[destOffset + 1] = Math.sqrt(g) * 255; + dest[destOffset + 2] = Math.sqrt(b) * 255; + } + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, false, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const maxVal = (1 << bits) - 1; + for (let i = 0; i < count; i++) { + this.#toRgb(src, srcOffset, maxVal, dest, destOffset); + srcOffset += 3; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } + isDefaultDecode(decodeMap, bpc) { + return true; + } + get usesZeroToOneRange() { + return shadow(this, "usesZeroToOneRange", false); + } +} + +;// ./src/core/binary_cmap.js + +function hexToInt(a, size) { + let n = 0; + for (let i = 0; i <= size; i++) { + n = n << 8 | a[i]; + } + return n >>> 0; +} +function hexToStr(a, size) { + if (size === 1) { + return String.fromCharCode(a[0], a[1]); + } + if (size === 3) { + return String.fromCharCode(a[0], a[1], a[2], a[3]); + } + return String.fromCharCode(...a.subarray(0, size + 1)); +} +function addHex(a, b, size) { + let c = 0; + for (let i = size; i >= 0; i--) { + c += a[i] + b[i]; + a[i] = c & 255; + c >>= 8; + } +} +function incHex(a, size) { + let c = 1; + for (let i = size; i >= 0 && c > 0; i--) { + c += a[i]; + a[i] = c & 255; + c >>= 8; + } +} +const MAX_NUM_SIZE = 16; +const MAX_ENCODED_NUM_SIZE = 19; +class BinaryCMapStream { + constructor(data) { + this.buffer = data; + this.pos = 0; + this.end = data.length; + this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); + } + readByte() { + if (this.pos >= this.end) { + return -1; + } + return this.buffer[this.pos++]; + } + readNumber() { + let n = 0; + let last; + do { + const b = this.readByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + n = n << 7 | b & 0x7f; + } while (!last); + return n; + } + readSigned() { + const n = this.readNumber(); + return n & 1 ? ~(n >>> 1) : n >>> 1; + } + readHex(num, size) { + num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); + this.pos += size + 1; + } + readHexNumber(num, size) { + let last; + const stack = this.tmpBuf; + let sp = 0; + do { + const b = this.readByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + stack[sp++] = b & 0x7f; + } while (!last); + let i = size, + buffer = 0, + bufferSize = 0; + while (i >= 0) { + while (bufferSize < 8 && stack.length > 0) { + buffer |= stack[--sp] << bufferSize; + bufferSize += 7; + } + num[i] = buffer & 255; + i--; + buffer >>= 8; + bufferSize -= 8; + } + } + readHexSigned(num, size) { + this.readHexNumber(num, size); + const sign = num[size] & 1 ? 255 : 0; + let c = 0; + for (let i = 0; i <= size; i++) { + c = (c & 1) << 8 | num[i]; + num[i] = c >> 1 ^ sign; + } + } + readString() { + const len = this.readNumber(), + buf = new Array(len); + for (let i = 0; i < len; i++) { + buf[i] = this.readNumber(); + } + return String.fromCharCode(...buf); + } +} +class BinaryCMapReader { + async process(data, cMap, extend) { + const stream = new BinaryCMapStream(data); + const header = stream.readByte(); + cMap.vertical = !!(header & 1); + let useCMap = null; + const start = new Uint8Array(MAX_NUM_SIZE); + const end = new Uint8Array(MAX_NUM_SIZE); + const char = new Uint8Array(MAX_NUM_SIZE); + const charCode = new Uint8Array(MAX_NUM_SIZE); + const tmp = new Uint8Array(MAX_NUM_SIZE); + let code; + let b; + while ((b = stream.readByte()) >= 0) { + const type = b >> 5; + if (type === 7) { + switch (b & 0x1f) { + case 0: + stream.readString(); + break; + case 1: + useCMap = stream.readString(); + break; + } + continue; + } + const sequence = !!(b & 0x10); + const dataSize = b & 15; + if (dataSize + 1 > MAX_NUM_SIZE) { + throw new Error("BinaryCMapReader.process: Invalid dataSize."); + } + const ucs2DataSize = 1; + const subitemsCount = stream.readNumber(); + switch (type) { + case 0: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + } + break; + case 1: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + } + break; + case 2: + stream.readHex(char, dataSize); + code = stream.readNumber(); + cMap.mapOne(hexToInt(char, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, dataSize); + if (!sequence) { + stream.readHexNumber(tmp, dataSize); + addHex(char, tmp, dataSize); + } + code = stream.readSigned() + (code + 1); + cMap.mapOne(hexToInt(char, dataSize), code); + } + break; + case 3: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + if (!sequence) { + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + } + break; + case 4: + stream.readHex(char, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(tmp, ucs2DataSize); + addHex(char, tmp, ucs2DataSize); + } + incHex(charCode, dataSize); + stream.readHexSigned(tmp, dataSize); + addHex(charCode, tmp, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + case 5: + stream.readHex(start, ucs2DataSize); + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(start, ucs2DataSize); + addHex(start, end, ucs2DataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + default: + throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); + } + } + if (useCMap) { + return extend(useCMap); + } + return cMap; + } +} + +;// ./src/core/decode_stream.js + + +const emptyBuffer = new Uint8Array(0); +class DecodeStream extends BaseStream { + constructor(maybeMinBufferLength) { + super(); + this._rawMinBufferLength = maybeMinBufferLength || 0; + this.pos = 0; + this.bufferLength = 0; + this.eof = false; + this.buffer = emptyBuffer; + this.minBufferLength = 512; + if (maybeMinBufferLength) { + while (this.minBufferLength < maybeMinBufferLength) { + this.minBufferLength *= 2; + } + } + } + get isEmpty() { + while (!this.eof && this.bufferLength === 0) { + this.readBlock(); + } + return this.bufferLength === 0; + } + ensureBuffer(requested) { + const buffer = this.buffer; + if (requested <= buffer.byteLength) { + return buffer; + } + let size = this.minBufferLength; + while (size < requested) { + size *= 2; + } + const buffer2 = new Uint8Array(size); + buffer2.set(buffer); + return this.buffer = buffer2; + } + getByte() { + const pos = this.pos; + while (this.bufferLength <= pos) { + if (this.eof) { + return -1; + } + this.readBlock(); + } + return this.buffer[this.pos++]; + } + getBytes(length, decoderOptions = null) { + const pos = this.pos; + let end; + if (length) { + this.ensureBuffer(pos + length); + end = pos + length; + while (!this.eof && this.bufferLength < end) { + this.readBlock(decoderOptions); + } + const bufEnd = this.bufferLength; + if (end > bufEnd) { + end = bufEnd; + } + } else { + while (!this.eof) { + this.readBlock(decoderOptions); + } + end = this.bufferLength; + } + this.pos = end; + return this.buffer.subarray(pos, end); + } + async getImageData(length, decoderOptions = null) { + if (!this.canAsyncDecodeImageFromBuffer) { + return this.getBytes(length, decoderOptions); + } + const data = await this.stream.asyncGetBytes(); + return this.decodeImage(data, decoderOptions); + } + reset() { + this.pos = 0; + } + makeSubStream(start, length, dict = null) { + if (length === undefined) { + while (!this.eof) { + this.readBlock(); + } + } else { + const end = start + length; + while (this.bufferLength <= end && !this.eof) { + this.readBlock(); + } + } + return new Stream(this.buffer, start, length, dict); + } + getBaseStreams() { + return this.str ? this.str.getBaseStreams() : null; + } +} +class StreamsSequenceStream extends DecodeStream { + constructor(streams, onError = null) { + streams = streams.filter(s => s instanceof BaseStream); + let maybeLength = 0; + for (const stream of streams) { + maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length; + } + super(maybeLength); + this.streams = streams; + this._onError = onError; + } + readBlock() { + const streams = this.streams; + if (streams.length === 0) { + this.eof = true; + return; + } + const stream = streams.shift(); + let chunk; + try { + chunk = stream.getBytes(); + } catch (reason) { + if (this._onError) { + this._onError(reason, stream.dict?.objId); + return; + } + throw reason; + } + const bufferLength = this.bufferLength; + const newLength = bufferLength + chunk.length; + const buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } + getBaseStreams() { + const baseStreamsBuf = []; + for (const stream of this.streams) { + const baseStreams = stream.getBaseStreams(); + if (baseStreams) { + baseStreamsBuf.push(...baseStreams); + } + } + return baseStreamsBuf.length > 0 ? baseStreamsBuf : null; + } +} + +;// ./src/core/ascii_85_stream.js + + +class Ascii85Stream extends DecodeStream { + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.8; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.input = new Uint8Array(5); + } + readBlock() { + const TILDA_CHAR = 0x7e; + const Z_LOWER_CHAR = 0x7a; + const EOF = -1; + const str = this.str; + let c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; + return; + } + const bufferLength = this.bufferLength; + let buffer, i; + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + for (i = 0; i < 4; ++i) { + buffer[bufferLength + i] = 0; + } + this.bufferLength += 4; + } else { + const input = this.input; + input[0] = c; + for (i = 1; i < 5; ++i) { + c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + input[i] = c; + if (c === EOF || c === TILDA_CHAR) { + break; + } + } + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + if (i < 5) { + for (; i < 5; ++i) { + input[i] = 0x21 + 84; + } + this.eof = true; + } + let t = 0; + for (i = 0; i < 5; ++i) { + t = t * 85 + (input[i] - 0x21); + } + for (i = 3; i >= 0; --i) { + buffer[bufferLength + i] = t & 0xff; + t >>= 8; + } + } + } +} + +;// ./src/core/ascii_hex_stream.js + +class AsciiHexStream extends DecodeStream { + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.5; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.firstDigit = -1; + } + readBlock() { + const UPSTREAM_BLOCK_SIZE = 8000; + const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + const maxDecodeLength = bytes.length + 1 >> 1; + const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + let bufferLength = this.bufferLength; + let firstDigit = this.firstDigit; + for (const ch of bytes) { + let digit; + if (ch >= 0x30 && ch <= 0x39) { + digit = ch & 0x0f; + } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + digit = (ch & 0x0f) + 9; + } else if (ch === 0x3e) { + this.eof = true; + break; + } else { + continue; + } + if (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = firstDigit << 4 | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; + } +} + +;// ./src/core/ccitt.js + +const ccittEOL = -2; +const ccittEOF = -1; +const twoDimPass = 0; +const twoDimHoriz = 1; +const twoDimVert0 = 2; +const twoDimVertR1 = 3; +const twoDimVertL1 = 4; +const twoDimVertR2 = 5; +const twoDimVertL2 = 6; +const twoDimVertR3 = 7; +const twoDimVertL3 = 8; +const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]]; +const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]]; +const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]]; +const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]]; +const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]]; +const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]; +class CCITTFaxDecoder { + constructor(source, options = {}) { + if (!source || typeof source.next !== "function") { + throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); + } + this.source = source; + this.eof = false; + this.encoding = options.K || 0; + this.eoline = options.EndOfLine || false; + this.byteAlign = options.EncodedByteAlign || false; + this.columns = options.Columns || 1728; + this.rows = options.Rows || 0; + this.eoblock = options.EndOfBlock ?? true; + this.black = options.BlackIs1 || false; + this.codingLine = new Uint32Array(this.columns + 1); + this.refLine = new Uint32Array(this.columns + 2); + this.codingLine[0] = this.columns; + this.codingPos = 0; + this.row = 0; + this.nextLine2D = this.encoding < 0; + this.inputBits = 0; + this.inputBuf = 0; + this.outputBits = 0; + this.rowsDone = false; + let code1; + while ((code1 = this._lookBits(12)) === 0) { + this._eatBits(1); + } + if (code1 === 1) { + this._eatBits(12); + } + if (this.encoding > 0) { + this.nextLine2D = !this._lookBits(1); + this._eatBits(1); + } + } + readNextChar() { + if (this.eof) { + return -1; + } + const refLine = this.refLine; + const codingLine = this.codingLine; + const columns = this.columns; + let refPos, blackPixels, bits, i; + if (this.outputBits === 0) { + if (this.rowsDone) { + this.eof = true; + } + if (this.eof) { + return -1; + } + this.err = false; + let code1, code2, code3; + if (this.nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = columns; + refLine[i] = columns; + codingLine[0] = 0; + this.codingPos = 0; + refPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = this._getTwoDimCode(); + switch (code1) { + case twoDimPass: + this._addPixels(refLine[refPos + 1], blackPixels); + if (refLine[refPos + 1] < columns) { + refPos += 2; + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = this._getBlackCode(); + } while (code3 >= 64); + } + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + if (codingLine[this.codingPos] < columns) { + this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + break; + case twoDimVertR3: + this._addPixels(refLine[refPos] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR2: + this._addPixels(refLine[refPos] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR1: + this._addPixels(refLine[refPos] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVert0: + this._addPixels(refLine[refPos], blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL3: + this._addPixelsNeg(refLine[refPos] - 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL2: + this._addPixelsNeg(refLine[refPos] - 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL1: + this._addPixelsNeg(refLine[refPos] - 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case ccittEOF: + this._addPixels(columns, 0); + this.eof = true; + break; + default: + info("bad 2d code"); + this._addPixels(columns, 0); + this.err = true; + } + } + } else { + codingLine[0] = 0; + this.codingPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = 0; + if (blackPixels) { + do { + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + } + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + blackPixels ^= 1; + } + } + let gotEOL = false; + if (this.byteAlign) { + this.inputBits &= ~7; + } + if (!this.eoblock && this.row === this.rows - 1) { + this.rowsDone = true; + } else { + code1 = this._lookBits(12); + if (this.eoline) { + while (code1 !== ccittEOF && code1 !== 1) { + this._eatBits(1); + code1 = this._lookBits(12); + } + } else { + while (code1 === 0) { + this._eatBits(1); + code1 = this._lookBits(12); + } + } + if (code1 === 1) { + this._eatBits(12); + gotEOL = true; + } else if (code1 === ccittEOF) { + this.eof = true; + } + } + if (!this.eof && this.encoding > 0 && !this.rowsDone) { + this.nextLine2D = !this._lookBits(1); + this._eatBits(1); + } + if (this.eoblock && gotEOL && this.byteAlign) { + code1 = this._lookBits(12); + if (code1 === 1) { + this._eatBits(12); + if (this.encoding > 0) { + this._lookBits(1); + this._eatBits(1); + } + if (this.encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = this._lookBits(12); + if (code1 !== 1) { + info("bad rtc code: " + code1); + } + this._eatBits(12); + if (this.encoding > 0) { + this._lookBits(1); + this._eatBits(1); + } + } + } + this.eof = true; + } + } else if (this.err && this.eoline) { + while (true) { + code1 = this._lookBits(13); + if (code1 === ccittEOF) { + this.eof = true; + return -1; + } + if (code1 >> 1 === 1) { + break; + } + this._eatBits(1); + } + this._eatBits(12); + if (this.encoding > 0) { + this._eatBits(1); + this.nextLine2D = !(code1 & 1); + } + } + this.outputBits = codingLine[0] > 0 ? codingLine[this.codingPos = 0] : codingLine[this.codingPos = 1]; + this.row++; + } + let c; + if (this.outputBits >= 8) { + c = this.codingPos & 1 ? 0 : 0xff; + this.outputBits -= 8; + if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } + } else { + bits = 8; + c = 0; + do { + if (typeof this.outputBits !== "number") { + throw new FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.'); + } + if (this.outputBits > bits) { + c <<= bits; + if (!(this.codingPos & 1)) { + c |= 0xff >> 8 - bits; + } + this.outputBits -= bits; + bits = 0; + } else { + c <<= this.outputBits; + if (!(this.codingPos & 1)) { + c |= 0xff >> 8 - this.outputBits; + } + bits -= this.outputBits; + this.outputBits = 0; + if (codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } else if (bits > 0) { + c <<= bits; + bits = 0; + } + } + } while (bits); + } + if (this.black) { + c ^= 0xff; + } + return c; + } + _addPixels(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + info("row is wrong length"); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + } + _addPixelsNeg(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + info("row is wrong length"); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } else if (a1 < codingLine[codingPos]) { + if (a1 < 0) { + info("invalid code"); + this.err = true; + a1 = 0; + } + while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { + --codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + } + _findTableCode(start, end, table, limit) { + const limitValue = limit || 0; + for (let i = start; i <= end; ++i) { + let code = this._lookBits(i); + if (code === ccittEOF) { + return [true, 1, false]; + } + if (i < end) { + code <<= end - i; + } + if (!limitValue || code >= limitValue) { + const p = table[code - limitValue]; + if (p[0] === i) { + this._eatBits(i); + return [true, p[1], true]; + } + } + } + return [false, 0, false]; + } + _getTwoDimCode() { + let code = 0; + let p; + if (this.eoblock) { + code = this._lookBits(7); + p = twoDimTable[code]; + if (p?.[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + const result = this._findTableCode(1, 7, twoDimTable); + if (result[0] && result[2]) { + return result[1]; + } + } + info("Bad two dim code"); + return ccittEOF; + } + _getWhiteCode() { + let code = 0; + let p; + if (this.eoblock) { + code = this._lookBits(12); + if (code === ccittEOF) { + return 1; + } + p = code >> 5 === 0 ? whiteTable1[code] : whiteTable2[code >> 3]; + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + let result = this._findTableCode(1, 9, whiteTable2); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(11, 12, whiteTable1); + if (result[0]) { + return result[1]; + } + } + info("bad white code"); + this._eatBits(1); + return 1; + } + _getBlackCode() { + let code, p; + if (this.eoblock) { + code = this._lookBits(13); + if (code === ccittEOF) { + return 1; + } + if (code >> 7 === 0) { + p = blackTable1[code]; + } else if (code >> 9 === 0 && code >> 7 !== 0) { + p = blackTable2[(code >> 1) - 64]; + } else { + p = blackTable3[code >> 7]; + } + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + let result = this._findTableCode(2, 6, blackTable3); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(7, 12, blackTable2, 64); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(10, 13, blackTable1); + if (result[0]) { + return result[1]; + } + } + info("bad black code"); + this._eatBits(1); + return 1; + } + _lookBits(n) { + let c; + while (this.inputBits < n) { + if ((c = this.source.next()) === -1) { + if (this.inputBits === 0) { + return ccittEOF; + } + return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n; + } + this.inputBuf = this.inputBuf << 8 | c; + this.inputBits += 8; + } + return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n; + } + _eatBits(n) { + if ((this.inputBits -= n) < 0) { + this.inputBits = 0; + } + } +} + +;// ./src/core/ccitt_stream.js + + + +class CCITTFaxStream extends DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + if (!(params instanceof Dict)) { + params = Dict.empty; + } + const source = { + next() { + return str.getByte(); + } + }; + this.ccittFaxDecoder = new CCITTFaxDecoder(source, { + K: params.get("K"), + EndOfLine: params.get("EndOfLine"), + EncodedByteAlign: params.get("EncodedByteAlign"), + Columns: params.get("Columns"), + Rows: params.get("Rows"), + EndOfBlock: params.get("EndOfBlock"), + BlackIs1: params.get("BlackIs1") + }); + } + readBlock() { + while (!this.eof) { + const c = this.ccittFaxDecoder.readNextChar(); + if (c === -1) { + this.eof = true; + return; + } + this.ensureBuffer(this.bufferLength + 1); + this.buffer[this.bufferLength++] = c; + } + } +} + +;// ./src/core/flate_stream.js + + + +const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]); +const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]); +const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9]; +const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5]; +class FlateStream extends DecodeStream { + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + const cmf = str.getByte(); + const flg = str.getByte(); + if (cmf === -1 || flg === -1) { + throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); + } + if ((cmf & 0x0f) !== 0x08) { + throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`); + } + if (((cmf << 8) + flg) % 31 !== 0) { + throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); + } + if (flg & 0x20) { + throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); + } + this.codeSize = 0; + this.codeBuf = 0; + } + async getImageData(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + return data?.subarray(0, length) || this.getBytes(length); + } + async asyncGetBytes() { + this.str.reset(); + const bytes = this.str.getBytes(); + try { + const { + readable, + writable + } = new DecompressionStream("deflate"); + const writer = writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + const chunks = []; + let totalLength = 0; + for await (const chunk of readable) { + chunks.push(chunk); + totalLength += chunk.byteLength; + } + const data = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + data.set(chunk, offset); + offset += chunk.byteLength; + } + return data; + } catch { + this.str = new Stream(bytes, 2, bytes.length, this.str.dict); + this.reset(); + return null; + } + } + get isAsync() { + return true; + } + getBits(bits) { + const str = this.str; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < bits) { + if ((b = str.getByte()) === -1) { + throw new FormatError("Bad encoding in flate stream"); + } + codeBuf |= b << codeSize; + codeSize += 8; + } + b = codeBuf & (1 << bits) - 1; + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; + } + getCode(table) { + const str = this.str; + const codes = table[0]; + const maxLen = table[1]; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < maxLen) { + if ((b = str.getByte()) === -1) { + break; + } + codeBuf |= b << codeSize; + codeSize += 8; + } + const code = codes[codeBuf & (1 << maxLen) - 1]; + const codeLen = code >> 16; + const codeVal = code & 0xffff; + if (codeLen < 1 || codeSize < codeLen) { + throw new FormatError("Bad encoding in flate stream"); + } + this.codeBuf = codeBuf >> codeLen; + this.codeSize = codeSize - codeLen; + return codeVal; + } + generateHuffmanTable(lengths) { + const n = lengths.length; + let maxLen = 0; + let i; + for (i = 0; i < n; ++i) { + if (lengths[i] > maxLen) { + maxLen = lengths[i]; + } + } + const size = 1 << maxLen; + const codes = new Int32Array(size); + for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { + for (let val = 0; val < n; ++val) { + if (lengths[val] === len) { + let code2 = 0; + let t = code; + for (i = 0; i < len; ++i) { + code2 = code2 << 1 | t & 1; + t >>= 1; + } + for (i = code2; i < size; i += skip) { + codes[i] = len << 16 | val; + } + ++code; + } + } + } + return [codes, maxLen]; + } + #endsStreamOnError(err) { + info(err); + this.eof = true; + } + readBlock() { + let buffer, hdr, len; + const str = this.str; + try { + hdr = this.getBits(3); + } catch (ex) { + this.#endsStreamOnError(ex.message); + return; + } + if (hdr & 1) { + this.eof = true; + } + hdr >>= 1; + if (hdr === 0) { + let b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + let blockLen = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + let check = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + check |= b << 8; + if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { + throw new FormatError("Bad uncompressed block length in flate stream"); + } + this.codeBuf = 0; + this.codeSize = 0; + const bufferLength = this.bufferLength, + end = bufferLength + blockLen; + buffer = this.ensureBuffer(end); + this.bufferLength = end; + if (blockLen === 0) { + if (str.peekByte() === -1) { + this.eof = true; + } + } else { + const block = str.getBytes(blockLen); + buffer.set(block, bufferLength); + if (block.length < blockLen) { + this.eof = true; + } + } + return; + } + let litCodeTable; + let distCodeTable; + if (hdr === 1) { + litCodeTable = fixedLitCodeTab; + distCodeTable = fixedDistCodeTab; + } else if (hdr === 2) { + const numLitCodes = this.getBits(5) + 257; + const numDistCodes = this.getBits(5) + 1; + const numCodeLenCodes = this.getBits(4) + 4; + const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); + let i; + for (i = 0; i < numCodeLenCodes; ++i) { + codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); + } + const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); + len = 0; + i = 0; + const codes = numLitCodes + numDistCodes; + const codeLengths = new Uint8Array(codes); + let bitsLength, bitsOffset, what; + while (i < codes) { + const code = this.getCode(codeLenCodeTab); + if (code === 16) { + bitsLength = 2; + bitsOffset = 3; + what = len; + } else if (code === 17) { + bitsLength = 3; + bitsOffset = 3; + what = len = 0; + } else if (code === 18) { + bitsLength = 7; + bitsOffset = 11; + what = len = 0; + } else { + codeLengths[i++] = len = code; + continue; + } + let repeatLength = this.getBits(bitsLength) + bitsOffset; + while (repeatLength-- > 0) { + codeLengths[i++] = what; + } + } + litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); + distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); + } else { + throw new FormatError("Unknown block type in flate stream"); + } + buffer = this.buffer; + let limit = buffer ? buffer.length : 0; + let pos = this.bufferLength; + while (true) { + let code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; + continue; + } + if (code1 === 256) { + this.bufferLength = pos; + return; + } + code1 -= 257; + code1 = lengthDecode[code1]; + let code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + const dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; + } + for (let k = 0; k < len; ++k, ++pos) { + buffer[pos] = buffer[pos - dist]; + } + } + } +} + +;// ./src/core/arithmetic_decoder.js +const QeTable = [{ + qe: 0x5601, + nmps: 1, + nlps: 1, + switchFlag: 1 +}, { + qe: 0x3401, + nmps: 2, + nlps: 6, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 3, + nlps: 9, + switchFlag: 0 +}, { + qe: 0x0ac1, + nmps: 4, + nlps: 12, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 5, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 38, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 7, + nlps: 6, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 8, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 9, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 10, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 11, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 12, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x1c01, + nmps: 13, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 29, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 15, + nlps: 14, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 16, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x5101, + nmps: 17, + nlps: 15, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 18, + nlps: 16, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 19, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x3401, + nmps: 20, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 21, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2801, + nmps: 22, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 23, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x2201, + nmps: 24, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x1c01, + nmps: 25, + nlps: 22, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 26, + nlps: 23, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 27, + nlps: 24, + switchFlag: 0 +}, { + qe: 0x1401, + nmps: 28, + nlps: 25, + switchFlag: 0 +}, { + qe: 0x1201, + nmps: 29, + nlps: 26, + switchFlag: 0 +}, { + qe: 0x1101, + nmps: 30, + nlps: 27, + switchFlag: 0 +}, { + qe: 0x0ac1, + nmps: 31, + nlps: 28, + switchFlag: 0 +}, { + qe: 0x09c1, + nmps: 32, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x08a1, + nmps: 33, + nlps: 30, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 34, + nlps: 31, + switchFlag: 0 +}, { + qe: 0x0441, + nmps: 35, + nlps: 32, + switchFlag: 0 +}, { + qe: 0x02a1, + nmps: 36, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 37, + nlps: 34, + switchFlag: 0 +}, { + qe: 0x0141, + nmps: 38, + nlps: 35, + switchFlag: 0 +}, { + qe: 0x0111, + nmps: 39, + nlps: 36, + switchFlag: 0 +}, { + qe: 0x0085, + nmps: 40, + nlps: 37, + switchFlag: 0 +}, { + qe: 0x0049, + nmps: 41, + nlps: 38, + switchFlag: 0 +}, { + qe: 0x0025, + nmps: 42, + nlps: 39, + switchFlag: 0 +}, { + qe: 0x0015, + nmps: 43, + nlps: 40, + switchFlag: 0 +}, { + qe: 0x0009, + nmps: 44, + nlps: 41, + switchFlag: 0 +}, { + qe: 0x0005, + nmps: 45, + nlps: 42, + switchFlag: 0 +}, { + qe: 0x0001, + nmps: 45, + nlps: 43, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 46, + nlps: 46, + switchFlag: 0 +}]; +class ArithmeticDecoder { + constructor(data, start, end) { + this.data = data; + this.bp = start; + this.dataEnd = end; + this.chigh = data[start]; + this.clow = 0; + this.byteIn(); + this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f; + this.clow = this.clow << 7 & 0xffff; + this.ct -= 7; + this.a = 0x8000; + } + byteIn() { + const data = this.data; + let bp = this.bp; + if (data[bp] === 0xff) { + if (data[bp + 1] > 0x8f) { + this.clow += 0xff00; + this.ct = 8; + } else { + bp++; + this.clow += data[bp] << 9; + this.ct = 7; + this.bp = bp; + } + } else { + bp++; + this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00; + this.ct = 8; + this.bp = bp; + } + if (this.clow > 0xffff) { + this.chigh += this.clow >> 16; + this.clow &= 0xffff; + } + } + readBit(contexts, pos) { + let cx_index = contexts[pos] >> 1, + cx_mps = contexts[pos] & 1; + const qeTableIcx = QeTable[cx_index]; + const qeIcx = qeTableIcx.qe; + let d; + let a = this.a - qeIcx; + if (this.chigh < qeIcx) { + if (a < qeIcx) { + a = qeIcx; + d = cx_mps; + cx_index = qeTableIcx.nmps; + } else { + a = qeIcx; + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } + } else { + this.chigh -= qeIcx; + if ((a & 0x8000) !== 0) { + this.a = a; + return cx_mps; + } + if (a < qeIcx) { + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } else { + d = cx_mps; + cx_index = qeTableIcx.nmps; + } + } + do { + if (this.ct === 0) { + this.byteIn(); + } + a <<= 1; + this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1; + this.clow = this.clow << 1 & 0xffff; + this.ct--; + } while ((a & 0x8000) === 0); + this.a = a; + contexts[pos] = cx_index << 1 | cx_mps; + return d; + } +} + +;// ./src/core/jbig2.js + + + + +class Jbig2Error extends BaseException { + constructor(msg) { + super(msg, "Jbig2Error"); + } +} +class ContextCache { + getContexts(id) { + if (id in this) { + return this[id]; + } + return this[id] = new Int8Array(1 << 16); + } +} +class DecodingContext { + constructor(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + } + get decoder() { + const decoder = new ArithmeticDecoder(this.data, this.start, this.end); + return shadow(this, "decoder", decoder); + } + get contextCache() { + const cache = new ContextCache(); + return shadow(this, "contextCache", cache); + } +} +function decodeInteger(contextCache, procedure, decoder) { + const contexts = contextCache.getContexts(procedure); + let prev = 1; + function readBits(length) { + let v = 0; + for (let i = 0; i < length; i++) { + const bit = decoder.readBit(contexts, prev); + prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; + v = v << 1 | bit; + } + return v >>> 0; + } + const sign = readBits(1); + const value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2); + let signedValue; + if (sign === 0) { + signedValue = value; + } else if (value > 0) { + signedValue = -value; + } + if (signedValue >= MIN_INT_32 && signedValue <= MAX_INT_32) { + return signedValue; + } + return null; +} +function decodeIAID(contextCache, decoder, codeLength) { + const contexts = contextCache.getContexts("IAID"); + let prev = 1; + for (let i = 0; i < codeLength; i++) { + const bit = decoder.readBit(contexts, prev); + prev = prev << 1 | bit; + } + if (codeLength < 31) { + return prev & (1 << codeLength) - 1; + } + return prev & 0x7fffffff; +} +const SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, "ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, "PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", "ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, "IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", "IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", "ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", "EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, "Extension"]; +const CodingTemplates = [[{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: 2, + y: -1 +}, { + x: -4, + y: 0 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: 2, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: 2, + y: -1 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -3, + y: -1 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: -4, + y: 0 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}]]; +const RefinementTemplates = [{ + coding: [{ + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }], + reference: [{ + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }, { + x: 0, + y: 0 + }, { + x: 1, + y: 0 + }, { + x: -1, + y: 1 + }, { + x: 0, + y: 1 + }, { + x: 1, + y: 1 + }] +}, { + coding: [{ + x: -1, + y: -1 + }, { + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }], + reference: [{ + x: 0, + y: -1 + }, { + x: -1, + y: 0 + }, { + x: 0, + y: 0 + }, { + x: 1, + y: 0 + }, { + x: 0, + y: 1 + }, { + x: 1, + y: 1 + }] +}]; +const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195]; +const RefinementReusedContexts = [0x0020, 0x0008]; +function decodeBitmapTemplate0(width, height, decodingContext) { + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GB"); + const bitmap = []; + let contextLabel, i, j, pixel, row, row1, row2; + const OLD_PIXEL_MASK = 0x7bf7; + for (i = 0; i < height; i++) { + row = bitmap[i] = new Uint8Array(width); + row1 = i < 1 ? row : bitmap[i - 1]; + row2 = i < 2 ? row : bitmap[i - 2]; + contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; + for (j = 0; j < width; j++) { + row[j] = pixel = decoder.readBit(contexts, contextLabel); + contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; + } + } + return bitmap; +} +function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { + if (mmr) { + const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); + return decodeMMRBitmap(input, width, height, false); + } + if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { + return decodeBitmapTemplate0(width, height, decodingContext); + } + const useskip = !!skip; + const template = CodingTemplates[templateIndex].concat(at); + template.sort(function (a, b) { + return a.y - b.y || a.x - b.x; + }); + const templateLength = template.length; + const templateX = new Int8Array(templateLength); + const templateY = new Int8Array(templateLength); + const changingTemplateEntries = []; + let reuseMask = 0, + minX = 0, + maxX = 0, + minY = 0; + let c, k; + for (k = 0; k < templateLength; k++) { + templateX[k] = template[k].x; + templateY[k] = template[k].y; + minX = Math.min(minX, template[k].x); + maxX = Math.max(maxX, template[k].x); + minY = Math.min(minY, template[k].y); + if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { + reuseMask |= 1 << templateLength - 1 - k; + } else { + changingTemplateEntries.push(k); + } + } + const changingEntriesLength = changingTemplateEntries.length; + const changingTemplateX = new Int8Array(changingEntriesLength); + const changingTemplateY = new Int8Array(changingEntriesLength); + const changingTemplateBit = new Uint16Array(changingEntriesLength); + for (c = 0; c < changingEntriesLength; c++) { + k = changingTemplateEntries[c]; + changingTemplateX[c] = template[k].x; + changingTemplateY[c] = template[k].y; + changingTemplateBit[c] = 1 << templateLength - 1 - k; + } + const sbb_left = -minX; + const sbb_top = -minY; + const sbb_right = width - maxX; + const pseudoPixelContext = ReusedContexts[templateIndex]; + let row = new Uint8Array(width); + const bitmap = []; + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GB"); + let ltp = 0, + j, + i0, + j0, + contextLabel = 0, + bit, + shift; + for (let i = 0; i < height; i++) { + if (prediction) { + const sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + bitmap.push(row); + continue; + } + } + row = new Uint8Array(row); + bitmap.push(row); + for (j = 0; j < width; j++) { + if (useskip && skip[i][j]) { + row[j] = 0; + continue; + } + if (j >= sbb_left && j < sbb_right && i >= sbb_top) { + contextLabel = contextLabel << 1 & reuseMask; + for (k = 0; k < changingEntriesLength; k++) { + i0 = i + changingTemplateY[k]; + j0 = j + changingTemplateX[k]; + bit = bitmap[i0][j0]; + if (bit) { + bit = changingTemplateBit[k]; + contextLabel |= bit; + } + } + } else { + contextLabel = 0; + shift = templateLength - 1; + for (k = 0; k < templateLength; k++, shift--) { + j0 = j + templateX[k]; + if (j0 >= 0 && j0 < width) { + i0 = i + templateY[k]; + if (i0 >= 0) { + bit = bitmap[i0][j0]; + if (bit) { + contextLabel |= bit << shift; + } + } + } + } + } + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; +} +function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { + let codingTemplate = RefinementTemplates[templateIndex].coding; + if (templateIndex === 0) { + codingTemplate = codingTemplate.concat([at[0]]); + } + const codingTemplateLength = codingTemplate.length; + const codingTemplateX = new Int32Array(codingTemplateLength); + const codingTemplateY = new Int32Array(codingTemplateLength); + let k; + for (k = 0; k < codingTemplateLength; k++) { + codingTemplateX[k] = codingTemplate[k].x; + codingTemplateY[k] = codingTemplate[k].y; + } + let referenceTemplate = RefinementTemplates[templateIndex].reference; + if (templateIndex === 0) { + referenceTemplate = referenceTemplate.concat([at[1]]); + } + const referenceTemplateLength = referenceTemplate.length; + const referenceTemplateX = new Int32Array(referenceTemplateLength); + const referenceTemplateY = new Int32Array(referenceTemplateLength); + for (k = 0; k < referenceTemplateLength; k++) { + referenceTemplateX[k] = referenceTemplate[k].x; + referenceTemplateY[k] = referenceTemplate[k].y; + } + const referenceWidth = referenceBitmap[0].length; + const referenceHeight = referenceBitmap.length; + const pseudoPixelContext = RefinementReusedContexts[templateIndex]; + const bitmap = []; + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GR"); + let ltp = 0; + for (let i = 0; i < height; i++) { + if (prediction) { + const sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + throw new Jbig2Error("prediction is not supported"); + } + } + const row = new Uint8Array(width); + bitmap.push(row); + for (let j = 0; j < width; j++) { + let i0, j0; + let contextLabel = 0; + for (k = 0; k < codingTemplateLength; k++) { + i0 = i + codingTemplateY[k]; + j0 = j + codingTemplateX[k]; + if (i0 < 0 || j0 < 0 || j0 >= width) { + contextLabel <<= 1; + } else { + contextLabel = contextLabel << 1 | bitmap[i0][j0]; + } + } + for (k = 0; k < referenceTemplateLength; k++) { + i0 = i + referenceTemplateY[k] - offsetY; + j0 = j + referenceTemplateX[k] - offsetX; + if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { + contextLabel <<= 1; + } else { + contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; + } + } + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; +} +function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) { + if (huffman && refinement) { + throw new Jbig2Error("symbol refinement with Huffman is not supported"); + } + const newSymbols = []; + let currentHeight = 0; + let symbolCodeLength = log2(symbols.length + numberOfNewSymbols); + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let tableB1, symbolWidths; + if (huffman) { + tableB1 = getStandardTable(1); + symbolWidths = []; + symbolCodeLength = Math.max(symbolCodeLength, 1); + } + while (newSymbols.length < numberOfNewSymbols) { + const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, "IADH", decoder); + currentHeight += deltaHeight; + let currentWidth = 0, + totalWidth = 0; + const firstSymbol = huffman ? symbolWidths.length : 0; + while (true) { + const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, "IADW", decoder); + if (deltaWidth === null) { + break; + } + currentWidth += deltaWidth; + totalWidth += currentWidth; + let bitmap; + if (refinement) { + const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); + if (numberOfInstances > 1) { + bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput); + } else { + const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); + const rdx = decodeInteger(contextCache, "IARDX", decoder); + const rdy = decodeInteger(contextCache, "IARDY", decoder); + const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; + bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); + } + newSymbols.push(bitmap); + } else if (huffman) { + symbolWidths.push(currentWidth); + } else { + bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); + newSymbols.push(bitmap); + } + } + if (huffman && !refinement) { + const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput); + huffmanInput.byteAlign(); + let collectiveBitmap; + if (bitmapSize === 0) { + collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight); + } else { + const originalEnd = huffmanInput.end; + const bitmapEnd = huffmanInput.position + bitmapSize; + huffmanInput.end = bitmapEnd; + collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false); + huffmanInput.end = originalEnd; + huffmanInput.position = bitmapEnd; + } + const numberOfSymbolsDecoded = symbolWidths.length; + if (firstSymbol === numberOfSymbolsDecoded - 1) { + newSymbols.push(collectiveBitmap); + } else { + let i, + y, + xMin = 0, + xMax, + bitmapWidth, + symbolBitmap; + for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) { + bitmapWidth = symbolWidths[i]; + xMax = xMin + bitmapWidth; + symbolBitmap = []; + for (y = 0; y < currentHeight; y++) { + symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); + } + newSymbols.push(symbolBitmap); + xMin = xMax; + } + } + } + } + const exportedSymbols = [], + flags = []; + let currentFlag = false, + i, + ii; + const totalSymbolsLength = symbols.length + numberOfNewSymbols; + while (flags.length < totalSymbolsLength) { + let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder); + while (runLength--) { + flags.push(currentFlag); + } + currentFlag = !currentFlag; + } + for (i = 0, ii = symbols.length; i < ii; i++) { + if (flags[i]) { + exportedSymbols.push(symbols[i]); + } + } + for (let j = 0; j < numberOfNewSymbols; i++, j++) { + if (flags[i]) { + exportedSymbols.push(newSymbols[j]); + } + } + return exportedSymbols; +} +function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) { + if (huffman && refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); + } + const bitmap = []; + let i, row; + for (i = 0; i < height; i++) { + row = new Uint8Array(width); + if (defaultPixelValue) { + for (let j = 0; j < width; j++) { + row[j] = defaultPixelValue; + } + } + bitmap.push(row); + } + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, "IADT", decoder); + let firstS = 0; + i = 0; + while (i < numberOfSymbolInstances) { + const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, "IADT", decoder); + stripT += deltaT; + const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, "IAFS", decoder); + firstS += deltaFirstS; + let currentS = firstS; + do { + let currentT = 0; + if (stripSize > 1) { + currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", decoder); + } + const t = stripSize * stripT + currentT; + const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength); + const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, "IARI", decoder)); + let symbolBitmap = inputSymbols[symbolId]; + let symbolWidth = symbolBitmap[0].length; + let symbolHeight = symbolBitmap.length; + if (applyRefinement) { + const rdw = decodeInteger(contextCache, "IARDW", decoder); + const rdh = decodeInteger(contextCache, "IARDH", decoder); + const rdx = decodeInteger(contextCache, "IARDX", decoder); + const rdy = decodeInteger(contextCache, "IARDY", decoder); + symbolWidth += rdw; + symbolHeight += rdh; + symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); + } + let increment = 0; + if (!transposed) { + if (referenceCorner > 1) { + currentS += symbolWidth - 1; + } else { + increment = symbolWidth - 1; + } + } else if (!(referenceCorner & 1)) { + currentS += symbolHeight - 1; + } else { + increment = symbolHeight - 1; + } + const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1); + const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0); + let s2, t2, symbolRow; + if (transposed) { + for (s2 = 0; s2 < symbolHeight; s2++) { + row = bitmap[offsetS + s2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[s2]; + const maxWidth = Math.min(width - offsetT, symbolWidth); + switch (combinationOperator) { + case 0: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] |= symbolRow[t2]; + } + break; + case 2: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] ^= symbolRow[t2]; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + } else { + for (t2 = 0; t2 < symbolHeight; t2++) { + row = bitmap[offsetT + t2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[t2]; + switch (combinationOperator) { + case 0: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] |= symbolRow[s2]; + } + break; + case 2: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] ^= symbolRow[s2]; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + } + i++; + const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, "IADS", decoder); + if (deltaS === null) { + break; + } + currentS += increment + deltaS + dsOffset; + } while (true); + } + return bitmap; +} +function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) { + const at = []; + if (!mmr) { + at.push({ + x: -patternWidth, + y: 0 + }); + if (template === 0) { + at.push({ + x: -3, + y: -1 + }, { + x: 2, + y: -2 + }, { + x: -2, + y: -2 + }); + } + } + const collectiveWidth = (maxPatternIndex + 1) * patternWidth; + const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext); + const patterns = []; + for (let i = 0; i <= maxPatternIndex; i++) { + const patternBitmap = []; + const xMin = patternWidth * i; + const xMax = xMin + patternWidth; + for (let y = 0; y < patternHeight; y++) { + patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); + } + patterns.push(patternBitmap); + } + return patterns; +} +function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) { + const skip = null; + if (enableSkip) { + throw new Jbig2Error("skip is not supported"); + } + if (combinationOperator !== 0) { + throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`); + } + const regionBitmap = []; + let i, j, row; + for (i = 0; i < regionHeight; i++) { + row = new Uint8Array(regionWidth); + if (defaultPixelValue) { + for (j = 0; j < regionWidth; j++) { + row[j] = defaultPixelValue; + } + } + regionBitmap.push(row); + } + const numberOfPatterns = patterns.length; + const pattern0 = patterns[0]; + const patternWidth = pattern0[0].length, + patternHeight = pattern0.length; + const bitsPerValue = log2(numberOfPatterns); + const at = []; + if (!mmr) { + at.push({ + x: template <= 1 ? 3 : 2, + y: -1 + }); + if (template === 0) { + at.push({ + x: -3, + y: -1 + }, { + x: 2, + y: -2 + }, { + x: -2, + y: -2 + }); + } + } + const grayScaleBitPlanes = []; + let mmrInput, bitmap; + if (mmr) { + mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); + } + for (i = bitsPerValue - 1; i >= 0; i--) { + if (mmr) { + bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true); + } else { + bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext); + } + grayScaleBitPlanes[i] = bitmap; + } + let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow; + for (mg = 0; mg < gridHeight; mg++) { + for (ng = 0; ng < gridWidth; ng++) { + bit = 0; + patternIndex = 0; + for (j = bitsPerValue - 1; j >= 0; j--) { + bit ^= grayScaleBitPlanes[j][mg][ng]; + patternIndex |= bit << j; + } + patternBitmap = patterns[patternIndex]; + x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8; + y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8; + if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) { + for (i = 0; i < patternHeight; i++) { + regionRow = regionBitmap[y + i]; + patternRow = patternBitmap[i]; + for (j = 0; j < patternWidth; j++) { + regionRow[x + j] |= patternRow[j]; + } + } + } else { + let regionX, regionY; + for (i = 0; i < patternHeight; i++) { + regionY = y + i; + if (regionY < 0 || regionY >= regionHeight) { + continue; + } + regionRow = regionBitmap[regionY]; + patternRow = patternBitmap[i]; + for (j = 0; j < patternWidth; j++) { + regionX = x + j; + if (regionX >= 0 && regionX < regionWidth) { + regionRow[regionX] |= patternRow[j]; + } + } + } + } + } + } + return regionBitmap; +} +function readSegmentHeader(data, start) { + const segmentHeader = {}; + segmentHeader.number = readUint32(data, start); + const flags = data[start + 4]; + const segmentType = flags & 0x3f; + if (!SegmentTypes[segmentType]) { + throw new Jbig2Error("invalid segment type: " + segmentType); + } + segmentHeader.type = segmentType; + segmentHeader.typeName = SegmentTypes[segmentType]; + segmentHeader.deferredNonRetain = !!(flags & 0x80); + const pageAssociationFieldSize = !!(flags & 0x40); + const referredFlags = data[start + 5]; + let referredToCount = referredFlags >> 5 & 7; + const retainBits = [referredFlags & 31]; + let position = start + 6; + if (referredFlags === 7) { + referredToCount = readUint32(data, position - 1) & 0x1fffffff; + position += 3; + let bytes = referredToCount + 7 >> 3; + retainBits[0] = data[position++]; + while (--bytes > 0) { + retainBits.push(data[position++]); + } + } else if (referredFlags === 5 || referredFlags === 6) { + throw new Jbig2Error("invalid referred-to flags"); + } + segmentHeader.retainBits = retainBits; + let referredToSegmentNumberSize = 4; + if (segmentHeader.number <= 256) { + referredToSegmentNumberSize = 1; + } else if (segmentHeader.number <= 65536) { + referredToSegmentNumberSize = 2; + } + const referredTo = []; + let i, ii; + for (i = 0; i < referredToCount; i++) { + let number; + if (referredToSegmentNumberSize === 1) { + number = data[position]; + } else if (referredToSegmentNumberSize === 2) { + number = readUint16(data, position); + } else { + number = readUint32(data, position); + } + referredTo.push(number); + position += referredToSegmentNumberSize; + } + segmentHeader.referredTo = referredTo; + if (!pageAssociationFieldSize) { + segmentHeader.pageAssociation = data[position++]; + } else { + segmentHeader.pageAssociation = readUint32(data, position); + position += 4; + } + segmentHeader.length = readUint32(data, position); + position += 4; + if (segmentHeader.length === 0xffffffff) { + if (segmentType === 38) { + const genericRegionInfo = readRegionSegmentInformation(data, position); + const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; + const genericRegionMmr = !!(genericRegionSegmentFlags & 1); + const searchPatternLength = 6; + const searchPattern = new Uint8Array(searchPatternLength); + if (!genericRegionMmr) { + searchPattern[0] = 0xff; + searchPattern[1] = 0xac; + } + searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff; + searchPattern[3] = genericRegionInfo.height >> 16 & 0xff; + searchPattern[4] = genericRegionInfo.height >> 8 & 0xff; + searchPattern[5] = genericRegionInfo.height & 0xff; + for (i = position, ii = data.length; i < ii; i++) { + let j = 0; + while (j < searchPatternLength && searchPattern[j] === data[i + j]) { + j++; + } + if (j === searchPatternLength) { + segmentHeader.length = i + searchPatternLength; + break; + } + } + if (segmentHeader.length === 0xffffffff) { + throw new Jbig2Error("segment end was not found"); + } + } else { + throw new Jbig2Error("invalid unknown segment length"); + } + } + segmentHeader.headerEnd = position; + return segmentHeader; +} +function readSegments(header, data, start, end) { + const segments = []; + let position = start; + while (position < end) { + const segmentHeader = readSegmentHeader(data, position); + position = segmentHeader.headerEnd; + const segment = { + header: segmentHeader, + data + }; + if (!header.randomAccess) { + segment.start = position; + position += segmentHeader.length; + segment.end = position; + } + segments.push(segment); + if (segmentHeader.type === 51) { + break; + } + } + if (header.randomAccess) { + for (let i = 0, ii = segments.length; i < ii; i++) { + segments[i].start = position; + position += segments[i].header.length; + segments[i].end = position; + } + } + return segments; +} +function readRegionSegmentInformation(data, start) { + return { + width: readUint32(data, start), + height: readUint32(data, start + 4), + x: readUint32(data, start + 8), + y: readUint32(data, start + 12), + combinationOperator: data[start + 16] & 7 + }; +} +const RegionSegmentInformationFieldLength = 17; +function processSegment(segment, visitor) { + const header = segment.header; + const data = segment.data, + end = segment.end; + let position = segment.start; + let args, at, i, atLength; + switch (header.type) { + case 0: + const dictionary = {}; + const dictionaryFlags = readUint16(data, position); + dictionary.huffman = !!(dictionaryFlags & 1); + dictionary.refinement = !!(dictionaryFlags & 2); + dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; + dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; + dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; + dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; + dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); + dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); + dictionary.template = dictionaryFlags >> 10 & 3; + dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; + position += 2; + if (!dictionary.huffman) { + atLength = dictionary.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + dictionary.at = at; + } + if (dictionary.refinement && !dictionary.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + dictionary.refinementAt = at; + } + dictionary.numberOfExportedSymbols = readUint32(data, position); + position += 4; + dictionary.numberOfNewSymbols = readUint32(data, position); + position += 4; + args = [dictionary, header.number, header.referredTo, data, position, end]; + break; + case 6: + case 7: + const textRegion = {}; + textRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const textRegionSegmentFlags = readUint16(data, position); + position += 2; + textRegion.huffman = !!(textRegionSegmentFlags & 1); + textRegion.refinement = !!(textRegionSegmentFlags & 2); + textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3; + textRegion.stripSize = 1 << textRegion.logStripSize; + textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; + textRegion.transposed = !!(textRegionSegmentFlags & 64); + textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; + textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; + textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; + textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; + if (textRegion.huffman) { + const textRegionHuffmanFlags = readUint16(data, position); + position += 2; + textRegion.huffmanFS = textRegionHuffmanFlags & 3; + textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; + textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; + textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; + textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; + textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; + textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; + textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000); + } + if (textRegion.refinement && !textRegion.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + textRegion.refinementAt = at; + } + textRegion.numberOfSymbolInstances = readUint32(data, position); + position += 4; + args = [textRegion, header.referredTo, data, position, end]; + break; + case 16: + const patternDictionary = {}; + const patternDictionaryFlags = data[position++]; + patternDictionary.mmr = !!(patternDictionaryFlags & 1); + patternDictionary.template = patternDictionaryFlags >> 1 & 3; + patternDictionary.patternWidth = data[position++]; + patternDictionary.patternHeight = data[position++]; + patternDictionary.maxPatternIndex = readUint32(data, position); + position += 4; + args = [patternDictionary, header.number, data, position, end]; + break; + case 22: + case 23: + const halftoneRegion = {}; + halftoneRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const halftoneRegionFlags = data[position++]; + halftoneRegion.mmr = !!(halftoneRegionFlags & 1); + halftoneRegion.template = halftoneRegionFlags >> 1 & 3; + halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8); + halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7; + halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1; + halftoneRegion.gridWidth = readUint32(data, position); + position += 4; + halftoneRegion.gridHeight = readUint32(data, position); + position += 4; + halftoneRegion.gridOffsetX = readUint32(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridOffsetY = readUint32(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridVectorX = readUint16(data, position); + position += 2; + halftoneRegion.gridVectorY = readUint16(data, position); + position += 2; + args = [halftoneRegion, header.referredTo, data, position, end]; + break; + case 38: + case 39: + const genericRegion = {}; + genericRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const genericRegionSegmentFlags = data[position++]; + genericRegion.mmr = !!(genericRegionSegmentFlags & 1); + genericRegion.template = genericRegionSegmentFlags >> 1 & 3; + genericRegion.prediction = !!(genericRegionSegmentFlags & 8); + if (!genericRegion.mmr) { + atLength = genericRegion.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + genericRegion.at = at; + } + args = [genericRegion, data, position, end]; + break; + case 48: + const pageInfo = { + width: readUint32(data, position), + height: readUint32(data, position + 4), + resolutionX: readUint32(data, position + 8), + resolutionY: readUint32(data, position + 12) + }; + if (pageInfo.height === 0xffffffff) { + delete pageInfo.height; + } + const pageSegmentFlags = data[position + 16]; + readUint16(data, position + 17); + pageInfo.lossless = !!(pageSegmentFlags & 1); + pageInfo.refinement = !!(pageSegmentFlags & 2); + pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; + pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; + pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); + pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); + args = [pageInfo]; + break; + case 49: + break; + case 50: + break; + case 51: + break; + case 53: + args = [header.number, data, position, end]; + break; + case 62: + break; + default: + throw new Jbig2Error(`segment type ${header.typeName}(${header.type}) is not implemented`); + } + const callbackName = "on" + header.typeName; + if (callbackName in visitor) { + visitor[callbackName].apply(visitor, args); + } +} +function processSegments(segments, visitor) { + for (let i = 0, ii = segments.length; i < ii; i++) { + processSegment(segments[i], visitor); + } +} +function parseJbig2Chunks(chunks) { + const visitor = new SimpleSegmentVisitor(); + for (let i = 0, ii = chunks.length; i < ii; i++) { + const chunk = chunks[i]; + const segments = readSegments({}, chunk.data, chunk.start, chunk.end); + processSegments(segments, visitor); + } + return visitor.buffer; +} +function parseJbig2(data) { + throw new Error("Not implemented: parseJbig2"); +} +class SimpleSegmentVisitor { + onPageInformation(info) { + this.currentPageInfo = info; + const rowSize = info.width + 7 >> 3; + const buffer = new Uint8ClampedArray(rowSize * info.height); + if (info.defaultPixelValue) { + buffer.fill(0xff); + } + this.buffer = buffer; + } + drawBitmap(regionInfo, bitmap) { + const pageInfo = this.currentPageInfo; + const width = regionInfo.width, + height = regionInfo.height; + const rowSize = pageInfo.width + 7 >> 3; + const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; + const buffer = this.buffer; + const mask0 = 128 >> (regionInfo.x & 7); + let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); + let i, j, mask, offset; + switch (combinationOperator) { + case 0: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] |= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + case 2: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] ^= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + onImmediateGenericRegion(region, data, start, end) { + const regionInfo = region.info; + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessGenericRegion() { + this.onImmediateGenericRegion(...arguments); + } + onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { + let huffmanTables, huffmanInput; + if (dictionary.huffman) { + huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables); + huffmanInput = new Reader(data, start, end); + } + let symbols = this.symbols; + if (!symbols) { + this.symbols = symbols = {}; + } + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); + } + } + const decodingContext = new DecodingContext(data, start, end); + symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput); + } + onImmediateTextRegion(region, referredSegments, data, start, end) { + const regionInfo = region.info; + let huffmanTables, huffmanInput; + const symbols = this.symbols; + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); + } + } + const symbolCodeLength = log2(inputSymbols.length); + if (region.huffman) { + huffmanInput = new Reader(data, start, end); + huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput); + } + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessTextRegion() { + this.onImmediateTextRegion(...arguments); + } + onPatternDictionary(dictionary, currentSegment, data, start, end) { + let patterns = this.patterns; + if (!patterns) { + this.patterns = patterns = {}; + } + const decodingContext = new DecodingContext(data, start, end); + patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext); + } + onImmediateHalftoneRegion(region, referredSegments, data, start, end) { + const patterns = this.patterns[referredSegments[0]]; + const regionInfo = region.info; + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessHalftoneRegion() { + this.onImmediateHalftoneRegion(...arguments); + } + onTables(currentSegment, data, start, end) { + let customTables = this.customTables; + if (!customTables) { + this.customTables = customTables = {}; + } + customTables[currentSegment] = decodeTablesSegment(data, start, end); + } +} +class HuffmanLine { + constructor(lineData) { + if (lineData.length === 2) { + this.isOOB = true; + this.rangeLow = 0; + this.prefixLength = lineData[0]; + this.rangeLength = 0; + this.prefixCode = lineData[1]; + this.isLowerRange = false; + } else { + this.isOOB = false; + this.rangeLow = lineData[0]; + this.prefixLength = lineData[1]; + this.rangeLength = lineData[2]; + this.prefixCode = lineData[3]; + this.isLowerRange = lineData[4] === "lower"; + } + } +} +class HuffmanTreeNode { + constructor(line) { + this.children = []; + if (line) { + this.isLeaf = true; + this.rangeLength = line.rangeLength; + this.rangeLow = line.rangeLow; + this.isLowerRange = line.isLowerRange; + this.isOOB = line.isOOB; + } else { + this.isLeaf = false; + } + } + buildTree(line, shift) { + const bit = line.prefixCode >> shift & 1; + if (shift <= 0) { + this.children[bit] = new HuffmanTreeNode(line); + } else { + let node = this.children[bit]; + if (!node) { + this.children[bit] = node = new HuffmanTreeNode(null); + } + node.buildTree(line, shift - 1); + } + } + decodeNode(reader) { + if (this.isLeaf) { + if (this.isOOB) { + return null; + } + const htOffset = reader.readBits(this.rangeLength); + return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset); + } + const node = this.children[reader.readBit()]; + if (!node) { + throw new Jbig2Error("invalid Huffman data"); + } + return node.decodeNode(reader); + } +} +class HuffmanTable { + constructor(lines, prefixCodesDone) { + if (!prefixCodesDone) { + this.assignPrefixCodes(lines); + } + this.rootNode = new HuffmanTreeNode(null); + for (let i = 0, ii = lines.length; i < ii; i++) { + const line = lines[i]; + if (line.prefixLength > 0) { + this.rootNode.buildTree(line, line.prefixLength - 1); + } + } + } + decode(reader) { + return this.rootNode.decodeNode(reader); + } + assignPrefixCodes(lines) { + const linesLength = lines.length; + let prefixLengthMax = 0; + for (let i = 0; i < linesLength; i++) { + prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength); + } + const histogram = new Uint32Array(prefixLengthMax + 1); + for (let i = 0; i < linesLength; i++) { + histogram[lines[i].prefixLength]++; + } + let currentLength = 1, + firstCode = 0, + currentCode, + currentTemp, + line; + histogram[0] = 0; + while (currentLength <= prefixLengthMax) { + firstCode = firstCode + histogram[currentLength - 1] << 1; + currentCode = firstCode; + currentTemp = 0; + while (currentTemp < linesLength) { + line = lines[currentTemp]; + if (line.prefixLength === currentLength) { + line.prefixCode = currentCode; + currentCode++; + } + currentTemp++; + } + currentLength++; + } + } +} +function decodeTablesSegment(data, start, end) { + const flags = data[start]; + const lowestValue = readUint32(data, start + 1) & 0xffffffff; + const highestValue = readUint32(data, start + 5) & 0xffffffff; + const reader = new Reader(data, start + 9, end); + const prefixSizeBits = (flags >> 1 & 7) + 1; + const rangeSizeBits = (flags >> 4 & 7) + 1; + const lines = []; + let prefixLength, + rangeLength, + currentRangeLow = lowestValue; + do { + prefixLength = reader.readBits(prefixSizeBits); + rangeLength = reader.readBits(rangeSizeBits); + lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0])); + currentRangeLow += 1 << rangeLength; + } while (currentRangeLow < highestValue); + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"])); + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0])); + if (flags & 1) { + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([prefixLength, 0])); + } + return new HuffmanTable(lines, false); +} +const standardTablesCache = {}; +function getStandardTable(number) { + let table = standardTablesCache[number]; + if (table) { + return table; + } + let lines; + switch (number) { + case 1: + lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]]; + break; + case 2: + lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 0x3e], [6, 0x3f]]; + break; + case 3: + lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]]; + break; + case 4: + lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 0x1f]]; + break; + case 5: + lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]]; + break; + case 6: + lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]]; + break; + case 7: + lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]]; + break; + case 8: + lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]]; + break; + case 9: + lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], [39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], [779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]]; + break; + case 10: + lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], [2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]]; + break; + case 11: + lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; + break; + case 12: + lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 0xfe], [73, 8, 32, 0xff]]; + break; + case 13: + lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; + break; + case 14: + lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]]; + break; + case 15: + lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 0x7e, "lower"], [25, 7, 32, 0x7f]]; + break; + default: + throw new Jbig2Error(`standard table B.${number} does not exist`); + } + for (let i = 0, ii = lines.length; i < ii; i++) { + lines[i] = new HuffmanLine(lines[i]); + } + table = new HuffmanTable(lines, true); + standardTablesCache[number] = table; + return table; +} +class Reader { + constructor(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + this.position = start; + this.shift = -1; + this.currentByte = 0; + } + readBit() { + if (this.shift < 0) { + if (this.position >= this.end) { + throw new Jbig2Error("end of data while reading bit"); + } + this.currentByte = this.data[this.position++]; + this.shift = 7; + } + const bit = this.currentByte >> this.shift & 1; + this.shift--; + return bit; + } + readBits(numBits) { + let result = 0, + i; + for (i = numBits - 1; i >= 0; i--) { + result |= this.readBit() << i; + } + return result; + } + byteAlign() { + this.shift = -1; + } + next() { + if (this.position >= this.end) { + return -1; + } + return this.data[this.position++]; + } +} +function getCustomHuffmanTable(index, referredTo, customTables) { + let currentIndex = 0; + for (let i = 0, ii = referredTo.length; i < ii; i++) { + const table = customTables[referredTo[i]]; + if (table) { + if (index === currentIndex) { + return table; + } + currentIndex++; + } + } + throw new Jbig2Error("can't find custom Huffman table"); +} +function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) { + const codes = []; + for (let i = 0; i <= 34; i++) { + const codeLength = reader.readBits(4); + codes.push(new HuffmanLine([i, codeLength, 0, 0])); + } + const runCodesTable = new HuffmanTable(codes, false); + codes.length = 0; + for (let i = 0; i < numberOfSymbols;) { + const codeLength = runCodesTable.decode(reader); + if (codeLength >= 32) { + let repeatedLength, numberOfRepeats, j; + switch (codeLength) { + case 32: + if (i === 0) { + throw new Jbig2Error("no previous value in symbol ID table"); + } + numberOfRepeats = reader.readBits(2) + 3; + repeatedLength = codes[i - 1].prefixLength; + break; + case 33: + numberOfRepeats = reader.readBits(3) + 3; + repeatedLength = 0; + break; + case 34: + numberOfRepeats = reader.readBits(7) + 11; + repeatedLength = 0; + break; + default: + throw new Jbig2Error("invalid code length in symbol ID table"); + } + for (j = 0; j < numberOfRepeats; j++) { + codes.push(new HuffmanLine([i, repeatedLength, 0, 0])); + i++; + } + } else { + codes.push(new HuffmanLine([i, codeLength, 0, 0])); + i++; + } + } + reader.byteAlign(); + const symbolIDTable = new HuffmanTable(codes, false); + let customIndex = 0, + tableFirstS, + tableDeltaS, + tableDeltaT; + switch (textRegion.huffmanFS) { + case 0: + case 1: + tableFirstS = getStandardTable(textRegion.huffmanFS + 6); + break; + case 3: + tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman FS selector"); + } + switch (textRegion.huffmanDS) { + case 0: + case 1: + case 2: + tableDeltaS = getStandardTable(textRegion.huffmanDS + 8); + break; + case 3: + tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DS selector"); + } + switch (textRegion.huffmanDT) { + case 0: + case 1: + case 2: + tableDeltaT = getStandardTable(textRegion.huffmanDT + 11); + break; + case 3: + tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DT selector"); + } + if (textRegion.refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); + } + return { + symbolIDTable, + tableFirstS, + tableDeltaS, + tableDeltaT + }; +} +function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) { + let customIndex = 0, + tableDeltaHeight, + tableDeltaWidth; + switch (dictionary.huffmanDHSelector) { + case 0: + case 1: + tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4); + break; + case 3: + tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DH selector"); + } + switch (dictionary.huffmanDWSelector) { + case 0: + case 1: + tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2); + break; + case 3: + tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DW selector"); + } + let tableBitmapSize, tableAggregateInstances; + if (dictionary.bitmapSizeSelector) { + tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + } else { + tableBitmapSize = getStandardTable(1); + } + if (dictionary.aggregationInstancesSelector) { + tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables); + } else { + tableAggregateInstances = getStandardTable(1); + } + return { + tableDeltaHeight, + tableDeltaWidth, + tableBitmapSize, + tableAggregateInstances + }; +} +function readUncompressedBitmap(reader, width, height) { + const bitmap = []; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + for (let x = 0; x < width; x++) { + row[x] = reader.readBit(); + } + reader.byteAlign(); + } + return bitmap; +} +function decodeMMRBitmap(input, width, height, endOfBlock) { + const params = { + K: -1, + Columns: width, + Rows: height, + BlackIs1: true, + EndOfBlock: endOfBlock + }; + const decoder = new CCITTFaxDecoder(input, params); + const bitmap = []; + let currentByte, + eof = false; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + let shift = -1; + for (let x = 0; x < width; x++) { + if (shift < 0) { + currentByte = decoder.readNextChar(); + if (currentByte === -1) { + currentByte = 0; + eof = true; + } + shift = 7; + } + row[x] = currentByte >> shift & 1; + shift--; + } + } + if (endOfBlock && !eof) { + const lookForEOFLimit = 5; + for (let i = 0; i < lookForEOFLimit; i++) { + if (decoder.readNextChar() === -1) { + break; + } + } + } + return bitmap; +} +class Jbig2Image { + parseChunks(chunks) { + return parseJbig2Chunks(chunks); + } + parse(data) { + throw new Error("Not implemented: Jbig2Image.parse"); + } +} + +;// ./src/core/jbig2_stream.js + + + + + +class Jbig2Stream extends DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + this.decodeImage(); + } + decodeImage(bytes) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + const jbig2Image = new Jbig2Image(); + const chunks = []; + if (this.params instanceof Dict) { + const globalsStream = this.params.get("JBIG2Globals"); + if (globalsStream instanceof BaseStream) { + const globals = globalsStream.getBytes(); + chunks.push({ + data: globals, + start: 0, + end: globals.length + }); + } + } + chunks.push({ + data: bytes, + start: 0, + end: bytes.length + }); + const data = jbig2Image.parseChunks(chunks); + const dataLength = data.length; + for (let i = 0; i < dataLength; i++) { + data[i] ^= 0xff; + } + this.buffer = data; + this.bufferLength = dataLength; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } +} + +;// ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/core/jpg.js + + + +class JpegError extends BaseException { + constructor(msg) { + super(msg, "JpegError"); + } +} +class DNLMarkerError extends BaseException { + constructor(message, scanLines) { + super(message, "DNLMarkerError"); + this.scanLines = scanLines; + } +} +class EOIMarkerError extends BaseException { + constructor(msg) { + super(msg, "EOIMarkerError"); + } +} +const dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]); +const dctCos1 = 4017; +const dctSin1 = 799; +const dctCos3 = 3406; +const dctSin3 = 2276; +const dctCos6 = 1567; +const dctSin6 = 3784; +const dctSqrt2 = 5793; +const dctSqrt1d2 = 2896; +function buildHuffmanTable(codeLengths, values) { + let k = 0, + i, + j, + length = 16; + while (length > 0 && !codeLengths[length - 1]) { + length--; + } + const code = [{ + children: [], + index: 0 + }]; + let p = code[0], + q; + for (i = 0; i < length; i++) { + for (j = 0; j < codeLengths[i]; j++) { + p = code.pop(); + p.children[p.index] = values[k]; + while (p.index > 0) { + p = code.pop(); + } + p.index++; + code.push(p); + while (code.length <= i) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + k++; + } + if (i + 1 < length) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; +} +function getBlockBufferOffset(component, row, col) { + return 64 * ((component.blocksPerLine + 1) * row + col); +} +function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) { + const mcusPerLine = frame.mcusPerLine; + const progressive = frame.progressive; + const startOffset = offset; + let bitsData = 0, + bitsCount = 0; + function readBit() { + if (bitsCount > 0) { + bitsCount--; + return bitsData >> bitsCount & 1; + } + bitsData = data[offset++]; + if (bitsData === 0xff) { + const nextByte = data[offset++]; + if (nextByte) { + if (nextByte === 0xdc && parseDNLMarker) { + offset += 2; + const scanLines = readUint16(data, offset); + offset += 2; + if (scanLines > 0 && scanLines !== frame.scanLines) { + throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines); + } + } else if (nextByte === 0xd9) { + if (parseDNLMarker) { + const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); + if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) { + throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines); + } + } + throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data"); + } + throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`); + } + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + let node = tree; + while (true) { + node = node[readBit()]; + switch (typeof node) { + case "number": + return node; + case "object": + continue; + } + throw new JpegError("invalid huffman sequence"); + } + } + function receive(length) { + let n = 0; + while (length > 0) { + n = n << 1 | readBit(); + length--; + } + return n; + } + function receiveAndExtend(length) { + if (length === 1) { + return readBit() === 1 ? 1 : -1; + } + const n = receive(length); + if (n >= 1 << length - 1) { + return n; + } + return n + (-1 << length) + 1; + } + function decodeBaseline(component, blockOffset) { + const t = decodeHuffman(component.huffmanTableDC); + const diff = t === 0 ? 0 : receiveAndExtend(t); + component.blockData[blockOffset] = component.pred += diff; + let k = 1; + while (k < 64) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = receiveAndExtend(s); + k++; + } + } + function decodeDCFirst(component, blockOffset) { + const t = decodeHuffman(component.huffmanTableDC); + const diff = t === 0 ? 0 : receiveAndExtend(t) << successive; + component.blockData[blockOffset] = component.pred += diff; + } + function decodeDCSuccessive(component, blockOffset) { + component.blockData[blockOffset] |= readBit() << successive; + } + let eobrun = 0; + function decodeACFirst(component, blockOffset) { + if (eobrun > 0) { + eobrun--; + return; + } + let k = spectralStart; + const e = spectralEnd; + while (k <= e) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive); + k++; + } + } + let successiveACState = 0, + successiveACNextValue; + function decodeACSuccessive(component, blockOffset) { + let k = spectralStart; + const e = spectralEnd; + let r = 0; + let s; + let rs; + while (k <= e) { + const offsetZ = blockOffset + dctZigZag[k]; + const sign = component.blockData[offsetZ] < 0 ? -1 : 1; + switch (successiveACState) { + case 0: + rs = decodeHuffman(component.huffmanTableAC); + s = rs & 15; + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r); + successiveACState = 4; + } else { + r = 16; + successiveACState = 1; + } + } else { + if (s !== 1) { + throw new JpegError("invalid ACn encoding"); + } + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + case 1: + case 2: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + r--; + if (r === 0) { + successiveACState = successiveACState === 2 ? 3 : 0; + } + } + break; + case 3: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + component.blockData[offsetZ] = successiveACNextValue << successive; + successiveACState = 0; + } + break; + case 4: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } + break; + } + k++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) { + successiveACState = 0; + } + } + } + let blockRow = 0; + function decodeMcu(component, decode, mcu, row, col) { + const mcuRow = mcu / mcusPerLine | 0; + const mcuCol = mcu % mcusPerLine; + blockRow = mcuRow * component.v + row; + const blockCol = mcuCol * component.h + col; + const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, blockOffset); + } + function decodeBlock(component, decode, mcu) { + blockRow = mcu / component.blocksPerLine | 0; + const blockCol = mcu % component.blocksPerLine; + const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, blockOffset); + } + const componentsLength = components.length; + let component, i, j, k, n; + let decodeFn; + if (progressive) { + if (spectralStart === 0) { + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + } else { + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } + } else { + decodeFn = decodeBaseline; + } + let mcu = 0, + fileMarker; + const mcuExpected = componentsLength === 1 ? components[0].blocksPerLine * components[0].blocksPerColumn : mcusPerLine * frame.mcusPerColumn; + let h, v; + while (mcu <= mcuExpected) { + const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected; + if (mcuToRead > 0) { + for (i = 0; i < componentsLength; i++) { + components[i].pred = 0; + } + eobrun = 0; + if (componentsLength === 1) { + component = components[0]; + for (n = 0; n < mcuToRead; n++) { + decodeBlock(component, decodeFn, mcu); + mcu++; + } + } else { + for (n = 0; n < mcuToRead; n++) { + for (i = 0; i < componentsLength; i++) { + component = components[i]; + h = component.h; + v = component.v; + for (j = 0; j < v; j++) { + for (k = 0; k < h; k++) { + decodeMcu(component, decodeFn, mcu, j, k); + } + } + } + mcu++; + } + } + } + bitsCount = 0; + fileMarker = findNextFileMarker(data, offset); + if (!fileMarker) { + break; + } + if (fileMarker.invalid) { + const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive"; + warn(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`); + offset = fileMarker.offset; + } + if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) { + offset += 2; + } else { + break; + } + } + return offset - startOffset; +} +function quantizeAndInverse(component, blockBufferOffset, p) { + const qt = component.quantizationTable, + blockData = component.blockData; + let v0, v1, v2, v3, v4, v5, v6, v7; + let p0, p1, p2, p3, p4, p5, p6, p7; + let t; + if (!qt) { + throw new JpegError("missing required Quantization Table."); + } + for (let row = 0; row < 64; row += 8) { + p0 = blockData[blockBufferOffset + row]; + p1 = blockData[blockBufferOffset + row + 1]; + p2 = blockData[blockBufferOffset + row + 2]; + p3 = blockData[blockBufferOffset + row + 3]; + p4 = blockData[blockBufferOffset + row + 4]; + p5 = blockData[blockBufferOffset + row + 5]; + p6 = blockData[blockBufferOffset + row + 6]; + p7 = blockData[blockBufferOffset + row + 7]; + p0 *= qt[row]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 512 >> 10; + p[row] = t; + p[row + 1] = t; + p[row + 2] = t; + p[row + 3] = t; + p[row + 4] = t; + p[row + 5] = t; + p[row + 6] = t; + p[row + 7] = t; + continue; + } + p1 *= qt[row + 1]; + p2 *= qt[row + 2]; + p3 *= qt[row + 3]; + p4 *= qt[row + 4]; + p5 *= qt[row + 5]; + p6 *= qt[row + 6]; + p7 *= qt[row + 7]; + v0 = dctSqrt2 * p0 + 128 >> 8; + v1 = dctSqrt2 * p4 + 128 >> 8; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8; + v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8; + v5 = p3 << 4; + v6 = p5 << 4; + v0 = v0 + v1 + 1 >> 1; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; + v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p[row] = v0 + v7; + p[row + 7] = v0 - v7; + p[row + 1] = v1 + v6; + p[row + 6] = v1 - v6; + p[row + 2] = v2 + v5; + p[row + 5] = v2 - v5; + p[row + 3] = v3 + v4; + p[row + 4] = v3 - v4; + } + for (let col = 0; col < 8; ++col) { + p0 = p[col]; + p1 = p[col + 8]; + p2 = p[col + 16]; + p3 = p[col + 24]; + p4 = p[col + 32]; + p5 = p[col + 40]; + p6 = p[col + 48]; + p7 = p[col + 56]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 8192 >> 14; + if (t < -2040) { + t = 0; + } else if (t >= 2024) { + t = 255; + } else { + t = t + 2056 >> 4; + } + blockData[blockBufferOffset + col] = t; + blockData[blockBufferOffset + col + 8] = t; + blockData[blockBufferOffset + col + 16] = t; + blockData[blockBufferOffset + col + 24] = t; + blockData[blockBufferOffset + col + 32] = t; + blockData[blockBufferOffset + col + 40] = t; + blockData[blockBufferOffset + col + 48] = t; + blockData[blockBufferOffset + col + 56] = t; + continue; + } + v0 = dctSqrt2 * p0 + 2048 >> 12; + v1 = dctSqrt2 * p4 + 2048 >> 12; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12; + v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12; + v5 = p3; + v6 = p5; + v0 = (v0 + v1 + 1 >> 1) + 4112; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; + v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p0 = v0 + v7; + p7 = v0 - v7; + p1 = v1 + v6; + p6 = v1 - v6; + p2 = v2 + v5; + p5 = v2 - v5; + p3 = v3 + v4; + p4 = v3 - v4; + if (p0 < 16) { + p0 = 0; + } else if (p0 >= 4080) { + p0 = 255; + } else { + p0 >>= 4; + } + if (p1 < 16) { + p1 = 0; + } else if (p1 >= 4080) { + p1 = 255; + } else { + p1 >>= 4; + } + if (p2 < 16) { + p2 = 0; + } else if (p2 >= 4080) { + p2 = 255; + } else { + p2 >>= 4; + } + if (p3 < 16) { + p3 = 0; + } else if (p3 >= 4080) { + p3 = 255; + } else { + p3 >>= 4; + } + if (p4 < 16) { + p4 = 0; + } else if (p4 >= 4080) { + p4 = 255; + } else { + p4 >>= 4; + } + if (p5 < 16) { + p5 = 0; + } else if (p5 >= 4080) { + p5 = 255; + } else { + p5 >>= 4; + } + if (p6 < 16) { + p6 = 0; + } else if (p6 >= 4080) { + p6 = 255; + } else { + p6 >>= 4; + } + if (p7 < 16) { + p7 = 0; + } else if (p7 >= 4080) { + p7 = 255; + } else { + p7 >>= 4; + } + blockData[blockBufferOffset + col] = p0; + blockData[blockBufferOffset + col + 8] = p1; + blockData[blockBufferOffset + col + 16] = p2; + blockData[blockBufferOffset + col + 24] = p3; + blockData[blockBufferOffset + col + 32] = p4; + blockData[blockBufferOffset + col + 40] = p5; + blockData[blockBufferOffset + col + 48] = p6; + blockData[blockBufferOffset + col + 56] = p7; + } +} +function buildComponentData(frame, component) { + const blocksPerLine = component.blocksPerLine; + const blocksPerColumn = component.blocksPerColumn; + const computationBuffer = new Int16Array(64); + for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) { + const offset = getBlockBufferOffset(component, blockRow, blockCol); + quantizeAndInverse(component, offset, computationBuffer); + } + } + return component.blockData; +} +function findNextFileMarker(data, currentPos, startPos = currentPos) { + const maxPos = data.length - 1; + let newPos = startPos < currentPos ? startPos : currentPos; + if (currentPos >= maxPos) { + return null; + } + const currentMarker = readUint16(data, currentPos); + if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { + return { + invalid: null, + marker: currentMarker, + offset: currentPos + }; + } + let newMarker = readUint16(data, newPos); + while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { + if (++newPos >= maxPos) { + return null; + } + newMarker = readUint16(data, newPos); + } + return { + invalid: currentMarker.toString(16), + marker: newMarker, + offset: newPos + }; +} +function prepareComponents(frame) { + const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); + const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); + for (const component of frame.components) { + const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); + const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); + const blocksPerLineForMcu = mcusPerLine * component.h; + const blocksPerColumnForMcu = mcusPerColumn * component.v; + const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); + component.blockData = new Int16Array(blocksBufferSize); + component.blocksPerLine = blocksPerLine; + component.blocksPerColumn = blocksPerColumn; + } + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; +} +function readDataBlock(data, offset) { + const length = readUint16(data, offset); + offset += 2; + let endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, endOffset, offset); + if (fileMarker?.invalid) { + warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); + endOffset = fileMarker.offset; + } + const array = data.subarray(offset, endOffset); + offset += array.length; + return { + appData: array, + newOffset: offset + }; +} +function skipData(data, offset) { + const length = readUint16(data, offset); + offset += 2; + const endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, endOffset, offset); + if (fileMarker?.invalid) { + return fileMarker.offset; + } + return endOffset; +} +class JpegImage { + constructor({ + decodeTransform = null, + colorTransform = -1 + } = {}) { + this._decodeTransform = decodeTransform; + this._colorTransform = colorTransform; + } + static canUseImageDecoder(data, colorTransform = -1) { + let offset = 0; + let numComponents = null; + let fileMarker = readUint16(data, offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = readUint16(data, offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + switch (fileMarker) { + case 0xffc0: + case 0xffc1: + case 0xffc2: + numComponents = data[offset + (2 + 1 + 2 + 2)]; + break markerLoop; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; + } + offset = skipData(data, offset); + fileMarker = readUint16(data, offset); + offset += 2; + } + if (numComponents === 4) { + return false; + } + if (numComponents === 3 && colorTransform === 0) { + return false; + } + return true; + } + parse(data, { + dnlScanLines = null + } = {}) { + let offset = 0; + let jfif = null; + let adobe = null; + let frame, resetInterval; + let numSOSMarkers = 0; + const quantizationTables = []; + const huffmanTablesAC = [], + huffmanTablesDC = []; + let fileMarker = readUint16(data, offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = readUint16(data, offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + let i, j, l; + switch (fileMarker) { + case 0xffe0: + case 0xffe1: + case 0xffe2: + case 0xffe3: + case 0xffe4: + case 0xffe5: + case 0xffe6: + case 0xffe7: + case 0xffe8: + case 0xffe9: + case 0xffea: + case 0xffeb: + case 0xffec: + case 0xffed: + case 0xffee: + case 0xffef: + case 0xfffe: + const { + appData, + newOffset + } = readDataBlock(data, offset); + offset = newOffset; + if (fileMarker === 0xffe0) { + if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { + jfif = { + version: { + major: appData[5], + minor: appData[6] + }, + densityUnits: appData[7], + xDensity: appData[8] << 8 | appData[9], + yDensity: appData[10] << 8 | appData[11], + thumbWidth: appData[12], + thumbHeight: appData[13], + thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) + }; + } + } + if (fileMarker === 0xffee) { + if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) { + adobe = { + version: appData[5] << 8 | appData[6], + flags0: appData[7] << 8 | appData[8], + flags1: appData[9] << 8 | appData[10], + transformCode: appData[11] + }; + } + } + break; + case 0xffdb: + const quantizationTablesLength = readUint16(data, offset); + offset += 2; + const quantizationTablesEnd = quantizationTablesLength + offset - 2; + let z; + while (offset < quantizationTablesEnd) { + const quantizationTableSpec = data[offset++]; + const tableData = new Uint16Array(64); + if (quantizationTableSpec >> 4 === 0) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = data[offset++]; + } + } else if (quantizationTableSpec >> 4 === 1) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = readUint16(data, offset); + offset += 2; + } + } else { + throw new JpegError("DQT - invalid table spec"); + } + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + case 0xffc0: + case 0xffc1: + case 0xffc2: + if (frame) { + throw new JpegError("Only single frame JPEGs supported"); + } + offset += 2; + frame = {}; + frame.extended = fileMarker === 0xffc1; + frame.progressive = fileMarker === 0xffc2; + frame.precision = data[offset++]; + const sofScanLines = readUint16(data, offset); + offset += 2; + frame.scanLines = dnlScanLines || sofScanLines; + frame.samplesPerLine = readUint16(data, offset); + offset += 2; + frame.components = []; + frame.componentIds = {}; + const componentsCount = data[offset++]; + let maxH = 0, + maxV = 0; + for (i = 0; i < componentsCount; i++) { + const componentId = data[offset]; + const h = data[offset + 1] >> 4; + const v = data[offset + 1] & 15; + if (maxH < h) { + maxH = h; + } + if (maxV < v) { + maxV = v; + } + const qId = data[offset + 2]; + l = frame.components.push({ + h, + v, + quantizationId: qId, + quantizationTable: null + }); + frame.componentIds[componentId] = l - 1; + offset += 3; + } + frame.maxH = maxH; + frame.maxV = maxV; + prepareComponents(frame); + break; + case 0xffc4: + const huffmanLength = readUint16(data, offset); + offset += 2; + for (i = 2; i < huffmanLength;) { + const huffmanTableSpec = data[offset++]; + const codeLengths = new Uint8Array(16); + let codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) { + codeLengthSum += codeLengths[j] = data[offset]; + } + const huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) { + huffmanValues[j] = data[offset]; + } + i += 17 + codeLengthSum; + (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); + } + break; + case 0xffdd: + offset += 2; + resetInterval = readUint16(data, offset); + offset += 2; + break; + case 0xffda: + const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines; + offset += 2; + const selectorsCount = data[offset++], + components = []; + for (i = 0; i < selectorsCount; i++) { + const index = data[offset++]; + const componentIndex = frame.componentIds[index]; + const component = frame.components[componentIndex]; + component.index = index; + const tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + const spectralStart = data[offset++], + spectralEnd = data[offset++], + successiveApproximation = data[offset++]; + try { + const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker); + offset += processed; + } catch (ex) { + if (ex instanceof DNLMarkerError) { + warn(`${ex.message} -- attempting to re-parse the JPEG image.`); + return this.parse(data, { + dnlScanLines: ex.scanLines + }); + } else if (ex instanceof EOIMarkerError) { + warn(`${ex.message} -- ignoring the rest of the image data.`); + break markerLoop; + } + throw ex; + } + break; + case 0xffdc: + offset += 4; + break; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; + default: + const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3); + if (nextFileMarker?.invalid) { + warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid); + offset = nextFileMarker.offset; + break; + } + if (!nextFileMarker || offset >= data.length - 1) { + warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9)."); + break markerLoop; + } + throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16)); + } + fileMarker = readUint16(data, offset); + offset += 2; + } + if (!frame) { + throw new JpegError("JpegImage.parse - no frame data found."); + } + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; + this.components = []; + for (const component of frame.components) { + const quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } + this.components.push({ + index: component.index, + output: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV, + blocksPerLine: component.blocksPerLine, + blocksPerColumn: component.blocksPerColumn + }); + } + this.numComponents = this.components.length; + return undefined; + } + _getLinearizedBlockData(width, height, isSourcePDF = false) { + const scaleX = this.width / width, + scaleY = this.height / height; + let component, componentScaleX, componentScaleY, blocksPerScanline; + let x, y, i, j, k; + let index; + let offset = 0; + let output; + const numComponents = this.components.length; + const dataLength = width * height * numComponents; + const data = new Uint8ClampedArray(dataLength); + const xScaleBlockOffset = new Uint32Array(width); + const mask3LSB = 0xfffffff8; + let lastComponentScaleX; + for (i = 0; i < numComponents; i++) { + component = this.components[i]; + componentScaleX = component.scaleX * scaleX; + componentScaleY = component.scaleY * scaleY; + offset = i; + output = component.output; + blocksPerScanline = component.blocksPerLine + 1 << 3; + if (componentScaleX !== lastComponentScaleX) { + for (x = 0; x < width; x++) { + j = 0 | x * componentScaleX; + xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7; + } + lastComponentScaleX = componentScaleX; + } + for (y = 0; y < height; y++) { + j = 0 | y * componentScaleY; + index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; + for (x = 0; x < width; x++) { + data[offset] = output[index + xScaleBlockOffset[x]]; + offset += numComponents; + } + } + } + let transform = this._decodeTransform; + if (!isSourcePDF && numComponents === 4 && !transform) { + transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]); + } + if (transform) { + for (i = 0; i < dataLength;) { + for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { + data[i] = (data[i] * transform[k] >> 8) + transform[k + 1]; + } + } + } + return data; + } + get _isColorConversionNeeded() { + if (this.adobe) { + return !!this.adobe.transformCode; + } + if (this.numComponents === 3) { + if (this._colorTransform === 0) { + return false; + } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) { + return false; + } + return true; + } + if (this._colorTransform === 1) { + return true; + } + return false; + } + _convertYccToRgb(data) { + let Y, Cb, Cr; + for (let i = 0, length = data.length; i < length; i += 3) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = Y - 179.456 + 1.402 * Cr; + data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; + data[i + 2] = Y - 226.816 + 1.772 * Cb; + } + return data; + } + _convertYccToRgba(data, out) { + for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + out[j] = Y - 179.456 + 1.402 * Cr; + out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; + out[j + 2] = Y - 226.816 + 1.772 * Cb; + out[j + 3] = 255; + } + return out; + } + _convertYcckToRgb(data) { + let Y, Cb, Cr, k; + let offset = 0; + for (let i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + k = data[i + 3]; + data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); + data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); + data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); + } + return data.subarray(0, offset); + } + _convertYcckToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + const k = data[i + 3]; + data[i] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); + data[i + 1] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); + data[i + 2] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); + data[i + 3] = 255; + } + return data; + } + _convertYcckToCmyk(data) { + let Y, Cb, Cr; + for (let i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = 434.456 - Y - 1.402 * Cr; + data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr; + data[i + 2] = 481.816 - Y - 1.772 * Cb; + } + return data; + } + _convertCmykToRgb(data) { + let c, m, y, k; + let offset = 0; + for (let i = 0, length = data.length; i < length; i += 4) { + c = data[i]; + m = data[i + 1]; + y = data[i + 2]; + k = data[i + 3]; + data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); + data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); + data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); + } + return data.subarray(0, offset); + } + _convertCmykToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const c = data[i]; + const m = data[i + 1]; + const y = data[i + 2]; + const k = data[i + 3]; + data[i] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); + data[i + 1] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); + data[i + 2] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); + data[i + 3] = 255; + } + return data; + } + getData({ + width, + height, + forceRGBA = false, + forceRGB = false, + isSourcePDF = false + }) { + if (this.numComponents > 4) { + throw new JpegError("Unsupported color mode"); + } + const data = this._getLinearizedBlockData(width, height, isSourcePDF); + if (this.numComponents === 1 && (forceRGBA || forceRGB)) { + const len = data.length * (forceRGBA ? 4 : 3); + const rgbaData = new Uint8ClampedArray(len); + let offset = 0; + if (forceRGBA) { + grayToRGBA(data, new Uint32Array(rgbaData.buffer)); + } else { + for (const grayColor of data) { + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + } + } + return rgbaData; + } else if (this.numComponents === 3 && this._isColorConversionNeeded) { + if (forceRGBA) { + const rgbaData = new Uint8ClampedArray(data.length / 3 * 4); + return this._convertYccToRgba(data, rgbaData); + } + return this._convertYccToRgb(data); + } else if (this.numComponents === 4) { + if (this._isColorConversionNeeded) { + if (forceRGBA) { + return this._convertYcckToRgba(data); + } + if (forceRGB) { + return this._convertYcckToRgb(data); + } + return this._convertYcckToCmyk(data); + } else if (forceRGBA) { + return this._convertCmykToRgba(data); + } else if (forceRGB) { + return this._convertCmykToRgb(data); + } + } + return data; + } +} + +;// ./src/core/jpeg_stream.js + + + + +class JpegStream extends DecodeStream { + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + static get canUseImageDecoder() { + return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/jpeg") : Promise.resolve(false)); + } + static setOptions({ + isImageDecoderSupported = false + }) { + this.#isImageDecoderSupported = isImageDecoderSupported; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + this.decodeImage(); + } + get jpegOptions() { + const jpegOptions = { + decodeTransform: undefined, + colorTransform: undefined + }; + const decodeArr = this.dict.getArray("D", "Decode"); + if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) { + const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8; + const decodeArrLength = decodeArr.length; + const transform = new Int32Array(decodeArrLength); + let transformNeeded = false; + const maxValue = (1 << bitsPerComponent) - 1; + for (let i = 0; i < decodeArrLength; i += 2) { + transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0; + transform[i + 1] = decodeArr[i] * maxValue | 0; + if (transform[i] !== 256 || transform[i + 1] !== 0) { + transformNeeded = true; + } + } + if (transformNeeded) { + jpegOptions.decodeTransform = transform; + } + } + if (this.params instanceof Dict) { + const colorTransform = this.params.get("ColorTransform"); + if (Number.isInteger(colorTransform)) { + jpegOptions.colorTransform = colorTransform; + } + } + return shadow(this, "jpegOptions", jpegOptions); + } + #skipUselessBytes(data) { + for (let i = 0, ii = data.length - 1; i < ii; i++) { + if (data[i] === 0xff && data[i + 1] === 0xd8) { + if (i > 0) { + data = data.subarray(i); + } + break; + } + } + return data; + } + decodeImage(bytes) { + if (this.eof) { + return this.buffer; + } + bytes = this.#skipUselessBytes(bytes || this.bytes); + const jpegImage = new JpegImage(this.jpegOptions); + jpegImage.parse(bytes); + const data = jpegImage.getData({ + width: this.drawWidth, + height: this.drawHeight, + forceRGBA: this.forceRGBA, + forceRGB: this.forceRGB, + isSourcePDF: true + }); + this.buffer = data; + this.bufferLength = data.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } + async getTransferableImage() { + if (!(await JpegStream.canUseImageDecoder)) { + return null; + } + const jpegOptions = this.jpegOptions; + if (jpegOptions.decodeTransform) { + return null; + } + let decoder; + try { + const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes; + if (!bytes) { + return null; + } + const data = this.#skipUselessBytes(bytes); + if (!JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform)) { + return null; + } + decoder = new ImageDecoder({ + data, + type: "image/jpeg", + preferAnimation: false + }); + return (await decoder.decode()).image; + } catch (reason) { + warn(`getTransferableImage - failed: "${reason}".`); + return null; + } finally { + decoder?.close(); + } + } +} + +;// ./external/openjpeg/openjpeg.js +var OpenJPEG = (() => { + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + return function (moduleArg = {}) { + var moduleRtn; + var Module = moduleArg; + var readyPromiseResolve, readyPromiseReject; + var readyPromise = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var ENVIRONMENT_IS_WEB = true; + var ENVIRONMENT_IS_WORKER = false; + Module.decode = function (bytes, { + numComponents = 4, + isIndexedColormap = false, + smaskInData = false + }) { + const size = bytes.length; + const ptr = Module._malloc(size); + Module.HEAPU8.set(bytes, ptr); + const ret = Module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData); + Module._free(ptr); + if (ret) { + const { + errorMessages: errorMessages + } = Module; + if (errorMessages) { + delete Module.errorMessages; + return errorMessages; + } + return "Unknown error"; + } + const { + imageData: imageData + } = Module; + Module.imageData = null; + return imageData; + }; + var moduleOverrides = Object.assign({}, Module); + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var scriptDirectory = ""; + var read_, readAsync, readBinary; + if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document != "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptName) { + scriptDirectory = _scriptName; + } + if (scriptDirectory.startsWith("blob:")) { + scriptDirectory = ""; + } else { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); + } + read_ = url => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = url => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = (url, onload, onerror) => { + fetch(url, { + credentials: "same-origin" + }).then(response => { + if (response.ok) { + return response.arrayBuffer(); + } + return Promise.reject(new Error(response.status + " : " + response.url)); + }).then(onload, onerror); + }; + } else {} + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.error.bind(console); + Object.assign(Module, moduleOverrides); + moduleOverrides = null; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + if (Module["quit"]) quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; + function intArrayFromBase64(s) { + var decoded = atob(s); + var bytes = new Uint8Array(decoded.length); + for (var i = 0; i < decoded.length; ++i) { + bytes[i] = decoded.charCodeAt(i); + } + return bytes; + } + function tryParseAsDataURI(filename) { + if (!isDataURI(filename)) { + return; + } + return intArrayFromBase64(filename.slice(dataURIPrefix.length)); + } + var wasmMemory; + var ABORT = false; + var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module["HEAP8"] = HEAP8 = new Int8Array(b); + Module["HEAP16"] = HEAP16 = new Int16Array(b); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); + Module["HEAP32"] = HEAP32 = new Int32Array(b); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); + Module["HEAPF32"] = HEAPF32 = new Float32Array(b); + Module["HEAPF64"] = HEAPF64 = new Float64Array(b); + } + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + Module["monitorRunDependencies"]?.(runDependencies); + } + function removeRunDependency(id) { + runDependencies--; + Module["monitorRunDependencies"]?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + var isDataURI = filename => filename.startsWith(dataURIPrefix); + function findWasmBinary() { + var f = "data:application/octet-stream;base64,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A0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECUiAARAIABBACABEBUaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECUL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQSBrIgJBH0sNAAsLIAALJwEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBAEEAEGsgA0EQaiQAC+gFAQl/IAFFBEBBAA8LAn8gAEUE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ACAEIE5BCmpBAiAFEBpBAkcEQCAFQQFBAiAAKAK4ARtBlhJBABAPIAAoArgBRSFnDAELIE5BCmogTkEMakECEBEgTigCDCIBQZD/A0YNACABQdn/A0YEQCAAQYACNgIIIABBADYCzAEMAQsgBCkDCCKGAVAEfkIABSCGASAEKQM4fQtQBEAgAEHAADYCCCAFQQJBrD9BABAPDAELQQAhZyAFQQFB7D5BABAPCyBOQRBqJAAgZwsLACAABEAgABAQCwu0AQEBfyAAKAIMRQRAIAIgACgCJCABEQMADwsCQEEIEBQiA0UNACADIAI2AgQgAyABNgIAQQgQFCIBRQRAIAMQEA8LIAEgAzYCACAAIAAoAgRB5ABsIgI2AigDQCAAKAIYIAJKDQALIAEgACgCFDYCBCAAIAE2AhQgACAAKAIYQQFqNgIYIAAoAhwiAUUNACABKAIAQQA2AgggACABKAIENgIcIAAgACgCIEEBazYCICABEBALC/oCAQR/AkAgAEUNACAAKAKsKCIBBEAgACgCqCgiAgRAQQAhAQNAIAAoAqwoIAFBA3RqKAIAIgMEQCADEBAgACgCqCghAgsgAUEBaiIBIAJJDQALIAAoAqwoIQELIABBADYCqCggARAQIABBADYCrCgLIAAoArQoIgEEQCABEBAgAEEANgK0KAsgACgC0CsiAQRAIAEQECAAQQA2AtArCyAAKALsKyIBBEAgARAQIABBADYC7CsLIAAoAugrIgEEQCABEBAgAEEANgLoKwsgACgC/CsiAQRAIAEQECAAQQA2AoQsIABCADcC/CsLIAAoAvArIgEEQCAAKAL0KyIDBH9BACECA0AgASgCDCIEBEAgBBAQIAFBADYCDCAAKAL0KyEDCyABQRRqIQEgAkEBaiICIANJDQALIAAoAvArBSABCxAQIABBADYC8CsLIAAoAuQrIgEEQCABEBAgAEEANgLkKwsgACgC3CsiAUUNACABEBAgAEIANwLcKwsLyAcCEX8BfiAAKAIQIghBIE8EQCAAKQMIpw8LAkAgACgCFCIDQQROBEAgACgCACICQQNrKAIAIQEgACADQQRrIgM2AhQgACACQQRrNgIADAELIANBAEwEQAwBCyADQQFxIQ0gACgCACECAkAgA0EBRgRAQRghBAwBCyADQf7///8HcSEJQRghBANAIAAgAkEB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IABBADYCiAEgACgCZBAQIABBADYCZCAALQC8AUECcUUEQCAAKAKoARAQCyAAQdAAakEAQfAAEBUaIAAoAsABEDIgAEEANgLAASAAKALEARAyIABBADYCwAEgACgCyAEiAQRAIAEoAhwiAgRAIAIQECABQQA2AhwLIAEoAigiAgRAIAEoAiQEQANAIAIgBUEobCIDaigCJCIEBEAgBBAQIAEoAigiAiADakEANgIkCyACIANqKAIQIgQEQCAEEBAgASgCKCICIANqQQA2AhALIAIgA2ooAhgiBARAIAQQECABKAIoIgIgA2pBADYCGAsgBUEBaiIFIAEoAiRJDQALCyACEBAgAUEANgIoCyABEBALIABBADYCyAEgACgCSBAhIABBADYCSCAAKAJMECEgAEEANgJMIAAoAtQBIgMEQAJAIAMoAghFDQAgAygCDARAIANBADYCKANAIAMoAhhBAEoNAAsLIANBATYCECADKAIAEBAgAygCHCICRQ0AA0AgAigCBCEBIAIQECADIAE2AhwgASICDQALCyADKAIkIgIEQCACKAIEIgVBAEoEQEEAIQEDQCACKAIAIAFBDGxqIgQoAggiBgRAIAQoAgQgBhECACACKAIEIQULIAFBAWoiASAFSA0ACwsgAigCABAQIAIQEAsgAxAQCyAAQQA2AtQBIAAQEAsL5gMCCH8EfiAAKAIUKAIAKAIUIAFBzABsaiIJKAIMIgggACgCGCgCGCABQTRsaiIKNQIEIhBCAX0iEiAANQI8fCAQgKciCyAIIAtJGyEMIAkoAggiCCAKNQIAIhFCAX0iEyAANQI4fCARgKciCiAIIApJGyEKIAkoAgQiCCASIAA1AjR8IBCApyILIAggC0sbIQsgCSgCACIIIBMgADUCMHwgEYCnIg0gCCANSxshDUEAIQggACgCICgC0CsgAUG4CGxqKAIUIQ4CQCAJKAIUQQAgAmtBfyACG2oiAkUEQCAKIQAgDSEIIAshAQwBCyADQQFxIAJBAWsiD3QiCSANSQRAIA0gCWutQn8gAq0iEIZCf4V8IBCIpyEIC0EAIQBBACEBIANBAXYgD3QiAyALSQRAIAsgA2utQn8gAq0iEIZCf4V8IBCIpyEBCyAJIApJBEAgCiAJa61CfyACrSIQhkJ/hXwgEIinIQALIAMgDE8EQEEAIQwMAQsgDCAD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IABBADYCPCAAQucHNwI0IABBADYCLCAAQucHNwIkIABBADYCHCAAQucHNwIUIABBADYCDCAAQucHNwIEIABBQGshACACQQRqIgIgA0cNAAsLIAFBA3EiAUUNAEEAIQIDQCAAQQA2AgwgAELnBzcCBCAAQRBqIQAgAkEBaiICIAFHDQALCwv7BQEQfyMAQYACayIIJAACf0EBQRQQEyIGRQRAIAJBAUH0MEEAEA9BAAwBCyAGIAE2AgQgBiAANgIAIAggATYCACAIIAA2AoABA0AgCCAFIg1BAWoiBUECdCIHaiABQQFqQQJtIgM2AgAgCEGAAWogB2ogAEEBakECbSIHNgIAIAQgACABbCIJaiEEIAMhASAHIQAgCUEBSw0ACyAGIAQ2AgggBEUEQCAGEBBBAAwBCyAGIARBEBATIgM2AgwgA0UEQCACQQFB2hpBABAPIAYQEEEADAELIAYgBigCCCILQQR0NgIQIAMhACANBEAgAyAGKAIEIAYoAgBsQQR0aiIEIQEDQAJAIAggDkECdCICaigCACIJQQBMDQAgCUEBayEMQQAhBwJAIAhBgAFqIAJqKAIAIgJBAEwEQEEAIQUgCUEBRwRAIAlB/v///wdxIQoDQCAFIAxGIQ8gBUECaiEFIAEgBCAPGyIEIQEgB0ECaiIHIApHDQALCyAJQQFxDQEgBCEBDAILA0AgBCEFIAIhBANAAkAgACABNgIAIARBAUYEQCAAQRBqIQAgAUEQaiEBDAELIAAgATYCECABQRBqIQEgAEEgaiEAIARBAkohECAEQQJrIQQgEA0BCwsgASAFIAJBBHRqIAcgByAMRnJBAXEiChshBCABIAUgChshASAHQQFqIgcgCUcNAAsMAQsgASAEIAJBBHRqIAUgBSAMRnJBAXEiBRshESABIAQgBRshASARIQQLIA5BAWoiDiANRw0ACwsgAEEANgIAAkAgC0UNACALQQRPBEAgC0F8cSEAQQAhAQNAIANBADYCPCADQucHNwI0IANBADYCLCADQucHNwIkIANBADYCHCADQucHNwIUIANBADYCDCADQucHNwIEIANBQGshAyABQQRqIgEgAEcNAAsLIAtBA3EiAEUNAEEAIQEDQCADQQA2AgwgA0LnBzcCBCADQRBqIQMgAUEBaiIBIABHDQALCyAGCyESIAhBgAJqJAAgEgtTAQF/An8gAC0ADEH/AUYEQCAAQoD+g4DwADcCDEEAIAAoAggiASAAKAIETw0BGiAAIAFBAWo2AgggACABLQAAQYD+A3I2AgwLIABBADYCEEEBCwt+AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARBlIQAgASgCAEFAags2AgAgAA8LIAEgAkH+B2s2AgAgA0L/////////h4B/g0KAgICAgICA8D+EvwUgAAsLSQEBfwJAQQFBLBATIgEEQCABQQA2AhACQCAAQQBMBEAgAUEBQQgQEyIANgIkIABFDQEMAwsgAUEANgIMCyABEBALQQAhAQsgAQuRAgAgAEUEQEEADwsCfwJAIAFB/wBNDQACQEGU0AEoAgAoAgBFBEAgAUGAf3FBgL8DRg0CDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMAwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMAwsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMAwsLQZTHAUEZNgIAQX8MAQsgACABOgAAQQELC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC3MBBn8gACgCACIDLAAAQTBrIgFBCUsE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AyAAQRh2NgIUIAMgBDYCECADIABBCHZB/wFxNgIcIAMgAEEQdkH/AXE2AhggAkEBQc31ACADQRBqEA8MBwsgBSAITQRAIAYhBAwECyAFIQggBiAFEBciBA0DIAYQECACQQFB/w9BABAPQQAMBwsgBEECcUUEQCACQQFBwg9BABAPIAYQEEEADAcLIAAgBEH/////B3I2AmQgASAHIAVrrSINIAIgASgCKBEIACANUQ0DIAAtAGRBCHFFDQEgAkECQZIcQQAQDwsgBhAQQQEMBQsgAkEBQZIcQQAQDyAGEBBBAAwECyABIAQgBSACEBogBUcEQCACQQFBxBxBABAPIAQQEEEADAQLIAAgBCIGIAUgAiAKKAIEEQEADQALIAQQEEEADAILIAJBAUGiJUEAEA9BAAwBCyAGEBBBAAshDCADQfAAaiQAIAwL5gEBBn8gACgCCEE1IAIQJARAAkAgACgCCCIGKAIAIQMgBigCCCEFAkACQAJ/AkAgAwRAQQEhBCADQQFxIQcgA0EBRw0BQQAMAgsgBkEANgIADAILIANBfnEhAwNAAn9BACAERQ0AGkEAIAAgASACIAUoAgARAABFDQAaIAAgASACIAUoAgQRAABBAEcLIQQgBUEIaiEFIAhBAmoiCCADRw0ACyAERQshAyAHBEAgAw0CIAAgASACIAUoAgARAABBAEchBAsgBkEANgIAIARFDQILIAAoAgAaQQEPCyAGQQA2AgALC0EACwoAIAAoAgAaQQALFAAgACgCACIABEAgACABNgK4AQsLIQAgACgCACABEFMgAEEAOgB8IAAgASgCuEBBAXE2AoABCzIAIAJFBEBBAA8LIAAoAgAgASACIAMQSEUEQCADQQFBqS9BABAPQQAPCyAAIAIgAxBxC2kCAn8BfCMAQRBrIgMkACACBEADQCAAIANBCGoQRCABAn8gAysDCCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAs2AgAgAUEEaiEBIABBCGohACAEQQFqIgQgAkcNAAsLIANBEGokAAuEAQICfwF9IwBBEGsiAyQAIAIEQANAIAMgAC0AADoADyADIAAtAAE6AA4gAyAALQACOgANIAMgAC0AAzoADCABAn8gAyoCDCIFi0MAAABPXQRAIAWoDAELQYCAgIB4CzYCACABQQRqIQEgAEEEaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC0sBAn8jAEEQayIDJAAgAgRAA0AgACADQQxqQQQQESABIAMoAgw2AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtLAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMNgIAIAFBBGohASAAQQJqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALSgECfyMAQRBrIgMkACACBEADQCAAIANBCGoQRCABIAMrAwi2OAIAIAFBBGohASAAQQhqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALaAECfyMAQRBrIgMkACACBEADQCADIAAtAAA6AA8gAyAALQABOgAOIAMgAC0AAjoADSADIAAtAAM6AAwgASADKgIMOAIAIAFBBGohASAAQQRqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALTAECfyMAQRBrIgMkACACBEADQCAAIANBDGpBBBARIAEgAygCDLM4AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtMAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMszgCACABQQRqIQEgAEECaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC6oIAg1/AXsjAEEQayIIJAACfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyEJAkAgAkUEQCADQQFB8B9BABAPDAELIAAoAkghBkEBIQQgASAIQQhqQQEQESAIKAIIIgVBAk8EQCADQQJBxsgAQQAQDwwBCyACIAVBAWpHBEBBACEEIANBAkHwH0EAEA8MAQsCQCAGKAIQIgNFDQAgCSgC0CshBCADQQhPBEAgA0F4cSEGQQAhAgNAIARBADYCvEMgBEEANgKEOyAEQQA2AswyIARBADYClCogBEEANgLcISAEQQA2AqQZIARBADYC7BAgBEEANgK0CCAEQcDDAGohBCACQQhqIgIgBkcNAAsLIANBB3EiA0UNAEEAIQIDQCAEQQA2ArQIIARBuAhqIQQgAkEBaiICIANHDQALCyAJKALoKyICBH8gAhAQIAlBADYC6CsgCCgCCAUgBQtFBEBBASEEDAELA0AgAUEBaiIBIAhBDGpBARARAkAgCSgCgCxF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KT0ALgAobnVsbCkAKCVkLCVkKSAAJXN9CgAJCSB9CgBbREVWXSBEdW1wIGFuIGltYWdlX2NvbXBfaGVhZGVyIHN0cnVjdCB7CgBbREVWXSBEdW1wIGFuIGltYWdlX2hlYWRlciBzdHJ1Y3QgewoASW1hZ2UgaW5mbyB7CgAJIGRlZmF1bHQgdGlsZSB7CgAlcwkgY29tcG9uZW50ICVkIHsKAAkJIGNvbXAgJWQgewoACSBUaWxlIGluZGV4OiB7CgAJIE1hcmtlciBsaXN0OiB7CgBDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHsKAENvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyOiB7CgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveAoARm91bmQgYSBtaXNwbGFjZWQgJyVjJWMlYyVjJyBib3ggb3V0c2lkZSBqcDJoIGJveAoATWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IHNlY29uZCBib3ggbXVzdCBiZSBmaWxlIHR5cGUgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB3aXRoIEZUWVAgQm94CgBBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4CgAJCSBtY3Q9JXgKAAkJCSBjYmxrc3R5PSUjeAoACQkJIGNzdHk9JSN4CgAJCSBwcmc9JSN4CgBJbnRlZ2VyIG92ZXJmbG93CgAJIHRkeD0ldSwgdGR5PSV1CgAJIHR3PSV1LCB0aD0ldQoACSB0eDA9JXUsIHR5MD0ldQoASW52YWxpZCBjb21wb25lbnQgaW5kZXg6ICV1CgBTdHJlYW0gdG9vIHNob3J0CgBNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjdXJyZW50IHByZWNpbmN0IGNvZGVibG9jayBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQKAEVycm9yIHJlYWRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnQKAEEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnQKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaWxsZWdhbCB0aWxlIG9mZnNldAoASW52YWxpZCBwcmVjaW5jdAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHMKAEZhaWxlZCB0byBkZWNvZGUgYWxsIHVzZWQgY29tcG9uZW50cwoAU2l6ZSBvZiBjb2RlIGJsb2NrIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBNQ1QgbWFya2VycwoAQ29ycnVwdGVkIFBQTSBtYXJrZXJzCgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSByZXNvbHV0aW9ucwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zCgBJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zCgBXZSBkbyBub3Qgc3VwcG9ydCBST0kgaW4gZGVjb2RpbmcgSFQgY29kZWJsb2NrcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aG91dCBzYW1lIG51bWJlciBvZiBpbmRpeGVzCgBJbnZhbGlkIHRpbGVjLT53aW5feHh4IHZhbHVlcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgbGVzcyB0aGFuIDggYnl0ZXMKAENhbm5vdCBoYW5kbGUgWEwgYm94IG9mIGxlc3MgdGhhbiAxNiBieXRlcwoAQ29tcG9uZW50IGluZGV4ICV1IHVzZWQgc2V2ZXJhbCB0aW1lcwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAlZCBlbnRyaWVzCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtY3QgZGF0YSB3aXRoaW4gbXVsdGlwbGUgTUNUIHJlY29yZHMKAENhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yCgBvcGpfajJrX2FwcGx5X25iX3RpbGVfcGFydHNfY29ycmVjdGlvbiBlcnJvcgoAUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yCgBQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAVW5rbm93biBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyCgBFcnJvciByZWFkaW5nIFNPVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DVCBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXIKAEV4cGVjdGVkIFNPUCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNPIG1hcmtlcgoARXJyb3IgcmVhZGluZyBSR04gbWFya2VyCgBFcnJvciByZWFkaW5nIFBQTSBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlcgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyCgBFcnJvciByZWFkaW5nIFBMTSBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIEVQSCBtYXJrZXIKAEV4cGVjdGVkIEVQSCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlcgoAVW5rbm93biBwcm9ncmVzc2lvbiBvcmRlciBpbiBDT0QgbWFya2VyCgBVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIFFDRCBtYXJrZXIKAENycm9yIHJlYWRpbmcgQ0JEIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQT0MgbWFya2VyCgBFcnJvciByZWFkaW5nIENPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNDIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DQyBtYXJrZXIKAHJlcXVpcmVkIFNJWiBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBDT0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoAcmVxdWlyZWQgUUNEIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBqcGVnMjAwMCBmaWxlIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXIKAEVycm9yIHdpdGggSlAgU2lnbmF0dXJlIDogYmFkIG1hZ2ljIG51bWJlcgoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgcHJldmlvdXMgbnVtYmVyIG9mIHRpbGUtcGFydCAoJWQpLCBnaXZpbmcgdXAKAEluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpbGUtcGFydCAoaGVhZGVyKSAoJWQpLCBnaXZpbmcgdXAKAHRpbGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHJlc29sdXRpb24KAE1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uCgBQcm9ibGVtIHdpdGggc2VlayBmdW5jdGlvbgoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LCBJbnZhbGlkIGNibGt3L2NibGtoIGNvbWJpbmF0aW9uCgBJbnZhbGlkIG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIG90aGVyIHRoYW4gYXJyYXkgZGVjb3JyZWxhdGlvbgoAVG9vIGxhcmdlIHZhbHVlIGZvciBOcHBtCgBOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbQoAYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW0KAAkgTWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb249JWxsaQoJIE1haW4gaGVhZGVyIGVuZCBwb3NpdGlvbj0lbGxpCgBNYXJrZXIgc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBUaWxlIHBhcnQgbGVuZ3RoIHNpemUgaW5jb25zaXN0ZW50IHdpdGggc3RyZWFtIGxlbmd0aAoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmcKAFdyb25nIGZsYWcKAEVycm9yIHdpdGggRlRZUCBzaWduYXR1cmUgQm94IHNpemUKAEVycm9yIHdpdGggSlAgc2lnbmF0dXJlIEJveCBzaXplCgBJbnZhbGlkIHByZWNpbmN0IHNpemUKAEluY29uc2lzdGVudCBtYXJrZXIgc2l6ZQoASW52YWxpZCBtYXJrZXIgc2l6ZQoARXJyb3Igd2l0aCBTSVogbWFya2VyIHNpemUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZQoATm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGUKAEZhaWxlZCB0byBkZWNvZGUgdGhlIGNvZGVzdHJlYW0gaW4gdGhlIEpQMiBmaWxlCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aCBpbmRpeCBzaHVmZmxlCgBDYW5ub3QgYWxsb2NhdGUgVGllciAxIGhhbmRsZQoATm8gZGVjb2RlZCBhcmVhIHBhcmFtZXRlcnMsIHNldCB0aGUgZGVjb2RlZCBhcmVhIHRvIHRoZSB3aG9sZSBpbWFnZQoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWluaXRpYWxpemUgdGhlIHRhZyB0cmVlCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgdHJhbnNmb3JtYXRpb24gZm91bmQKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudC4gVW5zdXBwb3J0ZWQgTWl4ZWQgSFQgY29kZS1ibG9jayBzdHlsZSBmb3VuZAoAVGlsZSBZIGNvb3JkaW5hdGVzIGFyZSBub3Qgc3VwcG9ydGVkCgBUaWxlIFggY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAEltYWdlIGNvb3JkaW5hdGVzIGFib3ZlIElOVF9NQVggYXJlIG5vdCBzdXBwb3J0ZWQKAEpQRUcyMDAwIEhlYWRlciBib3ggbm90IHJlYWQgeWV0LCAnJWMlYyVjJWMnIGJveCB3aWxsIGJlIGlnbm9yZWQKAG9wal9qMmtfbWVyZ2VfcHB0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZAoASWdub3JpbmcgaWhkciBib3guIEZpcnN0IGloZHIgYm94IGFscmVhZHkgcmVhZAoAWnBwdCAldSBhbHJlYWR5IHJlYWQKAFpwcG0gJXUgYWxyZWFkeSByZWFkCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCBzeW50aGV0aXplZCAweEZGIG1hcmtlcnMgcmVhZAoACQkJIGNibGt3PTJeJWQKAAkJCSBjYmxraD0yXiVkCgAJCQkgcW50c3R5PSVkCgAlcyBkeD0lZCwgZHk9JWQKAAkJCSByb2lzaGlmdD0lZAoACQkJIG51bWdiaXRzPSVkCgAJCSBudW1sYXllcnM9JWQKACVzIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGFjbj0lZCwgbnVtY29tcHM9JWQKAG9wal9qcDJfYXBwbHlfY2RlZjogY249JWQsIG51bWNvbXBzPSVkCgAJCQkgbnVtcmVzb2x1dGlvbnM9JWQKAAkJIHR5cGU9JSN4LCBwb3M9JWxsaSwgbGVuPSVkCgAlcyBzZ25kPSVkCgAJCQkgcW1mYmlkPSVkCgAlcyBwcmVjPSVkCgAJCSBuYiBvZiB0aWxlLXBhcnQgaW4gdGlsZSBbJWRdPSVkCgAlcyB4MT0lZCwgeTE9JWQKACVzIHgwPSVkLCB5MD0lZAoARmFpbGVkIHRvIGRlY29kZSB0aWxlICVkLyVkCgBTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWQKAEZhaWxlZCB0byBkZWNvZGUgY29tcG9uZW50ICVkCgBJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWQKAEludmFsaWQgY29tcG9uZW50IG51bWJlcjogJWQsIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgJWQKAFRvbyBtYW55IFBPQ3MgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQwoAQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMgoAb3BqX3BpX25leHRfbHJjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcmxjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfY3BybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcGNybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcnBjbCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3QxX2RlY29kZV9jYmxrKCk6IHVuc3VwcG9ydGVkIGJwbm9fcGx1c19vbmUgPSAlZCA+PSAzMQoARmFpbGVkIHRvIGRlY29kZSB0aWxlIDEvMQoASW5zdWZmaWNpZW50IGRhdGEgZm9yIENNQVAgYm94LgoATmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC4KAEluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC4KAE51bWJlciBvZiBjaGFubmVsIGRlc2NyaXB0aW9uIGlzIGVxdWFsIHRvIHplcm8gaW4gQ0RFRiBib3guCgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC4KAE5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAQm94IGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuCgBSZXNvbHV0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmVzb2x1dGlvbiBpbiB0aGUgY29tcG9uZW50LgoAQ29tcG9uZW50IG1hcHBpbmcgc2VlbXMgd3JvbmcuIFRyeWluZyB0byBjb3JyZWN0LgoASW5jb21wbGV0ZSBjaGFubmVsIGRlZmluaXRpb25zLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW52YWxpZCBjb2RlYmxvY2sgbGVuZ3RoIHZhbHVlcy4KAFdlIGRvIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAzIGNvZGluZyBwYXNzZXMgaW4gYW4gSFQgY29kZWJsb2NrOyBUaGlzIGNvZGVibG9ja3MgaGFzICVkIHBhc3Nlcy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFRoZXJlIGFyZSAlZCB6ZXJvIGJpdHBsYW5lcyBpbiAlZCBiaXRwbGFuZXMuCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb24gc3RhZ2VzLgoAVW5rbm93biBtYXJrZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfcmVhZF9oZWFkZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBUaWxlcyBkb24ndCBhbGwgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24uIFNraXAgdGhlIE1DVCBzdGVwLgoATnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuCgBKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBXaGVuIHRoZSBudW1iZXIgb2YgemVybyBwbGFuZXMgYml0cGxhbmVzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cGxhbmVzLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3MgbWFrZXMgc2Vuc2UsIGJ1dCB3ZSBoYXZlICVkIHBhc3NlcyBpbiB0aGlzIGNvZGVibG9jay4gVGhlcmVmb3JlLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3Mgd2lsbCBiZSBkZWNvZGVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBub3QgYmUgZGlzcGxheWVkIGFnYWluLgoASW1hZ2UgaGFzIGxlc3MgY29tcG9uZW50cyB0aGFuIGNvZGVzdHJlYW0uCgBOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0uCgBQc290IHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBlcXVhbCB0byB6ZXJvLCB3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uCgBBIG1hbGZvcm1lZCBjb2RlYmxvY2sgdGhhdCBoYXMgbW9yZSB0aGFuIG9uZSBjb2RpbmcgcGFzcywgYnV0IHplcm8gbGVuZ3RoIGZvciAybmQgYW5kIHBvdGVudGlhbGx5IHRoZSAzcmQgcGFzcyBpbiBhbiBIVCBjb2RlYmxvY2suCgAJCQkgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JWxsaSwgZW5kX2hlYWRlcj0lbGxpLCBlbmRfcG9zPSVsbGkuCgBUaWxlICV1IGhhcyBUUHNvdCA9PSAwIGFuZCBUTnNvdCA9PSAwLCBidXQgbm8gb3RoZXIgdGlsZS1wYXJ0cyB3ZXJlIGZvdW5kLiBFT0MgaXMgYWxzbyBtaXNzaW5nLgoAQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuCgBBIGNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgYWxsIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdCwgc28gd2UgaWdub3JlIHRoaXMgb25lLgoAVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlICBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlIGZ0eXAgYm94IG11c3QgYmUgdGhlIHNlY29uZCBib3ggaW4gdGhlIGZpbGUuCgBGYWlsZWQgdG8gZGVjb2RlLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW5jb3JyZWN0IE1FTCBzZWdtZW50IHNlcXVlbmNlLgoAQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS4KAE9ubHkgb25lIENNQVAgYm94IGlzIGFsbG93ZWQuCgBXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC4KAElIRFIgYm94X21pc3NpbmcuIFJlcXVpcmVkLgoASlAySCBib3ggbWlzc2luZy4gUmVxdWlyZWQuCgBOb3Qgc3VyZSBob3cgdGhhdCBoYXBwZW5lZC4KAE1haW4gaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBkZWNvZGVkLgoAVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLgoASGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLgoARW1wdHkgU09UIG1hcmtlciBkZXRlY3RlZDogUHNvdD0lZC4KAERpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC4KAEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb246IGZvciBwYWxldHRlIG1hcHBpbmcsIHBjb2xbJWRdIHNob3VsZCBiZSBlcXVhbCB0byAlZCwgYnV0IGlzIGVxdWFsIHRvICVkLgoASW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuCgBJbnZhbGlkIHZhbHVlIGZvciBjbWFwWyVkXS5tdHlwID0gJWQuCgBQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gVkxDIGNvZGUgcHJvZHVjZXMgc2lnbmlmaWNhbnQgc2FtcGxlcyBvdXRzaWRlIHRoZSBjb2RlYmxvY2sgYXJlYS4KAFVuZXhwZWN0ZWQgT09NLgoAMzIgYml0cyBhcmUgbm90IGVub3VnaCB0byBkZWNvZGUgdGhpcyBjb2RlYmxvY2ssIHNpbmNlIHRoZSBudW1iZXIgb2YgYml0cGxhbmUsICVkLCBpcyBsYXJnZXIgdGhhbiAzMC4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIHNob3VsZCBiZSA+IDAuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIHNob3VsZCBiZSA+IDAuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIHNob3VsZCBiZSA+PSAwLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIHNob3VsZCBiZSA+PSAwLgoARXJyb3IgcmVhZGluZyBQUFQgbWFya2VyOiBwYWNrZXQgaGVhZGVyIGhhdmUgYmVlbiBwcmV2aW91c2x5IGZvdW5kIGluIHRoZSBtYWluIGhlYWRlciAoUFBNIG1hcmtlcikuCgBTdGFydCB0byByZWFkIGoyayBtYWluIGhlYWRlciAoJWxsZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuCgBTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuCgBTaXplIHkgb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0uaD0lZCkuCgBUaWxlIHJlYWQsIGRlY29kZWQgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkIG9uZSAoJWQgdnMgJWQpLgoASW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS4KAG9wal9yZWFkX2hlYWRlcigpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIG9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKCkuCgBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIG9wal9qcDJfYXBwbHlfcGNscigpLgoAaW1hZ2UtPmNvbXBzWyVkXS5kYXRhID09IE5VTEwgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbnZhbGlkIGJveCBzaXplICVkICgleCkKAEZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBJSERSIHcoJXUpIGgoJXUpIHZzLiBTSVogdygldSkgaCgldSkKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlciAoYmFkIG51bWJlciBvZiBjb21wb25lbnRzKQoASW52YWxpZCBudW1iZXIgb2YgdGlsZXMgOiAldSB4ICV1IChtYXhpbXVtIGZpeGVkIGJ5IGpwZWcyMDAwIG5vcm0gaXMgNjU1MzUgdGlsZXMpCgBJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIChpaGRyKQoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcikKAFdyb25nIHZhbHVlcyBmb3I6IHcoJWQpIGgoJWQpIG51bWNvbXBzKCVkKSAoaWhkcikKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBkeD0ldSBkeT0ldSAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybSkKAEJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIEJQQ0MgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG5lZ2F0aXZlIG9yIHplcm8gaW1hZ2Ugc2l6ZSAoJWxsZCB4ICVsbGQpCgBza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoAcmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZCkKAERlc3BpdGUgSlAyIEJQQyE9MjU1LCBwcmVjaXNpb24gYW5kL29yIHNnbmQgdmFsdWVzIGZvciBjb21wWyVkXSBpcyBkaWZmZXJlbnQgdGhhbiBjb21wWzBdOgogICAgICAgIFswXSBwcmVjKCVkKSBzZ25kKCVkKSBbJWRdIHByZWMoJWQpIHNnbmQoJWQpCgBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzICggJWQgdnMgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoQ0lFTGFiLCBiYWQgc2l6ZTogJWQpCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCByZW1haW5pbmcgYnl0ZXMgaW4gY29kZSBibG9jayAoJWQgdXNlZCAvICVkKQoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQ6IDIgPD0gU2N1cCA8PSBtaW4oTGN1cCwgNDA3OSkKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpCgBJbnZhbGlkIGJpdCBudW1iZXIgJWQgaW4gb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlcigpCgBTdHJlYW0gZXJyb3IhCgBFcnJvciBvbiB3cml0aW5nIHN0cmVhbSEKAFN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIQoARXhwZWN0ZWQgYSBTT0MgbWFya2VyIAoASW52YWxpZCBib3ggc2l6ZSAlZCBmb3IgYm94ICclYyVjJWMlYycuIE5lZWQgJWQgYnl0ZXMsICVkIGJ5dGVzIHJlbWFpbmluZyAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVfcSBpcyBsYXJnZXIgdGhhbiB6ZXJvIGJpdHBsYW5lcyArIDEgCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBVX3EgaXNsYXJnZXIgdGhhbiBiaXRwbGFuZXMgKyAxIAoAQ09MUiBCT1ggbWV0aCB2YWx1ZSBpcyBub3QgYSByZWd1bGFyIHZhbHVlICglZCksIHNvIHdlIHdpbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiAKAFdoaWxlIHJlYWRpbmcgQ0NQX1FOVFNUWSBlbGVtZW50IGluc2lkZSBRQ0Qgb3IgUUNDIG1hcmtlciBzZWdtZW50LCBudW1iZXIgb2Ygc3ViYmFuZHMgKCVkKSBpcyBncmVhdGVyIHRvIE9QSl9KMktfTUFYQkFORFMgKCVkKS4gU28gd2UgbGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpIGFuZCBza2lwIHRoZSByZXN0LiAKAEpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSAKAFRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgCgBFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuClRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgdG8gcmVtb3ZlICglZCkgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnQg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AAABVAAAAQAAAABQAADAUAAAAUgAAAAAAAAQUAAAsFAAAAFIAAABAAAAIFAAAMBQAAABOAAAAAAAADBQAACwUAAAATgAAAEAAABAUAAAwFAAAAEwAAAAAAAAUFAAABBRAAABMAAAAQAAAGBQAAAgUQAAASQAAAAAAABwUAAAMFEAAAEkAAABAAAAgFAAAEBRAAABHAAAAAAAAJBQAABwUQAAARwAAAEAAACgUAAAgFEAAAEWAAAAAAAAkFIAAJBRAAABFgAAAQAAAKBSAACgUQAAAVYAAAAAAADQUAAAwFAAAAFWAAABAAAA4FAAALBQAAABVAAAAAAAAPBQAACwUAAAAVQAAAEAAAAAUQAAwFAAAAFRAAAAAAAAEFEAANBQAAABUQAAAQAAACBRAADgUAAAAUgAAAAAAAAwUQAA8FAAAAFIAAABAAAAQFEAAABRAAABOAAAAAAAAFBRAAAQUQAAATgAAAEAAABgUQAAIFEAAAE0AAAAAAAAcFEAADBRAAABNAAAAQAAAIBRAABAUQAAATAAAAAAAACQUQAAUFEAAAEwAAABAAAAoFEAAGBRAAABKAAAAAAAALBRAABQUQAAASgAAAEAAADAUQAAYFEAAAEkAAAAAAAA0FEAAHBRAAABJAAAAQAAAOBRAACAUQAAASIAAAAAAADwUQAAkFEAAAEiAAABAAAAAFIAAKBRAAABHAAAAAAAABBSAACwUQAAARwAAAEAAAAgUgAAwFEAAAEYAAAAAAAAMFIAANBRAAABGAAAAQAAAEBSAADgUQAAARYAAAAAAABQUgAA8FEAAAEWAAABAAAAYFIAAABSAAABFAAAAAAAAHBSAAAQUgAAARQAAAEAAACAUgAAIFIAAAESAAAAAAAAkFIAADBSAAABEgAAAQAAAKBSAABAUgAAAREAAAAAAACwUgAAUFIAAAERAAABAAAAwFIAAGBSAADBCgAAAAAAANBSAABwUgAAwQoAAAEAAADgUgAAgFIAAMEJAAAAAAAA8FIAAJBSAADBCQAAAQAAAABTAACgUgAAoQgAAAAAAAAQUwAAsFIAAKEIAAABAAAAIFMAAMBSAAAhBQAAAAAAADBTAADQUgAAIQUAAAEAAABAUwAA4FIAAEEEAAAAAAAAUFMAAPBSAABBBAAAAQAAAGBTAAAAUwAAoQIAAAAAAABwUwAAEFMAAKECAAABAAAAgFMAACBTAAAhAgAAAAAAAJBTAAAwUwAAIQIAAAEAAACgUwAAQFMAAEEBAAAAAAAAsFMAAFBTAABBAQAAAQAAAMBTAABgUwAAEQEAAAAAAADQUwAAcFMAABEBAAABAAAA4FMAAIBTAACFAAAAAAAAAPBTAACQUwAAhQAAAAEAAAAAVAAAoFMAAEkAAAAAAAAAEFQAALBTAABJAAAAAQAAACBUAADAUwAAJQAAAAAAAAAwVAAA0FMAACUAAAABAAAAQFQAAOBTAAAVAAAAAAAAAFBUAADwUwAAFQAAAAEAAABgVAAAAFQAAAkAAAAAAAAAcFQAABBUAAAJAAAAAQAAAIBUAAAgVAAABQAAAAAAAACQVAAAMFQAAAUAAAABAAAAoFQAAEBUAAABAAAAAAAAAJBUAABQVAAAAQAAAAEAAACgVAAAYFQAAAFWAAAAAAAAsFQAALBUAAABVgAAAQAAAMBUAADAVAAAAAEDAwECAwMFBgcHBgYHBwABAwMBAgMDBQYHBwYGBwcFBgcHBgYHBwgICAgICAgIBQYHBwYGBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgCAgMDAgIDAwYGBwcGBgcHAgIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgAAQUGAQIGBgMDBwcDAwcHAAEFBgECBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwUGCAgGBggIBwcICAcHCAgFBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwICBgYCAgYGAwMHBwMDBwcCAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAMBBAMGBAcBBAIFBAcFBwADAQQDBgQHAQQCBQQHBQcBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgGCAcICAgICAcIBwgICAgIBggHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgJCQoKCQkKCgwMDQsMDA0LCQkKCgkJCgoMDAsNDAwLDQwMDQ0MDAsLDAkNCgkMCgsMDAsLDAwNDQwJCwoJDAoNCQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQoKCgoKCgoKDQsNCw0LDQsKCgkJCgoJCQ0LDAwNCwwMDQ0NDQsLCwsNCg0KCgsKCw0NDAwLCwwMDQoMCQoLCQwKCgkJCgoJCQsNDAwLDQwMCgoKCgoKCgoLDQsNCw0LDQsLDAwNDQwMCwoMCQoNCQwLCwsLDQ0NDQsKCwoKDQoNAEHZuwELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZm8AQs3AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQBB2bwBCwcBAAEAAQABAEHpvAELlQIBAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAAABAAEBAQAAAQEAAAABAAEAAQABAQEBAQEBAQEAAQABAAEAAQAAAAABAQEBAAEAAAEBAAEAAAAAAQEBAQABAAEBAQEBAgAAAAQAAAAEAAAACAAAAJD/AAAMAAAAGAAAAFL/AAAUAAAAGQAAAFP/AAAUAAAAGgAAAF7/AAAUAAAAGwAAAFz/AAAUAAAAHAAAAF3/AAAUAAAAHQAAAF//AAAUAAAAHgAAAFH/AAACAAAAHwAAAFX/AAAEAAAAIAAAAFf/AAAEAAAAIQAAAFj/AAAQAAAAIgAAAGD/AAAEAAAAIwAAAGH/AAAQAAAAJAAAAJH/AEGIvwELZWP/AAAEAAAAJQAAAGT/AAAUAAAAJgAAAHT/AAAUAAAAJwAAAHj/AAAEAAAAKAAAAFD/AAAEAAAAKQAAAFn/AAAEAAAAKgAAAHX/AAAUAAAAKwAAAHf/AAAUAAAALAAAAAAAAAAUAEGAwAELNS0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAAICBQajYAAABweXRmNwAAAGgycGo4AEHAwAELMnJkaGk5AAAAcmxvYzoAAABjY3BiOwAAAHJsY3A8AAAAcGFtYz0AAABmZWRjPgAAAPhiAEGAwQELQRkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHRwQELIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBi8IBCwEMAEGXwgELFRMAAAAAEwAAAAAJDAAAAAAADAAADABBxcIBCwEQAEHRwgELFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABB/8IBCwESAEGLwwELHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBBwsMBCw4aAAAAGhoaAAAAAAAACQBB88MBCwEUAEH/wwELFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBrcQBCwEWAEG5xAELJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBB4MQBCwmQbAEAAAAAAAUAQfTEAQsBaQBBjMUBCwpqAAAAawAAAHhoAEGkxQELAQIAQbTFAQsI//////////8AQfjFAQsBBQBBhMYBCwFsAEGcxgELDmoAAABtAAAAiGgAAAAEAEG0xgELAQEAQcTGAQsF/////wo="; + return f; + } + var wasmBinaryFile; + function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + var binary = tryParseAsDataURI(file); + if (binary) { + return binary; + } + if (readBinary) { + return readBinary(file); + } + throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'; + } + function instantiateSync(file, info) { + var module; + var binary = getBinarySync(file); + module = new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module, info); + return [instance, module]; + } + function getWasmImports() { + return { + a: wasmImports + }; + } + function createWasm() { + var info = getWasmImports(); + function receiveInstance(instance, module) { + wasmExports = instance.exports; + wasmMemory = wasmExports["p"]; + updateMemoryViews(); + addOnInit(wasmExports["q"]); + removeRunDependency("wasm-instantiate"); + return wasmExports; + } + addRunDependency("wasm-instantiate"); + if (Module["instantiateWasm"]) { + try { + return Module["instantiateWasm"](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + readyPromiseReject(e); + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + var result = instantiateSync(wasmBinaryFile, info); + return receiveInstance(result[0]); + } + var callRuntimeCallbacks = callbacks => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + var noExitRuntime = Module["noExitRuntime"] || true; + var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); + function _copy_pixels_1(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + imageData.set(compG); + } + function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 3); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[3 * i] = compR[i]; + imageData[3 * i + 1] = compG[i]; + imageData[3 * i + 2] = compB[i]; + } + } + function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = compA[i]; + } + } + var getHeapMax = () => 2147483648; + var growMemory = size => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) {} + }; + var _emscripten_resize_heap = requestedSize => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + .2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + var ENV = {}; + var getExecutableName = () => thisProgram || "./this.program"; + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = (typeof navigator == "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8"; + var env = { + USER: "web_user", + LOGNAME: "web_user", + PATH: "/", + PWD: "/", + HOME: "/home/web_user", + LANG: lang, + _: getExecutableName() + }; + for (var x in ENV) { + if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(`${x}=${env[x]}`); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + }; + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[__environ + i * 4 >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach(string => bufSize += string.length + 1); + HEAPU32[penviron_buf_size >> 2] = bufSize; + return 0; + }; + var _fd_close = fd => 52; + var convertI32PairToI53Checked = (lo, hi) => hi + 2097152 >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN; + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + return 70; + } + var printCharBuffers = [null, [], []]; + var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; + var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + }; + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + var _fd_write = (fd, iov, iovcnt, pnum) => { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[iov + 4 >> 2]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAPU32[pnum >> 2] = num; + return 0; + }; + function _gray_to_rgba(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = 255; + } + } + function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) { + compG_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = compA[i]; + } + } + function _jsPrintWarning(message_ptr) { + const message = UTF8ToString(message_ptr); + (Module.warn || console.warn)(`OpenJPEG: ${message}`); + } + function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = 255; + } + } + function _storeErrorMessage(message_ptr) { + const message = UTF8ToString(message_ptr); + if (!Module.errorMessages) { + Module.errorMessages = message; + } else { + Module.errorMessages += "\n" + message; + } + } + var wasmImports = { + c: __emscripten_memcpy_js, + g: _copy_pixels_1, + f: _copy_pixels_3, + e: _copy_pixels_4, + k: _emscripten_resize_heap, + l: _environ_get, + m: _environ_sizes_get, + n: _fd_close, + j: _fd_seek, + b: _fd_write, + o: _gray_to_rgba, + i: _graya_to_rgba, + d: _jsPrintWarning, + h: _rgb_to_rgba, + a: _storeErrorMessage + }; + var wasmExports = createWasm(); + var ___wasm_call_ctors = wasmExports["q"]; + var _malloc = Module["_malloc"] = wasmExports["r"]; + var _free = Module["_free"] = wasmExports["s"]; + var _jp2_decode = Module["_jp2_decode"] = wasmExports["u"]; + var calledRun; + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function () { + setTimeout(function () { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + moduleRtn = Module; + return moduleRtn; + }; +})(); +/* harmony default export */ const openjpeg = (OpenJPEG); +;// ./src/core/jpx.js + + + +class JpxError extends BaseException { + constructor(msg) { + super(msg, "JpxError"); + } +} +class JpxImage { + static #module = null; + static decode(data, decoderOptions) { + decoderOptions ||= {}; + this.#module ||= openjpeg({ + warn: warn + }); + const imageData = this.#module.decode(data, decoderOptions); + if (typeof imageData === "string") { + throw new JpxError(imageData); + } + return imageData; + } + static cleanup() { + this.#module = null; + } + static parseImageProperties(stream) { + let newByte = stream.getByte(); + while (newByte >= 0) { + const oldByte = newByte; + newByte = stream.getByte(); + const code = oldByte << 8 | newByte; + if (code === 0xff51) { + stream.skip(4); + const Xsiz = stream.getInt32() >>> 0; + const Ysiz = stream.getInt32() >>> 0; + const XOsiz = stream.getInt32() >>> 0; + const YOsiz = stream.getInt32() >>> 0; + stream.skip(16); + const Csiz = stream.getUint16(); + return { + width: Xsiz - XOsiz, + height: Ysiz - YOsiz, + bitsPerComponent: 8, + componentsCount: Csiz + }; + } + } + throw new JpxError("No size marker found in JPX stream"); + } +} + +;// ./src/core/jpx_stream.js + + + +class JpxStream extends DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock(decoderOptions) { + this.decodeImage(null, decoderOptions); + } + decodeImage(bytes, decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + this.buffer = JpxImage.decode(bytes, decoderOptions); + this.bufferLength = this.buffer.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } +} + +;// ./src/core/lzw_stream.js + +class LZWStream extends DecodeStream { + constructor(str, maybeLength, earlyChange) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.cachedData = 0; + this.bitsCached = 0; + const maxLzwDictionarySize = 4096; + const lzwState = { + earlyChange, + codeLength: 9, + nextCode: 258, + dictionaryValues: new Uint8Array(maxLzwDictionarySize), + dictionaryLengths: new Uint16Array(maxLzwDictionarySize), + dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), + currentSequence: new Uint8Array(maxLzwDictionarySize), + currentSequenceLength: 0 + }; + for (let i = 0; i < 256; ++i) { + lzwState.dictionaryValues[i] = i; + lzwState.dictionaryLengths[i] = 1; + } + this.lzwState = lzwState; + } + readBits(n) { + let bitsCached = this.bitsCached; + let cachedData = this.cachedData; + while (bitsCached < n) { + const c = this.str.getByte(); + if (c === -1) { + this.eof = true; + return null; + } + cachedData = cachedData << 8 | c; + bitsCached += 8; + } + this.bitsCached = bitsCached -= n; + this.cachedData = cachedData; + this.lastCode = null; + return cachedData >>> bitsCached & (1 << n) - 1; + } + readBlock() { + const blockSize = 512, + decodedSizeDelta = blockSize; + let estimatedDecodedSize = blockSize * 2; + let i, j, q; + const lzwState = this.lzwState; + if (!lzwState) { + return; + } + const earlyChange = lzwState.earlyChange; + let nextCode = lzwState.nextCode; + const dictionaryValues = lzwState.dictionaryValues; + const dictionaryLengths = lzwState.dictionaryLengths; + const dictionaryPrevCodes = lzwState.dictionaryPrevCodes; + let codeLength = lzwState.codeLength; + let prevCode = lzwState.prevCode; + const currentSequence = lzwState.currentSequence; + let currentSequenceLength = lzwState.currentSequenceLength; + let decodedLength = 0; + let currentBufferLength = this.bufferLength; + let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + for (i = 0; i < blockSize; i++) { + const code = this.readBits(codeLength); + const hasPrev = currentSequenceLength > 0; + if (code < 256) { + currentSequence[0] = code; + currentSequenceLength = 1; + } else if (code >= 258) { + if (code < nextCode) { + currentSequenceLength = dictionaryLengths[code]; + for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { + currentSequence[j] = dictionaryValues[q]; + q = dictionaryPrevCodes[q]; + } + } else { + currentSequence[currentSequenceLength++] = currentSequence[0]; + } + } else if (code === 256) { + codeLength = 9; + nextCode = 258; + currentSequenceLength = 0; + continue; + } else { + this.eof = true; + delete this.lzwState; + break; + } + if (hasPrev) { + dictionaryPrevCodes[nextCode] = prevCode; + dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; + dictionaryValues[nextCode] = currentSequence[0]; + nextCode++; + codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; + } + prevCode = code; + decodedLength += currentSequenceLength; + if (estimatedDecodedSize < decodedLength) { + do { + estimatedDecodedSize += decodedSizeDelta; + } while (estimatedDecodedSize < decodedLength); + buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + } + for (j = 0; j < currentSequenceLength; j++) { + buffer[currentBufferLength++] = currentSequence[j]; + } + } + lzwState.nextCode = nextCode; + lzwState.codeLength = codeLength; + lzwState.prevCode = prevCode; + lzwState.currentSequenceLength = currentSequenceLength; + this.bufferLength = currentBufferLength; + } +} + +;// ./src/core/predictor_stream.js + + + +class PredictorStream extends DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + if (!(params instanceof Dict)) { + return str; + } + const predictor = this.predictor = params.get("Predictor") || 1; + if (predictor <= 1) { + return str; + } + if (predictor !== 2 && (predictor < 10 || predictor > 15)) { + throw new FormatError(`Unsupported predictor: ${predictor}`); + } + this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng; + this.str = str; + this.dict = str.dict; + const colors = this.colors = params.get("Colors") || 1; + const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8; + const columns = this.columns = params.get("Columns") || 1; + this.pixBytes = colors * bits + 7 >> 3; + this.rowBytes = columns * colors * bits + 7 >> 3; + return this; + } + readBlockTiff() { + const rowBytes = this.rowBytes; + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + const bits = this.bits; + const colors = this.colors; + const rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + let inbuf = 0, + outbuf = 0; + let inbits = 0, + outbits = 0; + let pos = bufferLength; + let i; + if (bits === 1 && colors === 1) { + for (i = 0; i < rowBytes; ++i) { + let c = rawBytes[i] ^ inbuf; + c ^= c >> 1; + c ^= c >> 2; + c ^= c >> 4; + inbuf = (c & 1) << 7; + buffer[pos++] = c; + } + } else if (bits === 8) { + for (i = 0; i < colors; ++i) { + buffer[pos++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[pos] = buffer[pos - colors] + rawBytes[i]; + pos++; + } + } else if (bits === 16) { + const bytesPerPixel = colors * 2; + for (i = 0; i < bytesPerPixel; ++i) { + buffer[pos++] = rawBytes[i]; + } + for (; i < rowBytes; i += 2) { + const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff); + buffer[pos++] = sum >> 8 & 0xff; + buffer[pos++] = sum & 0xff; + } + } else { + const compArray = new Uint8Array(colors + 1); + const bitMask = (1 << bits) - 1; + let j = 0, + k = bufferLength; + const columns = this.columns; + for (i = 0; i < columns; ++i) { + for (let kk = 0; kk < colors; ++kk) { + if (inbits < bits) { + inbuf = inbuf << 8 | rawBytes[j++] & 0xff; + inbits += 8; + } + compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask; + inbits -= bits; + outbuf = outbuf << bits | compArray[kk]; + outbits += bits; + if (outbits >= 8) { + buffer[k++] = outbuf >> outbits - 8 & 0xff; + outbits -= 8; + } + } + } + if (outbits > 0) { + buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1); + } + } + this.bufferLength += rowBytes; + } + readBlockPng() { + const rowBytes = this.rowBytes; + const pixBytes = this.pixBytes; + const predictor = this.str.getByte(); + const rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); + if (prevRow.length === 0) { + prevRow = new Uint8Array(rowBytes); + } + let i, + j = bufferLength, + up, + c; + switch (predictor) { + case 0: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + break; + case 1: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff; + j++; + } + break; + case 2: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = prevRow[i] + rawBytes[i] & 0xff; + } + break; + case 3: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff; + j++; + } + break; + case 4: + for (i = 0; i < pixBytes; ++i) { + up = prevRow[i]; + c = rawBytes[i]; + buffer[j++] = up + c; + } + for (; i < rowBytes; ++i) { + up = prevRow[i]; + const upLeft = prevRow[i - pixBytes]; + const left = buffer[j - pixBytes]; + const p = left + up - upLeft; + let pa = p - left; + if (pa < 0) { + pa = -pa; + } + let pb = p - up; + if (pb < 0) { + pb = -pb; + } + let pc = p - upLeft; + if (pc < 0) { + pc = -pc; + } + c = rawBytes[i]; + if (pa <= pb && pa <= pc) { + buffer[j++] = left + c; + } else if (pb <= pc) { + buffer[j++] = up + c; + } else { + buffer[j++] = upLeft + c; + } + } + break; + default: + throw new FormatError(`Unsupported predictor: ${predictor}`); + } + this.bufferLength += rowBytes; + } +} + +;// ./src/core/run_length_stream.js + +class RunLengthStream extends DecodeStream { + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + } + readBlock() { + const repeatHeader = this.str.getBytes(2); + if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { + this.eof = true; + return; + } + let buffer; + let bufferLength = this.bufferLength; + let n = repeatHeader[0]; + if (n < 128) { + buffer = this.ensureBuffer(bufferLength + n + 1); + buffer[bufferLength++] = repeatHeader[1]; + if (n > 0) { + const source = this.str.getBytes(n); + buffer.set(source, bufferLength); + bufferLength += n; + } + } else { + n = 257 - n; + const b = repeatHeader[1]; + buffer = this.ensureBuffer(bufferLength + n + 1); + for (let i = 0; i < n; i++) { + buffer[bufferLength++] = b; + } + } + this.bufferLength = bufferLength; + } +} + +;// ./src/core/parser.js + + + + + + + + + + + + + + +const MAX_LENGTH_TO_CACHE = 1000; +function getInlineImageCacheKey(bytes) { + const strBuf = [], + ii = bytes.length; + let i = 0; + while (i < ii - 1) { + strBuf.push(bytes[i++] << 8 | bytes[i++]); + } + if (i < ii) { + strBuf.push(bytes[i]); + } + return ii + "_" + String.fromCharCode.apply(null, strBuf); +} +class Parser { + constructor({ + lexer, + xref, + allowStreams = false, + recoveryMode = false + }) { + this.lexer = lexer; + this.xref = xref; + this.allowStreams = allowStreams; + this.recoveryMode = recoveryMode; + this.imageCache = Object.create(null); + this._imageId = 0; + this.refill(); + } + refill() { + this.buf1 = this.lexer.getObj(); + this.buf2 = this.lexer.getObj(); + } + shift() { + if (this.buf2 instanceof Cmd && this.buf2.cmd === "ID") { + this.buf1 = this.buf2; + this.buf2 = null; + } else { + this.buf1 = this.buf2; + this.buf2 = this.lexer.getObj(); + } + } + tryShift() { + try { + this.shift(); + return true; + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + return false; + } + } + getObj(cipherTransform = null) { + const buf1 = this.buf1; + this.shift(); + if (buf1 instanceof Cmd) { + switch (buf1.cmd) { + case "BI": + return this.makeInlineImage(cipherTransform); + case "[": + const array = []; + while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) { + array.push(this.getObj(cipherTransform)); + } + if (this.buf1 === EOF) { + if (this.recoveryMode) { + return array; + } + throw new ParserEOFException("End of file inside array."); + } + this.shift(); + return array; + case "<<": + const dict = new Dict(this.xref); + while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) { + if (!(this.buf1 instanceof Name)) { + info("Malformed dictionary: key must be a name object"); + this.shift(); + continue; + } + const key = this.buf1.name; + this.shift(); + if (this.buf1 === EOF) { + break; + } + dict.set(key, this.getObj(cipherTransform)); + } + if (this.buf1 === EOF) { + if (this.recoveryMode) { + return dict; + } + throw new ParserEOFException("End of file inside dictionary."); + } + if (isCmd(this.buf2, "stream")) { + return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict; + } + this.shift(); + return dict; + default: + return buf1; + } + } + if (Number.isInteger(buf1)) { + if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) { + const ref = Ref.get(buf1, this.buf1); + this.shift(); + this.shift(); + return ref; + } + return buf1; + } + if (typeof buf1 === "string") { + if (cipherTransform) { + return cipherTransform.decryptString(buf1); + } + return buf1; + } + return buf1; + } + findDefaultInlineStreamEnd(stream) { + const E = 0x45, + I = 0x49, + SPACE = 0x20, + LF = 0xa, + CR = 0xd, + NUL = 0x0; + const { + knownCommands + } = this.lexer, + startPos = stream.pos, + n = 15; + let state = 0, + ch, + maybeEIPos; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else { + if (ch === SPACE || ch === LF || ch === CR) { + maybeEIPos = stream.pos; + const followingBytes = stream.peekBytes(n); + const ii = followingBytes.length; + if (ii === 0) { + break; + } + for (let i = 0; i < ii; i++) { + ch = followingBytes[i]; + if (ch === NUL && followingBytes[i + 1] !== NUL) { + continue; + } + if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) { + state = 0; + break; + } + } + if (state !== 2) { + continue; + } + if (!knownCommands) { + warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined."); + continue; + } + const tmpLexer = new Lexer(new Stream(followingBytes.slice()), knownCommands); + tmpLexer._hexStringWarn = () => {}; + let numArgs = 0; + while (true) { + const nextObj = tmpLexer.getObj(); + if (nextObj === EOF) { + state = 0; + break; + } + if (nextObj instanceof Cmd) { + const knownCommand = knownCommands[nextObj.cmd]; + if (!knownCommand) { + state = 0; + break; + } else if (knownCommand.variableArgs ? numArgs <= knownCommand.numArgs : numArgs === knownCommand.numArgs) { + break; + } + numArgs = 0; + continue; + } + numArgs++; + } + if (state === 2) { + break; + } + } else { + state = 0; + } + } + } + if (ch === -1) { + warn("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker"); + if (maybeEIPos) { + warn('... trying to recover by using the last "EI" occurrence.'); + stream.skip(-(stream.pos - maybeEIPos)); + } + } + let endOffset = 4; + stream.skip(-endOffset); + ch = stream.peekByte(); + stream.skip(endOffset); + if (!isWhiteSpace(ch)) { + endOffset--; + } + return stream.pos - endOffset - startPos; + } + findDCTDecodeInlineStreamEnd(stream) { + const startPos = stream.pos; + let foundEOI = false, + b, + markerLength; + while ((b = stream.getByte()) !== -1) { + if (b !== 0xff) { + continue; + } + switch (stream.getByte()) { + case 0x00: + break; + case 0xff: + stream.skip(-1); + break; + case 0xd9: + foundEOI = true; + break; + case 0xc0: + case 0xc1: + case 0xc2: + case 0xc3: + case 0xc5: + case 0xc6: + case 0xc7: + case 0xc9: + case 0xca: + case 0xcb: + case 0xcd: + case 0xce: + case 0xcf: + case 0xc4: + case 0xcc: + case 0xda: + case 0xdb: + case 0xdc: + case 0xdd: + case 0xde: + case 0xdf: + case 0xe0: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xe4: + case 0xe5: + case 0xe6: + case 0xe7: + case 0xe8: + case 0xe9: + case 0xea: + case 0xeb: + case 0xec: + case 0xed: + case 0xee: + case 0xef: + case 0xfe: + markerLength = stream.getUint16(); + if (markerLength > 2) { + stream.skip(markerLength - 2); + } else { + stream.skip(-2); + } + break; + } + if (foundEOI) { + break; + } + } + const length = stream.pos - startPos; + if (b === -1) { + warn("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + findASCII85DecodeInlineStreamEnd(stream) { + const TILDE = 0x7e, + GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === TILDE) { + const tildePos = stream.pos; + ch = stream.peekByte(); + while (isWhiteSpace(ch)) { + stream.skip(); + ch = stream.peekByte(); + } + if (ch === GT) { + stream.skip(); + break; + } + if (stream.pos > tildePos) { + const maybeEI = stream.peekBytes(2); + if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) { + break; + } + } + } + } + const length = stream.pos - startPos; + if (ch === -1) { + warn("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + findASCIIHexDecodeInlineStreamEnd(stream) { + const GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === GT) { + break; + } + } + const length = stream.pos - startPos; + if (ch === -1) { + warn("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + inlineStreamSkipEI(stream) { + const E = 0x45, + I = 0x49; + let state = 0, + ch; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else if (state === 2) { + break; + } + } + } + makeInlineImage(cipherTransform) { + const lexer = this.lexer; + const stream = lexer.stream; + const dictMap = Object.create(null); + let dictLength; + while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) { + if (!(this.buf1 instanceof Name)) { + throw new FormatError("Dictionary key must be a name object"); + } + const key = this.buf1.name; + this.shift(); + if (this.buf1 === EOF) { + break; + } + dictMap[key] = this.getObj(cipherTransform); + } + if (lexer.beginInlineImagePos !== -1) { + dictLength = stream.pos - lexer.beginInlineImagePos; + } + const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter); + let filterName; + if (filter instanceof Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = this.xref.fetchIfRef(filter[0]); + if (filterZero instanceof Name) { + filterName = filterZero.name; + } + } + const startPos = stream.pos; + let length; + switch (filterName) { + case "DCT": + case "DCTDecode": + length = this.findDCTDecodeInlineStreamEnd(stream); + break; + case "A85": + case "ASCII85Decode": + length = this.findASCII85DecodeInlineStreamEnd(stream); + break; + case "AHx": + case "ASCIIHexDecode": + length = this.findASCIIHexDecodeInlineStreamEnd(stream); + break; + default: + length = this.findDefaultInlineStreamEnd(stream); + } + let cacheKey; + if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) { + const initialStreamPos = stream.pos; + stream.pos = lexer.beginInlineImagePos; + cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length)); + stream.pos = initialStreamPos; + const cacheEntry = this.imageCache[cacheKey]; + if (cacheEntry !== undefined) { + this.buf2 = Cmd.get("EI"); + this.shift(); + cacheEntry.reset(); + return cacheEntry; + } + } + const dict = new Dict(this.xref); + for (const key in dictMap) { + dict.set(key, dictMap[key]); + } + let imageStream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + imageStream = cipherTransform.createStream(imageStream, length); + } + imageStream = this.filter(imageStream, dict, length); + imageStream.dict = dict; + if (cacheKey !== undefined) { + imageStream.cacheKey = `inline_img_${++this._imageId}`; + this.imageCache[cacheKey] = imageStream; + } + this.buf2 = Cmd.get("EI"); + this.shift(); + return imageStream; + } + #findStreamLength(startPos) { + const { + stream + } = this.lexer; + stream.pos = startPos; + const SCAN_BLOCK_LENGTH = 2048; + const signatureLength = "endstream".length; + const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]); + const endLength = END_SIGNATURE.length; + const PARTIAL_SIGNATURE = [new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61])]; + const normalLength = signatureLength - endLength; + while (stream.pos < stream.end) { + const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + break; + } + let pos = 0; + while (pos < scanLength) { + let j = 0; + while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) { + j++; + } + if (j >= endLength) { + let found = false; + for (const part of PARTIAL_SIGNATURE) { + const partLen = part.length; + let k = 0; + while (k < partLen && scanBytes[pos + j + k] === part[k]) { + k++; + } + if (k >= normalLength) { + found = true; + break; + } + if (k >= partLen) { + const lastByte = scanBytes[pos + j + k]; + if (isWhiteSpace(lastByte)) { + info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command."); + found = true; + } + break; + } + } + if (found) { + stream.pos += pos; + return stream.pos - startPos; + } + } + pos++; + } + stream.pos += scanLength; + } + return -1; + } + makeStream(dict, cipherTransform) { + const lexer = this.lexer; + let stream = lexer.stream; + lexer.skipToNextLine(); + const startPos = stream.pos - 1; + let length = dict.get("Length"); + if (!Number.isInteger(length)) { + info(`Bad length "${length && length.toString()}" in stream.`); + length = 0; + } + stream.pos = startPos + length; + lexer.nextChar(); + if (this.tryShift() && isCmd(this.buf2, "endstream")) { + this.shift(); + } else { + length = this.#findStreamLength(startPos); + if (length < 0) { + throw new FormatError("Missing endstream command."); + } + lexer.nextChar(); + this.shift(); + this.shift(); + } + this.shift(); + stream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + stream = cipherTransform.createStream(stream, length); + } + stream = this.filter(stream, dict, length); + stream.dict = dict; + return stream; + } + filter(stream, dict, length) { + let filter = dict.get("F", "Filter"); + let params = dict.get("DP", "DecodeParms"); + if (filter instanceof Name) { + if (Array.isArray(params)) { + warn("/DecodeParms should not be an Array, when /Filter is a Name."); + } + return this.makeFilter(stream, filter.name, length, params); + } + let maybeLength = length; + if (Array.isArray(filter)) { + const filterArray = filter; + const paramsArray = params; + for (let i = 0, ii = filterArray.length; i < ii; ++i) { + filter = this.xref.fetchIfRef(filterArray[i]); + if (!(filter instanceof Name)) { + throw new FormatError(`Bad filter name "${filter}"`); + } + params = null; + if (Array.isArray(paramsArray) && i in paramsArray) { + params = this.xref.fetchIfRef(paramsArray[i]); + } + stream = this.makeFilter(stream, filter.name, maybeLength, params); + maybeLength = null; + } + } + return stream; + } + makeFilter(stream, name, maybeLength, params) { + if (maybeLength === 0) { + warn(`Empty "${name}" stream.`); + return new NullStream(); + } + try { + switch (name) { + case "Fl": + case "FlateDecode": + if (params) { + return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params); + } + return new FlateStream(stream, maybeLength); + case "LZW": + case "LZWDecode": + let earlyChange = 1; + if (params) { + if (params.has("EarlyChange")) { + earlyChange = params.get("EarlyChange"); + } + return new PredictorStream(new LZWStream(stream, maybeLength, earlyChange), maybeLength, params); + } + return new LZWStream(stream, maybeLength, earlyChange); + case "DCT": + case "DCTDecode": + return new JpegStream(stream, maybeLength, params); + case "JPX": + case "JPXDecode": + return new JpxStream(stream, maybeLength, params); + case "A85": + case "ASCII85Decode": + return new Ascii85Stream(stream, maybeLength); + case "AHx": + case "ASCIIHexDecode": + return new AsciiHexStream(stream, maybeLength); + case "CCF": + case "CCITTFaxDecode": + return new CCITTFaxStream(stream, maybeLength, params); + case "RL": + case "RunLengthDecode": + return new RunLengthStream(stream, maybeLength); + case "JBIG2Decode": + return new Jbig2Stream(stream, maybeLength, params); + } + warn(`Filter "${name}" is not supported.`); + return stream; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Invalid stream: "${ex}"`); + return new NullStream(); + } + } +} +const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +function toHexDigit(ch) { + if (ch >= 0x30 && ch <= 0x39) { + return ch & 0x0f; + } + if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + return (ch & 0x0f) + 9; + } + return -1; +} +class Lexer { + constructor(stream, knownCommands = null) { + this.stream = stream; + this.nextChar(); + this.strBuf = []; + this.knownCommands = knownCommands; + this._hexStringNumWarn = 0; + this.beginInlineImagePos = -1; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + peekChar() { + return this.stream.peekByte(); + } + getNumber() { + let ch = this.currentChar; + let eNotation = false; + let divideBy = 0; + let sign = 1; + if (ch === 0x2d) { + sign = -1; + ch = this.nextChar(); + if (ch === 0x2d) { + ch = this.nextChar(); + } + } else if (ch === 0x2b) { + ch = this.nextChar(); + } + if (ch === 0x0a || ch === 0x0d) { + do { + ch = this.nextChar(); + } while (ch === 0x0a || ch === 0x0d); + } + if (ch === 0x2e) { + divideBy = 10; + ch = this.nextChar(); + } + if (ch < 0x30 || ch > 0x39) { + const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`; + if (isWhiteSpace(ch) || ch === -1) { + info(`Lexer.getNumber - "${msg}".`); + return 0; + } + throw new FormatError(msg); + } + let baseValue = ch - 0x30; + let powerValue = 0; + let powerValueSign = 1; + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39) { + const currentDigit = ch - 0x30; + if (eNotation) { + powerValue = powerValue * 10 + currentDigit; + } else { + if (divideBy !== 0) { + divideBy *= 10; + } + baseValue = baseValue * 10 + currentDigit; + } + } else if (ch === 0x2e) { + if (divideBy === 0) { + divideBy = 1; + } else { + break; + } + } else if (ch === 0x2d) { + warn("Badly formatted number: minus sign in the middle"); + } else if (ch === 0x45 || ch === 0x65) { + ch = this.peekChar(); + if (ch === 0x2b || ch === 0x2d) { + powerValueSign = ch === 0x2d ? -1 : 1; + this.nextChar(); + } else if (ch < 0x30 || ch > 0x39) { + break; + } + eNotation = true; + } else { + break; + } + } + if (divideBy !== 0) { + baseValue /= divideBy; + } + if (eNotation) { + baseValue *= 10 ** (powerValueSign * powerValue); + } + return sign * baseValue; + } + getString() { + let numParen = 1; + let done = false; + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.nextChar(); + while (true) { + let charBuffered = false; + switch (ch | 0) { + case -1: + warn("Unterminated string"); + done = true; + break; + case 0x28: + ++numParen; + strBuf.push("("); + break; + case 0x29: + if (--numParen === 0) { + this.nextChar(); + done = true; + } else { + strBuf.push(")"); + } + break; + case 0x5c: + ch = this.nextChar(); + switch (ch) { + case -1: + warn("Unterminated string"); + done = true; + break; + case 0x6e: + strBuf.push("\n"); + break; + case 0x72: + strBuf.push("\r"); + break; + case 0x74: + strBuf.push("\t"); + break; + case 0x62: + strBuf.push("\b"); + break; + case 0x66: + strBuf.push("\f"); + break; + case 0x5c: + case 0x28: + case 0x29: + strBuf.push(String.fromCharCode(ch)); + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + let x = ch & 0x0f; + ch = this.nextChar(); + charBuffered = true; + if (ch >= 0x30 && ch <= 0x37) { + x = (x << 3) + (ch & 0x0f); + ch = this.nextChar(); + if (ch >= 0x30 && ch <= 0x37) { + charBuffered = false; + x = (x << 3) + (ch & 0x0f); + } + } + strBuf.push(String.fromCharCode(x)); + break; + case 0x0d: + if (this.peekChar() === 0x0a) { + this.nextChar(); + } + break; + case 0x0a: + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + if (done) { + break; + } + if (!charBuffered) { + ch = this.nextChar(); + } + } + return strBuf.join(""); + } + getName() { + let ch, previousCh; + const strBuf = this.strBuf; + strBuf.length = 0; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + if (ch === 0x23) { + ch = this.nextChar(); + if (specialChars[ch]) { + warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number."); + strBuf.push("#"); + break; + } + const x = toHexDigit(ch); + if (x !== -1) { + previousCh = ch; + ch = this.nextChar(); + const x2 = toHexDigit(ch); + if (x2 === -1) { + warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number."); + strBuf.push("#", String.fromCharCode(previousCh)); + if (specialChars[ch]) { + break; + } + strBuf.push(String.fromCharCode(ch)); + continue; + } + strBuf.push(String.fromCharCode(x << 4 | x2)); + } else { + strBuf.push("#", String.fromCharCode(ch)); + } + } else { + strBuf.push(String.fromCharCode(ch)); + } + } + if (strBuf.length > 127) { + warn(`Name token is longer than allowed by the spec: ${strBuf.length}`); + } + return Name.get(strBuf.join("")); + } + _hexStringWarn(ch) { + const MAX_HEX_STRING_NUM_WARN = 5; + if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { + warn("getHexString - ignoring additional invalid characters."); + return; + } + if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { + return; + } + warn(`getHexString - ignoring invalid character: ${ch}`); + } + getHexString() { + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.currentChar; + let firstDigit = -1, + digit = -1; + this._hexStringNumWarn = 0; + while (true) { + if (ch < 0) { + warn("Unterminated hex string"); + break; + } else if (ch === 0x3e) { + this.nextChar(); + break; + } else if (specialChars[ch] === 1) { + ch = this.nextChar(); + continue; + } else { + digit = toHexDigit(ch); + if (digit === -1) { + this._hexStringWarn(ch); + } else if (firstDigit === -1) { + firstDigit = digit; + } else { + strBuf.push(String.fromCharCode(firstDigit << 4 | digit)); + firstDigit = -1; + } + ch = this.nextChar(); + } + } + if (firstDigit !== -1) { + strBuf.push(String.fromCharCode(firstDigit << 4)); + } + return strBuf.join(""); + } + getObj() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (specialChars[ch] !== 1) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2b: + case 0x2d: + case 0x2e: + return this.getNumber(); + case 0x28: + return this.getString(); + case 0x2f: + return this.getName(); + case 0x5b: + this.nextChar(); + return Cmd.get("["); + case 0x5d: + this.nextChar(); + return Cmd.get("]"); + case 0x3c: + ch = this.nextChar(); + if (ch === 0x3c) { + this.nextChar(); + return Cmd.get("<<"); + } + return this.getHexString(); + case 0x3e: + ch = this.nextChar(); + if (ch === 0x3e) { + this.nextChar(); + return Cmd.get(">>"); + } + return Cmd.get(">"); + case 0x7b: + this.nextChar(); + return Cmd.get("{"); + case 0x7d: + this.nextChar(); + return Cmd.get("}"); + case 0x29: + this.nextChar(); + throw new FormatError(`Illegal character: ${ch}`); + } + let str = String.fromCharCode(ch); + if (ch < 0x20 || ch > 0x7f) { + const nextCh = this.peekChar(); + if (nextCh >= 0x20 && nextCh <= 0x7f) { + this.nextChar(); + return Cmd.get(str); + } + } + const knownCommands = this.knownCommands; + let knownCommandFound = knownCommands?.[str] !== undefined; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + const possibleCommand = str + String.fromCharCode(ch); + if (knownCommandFound && knownCommands[possibleCommand] === undefined) { + break; + } + if (str.length === 128) { + throw new FormatError(`Command token too long: ${str.length}`); + } + str = possibleCommand; + knownCommandFound = knownCommands?.[str] !== undefined; + } + if (str === "true") { + return true; + } + if (str === "false") { + return false; + } + if (str === "null") { + return null; + } + if (str === "BI") { + this.beginInlineImagePos = this.stream.pos; + } + return Cmd.get(str); + } + skipToNextLine() { + let ch = this.currentChar; + while (ch >= 0) { + if (ch === 0x0d) { + ch = this.nextChar(); + if (ch === 0x0a) { + this.nextChar(); + } + break; + } else if (ch === 0x0a) { + this.nextChar(); + break; + } + ch = this.nextChar(); + } + } +} +class Linearization { + static create(stream) { + function getInt(linDict, name, allowZeroValue = false) { + const obj = linDict.get(name); + if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { + return obj; + } + throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid."); + } + function getHints(linDict) { + const hints = linDict.get("H"); + let hintsLength; + if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { + for (let index = 0; index < hintsLength; index++) { + const hint = hints[index]; + if (!(Number.isInteger(hint) && hint > 0)) { + throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`); + } + } + return hints; + } + throw new Error("Hint array in the linearization dictionary is invalid."); + } + const parser = new Parser({ + lexer: new Lexer(stream), + xref: null + }); + const obj1 = parser.getObj(); + const obj2 = parser.getObj(); + const obj3 = parser.getObj(); + const linDict = parser.getObj(); + let obj, length; + if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { + return null; + } else if ((length = getInt(linDict, "L")) !== stream.length) { + throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); + } + return { + length, + hints: getHints(linDict), + objectNumberFirst: getInt(linDict, "O"), + endFirst: getInt(linDict, "E"), + numPages: getInt(linDict, "N"), + mainXRefEntriesOffset: getInt(linDict, "T"), + pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 + }; + } +} + +;// ./src/core/cmap.js + + + + + + + +const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"]; +const MAX_MAP_RANGE = 2 ** 24 - 1; +class CMap { + constructor(builtInCMap = false) { + this.codespaceRanges = [[], [], [], []]; + this.numCodespaceRanges = 0; + this._map = []; + this.name = ""; + this.vertical = false; + this.useCMap = null; + this.builtInCMap = builtInCMap; + } + addCodespaceRange(n, low, high) { + this.codespaceRanges[n - 1].push(low, high); + this.numCodespaceRanges++; + } + mapCidRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); + } + while (low <= high) { + this._map[low++] = dstLow++; + } + } + mapBfRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); + } + const lastByte = dstLow.length - 1; + while (low <= high) { + this._map[low++] = dstLow; + const nextCharCode = dstLow.charCodeAt(lastByte) + 1; + if (nextCharCode > 0xff) { + dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00"; + continue; + } + dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); + } + } + mapBfRangeToArray(low, high, array) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); + } + const ii = array.length; + let i = 0; + while (low <= high && i < ii) { + this._map[low] = array[i++]; + ++low; + } + } + mapOne(src, dst) { + this._map[src] = dst; + } + lookup(code) { + return this._map[code]; + } + contains(code) { + return this._map[code] !== undefined; + } + forEach(callback) { + const map = this._map; + const length = map.length; + if (length <= 0x10000) { + for (let i = 0; i < length; i++) { + if (map[i] !== undefined) { + callback(i, map[i]); + } + } + } else { + for (const i in map) { + callback(i, map[i]); + } + } + } + charCodeOf(value) { + const map = this._map; + if (map.length <= 0x10000) { + return map.indexOf(value); + } + for (const charCode in map) { + if (map[charCode] === value) { + return charCode | 0; + } + } + return -1; + } + getMap() { + return this._map; + } + readCharCode(str, offset, out) { + let c = 0; + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (c >= low && c <= high) { + out.charcode = c; + out.length = n + 1; + return; + } + } + } + out.charcode = 0; + out.length = 1; + } + getCharCodeLength(charCode) { + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (charCode >= low && charCode <= high) { + return n + 1; + } + } + } + return 1; + } + get length() { + return this._map.length; + } + get isIdentityCMap() { + if (!(this.name === "Identity-H" || this.name === "Identity-V")) { + return false; + } + if (this._map.length !== 0x10000) { + return false; + } + for (let i = 0; i < 0x10000; i++) { + if (this._map[i] !== i) { + return false; + } + } + return true; + } +} +class IdentityCMap extends CMap { + constructor(vertical, n) { + super(); + this.vertical = vertical; + this.addCodespaceRange(n, 0, 0xffff); + } + mapCidRange(low, high, dstLow) { + unreachable("should not call mapCidRange"); + } + mapBfRange(low, high, dstLow) { + unreachable("should not call mapBfRange"); + } + mapBfRangeToArray(low, high, array) { + unreachable("should not call mapBfRangeToArray"); + } + mapOne(src, dst) { + unreachable("should not call mapCidOne"); + } + lookup(code) { + return Number.isInteger(code) && code <= 0xffff ? code : undefined; + } + contains(code) { + return Number.isInteger(code) && code <= 0xffff; + } + forEach(callback) { + for (let i = 0; i <= 0xffff; i++) { + callback(i, i); + } + } + charCodeOf(value) { + return Number.isInteger(value) && value <= 0xffff ? value : -1; + } + getMap() { + const map = new Array(0x10000); + for (let i = 0; i <= 0xffff; i++) { + map[i] = i; + } + return map; + } + get length() { + return 0x10000; + } + get isIdentityCMap() { + unreachable("should not access .isIdentityCMap"); + } +} +function strToInt(str) { + let a = 0; + for (let i = 0; i < str.length; i++) { + a = a << 8 | str.charCodeAt(i); + } + return a >>> 0; +} +function expectString(obj) { + if (typeof obj !== "string") { + throw new FormatError("Malformed CMap: expected string."); + } +} +function expectInt(obj) { + if (!Number.isInteger(obj)) { + throw new FormatError("Malformed CMap: expected int."); + } +} +function parseBfChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endbfchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const dst = obj; + cMap.mapOne(src, dst); + } +} +function parseBfRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endbfrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + if (Number.isInteger(obj) || typeof obj === "string") { + const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; + cMap.mapBfRange(low, high, dstLow); + } else if (isCmd(obj, "[")) { + obj = lexer.getObj(); + const array = []; + while (!isCmd(obj, "]") && obj !== EOF) { + array.push(obj); + obj = lexer.getObj(); + } + cMap.mapBfRangeToArray(low, high, array); + } else { + break; + } + } + throw new FormatError("Invalid bf range."); +} +function parseCidChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcidchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dst = obj; + cMap.mapOne(src, dst); + } +} +function parseCidRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcidrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dstLow = obj; + cMap.mapCidRange(low, high, dstLow); + } +} +function parseCodespaceRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcodespacerange")) { + return; + } + if (typeof obj !== "string") { + break; + } + const low = strToInt(obj); + obj = lexer.getObj(); + if (typeof obj !== "string") { + break; + } + const high = strToInt(obj); + cMap.addCodespaceRange(obj.length, low, high); + } + throw new FormatError("Invalid codespace range."); +} +function parseWMode(cMap, lexer) { + const obj = lexer.getObj(); + if (Number.isInteger(obj)) { + cMap.vertical = !!obj; + } +} +function parseCMapName(cMap, lexer) { + const obj = lexer.getObj(); + if (obj instanceof Name) { + cMap.name = obj.name; + } +} +async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { + let previous, embeddedUseCMap; + objLoop: while (true) { + try { + const obj = lexer.getObj(); + if (obj === EOF) { + break; + } else if (obj instanceof Name) { + if (obj.name === "WMode") { + parseWMode(cMap, lexer); + } else if (obj.name === "CMapName") { + parseCMapName(cMap, lexer); + } + previous = obj; + } else if (obj instanceof Cmd) { + switch (obj.cmd) { + case "endcmap": + break objLoop; + case "usecmap": + if (previous instanceof Name) { + embeddedUseCMap = previous.name; + } + break; + case "begincodespacerange": + parseCodespaceRange(cMap, lexer); + break; + case "beginbfchar": + parseBfChar(cMap, lexer); + break; + case "begincidchar": + parseCidChar(cMap, lexer); + break; + case "beginbfrange": + parseBfRange(cMap, lexer); + break; + case "begincidrange": + parseCidRange(cMap, lexer); + break; + } + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Invalid cMap data: " + ex); + continue; + } + } + if (!useCMap && embeddedUseCMap) { + useCMap = embeddedUseCMap; + } + if (useCMap) { + return extendCMap(cMap, fetchBuiltInCMap, useCMap); + } + return cMap; +} +async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { + cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); + if (cMap.numCodespaceRanges === 0) { + const useCodespaceRanges = cMap.useCMap.codespaceRanges; + for (let i = 0; i < useCodespaceRanges.length; i++) { + cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); + } + cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; + } + cMap.useCMap.forEach(function (key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, value); + } + }); + return cMap; +} +async function createBuiltInCMap(name, fetchBuiltInCMap) { + if (name === "Identity-H") { + return new IdentityCMap(false, 2); + } else if (name === "Identity-V") { + return new IdentityCMap(true, 2); + } + if (!BUILT_IN_CMAPS.includes(name)) { + throw new Error("Unknown CMap name: " + name); + } + if (!fetchBuiltInCMap) { + throw new Error("Built-in CMap parameters are not provided."); + } + const { + cMapData, + isCompressed + } = await fetchBuiltInCMap(name); + const cMap = new CMap(true); + if (isCompressed) { + return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap)); + } + const lexer = new Lexer(new Stream(cMapData)); + return parseCMap(cMap, lexer, fetchBuiltInCMap, null); +} +class CMapFactory { + static async create({ + encoding, + fetchBuiltInCMap, + useCMap + }) { + if (encoding instanceof Name) { + return createBuiltInCMap(encoding.name, fetchBuiltInCMap); + } else if (encoding instanceof BaseStream) { + const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap); + if (parsedCMap.isIdentityCMap) { + return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); + } + return parsedCMap; + } + throw new Error("Encoding required."); + } +} + +;// ./src/core/charsets.js +const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"]; +const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", "onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior"]; + +;// ./src/core/encodings.js +const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", "osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", "hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""]; +const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"]; +const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", "dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", "ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", "ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", "", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""]; +const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"]; +const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""]; +const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""]; +function getEncoding(encodingName) { + switch (encodingName) { + case "WinAnsiEncoding": + return WinAnsiEncoding; + case "StandardEncoding": + return StandardEncoding; + case "MacRomanEncoding": + return MacRomanEncoding; + case "SymbolSetEncoding": + return SymbolSetEncoding; + case "ZapfDingbatsEncoding": + return ZapfDingbatsEncoding; + case "ExpertEncoding": + return ExpertEncoding; + case "MacExpertEncoding": + return MacExpertEncoding; + default: + return null; + } +} + +;// ./src/core/cff_parser.js + + + +const MAX_SUBR_NESTING = 10; +const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; +const NUM_STANDARD_CFF_STRINGS = 391; +const CharstringValidationData = [null, { + id: "hstem", + min: 2, + stackClearing: true, + stem: true +}, null, { + id: "vstem", + min: 2, + stackClearing: true, + stem: true +}, { + id: "vmoveto", + min: 1, + stackClearing: true +}, { + id: "rlineto", + min: 2, + resetStack: true +}, { + id: "hlineto", + min: 1, + resetStack: true +}, { + id: "vlineto", + min: 1, + resetStack: true +}, { + id: "rrcurveto", + min: 6, + resetStack: true +}, null, { + id: "callsubr", + min: 1, + undefStack: true +}, { + id: "return", + min: 0, + undefStack: true +}, null, null, { + id: "endchar", + min: 0, + stackClearing: true +}, null, null, null, { + id: "hstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "hintmask", + min: 0, + stackClearing: true +}, { + id: "cntrmask", + min: 0, + stackClearing: true +}, { + id: "rmoveto", + min: 2, + stackClearing: true +}, { + id: "hmoveto", + min: 1, + stackClearing: true +}, { + id: "vstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "rcurveline", + min: 8, + resetStack: true +}, { + id: "rlinecurve", + min: 8, + resetStack: true +}, { + id: "vvcurveto", + min: 4, + resetStack: true +}, { + id: "hhcurveto", + min: 4, + resetStack: true +}, null, { + id: "callgsubr", + min: 1, + undefStack: true +}, { + id: "vhcurveto", + min: 4, + resetStack: true +}, { + id: "hvcurveto", + min: 4, + resetStack: true +}]; +const CharstringValidationData12 = [null, null, null, { + id: "and", + min: 2, + stackDelta: -1 +}, { + id: "or", + min: 2, + stackDelta: -1 +}, { + id: "not", + min: 1, + stackDelta: 0 +}, null, null, null, { + id: "abs", + min: 1, + stackDelta: 0 +}, { + id: "add", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] + stack[index - 1]; + } +}, { + id: "sub", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] - stack[index - 1]; + } +}, { + id: "div", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] / stack[index - 1]; + } +}, null, { + id: "neg", + min: 1, + stackDelta: 0, + stackFn(stack, index) { + stack[index - 1] = -stack[index - 1]; + } +}, { + id: "eq", + min: 2, + stackDelta: -1 +}, null, null, { + id: "drop", + min: 1, + stackDelta: -1 +}, null, { + id: "put", + min: 2, + stackDelta: -2 +}, { + id: "get", + min: 1, + stackDelta: 0 +}, { + id: "ifelse", + min: 4, + stackDelta: -3 +}, { + id: "random", + min: 0, + stackDelta: 1 +}, { + id: "mul", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] * stack[index - 1]; + } +}, null, { + id: "sqrt", + min: 1, + stackDelta: 0 +}, { + id: "dup", + min: 1, + stackDelta: 1 +}, { + id: "exch", + min: 2, + stackDelta: 0 +}, { + id: "index", + min: 2, + stackDelta: 0 +}, { + id: "roll", + min: 3, + stackDelta: -2 +}, null, null, null, { + id: "hflex", + min: 7, + resetStack: true +}, { + id: "flex", + min: 13, + resetStack: true +}, { + id: "hflex1", + min: 9, + resetStack: true +}, { + id: "flex1", + min: 11, + resetStack: true +}]; +class CFFParser { + constructor(file, properties, seacAnalysisEnabled) { + this.bytes = file.getBytes(); + this.properties = properties; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + } + parse() { + const properties = this.properties; + const cff = new CFF(); + this.cff = cff; + const header = this.parseHeader(); + const nameIndex = this.parseIndex(header.endPos); + const topDictIndex = this.parseIndex(nameIndex.endPos); + const stringIndex = this.parseIndex(topDictIndex.endPos); + const globalSubrIndex = this.parseIndex(stringIndex.endPos); + const topDictParsed = this.parseDict(topDictIndex.obj.get(0)); + const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); + cff.header = header.obj; + cff.names = this.parseNameIndex(nameIndex.obj); + cff.strings = this.parseStringIndex(stringIndex.obj); + cff.topDict = topDict; + cff.globalSubrIndex = globalSubrIndex.obj; + this.parsePrivateDict(cff.topDict); + cff.isCIDFont = topDict.hasName("ROS"); + const charStringOffset = topDict.getByName("CharStrings"); + const charStringIndex = this.parseIndex(charStringOffset).obj; + const fontMatrix = topDict.getByName("FontMatrix"); + if (fontMatrix) { + properties.fontMatrix = fontMatrix; + } + const fontBBox = topDict.getByName("FontBBox"); + if (fontBBox) { + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + } + let charset, encoding; + if (cff.isCIDFont) { + const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; + for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) { + const dictRaw = fdArrayIndex.get(i); + const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); + this.parsePrivateDict(fontDict); + cff.fdArray.push(fontDict); + } + encoding = null; + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); + cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); + } else { + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); + encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); + } + cff.charset = charset; + cff.encoding = encoding; + const charStringsAndSeacs = this.parseCharStrings({ + charStrings: charStringIndex, + localSubrIndex: topDict.privateDict.subrsIndex, + globalSubrIndex: globalSubrIndex.obj, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray, + privateDict: topDict.privateDict + }); + cff.charStrings = charStringsAndSeacs.charStrings; + cff.seacs = charStringsAndSeacs.seacs; + cff.widths = charStringsAndSeacs.widths; + return cff; + } + parseHeader() { + let bytes = this.bytes; + const bytesLength = bytes.length; + let offset = 0; + while (offset < bytesLength && bytes[offset] !== 1) { + ++offset; + } + if (offset >= bytesLength) { + throw new FormatError("Invalid CFF header"); + } + if (offset !== 0) { + info("cff data is shifted"); + bytes = bytes.subarray(offset); + this.bytes = bytes; + } + const major = bytes[0]; + const minor = bytes[1]; + const hdrSize = bytes[2]; + const offSize = bytes[3]; + const header = new CFFHeader(major, minor, hdrSize, offSize); + return { + obj: header, + endPos: hdrSize + }; + } + parseDict(dict) { + let pos = 0; + function parseOperand() { + let value = dict[pos++]; + if (value === 30) { + return parseFloatOperand(); + } else if (value === 28) { + value = dict[pos++]; + value = (value << 24 | dict[pos++] << 16) >> 16; + return value; + } else if (value === 29) { + value = dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + return value; + } else if (value >= 32 && value <= 246) { + return value - 139; + } else if (value >= 247 && value <= 250) { + return (value - 247) * 256 + dict[pos++] + 108; + } else if (value >= 251 && value <= 254) { + return -((value - 251) * 256) - dict[pos++] - 108; + } + warn('CFFParser_parseDict: "' + value + '" is a reserved command.'); + return NaN; + } + function parseFloatOperand() { + let str = ""; + const eof = 15; + const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"]; + const length = dict.length; + while (pos < length) { + const b = dict[pos++]; + const b1 = b >> 4; + const b2 = b & 15; + if (b1 === eof) { + break; + } + str += lookup[b1]; + if (b2 === eof) { + break; + } + str += lookup[b2]; + } + return parseFloat(str); + } + let operands = []; + const entries = []; + pos = 0; + const end = dict.length; + while (pos < end) { + let b = dict[pos]; + if (b <= 21) { + if (b === 12) { + b = b << 8 | dict[++pos]; + } + entries.push([b, operands]); + operands = []; + ++pos; + } else { + operands.push(parseOperand()); + } + } + return entries; + } + parseIndex(pos) { + const cffIndex = new CFFIndex(); + const bytes = this.bytes; + const count = bytes[pos++] << 8 | bytes[pos++]; + const offsets = []; + let end = pos; + let i, ii; + if (count !== 0) { + const offsetSize = bytes[pos++]; + const startPos = pos + (count + 1) * offsetSize - 1; + for (i = 0, ii = count + 1; i < ii; ++i) { + let offset = 0; + for (let j = 0; j < offsetSize; ++j) { + offset <<= 8; + offset += bytes[pos++]; + } + offsets.push(startPos + offset); + } + end = offsets[count]; + } + for (i = 0, ii = offsets.length - 1; i < ii; ++i) { + const offsetStart = offsets[i]; + const offsetEnd = offsets[i + 1]; + cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); + } + return { + obj: cffIndex, + endPos: end + }; + } + parseNameIndex(index) { + const names = []; + for (let i = 0, ii = index.count; i < ii; ++i) { + const name = index.get(i); + names.push(bytesToString(name)); + } + return names; + } + parseStringIndex(index) { + const strings = new CFFStrings(); + for (let i = 0, ii = index.count; i < ii; ++i) { + const data = index.get(i); + strings.add(bytesToString(data)); + } + return strings; + } + createDict(Type, dict, strings) { + const cffDict = new Type(strings); + for (const [key, value] of dict) { + cffDict.setByKey(key, value); + } + return cffDict; + } + parseCharString(state, data, localSubrIndex, globalSubrIndex) { + if (!data || state.callDepth > MAX_SUBR_NESTING) { + return false; + } + let stackSize = state.stackSize; + const stack = state.stack; + let length = data.length; + for (let j = 0; j < length;) { + const value = data[j++]; + let validationCommand = null; + if (value === 12) { + const q = data[j++]; + if (q === 0) { + data[j - 2] = 139; + data[j - 1] = 22; + stackSize = 0; + } else { + validationCommand = CharstringValidationData12[q]; + } + } else if (value === 28) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16; + j += 2; + stackSize++; + } else if (value === 14) { + if (stackSize >= 4) { + stackSize -= 4; + if (this.seacAnalysisEnabled) { + state.seac = stack.slice(stackSize, stackSize + 4); + return false; + } + } + validationCommand = CharstringValidationData[value]; + } else if (value >= 32 && value <= 246) { + stack[stackSize] = value - 139; + stackSize++; + } else if (value >= 247 && value <= 254) { + stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; + j++; + stackSize++; + } else if (value === 255) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536; + j += 4; + stackSize++; + } else if (value === 19 || value === 20) { + state.hints += stackSize >> 1; + if (state.hints === 0) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } + j += state.hints + 7 >> 3; + stackSize %= 2; + validationCommand = CharstringValidationData[value]; + } else if (value === 10 || value === 29) { + const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex; + if (!subrsIndex) { + validationCommand = CharstringValidationData[value]; + warn("Missing subrsIndex for " + validationCommand.id); + return false; + } + let bias = 32768; + if (subrsIndex.count < 1240) { + bias = 107; + } else if (subrsIndex.count < 33900) { + bias = 1131; + } + const subrNumber = stack[--stackSize] + bias; + if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) { + validationCommand = CharstringValidationData[value]; + warn("Out of bounds subrIndex for " + validationCommand.id); + return false; + } + state.stackSize = stackSize; + state.callDepth++; + const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); + if (!valid) { + return false; + } + state.callDepth--; + stackSize = state.stackSize; + continue; + } else if (value === 11) { + state.stackSize = stackSize; + return true; + } else if (value === 0 && j === data.length) { + data[j - 1] = 14; + validationCommand = CharstringValidationData[14]; + } else if (value === 9) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } else { + validationCommand = CharstringValidationData[value]; + } + if (validationCommand) { + if (validationCommand.stem) { + state.hints += stackSize >> 1; + if (value === 3 || value === 23) { + state.hasVStems = true; + } else if (state.hasVStems && (value === 1 || value === 18)) { + warn("CFF stem hints are in wrong order"); + data[j - 1] = value === 1 ? 3 : 23; + } + } + if ("min" in validationCommand) { + if (!state.undefStack && stackSize < validationCommand.min) { + warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min); + if (stackSize === 0) { + data[j - 1] = 14; + return true; + } + return false; + } + } + if (state.firstStackClearing && validationCommand.stackClearing) { + state.firstStackClearing = false; + stackSize -= validationCommand.min; + if (stackSize >= 2 && validationCommand.stem) { + stackSize %= 2; + } else if (stackSize > 1) { + warn("Found too many parameters for stack-clearing command"); + } + if (stackSize > 0) { + state.width = stack[stackSize - 1]; + } + } + if ("stackDelta" in validationCommand) { + if ("stackFn" in validationCommand) { + validationCommand.stackFn(stack, stackSize); + } + stackSize += validationCommand.stackDelta; + } else if (validationCommand.stackClearing) { + stackSize = 0; + } else if (validationCommand.resetStack) { + stackSize = 0; + state.undefStack = false; + } else if (validationCommand.undefStack) { + stackSize = 0; + state.undefStack = true; + state.firstStackClearing = false; + } + } + } + if (length < data.length) { + data.fill(14, length); + } + state.stackSize = stackSize; + return true; + } + parseCharStrings({ + charStrings, + localSubrIndex, + globalSubrIndex, + fdSelect, + fdArray, + privateDict + }) { + const seacs = []; + const widths = []; + const count = charStrings.count; + for (let i = 0; i < count; i++) { + const charstring = charStrings.get(i); + const state = { + callDepth: 0, + stackSize: 0, + stack: [], + undefStack: true, + hints: 0, + firstStackClearing: true, + seac: null, + width: null, + hasVStems: false + }; + let valid = true; + let localSubrToUse = null; + let privateDictToUse = privateDict; + if (fdSelect && fdArray.length) { + const fdIndex = fdSelect.getFDIndex(i); + if (fdIndex === -1) { + warn("Glyph index is not in fd select."); + valid = false; + } + if (fdIndex >= fdArray.length) { + warn("Invalid fd index for glyph index."); + valid = false; + } + if (valid) { + privateDictToUse = fdArray[fdIndex].privateDict; + localSubrToUse = privateDictToUse.subrsIndex; + } + } else if (localSubrIndex) { + localSubrToUse = localSubrIndex; + } + if (valid) { + valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); + } + if (state.width !== null) { + const nominalWidth = privateDictToUse.getByName("nominalWidthX"); + widths[i] = nominalWidth + state.width; + } else { + const defaultWidth = privateDictToUse.getByName("defaultWidthX"); + widths[i] = defaultWidth; + } + if (state.seac !== null) { + seacs[i] = state.seac; + } + if (!valid) { + charStrings.set(i, new Uint8Array([14])); + } + } + return { + charStrings, + seacs, + widths + }; + } + emptyPrivateDictionary(parentDict) { + const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); + parentDict.setByKey(18, [0, 0]); + parentDict.privateDict = privateDict; + } + parsePrivateDict(parentDict) { + if (!parentDict.hasName("Private")) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateOffset = parentDict.getByName("Private"); + if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { + parentDict.removeByName("Private"); + return; + } + const size = privateOffset[0]; + const offset = privateOffset[1]; + if (size === 0 || offset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateDictEnd = offset + size; + const dictData = this.bytes.subarray(offset, privateDictEnd); + const dict = this.parseDict(dictData); + const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); + parentDict.privateDict = privateDict; + if (privateDict.getByName("ExpansionFactor") === 0) { + privateDict.setByName("ExpansionFactor", 0.06); + } + if (!privateDict.getByName("Subrs")) { + return; + } + const subrsOffset = privateDict.getByName("Subrs"); + const relativeOffset = offset + subrsOffset; + if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const subrsIndex = this.parseIndex(relativeOffset); + privateDict.subrsIndex = subrsIndex.obj; + } + parseCharsets(pos, length, strings, cid) { + if (pos === 0) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); + } else if (pos === 1) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); + } else if (pos === 2) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); + } + const bytes = this.bytes; + const start = pos; + const format = bytes[pos++]; + const charset = [cid ? 0 : ".notdef"]; + let id, count, i; + length -= 1; + switch (format) { + case 0: + for (i = 0; i < length; i++) { + id = bytes[pos++] << 8 | bytes[pos++]; + charset.push(cid ? id : strings.get(id)); + } + break; + case 1: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + case 2: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + default: + throw new FormatError("Unknown charset format"); + } + const end = pos; + const raw = bytes.subarray(start, end); + return new CFFCharset(false, format, charset, raw); + } + parseEncoding(pos, properties, strings, charset) { + const encoding = Object.create(null); + const bytes = this.bytes; + let predefined = false; + let format, i, ii; + let raw = null; + function readSupplement() { + const supplementsCount = bytes[pos++]; + for (i = 0; i < supplementsCount; i++) { + const code = bytes[pos++]; + const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); + encoding[code] = charset.indexOf(strings.get(sid)); + } + } + if (pos === 0 || pos === 1) { + predefined = true; + format = pos; + const baseEncoding = pos ? ExpertEncoding : StandardEncoding; + for (i = 0, ii = charset.length; i < ii; i++) { + const index = baseEncoding.indexOf(charset[i]); + if (index !== -1) { + encoding[index] = i; + } + } + } else { + const dataStart = pos; + format = bytes[pos++]; + switch (format & 0x7f) { + case 0: + const glyphsCount = bytes[pos++]; + for (i = 1; i <= glyphsCount; i++) { + encoding[bytes[pos++]] = i; + } + break; + case 1: + const rangesCount = bytes[pos++]; + let gid = 1; + for (i = 0; i < rangesCount; i++) { + const start = bytes[pos++]; + const left = bytes[pos++]; + for (let j = start; j <= start + left; j++) { + encoding[j] = gid++; + } + } + break; + default: + throw new FormatError(`Unknown encoding format: ${format} in CFF`); + } + const dataEnd = pos; + if (format & 0x80) { + bytes[dataStart] &= 0x7f; + readSupplement(); + } + raw = bytes.subarray(dataStart, dataEnd); + } + format &= 0x7f; + return new CFFEncoding(predefined, format, encoding, raw); + } + parseFDSelect(pos, length) { + const bytes = this.bytes; + const format = bytes[pos++]; + const fdSelect = []; + let i; + switch (format) { + case 0: + for (i = 0; i < length; ++i) { + const id = bytes[pos++]; + fdSelect.push(id); + } + break; + case 3: + const rangesCount = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i < rangesCount; ++i) { + let first = bytes[pos++] << 8 | bytes[pos++]; + if (i === 0 && first !== 0) { + warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover."); + first = 0; + } + const fdIndex = bytes[pos++]; + const next = bytes[pos] << 8 | bytes[pos + 1]; + for (let j = first; j < next; ++j) { + fdSelect.push(fdIndex); + } + } + pos += 2; + break; + default: + throw new FormatError(`parseFDSelect: Unknown format "${format}".`); + } + if (fdSelect.length !== length) { + throw new FormatError("parseFDSelect: Invalid font data."); + } + return new CFFFDSelect(format, fdSelect); + } +} +class CFF { + constructor() { + this.header = null; + this.names = []; + this.topDict = null; + this.strings = new CFFStrings(); + this.globalSubrIndex = null; + this.encoding = null; + this.charset = null; + this.charStrings = null; + this.fdArray = []; + this.fdSelect = null; + this.isCIDFont = false; + } + duplicateFirstGlyph() { + if (this.charStrings.count >= 65535) { + warn("Not enough space in charstrings to duplicate first glyph."); + return; + } + const glyphZero = this.charStrings.get(0); + this.charStrings.add(glyphZero); + if (this.isCIDFont) { + this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + } + } + hasGlyphId(id) { + if (id < 0 || id >= this.charStrings.count) { + return false; + } + const glyph = this.charStrings.get(id); + return glyph.length > 0; + } +} +class CFFHeader { + constructor(major, minor, hdrSize, offSize) { + this.major = major; + this.minor = minor; + this.hdrSize = hdrSize; + this.offSize = offSize; + } +} +class CFFStrings { + constructor() { + this.strings = []; + } + get(index) { + if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { + return CFFStandardStrings[index]; + } + if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { + return this.strings[index - NUM_STANDARD_CFF_STRINGS]; + } + return CFFStandardStrings[0]; + } + getSID(str) { + let index = CFFStandardStrings.indexOf(str); + if (index !== -1) { + return index; + } + index = this.strings.indexOf(str); + if (index !== -1) { + return index + NUM_STANDARD_CFF_STRINGS; + } + return -1; + } + add(value) { + this.strings.push(value); + } + get count() { + return this.strings.length; + } +} +class CFFIndex { + constructor() { + this.objects = []; + this.length = 0; + } + add(data) { + this.length += data.length; + this.objects.push(data); + } + set(index, data) { + this.length += data.length - this.objects[index].length; + this.objects[index] = data; + } + get(index) { + return this.objects[index]; + } + get count() { + return this.objects.length; + } +} +class CFFDict { + constructor(tables, strings) { + this.keyToNameMap = tables.keyToNameMap; + this.nameToKeyMap = tables.nameToKeyMap; + this.defaults = tables.defaults; + this.types = tables.types; + this.opcodes = tables.opcodes; + this.order = tables.order; + this.strings = strings; + this.values = Object.create(null); + } + setByKey(key, value) { + if (!(key in this.keyToNameMap)) { + return false; + } + if (value.length === 0) { + return true; + } + for (const val of value) { + if (isNaN(val)) { + warn(`Invalid CFFDict value: "${value}" for key "${key}".`); + return true; + } + } + const type = this.types[key]; + if (type === "num" || type === "sid" || type === "offset") { + value = value[0]; + } + this.values[key] = value; + return true; + } + setByName(name, value) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name "${name}"`); + } + this.values[this.nameToKeyMap[name]] = value; + } + hasName(name) { + return this.nameToKeyMap[name] in this.values; + } + getByName(name) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name ${name}"`); + } + const key = this.nameToKeyMap[name]; + if (!(key in this.values)) { + return this.defaults[key]; + } + return this.values[key]; + } + removeByName(name) { + delete this.values[this.nameToKeyMap[name]]; + } + static createTables(layout) { + const tables = { + keyToNameMap: {}, + nameToKeyMap: {}, + defaults: {}, + types: {}, + opcodes: {}, + order: [] + }; + for (const entry of layout) { + const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; + tables.keyToNameMap[key] = entry[1]; + tables.nameToKeyMap[entry[1]] = key; + tables.types[key] = entry[2]; + tables.defaults[key] = entry[3]; + tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]]; + tables.order.push(key); + } + return tables; + } +} +const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]]; +class CFFTopDict extends CFFDict { + static get tables() { + return shadow(this, "tables", this.createTables(CFFTopDictLayout)); + } + constructor(strings) { + super(CFFTopDict.tables, strings); + this.privateDict = null; + } +} +const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], "BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]]; +class CFFPrivateDict extends CFFDict { + static get tables() { + return shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); + } + constructor(strings) { + super(CFFPrivateDict.tables, strings); + this.subrsIndex = null; + } +} +const CFFCharsetPredefinedTypes = { + ISO_ADOBE: 0, + EXPERT: 1, + EXPERT_SUBSET: 2 +}; +class CFFCharset { + constructor(predefined, format, charset, raw) { + this.predefined = predefined; + this.format = format; + this.charset = charset; + this.raw = raw; + } +} +class CFFEncoding { + constructor(predefined, format, encoding, raw) { + this.predefined = predefined; + this.format = format; + this.encoding = encoding; + this.raw = raw; + } +} +class CFFFDSelect { + constructor(format, fdSelect) { + this.format = format; + this.fdSelect = fdSelect; + } + getFDIndex(glyphIndex) { + if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { + return -1; + } + return this.fdSelect[glyphIndex]; + } +} +class CFFOffsetTracker { + constructor() { + this.offsets = Object.create(null); + } + isTracking(key) { + return key in this.offsets; + } + track(key, location) { + if (key in this.offsets) { + throw new FormatError(`Already tracking location of ${key}`); + } + this.offsets[key] = location; + } + offset(value) { + for (const key in this.offsets) { + this.offsets[key] += value; + } + } + setEntryLocation(key, values, output) { + if (!(key in this.offsets)) { + throw new FormatError(`Not tracking location of ${key}`); + } + const data = output.data; + const dataOffset = this.offsets[key]; + const size = 5; + for (let i = 0, ii = values.length; i < ii; ++i) { + const offset0 = i * size + dataOffset; + const offset1 = offset0 + 1; + const offset2 = offset0 + 2; + const offset3 = offset0 + 3; + const offset4 = offset0 + 4; + if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { + throw new FormatError("writing to an offset that is not empty"); + } + const value = values[i]; + data[offset0] = 0x1d; + data[offset1] = value >> 24 & 0xff; + data[offset2] = value >> 16 & 0xff; + data[offset3] = value >> 8 & 0xff; + data[offset4] = value & 0xff; + } + } +} +class CFFCompiler { + constructor(cff) { + this.cff = cff; + } + compile() { + const cff = this.cff; + const output = { + data: [], + length: 0, + add(data) { + try { + this.data.push(...data); + } catch { + this.data = this.data.concat(data); + } + this.length = this.data.length; + } + }; + const header = this.compileHeader(cff.header); + output.add(header); + const nameIndex = this.compileNameIndex(cff.names); + output.add(nameIndex); + if (cff.isCIDFont) { + if (cff.topDict.hasName("FontMatrix")) { + const base = cff.topDict.getByName("FontMatrix"); + cff.topDict.removeByName("FontMatrix"); + for (const subDict of cff.fdArray) { + let matrix = base.slice(0); + if (subDict.hasName("FontMatrix")) { + matrix = Util.transform(matrix, subDict.getByName("FontMatrix")); + } + subDict.setByName("FontMatrix", matrix); + } + } + } + const xuid = cff.topDict.getByName("XUID"); + if (xuid?.length > 16) { + cff.topDict.removeByName("XUID"); + } + cff.topDict.setByName("charset", 0); + let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); + output.add(compiled.output); + const topDictTracker = compiled.trackers[0]; + const stringIndex = this.compileStringIndex(cff.strings.strings); + output.add(stringIndex); + const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); + output.add(globalSubrIndex); + if (cff.encoding && cff.topDict.hasName("Encoding")) { + if (cff.encoding.predefined) { + topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output); + } else { + const encoding = this.compileEncoding(cff.encoding); + topDictTracker.setEntryLocation("Encoding", [output.length], output); + output.add(encoding); + } + } + const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); + topDictTracker.setEntryLocation("charset", [output.length], output); + output.add(charset); + const charStrings = this.compileCharStrings(cff.charStrings); + topDictTracker.setEntryLocation("CharStrings", [output.length], output); + output.add(charStrings); + if (cff.isCIDFont) { + topDictTracker.setEntryLocation("FDSelect", [output.length], output); + const fdSelect = this.compileFDSelect(cff.fdSelect); + output.add(fdSelect); + compiled = this.compileTopDicts(cff.fdArray, output.length, true); + topDictTracker.setEntryLocation("FDArray", [output.length], output); + output.add(compiled.output); + const fontDictTrackers = compiled.trackers; + this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); + } + this.compilePrivateDicts([cff.topDict], [topDictTracker], output); + output.add([0]); + return output.data; + } + encodeNumber(value) { + if (Number.isInteger(value)) { + return this.encodeInteger(value); + } + return this.encodeFloat(value); + } + static get EncodeFloatRegExp() { + return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); + } + encodeFloat(num) { + let value = num.toString(); + const m = CFFCompiler.EncodeFloatRegExp.exec(value); + if (m) { + const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); + value = (Math.round(num * epsilon) / epsilon).toString(); + } + let nibbles = ""; + let i, ii; + for (i = 0, ii = value.length; i < ii; ++i) { + const a = value[i]; + if (a === "e") { + nibbles += value[++i] === "-" ? "c" : "b"; + } else if (a === ".") { + nibbles += "a"; + } else if (a === "-") { + nibbles += "e"; + } else { + nibbles += a; + } + } + nibbles += nibbles.length & 1 ? "f" : "ff"; + const out = [30]; + for (i = 0, ii = nibbles.length; i < ii; i += 2) { + out.push(parseInt(nibbles.substring(i, i + 2), 16)); + } + return out; + } + encodeInteger(value) { + let code; + if (value >= -107 && value <= 107) { + code = [value + 139]; + } else if (value >= 108 && value <= 1131) { + value -= 108; + code = [(value >> 8) + 247, value & 0xff]; + } else if (value >= -1131 && value <= -108) { + value = -value - 108; + code = [(value >> 8) + 251, value & 0xff]; + } else if (value >= -32768 && value <= 32767) { + code = [0x1c, value >> 8 & 0xff, value & 0xff]; + } else { + code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]; + } + return code; + } + compileHeader(header) { + return [header.major, header.minor, 4, header.offSize]; + } + compileNameIndex(names) { + const nameIndex = new CFFIndex(); + for (const name of names) { + const length = Math.min(name.length, 127); + let sanitizedName = new Array(length); + for (let j = 0; j < length; j++) { + let char = name[j]; + if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") { + char = "_"; + } + sanitizedName[j] = char; + } + sanitizedName = sanitizedName.join(""); + if (sanitizedName === "") { + sanitizedName = "Bad_Font_Name"; + } + nameIndex.add(stringToBytes(sanitizedName)); + } + return this.compileIndex(nameIndex); + } + compileTopDicts(dicts, length, removeCidKeys) { + const fontDictTrackers = []; + let fdArrayIndex = new CFFIndex(); + for (const fontDict of dicts) { + if (removeCidKeys) { + fontDict.removeByName("CIDFontVersion"); + fontDict.removeByName("CIDFontRevision"); + fontDict.removeByName("CIDFontType"); + fontDict.removeByName("CIDCount"); + fontDict.removeByName("UIDBase"); + } + const fontDictTracker = new CFFOffsetTracker(); + const fontDictData = this.compileDict(fontDict, fontDictTracker); + fontDictTrackers.push(fontDictTracker); + fdArrayIndex.add(fontDictData); + fontDictTracker.offset(length); + } + fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); + return { + trackers: fontDictTrackers, + output: fdArrayIndex + }; + } + compilePrivateDicts(dicts, trackers, output) { + for (let i = 0, ii = dicts.length; i < ii; ++i) { + const fontDict = dicts[i]; + const privateDict = fontDict.privateDict; + if (!privateDict || !fontDict.hasName("Private")) { + throw new FormatError("There must be a private dictionary."); + } + const privateDictTracker = new CFFOffsetTracker(); + const privateDictData = this.compileDict(privateDict, privateDictTracker); + let outputLength = output.length; + privateDictTracker.offset(outputLength); + if (!privateDictData.length) { + outputLength = 0; + } + trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output); + output.add(privateDictData); + if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { + const subrs = this.compileIndex(privateDict.subrsIndex); + privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); + output.add(subrs); + } + } + } + compileDict(dict, offsetTracker) { + const out = []; + for (const key of dict.order) { + if (!(key in dict.values)) { + continue; + } + let values = dict.values[key]; + let types = dict.types[key]; + if (!Array.isArray(types)) { + types = [types]; + } + if (!Array.isArray(values)) { + values = [values]; + } + if (values.length === 0) { + continue; + } + for (let j = 0, jj = types.length; j < jj; ++j) { + const type = types[j]; + const value = values[j]; + switch (type) { + case "num": + case "sid": + out.push(...this.encodeNumber(value)); + break; + case "offset": + const name = dict.keyToNameMap[key]; + if (!offsetTracker.isTracking(name)) { + offsetTracker.track(name, out.length); + } + out.push(0x1d, 0, 0, 0, 0); + break; + case "array": + case "delta": + out.push(...this.encodeNumber(value)); + for (let k = 1, kk = values.length; k < kk; ++k) { + out.push(...this.encodeNumber(values[k])); + } + break; + default: + throw new FormatError(`Unknown data type of ${type}`); + } + } + out.push(...dict.opcodes[key]); + } + return out; + } + compileStringIndex(strings) { + const stringIndex = new CFFIndex(); + for (const string of strings) { + stringIndex.add(stringToBytes(string)); + } + return this.compileIndex(stringIndex); + } + compileCharStrings(charStrings) { + const charStringsIndex = new CFFIndex(); + for (let i = 0; i < charStrings.count; i++) { + const glyph = charStrings.get(i); + if (glyph.length === 0) { + charStringsIndex.add(new Uint8Array([0x8b, 0x0e])); + continue; + } + charStringsIndex.add(glyph); + } + return this.compileIndex(charStringsIndex); + } + compileCharset(charset, numGlyphs, strings, isCIDFont) { + let out; + const numGlyphsLessNotDef = numGlyphs - 1; + if (isCIDFont) { + out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]); + } else { + const length = 1 + numGlyphsLessNotDef * 2; + out = new Uint8Array(length); + out[0] = 0; + let charsetIndex = 0; + const numCharsets = charset.charset.length; + let warned = false; + for (let i = 1; i < out.length; i += 2) { + let sid = 0; + if (charsetIndex < numCharsets) { + const name = charset.charset[charsetIndex++]; + sid = strings.getSID(name); + if (sid === -1) { + sid = 0; + if (!warned) { + warned = true; + warn(`Couldn't find ${name} in CFF strings`); + } + } + } + out[i] = sid >> 8 & 0xff; + out[i + 1] = sid & 0xff; + } + } + return this.compileTypedArray(out); + } + compileEncoding(encoding) { + return this.compileTypedArray(encoding.raw); + } + compileFDSelect(fdSelect) { + const format = fdSelect.format; + let out, i; + switch (format) { + case 0: + out = new Uint8Array(1 + fdSelect.fdSelect.length); + out[0] = format; + for (i = 0; i < fdSelect.fdSelect.length; i++) { + out[i + 1] = fdSelect.fdSelect[i]; + } + break; + case 3: + const start = 0; + let lastFD = fdSelect.fdSelect[0]; + const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; + for (i = 1; i < fdSelect.fdSelect.length; i++) { + const currentFD = fdSelect.fdSelect[i]; + if (currentFD !== lastFD) { + ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); + lastFD = currentFD; + } + } + const numRanges = (ranges.length - 3) / 3; + ranges[1] = numRanges >> 8 & 0xff; + ranges[2] = numRanges & 0xff; + ranges.push(i >> 8 & 0xff, i & 0xff); + out = new Uint8Array(ranges); + break; + } + return this.compileTypedArray(out); + } + compileTypedArray(data) { + return Array.from(data); + } + compileIndex(index, trackers = []) { + const objects = index.objects; + const count = objects.length; + if (count === 0) { + return [0, 0]; + } + const data = [count >> 8 & 0xff, count & 0xff]; + let lastOffset = 1, + i; + for (i = 0; i < count; ++i) { + lastOffset += objects[i].length; + } + let offsetSize; + if (lastOffset < 0x100) { + offsetSize = 1; + } else if (lastOffset < 0x10000) { + offsetSize = 2; + } else if (lastOffset < 0x1000000) { + offsetSize = 3; + } else { + offsetSize = 4; + } + data.push(offsetSize); + let relativeOffset = 1; + for (i = 0; i < count + 1; i++) { + if (offsetSize === 1) { + data.push(relativeOffset & 0xff); + } else if (offsetSize === 2) { + data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } else if (offsetSize === 3) { + data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } else { + data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } + if (objects[i]) { + relativeOffset += objects[i].length; + } + } + for (i = 0; i < count; i++) { + if (trackers[i]) { + trackers[i].offset(data.length); + } + data.push(...objects[i]); + } + return data; + } +} + +;// ./src/core/glyphlist.js + +const getGlyphsUnicode = getLookupTableFactory(function (t) { + t.A = 0x0041; + t.AE = 0x00c6; + t.AEacute = 0x01fc; + t.AEmacron = 0x01e2; + t.AEsmall = 0xf7e6; + t.Aacute = 0x00c1; + t.Aacutesmall = 0xf7e1; + t.Abreve = 0x0102; + t.Abreveacute = 0x1eae; + t.Abrevecyrillic = 0x04d0; + t.Abrevedotbelow = 0x1eb6; + t.Abrevegrave = 0x1eb0; + t.Abrevehookabove = 0x1eb2; + t.Abrevetilde = 0x1eb4; + t.Acaron = 0x01cd; + t.Acircle = 0x24b6; + t.Acircumflex = 0x00c2; + t.Acircumflexacute = 0x1ea4; + t.Acircumflexdotbelow = 0x1eac; + t.Acircumflexgrave = 0x1ea6; + t.Acircumflexhookabove = 0x1ea8; + t.Acircumflexsmall = 0xf7e2; + t.Acircumflextilde = 0x1eaa; + t.Acute = 0xf6c9; + t.Acutesmall = 0xf7b4; + t.Acyrillic = 0x0410; + t.Adblgrave = 0x0200; + t.Adieresis = 0x00c4; + t.Adieresiscyrillic = 0x04d2; + t.Adieresismacron = 0x01de; + t.Adieresissmall = 0xf7e4; + t.Adotbelow = 0x1ea0; + t.Adotmacron = 0x01e0; + t.Agrave = 0x00c0; + t.Agravesmall = 0xf7e0; + t.Ahookabove = 0x1ea2; + t.Aiecyrillic = 0x04d4; + t.Ainvertedbreve = 0x0202; + t.Alpha = 0x0391; + t.Alphatonos = 0x0386; + t.Amacron = 0x0100; + t.Amonospace = 0xff21; + t.Aogonek = 0x0104; + t.Aring = 0x00c5; + t.Aringacute = 0x01fa; + t.Aringbelow = 0x1e00; + t.Aringsmall = 0xf7e5; + t.Asmall = 0xf761; + t.Atilde = 0x00c3; + t.Atildesmall = 0xf7e3; + t.Aybarmenian = 0x0531; + t.B = 0x0042; + t.Bcircle = 0x24b7; + t.Bdotaccent = 0x1e02; + t.Bdotbelow = 0x1e04; + t.Becyrillic = 0x0411; + t.Benarmenian = 0x0532; + t.Beta = 0x0392; + t.Bhook = 0x0181; + t.Blinebelow = 0x1e06; + t.Bmonospace = 0xff22; + t.Brevesmall = 0xf6f4; + t.Bsmall = 0xf762; + t.Btopbar = 0x0182; + t.C = 0x0043; + t.Caarmenian = 0x053e; + t.Cacute = 0x0106; + t.Caron = 0xf6ca; + t.Caronsmall = 0xf6f5; + t.Ccaron = 0x010c; + t.Ccedilla = 0x00c7; + t.Ccedillaacute = 0x1e08; + t.Ccedillasmall = 0xf7e7; + t.Ccircle = 0x24b8; + t.Ccircumflex = 0x0108; + t.Cdot = 0x010a; + t.Cdotaccent = 0x010a; + t.Cedillasmall = 0xf7b8; + t.Chaarmenian = 0x0549; + t.Cheabkhasiancyrillic = 0x04bc; + t.Checyrillic = 0x0427; + t.Chedescenderabkhasiancyrillic = 0x04be; + t.Chedescendercyrillic = 0x04b6; + t.Chedieresiscyrillic = 0x04f4; + t.Cheharmenian = 0x0543; + t.Chekhakassiancyrillic = 0x04cb; + t.Cheverticalstrokecyrillic = 0x04b8; + t.Chi = 0x03a7; + t.Chook = 0x0187; + t.Circumflexsmall = 0xf6f6; + t.Cmonospace = 0xff23; + t.Coarmenian = 0x0551; + t.Csmall = 0xf763; + t.D = 0x0044; + t.DZ = 0x01f1; + t.DZcaron = 0x01c4; + t.Daarmenian = 0x0534; + t.Dafrican = 0x0189; + t.Dcaron = 0x010e; + t.Dcedilla = 0x1e10; + t.Dcircle = 0x24b9; + t.Dcircumflexbelow = 0x1e12; + t.Dcroat = 0x0110; + t.Ddotaccent = 0x1e0a; + t.Ddotbelow = 0x1e0c; + t.Decyrillic = 0x0414; + t.Deicoptic = 0x03ee; + t.Delta = 0x2206; + t.Deltagreek = 0x0394; + t.Dhook = 0x018a; + t.Dieresis = 0xf6cb; + t.DieresisAcute = 0xf6cc; + t.DieresisGrave = 0xf6cd; + t.Dieresissmall = 0xf7a8; + t.Digammagreek = 0x03dc; + t.Djecyrillic = 0x0402; + t.Dlinebelow = 0x1e0e; + t.Dmonospace = 0xff24; + t.Dotaccentsmall = 0xf6f7; + t.Dslash = 0x0110; + t.Dsmall = 0xf764; + t.Dtopbar = 0x018b; + t.Dz = 0x01f2; + t.Dzcaron = 0x01c5; + t.Dzeabkhasiancyrillic = 0x04e0; + t.Dzecyrillic = 0x0405; + t.Dzhecyrillic = 0x040f; + t.E = 0x0045; + t.Eacute = 0x00c9; + t.Eacutesmall = 0xf7e9; + t.Ebreve = 0x0114; + t.Ecaron = 0x011a; + t.Ecedillabreve = 0x1e1c; + t.Echarmenian = 0x0535; + t.Ecircle = 0x24ba; + t.Ecircumflex = 0x00ca; + t.Ecircumflexacute = 0x1ebe; + t.Ecircumflexbelow = 0x1e18; + t.Ecircumflexdotbelow = 0x1ec6; + t.Ecircumflexgrave = 0x1ec0; + t.Ecircumflexhookabove = 0x1ec2; + t.Ecircumflexsmall = 0xf7ea; + t.Ecircumflextilde = 0x1ec4; + t.Ecyrillic = 0x0404; + t.Edblgrave = 0x0204; + t.Edieresis = 0x00cb; + t.Edieresissmall = 0xf7eb; + t.Edot = 0x0116; + t.Edotaccent = 0x0116; + t.Edotbelow = 0x1eb8; + t.Efcyrillic = 0x0424; + t.Egrave = 0x00c8; + t.Egravesmall = 0xf7e8; + t.Eharmenian = 0x0537; + t.Ehookabove = 0x1eba; + t.Eightroman = 0x2167; + t.Einvertedbreve = 0x0206; + t.Eiotifiedcyrillic = 0x0464; + t.Elcyrillic = 0x041b; + t.Elevenroman = 0x216a; + t.Emacron = 0x0112; + t.Emacronacute = 0x1e16; + t.Emacrongrave = 0x1e14; + t.Emcyrillic = 0x041c; + t.Emonospace = 0xff25; + t.Encyrillic = 0x041d; + t.Endescendercyrillic = 0x04a2; + t.Eng = 0x014a; + t.Enghecyrillic = 0x04a4; + t.Enhookcyrillic = 0x04c7; + t.Eogonek = 0x0118; + t.Eopen = 0x0190; + t.Epsilon = 0x0395; + t.Epsilontonos = 0x0388; + t.Ercyrillic = 0x0420; + t.Ereversed = 0x018e; + t.Ereversedcyrillic = 0x042d; + t.Escyrillic = 0x0421; + t.Esdescendercyrillic = 0x04aa; + t.Esh = 0x01a9; + t.Esmall = 0xf765; + t.Eta = 0x0397; + t.Etarmenian = 0x0538; + t.Etatonos = 0x0389; + t.Eth = 0x00d0; + t.Ethsmall = 0xf7f0; + t.Etilde = 0x1ebc; + t.Etildebelow = 0x1e1a; + t.Euro = 0x20ac; + t.Ezh = 0x01b7; + t.Ezhcaron = 0x01ee; + t.Ezhreversed = 0x01b8; + t.F = 0x0046; + t.Fcircle = 0x24bb; + t.Fdotaccent = 0x1e1e; + t.Feharmenian = 0x0556; + t.Feicoptic = 0x03e4; + t.Fhook = 0x0191; + t.Fitacyrillic = 0x0472; + t.Fiveroman = 0x2164; + t.Fmonospace = 0xff26; + t.Fourroman = 0x2163; + t.Fsmall = 0xf766; + t.G = 0x0047; + t.GBsquare = 0x3387; + t.Gacute = 0x01f4; + t.Gamma = 0x0393; + t.Gammaafrican = 0x0194; + t.Gangiacoptic = 0x03ea; + t.Gbreve = 0x011e; + t.Gcaron = 0x01e6; + t.Gcedilla = 0x0122; + t.Gcircle = 0x24bc; + t.Gcircumflex = 0x011c; + t.Gcommaaccent = 0x0122; + t.Gdot = 0x0120; + t.Gdotaccent = 0x0120; + t.Gecyrillic = 0x0413; + t.Ghadarmenian = 0x0542; + t.Ghemiddlehookcyrillic = 0x0494; + t.Ghestrokecyrillic = 0x0492; + t.Gheupturncyrillic = 0x0490; + t.Ghook = 0x0193; + t.Gimarmenian = 0x0533; + t.Gjecyrillic = 0x0403; + t.Gmacron = 0x1e20; + t.Gmonospace = 0xff27; + t.Grave = 0xf6ce; + t.Gravesmall = 0xf760; + t.Gsmall = 0xf767; + t.Gsmallhook = 0x029b; + t.Gstroke = 0x01e4; + t.H = 0x0048; + t.H18533 = 0x25cf; + t.H18543 = 0x25aa; + t.H18551 = 0x25ab; + t.H22073 = 0x25a1; + t.HPsquare = 0x33cb; + t.Haabkhasiancyrillic = 0x04a8; + t.Hadescendercyrillic = 0x04b2; + t.Hardsigncyrillic = 0x042a; + t.Hbar = 0x0126; + t.Hbrevebelow = 0x1e2a; + t.Hcedilla = 0x1e28; + t.Hcircle = 0x24bd; + t.Hcircumflex = 0x0124; + t.Hdieresis = 0x1e26; + t.Hdotaccent = 0x1e22; + t.Hdotbelow = 0x1e24; + t.Hmonospace = 0xff28; + t.Hoarmenian = 0x0540; + t.Horicoptic = 0x03e8; + t.Hsmall = 0xf768; + t.Hungarumlaut = 0xf6cf; + t.Hungarumlautsmall = 0xf6f8; + t.Hzsquare = 0x3390; + t.I = 0x0049; + t.IAcyrillic = 0x042f; + t.IJ = 0x0132; + t.IUcyrillic = 0x042e; + t.Iacute = 0x00cd; + t.Iacutesmall = 0xf7ed; + t.Ibreve = 0x012c; + t.Icaron = 0x01cf; + t.Icircle = 0x24be; + t.Icircumflex = 0x00ce; + t.Icircumflexsmall = 0xf7ee; + t.Icyrillic = 0x0406; + t.Idblgrave = 0x0208; + t.Idieresis = 0x00cf; + t.Idieresisacute = 0x1e2e; + t.Idieresiscyrillic = 0x04e4; + t.Idieresissmall = 0xf7ef; + t.Idot = 0x0130; + t.Idotaccent = 0x0130; + t.Idotbelow = 0x1eca; + t.Iebrevecyrillic = 0x04d6; + t.Iecyrillic = 0x0415; + t.Ifraktur = 0x2111; + t.Igrave = 0x00cc; + t.Igravesmall = 0xf7ec; + t.Ihookabove = 0x1ec8; + t.Iicyrillic = 0x0418; + t.Iinvertedbreve = 0x020a; + t.Iishortcyrillic = 0x0419; + t.Imacron = 0x012a; + t.Imacroncyrillic = 0x04e2; + t.Imonospace = 0xff29; + t.Iniarmenian = 0x053b; + t.Iocyrillic = 0x0401; + t.Iogonek = 0x012e; + t.Iota = 0x0399; + t.Iotaafrican = 0x0196; + t.Iotadieresis = 0x03aa; + t.Iotatonos = 0x038a; + t.Ismall = 0xf769; + t.Istroke = 0x0197; + t.Itilde = 0x0128; + t.Itildebelow = 0x1e2c; + t.Izhitsacyrillic = 0x0474; + t.Izhitsadblgravecyrillic = 0x0476; + t.J = 0x004a; + t.Jaarmenian = 0x0541; + t.Jcircle = 0x24bf; + t.Jcircumflex = 0x0134; + t.Jecyrillic = 0x0408; + t.Jheharmenian = 0x054b; + t.Jmonospace = 0xff2a; + t.Jsmall = 0xf76a; + t.K = 0x004b; + t.KBsquare = 0x3385; + t.KKsquare = 0x33cd; + t.Kabashkircyrillic = 0x04a0; + t.Kacute = 0x1e30; + t.Kacyrillic = 0x041a; + t.Kadescendercyrillic = 0x049a; + t.Kahookcyrillic = 0x04c3; + t.Kappa = 0x039a; + t.Kastrokecyrillic = 0x049e; + t.Kaverticalstrokecyrillic = 0x049c; + t.Kcaron = 0x01e8; + t.Kcedilla = 0x0136; + t.Kcircle = 0x24c0; + t.Kcommaaccent = 0x0136; + t.Kdotbelow = 0x1e32; + t.Keharmenian = 0x0554; + t.Kenarmenian = 0x053f; + t.Khacyrillic = 0x0425; + t.Kheicoptic = 0x03e6; + t.Khook = 0x0198; + t.Kjecyrillic = 0x040c; + t.Klinebelow = 0x1e34; + t.Kmonospace = 0xff2b; + t.Koppacyrillic = 0x0480; + t.Koppagreek = 0x03de; + t.Ksicyrillic = 0x046e; + t.Ksmall = 0xf76b; + t.L = 0x004c; + t.LJ = 0x01c7; + t.LL = 0xf6bf; + t.Lacute = 0x0139; + t.Lambda = 0x039b; + t.Lcaron = 0x013d; + t.Lcedilla = 0x013b; + t.Lcircle = 0x24c1; + t.Lcircumflexbelow = 0x1e3c; + t.Lcommaaccent = 0x013b; + t.Ldot = 0x013f; + t.Ldotaccent = 0x013f; + t.Ldotbelow = 0x1e36; + t.Ldotbelowmacron = 0x1e38; + t.Liwnarmenian = 0x053c; + t.Lj = 0x01c8; + t.Ljecyrillic = 0x0409; + t.Llinebelow = 0x1e3a; + t.Lmonospace = 0xff2c; + t.Lslash = 0x0141; + t.Lslashsmall = 0xf6f9; + t.Lsmall = 0xf76c; + t.M = 0x004d; + t.MBsquare = 0x3386; + t.Macron = 0xf6d0; + t.Macronsmall = 0xf7af; + t.Macute = 0x1e3e; + t.Mcircle = 0x24c2; + t.Mdotaccent = 0x1e40; + t.Mdotbelow = 0x1e42; + t.Menarmenian = 0x0544; + t.Mmonospace = 0xff2d; + t.Msmall = 0xf76d; + t.Mturned = 0x019c; + t.Mu = 0x039c; + t.N = 0x004e; + t.NJ = 0x01ca; + t.Nacute = 0x0143; + t.Ncaron = 0x0147; + t.Ncedilla = 0x0145; + t.Ncircle = 0x24c3; + t.Ncircumflexbelow = 0x1e4a; + t.Ncommaaccent = 0x0145; + t.Ndotaccent = 0x1e44; + t.Ndotbelow = 0x1e46; + t.Nhookleft = 0x019d; + t.Nineroman = 0x2168; + t.Nj = 0x01cb; + t.Njecyrillic = 0x040a; + t.Nlinebelow = 0x1e48; + t.Nmonospace = 0xff2e; + t.Nowarmenian = 0x0546; + t.Nsmall = 0xf76e; + t.Ntilde = 0x00d1; + t.Ntildesmall = 0xf7f1; + t.Nu = 0x039d; + t.O = 0x004f; + t.OE = 0x0152; + t.OEsmall = 0xf6fa; + t.Oacute = 0x00d3; + t.Oacutesmall = 0xf7f3; + t.Obarredcyrillic = 0x04e8; + t.Obarreddieresiscyrillic = 0x04ea; + t.Obreve = 0x014e; + t.Ocaron = 0x01d1; + t.Ocenteredtilde = 0x019f; + t.Ocircle = 0x24c4; + t.Ocircumflex = 0x00d4; + t.Ocircumflexacute = 0x1ed0; + t.Ocircumflexdotbelow = 0x1ed8; + t.Ocircumflexgrave = 0x1ed2; + t.Ocircumflexhookabove = 0x1ed4; + t.Ocircumflexsmall = 0xf7f4; + t.Ocircumflextilde = 0x1ed6; + t.Ocyrillic = 0x041e; + t.Odblacute = 0x0150; + t.Odblgrave = 0x020c; + t.Odieresis = 0x00d6; + t.Odieresiscyrillic = 0x04e6; + t.Odieresissmall = 0xf7f6; + t.Odotbelow = 0x1ecc; + t.Ogoneksmall = 0xf6fb; + t.Ograve = 0x00d2; + t.Ogravesmall = 0xf7f2; + t.Oharmenian = 0x0555; + t.Ohm = 0x2126; + t.Ohookabove = 0x1ece; + t.Ohorn = 0x01a0; + t.Ohornacute = 0x1eda; + t.Ohorndotbelow = 0x1ee2; + t.Ohorngrave = 0x1edc; + t.Ohornhookabove = 0x1ede; + t.Ohorntilde = 0x1ee0; + t.Ohungarumlaut = 0x0150; + t.Oi = 0x01a2; + t.Oinvertedbreve = 0x020e; + t.Omacron = 0x014c; + t.Omacronacute = 0x1e52; + t.Omacrongrave = 0x1e50; + t.Omega = 0x2126; + t.Omegacyrillic = 0x0460; + t.Omegagreek = 0x03a9; + t.Omegaroundcyrillic = 0x047a; + t.Omegatitlocyrillic = 0x047c; + t.Omegatonos = 0x038f; + t.Omicron = 0x039f; + t.Omicrontonos = 0x038c; + t.Omonospace = 0xff2f; + t.Oneroman = 0x2160; + t.Oogonek = 0x01ea; + t.Oogonekmacron = 0x01ec; + t.Oopen = 0x0186; + t.Oslash = 0x00d8; + t.Oslashacute = 0x01fe; + t.Oslashsmall = 0xf7f8; + t.Osmall = 0xf76f; + t.Ostrokeacute = 0x01fe; + t.Otcyrillic = 0x047e; + t.Otilde = 0x00d5; + t.Otildeacute = 0x1e4c; + t.Otildedieresis = 0x1e4e; + t.Otildesmall = 0xf7f5; + t.P = 0x0050; + t.Pacute = 0x1e54; + t.Pcircle = 0x24c5; + t.Pdotaccent = 0x1e56; + t.Pecyrillic = 0x041f; + t.Peharmenian = 0x054a; + t.Pemiddlehookcyrillic = 0x04a6; + t.Phi = 0x03a6; + t.Phook = 0x01a4; + t.Pi = 0x03a0; + t.Piwrarmenian = 0x0553; + t.Pmonospace = 0xff30; + t.Psi = 0x03a8; + t.Psicyrillic = 0x0470; + t.Psmall = 0xf770; + t.Q = 0x0051; + t.Qcircle = 0x24c6; + t.Qmonospace = 0xff31; + t.Qsmall = 0xf771; + t.R = 0x0052; + t.Raarmenian = 0x054c; + t.Racute = 0x0154; + t.Rcaron = 0x0158; + t.Rcedilla = 0x0156; + t.Rcircle = 0x24c7; + t.Rcommaaccent = 0x0156; + t.Rdblgrave = 0x0210; + t.Rdotaccent = 0x1e58; + t.Rdotbelow = 0x1e5a; + t.Rdotbelowmacron = 0x1e5c; + t.Reharmenian = 0x0550; + t.Rfraktur = 0x211c; + t.Rho = 0x03a1; + t.Ringsmall = 0xf6fc; + t.Rinvertedbreve = 0x0212; + t.Rlinebelow = 0x1e5e; + t.Rmonospace = 0xff32; + t.Rsmall = 0xf772; + t.Rsmallinverted = 0x0281; + t.Rsmallinvertedsuperior = 0x02b6; + t.S = 0x0053; + t.SF010000 = 0x250c; + t.SF020000 = 0x2514; + t.SF030000 = 0x2510; + t.SF040000 = 0x2518; + t.SF050000 = 0x253c; + t.SF060000 = 0x252c; + t.SF070000 = 0x2534; + t.SF080000 = 0x251c; + t.SF090000 = 0x2524; + t.SF100000 = 0x2500; + t.SF110000 = 0x2502; + t.SF190000 = 0x2561; + t.SF200000 = 0x2562; + t.SF210000 = 0x2556; + t.SF220000 = 0x2555; + t.SF230000 = 0x2563; + t.SF240000 = 0x2551; + t.SF250000 = 0x2557; + t.SF260000 = 0x255d; + t.SF270000 = 0x255c; + t.SF280000 = 0x255b; + t.SF360000 = 0x255e; + t.SF370000 = 0x255f; + t.SF380000 = 0x255a; + t.SF390000 = 0x2554; + t.SF400000 = 0x2569; + t.SF410000 = 0x2566; + t.SF420000 = 0x2560; + t.SF430000 = 0x2550; + t.SF440000 = 0x256c; + t.SF450000 = 0x2567; + t.SF460000 = 0x2568; + t.SF470000 = 0x2564; + t.SF480000 = 0x2565; + t.SF490000 = 0x2559; + t.SF500000 = 0x2558; + t.SF510000 = 0x2552; + t.SF520000 = 0x2553; + t.SF530000 = 0x256b; + t.SF540000 = 0x256a; + t.Sacute = 0x015a; + t.Sacutedotaccent = 0x1e64; + t.Sampigreek = 0x03e0; + t.Scaron = 0x0160; + t.Scarondotaccent = 0x1e66; + t.Scaronsmall = 0xf6fd; + t.Scedilla = 0x015e; + t.Schwa = 0x018f; + t.Schwacyrillic = 0x04d8; + t.Schwadieresiscyrillic = 0x04da; + t.Scircle = 0x24c8; + t.Scircumflex = 0x015c; + t.Scommaaccent = 0x0218; + t.Sdotaccent = 0x1e60; + t.Sdotbelow = 0x1e62; + t.Sdotbelowdotaccent = 0x1e68; + t.Seharmenian = 0x054d; + t.Sevenroman = 0x2166; + t.Shaarmenian = 0x0547; + t.Shacyrillic = 0x0428; + t.Shchacyrillic = 0x0429; + t.Sheicoptic = 0x03e2; + t.Shhacyrillic = 0x04ba; + t.Shimacoptic = 0x03ec; + t.Sigma = 0x03a3; + t.Sixroman = 0x2165; + t.Smonospace = 0xff33; + t.Softsigncyrillic = 0x042c; + t.Ssmall = 0xf773; + t.Stigmagreek = 0x03da; + t.T = 0x0054; + t.Tau = 0x03a4; + t.Tbar = 0x0166; + t.Tcaron = 0x0164; + t.Tcedilla = 0x0162; + t.Tcircle = 0x24c9; + t.Tcircumflexbelow = 0x1e70; + t.Tcommaaccent = 0x0162; + t.Tdotaccent = 0x1e6a; + t.Tdotbelow = 0x1e6c; + t.Tecyrillic = 0x0422; + t.Tedescendercyrillic = 0x04ac; + t.Tenroman = 0x2169; + t.Tetsecyrillic = 0x04b4; + t.Theta = 0x0398; + t.Thook = 0x01ac; + t.Thorn = 0x00de; + t.Thornsmall = 0xf7fe; + t.Threeroman = 0x2162; + t.Tildesmall = 0xf6fe; + t.Tiwnarmenian = 0x054f; + t.Tlinebelow = 0x1e6e; + t.Tmonospace = 0xff34; + t.Toarmenian = 0x0539; + t.Tonefive = 0x01bc; + t.Tonesix = 0x0184; + t.Tonetwo = 0x01a7; + t.Tretroflexhook = 0x01ae; + t.Tsecyrillic = 0x0426; + t.Tshecyrillic = 0x040b; + t.Tsmall = 0xf774; + t.Twelveroman = 0x216b; + t.Tworoman = 0x2161; + t.U = 0x0055; + t.Uacute = 0x00da; + t.Uacutesmall = 0xf7fa; + t.Ubreve = 0x016c; + t.Ucaron = 0x01d3; + t.Ucircle = 0x24ca; + t.Ucircumflex = 0x00db; + t.Ucircumflexbelow = 0x1e76; + t.Ucircumflexsmall = 0xf7fb; + t.Ucyrillic = 0x0423; + t.Udblacute = 0x0170; + t.Udblgrave = 0x0214; + t.Udieresis = 0x00dc; + t.Udieresisacute = 0x01d7; + t.Udieresisbelow = 0x1e72; + t.Udieresiscaron = 0x01d9; + t.Udieresiscyrillic = 0x04f0; + t.Udieresisgrave = 0x01db; + t.Udieresismacron = 0x01d5; + t.Udieresissmall = 0xf7fc; + t.Udotbelow = 0x1ee4; + t.Ugrave = 0x00d9; + t.Ugravesmall = 0xf7f9; + t.Uhookabove = 0x1ee6; + t.Uhorn = 0x01af; + t.Uhornacute = 0x1ee8; + t.Uhorndotbelow = 0x1ef0; + t.Uhorngrave = 0x1eea; + t.Uhornhookabove = 0x1eec; + t.Uhorntilde = 0x1eee; + t.Uhungarumlaut = 0x0170; + t.Uhungarumlautcyrillic = 0x04f2; + t.Uinvertedbreve = 0x0216; + t.Ukcyrillic = 0x0478; + t.Umacron = 0x016a; + t.Umacroncyrillic = 0x04ee; + t.Umacrondieresis = 0x1e7a; + t.Umonospace = 0xff35; + t.Uogonek = 0x0172; + t.Upsilon = 0x03a5; + t.Upsilon1 = 0x03d2; + t.Upsilonacutehooksymbolgreek = 0x03d3; + t.Upsilonafrican = 0x01b1; + t.Upsilondieresis = 0x03ab; + t.Upsilondieresishooksymbolgreek = 0x03d4; + t.Upsilonhooksymbol = 0x03d2; + t.Upsilontonos = 0x038e; + t.Uring = 0x016e; + t.Ushortcyrillic = 0x040e; + t.Usmall = 0xf775; + t.Ustraightcyrillic = 0x04ae; + t.Ustraightstrokecyrillic = 0x04b0; + t.Utilde = 0x0168; + t.Utildeacute = 0x1e78; + t.Utildebelow = 0x1e74; + t.V = 0x0056; + t.Vcircle = 0x24cb; + t.Vdotbelow = 0x1e7e; + t.Vecyrillic = 0x0412; + t.Vewarmenian = 0x054e; + t.Vhook = 0x01b2; + t.Vmonospace = 0xff36; + t.Voarmenian = 0x0548; + t.Vsmall = 0xf776; + t.Vtilde = 0x1e7c; + t.W = 0x0057; + t.Wacute = 0x1e82; + t.Wcircle = 0x24cc; + t.Wcircumflex = 0x0174; + t.Wdieresis = 0x1e84; + t.Wdotaccent = 0x1e86; + t.Wdotbelow = 0x1e88; + t.Wgrave = 0x1e80; + t.Wmonospace = 0xff37; + t.Wsmall = 0xf777; + t.X = 0x0058; + t.Xcircle = 0x24cd; + t.Xdieresis = 0x1e8c; + t.Xdotaccent = 0x1e8a; + t.Xeharmenian = 0x053d; + t.Xi = 0x039e; + t.Xmonospace = 0xff38; + t.Xsmall = 0xf778; + t.Y = 0x0059; + t.Yacute = 0x00dd; + t.Yacutesmall = 0xf7fd; + t.Yatcyrillic = 0x0462; + t.Ycircle = 0x24ce; + t.Ycircumflex = 0x0176; + t.Ydieresis = 0x0178; + t.Ydieresissmall = 0xf7ff; + t.Ydotaccent = 0x1e8e; + t.Ydotbelow = 0x1ef4; + t.Yericyrillic = 0x042b; + t.Yerudieresiscyrillic = 0x04f8; + t.Ygrave = 0x1ef2; + t.Yhook = 0x01b3; + t.Yhookabove = 0x1ef6; + t.Yiarmenian = 0x0545; + t.Yicyrillic = 0x0407; + t.Yiwnarmenian = 0x0552; + t.Ymonospace = 0xff39; + t.Ysmall = 0xf779; + t.Ytilde = 0x1ef8; + t.Yusbigcyrillic = 0x046a; + t.Yusbigiotifiedcyrillic = 0x046c; + t.Yuslittlecyrillic = 0x0466; + t.Yuslittleiotifiedcyrillic = 0x0468; + t.Z = 0x005a; + t.Zaarmenian = 0x0536; + t.Zacute = 0x0179; + t.Zcaron = 0x017d; + t.Zcaronsmall = 0xf6ff; + t.Zcircle = 0x24cf; + t.Zcircumflex = 0x1e90; + t.Zdot = 0x017b; + t.Zdotaccent = 0x017b; + t.Zdotbelow = 0x1e92; + t.Zecyrillic = 0x0417; + t.Zedescendercyrillic = 0x0498; + t.Zedieresiscyrillic = 0x04de; + t.Zeta = 0x0396; + t.Zhearmenian = 0x053a; + t.Zhebrevecyrillic = 0x04c1; + t.Zhecyrillic = 0x0416; + t.Zhedescendercyrillic = 0x0496; + t.Zhedieresiscyrillic = 0x04dc; + t.Zlinebelow = 0x1e94; + t.Zmonospace = 0xff3a; + t.Zsmall = 0xf77a; + t.Zstroke = 0x01b5; + t.a = 0x0061; + t.aabengali = 0x0986; + t.aacute = 0x00e1; + t.aadeva = 0x0906; + t.aagujarati = 0x0a86; + t.aagurmukhi = 0x0a06; + t.aamatragurmukhi = 0x0a3e; + t.aarusquare = 0x3303; + t.aavowelsignbengali = 0x09be; + t.aavowelsigndeva = 0x093e; + t.aavowelsigngujarati = 0x0abe; + t.abbreviationmarkarmenian = 0x055f; + t.abbreviationsigndeva = 0x0970; + t.abengali = 0x0985; + t.abopomofo = 0x311a; + t.abreve = 0x0103; + t.abreveacute = 0x1eaf; + t.abrevecyrillic = 0x04d1; + t.abrevedotbelow = 0x1eb7; + t.abrevegrave = 0x1eb1; + t.abrevehookabove = 0x1eb3; + t.abrevetilde = 0x1eb5; + t.acaron = 0x01ce; + t.acircle = 0x24d0; + t.acircumflex = 0x00e2; + t.acircumflexacute = 0x1ea5; + t.acircumflexdotbelow = 0x1ead; + t.acircumflexgrave = 0x1ea7; + t.acircumflexhookabove = 0x1ea9; + t.acircumflextilde = 0x1eab; + t.acute = 0x00b4; + t.acutebelowcmb = 0x0317; + t.acutecmb = 0x0301; + t.acutecomb = 0x0301; + t.acutedeva = 0x0954; + t.acutelowmod = 0x02cf; + t.acutetonecmb = 0x0341; + t.acyrillic = 0x0430; + t.adblgrave = 0x0201; + t.addakgurmukhi = 0x0a71; + t.adeva = 0x0905; + t.adieresis = 0x00e4; + t.adieresiscyrillic = 0x04d3; + t.adieresismacron = 0x01df; + t.adotbelow = 0x1ea1; + t.adotmacron = 0x01e1; + t.ae = 0x00e6; + t.aeacute = 0x01fd; + t.aekorean = 0x3150; + t.aemacron = 0x01e3; + t.afii00208 = 0x2015; + t.afii08941 = 0x20a4; + t.afii10017 = 0x0410; + t.afii10018 = 0x0411; + t.afii10019 = 0x0412; + t.afii10020 = 0x0413; + t.afii10021 = 0x0414; + t.afii10022 = 0x0415; + t.afii10023 = 0x0401; + t.afii10024 = 0x0416; + t.afii10025 = 0x0417; + t.afii10026 = 0x0418; + t.afii10027 = 0x0419; + t.afii10028 = 0x041a; + t.afii10029 = 0x041b; + t.afii10030 = 0x041c; + t.afii10031 = 0x041d; + t.afii10032 = 0x041e; + t.afii10033 = 0x041f; + t.afii10034 = 0x0420; + t.afii10035 = 0x0421; + t.afii10036 = 0x0422; + t.afii10037 = 0x0423; + t.afii10038 = 0x0424; + t.afii10039 = 0x0425; + t.afii10040 = 0x0426; + t.afii10041 = 0x0427; + t.afii10042 = 0x0428; + t.afii10043 = 0x0429; + t.afii10044 = 0x042a; + t.afii10045 = 0x042b; + t.afii10046 = 0x042c; + t.afii10047 = 0x042d; + t.afii10048 = 0x042e; + t.afii10049 = 0x042f; + t.afii10050 = 0x0490; + t.afii10051 = 0x0402; + t.afii10052 = 0x0403; + t.afii10053 = 0x0404; + t.afii10054 = 0x0405; + t.afii10055 = 0x0406; + t.afii10056 = 0x0407; + t.afii10057 = 0x0408; + t.afii10058 = 0x0409; + t.afii10059 = 0x040a; + t.afii10060 = 0x040b; + t.afii10061 = 0x040c; + t.afii10062 = 0x040e; + t.afii10063 = 0xf6c4; + t.afii10064 = 0xf6c5; + t.afii10065 = 0x0430; + t.afii10066 = 0x0431; + t.afii10067 = 0x0432; + t.afii10068 = 0x0433; + t.afii10069 = 0x0434; + t.afii10070 = 0x0435; + t.afii10071 = 0x0451; + t.afii10072 = 0x0436; + t.afii10073 = 0x0437; + t.afii10074 = 0x0438; + t.afii10075 = 0x0439; + t.afii10076 = 0x043a; + t.afii10077 = 0x043b; + t.afii10078 = 0x043c; + t.afii10079 = 0x043d; + t.afii10080 = 0x043e; + t.afii10081 = 0x043f; + t.afii10082 = 0x0440; + t.afii10083 = 0x0441; + t.afii10084 = 0x0442; + t.afii10085 = 0x0443; + t.afii10086 = 0x0444; + t.afii10087 = 0x0445; + t.afii10088 = 0x0446; + t.afii10089 = 0x0447; + t.afii10090 = 0x0448; + t.afii10091 = 0x0449; + t.afii10092 = 0x044a; + t.afii10093 = 0x044b; + t.afii10094 = 0x044c; + t.afii10095 = 0x044d; + t.afii10096 = 0x044e; + t.afii10097 = 0x044f; + t.afii10098 = 0x0491; + t.afii10099 = 0x0452; + t.afii10100 = 0x0453; + t.afii10101 = 0x0454; + t.afii10102 = 0x0455; + t.afii10103 = 0x0456; + t.afii10104 = 0x0457; + t.afii10105 = 0x0458; + t.afii10106 = 0x0459; + t.afii10107 = 0x045a; + t.afii10108 = 0x045b; + t.afii10109 = 0x045c; + t.afii10110 = 0x045e; + t.afii10145 = 0x040f; + t.afii10146 = 0x0462; + t.afii10147 = 0x0472; + t.afii10148 = 0x0474; + t.afii10192 = 0xf6c6; + t.afii10193 = 0x045f; + t.afii10194 = 0x0463; + t.afii10195 = 0x0473; + t.afii10196 = 0x0475; + t.afii10831 = 0xf6c7; + t.afii10832 = 0xf6c8; + t.afii10846 = 0x04d9; + t.afii299 = 0x200e; + t.afii300 = 0x200f; + t.afii301 = 0x200d; + t.afii57381 = 0x066a; + t.afii57388 = 0x060c; + t.afii57392 = 0x0660; + t.afii57393 = 0x0661; + t.afii57394 = 0x0662; + t.afii57395 = 0x0663; + t.afii57396 = 0x0664; + t.afii57397 = 0x0665; + t.afii57398 = 0x0666; + t.afii57399 = 0x0667; + t.afii57400 = 0x0668; + t.afii57401 = 0x0669; + t.afii57403 = 0x061b; + t.afii57407 = 0x061f; + t.afii57409 = 0x0621; + t.afii57410 = 0x0622; + t.afii57411 = 0x0623; + t.afii57412 = 0x0624; + t.afii57413 = 0x0625; + t.afii57414 = 0x0626; + t.afii57415 = 0x0627; + t.afii57416 = 0x0628; + t.afii57417 = 0x0629; + t.afii57418 = 0x062a; + t.afii57419 = 0x062b; + t.afii57420 = 0x062c; + t.afii57421 = 0x062d; + t.afii57422 = 0x062e; + t.afii57423 = 0x062f; + t.afii57424 = 0x0630; + t.afii57425 = 0x0631; + t.afii57426 = 0x0632; + t.afii57427 = 0x0633; + t.afii57428 = 0x0634; + t.afii57429 = 0x0635; + t.afii57430 = 0x0636; + t.afii57431 = 0x0637; + t.afii57432 = 0x0638; + t.afii57433 = 0x0639; + t.afii57434 = 0x063a; + t.afii57440 = 0x0640; + t.afii57441 = 0x0641; + t.afii57442 = 0x0642; + t.afii57443 = 0x0643; + t.afii57444 = 0x0644; + t.afii57445 = 0x0645; + t.afii57446 = 0x0646; + t.afii57448 = 0x0648; + t.afii57449 = 0x0649; + t.afii57450 = 0x064a; + t.afii57451 = 0x064b; + t.afii57452 = 0x064c; + t.afii57453 = 0x064d; + t.afii57454 = 0x064e; + t.afii57455 = 0x064f; + t.afii57456 = 0x0650; + t.afii57457 = 0x0651; + t.afii57458 = 0x0652; + t.afii57470 = 0x0647; + t.afii57505 = 0x06a4; + t.afii57506 = 0x067e; + t.afii57507 = 0x0686; + t.afii57508 = 0x0698; + t.afii57509 = 0x06af; + t.afii57511 = 0x0679; + t.afii57512 = 0x0688; + t.afii57513 = 0x0691; + t.afii57514 = 0x06ba; + t.afii57519 = 0x06d2; + t.afii57534 = 0x06d5; + t.afii57636 = 0x20aa; + t.afii57645 = 0x05be; + t.afii57658 = 0x05c3; + t.afii57664 = 0x05d0; + t.afii57665 = 0x05d1; + t.afii57666 = 0x05d2; + t.afii57667 = 0x05d3; + t.afii57668 = 0x05d4; + t.afii57669 = 0x05d5; + t.afii57670 = 0x05d6; + t.afii57671 = 0x05d7; + t.afii57672 = 0x05d8; + t.afii57673 = 0x05d9; + t.afii57674 = 0x05da; + t.afii57675 = 0x05db; + t.afii57676 = 0x05dc; + t.afii57677 = 0x05dd; + t.afii57678 = 0x05de; + t.afii57679 = 0x05df; + t.afii57680 = 0x05e0; + t.afii57681 = 0x05e1; + t.afii57682 = 0x05e2; + t.afii57683 = 0x05e3; + t.afii57684 = 0x05e4; + t.afii57685 = 0x05e5; + t.afii57686 = 0x05e6; + t.afii57687 = 0x05e7; + t.afii57688 = 0x05e8; + t.afii57689 = 0x05e9; + t.afii57690 = 0x05ea; + t.afii57694 = 0xfb2a; + t.afii57695 = 0xfb2b; + t.afii57700 = 0xfb4b; + t.afii57705 = 0xfb1f; + t.afii57716 = 0x05f0; + t.afii57717 = 0x05f1; + t.afii57718 = 0x05f2; + t.afii57723 = 0xfb35; + t.afii57793 = 0x05b4; + t.afii57794 = 0x05b5; + t.afii57795 = 0x05b6; + t.afii57796 = 0x05bb; + t.afii57797 = 0x05b8; + t.afii57798 = 0x05b7; + t.afii57799 = 0x05b0; + t.afii57800 = 0x05b2; + t.afii57801 = 0x05b1; + t.afii57802 = 0x05b3; + t.afii57803 = 0x05c2; + t.afii57804 = 0x05c1; + t.afii57806 = 0x05b9; + t.afii57807 = 0x05bc; + t.afii57839 = 0x05bd; + t.afii57841 = 0x05bf; + t.afii57842 = 0x05c0; + t.afii57929 = 0x02bc; + t.afii61248 = 0x2105; + t.afii61289 = 0x2113; + t.afii61352 = 0x2116; + t.afii61573 = 0x202c; + t.afii61574 = 0x202d; + t.afii61575 = 0x202e; + t.afii61664 = 0x200c; + t.afii63167 = 0x066d; + t.afii64937 = 0x02bd; + t.agrave = 0x00e0; + t.agujarati = 0x0a85; + t.agurmukhi = 0x0a05; + t.ahiragana = 0x3042; + t.ahookabove = 0x1ea3; + t.aibengali = 0x0990; + t.aibopomofo = 0x311e; + t.aideva = 0x0910; + t.aiecyrillic = 0x04d5; + t.aigujarati = 0x0a90; + t.aigurmukhi = 0x0a10; + t.aimatragurmukhi = 0x0a48; + t.ainarabic = 0x0639; + t.ainfinalarabic = 0xfeca; + t.aininitialarabic = 0xfecb; + t.ainmedialarabic = 0xfecc; + t.ainvertedbreve = 0x0203; + t.aivowelsignbengali = 0x09c8; + t.aivowelsigndeva = 0x0948; + t.aivowelsigngujarati = 0x0ac8; + t.akatakana = 0x30a2; + t.akatakanahalfwidth = 0xff71; + t.akorean = 0x314f; + t.alef = 0x05d0; + t.alefarabic = 0x0627; + t.alefdageshhebrew = 0xfb30; + t.aleffinalarabic = 0xfe8e; + t.alefhamzaabovearabic = 0x0623; + t.alefhamzaabovefinalarabic = 0xfe84; + t.alefhamzabelowarabic = 0x0625; + t.alefhamzabelowfinalarabic = 0xfe88; + t.alefhebrew = 0x05d0; + t.aleflamedhebrew = 0xfb4f; + t.alefmaddaabovearabic = 0x0622; + t.alefmaddaabovefinalarabic = 0xfe82; + t.alefmaksuraarabic = 0x0649; + t.alefmaksurafinalarabic = 0xfef0; + t.alefmaksurainitialarabic = 0xfef3; + t.alefmaksuramedialarabic = 0xfef4; + t.alefpatahhebrew = 0xfb2e; + t.alefqamatshebrew = 0xfb2f; + t.aleph = 0x2135; + t.allequal = 0x224c; + t.alpha = 0x03b1; + t.alphatonos = 0x03ac; + t.amacron = 0x0101; + t.amonospace = 0xff41; + t.ampersand = 0x0026; + t.ampersandmonospace = 0xff06; + t.ampersandsmall = 0xf726; + t.amsquare = 0x33c2; + t.anbopomofo = 0x3122; + t.angbopomofo = 0x3124; + t.angbracketleft = 0x3008; + t.angbracketright = 0x3009; + t.angkhankhuthai = 0x0e5a; + t.angle = 0x2220; + t.anglebracketleft = 0x3008; + t.anglebracketleftvertical = 0xfe3f; + t.anglebracketright = 0x3009; + t.anglebracketrightvertical = 0xfe40; + t.angleleft = 0x2329; + t.angleright = 0x232a; + t.angstrom = 0x212b; + t.anoteleia = 0x0387; + t.anudattadeva = 0x0952; + t.anusvarabengali = 0x0982; + t.anusvaradeva = 0x0902; + t.anusvaragujarati = 0x0a82; + t.aogonek = 0x0105; + t.apaatosquare = 0x3300; + t.aparen = 0x249c; + t.apostrophearmenian = 0x055a; + t.apostrophemod = 0x02bc; + t.apple = 0xf8ff; + t.approaches = 0x2250; + t.approxequal = 0x2248; + t.approxequalorimage = 0x2252; + t.approximatelyequal = 0x2245; + t.araeaekorean = 0x318e; + t.araeakorean = 0x318d; + t.arc = 0x2312; + t.arighthalfring = 0x1e9a; + t.aring = 0x00e5; + t.aringacute = 0x01fb; + t.aringbelow = 0x1e01; + t.arrowboth = 0x2194; + t.arrowdashdown = 0x21e3; + t.arrowdashleft = 0x21e0; + t.arrowdashright = 0x21e2; + t.arrowdashup = 0x21e1; + t.arrowdblboth = 0x21d4; + t.arrowdbldown = 0x21d3; + t.arrowdblleft = 0x21d0; + t.arrowdblright = 0x21d2; + t.arrowdblup = 0x21d1; + t.arrowdown = 0x2193; + t.arrowdownleft = 0x2199; + t.arrowdownright = 0x2198; + t.arrowdownwhite = 0x21e9; + t.arrowheaddownmod = 0x02c5; + t.arrowheadleftmod = 0x02c2; + t.arrowheadrightmod = 0x02c3; + t.arrowheadupmod = 0x02c4; + t.arrowhorizex = 0xf8e7; + t.arrowleft = 0x2190; + t.arrowleftdbl = 0x21d0; + t.arrowleftdblstroke = 0x21cd; + t.arrowleftoverright = 0x21c6; + t.arrowleftwhite = 0x21e6; + t.arrowright = 0x2192; + t.arrowrightdblstroke = 0x21cf; + t.arrowrightheavy = 0x279e; + t.arrowrightoverleft = 0x21c4; + t.arrowrightwhite = 0x21e8; + t.arrowtableft = 0x21e4; + t.arrowtabright = 0x21e5; + t.arrowup = 0x2191; + t.arrowupdn = 0x2195; + t.arrowupdnbse = 0x21a8; + t.arrowupdownbase = 0x21a8; + t.arrowupleft = 0x2196; + t.arrowupleftofdown = 0x21c5; + t.arrowupright = 0x2197; + t.arrowupwhite = 0x21e7; + t.arrowvertex = 0xf8e6; + t.asciicircum = 0x005e; + t.asciicircummonospace = 0xff3e; + t.asciitilde = 0x007e; + t.asciitildemonospace = 0xff5e; + t.ascript = 0x0251; + t.ascriptturned = 0x0252; + t.asmallhiragana = 0x3041; + t.asmallkatakana = 0x30a1; + t.asmallkatakanahalfwidth = 0xff67; + t.asterisk = 0x002a; + t.asteriskaltonearabic = 0x066d; + t.asteriskarabic = 0x066d; + t.asteriskmath = 0x2217; + t.asteriskmonospace = 0xff0a; + t.asterisksmall = 0xfe61; + t.asterism = 0x2042; + t.asuperior = 0xf6e9; + t.asymptoticallyequal = 0x2243; + t.at = 0x0040; + t.atilde = 0x00e3; + t.atmonospace = 0xff20; + t.atsmall = 0xfe6b; + t.aturned = 0x0250; + t.aubengali = 0x0994; + t.aubopomofo = 0x3120; + t.audeva = 0x0914; + t.augujarati = 0x0a94; + t.augurmukhi = 0x0a14; + t.aulengthmarkbengali = 0x09d7; + t.aumatragurmukhi = 0x0a4c; + t.auvowelsignbengali = 0x09cc; + t.auvowelsigndeva = 0x094c; + t.auvowelsigngujarati = 0x0acc; + t.avagrahadeva = 0x093d; + t.aybarmenian = 0x0561; + t.ayin = 0x05e2; + t.ayinaltonehebrew = 0xfb20; + t.ayinhebrew = 0x05e2; + t.b = 0x0062; + t.babengali = 0x09ac; + t.backslash = 0x005c; + t.backslashmonospace = 0xff3c; + t.badeva = 0x092c; + t.bagujarati = 0x0aac; + t.bagurmukhi = 0x0a2c; + t.bahiragana = 0x3070; + t.bahtthai = 0x0e3f; + t.bakatakana = 0x30d0; + t.bar = 0x007c; + t.barmonospace = 0xff5c; + t.bbopomofo = 0x3105; + t.bcircle = 0x24d1; + t.bdotaccent = 0x1e03; + t.bdotbelow = 0x1e05; + t.beamedsixteenthnotes = 0x266c; + t.because = 0x2235; + t.becyrillic = 0x0431; + t.beharabic = 0x0628; + t.behfinalarabic = 0xfe90; + t.behinitialarabic = 0xfe91; + t.behiragana = 0x3079; + t.behmedialarabic = 0xfe92; + t.behmeeminitialarabic = 0xfc9f; + t.behmeemisolatedarabic = 0xfc08; + t.behnoonfinalarabic = 0xfc6d; + t.bekatakana = 0x30d9; + t.benarmenian = 0x0562; + t.bet = 0x05d1; + t.beta = 0x03b2; + t.betasymbolgreek = 0x03d0; + t.betdagesh = 0xfb31; + t.betdageshhebrew = 0xfb31; + t.bethebrew = 0x05d1; + t.betrafehebrew = 0xfb4c; + t.bhabengali = 0x09ad; + t.bhadeva = 0x092d; + t.bhagujarati = 0x0aad; + t.bhagurmukhi = 0x0a2d; + t.bhook = 0x0253; + t.bihiragana = 0x3073; + t.bikatakana = 0x30d3; + t.bilabialclick = 0x0298; + t.bindigurmukhi = 0x0a02; + t.birusquare = 0x3331; + t.blackcircle = 0x25cf; + t.blackdiamond = 0x25c6; + t.blackdownpointingtriangle = 0x25bc; + t.blackleftpointingpointer = 0x25c4; + t.blackleftpointingtriangle = 0x25c0; + t.blacklenticularbracketleft = 0x3010; + t.blacklenticularbracketleftvertical = 0xfe3b; + t.blacklenticularbracketright = 0x3011; + t.blacklenticularbracketrightvertical = 0xfe3c; + t.blacklowerlefttriangle = 0x25e3; + t.blacklowerrighttriangle = 0x25e2; + t.blackrectangle = 0x25ac; + t.blackrightpointingpointer = 0x25ba; + t.blackrightpointingtriangle = 0x25b6; + t.blacksmallsquare = 0x25aa; + t.blacksmilingface = 0x263b; + t.blacksquare = 0x25a0; + t.blackstar = 0x2605; + t.blackupperlefttriangle = 0x25e4; + t.blackupperrighttriangle = 0x25e5; + t.blackuppointingsmalltriangle = 0x25b4; + t.blackuppointingtriangle = 0x25b2; + t.blank = 0x2423; + t.blinebelow = 0x1e07; + t.block = 0x2588; + t.bmonospace = 0xff42; + t.bobaimaithai = 0x0e1a; + t.bohiragana = 0x307c; + t.bokatakana = 0x30dc; + t.bparen = 0x249d; + t.bqsquare = 0x33c3; + t.braceex = 0xf8f4; + t.braceleft = 0x007b; + t.braceleftbt = 0xf8f3; + t.braceleftmid = 0xf8f2; + t.braceleftmonospace = 0xff5b; + t.braceleftsmall = 0xfe5b; + t.bracelefttp = 0xf8f1; + t.braceleftvertical = 0xfe37; + t.braceright = 0x007d; + t.bracerightbt = 0xf8fe; + t.bracerightmid = 0xf8fd; + t.bracerightmonospace = 0xff5d; + t.bracerightsmall = 0xfe5c; + t.bracerighttp = 0xf8fc; + t.bracerightvertical = 0xfe38; + t.bracketleft = 0x005b; + t.bracketleftbt = 0xf8f0; + t.bracketleftex = 0xf8ef; + t.bracketleftmonospace = 0xff3b; + t.bracketlefttp = 0xf8ee; + t.bracketright = 0x005d; + t.bracketrightbt = 0xf8fb; + t.bracketrightex = 0xf8fa; + t.bracketrightmonospace = 0xff3d; + t.bracketrighttp = 0xf8f9; + t.breve = 0x02d8; + t.brevebelowcmb = 0x032e; + t.brevecmb = 0x0306; + t.breveinvertedbelowcmb = 0x032f; + t.breveinvertedcmb = 0x0311; + t.breveinverteddoublecmb = 0x0361; + t.bridgebelowcmb = 0x032a; + t.bridgeinvertedbelowcmb = 0x033a; + t.brokenbar = 0x00a6; + t.bstroke = 0x0180; + t.bsuperior = 0xf6ea; + t.btopbar = 0x0183; + t.buhiragana = 0x3076; + t.bukatakana = 0x30d6; + t.bullet = 0x2022; + t.bulletinverse = 0x25d8; + t.bulletoperator = 0x2219; + t.bullseye = 0x25ce; + t.c = 0x0063; + t.caarmenian = 0x056e; + t.cabengali = 0x099a; + t.cacute = 0x0107; + t.cadeva = 0x091a; + t.cagujarati = 0x0a9a; + t.cagurmukhi = 0x0a1a; + t.calsquare = 0x3388; + t.candrabindubengali = 0x0981; + t.candrabinducmb = 0x0310; + t.candrabindudeva = 0x0901; + t.candrabindugujarati = 0x0a81; + t.capslock = 0x21ea; + t.careof = 0x2105; + t.caron = 0x02c7; + t.caronbelowcmb = 0x032c; + t.caroncmb = 0x030c; + t.carriagereturn = 0x21b5; + t.cbopomofo = 0x3118; + t.ccaron = 0x010d; + t.ccedilla = 0x00e7; + t.ccedillaacute = 0x1e09; + t.ccircle = 0x24d2; + t.ccircumflex = 0x0109; + t.ccurl = 0x0255; + t.cdot = 0x010b; + t.cdotaccent = 0x010b; + t.cdsquare = 0x33c5; + t.cedilla = 0x00b8; + t.cedillacmb = 0x0327; + t.cent = 0x00a2; + t.centigrade = 0x2103; + t.centinferior = 0xf6df; + t.centmonospace = 0xffe0; + t.centoldstyle = 0xf7a2; + t.centsuperior = 0xf6e0; + t.chaarmenian = 0x0579; + t.chabengali = 0x099b; + t.chadeva = 0x091b; + t.chagujarati = 0x0a9b; + t.chagurmukhi = 0x0a1b; + t.chbopomofo = 0x3114; + t.cheabkhasiancyrillic = 0x04bd; + t.checkmark = 0x2713; + t.checyrillic = 0x0447; + t.chedescenderabkhasiancyrillic = 0x04bf; + t.chedescendercyrillic = 0x04b7; + t.chedieresiscyrillic = 0x04f5; + t.cheharmenian = 0x0573; + t.chekhakassiancyrillic = 0x04cc; + t.cheverticalstrokecyrillic = 0x04b9; + t.chi = 0x03c7; + t.chieuchacirclekorean = 0x3277; + t.chieuchaparenkorean = 0x3217; + t.chieuchcirclekorean = 0x3269; + t.chieuchkorean = 0x314a; + t.chieuchparenkorean = 0x3209; + t.chochangthai = 0x0e0a; + t.chochanthai = 0x0e08; + t.chochingthai = 0x0e09; + t.chochoethai = 0x0e0c; + t.chook = 0x0188; + t.cieucacirclekorean = 0x3276; + t.cieucaparenkorean = 0x3216; + t.cieuccirclekorean = 0x3268; + t.cieuckorean = 0x3148; + t.cieucparenkorean = 0x3208; + t.cieucuparenkorean = 0x321c; + t.circle = 0x25cb; + t.circlecopyrt = 0x00a9; + t.circlemultiply = 0x2297; + t.circleot = 0x2299; + t.circleplus = 0x2295; + t.circlepostalmark = 0x3036; + t.circlewithlefthalfblack = 0x25d0; + t.circlewithrighthalfblack = 0x25d1; + t.circumflex = 0x02c6; + t.circumflexbelowcmb = 0x032d; + t.circumflexcmb = 0x0302; + t.clear = 0x2327; + t.clickalveolar = 0x01c2; + t.clickdental = 0x01c0; + t.clicklateral = 0x01c1; + t.clickretroflex = 0x01c3; + t.club = 0x2663; + t.clubsuitblack = 0x2663; + t.clubsuitwhite = 0x2667; + t.cmcubedsquare = 0x33a4; + t.cmonospace = 0xff43; + t.cmsquaredsquare = 0x33a0; + t.coarmenian = 0x0581; + t.colon = 0x003a; + t.colonmonetary = 0x20a1; + t.colonmonospace = 0xff1a; + t.colonsign = 0x20a1; + t.colonsmall = 0xfe55; + t.colontriangularhalfmod = 0x02d1; + t.colontriangularmod = 0x02d0; + t.comma = 0x002c; + t.commaabovecmb = 0x0313; + t.commaaboverightcmb = 0x0315; + t.commaaccent = 0xf6c3; + t.commaarabic = 0x060c; + t.commaarmenian = 0x055d; + t.commainferior = 0xf6e1; + t.commamonospace = 0xff0c; + t.commareversedabovecmb = 0x0314; + t.commareversedmod = 0x02bd; + t.commasmall = 0xfe50; + t.commasuperior = 0xf6e2; + t.commaturnedabovecmb = 0x0312; + t.commaturnedmod = 0x02bb; + t.compass = 0x263c; + t.congruent = 0x2245; + t.contourintegral = 0x222e; + t.control = 0x2303; + t.controlACK = 0x0006; + t.controlBEL = 0x0007; + t.controlBS = 0x0008; + t.controlCAN = 0x0018; + t.controlCR = 0x000d; + t.controlDC1 = 0x0011; + t.controlDC2 = 0x0012; + t.controlDC3 = 0x0013; + t.controlDC4 = 0x0014; + t.controlDEL = 0x007f; + t.controlDLE = 0x0010; + t.controlEM = 0x0019; + t.controlENQ = 0x0005; + t.controlEOT = 0x0004; + t.controlESC = 0x001b; + t.controlETB = 0x0017; + t.controlETX = 0x0003; + t.controlFF = 0x000c; + t.controlFS = 0x001c; + t.controlGS = 0x001d; + t.controlHT = 0x0009; + t.controlLF = 0x000a; + t.controlNAK = 0x0015; + t.controlNULL = 0x0000; + t.controlRS = 0x001e; + t.controlSI = 0x000f; + t.controlSO = 0x000e; + t.controlSOT = 0x0002; + t.controlSTX = 0x0001; + t.controlSUB = 0x001a; + t.controlSYN = 0x0016; + t.controlUS = 0x001f; + t.controlVT = 0x000b; + t.copyright = 0x00a9; + t.copyrightsans = 0xf8e9; + t.copyrightserif = 0xf6d9; + t.cornerbracketleft = 0x300c; + t.cornerbracketlefthalfwidth = 0xff62; + t.cornerbracketleftvertical = 0xfe41; + t.cornerbracketright = 0x300d; + t.cornerbracketrighthalfwidth = 0xff63; + t.cornerbracketrightvertical = 0xfe42; + t.corporationsquare = 0x337f; + t.cosquare = 0x33c7; + t.coverkgsquare = 0x33c6; + t.cparen = 0x249e; + t.cruzeiro = 0x20a2; + t.cstretched = 0x0297; + t.curlyand = 0x22cf; + t.curlyor = 0x22ce; + t.currency = 0x00a4; + t.cyrBreve = 0xf6d1; + t.cyrFlex = 0xf6d2; + t.cyrbreve = 0xf6d4; + t.cyrflex = 0xf6d5; + t.d = 0x0064; + t.daarmenian = 0x0564; + t.dabengali = 0x09a6; + t.dadarabic = 0x0636; + t.dadeva = 0x0926; + t.dadfinalarabic = 0xfebe; + t.dadinitialarabic = 0xfebf; + t.dadmedialarabic = 0xfec0; + t.dagesh = 0x05bc; + t.dageshhebrew = 0x05bc; + t.dagger = 0x2020; + t.daggerdbl = 0x2021; + t.dagujarati = 0x0aa6; + t.dagurmukhi = 0x0a26; + t.dahiragana = 0x3060; + t.dakatakana = 0x30c0; + t.dalarabic = 0x062f; + t.dalet = 0x05d3; + t.daletdagesh = 0xfb33; + t.daletdageshhebrew = 0xfb33; + t.dalethebrew = 0x05d3; + t.dalfinalarabic = 0xfeaa; + t.dammaarabic = 0x064f; + t.dammalowarabic = 0x064f; + t.dammatanaltonearabic = 0x064c; + t.dammatanarabic = 0x064c; + t.danda = 0x0964; + t.dargahebrew = 0x05a7; + t.dargalefthebrew = 0x05a7; + t.dasiapneumatacyrilliccmb = 0x0485; + t.dblGrave = 0xf6d3; + t.dblanglebracketleft = 0x300a; + t.dblanglebracketleftvertical = 0xfe3d; + t.dblanglebracketright = 0x300b; + t.dblanglebracketrightvertical = 0xfe3e; + t.dblarchinvertedbelowcmb = 0x032b; + t.dblarrowleft = 0x21d4; + t.dblarrowright = 0x21d2; + t.dbldanda = 0x0965; + t.dblgrave = 0xf6d6; + t.dblgravecmb = 0x030f; + t.dblintegral = 0x222c; + t.dbllowline = 0x2017; + t.dbllowlinecmb = 0x0333; + t.dbloverlinecmb = 0x033f; + t.dblprimemod = 0x02ba; + t.dblverticalbar = 0x2016; + t.dblverticallineabovecmb = 0x030e; + t.dbopomofo = 0x3109; + t.dbsquare = 0x33c8; + t.dcaron = 0x010f; + t.dcedilla = 0x1e11; + t.dcircle = 0x24d3; + t.dcircumflexbelow = 0x1e13; + t.dcroat = 0x0111; + t.ddabengali = 0x09a1; + t.ddadeva = 0x0921; + t.ddagujarati = 0x0aa1; + t.ddagurmukhi = 0x0a21; + t.ddalarabic = 0x0688; + t.ddalfinalarabic = 0xfb89; + t.dddhadeva = 0x095c; + t.ddhabengali = 0x09a2; + t.ddhadeva = 0x0922; + t.ddhagujarati = 0x0aa2; + t.ddhagurmukhi = 0x0a22; + t.ddotaccent = 0x1e0b; + t.ddotbelow = 0x1e0d; + t.decimalseparatorarabic = 0x066b; + t.decimalseparatorpersian = 0x066b; + t.decyrillic = 0x0434; + t.degree = 0x00b0; + t.dehihebrew = 0x05ad; + t.dehiragana = 0x3067; + t.deicoptic = 0x03ef; + t.dekatakana = 0x30c7; + t.deleteleft = 0x232b; + t.deleteright = 0x2326; + t.delta = 0x03b4; + t.deltaturned = 0x018d; + t.denominatorminusonenumeratorbengali = 0x09f8; + t.dezh = 0x02a4; + t.dhabengali = 0x09a7; + t.dhadeva = 0x0927; + t.dhagujarati = 0x0aa7; + t.dhagurmukhi = 0x0a27; + t.dhook = 0x0257; + t.dialytikatonos = 0x0385; + t.dialytikatonoscmb = 0x0344; + t.diamond = 0x2666; + t.diamondsuitwhite = 0x2662; + t.dieresis = 0x00a8; + t.dieresisacute = 0xf6d7; + t.dieresisbelowcmb = 0x0324; + t.dieresiscmb = 0x0308; + t.dieresisgrave = 0xf6d8; + t.dieresistonos = 0x0385; + t.dihiragana = 0x3062; + t.dikatakana = 0x30c2; + t.dittomark = 0x3003; + t.divide = 0x00f7; + t.divides = 0x2223; + t.divisionslash = 0x2215; + t.djecyrillic = 0x0452; + t.dkshade = 0x2593; + t.dlinebelow = 0x1e0f; + t.dlsquare = 0x3397; + t.dmacron = 0x0111; + t.dmonospace = 0xff44; + t.dnblock = 0x2584; + t.dochadathai = 0x0e0e; + t.dodekthai = 0x0e14; + t.dohiragana = 0x3069; + t.dokatakana = 0x30c9; + t.dollar = 0x0024; + t.dollarinferior = 0xf6e3; + t.dollarmonospace = 0xff04; + t.dollaroldstyle = 0xf724; + t.dollarsmall = 0xfe69; + t.dollarsuperior = 0xf6e4; + t.dong = 0x20ab; + t.dorusquare = 0x3326; + t.dotaccent = 0x02d9; + t.dotaccentcmb = 0x0307; + t.dotbelowcmb = 0x0323; + t.dotbelowcomb = 0x0323; + t.dotkatakana = 0x30fb; + t.dotlessi = 0x0131; + t.dotlessj = 0xf6be; + t.dotlessjstrokehook = 0x0284; + t.dotmath = 0x22c5; + t.dottedcircle = 0x25cc; + t.doubleyodpatah = 0xfb1f; + t.doubleyodpatahhebrew = 0xfb1f; + t.downtackbelowcmb = 0x031e; + t.downtackmod = 0x02d5; + t.dparen = 0x249f; + t.dsuperior = 0xf6eb; + t.dtail = 0x0256; + t.dtopbar = 0x018c; + t.duhiragana = 0x3065; + t.dukatakana = 0x30c5; + t.dz = 0x01f3; + t.dzaltone = 0x02a3; + t.dzcaron = 0x01c6; + t.dzcurl = 0x02a5; + t.dzeabkhasiancyrillic = 0x04e1; + t.dzecyrillic = 0x0455; + t.dzhecyrillic = 0x045f; + t.e = 0x0065; + t.eacute = 0x00e9; + t.earth = 0x2641; + t.ebengali = 0x098f; + t.ebopomofo = 0x311c; + t.ebreve = 0x0115; + t.ecandradeva = 0x090d; + t.ecandragujarati = 0x0a8d; + t.ecandravowelsigndeva = 0x0945; + t.ecandravowelsigngujarati = 0x0ac5; + t.ecaron = 0x011b; + t.ecedillabreve = 0x1e1d; + t.echarmenian = 0x0565; + t.echyiwnarmenian = 0x0587; + t.ecircle = 0x24d4; + t.ecircumflex = 0x00ea; + t.ecircumflexacute = 0x1ebf; + t.ecircumflexbelow = 0x1e19; + t.ecircumflexdotbelow = 0x1ec7; + t.ecircumflexgrave = 0x1ec1; + t.ecircumflexhookabove = 0x1ec3; + t.ecircumflextilde = 0x1ec5; + t.ecyrillic = 0x0454; + t.edblgrave = 0x0205; + t.edeva = 0x090f; + t.edieresis = 0x00eb; + t.edot = 0x0117; + t.edotaccent = 0x0117; + t.edotbelow = 0x1eb9; + t.eegurmukhi = 0x0a0f; + t.eematragurmukhi = 0x0a47; + t.efcyrillic = 0x0444; + t.egrave = 0x00e8; + t.egujarati = 0x0a8f; + t.eharmenian = 0x0567; + t.ehbopomofo = 0x311d; + t.ehiragana = 0x3048; + t.ehookabove = 0x1ebb; + t.eibopomofo = 0x311f; + t.eight = 0x0038; + t.eightarabic = 0x0668; + t.eightbengali = 0x09ee; + t.eightcircle = 0x2467; + t.eightcircleinversesansserif = 0x2791; + t.eightdeva = 0x096e; + t.eighteencircle = 0x2471; + t.eighteenparen = 0x2485; + t.eighteenperiod = 0x2499; + t.eightgujarati = 0x0aee; + t.eightgurmukhi = 0x0a6e; + t.eighthackarabic = 0x0668; + t.eighthangzhou = 0x3028; + t.eighthnotebeamed = 0x266b; + t.eightideographicparen = 0x3227; + t.eightinferior = 0x2088; + t.eightmonospace = 0xff18; + t.eightoldstyle = 0xf738; + t.eightparen = 0x247b; + t.eightperiod = 0x248f; + t.eightpersian = 0x06f8; + t.eightroman = 0x2177; + t.eightsuperior = 0x2078; + t.eightthai = 0x0e58; + t.einvertedbreve = 0x0207; + t.eiotifiedcyrillic = 0x0465; + t.ekatakana = 0x30a8; + t.ekatakanahalfwidth = 0xff74; + t.ekonkargurmukhi = 0x0a74; + t.ekorean = 0x3154; + t.elcyrillic = 0x043b; + t.element = 0x2208; + t.elevencircle = 0x246a; + t.elevenparen = 0x247e; + t.elevenperiod = 0x2492; + t.elevenroman = 0x217a; + t.ellipsis = 0x2026; + t.ellipsisvertical = 0x22ee; + t.emacron = 0x0113; + t.emacronacute = 0x1e17; + t.emacrongrave = 0x1e15; + t.emcyrillic = 0x043c; + t.emdash = 0x2014; + t.emdashvertical = 0xfe31; + t.emonospace = 0xff45; + t.emphasismarkarmenian = 0x055b; + t.emptyset = 0x2205; + t.enbopomofo = 0x3123; + t.encyrillic = 0x043d; + t.endash = 0x2013; + t.endashvertical = 0xfe32; + t.endescendercyrillic = 0x04a3; + t.eng = 0x014b; + t.engbopomofo = 0x3125; + t.enghecyrillic = 0x04a5; + t.enhookcyrillic = 0x04c8; + t.enspace = 0x2002; + t.eogonek = 0x0119; + t.eokorean = 0x3153; + t.eopen = 0x025b; + t.eopenclosed = 0x029a; + t.eopenreversed = 0x025c; + t.eopenreversedclosed = 0x025e; + t.eopenreversedhook = 0x025d; + t.eparen = 0x24a0; + t.epsilon = 0x03b5; + t.epsilontonos = 0x03ad; + t.equal = 0x003d; + t.equalmonospace = 0xff1d; + t.equalsmall = 0xfe66; + t.equalsuperior = 0x207c; + t.equivalence = 0x2261; + t.erbopomofo = 0x3126; + t.ercyrillic = 0x0440; + t.ereversed = 0x0258; + t.ereversedcyrillic = 0x044d; + t.escyrillic = 0x0441; + t.esdescendercyrillic = 0x04ab; + t.esh = 0x0283; + t.eshcurl = 0x0286; + t.eshortdeva = 0x090e; + t.eshortvowelsigndeva = 0x0946; + t.eshreversedloop = 0x01aa; + t.eshsquatreversed = 0x0285; + t.esmallhiragana = 0x3047; + t.esmallkatakana = 0x30a7; + t.esmallkatakanahalfwidth = 0xff6a; + t.estimated = 0x212e; + t.esuperior = 0xf6ec; + t.eta = 0x03b7; + t.etarmenian = 0x0568; + t.etatonos = 0x03ae; + t.eth = 0x00f0; + t.etilde = 0x1ebd; + t.etildebelow = 0x1e1b; + t.etnahtafoukhhebrew = 0x0591; + t.etnahtafoukhlefthebrew = 0x0591; + t.etnahtahebrew = 0x0591; + t.etnahtalefthebrew = 0x0591; + t.eturned = 0x01dd; + t.eukorean = 0x3161; + t.euro = 0x20ac; + t.evowelsignbengali = 0x09c7; + t.evowelsigndeva = 0x0947; + t.evowelsigngujarati = 0x0ac7; + t.exclam = 0x0021; + t.exclamarmenian = 0x055c; + t.exclamdbl = 0x203c; + t.exclamdown = 0x00a1; + t.exclamdownsmall = 0xf7a1; + t.exclammonospace = 0xff01; + t.exclamsmall = 0xf721; + t.existential = 0x2203; + t.ezh = 0x0292; + t.ezhcaron = 0x01ef; + t.ezhcurl = 0x0293; + t.ezhreversed = 0x01b9; + t.ezhtail = 0x01ba; + t.f = 0x0066; + t.fadeva = 0x095e; + t.fagurmukhi = 0x0a5e; + t.fahrenheit = 0x2109; + t.fathaarabic = 0x064e; + t.fathalowarabic = 0x064e; + t.fathatanarabic = 0x064b; + t.fbopomofo = 0x3108; + t.fcircle = 0x24d5; + t.fdotaccent = 0x1e1f; + t.feharabic = 0x0641; + t.feharmenian = 0x0586; + t.fehfinalarabic = 0xfed2; + t.fehinitialarabic = 0xfed3; + t.fehmedialarabic = 0xfed4; + t.feicoptic = 0x03e5; + t.female = 0x2640; + t.ff = 0xfb00; + t.f_f = 0xfb00; + t.ffi = 0xfb03; + t.f_f_i = 0xfb03; + t.ffl = 0xfb04; + t.f_f_l = 0xfb04; + t.fi = 0xfb01; + t.f_i = 0xfb01; + t.fifteencircle = 0x246e; + t.fifteenparen = 0x2482; + t.fifteenperiod = 0x2496; + t.figuredash = 0x2012; + t.filledbox = 0x25a0; + t.filledrect = 0x25ac; + t.finalkaf = 0x05da; + t.finalkafdagesh = 0xfb3a; + t.finalkafdageshhebrew = 0xfb3a; + t.finalkafhebrew = 0x05da; + t.finalmem = 0x05dd; + t.finalmemhebrew = 0x05dd; + t.finalnun = 0x05df; + t.finalnunhebrew = 0x05df; + t.finalpe = 0x05e3; + t.finalpehebrew = 0x05e3; + t.finaltsadi = 0x05e5; + t.finaltsadihebrew = 0x05e5; + t.firsttonechinese = 0x02c9; + t.fisheye = 0x25c9; + t.fitacyrillic = 0x0473; + t.five = 0x0035; + t.fivearabic = 0x0665; + t.fivebengali = 0x09eb; + t.fivecircle = 0x2464; + t.fivecircleinversesansserif = 0x278e; + t.fivedeva = 0x096b; + t.fiveeighths = 0x215d; + t.fivegujarati = 0x0aeb; + t.fivegurmukhi = 0x0a6b; + t.fivehackarabic = 0x0665; + t.fivehangzhou = 0x3025; + t.fiveideographicparen = 0x3224; + t.fiveinferior = 0x2085; + t.fivemonospace = 0xff15; + t.fiveoldstyle = 0xf735; + t.fiveparen = 0x2478; + t.fiveperiod = 0x248c; + t.fivepersian = 0x06f5; + t.fiveroman = 0x2174; + t.fivesuperior = 0x2075; + t.fivethai = 0x0e55; + t.fl = 0xfb02; + t.f_l = 0xfb02; + t.florin = 0x0192; + t.fmonospace = 0xff46; + t.fmsquare = 0x3399; + t.fofanthai = 0x0e1f; + t.fofathai = 0x0e1d; + t.fongmanthai = 0x0e4f; + t.forall = 0x2200; + t.four = 0x0034; + t.fourarabic = 0x0664; + t.fourbengali = 0x09ea; + t.fourcircle = 0x2463; + t.fourcircleinversesansserif = 0x278d; + t.fourdeva = 0x096a; + t.fourgujarati = 0x0aea; + t.fourgurmukhi = 0x0a6a; + t.fourhackarabic = 0x0664; + t.fourhangzhou = 0x3024; + t.fourideographicparen = 0x3223; + t.fourinferior = 0x2084; + t.fourmonospace = 0xff14; + t.fournumeratorbengali = 0x09f7; + t.fouroldstyle = 0xf734; + t.fourparen = 0x2477; + t.fourperiod = 0x248b; + t.fourpersian = 0x06f4; + t.fourroman = 0x2173; + t.foursuperior = 0x2074; + t.fourteencircle = 0x246d; + t.fourteenparen = 0x2481; + t.fourteenperiod = 0x2495; + t.fourthai = 0x0e54; + t.fourthtonechinese = 0x02cb; + t.fparen = 0x24a1; + t.fraction = 0x2044; + t.franc = 0x20a3; + t.g = 0x0067; + t.gabengali = 0x0997; + t.gacute = 0x01f5; + t.gadeva = 0x0917; + t.gafarabic = 0x06af; + t.gaffinalarabic = 0xfb93; + t.gafinitialarabic = 0xfb94; + t.gafmedialarabic = 0xfb95; + t.gagujarati = 0x0a97; + t.gagurmukhi = 0x0a17; + t.gahiragana = 0x304c; + t.gakatakana = 0x30ac; + t.gamma = 0x03b3; + t.gammalatinsmall = 0x0263; + t.gammasuperior = 0x02e0; + t.gangiacoptic = 0x03eb; + t.gbopomofo = 0x310d; + t.gbreve = 0x011f; + t.gcaron = 0x01e7; + t.gcedilla = 0x0123; + t.gcircle = 0x24d6; + t.gcircumflex = 0x011d; + t.gcommaaccent = 0x0123; + t.gdot = 0x0121; + t.gdotaccent = 0x0121; + t.gecyrillic = 0x0433; + t.gehiragana = 0x3052; + t.gekatakana = 0x30b2; + t.geometricallyequal = 0x2251; + t.gereshaccenthebrew = 0x059c; + t.gereshhebrew = 0x05f3; + t.gereshmuqdamhebrew = 0x059d; + t.germandbls = 0x00df; + t.gershayimaccenthebrew = 0x059e; + t.gershayimhebrew = 0x05f4; + t.getamark = 0x3013; + t.ghabengali = 0x0998; + t.ghadarmenian = 0x0572; + t.ghadeva = 0x0918; + t.ghagujarati = 0x0a98; + t.ghagurmukhi = 0x0a18; + t.ghainarabic = 0x063a; + t.ghainfinalarabic = 0xfece; + t.ghaininitialarabic = 0xfecf; + t.ghainmedialarabic = 0xfed0; + t.ghemiddlehookcyrillic = 0x0495; + t.ghestrokecyrillic = 0x0493; + t.gheupturncyrillic = 0x0491; + t.ghhadeva = 0x095a; + t.ghhagurmukhi = 0x0a5a; + t.ghook = 0x0260; + t.ghzsquare = 0x3393; + t.gihiragana = 0x304e; + t.gikatakana = 0x30ae; + t.gimarmenian = 0x0563; + t.gimel = 0x05d2; + t.gimeldagesh = 0xfb32; + t.gimeldageshhebrew = 0xfb32; + t.gimelhebrew = 0x05d2; + t.gjecyrillic = 0x0453; + t.glottalinvertedstroke = 0x01be; + t.glottalstop = 0x0294; + t.glottalstopinverted = 0x0296; + t.glottalstopmod = 0x02c0; + t.glottalstopreversed = 0x0295; + t.glottalstopreversedmod = 0x02c1; + t.glottalstopreversedsuperior = 0x02e4; + t.glottalstopstroke = 0x02a1; + t.glottalstopstrokereversed = 0x02a2; + t.gmacron = 0x1e21; + t.gmonospace = 0xff47; + t.gohiragana = 0x3054; + t.gokatakana = 0x30b4; + t.gparen = 0x24a2; + t.gpasquare = 0x33ac; + t.gradient = 0x2207; + t.grave = 0x0060; + t.gravebelowcmb = 0x0316; + t.gravecmb = 0x0300; + t.gravecomb = 0x0300; + t.gravedeva = 0x0953; + t.gravelowmod = 0x02ce; + t.gravemonospace = 0xff40; + t.gravetonecmb = 0x0340; + t.greater = 0x003e; + t.greaterequal = 0x2265; + t.greaterequalorless = 0x22db; + t.greatermonospace = 0xff1e; + t.greaterorequivalent = 0x2273; + t.greaterorless = 0x2277; + t.greateroverequal = 0x2267; + t.greatersmall = 0xfe65; + t.gscript = 0x0261; + t.gstroke = 0x01e5; + t.guhiragana = 0x3050; + t.guillemotleft = 0x00ab; + t.guillemotright = 0x00bb; + t.guilsinglleft = 0x2039; + t.guilsinglright = 0x203a; + t.gukatakana = 0x30b0; + t.guramusquare = 0x3318; + t.gysquare = 0x33c9; + t.h = 0x0068; + t.haabkhasiancyrillic = 0x04a9; + t.haaltonearabic = 0x06c1; + t.habengali = 0x09b9; + t.hadescendercyrillic = 0x04b3; + t.hadeva = 0x0939; + t.hagujarati = 0x0ab9; + t.hagurmukhi = 0x0a39; + t.haharabic = 0x062d; + t.hahfinalarabic = 0xfea2; + t.hahinitialarabic = 0xfea3; + t.hahiragana = 0x306f; + t.hahmedialarabic = 0xfea4; + t.haitusquare = 0x332a; + t.hakatakana = 0x30cf; + t.hakatakanahalfwidth = 0xff8a; + t.halantgurmukhi = 0x0a4d; + t.hamzaarabic = 0x0621; + t.hamzalowarabic = 0x0621; + t.hangulfiller = 0x3164; + t.hardsigncyrillic = 0x044a; + t.harpoonleftbarbup = 0x21bc; + t.harpoonrightbarbup = 0x21c0; + t.hasquare = 0x33ca; + t.hatafpatah = 0x05b2; + t.hatafpatah16 = 0x05b2; + t.hatafpatah23 = 0x05b2; + t.hatafpatah2f = 0x05b2; + t.hatafpatahhebrew = 0x05b2; + t.hatafpatahnarrowhebrew = 0x05b2; + t.hatafpatahquarterhebrew = 0x05b2; + t.hatafpatahwidehebrew = 0x05b2; + t.hatafqamats = 0x05b3; + t.hatafqamats1b = 0x05b3; + t.hatafqamats28 = 0x05b3; + t.hatafqamats34 = 0x05b3; + t.hatafqamatshebrew = 0x05b3; + t.hatafqamatsnarrowhebrew = 0x05b3; + t.hatafqamatsquarterhebrew = 0x05b3; + t.hatafqamatswidehebrew = 0x05b3; + t.hatafsegol = 0x05b1; + t.hatafsegol17 = 0x05b1; + t.hatafsegol24 = 0x05b1; + t.hatafsegol30 = 0x05b1; + t.hatafsegolhebrew = 0x05b1; + t.hatafsegolnarrowhebrew = 0x05b1; + t.hatafsegolquarterhebrew = 0x05b1; + t.hatafsegolwidehebrew = 0x05b1; + t.hbar = 0x0127; + t.hbopomofo = 0x310f; + t.hbrevebelow = 0x1e2b; + t.hcedilla = 0x1e29; + t.hcircle = 0x24d7; + t.hcircumflex = 0x0125; + t.hdieresis = 0x1e27; + t.hdotaccent = 0x1e23; + t.hdotbelow = 0x1e25; + t.he = 0x05d4; + t.heart = 0x2665; + t.heartsuitblack = 0x2665; + t.heartsuitwhite = 0x2661; + t.hedagesh = 0xfb34; + t.hedageshhebrew = 0xfb34; + t.hehaltonearabic = 0x06c1; + t.heharabic = 0x0647; + t.hehebrew = 0x05d4; + t.hehfinalaltonearabic = 0xfba7; + t.hehfinalalttwoarabic = 0xfeea; + t.hehfinalarabic = 0xfeea; + t.hehhamzaabovefinalarabic = 0xfba5; + t.hehhamzaaboveisolatedarabic = 0xfba4; + t.hehinitialaltonearabic = 0xfba8; + t.hehinitialarabic = 0xfeeb; + t.hehiragana = 0x3078; + t.hehmedialaltonearabic = 0xfba9; + t.hehmedialarabic = 0xfeec; + t.heiseierasquare = 0x337b; + t.hekatakana = 0x30d8; + t.hekatakanahalfwidth = 0xff8d; + t.hekutaarusquare = 0x3336; + t.henghook = 0x0267; + t.herutusquare = 0x3339; + t.het = 0x05d7; + t.hethebrew = 0x05d7; + t.hhook = 0x0266; + t.hhooksuperior = 0x02b1; + t.hieuhacirclekorean = 0x327b; + t.hieuhaparenkorean = 0x321b; + t.hieuhcirclekorean = 0x326d; + t.hieuhkorean = 0x314e; + t.hieuhparenkorean = 0x320d; + t.hihiragana = 0x3072; + t.hikatakana = 0x30d2; + t.hikatakanahalfwidth = 0xff8b; + t.hiriq = 0x05b4; + t.hiriq14 = 0x05b4; + t.hiriq21 = 0x05b4; + t.hiriq2d = 0x05b4; + t.hiriqhebrew = 0x05b4; + t.hiriqnarrowhebrew = 0x05b4; + t.hiriqquarterhebrew = 0x05b4; + t.hiriqwidehebrew = 0x05b4; + t.hlinebelow = 0x1e96; + t.hmonospace = 0xff48; + t.hoarmenian = 0x0570; + t.hohipthai = 0x0e2b; + t.hohiragana = 0x307b; + t.hokatakana = 0x30db; + t.hokatakanahalfwidth = 0xff8e; + t.holam = 0x05b9; + t.holam19 = 0x05b9; + t.holam26 = 0x05b9; + t.holam32 = 0x05b9; + t.holamhebrew = 0x05b9; + t.holamnarrowhebrew = 0x05b9; + t.holamquarterhebrew = 0x05b9; + t.holamwidehebrew = 0x05b9; + t.honokhukthai = 0x0e2e; + t.hookabovecomb = 0x0309; + t.hookcmb = 0x0309; + t.hookpalatalizedbelowcmb = 0x0321; + t.hookretroflexbelowcmb = 0x0322; + t.hoonsquare = 0x3342; + t.horicoptic = 0x03e9; + t.horizontalbar = 0x2015; + t.horncmb = 0x031b; + t.hotsprings = 0x2668; + t.house = 0x2302; + t.hparen = 0x24a3; + t.hsuperior = 0x02b0; + t.hturned = 0x0265; + t.huhiragana = 0x3075; + t.huiitosquare = 0x3333; + t.hukatakana = 0x30d5; + t.hukatakanahalfwidth = 0xff8c; + t.hungarumlaut = 0x02dd; + t.hungarumlautcmb = 0x030b; + t.hv = 0x0195; + t.hyphen = 0x002d; + t.hypheninferior = 0xf6e5; + t.hyphenmonospace = 0xff0d; + t.hyphensmall = 0xfe63; + t.hyphensuperior = 0xf6e6; + t.hyphentwo = 0x2010; + t.i = 0x0069; + t.iacute = 0x00ed; + t.iacyrillic = 0x044f; + t.ibengali = 0x0987; + t.ibopomofo = 0x3127; + t.ibreve = 0x012d; + t.icaron = 0x01d0; + t.icircle = 0x24d8; + t.icircumflex = 0x00ee; + t.icyrillic = 0x0456; + t.idblgrave = 0x0209; + t.ideographearthcircle = 0x328f; + t.ideographfirecircle = 0x328b; + t.ideographicallianceparen = 0x323f; + t.ideographiccallparen = 0x323a; + t.ideographiccentrecircle = 0x32a5; + t.ideographicclose = 0x3006; + t.ideographiccomma = 0x3001; + t.ideographiccommaleft = 0xff64; + t.ideographiccongratulationparen = 0x3237; + t.ideographiccorrectcircle = 0x32a3; + t.ideographicearthparen = 0x322f; + t.ideographicenterpriseparen = 0x323d; + t.ideographicexcellentcircle = 0x329d; + t.ideographicfestivalparen = 0x3240; + t.ideographicfinancialcircle = 0x3296; + t.ideographicfinancialparen = 0x3236; + t.ideographicfireparen = 0x322b; + t.ideographichaveparen = 0x3232; + t.ideographichighcircle = 0x32a4; + t.ideographiciterationmark = 0x3005; + t.ideographiclaborcircle = 0x3298; + t.ideographiclaborparen = 0x3238; + t.ideographicleftcircle = 0x32a7; + t.ideographiclowcircle = 0x32a6; + t.ideographicmedicinecircle = 0x32a9; + t.ideographicmetalparen = 0x322e; + t.ideographicmoonparen = 0x322a; + t.ideographicnameparen = 0x3234; + t.ideographicperiod = 0x3002; + t.ideographicprintcircle = 0x329e; + t.ideographicreachparen = 0x3243; + t.ideographicrepresentparen = 0x3239; + t.ideographicresourceparen = 0x323e; + t.ideographicrightcircle = 0x32a8; + t.ideographicsecretcircle = 0x3299; + t.ideographicselfparen = 0x3242; + t.ideographicsocietyparen = 0x3233; + t.ideographicspace = 0x3000; + t.ideographicspecialparen = 0x3235; + t.ideographicstockparen = 0x3231; + t.ideographicstudyparen = 0x323b; + t.ideographicsunparen = 0x3230; + t.ideographicsuperviseparen = 0x323c; + t.ideographicwaterparen = 0x322c; + t.ideographicwoodparen = 0x322d; + t.ideographiczero = 0x3007; + t.ideographmetalcircle = 0x328e; + t.ideographmooncircle = 0x328a; + t.ideographnamecircle = 0x3294; + t.ideographsuncircle = 0x3290; + t.ideographwatercircle = 0x328c; + t.ideographwoodcircle = 0x328d; + t.ideva = 0x0907; + t.idieresis = 0x00ef; + t.idieresisacute = 0x1e2f; + t.idieresiscyrillic = 0x04e5; + t.idotbelow = 0x1ecb; + t.iebrevecyrillic = 0x04d7; + t.iecyrillic = 0x0435; + t.ieungacirclekorean = 0x3275; + t.ieungaparenkorean = 0x3215; + t.ieungcirclekorean = 0x3267; + t.ieungkorean = 0x3147; + t.ieungparenkorean = 0x3207; + t.igrave = 0x00ec; + t.igujarati = 0x0a87; + t.igurmukhi = 0x0a07; + t.ihiragana = 0x3044; + t.ihookabove = 0x1ec9; + t.iibengali = 0x0988; + t.iicyrillic = 0x0438; + t.iideva = 0x0908; + t.iigujarati = 0x0a88; + t.iigurmukhi = 0x0a08; + t.iimatragurmukhi = 0x0a40; + t.iinvertedbreve = 0x020b; + t.iishortcyrillic = 0x0439; + t.iivowelsignbengali = 0x09c0; + t.iivowelsigndeva = 0x0940; + t.iivowelsigngujarati = 0x0ac0; + t.ij = 0x0133; + t.ikatakana = 0x30a4; + t.ikatakanahalfwidth = 0xff72; + t.ikorean = 0x3163; + t.ilde = 0x02dc; + t.iluyhebrew = 0x05ac; + t.imacron = 0x012b; + t.imacroncyrillic = 0x04e3; + t.imageorapproximatelyequal = 0x2253; + t.imatragurmukhi = 0x0a3f; + t.imonospace = 0xff49; + t.increment = 0x2206; + t.infinity = 0x221e; + t.iniarmenian = 0x056b; + t.integral = 0x222b; + t.integralbottom = 0x2321; + t.integralbt = 0x2321; + t.integralex = 0xf8f5; + t.integraltop = 0x2320; + t.integraltp = 0x2320; + t.intersection = 0x2229; + t.intisquare = 0x3305; + t.invbullet = 0x25d8; + t.invcircle = 0x25d9; + t.invsmileface = 0x263b; + t.iocyrillic = 0x0451; + t.iogonek = 0x012f; + t.iota = 0x03b9; + t.iotadieresis = 0x03ca; + t.iotadieresistonos = 0x0390; + t.iotalatin = 0x0269; + t.iotatonos = 0x03af; + t.iparen = 0x24a4; + t.irigurmukhi = 0x0a72; + t.ismallhiragana = 0x3043; + t.ismallkatakana = 0x30a3; + t.ismallkatakanahalfwidth = 0xff68; + t.issharbengali = 0x09fa; + t.istroke = 0x0268; + t.isuperior = 0xf6ed; + t.iterationhiragana = 0x309d; + t.iterationkatakana = 0x30fd; + t.itilde = 0x0129; + t.itildebelow = 0x1e2d; + t.iubopomofo = 0x3129; + t.iucyrillic = 0x044e; + t.ivowelsignbengali = 0x09bf; + t.ivowelsigndeva = 0x093f; + t.ivowelsigngujarati = 0x0abf; + t.izhitsacyrillic = 0x0475; + t.izhitsadblgravecyrillic = 0x0477; + t.j = 0x006a; + t.jaarmenian = 0x0571; + t.jabengali = 0x099c; + t.jadeva = 0x091c; + t.jagujarati = 0x0a9c; + t.jagurmukhi = 0x0a1c; + t.jbopomofo = 0x3110; + t.jcaron = 0x01f0; + t.jcircle = 0x24d9; + t.jcircumflex = 0x0135; + t.jcrossedtail = 0x029d; + t.jdotlessstroke = 0x025f; + t.jecyrillic = 0x0458; + t.jeemarabic = 0x062c; + t.jeemfinalarabic = 0xfe9e; + t.jeeminitialarabic = 0xfe9f; + t.jeemmedialarabic = 0xfea0; + t.jeharabic = 0x0698; + t.jehfinalarabic = 0xfb8b; + t.jhabengali = 0x099d; + t.jhadeva = 0x091d; + t.jhagujarati = 0x0a9d; + t.jhagurmukhi = 0x0a1d; + t.jheharmenian = 0x057b; + t.jis = 0x3004; + t.jmonospace = 0xff4a; + t.jparen = 0x24a5; + t.jsuperior = 0x02b2; + t.k = 0x006b; + t.kabashkircyrillic = 0x04a1; + t.kabengali = 0x0995; + t.kacute = 0x1e31; + t.kacyrillic = 0x043a; + t.kadescendercyrillic = 0x049b; + t.kadeva = 0x0915; + t.kaf = 0x05db; + t.kafarabic = 0x0643; + t.kafdagesh = 0xfb3b; + t.kafdageshhebrew = 0xfb3b; + t.kaffinalarabic = 0xfeda; + t.kafhebrew = 0x05db; + t.kafinitialarabic = 0xfedb; + t.kafmedialarabic = 0xfedc; + t.kafrafehebrew = 0xfb4d; + t.kagujarati = 0x0a95; + t.kagurmukhi = 0x0a15; + t.kahiragana = 0x304b; + t.kahookcyrillic = 0x04c4; + t.kakatakana = 0x30ab; + t.kakatakanahalfwidth = 0xff76; + t.kappa = 0x03ba; + t.kappasymbolgreek = 0x03f0; + t.kapyeounmieumkorean = 0x3171; + t.kapyeounphieuphkorean = 0x3184; + t.kapyeounpieupkorean = 0x3178; + t.kapyeounssangpieupkorean = 0x3179; + t.karoriisquare = 0x330d; + t.kashidaautoarabic = 0x0640; + t.kashidaautonosidebearingarabic = 0x0640; + t.kasmallkatakana = 0x30f5; + t.kasquare = 0x3384; + t.kasraarabic = 0x0650; + t.kasratanarabic = 0x064d; + t.kastrokecyrillic = 0x049f; + t.katahiraprolongmarkhalfwidth = 0xff70; + t.kaverticalstrokecyrillic = 0x049d; + t.kbopomofo = 0x310e; + t.kcalsquare = 0x3389; + t.kcaron = 0x01e9; + t.kcedilla = 0x0137; + t.kcircle = 0x24da; + t.kcommaaccent = 0x0137; + t.kdotbelow = 0x1e33; + t.keharmenian = 0x0584; + t.kehiragana = 0x3051; + t.kekatakana = 0x30b1; + t.kekatakanahalfwidth = 0xff79; + t.kenarmenian = 0x056f; + t.kesmallkatakana = 0x30f6; + t.kgreenlandic = 0x0138; + t.khabengali = 0x0996; + t.khacyrillic = 0x0445; + t.khadeva = 0x0916; + t.khagujarati = 0x0a96; + t.khagurmukhi = 0x0a16; + t.khaharabic = 0x062e; + t.khahfinalarabic = 0xfea6; + t.khahinitialarabic = 0xfea7; + t.khahmedialarabic = 0xfea8; + t.kheicoptic = 0x03e7; + t.khhadeva = 0x0959; + t.khhagurmukhi = 0x0a59; + t.khieukhacirclekorean = 0x3278; + t.khieukhaparenkorean = 0x3218; + t.khieukhcirclekorean = 0x326a; + t.khieukhkorean = 0x314b; + t.khieukhparenkorean = 0x320a; + t.khokhaithai = 0x0e02; + t.khokhonthai = 0x0e05; + t.khokhuatthai = 0x0e03; + t.khokhwaithai = 0x0e04; + t.khomutthai = 0x0e5b; + t.khook = 0x0199; + t.khorakhangthai = 0x0e06; + t.khzsquare = 0x3391; + t.kihiragana = 0x304d; + t.kikatakana = 0x30ad; + t.kikatakanahalfwidth = 0xff77; + t.kiroguramusquare = 0x3315; + t.kiromeetorusquare = 0x3316; + t.kirosquare = 0x3314; + t.kiyeokacirclekorean = 0x326e; + t.kiyeokaparenkorean = 0x320e; + t.kiyeokcirclekorean = 0x3260; + t.kiyeokkorean = 0x3131; + t.kiyeokparenkorean = 0x3200; + t.kiyeoksioskorean = 0x3133; + t.kjecyrillic = 0x045c; + t.klinebelow = 0x1e35; + t.klsquare = 0x3398; + t.kmcubedsquare = 0x33a6; + t.kmonospace = 0xff4b; + t.kmsquaredsquare = 0x33a2; + t.kohiragana = 0x3053; + t.kohmsquare = 0x33c0; + t.kokaithai = 0x0e01; + t.kokatakana = 0x30b3; + t.kokatakanahalfwidth = 0xff7a; + t.kooposquare = 0x331e; + t.koppacyrillic = 0x0481; + t.koreanstandardsymbol = 0x327f; + t.koroniscmb = 0x0343; + t.kparen = 0x24a6; + t.kpasquare = 0x33aa; + t.ksicyrillic = 0x046f; + t.ktsquare = 0x33cf; + t.kturned = 0x029e; + t.kuhiragana = 0x304f; + t.kukatakana = 0x30af; + t.kukatakanahalfwidth = 0xff78; + t.kvsquare = 0x33b8; + t.kwsquare = 0x33be; + t.l = 0x006c; + t.labengali = 0x09b2; + t.lacute = 0x013a; + t.ladeva = 0x0932; + t.lagujarati = 0x0ab2; + t.lagurmukhi = 0x0a32; + t.lakkhangyaothai = 0x0e45; + t.lamaleffinalarabic = 0xfefc; + t.lamalefhamzaabovefinalarabic = 0xfef8; + t.lamalefhamzaaboveisolatedarabic = 0xfef7; + t.lamalefhamzabelowfinalarabic = 0xfefa; + t.lamalefhamzabelowisolatedarabic = 0xfef9; + t.lamalefisolatedarabic = 0xfefb; + t.lamalefmaddaabovefinalarabic = 0xfef6; + t.lamalefmaddaaboveisolatedarabic = 0xfef5; + t.lamarabic = 0x0644; + t.lambda = 0x03bb; + t.lambdastroke = 0x019b; + t.lamed = 0x05dc; + t.lameddagesh = 0xfb3c; + t.lameddageshhebrew = 0xfb3c; + t.lamedhebrew = 0x05dc; + t.lamfinalarabic = 0xfede; + t.lamhahinitialarabic = 0xfcca; + t.laminitialarabic = 0xfedf; + t.lamjeeminitialarabic = 0xfcc9; + t.lamkhahinitialarabic = 0xfccb; + t.lamlamhehisolatedarabic = 0xfdf2; + t.lammedialarabic = 0xfee0; + t.lammeemhahinitialarabic = 0xfd88; + t.lammeeminitialarabic = 0xfccc; + t.largecircle = 0x25ef; + t.lbar = 0x019a; + t.lbelt = 0x026c; + t.lbopomofo = 0x310c; + t.lcaron = 0x013e; + t.lcedilla = 0x013c; + t.lcircle = 0x24db; + t.lcircumflexbelow = 0x1e3d; + t.lcommaaccent = 0x013c; + t.ldot = 0x0140; + t.ldotaccent = 0x0140; + t.ldotbelow = 0x1e37; + t.ldotbelowmacron = 0x1e39; + t.leftangleabovecmb = 0x031a; + t.lefttackbelowcmb = 0x0318; + t.less = 0x003c; + t.lessequal = 0x2264; + t.lessequalorgreater = 0x22da; + t.lessmonospace = 0xff1c; + t.lessorequivalent = 0x2272; + t.lessorgreater = 0x2276; + t.lessoverequal = 0x2266; + t.lesssmall = 0xfe64; + t.lezh = 0x026e; + t.lfblock = 0x258c; + t.lhookretroflex = 0x026d; + t.lira = 0x20a4; + t.liwnarmenian = 0x056c; + t.lj = 0x01c9; + t.ljecyrillic = 0x0459; + t.ll = 0xf6c0; + t.lladeva = 0x0933; + t.llagujarati = 0x0ab3; + t.llinebelow = 0x1e3b; + t.llladeva = 0x0934; + t.llvocalicbengali = 0x09e1; + t.llvocalicdeva = 0x0961; + t.llvocalicvowelsignbengali = 0x09e3; + t.llvocalicvowelsigndeva = 0x0963; + t.lmiddletilde = 0x026b; + t.lmonospace = 0xff4c; + t.lmsquare = 0x33d0; + t.lochulathai = 0x0e2c; + t.logicaland = 0x2227; + t.logicalnot = 0x00ac; + t.logicalnotreversed = 0x2310; + t.logicalor = 0x2228; + t.lolingthai = 0x0e25; + t.longs = 0x017f; + t.lowlinecenterline = 0xfe4e; + t.lowlinecmb = 0x0332; + t.lowlinedashed = 0xfe4d; + t.lozenge = 0x25ca; + t.lparen = 0x24a7; + t.lslash = 0x0142; + t.lsquare = 0x2113; + t.lsuperior = 0xf6ee; + t.ltshade = 0x2591; + t.luthai = 0x0e26; + t.lvocalicbengali = 0x098c; + t.lvocalicdeva = 0x090c; + t.lvocalicvowelsignbengali = 0x09e2; + t.lvocalicvowelsigndeva = 0x0962; + t.lxsquare = 0x33d3; + t.m = 0x006d; + t.mabengali = 0x09ae; + t.macron = 0x00af; + t.macronbelowcmb = 0x0331; + t.macroncmb = 0x0304; + t.macronlowmod = 0x02cd; + t.macronmonospace = 0xffe3; + t.macute = 0x1e3f; + t.madeva = 0x092e; + t.magujarati = 0x0aae; + t.magurmukhi = 0x0a2e; + t.mahapakhhebrew = 0x05a4; + t.mahapakhlefthebrew = 0x05a4; + t.mahiragana = 0x307e; + t.maichattawalowleftthai = 0xf895; + t.maichattawalowrightthai = 0xf894; + t.maichattawathai = 0x0e4b; + t.maichattawaupperleftthai = 0xf893; + t.maieklowleftthai = 0xf88c; + t.maieklowrightthai = 0xf88b; + t.maiekthai = 0x0e48; + t.maiekupperleftthai = 0xf88a; + t.maihanakatleftthai = 0xf884; + t.maihanakatthai = 0x0e31; + t.maitaikhuleftthai = 0xf889; + t.maitaikhuthai = 0x0e47; + t.maitholowleftthai = 0xf88f; + t.maitholowrightthai = 0xf88e; + t.maithothai = 0x0e49; + t.maithoupperleftthai = 0xf88d; + t.maitrilowleftthai = 0xf892; + t.maitrilowrightthai = 0xf891; + t.maitrithai = 0x0e4a; + t.maitriupperleftthai = 0xf890; + t.maiyamokthai = 0x0e46; + t.makatakana = 0x30de; + t.makatakanahalfwidth = 0xff8f; + t.male = 0x2642; + t.mansyonsquare = 0x3347; + t.maqafhebrew = 0x05be; + t.mars = 0x2642; + t.masoracirclehebrew = 0x05af; + t.masquare = 0x3383; + t.mbopomofo = 0x3107; + t.mbsquare = 0x33d4; + t.mcircle = 0x24dc; + t.mcubedsquare = 0x33a5; + t.mdotaccent = 0x1e41; + t.mdotbelow = 0x1e43; + t.meemarabic = 0x0645; + t.meemfinalarabic = 0xfee2; + t.meeminitialarabic = 0xfee3; + t.meemmedialarabic = 0xfee4; + t.meemmeeminitialarabic = 0xfcd1; + t.meemmeemisolatedarabic = 0xfc48; + t.meetorusquare = 0x334d; + t.mehiragana = 0x3081; + t.meizierasquare = 0x337e; + t.mekatakana = 0x30e1; + t.mekatakanahalfwidth = 0xff92; + t.mem = 0x05de; + t.memdagesh = 0xfb3e; + t.memdageshhebrew = 0xfb3e; + t.memhebrew = 0x05de; + t.menarmenian = 0x0574; + t.merkhahebrew = 0x05a5; + t.merkhakefulahebrew = 0x05a6; + t.merkhakefulalefthebrew = 0x05a6; + t.merkhalefthebrew = 0x05a5; + t.mhook = 0x0271; + t.mhzsquare = 0x3392; + t.middledotkatakanahalfwidth = 0xff65; + t.middot = 0x00b7; + t.mieumacirclekorean = 0x3272; + t.mieumaparenkorean = 0x3212; + t.mieumcirclekorean = 0x3264; + t.mieumkorean = 0x3141; + t.mieumpansioskorean = 0x3170; + t.mieumparenkorean = 0x3204; + t.mieumpieupkorean = 0x316e; + t.mieumsioskorean = 0x316f; + t.mihiragana = 0x307f; + t.mikatakana = 0x30df; + t.mikatakanahalfwidth = 0xff90; + t.minus = 0x2212; + t.minusbelowcmb = 0x0320; + t.minuscircle = 0x2296; + t.minusmod = 0x02d7; + t.minusplus = 0x2213; + t.minute = 0x2032; + t.miribaarusquare = 0x334a; + t.mirisquare = 0x3349; + t.mlonglegturned = 0x0270; + t.mlsquare = 0x3396; + t.mmcubedsquare = 0x33a3; + t.mmonospace = 0xff4d; + t.mmsquaredsquare = 0x339f; + t.mohiragana = 0x3082; + t.mohmsquare = 0x33c1; + t.mokatakana = 0x30e2; + t.mokatakanahalfwidth = 0xff93; + t.molsquare = 0x33d6; + t.momathai = 0x0e21; + t.moverssquare = 0x33a7; + t.moverssquaredsquare = 0x33a8; + t.mparen = 0x24a8; + t.mpasquare = 0x33ab; + t.mssquare = 0x33b3; + t.msuperior = 0xf6ef; + t.mturned = 0x026f; + t.mu = 0x00b5; + t.mu1 = 0x00b5; + t.muasquare = 0x3382; + t.muchgreater = 0x226b; + t.muchless = 0x226a; + t.mufsquare = 0x338c; + t.mugreek = 0x03bc; + t.mugsquare = 0x338d; + t.muhiragana = 0x3080; + t.mukatakana = 0x30e0; + t.mukatakanahalfwidth = 0xff91; + t.mulsquare = 0x3395; + t.multiply = 0x00d7; + t.mumsquare = 0x339b; + t.munahhebrew = 0x05a3; + t.munahlefthebrew = 0x05a3; + t.musicalnote = 0x266a; + t.musicalnotedbl = 0x266b; + t.musicflatsign = 0x266d; + t.musicsharpsign = 0x266f; + t.mussquare = 0x33b2; + t.muvsquare = 0x33b6; + t.muwsquare = 0x33bc; + t.mvmegasquare = 0x33b9; + t.mvsquare = 0x33b7; + t.mwmegasquare = 0x33bf; + t.mwsquare = 0x33bd; + t.n = 0x006e; + t.nabengali = 0x09a8; + t.nabla = 0x2207; + t.nacute = 0x0144; + t.nadeva = 0x0928; + t.nagujarati = 0x0aa8; + t.nagurmukhi = 0x0a28; + t.nahiragana = 0x306a; + t.nakatakana = 0x30ca; + t.nakatakanahalfwidth = 0xff85; + t.napostrophe = 0x0149; + t.nasquare = 0x3381; + t.nbopomofo = 0x310b; + t.nbspace = 0x00a0; + t.ncaron = 0x0148; + t.ncedilla = 0x0146; + t.ncircle = 0x24dd; + t.ncircumflexbelow = 0x1e4b; + t.ncommaaccent = 0x0146; + t.ndotaccent = 0x1e45; + t.ndotbelow = 0x1e47; + t.nehiragana = 0x306d; + t.nekatakana = 0x30cd; + t.nekatakanahalfwidth = 0xff88; + t.newsheqelsign = 0x20aa; + t.nfsquare = 0x338b; + t.ngabengali = 0x0999; + t.ngadeva = 0x0919; + t.ngagujarati = 0x0a99; + t.ngagurmukhi = 0x0a19; + t.ngonguthai = 0x0e07; + t.nhiragana = 0x3093; + t.nhookleft = 0x0272; + t.nhookretroflex = 0x0273; + t.nieunacirclekorean = 0x326f; + t.nieunaparenkorean = 0x320f; + t.nieuncieuckorean = 0x3135; + t.nieuncirclekorean = 0x3261; + t.nieunhieuhkorean = 0x3136; + t.nieunkorean = 0x3134; + t.nieunpansioskorean = 0x3168; + t.nieunparenkorean = 0x3201; + t.nieunsioskorean = 0x3167; + t.nieuntikeutkorean = 0x3166; + t.nihiragana = 0x306b; + t.nikatakana = 0x30cb; + t.nikatakanahalfwidth = 0xff86; + t.nikhahitleftthai = 0xf899; + t.nikhahitthai = 0x0e4d; + t.nine = 0x0039; + t.ninearabic = 0x0669; + t.ninebengali = 0x09ef; + t.ninecircle = 0x2468; + t.ninecircleinversesansserif = 0x2792; + t.ninedeva = 0x096f; + t.ninegujarati = 0x0aef; + t.ninegurmukhi = 0x0a6f; + t.ninehackarabic = 0x0669; + t.ninehangzhou = 0x3029; + t.nineideographicparen = 0x3228; + t.nineinferior = 0x2089; + t.ninemonospace = 0xff19; + t.nineoldstyle = 0xf739; + t.nineparen = 0x247c; + t.nineperiod = 0x2490; + t.ninepersian = 0x06f9; + t.nineroman = 0x2178; + t.ninesuperior = 0x2079; + t.nineteencircle = 0x2472; + t.nineteenparen = 0x2486; + t.nineteenperiod = 0x249a; + t.ninethai = 0x0e59; + t.nj = 0x01cc; + t.njecyrillic = 0x045a; + t.nkatakana = 0x30f3; + t.nkatakanahalfwidth = 0xff9d; + t.nlegrightlong = 0x019e; + t.nlinebelow = 0x1e49; + t.nmonospace = 0xff4e; + t.nmsquare = 0x339a; + t.nnabengali = 0x09a3; + t.nnadeva = 0x0923; + t.nnagujarati = 0x0aa3; + t.nnagurmukhi = 0x0a23; + t.nnnadeva = 0x0929; + t.nohiragana = 0x306e; + t.nokatakana = 0x30ce; + t.nokatakanahalfwidth = 0xff89; + t.nonbreakingspace = 0x00a0; + t.nonenthai = 0x0e13; + t.nonuthai = 0x0e19; + t.noonarabic = 0x0646; + t.noonfinalarabic = 0xfee6; + t.noonghunnaarabic = 0x06ba; + t.noonghunnafinalarabic = 0xfb9f; + t.nooninitialarabic = 0xfee7; + t.noonjeeminitialarabic = 0xfcd2; + t.noonjeemisolatedarabic = 0xfc4b; + t.noonmedialarabic = 0xfee8; + t.noonmeeminitialarabic = 0xfcd5; + t.noonmeemisolatedarabic = 0xfc4e; + t.noonnoonfinalarabic = 0xfc8d; + t.notcontains = 0x220c; + t.notelement = 0x2209; + t.notelementof = 0x2209; + t.notequal = 0x2260; + t.notgreater = 0x226f; + t.notgreaternorequal = 0x2271; + t.notgreaternorless = 0x2279; + t.notidentical = 0x2262; + t.notless = 0x226e; + t.notlessnorequal = 0x2270; + t.notparallel = 0x2226; + t.notprecedes = 0x2280; + t.notsubset = 0x2284; + t.notsucceeds = 0x2281; + t.notsuperset = 0x2285; + t.nowarmenian = 0x0576; + t.nparen = 0x24a9; + t.nssquare = 0x33b1; + t.nsuperior = 0x207f; + t.ntilde = 0x00f1; + t.nu = 0x03bd; + t.nuhiragana = 0x306c; + t.nukatakana = 0x30cc; + t.nukatakanahalfwidth = 0xff87; + t.nuktabengali = 0x09bc; + t.nuktadeva = 0x093c; + t.nuktagujarati = 0x0abc; + t.nuktagurmukhi = 0x0a3c; + t.numbersign = 0x0023; + t.numbersignmonospace = 0xff03; + t.numbersignsmall = 0xfe5f; + t.numeralsigngreek = 0x0374; + t.numeralsignlowergreek = 0x0375; + t.numero = 0x2116; + t.nun = 0x05e0; + t.nundagesh = 0xfb40; + t.nundageshhebrew = 0xfb40; + t.nunhebrew = 0x05e0; + t.nvsquare = 0x33b5; + t.nwsquare = 0x33bb; + t.nyabengali = 0x099e; + t.nyadeva = 0x091e; + t.nyagujarati = 0x0a9e; + t.nyagurmukhi = 0x0a1e; + t.o = 0x006f; + t.oacute = 0x00f3; + t.oangthai = 0x0e2d; + t.obarred = 0x0275; + t.obarredcyrillic = 0x04e9; + t.obarreddieresiscyrillic = 0x04eb; + t.obengali = 0x0993; + t.obopomofo = 0x311b; + t.obreve = 0x014f; + t.ocandradeva = 0x0911; + t.ocandragujarati = 0x0a91; + t.ocandravowelsigndeva = 0x0949; + t.ocandravowelsigngujarati = 0x0ac9; + t.ocaron = 0x01d2; + t.ocircle = 0x24de; + t.ocircumflex = 0x00f4; + t.ocircumflexacute = 0x1ed1; + t.ocircumflexdotbelow = 0x1ed9; + t.ocircumflexgrave = 0x1ed3; + t.ocircumflexhookabove = 0x1ed5; + t.ocircumflextilde = 0x1ed7; + t.ocyrillic = 0x043e; + t.odblacute = 0x0151; + t.odblgrave = 0x020d; + t.odeva = 0x0913; + t.odieresis = 0x00f6; + t.odieresiscyrillic = 0x04e7; + t.odotbelow = 0x1ecd; + t.oe = 0x0153; + t.oekorean = 0x315a; + t.ogonek = 0x02db; + t.ogonekcmb = 0x0328; + t.ograve = 0x00f2; + t.ogujarati = 0x0a93; + t.oharmenian = 0x0585; + t.ohiragana = 0x304a; + t.ohookabove = 0x1ecf; + t.ohorn = 0x01a1; + t.ohornacute = 0x1edb; + t.ohorndotbelow = 0x1ee3; + t.ohorngrave = 0x1edd; + t.ohornhookabove = 0x1edf; + t.ohorntilde = 0x1ee1; + t.ohungarumlaut = 0x0151; + t.oi = 0x01a3; + t.oinvertedbreve = 0x020f; + t.okatakana = 0x30aa; + t.okatakanahalfwidth = 0xff75; + t.okorean = 0x3157; + t.olehebrew = 0x05ab; + t.omacron = 0x014d; + t.omacronacute = 0x1e53; + t.omacrongrave = 0x1e51; + t.omdeva = 0x0950; + t.omega = 0x03c9; + t.omega1 = 0x03d6; + t.omegacyrillic = 0x0461; + t.omegalatinclosed = 0x0277; + t.omegaroundcyrillic = 0x047b; + t.omegatitlocyrillic = 0x047d; + t.omegatonos = 0x03ce; + t.omgujarati = 0x0ad0; + t.omicron = 0x03bf; + t.omicrontonos = 0x03cc; + t.omonospace = 0xff4f; + t.one = 0x0031; + t.onearabic = 0x0661; + t.onebengali = 0x09e7; + t.onecircle = 0x2460; + t.onecircleinversesansserif = 0x278a; + t.onedeva = 0x0967; + t.onedotenleader = 0x2024; + t.oneeighth = 0x215b; + t.onefitted = 0xf6dc; + t.onegujarati = 0x0ae7; + t.onegurmukhi = 0x0a67; + t.onehackarabic = 0x0661; + t.onehalf = 0x00bd; + t.onehangzhou = 0x3021; + t.oneideographicparen = 0x3220; + t.oneinferior = 0x2081; + t.onemonospace = 0xff11; + t.onenumeratorbengali = 0x09f4; + t.oneoldstyle = 0xf731; + t.oneparen = 0x2474; + t.oneperiod = 0x2488; + t.onepersian = 0x06f1; + t.onequarter = 0x00bc; + t.oneroman = 0x2170; + t.onesuperior = 0x00b9; + t.onethai = 0x0e51; + t.onethird = 0x2153; + t.oogonek = 0x01eb; + t.oogonekmacron = 0x01ed; + t.oogurmukhi = 0x0a13; + t.oomatragurmukhi = 0x0a4b; + t.oopen = 0x0254; + t.oparen = 0x24aa; + t.openbullet = 0x25e6; + t.option = 0x2325; + t.ordfeminine = 0x00aa; + t.ordmasculine = 0x00ba; + t.orthogonal = 0x221f; + t.oshortdeva = 0x0912; + t.oshortvowelsigndeva = 0x094a; + t.oslash = 0x00f8; + t.oslashacute = 0x01ff; + t.osmallhiragana = 0x3049; + t.osmallkatakana = 0x30a9; + t.osmallkatakanahalfwidth = 0xff6b; + t.ostrokeacute = 0x01ff; + t.osuperior = 0xf6f0; + t.otcyrillic = 0x047f; + t.otilde = 0x00f5; + t.otildeacute = 0x1e4d; + t.otildedieresis = 0x1e4f; + t.oubopomofo = 0x3121; + t.overline = 0x203e; + t.overlinecenterline = 0xfe4a; + t.overlinecmb = 0x0305; + t.overlinedashed = 0xfe49; + t.overlinedblwavy = 0xfe4c; + t.overlinewavy = 0xfe4b; + t.overscore = 0x00af; + t.ovowelsignbengali = 0x09cb; + t.ovowelsigndeva = 0x094b; + t.ovowelsigngujarati = 0x0acb; + t.p = 0x0070; + t.paampssquare = 0x3380; + t.paasentosquare = 0x332b; + t.pabengali = 0x09aa; + t.pacute = 0x1e55; + t.padeva = 0x092a; + t.pagedown = 0x21df; + t.pageup = 0x21de; + t.pagujarati = 0x0aaa; + t.pagurmukhi = 0x0a2a; + t.pahiragana = 0x3071; + t.paiyannoithai = 0x0e2f; + t.pakatakana = 0x30d1; + t.palatalizationcyrilliccmb = 0x0484; + t.palochkacyrillic = 0x04c0; + t.pansioskorean = 0x317f; + t.paragraph = 0x00b6; + t.parallel = 0x2225; + t.parenleft = 0x0028; + t.parenleftaltonearabic = 0xfd3e; + t.parenleftbt = 0xf8ed; + t.parenleftex = 0xf8ec; + t.parenleftinferior = 0x208d; + t.parenleftmonospace = 0xff08; + t.parenleftsmall = 0xfe59; + t.parenleftsuperior = 0x207d; + t.parenlefttp = 0xf8eb; + t.parenleftvertical = 0xfe35; + t.parenright = 0x0029; + t.parenrightaltonearabic = 0xfd3f; + t.parenrightbt = 0xf8f8; + t.parenrightex = 0xf8f7; + t.parenrightinferior = 0x208e; + t.parenrightmonospace = 0xff09; + t.parenrightsmall = 0xfe5a; + t.parenrightsuperior = 0x207e; + t.parenrighttp = 0xf8f6; + t.parenrightvertical = 0xfe36; + t.partialdiff = 0x2202; + t.paseqhebrew = 0x05c0; + t.pashtahebrew = 0x0599; + t.pasquare = 0x33a9; + t.patah = 0x05b7; + t.patah11 = 0x05b7; + t.patah1d = 0x05b7; + t.patah2a = 0x05b7; + t.patahhebrew = 0x05b7; + t.patahnarrowhebrew = 0x05b7; + t.patahquarterhebrew = 0x05b7; + t.patahwidehebrew = 0x05b7; + t.pazerhebrew = 0x05a1; + t.pbopomofo = 0x3106; + t.pcircle = 0x24df; + t.pdotaccent = 0x1e57; + t.pe = 0x05e4; + t.pecyrillic = 0x043f; + t.pedagesh = 0xfb44; + t.pedageshhebrew = 0xfb44; + t.peezisquare = 0x333b; + t.pefinaldageshhebrew = 0xfb43; + t.peharabic = 0x067e; + t.peharmenian = 0x057a; + t.pehebrew = 0x05e4; + t.pehfinalarabic = 0xfb57; + t.pehinitialarabic = 0xfb58; + t.pehiragana = 0x307a; + t.pehmedialarabic = 0xfb59; + t.pekatakana = 0x30da; + t.pemiddlehookcyrillic = 0x04a7; + t.perafehebrew = 0xfb4e; + t.percent = 0x0025; + t.percentarabic = 0x066a; + t.percentmonospace = 0xff05; + t.percentsmall = 0xfe6a; + t.period = 0x002e; + t.periodarmenian = 0x0589; + t.periodcentered = 0x00b7; + t.periodhalfwidth = 0xff61; + t.periodinferior = 0xf6e7; + t.periodmonospace = 0xff0e; + t.periodsmall = 0xfe52; + t.periodsuperior = 0xf6e8; + t.perispomenigreekcmb = 0x0342; + t.perpendicular = 0x22a5; + t.perthousand = 0x2030; + t.peseta = 0x20a7; + t.pfsquare = 0x338a; + t.phabengali = 0x09ab; + t.phadeva = 0x092b; + t.phagujarati = 0x0aab; + t.phagurmukhi = 0x0a2b; + t.phi = 0x03c6; + t.phi1 = 0x03d5; + t.phieuphacirclekorean = 0x327a; + t.phieuphaparenkorean = 0x321a; + t.phieuphcirclekorean = 0x326c; + t.phieuphkorean = 0x314d; + t.phieuphparenkorean = 0x320c; + t.philatin = 0x0278; + t.phinthuthai = 0x0e3a; + t.phisymbolgreek = 0x03d5; + t.phook = 0x01a5; + t.phophanthai = 0x0e1e; + t.phophungthai = 0x0e1c; + t.phosamphaothai = 0x0e20; + t.pi = 0x03c0; + t.pieupacirclekorean = 0x3273; + t.pieupaparenkorean = 0x3213; + t.pieupcieuckorean = 0x3176; + t.pieupcirclekorean = 0x3265; + t.pieupkiyeokkorean = 0x3172; + t.pieupkorean = 0x3142; + t.pieupparenkorean = 0x3205; + t.pieupsioskiyeokkorean = 0x3174; + t.pieupsioskorean = 0x3144; + t.pieupsiostikeutkorean = 0x3175; + t.pieupthieuthkorean = 0x3177; + t.pieuptikeutkorean = 0x3173; + t.pihiragana = 0x3074; + t.pikatakana = 0x30d4; + t.pisymbolgreek = 0x03d6; + t.piwrarmenian = 0x0583; + t.planckover2pi = 0x210f; + t.planckover2pi1 = 0x210f; + t.plus = 0x002b; + t.plusbelowcmb = 0x031f; + t.pluscircle = 0x2295; + t.plusminus = 0x00b1; + t.plusmod = 0x02d6; + t.plusmonospace = 0xff0b; + t.plussmall = 0xfe62; + t.plussuperior = 0x207a; + t.pmonospace = 0xff50; + t.pmsquare = 0x33d8; + t.pohiragana = 0x307d; + t.pointingindexdownwhite = 0x261f; + t.pointingindexleftwhite = 0x261c; + t.pointingindexrightwhite = 0x261e; + t.pointingindexupwhite = 0x261d; + t.pokatakana = 0x30dd; + t.poplathai = 0x0e1b; + t.postalmark = 0x3012; + t.postalmarkface = 0x3020; + t.pparen = 0x24ab; + t.precedes = 0x227a; + t.prescription = 0x211e; + t.primemod = 0x02b9; + t.primereversed = 0x2035; + t.product = 0x220f; + t.projective = 0x2305; + t.prolongedkana = 0x30fc; + t.propellor = 0x2318; + t.propersubset = 0x2282; + t.propersuperset = 0x2283; + t.proportion = 0x2237; + t.proportional = 0x221d; + t.psi = 0x03c8; + t.psicyrillic = 0x0471; + t.psilipneumatacyrilliccmb = 0x0486; + t.pssquare = 0x33b0; + t.puhiragana = 0x3077; + t.pukatakana = 0x30d7; + t.pvsquare = 0x33b4; + t.pwsquare = 0x33ba; + t.q = 0x0071; + t.qadeva = 0x0958; + t.qadmahebrew = 0x05a8; + t.qafarabic = 0x0642; + t.qaffinalarabic = 0xfed6; + t.qafinitialarabic = 0xfed7; + t.qafmedialarabic = 0xfed8; + t.qamats = 0x05b8; + t.qamats10 = 0x05b8; + t.qamats1a = 0x05b8; + t.qamats1c = 0x05b8; + t.qamats27 = 0x05b8; + t.qamats29 = 0x05b8; + t.qamats33 = 0x05b8; + t.qamatsde = 0x05b8; + t.qamatshebrew = 0x05b8; + t.qamatsnarrowhebrew = 0x05b8; + t.qamatsqatanhebrew = 0x05b8; + t.qamatsqatannarrowhebrew = 0x05b8; + t.qamatsqatanquarterhebrew = 0x05b8; + t.qamatsqatanwidehebrew = 0x05b8; + t.qamatsquarterhebrew = 0x05b8; + t.qamatswidehebrew = 0x05b8; + t.qarneyparahebrew = 0x059f; + t.qbopomofo = 0x3111; + t.qcircle = 0x24e0; + t.qhook = 0x02a0; + t.qmonospace = 0xff51; + t.qof = 0x05e7; + t.qofdagesh = 0xfb47; + t.qofdageshhebrew = 0xfb47; + t.qofhebrew = 0x05e7; + t.qparen = 0x24ac; + t.quarternote = 0x2669; + t.qubuts = 0x05bb; + t.qubuts18 = 0x05bb; + t.qubuts25 = 0x05bb; + t.qubuts31 = 0x05bb; + t.qubutshebrew = 0x05bb; + t.qubutsnarrowhebrew = 0x05bb; + t.qubutsquarterhebrew = 0x05bb; + t.qubutswidehebrew = 0x05bb; + t.question = 0x003f; + t.questionarabic = 0x061f; + t.questionarmenian = 0x055e; + t.questiondown = 0x00bf; + t.questiondownsmall = 0xf7bf; + t.questiongreek = 0x037e; + t.questionmonospace = 0xff1f; + t.questionsmall = 0xf73f; + t.quotedbl = 0x0022; + t.quotedblbase = 0x201e; + t.quotedblleft = 0x201c; + t.quotedblmonospace = 0xff02; + t.quotedblprime = 0x301e; + t.quotedblprimereversed = 0x301d; + t.quotedblright = 0x201d; + t.quoteleft = 0x2018; + t.quoteleftreversed = 0x201b; + t.quotereversed = 0x201b; + t.quoteright = 0x2019; + t.quoterightn = 0x0149; + t.quotesinglbase = 0x201a; + t.quotesingle = 0x0027; + t.quotesinglemonospace = 0xff07; + t.r = 0x0072; + t.raarmenian = 0x057c; + t.rabengali = 0x09b0; + t.racute = 0x0155; + t.radeva = 0x0930; + t.radical = 0x221a; + t.radicalex = 0xf8e5; + t.radoverssquare = 0x33ae; + t.radoverssquaredsquare = 0x33af; + t.radsquare = 0x33ad; + t.rafe = 0x05bf; + t.rafehebrew = 0x05bf; + t.ragujarati = 0x0ab0; + t.ragurmukhi = 0x0a30; + t.rahiragana = 0x3089; + t.rakatakana = 0x30e9; + t.rakatakanahalfwidth = 0xff97; + t.ralowerdiagonalbengali = 0x09f1; + t.ramiddlediagonalbengali = 0x09f0; + t.ramshorn = 0x0264; + t.ratio = 0x2236; + t.rbopomofo = 0x3116; + t.rcaron = 0x0159; + t.rcedilla = 0x0157; + t.rcircle = 0x24e1; + t.rcommaaccent = 0x0157; + t.rdblgrave = 0x0211; + t.rdotaccent = 0x1e59; + t.rdotbelow = 0x1e5b; + t.rdotbelowmacron = 0x1e5d; + t.referencemark = 0x203b; + t.reflexsubset = 0x2286; + t.reflexsuperset = 0x2287; + t.registered = 0x00ae; + t.registersans = 0xf8e8; + t.registerserif = 0xf6da; + t.reharabic = 0x0631; + t.reharmenian = 0x0580; + t.rehfinalarabic = 0xfeae; + t.rehiragana = 0x308c; + t.rekatakana = 0x30ec; + t.rekatakanahalfwidth = 0xff9a; + t.resh = 0x05e8; + t.reshdageshhebrew = 0xfb48; + t.reshhebrew = 0x05e8; + t.reversedtilde = 0x223d; + t.reviahebrew = 0x0597; + t.reviamugrashhebrew = 0x0597; + t.revlogicalnot = 0x2310; + t.rfishhook = 0x027e; + t.rfishhookreversed = 0x027f; + t.rhabengali = 0x09dd; + t.rhadeva = 0x095d; + t.rho = 0x03c1; + t.rhook = 0x027d; + t.rhookturned = 0x027b; + t.rhookturnedsuperior = 0x02b5; + t.rhosymbolgreek = 0x03f1; + t.rhotichookmod = 0x02de; + t.rieulacirclekorean = 0x3271; + t.rieulaparenkorean = 0x3211; + t.rieulcirclekorean = 0x3263; + t.rieulhieuhkorean = 0x3140; + t.rieulkiyeokkorean = 0x313a; + t.rieulkiyeoksioskorean = 0x3169; + t.rieulkorean = 0x3139; + t.rieulmieumkorean = 0x313b; + t.rieulpansioskorean = 0x316c; + t.rieulparenkorean = 0x3203; + t.rieulphieuphkorean = 0x313f; + t.rieulpieupkorean = 0x313c; + t.rieulpieupsioskorean = 0x316b; + t.rieulsioskorean = 0x313d; + t.rieulthieuthkorean = 0x313e; + t.rieultikeutkorean = 0x316a; + t.rieulyeorinhieuhkorean = 0x316d; + t.rightangle = 0x221f; + t.righttackbelowcmb = 0x0319; + t.righttriangle = 0x22bf; + t.rihiragana = 0x308a; + t.rikatakana = 0x30ea; + t.rikatakanahalfwidth = 0xff98; + t.ring = 0x02da; + t.ringbelowcmb = 0x0325; + t.ringcmb = 0x030a; + t.ringhalfleft = 0x02bf; + t.ringhalfleftarmenian = 0x0559; + t.ringhalfleftbelowcmb = 0x031c; + t.ringhalfleftcentered = 0x02d3; + t.ringhalfright = 0x02be; + t.ringhalfrightbelowcmb = 0x0339; + t.ringhalfrightcentered = 0x02d2; + t.rinvertedbreve = 0x0213; + t.rittorusquare = 0x3351; + t.rlinebelow = 0x1e5f; + t.rlongleg = 0x027c; + t.rlonglegturned = 0x027a; + t.rmonospace = 0xff52; + t.rohiragana = 0x308d; + t.rokatakana = 0x30ed; + t.rokatakanahalfwidth = 0xff9b; + t.roruathai = 0x0e23; + t.rparen = 0x24ad; + t.rrabengali = 0x09dc; + t.rradeva = 0x0931; + t.rragurmukhi = 0x0a5c; + t.rreharabic = 0x0691; + t.rrehfinalarabic = 0xfb8d; + t.rrvocalicbengali = 0x09e0; + t.rrvocalicdeva = 0x0960; + t.rrvocalicgujarati = 0x0ae0; + t.rrvocalicvowelsignbengali = 0x09c4; + t.rrvocalicvowelsigndeva = 0x0944; + t.rrvocalicvowelsigngujarati = 0x0ac4; + t.rsuperior = 0xf6f1; + t.rtblock = 0x2590; + t.rturned = 0x0279; + t.rturnedsuperior = 0x02b4; + t.ruhiragana = 0x308b; + t.rukatakana = 0x30eb; + t.rukatakanahalfwidth = 0xff99; + t.rupeemarkbengali = 0x09f2; + t.rupeesignbengali = 0x09f3; + t.rupiah = 0xf6dd; + t.ruthai = 0x0e24; + t.rvocalicbengali = 0x098b; + t.rvocalicdeva = 0x090b; + t.rvocalicgujarati = 0x0a8b; + t.rvocalicvowelsignbengali = 0x09c3; + t.rvocalicvowelsigndeva = 0x0943; + t.rvocalicvowelsigngujarati = 0x0ac3; + t.s = 0x0073; + t.sabengali = 0x09b8; + t.sacute = 0x015b; + t.sacutedotaccent = 0x1e65; + t.sadarabic = 0x0635; + t.sadeva = 0x0938; + t.sadfinalarabic = 0xfeba; + t.sadinitialarabic = 0xfebb; + t.sadmedialarabic = 0xfebc; + t.sagujarati = 0x0ab8; + t.sagurmukhi = 0x0a38; + t.sahiragana = 0x3055; + t.sakatakana = 0x30b5; + t.sakatakanahalfwidth = 0xff7b; + t.sallallahoualayhewasallamarabic = 0xfdfa; + t.samekh = 0x05e1; + t.samekhdagesh = 0xfb41; + t.samekhdageshhebrew = 0xfb41; + t.samekhhebrew = 0x05e1; + t.saraaathai = 0x0e32; + t.saraaethai = 0x0e41; + t.saraaimaimalaithai = 0x0e44; + t.saraaimaimuanthai = 0x0e43; + t.saraamthai = 0x0e33; + t.saraathai = 0x0e30; + t.saraethai = 0x0e40; + t.saraiileftthai = 0xf886; + t.saraiithai = 0x0e35; + t.saraileftthai = 0xf885; + t.saraithai = 0x0e34; + t.saraothai = 0x0e42; + t.saraueeleftthai = 0xf888; + t.saraueethai = 0x0e37; + t.saraueleftthai = 0xf887; + t.sarauethai = 0x0e36; + t.sarauthai = 0x0e38; + t.sarauuthai = 0x0e39; + t.sbopomofo = 0x3119; + t.scaron = 0x0161; + t.scarondotaccent = 0x1e67; + t.scedilla = 0x015f; + t.schwa = 0x0259; + t.schwacyrillic = 0x04d9; + t.schwadieresiscyrillic = 0x04db; + t.schwahook = 0x025a; + t.scircle = 0x24e2; + t.scircumflex = 0x015d; + t.scommaaccent = 0x0219; + t.sdotaccent = 0x1e61; + t.sdotbelow = 0x1e63; + t.sdotbelowdotaccent = 0x1e69; + t.seagullbelowcmb = 0x033c; + t.second = 0x2033; + t.secondtonechinese = 0x02ca; + t.section = 0x00a7; + t.seenarabic = 0x0633; + t.seenfinalarabic = 0xfeb2; + t.seeninitialarabic = 0xfeb3; + t.seenmedialarabic = 0xfeb4; + t.segol = 0x05b6; + t.segol13 = 0x05b6; + t.segol1f = 0x05b6; + t.segol2c = 0x05b6; + t.segolhebrew = 0x05b6; + t.segolnarrowhebrew = 0x05b6; + t.segolquarterhebrew = 0x05b6; + t.segoltahebrew = 0x0592; + t.segolwidehebrew = 0x05b6; + t.seharmenian = 0x057d; + t.sehiragana = 0x305b; + t.sekatakana = 0x30bb; + t.sekatakanahalfwidth = 0xff7e; + t.semicolon = 0x003b; + t.semicolonarabic = 0x061b; + t.semicolonmonospace = 0xff1b; + t.semicolonsmall = 0xfe54; + t.semivoicedmarkkana = 0x309c; + t.semivoicedmarkkanahalfwidth = 0xff9f; + t.sentisquare = 0x3322; + t.sentosquare = 0x3323; + t.seven = 0x0037; + t.sevenarabic = 0x0667; + t.sevenbengali = 0x09ed; + t.sevencircle = 0x2466; + t.sevencircleinversesansserif = 0x2790; + t.sevendeva = 0x096d; + t.seveneighths = 0x215e; + t.sevengujarati = 0x0aed; + t.sevengurmukhi = 0x0a6d; + t.sevenhackarabic = 0x0667; + t.sevenhangzhou = 0x3027; + t.sevenideographicparen = 0x3226; + t.seveninferior = 0x2087; + t.sevenmonospace = 0xff17; + t.sevenoldstyle = 0xf737; + t.sevenparen = 0x247a; + t.sevenperiod = 0x248e; + t.sevenpersian = 0x06f7; + t.sevenroman = 0x2176; + t.sevensuperior = 0x2077; + t.seventeencircle = 0x2470; + t.seventeenparen = 0x2484; + t.seventeenperiod = 0x2498; + t.seventhai = 0x0e57; + t.sfthyphen = 0x00ad; + t.shaarmenian = 0x0577; + t.shabengali = 0x09b6; + t.shacyrillic = 0x0448; + t.shaddaarabic = 0x0651; + t.shaddadammaarabic = 0xfc61; + t.shaddadammatanarabic = 0xfc5e; + t.shaddafathaarabic = 0xfc60; + t.shaddakasraarabic = 0xfc62; + t.shaddakasratanarabic = 0xfc5f; + t.shade = 0x2592; + t.shadedark = 0x2593; + t.shadelight = 0x2591; + t.shademedium = 0x2592; + t.shadeva = 0x0936; + t.shagujarati = 0x0ab6; + t.shagurmukhi = 0x0a36; + t.shalshelethebrew = 0x0593; + t.shbopomofo = 0x3115; + t.shchacyrillic = 0x0449; + t.sheenarabic = 0x0634; + t.sheenfinalarabic = 0xfeb6; + t.sheeninitialarabic = 0xfeb7; + t.sheenmedialarabic = 0xfeb8; + t.sheicoptic = 0x03e3; + t.sheqel = 0x20aa; + t.sheqelhebrew = 0x20aa; + t.sheva = 0x05b0; + t.sheva115 = 0x05b0; + t.sheva15 = 0x05b0; + t.sheva22 = 0x05b0; + t.sheva2e = 0x05b0; + t.shevahebrew = 0x05b0; + t.shevanarrowhebrew = 0x05b0; + t.shevaquarterhebrew = 0x05b0; + t.shevawidehebrew = 0x05b0; + t.shhacyrillic = 0x04bb; + t.shimacoptic = 0x03ed; + t.shin = 0x05e9; + t.shindagesh = 0xfb49; + t.shindageshhebrew = 0xfb49; + t.shindageshshindot = 0xfb2c; + t.shindageshshindothebrew = 0xfb2c; + t.shindageshsindot = 0xfb2d; + t.shindageshsindothebrew = 0xfb2d; + t.shindothebrew = 0x05c1; + t.shinhebrew = 0x05e9; + t.shinshindot = 0xfb2a; + t.shinshindothebrew = 0xfb2a; + t.shinsindot = 0xfb2b; + t.shinsindothebrew = 0xfb2b; + t.shook = 0x0282; + t.sigma = 0x03c3; + t.sigma1 = 0x03c2; + t.sigmafinal = 0x03c2; + t.sigmalunatesymbolgreek = 0x03f2; + t.sihiragana = 0x3057; + t.sikatakana = 0x30b7; + t.sikatakanahalfwidth = 0xff7c; + t.siluqhebrew = 0x05bd; + t.siluqlefthebrew = 0x05bd; + t.similar = 0x223c; + t.sindothebrew = 0x05c2; + t.siosacirclekorean = 0x3274; + t.siosaparenkorean = 0x3214; + t.sioscieuckorean = 0x317e; + t.sioscirclekorean = 0x3266; + t.sioskiyeokkorean = 0x317a; + t.sioskorean = 0x3145; + t.siosnieunkorean = 0x317b; + t.siosparenkorean = 0x3206; + t.siospieupkorean = 0x317d; + t.siostikeutkorean = 0x317c; + t.six = 0x0036; + t.sixarabic = 0x0666; + t.sixbengali = 0x09ec; + t.sixcircle = 0x2465; + t.sixcircleinversesansserif = 0x278f; + t.sixdeva = 0x096c; + t.sixgujarati = 0x0aec; + t.sixgurmukhi = 0x0a6c; + t.sixhackarabic = 0x0666; + t.sixhangzhou = 0x3026; + t.sixideographicparen = 0x3225; + t.sixinferior = 0x2086; + t.sixmonospace = 0xff16; + t.sixoldstyle = 0xf736; + t.sixparen = 0x2479; + t.sixperiod = 0x248d; + t.sixpersian = 0x06f6; + t.sixroman = 0x2175; + t.sixsuperior = 0x2076; + t.sixteencircle = 0x246f; + t.sixteencurrencydenominatorbengali = 0x09f9; + t.sixteenparen = 0x2483; + t.sixteenperiod = 0x2497; + t.sixthai = 0x0e56; + t.slash = 0x002f; + t.slashmonospace = 0xff0f; + t.slong = 0x017f; + t.slongdotaccent = 0x1e9b; + t.smileface = 0x263a; + t.smonospace = 0xff53; + t.sofpasuqhebrew = 0x05c3; + t.softhyphen = 0x00ad; + t.softsigncyrillic = 0x044c; + t.sohiragana = 0x305d; + t.sokatakana = 0x30bd; + t.sokatakanahalfwidth = 0xff7f; + t.soliduslongoverlaycmb = 0x0338; + t.solidusshortoverlaycmb = 0x0337; + t.sorusithai = 0x0e29; + t.sosalathai = 0x0e28; + t.sosothai = 0x0e0b; + t.sosuathai = 0x0e2a; + t.space = 0x0020; + t.spacehackarabic = 0x0020; + t.spade = 0x2660; + t.spadesuitblack = 0x2660; + t.spadesuitwhite = 0x2664; + t.sparen = 0x24ae; + t.squarebelowcmb = 0x033b; + t.squarecc = 0x33c4; + t.squarecm = 0x339d; + t.squarediagonalcrosshatchfill = 0x25a9; + t.squarehorizontalfill = 0x25a4; + t.squarekg = 0x338f; + t.squarekm = 0x339e; + t.squarekmcapital = 0x33ce; + t.squareln = 0x33d1; + t.squarelog = 0x33d2; + t.squaremg = 0x338e; + t.squaremil = 0x33d5; + t.squaremm = 0x339c; + t.squaremsquared = 0x33a1; + t.squareorthogonalcrosshatchfill = 0x25a6; + t.squareupperlefttolowerrightfill = 0x25a7; + t.squareupperrighttolowerleftfill = 0x25a8; + t.squareverticalfill = 0x25a5; + t.squarewhitewithsmallblack = 0x25a3; + t.srsquare = 0x33db; + t.ssabengali = 0x09b7; + t.ssadeva = 0x0937; + t.ssagujarati = 0x0ab7; + t.ssangcieuckorean = 0x3149; + t.ssanghieuhkorean = 0x3185; + t.ssangieungkorean = 0x3180; + t.ssangkiyeokkorean = 0x3132; + t.ssangnieunkorean = 0x3165; + t.ssangpieupkorean = 0x3143; + t.ssangsioskorean = 0x3146; + t.ssangtikeutkorean = 0x3138; + t.ssuperior = 0xf6f2; + t.sterling = 0x00a3; + t.sterlingmonospace = 0xffe1; + t.strokelongoverlaycmb = 0x0336; + t.strokeshortoverlaycmb = 0x0335; + t.subset = 0x2282; + t.subsetnotequal = 0x228a; + t.subsetorequal = 0x2286; + t.succeeds = 0x227b; + t.suchthat = 0x220b; + t.suhiragana = 0x3059; + t.sukatakana = 0x30b9; + t.sukatakanahalfwidth = 0xff7d; + t.sukunarabic = 0x0652; + t.summation = 0x2211; + t.sun = 0x263c; + t.superset = 0x2283; + t.supersetnotequal = 0x228b; + t.supersetorequal = 0x2287; + t.svsquare = 0x33dc; + t.syouwaerasquare = 0x337c; + t.t = 0x0074; + t.tabengali = 0x09a4; + t.tackdown = 0x22a4; + t.tackleft = 0x22a3; + t.tadeva = 0x0924; + t.tagujarati = 0x0aa4; + t.tagurmukhi = 0x0a24; + t.taharabic = 0x0637; + t.tahfinalarabic = 0xfec2; + t.tahinitialarabic = 0xfec3; + t.tahiragana = 0x305f; + t.tahmedialarabic = 0xfec4; + t.taisyouerasquare = 0x337d; + t.takatakana = 0x30bf; + t.takatakanahalfwidth = 0xff80; + t.tatweelarabic = 0x0640; + t.tau = 0x03c4; + t.tav = 0x05ea; + t.tavdages = 0xfb4a; + t.tavdagesh = 0xfb4a; + t.tavdageshhebrew = 0xfb4a; + t.tavhebrew = 0x05ea; + t.tbar = 0x0167; + t.tbopomofo = 0x310a; + t.tcaron = 0x0165; + t.tccurl = 0x02a8; + t.tcedilla = 0x0163; + t.tcheharabic = 0x0686; + t.tchehfinalarabic = 0xfb7b; + t.tchehinitialarabic = 0xfb7c; + t.tchehmedialarabic = 0xfb7d; + t.tcircle = 0x24e3; + t.tcircumflexbelow = 0x1e71; + t.tcommaaccent = 0x0163; + t.tdieresis = 0x1e97; + t.tdotaccent = 0x1e6b; + t.tdotbelow = 0x1e6d; + t.tecyrillic = 0x0442; + t.tedescendercyrillic = 0x04ad; + t.teharabic = 0x062a; + t.tehfinalarabic = 0xfe96; + t.tehhahinitialarabic = 0xfca2; + t.tehhahisolatedarabic = 0xfc0c; + t.tehinitialarabic = 0xfe97; + t.tehiragana = 0x3066; + t.tehjeeminitialarabic = 0xfca1; + t.tehjeemisolatedarabic = 0xfc0b; + t.tehmarbutaarabic = 0x0629; + t.tehmarbutafinalarabic = 0xfe94; + t.tehmedialarabic = 0xfe98; + t.tehmeeminitialarabic = 0xfca4; + t.tehmeemisolatedarabic = 0xfc0e; + t.tehnoonfinalarabic = 0xfc73; + t.tekatakana = 0x30c6; + t.tekatakanahalfwidth = 0xff83; + t.telephone = 0x2121; + t.telephoneblack = 0x260e; + t.telishagedolahebrew = 0x05a0; + t.telishaqetanahebrew = 0x05a9; + t.tencircle = 0x2469; + t.tenideographicparen = 0x3229; + t.tenparen = 0x247d; + t.tenperiod = 0x2491; + t.tenroman = 0x2179; + t.tesh = 0x02a7; + t.tet = 0x05d8; + t.tetdagesh = 0xfb38; + t.tetdageshhebrew = 0xfb38; + t.tethebrew = 0x05d8; + t.tetsecyrillic = 0x04b5; + t.tevirhebrew = 0x059b; + t.tevirlefthebrew = 0x059b; + t.thabengali = 0x09a5; + t.thadeva = 0x0925; + t.thagujarati = 0x0aa5; + t.thagurmukhi = 0x0a25; + t.thalarabic = 0x0630; + t.thalfinalarabic = 0xfeac; + t.thanthakhatlowleftthai = 0xf898; + t.thanthakhatlowrightthai = 0xf897; + t.thanthakhatthai = 0x0e4c; + t.thanthakhatupperleftthai = 0xf896; + t.theharabic = 0x062b; + t.thehfinalarabic = 0xfe9a; + t.thehinitialarabic = 0xfe9b; + t.thehmedialarabic = 0xfe9c; + t.thereexists = 0x2203; + t.therefore = 0x2234; + t.theta = 0x03b8; + t.theta1 = 0x03d1; + t.thetasymbolgreek = 0x03d1; + t.thieuthacirclekorean = 0x3279; + t.thieuthaparenkorean = 0x3219; + t.thieuthcirclekorean = 0x326b; + t.thieuthkorean = 0x314c; + t.thieuthparenkorean = 0x320b; + t.thirteencircle = 0x246c; + t.thirteenparen = 0x2480; + t.thirteenperiod = 0x2494; + t.thonangmonthothai = 0x0e11; + t.thook = 0x01ad; + t.thophuthaothai = 0x0e12; + t.thorn = 0x00fe; + t.thothahanthai = 0x0e17; + t.thothanthai = 0x0e10; + t.thothongthai = 0x0e18; + t.thothungthai = 0x0e16; + t.thousandcyrillic = 0x0482; + t.thousandsseparatorarabic = 0x066c; + t.thousandsseparatorpersian = 0x066c; + t.three = 0x0033; + t.threearabic = 0x0663; + t.threebengali = 0x09e9; + t.threecircle = 0x2462; + t.threecircleinversesansserif = 0x278c; + t.threedeva = 0x0969; + t.threeeighths = 0x215c; + t.threegujarati = 0x0ae9; + t.threegurmukhi = 0x0a69; + t.threehackarabic = 0x0663; + t.threehangzhou = 0x3023; + t.threeideographicparen = 0x3222; + t.threeinferior = 0x2083; + t.threemonospace = 0xff13; + t.threenumeratorbengali = 0x09f6; + t.threeoldstyle = 0xf733; + t.threeparen = 0x2476; + t.threeperiod = 0x248a; + t.threepersian = 0x06f3; + t.threequarters = 0x00be; + t.threequartersemdash = 0xf6de; + t.threeroman = 0x2172; + t.threesuperior = 0x00b3; + t.threethai = 0x0e53; + t.thzsquare = 0x3394; + t.tihiragana = 0x3061; + t.tikatakana = 0x30c1; + t.tikatakanahalfwidth = 0xff81; + t.tikeutacirclekorean = 0x3270; + t.tikeutaparenkorean = 0x3210; + t.tikeutcirclekorean = 0x3262; + t.tikeutkorean = 0x3137; + t.tikeutparenkorean = 0x3202; + t.tilde = 0x02dc; + t.tildebelowcmb = 0x0330; + t.tildecmb = 0x0303; + t.tildecomb = 0x0303; + t.tildedoublecmb = 0x0360; + t.tildeoperator = 0x223c; + t.tildeoverlaycmb = 0x0334; + t.tildeverticalcmb = 0x033e; + t.timescircle = 0x2297; + t.tipehahebrew = 0x0596; + t.tipehalefthebrew = 0x0596; + t.tippigurmukhi = 0x0a70; + t.titlocyrilliccmb = 0x0483; + t.tiwnarmenian = 0x057f; + t.tlinebelow = 0x1e6f; + t.tmonospace = 0xff54; + t.toarmenian = 0x0569; + t.tohiragana = 0x3068; + t.tokatakana = 0x30c8; + t.tokatakanahalfwidth = 0xff84; + t.tonebarextrahighmod = 0x02e5; + t.tonebarextralowmod = 0x02e9; + t.tonebarhighmod = 0x02e6; + t.tonebarlowmod = 0x02e8; + t.tonebarmidmod = 0x02e7; + t.tonefive = 0x01bd; + t.tonesix = 0x0185; + t.tonetwo = 0x01a8; + t.tonos = 0x0384; + t.tonsquare = 0x3327; + t.topatakthai = 0x0e0f; + t.tortoiseshellbracketleft = 0x3014; + t.tortoiseshellbracketleftsmall = 0xfe5d; + t.tortoiseshellbracketleftvertical = 0xfe39; + t.tortoiseshellbracketright = 0x3015; + t.tortoiseshellbracketrightsmall = 0xfe5e; + t.tortoiseshellbracketrightvertical = 0xfe3a; + t.totaothai = 0x0e15; + t.tpalatalhook = 0x01ab; + t.tparen = 0x24af; + t.trademark = 0x2122; + t.trademarksans = 0xf8ea; + t.trademarkserif = 0xf6db; + t.tretroflexhook = 0x0288; + t.triagdn = 0x25bc; + t.triaglf = 0x25c4; + t.triagrt = 0x25ba; + t.triagup = 0x25b2; + t.ts = 0x02a6; + t.tsadi = 0x05e6; + t.tsadidagesh = 0xfb46; + t.tsadidageshhebrew = 0xfb46; + t.tsadihebrew = 0x05e6; + t.tsecyrillic = 0x0446; + t.tsere = 0x05b5; + t.tsere12 = 0x05b5; + t.tsere1e = 0x05b5; + t.tsere2b = 0x05b5; + t.tserehebrew = 0x05b5; + t.tserenarrowhebrew = 0x05b5; + t.tserequarterhebrew = 0x05b5; + t.tserewidehebrew = 0x05b5; + t.tshecyrillic = 0x045b; + t.tsuperior = 0xf6f3; + t.ttabengali = 0x099f; + t.ttadeva = 0x091f; + t.ttagujarati = 0x0a9f; + t.ttagurmukhi = 0x0a1f; + t.tteharabic = 0x0679; + t.ttehfinalarabic = 0xfb67; + t.ttehinitialarabic = 0xfb68; + t.ttehmedialarabic = 0xfb69; + t.tthabengali = 0x09a0; + t.tthadeva = 0x0920; + t.tthagujarati = 0x0aa0; + t.tthagurmukhi = 0x0a20; + t.tturned = 0x0287; + t.tuhiragana = 0x3064; + t.tukatakana = 0x30c4; + t.tukatakanahalfwidth = 0xff82; + t.tusmallhiragana = 0x3063; + t.tusmallkatakana = 0x30c3; + t.tusmallkatakanahalfwidth = 0xff6f; + t.twelvecircle = 0x246b; + t.twelveparen = 0x247f; + t.twelveperiod = 0x2493; + t.twelveroman = 0x217b; + t.twentycircle = 0x2473; + t.twentyhangzhou = 0x5344; + t.twentyparen = 0x2487; + t.twentyperiod = 0x249b; + t.two = 0x0032; + t.twoarabic = 0x0662; + t.twobengali = 0x09e8; + t.twocircle = 0x2461; + t.twocircleinversesansserif = 0x278b; + t.twodeva = 0x0968; + t.twodotenleader = 0x2025; + t.twodotleader = 0x2025; + t.twodotleadervertical = 0xfe30; + t.twogujarati = 0x0ae8; + t.twogurmukhi = 0x0a68; + t.twohackarabic = 0x0662; + t.twohangzhou = 0x3022; + t.twoideographicparen = 0x3221; + t.twoinferior = 0x2082; + t.twomonospace = 0xff12; + t.twonumeratorbengali = 0x09f5; + t.twooldstyle = 0xf732; + t.twoparen = 0x2475; + t.twoperiod = 0x2489; + t.twopersian = 0x06f2; + t.tworoman = 0x2171; + t.twostroke = 0x01bb; + t.twosuperior = 0x00b2; + t.twothai = 0x0e52; + t.twothirds = 0x2154; + t.u = 0x0075; + t.uacute = 0x00fa; + t.ubar = 0x0289; + t.ubengali = 0x0989; + t.ubopomofo = 0x3128; + t.ubreve = 0x016d; + t.ucaron = 0x01d4; + t.ucircle = 0x24e4; + t.ucircumflex = 0x00fb; + t.ucircumflexbelow = 0x1e77; + t.ucyrillic = 0x0443; + t.udattadeva = 0x0951; + t.udblacute = 0x0171; + t.udblgrave = 0x0215; + t.udeva = 0x0909; + t.udieresis = 0x00fc; + t.udieresisacute = 0x01d8; + t.udieresisbelow = 0x1e73; + t.udieresiscaron = 0x01da; + t.udieresiscyrillic = 0x04f1; + t.udieresisgrave = 0x01dc; + t.udieresismacron = 0x01d6; + t.udotbelow = 0x1ee5; + t.ugrave = 0x00f9; + t.ugujarati = 0x0a89; + t.ugurmukhi = 0x0a09; + t.uhiragana = 0x3046; + t.uhookabove = 0x1ee7; + t.uhorn = 0x01b0; + t.uhornacute = 0x1ee9; + t.uhorndotbelow = 0x1ef1; + t.uhorngrave = 0x1eeb; + t.uhornhookabove = 0x1eed; + t.uhorntilde = 0x1eef; + t.uhungarumlaut = 0x0171; + t.uhungarumlautcyrillic = 0x04f3; + t.uinvertedbreve = 0x0217; + t.ukatakana = 0x30a6; + t.ukatakanahalfwidth = 0xff73; + t.ukcyrillic = 0x0479; + t.ukorean = 0x315c; + t.umacron = 0x016b; + t.umacroncyrillic = 0x04ef; + t.umacrondieresis = 0x1e7b; + t.umatragurmukhi = 0x0a41; + t.umonospace = 0xff55; + t.underscore = 0x005f; + t.underscoredbl = 0x2017; + t.underscoremonospace = 0xff3f; + t.underscorevertical = 0xfe33; + t.underscorewavy = 0xfe4f; + t.union = 0x222a; + t.universal = 0x2200; + t.uogonek = 0x0173; + t.uparen = 0x24b0; + t.upblock = 0x2580; + t.upperdothebrew = 0x05c4; + t.upsilon = 0x03c5; + t.upsilondieresis = 0x03cb; + t.upsilondieresistonos = 0x03b0; + t.upsilonlatin = 0x028a; + t.upsilontonos = 0x03cd; + t.uptackbelowcmb = 0x031d; + t.uptackmod = 0x02d4; + t.uragurmukhi = 0x0a73; + t.uring = 0x016f; + t.ushortcyrillic = 0x045e; + t.usmallhiragana = 0x3045; + t.usmallkatakana = 0x30a5; + t.usmallkatakanahalfwidth = 0xff69; + t.ustraightcyrillic = 0x04af; + t.ustraightstrokecyrillic = 0x04b1; + t.utilde = 0x0169; + t.utildeacute = 0x1e79; + t.utildebelow = 0x1e75; + t.uubengali = 0x098a; + t.uudeva = 0x090a; + t.uugujarati = 0x0a8a; + t.uugurmukhi = 0x0a0a; + t.uumatragurmukhi = 0x0a42; + t.uuvowelsignbengali = 0x09c2; + t.uuvowelsigndeva = 0x0942; + t.uuvowelsigngujarati = 0x0ac2; + t.uvowelsignbengali = 0x09c1; + t.uvowelsigndeva = 0x0941; + t.uvowelsigngujarati = 0x0ac1; + t.v = 0x0076; + t.vadeva = 0x0935; + t.vagujarati = 0x0ab5; + t.vagurmukhi = 0x0a35; + t.vakatakana = 0x30f7; + t.vav = 0x05d5; + t.vavdagesh = 0xfb35; + t.vavdagesh65 = 0xfb35; + t.vavdageshhebrew = 0xfb35; + t.vavhebrew = 0x05d5; + t.vavholam = 0xfb4b; + t.vavholamhebrew = 0xfb4b; + t.vavvavhebrew = 0x05f0; + t.vavyodhebrew = 0x05f1; + t.vcircle = 0x24e5; + t.vdotbelow = 0x1e7f; + t.vecyrillic = 0x0432; + t.veharabic = 0x06a4; + t.vehfinalarabic = 0xfb6b; + t.vehinitialarabic = 0xfb6c; + t.vehmedialarabic = 0xfb6d; + t.vekatakana = 0x30f9; + t.venus = 0x2640; + t.verticalbar = 0x007c; + t.verticallineabovecmb = 0x030d; + t.verticallinebelowcmb = 0x0329; + t.verticallinelowmod = 0x02cc; + t.verticallinemod = 0x02c8; + t.vewarmenian = 0x057e; + t.vhook = 0x028b; + t.vikatakana = 0x30f8; + t.viramabengali = 0x09cd; + t.viramadeva = 0x094d; + t.viramagujarati = 0x0acd; + t.visargabengali = 0x0983; + t.visargadeva = 0x0903; + t.visargagujarati = 0x0a83; + t.vmonospace = 0xff56; + t.voarmenian = 0x0578; + t.voicediterationhiragana = 0x309e; + t.voicediterationkatakana = 0x30fe; + t.voicedmarkkana = 0x309b; + t.voicedmarkkanahalfwidth = 0xff9e; + t.vokatakana = 0x30fa; + t.vparen = 0x24b1; + t.vtilde = 0x1e7d; + t.vturned = 0x028c; + t.vuhiragana = 0x3094; + t.vukatakana = 0x30f4; + t.w = 0x0077; + t.wacute = 0x1e83; + t.waekorean = 0x3159; + t.wahiragana = 0x308f; + t.wakatakana = 0x30ef; + t.wakatakanahalfwidth = 0xff9c; + t.wakorean = 0x3158; + t.wasmallhiragana = 0x308e; + t.wasmallkatakana = 0x30ee; + t.wattosquare = 0x3357; + t.wavedash = 0x301c; + t.wavyunderscorevertical = 0xfe34; + t.wawarabic = 0x0648; + t.wawfinalarabic = 0xfeee; + t.wawhamzaabovearabic = 0x0624; + t.wawhamzaabovefinalarabic = 0xfe86; + t.wbsquare = 0x33dd; + t.wcircle = 0x24e6; + t.wcircumflex = 0x0175; + t.wdieresis = 0x1e85; + t.wdotaccent = 0x1e87; + t.wdotbelow = 0x1e89; + t.wehiragana = 0x3091; + t.weierstrass = 0x2118; + t.wekatakana = 0x30f1; + t.wekorean = 0x315e; + t.weokorean = 0x315d; + t.wgrave = 0x1e81; + t.whitebullet = 0x25e6; + t.whitecircle = 0x25cb; + t.whitecircleinverse = 0x25d9; + t.whitecornerbracketleft = 0x300e; + t.whitecornerbracketleftvertical = 0xfe43; + t.whitecornerbracketright = 0x300f; + t.whitecornerbracketrightvertical = 0xfe44; + t.whitediamond = 0x25c7; + t.whitediamondcontainingblacksmalldiamond = 0x25c8; + t.whitedownpointingsmalltriangle = 0x25bf; + t.whitedownpointingtriangle = 0x25bd; + t.whiteleftpointingsmalltriangle = 0x25c3; + t.whiteleftpointingtriangle = 0x25c1; + t.whitelenticularbracketleft = 0x3016; + t.whitelenticularbracketright = 0x3017; + t.whiterightpointingsmalltriangle = 0x25b9; + t.whiterightpointingtriangle = 0x25b7; + t.whitesmallsquare = 0x25ab; + t.whitesmilingface = 0x263a; + t.whitesquare = 0x25a1; + t.whitestar = 0x2606; + t.whitetelephone = 0x260f; + t.whitetortoiseshellbracketleft = 0x3018; + t.whitetortoiseshellbracketright = 0x3019; + t.whiteuppointingsmalltriangle = 0x25b5; + t.whiteuppointingtriangle = 0x25b3; + t.wihiragana = 0x3090; + t.wikatakana = 0x30f0; + t.wikorean = 0x315f; + t.wmonospace = 0xff57; + t.wohiragana = 0x3092; + t.wokatakana = 0x30f2; + t.wokatakanahalfwidth = 0xff66; + t.won = 0x20a9; + t.wonmonospace = 0xffe6; + t.wowaenthai = 0x0e27; + t.wparen = 0x24b2; + t.wring = 0x1e98; + t.wsuperior = 0x02b7; + t.wturned = 0x028d; + t.wynn = 0x01bf; + t.x = 0x0078; + t.xabovecmb = 0x033d; + t.xbopomofo = 0x3112; + t.xcircle = 0x24e7; + t.xdieresis = 0x1e8d; + t.xdotaccent = 0x1e8b; + t.xeharmenian = 0x056d; + t.xi = 0x03be; + t.xmonospace = 0xff58; + t.xparen = 0x24b3; + t.xsuperior = 0x02e3; + t.y = 0x0079; + t.yaadosquare = 0x334e; + t.yabengali = 0x09af; + t.yacute = 0x00fd; + t.yadeva = 0x092f; + t.yaekorean = 0x3152; + t.yagujarati = 0x0aaf; + t.yagurmukhi = 0x0a2f; + t.yahiragana = 0x3084; + t.yakatakana = 0x30e4; + t.yakatakanahalfwidth = 0xff94; + t.yakorean = 0x3151; + t.yamakkanthai = 0x0e4e; + t.yasmallhiragana = 0x3083; + t.yasmallkatakana = 0x30e3; + t.yasmallkatakanahalfwidth = 0xff6c; + t.yatcyrillic = 0x0463; + t.ycircle = 0x24e8; + t.ycircumflex = 0x0177; + t.ydieresis = 0x00ff; + t.ydotaccent = 0x1e8f; + t.ydotbelow = 0x1ef5; + t.yeharabic = 0x064a; + t.yehbarreearabic = 0x06d2; + t.yehbarreefinalarabic = 0xfbaf; + t.yehfinalarabic = 0xfef2; + t.yehhamzaabovearabic = 0x0626; + t.yehhamzaabovefinalarabic = 0xfe8a; + t.yehhamzaaboveinitialarabic = 0xfe8b; + t.yehhamzaabovemedialarabic = 0xfe8c; + t.yehinitialarabic = 0xfef3; + t.yehmedialarabic = 0xfef4; + t.yehmeeminitialarabic = 0xfcdd; + t.yehmeemisolatedarabic = 0xfc58; + t.yehnoonfinalarabic = 0xfc94; + t.yehthreedotsbelowarabic = 0x06d1; + t.yekorean = 0x3156; + t.yen = 0x00a5; + t.yenmonospace = 0xffe5; + t.yeokorean = 0x3155; + t.yeorinhieuhkorean = 0x3186; + t.yerahbenyomohebrew = 0x05aa; + t.yerahbenyomolefthebrew = 0x05aa; + t.yericyrillic = 0x044b; + t.yerudieresiscyrillic = 0x04f9; + t.yesieungkorean = 0x3181; + t.yesieungpansioskorean = 0x3183; + t.yesieungsioskorean = 0x3182; + t.yetivhebrew = 0x059a; + t.ygrave = 0x1ef3; + t.yhook = 0x01b4; + t.yhookabove = 0x1ef7; + t.yiarmenian = 0x0575; + t.yicyrillic = 0x0457; + t.yikorean = 0x3162; + t.yinyang = 0x262f; + t.yiwnarmenian = 0x0582; + t.ymonospace = 0xff59; + t.yod = 0x05d9; + t.yoddagesh = 0xfb39; + t.yoddageshhebrew = 0xfb39; + t.yodhebrew = 0x05d9; + t.yodyodhebrew = 0x05f2; + t.yodyodpatahhebrew = 0xfb1f; + t.yohiragana = 0x3088; + t.yoikorean = 0x3189; + t.yokatakana = 0x30e8; + t.yokatakanahalfwidth = 0xff96; + t.yokorean = 0x315b; + t.yosmallhiragana = 0x3087; + t.yosmallkatakana = 0x30e7; + t.yosmallkatakanahalfwidth = 0xff6e; + t.yotgreek = 0x03f3; + t.yoyaekorean = 0x3188; + t.yoyakorean = 0x3187; + t.yoyakthai = 0x0e22; + t.yoyingthai = 0x0e0d; + t.yparen = 0x24b4; + t.ypogegrammeni = 0x037a; + t.ypogegrammenigreekcmb = 0x0345; + t.yr = 0x01a6; + t.yring = 0x1e99; + t.ysuperior = 0x02b8; + t.ytilde = 0x1ef9; + t.yturned = 0x028e; + t.yuhiragana = 0x3086; + t.yuikorean = 0x318c; + t.yukatakana = 0x30e6; + t.yukatakanahalfwidth = 0xff95; + t.yukorean = 0x3160; + t.yusbigcyrillic = 0x046b; + t.yusbigiotifiedcyrillic = 0x046d; + t.yuslittlecyrillic = 0x0467; + t.yuslittleiotifiedcyrillic = 0x0469; + t.yusmallhiragana = 0x3085; + t.yusmallkatakana = 0x30e5; + t.yusmallkatakanahalfwidth = 0xff6d; + t.yuyekorean = 0x318b; + t.yuyeokorean = 0x318a; + t.yyabengali = 0x09df; + t.yyadeva = 0x095f; + t.z = 0x007a; + t.zaarmenian = 0x0566; + t.zacute = 0x017a; + t.zadeva = 0x095b; + t.zagurmukhi = 0x0a5b; + t.zaharabic = 0x0638; + t.zahfinalarabic = 0xfec6; + t.zahinitialarabic = 0xfec7; + t.zahiragana = 0x3056; + t.zahmedialarabic = 0xfec8; + t.zainarabic = 0x0632; + t.zainfinalarabic = 0xfeb0; + t.zakatakana = 0x30b6; + t.zaqefgadolhebrew = 0x0595; + t.zaqefqatanhebrew = 0x0594; + t.zarqahebrew = 0x0598; + t.zayin = 0x05d6; + t.zayindagesh = 0xfb36; + t.zayindageshhebrew = 0xfb36; + t.zayinhebrew = 0x05d6; + t.zbopomofo = 0x3117; + t.zcaron = 0x017e; + t.zcircle = 0x24e9; + t.zcircumflex = 0x1e91; + t.zcurl = 0x0291; + t.zdot = 0x017c; + t.zdotaccent = 0x017c; + t.zdotbelow = 0x1e93; + t.zecyrillic = 0x0437; + t.zedescendercyrillic = 0x0499; + t.zedieresiscyrillic = 0x04df; + t.zehiragana = 0x305c; + t.zekatakana = 0x30bc; + t.zero = 0x0030; + t.zeroarabic = 0x0660; + t.zerobengali = 0x09e6; + t.zerodeva = 0x0966; + t.zerogujarati = 0x0ae6; + t.zerogurmukhi = 0x0a66; + t.zerohackarabic = 0x0660; + t.zeroinferior = 0x2080; + t.zeromonospace = 0xff10; + t.zerooldstyle = 0xf730; + t.zeropersian = 0x06f0; + t.zerosuperior = 0x2070; + t.zerothai = 0x0e50; + t.zerowidthjoiner = 0xfeff; + t.zerowidthnonjoiner = 0x200c; + t.zerowidthspace = 0x200b; + t.zeta = 0x03b6; + t.zhbopomofo = 0x3113; + t.zhearmenian = 0x056a; + t.zhebrevecyrillic = 0x04c2; + t.zhecyrillic = 0x0436; + t.zhedescendercyrillic = 0x0497; + t.zhedieresiscyrillic = 0x04dd; + t.zihiragana = 0x3058; + t.zikatakana = 0x30b8; + t.zinorhebrew = 0x05ae; + t.zlinebelow = 0x1e95; + t.zmonospace = 0xff5a; + t.zohiragana = 0x305e; + t.zokatakana = 0x30be; + t.zparen = 0x24b5; + t.zretroflexhook = 0x0290; + t.zstroke = 0x01b6; + t.zuhiragana = 0x305a; + t.zukatakana = 0x30ba; + t[".notdef"] = 0x0000; + t.angbracketleftbig = 0x2329; + t.angbracketleftBig = 0x2329; + t.angbracketleftbigg = 0x2329; + t.angbracketleftBigg = 0x2329; + t.angbracketrightBig = 0x232a; + t.angbracketrightbig = 0x232a; + t.angbracketrightBigg = 0x232a; + t.angbracketrightbigg = 0x232a; + t.arrowhookleft = 0x21aa; + t.arrowhookright = 0x21a9; + t.arrowlefttophalf = 0x21bc; + t.arrowleftbothalf = 0x21bd; + t.arrownortheast = 0x2197; + t.arrownorthwest = 0x2196; + t.arrowrighttophalf = 0x21c0; + t.arrowrightbothalf = 0x21c1; + t.arrowsoutheast = 0x2198; + t.arrowsouthwest = 0x2199; + t.backslashbig = 0x2216; + t.backslashBig = 0x2216; + t.backslashBigg = 0x2216; + t.backslashbigg = 0x2216; + t.bardbl = 0x2016; + t.bracehtipdownleft = 0xfe37; + t.bracehtipdownright = 0xfe37; + t.bracehtipupleft = 0xfe38; + t.bracehtipupright = 0xfe38; + t.braceleftBig = 0x007b; + t.braceleftbig = 0x007b; + t.braceleftbigg = 0x007b; + t.braceleftBigg = 0x007b; + t.bracerightBig = 0x007d; + t.bracerightbig = 0x007d; + t.bracerightbigg = 0x007d; + t.bracerightBigg = 0x007d; + t.bracketleftbig = 0x005b; + t.bracketleftBig = 0x005b; + t.bracketleftbigg = 0x005b; + t.bracketleftBigg = 0x005b; + t.bracketrightBig = 0x005d; + t.bracketrightbig = 0x005d; + t.bracketrightbigg = 0x005d; + t.bracketrightBigg = 0x005d; + t.ceilingleftbig = 0x2308; + t.ceilingleftBig = 0x2308; + t.ceilingleftBigg = 0x2308; + t.ceilingleftbigg = 0x2308; + t.ceilingrightbig = 0x2309; + t.ceilingrightBig = 0x2309; + t.ceilingrightbigg = 0x2309; + t.ceilingrightBigg = 0x2309; + t.circledotdisplay = 0x2299; + t.circledottext = 0x2299; + t.circlemultiplydisplay = 0x2297; + t.circlemultiplytext = 0x2297; + t.circleplusdisplay = 0x2295; + t.circleplustext = 0x2295; + t.contintegraldisplay = 0x222e; + t.contintegraltext = 0x222e; + t.coproductdisplay = 0x2210; + t.coproducttext = 0x2210; + t.floorleftBig = 0x230a; + t.floorleftbig = 0x230a; + t.floorleftbigg = 0x230a; + t.floorleftBigg = 0x230a; + t.floorrightbig = 0x230b; + t.floorrightBig = 0x230b; + t.floorrightBigg = 0x230b; + t.floorrightbigg = 0x230b; + t.hatwide = 0x0302; + t.hatwider = 0x0302; + t.hatwidest = 0x0302; + t.intercal = 0x1d40; + t.integraldisplay = 0x222b; + t.integraltext = 0x222b; + t.intersectiondisplay = 0x22c2; + t.intersectiontext = 0x22c2; + t.logicalanddisplay = 0x2227; + t.logicalandtext = 0x2227; + t.logicalordisplay = 0x2228; + t.logicalortext = 0x2228; + t.parenleftBig = 0x0028; + t.parenleftbig = 0x0028; + t.parenleftBigg = 0x0028; + t.parenleftbigg = 0x0028; + t.parenrightBig = 0x0029; + t.parenrightbig = 0x0029; + t.parenrightBigg = 0x0029; + t.parenrightbigg = 0x0029; + t.prime = 0x2032; + t.productdisplay = 0x220f; + t.producttext = 0x220f; + t.radicalbig = 0x221a; + t.radicalBig = 0x221a; + t.radicalBigg = 0x221a; + t.radicalbigg = 0x221a; + t.radicalbt = 0x221a; + t.radicaltp = 0x221a; + t.radicalvertex = 0x221a; + t.slashbig = 0x002f; + t.slashBig = 0x002f; + t.slashBigg = 0x002f; + t.slashbigg = 0x002f; + t.summationdisplay = 0x2211; + t.summationtext = 0x2211; + t.tildewide = 0x02dc; + t.tildewider = 0x02dc; + t.tildewidest = 0x02dc; + t.uniondisplay = 0x22c3; + t.unionmultidisplay = 0x228e; + t.unionmultitext = 0x228e; + t.unionsqdisplay = 0x2294; + t.unionsqtext = 0x2294; + t.uniontext = 0x22c3; + t.vextenddouble = 0x2225; + t.vextendsingle = 0x2223; +}); +const getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) { + t.space = 0x0020; + t.a1 = 0x2701; + t.a2 = 0x2702; + t.a202 = 0x2703; + t.a3 = 0x2704; + t.a4 = 0x260e; + t.a5 = 0x2706; + t.a119 = 0x2707; + t.a118 = 0x2708; + t.a117 = 0x2709; + t.a11 = 0x261b; + t.a12 = 0x261e; + t.a13 = 0x270c; + t.a14 = 0x270d; + t.a15 = 0x270e; + t.a16 = 0x270f; + t.a105 = 0x2710; + t.a17 = 0x2711; + t.a18 = 0x2712; + t.a19 = 0x2713; + t.a20 = 0x2714; + t.a21 = 0x2715; + t.a22 = 0x2716; + t.a23 = 0x2717; + t.a24 = 0x2718; + t.a25 = 0x2719; + t.a26 = 0x271a; + t.a27 = 0x271b; + t.a28 = 0x271c; + t.a6 = 0x271d; + t.a7 = 0x271e; + t.a8 = 0x271f; + t.a9 = 0x2720; + t.a10 = 0x2721; + t.a29 = 0x2722; + t.a30 = 0x2723; + t.a31 = 0x2724; + t.a32 = 0x2725; + t.a33 = 0x2726; + t.a34 = 0x2727; + t.a35 = 0x2605; + t.a36 = 0x2729; + t.a37 = 0x272a; + t.a38 = 0x272b; + t.a39 = 0x272c; + t.a40 = 0x272d; + t.a41 = 0x272e; + t.a42 = 0x272f; + t.a43 = 0x2730; + t.a44 = 0x2731; + t.a45 = 0x2732; + t.a46 = 0x2733; + t.a47 = 0x2734; + t.a48 = 0x2735; + t.a49 = 0x2736; + t.a50 = 0x2737; + t.a51 = 0x2738; + t.a52 = 0x2739; + t.a53 = 0x273a; + t.a54 = 0x273b; + t.a55 = 0x273c; + t.a56 = 0x273d; + t.a57 = 0x273e; + t.a58 = 0x273f; + t.a59 = 0x2740; + t.a60 = 0x2741; + t.a61 = 0x2742; + t.a62 = 0x2743; + t.a63 = 0x2744; + t.a64 = 0x2745; + t.a65 = 0x2746; + t.a66 = 0x2747; + t.a67 = 0x2748; + t.a68 = 0x2749; + t.a69 = 0x274a; + t.a70 = 0x274b; + t.a71 = 0x25cf; + t.a72 = 0x274d; + t.a73 = 0x25a0; + t.a74 = 0x274f; + t.a203 = 0x2750; + t.a75 = 0x2751; + t.a204 = 0x2752; + t.a76 = 0x25b2; + t.a77 = 0x25bc; + t.a78 = 0x25c6; + t.a79 = 0x2756; + t.a81 = 0x25d7; + t.a82 = 0x2758; + t.a83 = 0x2759; + t.a84 = 0x275a; + t.a97 = 0x275b; + t.a98 = 0x275c; + t.a99 = 0x275d; + t.a100 = 0x275e; + t.a101 = 0x2761; + t.a102 = 0x2762; + t.a103 = 0x2763; + t.a104 = 0x2764; + t.a106 = 0x2765; + t.a107 = 0x2766; + t.a108 = 0x2767; + t.a112 = 0x2663; + t.a111 = 0x2666; + t.a110 = 0x2665; + t.a109 = 0x2660; + t.a120 = 0x2460; + t.a121 = 0x2461; + t.a122 = 0x2462; + t.a123 = 0x2463; + t.a124 = 0x2464; + t.a125 = 0x2465; + t.a126 = 0x2466; + t.a127 = 0x2467; + t.a128 = 0x2468; + t.a129 = 0x2469; + t.a130 = 0x2776; + t.a131 = 0x2777; + t.a132 = 0x2778; + t.a133 = 0x2779; + t.a134 = 0x277a; + t.a135 = 0x277b; + t.a136 = 0x277c; + t.a137 = 0x277d; + t.a138 = 0x277e; + t.a139 = 0x277f; + t.a140 = 0x2780; + t.a141 = 0x2781; + t.a142 = 0x2782; + t.a143 = 0x2783; + t.a144 = 0x2784; + t.a145 = 0x2785; + t.a146 = 0x2786; + t.a147 = 0x2787; + t.a148 = 0x2788; + t.a149 = 0x2789; + t.a150 = 0x278a; + t.a151 = 0x278b; + t.a152 = 0x278c; + t.a153 = 0x278d; + t.a154 = 0x278e; + t.a155 = 0x278f; + t.a156 = 0x2790; + t.a157 = 0x2791; + t.a158 = 0x2792; + t.a159 = 0x2793; + t.a160 = 0x2794; + t.a161 = 0x2192; + t.a163 = 0x2194; + t.a164 = 0x2195; + t.a196 = 0x2798; + t.a165 = 0x2799; + t.a192 = 0x279a; + t.a166 = 0x279b; + t.a167 = 0x279c; + t.a168 = 0x279d; + t.a169 = 0x279e; + t.a170 = 0x279f; + t.a171 = 0x27a0; + t.a172 = 0x27a1; + t.a173 = 0x27a2; + t.a162 = 0x27a3; + t.a174 = 0x27a4; + t.a175 = 0x27a5; + t.a176 = 0x27a6; + t.a177 = 0x27a7; + t.a178 = 0x27a8; + t.a179 = 0x27a9; + t.a193 = 0x27aa; + t.a180 = 0x27ab; + t.a199 = 0x27ac; + t.a181 = 0x27ad; + t.a200 = 0x27ae; + t.a182 = 0x27af; + t.a201 = 0x27b1; + t.a183 = 0x27b2; + t.a184 = 0x27b3; + t.a197 = 0x27b4; + t.a185 = 0x27b5; + t.a194 = 0x27b6; + t.a198 = 0x27b7; + t.a186 = 0x27b8; + t.a195 = 0x27b9; + t.a187 = 0x27ba; + t.a188 = 0x27bb; + t.a189 = 0x27bc; + t.a190 = 0x27bd; + t.a191 = 0x27be; + t.a89 = 0x2768; + t.a90 = 0x2769; + t.a93 = 0x276a; + t.a94 = 0x276b; + t.a91 = 0x276c; + t.a92 = 0x276d; + t.a205 = 0x276e; + t.a85 = 0x276f; + t.a206 = 0x2770; + t.a86 = 0x2771; + t.a87 = 0x2772; + t.a88 = 0x2773; + t.a95 = 0x2774; + t.a96 = 0x2775; + t[".notdef"] = 0x0000; +}); + +;// ./src/core/unicode.js + +const getSpecialPUASymbols = getLookupTableFactory(function (t) { + t[63721] = 0x00a9; + t[63193] = 0x00a9; + t[63720] = 0x00ae; + t[63194] = 0x00ae; + t[63722] = 0x2122; + t[63195] = 0x2122; + t[63729] = 0x23a7; + t[63730] = 0x23a8; + t[63731] = 0x23a9; + t[63740] = 0x23ab; + t[63741] = 0x23ac; + t[63742] = 0x23ad; + t[63726] = 0x23a1; + t[63727] = 0x23a2; + t[63728] = 0x23a3; + t[63737] = 0x23a4; + t[63738] = 0x23a5; + t[63739] = 0x23a6; + t[63723] = 0x239b; + t[63724] = 0x239c; + t[63725] = 0x239d; + t[63734] = 0x239e; + t[63735] = 0x239f; + t[63736] = 0x23a0; +}); +function mapSpecialUnicodeValues(code) { + if (code >= 0xfff0 && code <= 0xffff) { + return 0; + } else if (code >= 0xf600 && code <= 0xf8ff) { + return getSpecialPUASymbols()[code] || code; + } else if (code === 0x00ad) { + return 0x002d; + } + return code; +} +function getUnicodeForGlyph(name, glyphsUnicodeMap) { + let unicode = glyphsUnicodeMap[name]; + if (unicode !== undefined) { + return unicode; + } + if (!name) { + return -1; + } + if (name[0] === "u") { + const nameLen = name.length; + let hexStr; + if (nameLen === 7 && name[1] === "n" && name[2] === "i") { + hexStr = name.substring(3); + } else if (nameLen >= 5 && nameLen <= 7) { + hexStr = name.substring(1); + } else { + return -1; + } + if (hexStr === hexStr.toUpperCase()) { + unicode = parseInt(hexStr, 16); + if (unicode >= 0) { + return unicode; + } + } + } + return -1; +} +const UnicodeRanges = [[0x0000, 0x007f], [0x0080, 0x00ff], [0x0100, 0x017f], [0x0180, 0x024f], [0x0250, 0x02af, 0x1d00, 0x1d7f, 0x1d80, 0x1dbf], [0x02b0, 0x02ff, 0xa700, 0xa71f], [0x0300, 0x036f, 0x1dc0, 0x1dff], [0x0370, 0x03ff], [0x2c80, 0x2cff], [0x0400, 0x04ff, 0x0500, 0x052f, 0x2de0, 0x2dff, 0xa640, 0xa69f], [0x0530, 0x058f], [0x0590, 0x05ff], [0xa500, 0xa63f], [0x0600, 0x06ff, 0x0750, 0x077f], [0x07c0, 0x07ff], [0x0900, 0x097f], [0x0980, 0x09ff], [0x0a00, 0x0a7f], [0x0a80, 0x0aff], [0x0b00, 0x0b7f], [0x0b80, 0x0bff], [0x0c00, 0x0c7f], [0x0c80, 0x0cff], [0x0d00, 0x0d7f], [0x0e00, 0x0e7f], [0x0e80, 0x0eff], [0x10a0, 0x10ff, 0x2d00, 0x2d2f], [0x1b00, 0x1b7f], [0x1100, 0x11ff], [0x1e00, 0x1eff, 0x2c60, 0x2c7f, 0xa720, 0xa7ff], [0x1f00, 0x1fff], [0x2000, 0x206f, 0x2e00, 0x2e7f], [0x2070, 0x209f], [0x20a0, 0x20cf], [0x20d0, 0x20ff], [0x2100, 0x214f], [0x2150, 0x218f], [0x2190, 0x21ff, 0x27f0, 0x27ff, 0x2900, 0x297f, 0x2b00, 0x2bff], [0x2200, 0x22ff, 0x2a00, 0x2aff, 0x27c0, 0x27ef, 0x2980, 0x29ff], [0x2300, 0x23ff], [0x2400, 0x243f], [0x2440, 0x245f], [0x2460, 0x24ff], [0x2500, 0x257f], [0x2580, 0x259f], [0x25a0, 0x25ff], [0x2600, 0x26ff], [0x2700, 0x27bf], [0x3000, 0x303f], [0x3040, 0x309f], [0x30a0, 0x30ff, 0x31f0, 0x31ff], [0x3100, 0x312f, 0x31a0, 0x31bf], [0x3130, 0x318f], [0xa840, 0xa87f], [0x3200, 0x32ff], [0x3300, 0x33ff], [0xac00, 0xd7af], [0xd800, 0xdfff], [0x10900, 0x1091f], [0x4e00, 0x9fff, 0x2e80, 0x2eff, 0x2f00, 0x2fdf, 0x2ff0, 0x2fff, 0x3400, 0x4dbf, 0x20000, 0x2a6df, 0x3190, 0x319f], [0xe000, 0xf8ff], [0x31c0, 0x31ef, 0xf900, 0xfaff, 0x2f800, 0x2fa1f], [0xfb00, 0xfb4f], [0xfb50, 0xfdff], [0xfe20, 0xfe2f], [0xfe10, 0xfe1f], [0xfe50, 0xfe6f], [0xfe70, 0xfeff], [0xff00, 0xffef], [0xfff0, 0xffff], [0x0f00, 0x0fff], [0x0700, 0x074f], [0x0780, 0x07bf], [0x0d80, 0x0dff], [0x1000, 0x109f], [0x1200, 0x137f, 0x1380, 0x139f, 0x2d80, 0x2ddf], [0x13a0, 0x13ff], [0x1400, 0x167f], [0x1680, 0x169f], [0x16a0, 0x16ff], [0x1780, 0x17ff], [0x1800, 0x18af], [0x2800, 0x28ff], [0xa000, 0xa48f], [0x1700, 0x171f, 0x1720, 0x173f, 0x1740, 0x175f, 0x1760, 0x177f], [0x10300, 0x1032f], [0x10330, 0x1034f], [0x10400, 0x1044f], [0x1d000, 0x1d0ff, 0x1d100, 0x1d1ff, 0x1d200, 0x1d24f], [0x1d400, 0x1d7ff], [0xff000, 0xffffd], [0xfe00, 0xfe0f, 0xe0100, 0xe01ef], [0xe0000, 0xe007f], [0x1900, 0x194f], [0x1950, 0x197f], [0x1980, 0x19df], [0x1a00, 0x1a1f], [0x2c00, 0x2c5f], [0x2d30, 0x2d7f], [0x4dc0, 0x4dff], [0xa800, 0xa82f], [0x10000, 0x1007f, 0x10080, 0x100ff, 0x10100, 0x1013f], [0x10140, 0x1018f], [0x10380, 0x1039f], [0x103a0, 0x103df], [0x10450, 0x1047f], [0x10480, 0x104af], [0x10800, 0x1083f], [0x10a00, 0x10a5f], [0x1d300, 0x1d35f], [0x12000, 0x123ff, 0x12400, 0x1247f], [0x1d360, 0x1d37f], [0x1b80, 0x1bbf], [0x1c00, 0x1c4f], [0x1c50, 0x1c7f], [0xa880, 0xa8df], [0xa900, 0xa92f], [0xa930, 0xa95f], [0xaa00, 0xaa5f], [0x10190, 0x101cf], [0x101d0, 0x101ff], [0x102a0, 0x102df, 0x10280, 0x1029f, 0x10920, 0x1093f], [0x1f030, 0x1f09f, 0x1f000, 0x1f02f]]; +function getUnicodeRangeFor(value, lastPosition = -1) { + if (lastPosition !== -1) { + const range = UnicodeRanges[lastPosition]; + for (let i = 0, ii = range.length; i < ii; i += 2) { + if (value >= range[i] && value <= range[i + 1]) { + return lastPosition; + } + } + } + for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) { + const range = UnicodeRanges[i]; + for (let j = 0, jj = range.length; j < jj; j += 2) { + if (value >= range[j] && value <= range[j + 1]) { + return i; + } + } + } + return -1; +} +const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"); +const CategoryCache = new Map(); +function getCharUnicodeCategory(char) { + const cachedCategory = CategoryCache.get(char); + if (cachedCategory) { + return cachedCategory; + } + const groups = char.match(SpecialCharRegExp); + const category = { + isWhitespace: !!groups?.[1], + isZeroWidthDiacritic: !!groups?.[2], + isInvisibleFormatMark: !!groups?.[3] + }; + CategoryCache.set(char, category); + return category; +} +function clearUnicodeCaches() { + CategoryCache.clear(); +} + +;// ./src/core/fonts_utils.js + + + + + +const SEAC_ANALYSIS_ENABLED = true; +const FontFlags = { + FixedPitch: 1, + Serif: 2, + Symbolic: 4, + Script: 8, + Nonsymbolic: 32, + Italic: 64, + AllCap: 65536, + SmallCap: 131072, + ForceBold: 262144 +}; +const MacStandardGlyphOrdering = [".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "Lslash", "lslash", "Scaron", "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", "Thorn", "thorn", "minus", "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", "onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", "Ccaron", "ccaron", "dcroat"]; +function recoverGlyphName(name, glyphsUnicodeMap) { + if (glyphsUnicodeMap[name] !== undefined) { + return name; + } + const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); + if (unicode !== -1) { + for (const key in glyphsUnicodeMap) { + if (glyphsUnicodeMap[key] === unicode) { + return key; + } + } + } + info("Unable to recover a standard glyph name for: " + name); + return name; +} +function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { + const charCodeToGlyphId = Object.create(null); + let glyphId, charCode, baseEncoding; + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + if (properties.isInternalFont) { + baseEncoding = builtInEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } else if (properties.baseEncodingName) { + baseEncoding = getEncoding(properties.baseEncodingName); + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } else if (isSymbolicFont) { + for (charCode in builtInEncoding) { + charCodeToGlyphId[charCode] = builtInEncoding[charCode]; + } + } else { + baseEncoding = StandardEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } + const differences = properties.differences; + let glyphsUnicodeMap; + if (differences) { + for (charCode in differences) { + const glyphName = differences[charCode]; + glyphId = glyphNames.indexOf(glyphName); + if (glyphId === -1) { + if (!glyphsUnicodeMap) { + glyphsUnicodeMap = getGlyphsUnicode(); + } + const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + if (standardGlyphName !== glyphName) { + glyphId = glyphNames.indexOf(standardGlyphName); + } + } + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } + return charCodeToGlyphId; +} +function normalizeFontName(name) { + return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); +} +const getVerticalPresentationForm = getLookupTableFactory(t => { + t[0x2013] = 0xfe32; + t[0x2014] = 0xfe31; + t[0x2025] = 0xfe30; + t[0x2026] = 0xfe19; + t[0x3001] = 0xfe11; + t[0x3002] = 0xfe12; + t[0x3008] = 0xfe3f; + t[0x3009] = 0xfe40; + t[0x300a] = 0xfe3d; + t[0x300b] = 0xfe3e; + t[0x300c] = 0xfe41; + t[0x300d] = 0xfe42; + t[0x300e] = 0xfe43; + t[0x300f] = 0xfe44; + t[0x3010] = 0xfe3b; + t[0x3011] = 0xfe3c; + t[0x3014] = 0xfe39; + t[0x3015] = 0xfe3a; + t[0x3016] = 0xfe17; + t[0x3017] = 0xfe18; + t[0xfe4f] = 0xfe34; + t[0xff01] = 0xfe15; + t[0xff08] = 0xfe35; + t[0xff09] = 0xfe36; + t[0xff0c] = 0xfe10; + t[0xff1a] = 0xfe13; + t[0xff1b] = 0xfe14; + t[0xff1f] = 0xfe16; + t[0xff3b] = 0xfe47; + t[0xff3d] = 0xfe48; + t[0xff3f] = 0xfe33; + t[0xff5b] = 0xfe37; + t[0xff5d] = 0xfe38; +}); + +;// ./src/core/standard_fonts.js + + +const getStdFontMap = getLookupTableFactory(function (t) { + t["Times-Roman"] = "Times-Roman"; + t.Helvetica = "Helvetica"; + t.Courier = "Courier"; + t.Symbol = "Symbol"; + t["Times-Bold"] = "Times-Bold"; + t["Helvetica-Bold"] = "Helvetica-Bold"; + t["Courier-Bold"] = "Courier-Bold"; + t.ZapfDingbats = "ZapfDingbats"; + t["Times-Italic"] = "Times-Italic"; + t["Helvetica-Oblique"] = "Helvetica-Oblique"; + t["Courier-Oblique"] = "Courier-Oblique"; + t["Times-BoldItalic"] = "Times-BoldItalic"; + t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique"; + t["Courier-BoldOblique"] = "Courier-BoldOblique"; + t.ArialNarrow = "Helvetica"; + t["ArialNarrow-Bold"] = "Helvetica-Bold"; + t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialNarrow-Italic"] = "Helvetica-Oblique"; + t.ArialBlack = "Helvetica"; + t["ArialBlack-Bold"] = "Helvetica-Bold"; + t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialBlack-Italic"] = "Helvetica-Oblique"; + t["Arial-Black"] = "Helvetica"; + t["Arial-Black-Bold"] = "Helvetica-Bold"; + t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-Black-Italic"] = "Helvetica-Oblique"; + t.Arial = "Helvetica"; + t["Arial-Bold"] = "Helvetica-Bold"; + t["Arial-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-Italic"] = "Helvetica-Oblique"; + t.ArialMT = "Helvetica"; + t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT"] = "Helvetica-Bold"; + t["Arial-ItalicMT"] = "Helvetica-Oblique"; + t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT-Bold"] = "Helvetica-Bold"; + t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique"; + t.ArialUnicodeMS = "Helvetica"; + t["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; + t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique"; + t["Courier-BoldItalic"] = "Courier-BoldOblique"; + t["Courier-Italic"] = "Courier-Oblique"; + t.CourierNew = "Courier"; + t["CourierNew-Bold"] = "Courier-Bold"; + t["CourierNew-BoldItalic"] = "Courier-BoldOblique"; + t["CourierNew-Italic"] = "Courier-Oblique"; + t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique"; + t["CourierNewPS-BoldMT"] = "Courier-Bold"; + t["CourierNewPS-ItalicMT"] = "Courier-Oblique"; + t.CourierNewPSMT = "Courier"; + t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique"; + t["Helvetica-Italic"] = "Helvetica-Oblique"; + t["Symbol-Bold"] = "Symbol"; + t["Symbol-BoldItalic"] = "Symbol"; + t["Symbol-Italic"] = "Symbol"; + t.TimesNewRoman = "Times-Roman"; + t["TimesNewRoman-Bold"] = "Times-Bold"; + t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRoman-Italic"] = "Times-Italic"; + t.TimesNewRomanPS = "Times-Roman"; + t["TimesNewRomanPS-Bold"] = "Times-Bold"; + t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic"; + t["TimesNewRomanPS-BoldMT"] = "Times-Bold"; + t["TimesNewRomanPS-Italic"] = "Times-Italic"; + t["TimesNewRomanPS-ItalicMT"] = "Times-Italic"; + t.TimesNewRomanPSMT = "Times-Roman"; + t["TimesNewRomanPSMT-Bold"] = "Times-Bold"; + t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRomanPSMT-Italic"] = "Times-Italic"; +}); +const getFontNameToFileMap = getLookupTableFactory(function (t) { + t.Courier = "FoxitFixed.pfb"; + t["Courier-Bold"] = "FoxitFixedBold.pfb"; + t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb"; + t["Courier-Oblique"] = "FoxitFixedItalic.pfb"; + t.Helvetica = "LiberationSans-Regular.ttf"; + t["Helvetica-Bold"] = "LiberationSans-Bold.ttf"; + t["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf"; + t["Helvetica-Oblique"] = "LiberationSans-Italic.ttf"; + t["Times-Roman"] = "FoxitSerif.pfb"; + t["Times-Bold"] = "FoxitSerifBold.pfb"; + t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb"; + t["Times-Italic"] = "FoxitSerifItalic.pfb"; + t.Symbol = "FoxitSymbol.pfb"; + t.ZapfDingbats = "FoxitDingbats.pfb"; + t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf"; + t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf"; + t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf"; + t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf"; +}); +const getNonStdFontMap = getLookupTableFactory(function (t) { + t.Calibri = "Helvetica"; + t["Calibri-Bold"] = "Helvetica-Bold"; + t["Calibri-BoldItalic"] = "Helvetica-BoldOblique"; + t["Calibri-Italic"] = "Helvetica-Oblique"; + t.CenturyGothic = "Helvetica"; + t["CenturyGothic-Bold"] = "Helvetica-Bold"; + t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique"; + t["CenturyGothic-Italic"] = "Helvetica-Oblique"; + t.ComicSansMS = "Comic Sans MS"; + t["ComicSansMS-Bold"] = "Comic Sans MS-Bold"; + t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic"; + t["ComicSansMS-Italic"] = "Comic Sans MS-Italic"; + t.GillSansMT = "Helvetica"; + t["GillSansMT-Bold"] = "Helvetica-Bold"; + t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["GillSansMT-Italic"] = "Helvetica-Oblique"; + t.Impact = "Helvetica"; + t["ItcSymbol-Bold"] = "Helvetica-Bold"; + t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; + t["ItcSymbol-Book"] = "Helvetica"; + t["ItcSymbol-BookItalic"] = "Helvetica-Oblique"; + t["ItcSymbol-Medium"] = "Helvetica"; + t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique"; + t.LucidaConsole = "Courier"; + t["LucidaConsole-Bold"] = "Courier-Bold"; + t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique"; + t["LucidaConsole-Italic"] = "Courier-Oblique"; + t["LucidaSans-Demi"] = "Helvetica-Bold"; + t["MS-Gothic"] = "MS Gothic"; + t["MS-Gothic-Bold"] = "MS Gothic-Bold"; + t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic"; + t["MS-Gothic-Italic"] = "MS Gothic-Italic"; + t["MS-Mincho"] = "MS Mincho"; + t["MS-Mincho-Bold"] = "MS Mincho-Bold"; + t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic"; + t["MS-Mincho-Italic"] = "MS Mincho-Italic"; + t["MS-PGothic"] = "MS PGothic"; + t["MS-PGothic-Bold"] = "MS PGothic-Bold"; + t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic"; + t["MS-PGothic-Italic"] = "MS PGothic-Italic"; + t["MS-PMincho"] = "MS PMincho"; + t["MS-PMincho-Bold"] = "MS PMincho-Bold"; + t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic"; + t["MS-PMincho-Italic"] = "MS PMincho-Italic"; + t.NuptialScript = "Times-Italic"; + t.SegoeUISymbol = "Helvetica"; +}); +const getSerifFonts = getLookupTableFactory(function (t) { + t["Adobe Jenson"] = true; + t["Adobe Text"] = true; + t.Albertus = true; + t.Aldus = true; + t.Alexandria = true; + t.Algerian = true; + t["American Typewriter"] = true; + t.Antiqua = true; + t.Apex = true; + t.Arno = true; + t.Aster = true; + t.Aurora = true; + t.Baskerville = true; + t.Bell = true; + t.Bembo = true; + t["Bembo Schoolbook"] = true; + t.Benguiat = true; + t["Berkeley Old Style"] = true; + t["Bernhard Modern"] = true; + t["Berthold City"] = true; + t.Bodoni = true; + t["Bauer Bodoni"] = true; + t["Book Antiqua"] = true; + t.Bookman = true; + t["Bordeaux Roman"] = true; + t["Californian FB"] = true; + t.Calisto = true; + t.Calvert = true; + t.Capitals = true; + t.Cambria = true; + t.Cartier = true; + t.Caslon = true; + t.Catull = true; + t.Centaur = true; + t["Century Old Style"] = true; + t["Century Schoolbook"] = true; + t.Chaparral = true; + t["Charis SIL"] = true; + t.Cheltenham = true; + t["Cholla Slab"] = true; + t.Clarendon = true; + t.Clearface = true; + t.Cochin = true; + t.Colonna = true; + t["Computer Modern"] = true; + t["Concrete Roman"] = true; + t.Constantia = true; + t["Cooper Black"] = true; + t.Corona = true; + t.Ecotype = true; + t.Egyptienne = true; + t.Elephant = true; + t.Excelsior = true; + t.Fairfield = true; + t["FF Scala"] = true; + t.Folkard = true; + t.Footlight = true; + t.FreeSerif = true; + t["Friz Quadrata"] = true; + t.Garamond = true; + t.Gentium = true; + t.Georgia = true; + t.Gloucester = true; + t["Goudy Old Style"] = true; + t["Goudy Schoolbook"] = true; + t["Goudy Pro Font"] = true; + t.Granjon = true; + t["Guardian Egyptian"] = true; + t.Heather = true; + t.Hercules = true; + t["High Tower Text"] = true; + t.Hiroshige = true; + t["Hoefler Text"] = true; + t["Humana Serif"] = true; + t.Imprint = true; + t["Ionic No. 5"] = true; + t.Janson = true; + t.Joanna = true; + t.Korinna = true; + t.Lexicon = true; + t.LiberationSerif = true; + t["Liberation Serif"] = true; + t["Linux Libertine"] = true; + t.Literaturnaya = true; + t.Lucida = true; + t["Lucida Bright"] = true; + t.Melior = true; + t.Memphis = true; + t.Miller = true; + t.Minion = true; + t.Modern = true; + t["Mona Lisa"] = true; + t["Mrs Eaves"] = true; + t["MS Serif"] = true; + t["Museo Slab"] = true; + t["New York"] = true; + t["Nimbus Roman"] = true; + t["NPS Rawlinson Roadway"] = true; + t.NuptialScript = true; + t.Palatino = true; + t.Perpetua = true; + t.Plantin = true; + t["Plantin Schoolbook"] = true; + t.Playbill = true; + t["Poor Richard"] = true; + t["Rawlinson Roadway"] = true; + t.Renault = true; + t.Requiem = true; + t.Rockwell = true; + t.Roman = true; + t["Rotis Serif"] = true; + t.Sabon = true; + t.Scala = true; + t.Seagull = true; + t.Sistina = true; + t.Souvenir = true; + t.STIX = true; + t["Stone Informal"] = true; + t["Stone Serif"] = true; + t.Sylfaen = true; + t.Times = true; + t.Trajan = true; + t["Trinité"] = true; + t["Trump Mediaeval"] = true; + t.Utopia = true; + t["Vale Type"] = true; + t["Bitstream Vera"] = true; + t["Vera Serif"] = true; + t.Versailles = true; + t.Wanted = true; + t.Weiss = true; + t["Wide Latin"] = true; + t.Windsor = true; + t.XITS = true; +}); +const getSymbolsFonts = getLookupTableFactory(function (t) { + t.Dingbats = true; + t.Symbol = true; + t.ZapfDingbats = true; + t.Wingdings = true; + t["Wingdings-Bold"] = true; + t["Wingdings-Regular"] = true; +}); +const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { + t[2] = 10; + t[3] = 32; + t[4] = 33; + t[5] = 34; + t[6] = 35; + t[7] = 36; + t[8] = 37; + t[9] = 38; + t[10] = 39; + t[11] = 40; + t[12] = 41; + t[13] = 42; + t[14] = 43; + t[15] = 44; + t[16] = 45; + t[17] = 46; + t[18] = 47; + t[19] = 48; + t[20] = 49; + t[21] = 50; + t[22] = 51; + t[23] = 52; + t[24] = 53; + t[25] = 54; + t[26] = 55; + t[27] = 56; + t[28] = 57; + t[29] = 58; + t[30] = 894; + t[31] = 60; + t[32] = 61; + t[33] = 62; + t[34] = 63; + t[35] = 64; + t[36] = 65; + t[37] = 66; + t[38] = 67; + t[39] = 68; + t[40] = 69; + t[41] = 70; + t[42] = 71; + t[43] = 72; + t[44] = 73; + t[45] = 74; + t[46] = 75; + t[47] = 76; + t[48] = 77; + t[49] = 78; + t[50] = 79; + t[51] = 80; + t[52] = 81; + t[53] = 82; + t[54] = 83; + t[55] = 84; + t[56] = 85; + t[57] = 86; + t[58] = 87; + t[59] = 88; + t[60] = 89; + t[61] = 90; + t[62] = 91; + t[63] = 92; + t[64] = 93; + t[65] = 94; + t[66] = 95; + t[67] = 96; + t[68] = 97; + t[69] = 98; + t[70] = 99; + t[71] = 100; + t[72] = 101; + t[73] = 102; + t[74] = 103; + t[75] = 104; + t[76] = 105; + t[77] = 106; + t[78] = 107; + t[79] = 108; + t[80] = 109; + t[81] = 110; + t[82] = 111; + t[83] = 112; + t[84] = 113; + t[85] = 114; + t[86] = 115; + t[87] = 116; + t[88] = 117; + t[89] = 118; + t[90] = 119; + t[91] = 120; + t[92] = 121; + t[93] = 122; + t[94] = 123; + t[95] = 124; + t[96] = 125; + t[97] = 126; + t[98] = 196; + t[99] = 197; + t[100] = 199; + t[101] = 201; + t[102] = 209; + t[103] = 214; + t[104] = 220; + t[105] = 225; + t[106] = 224; + t[107] = 226; + t[108] = 228; + t[109] = 227; + t[110] = 229; + t[111] = 231; + t[112] = 233; + t[113] = 232; + t[114] = 234; + t[115] = 235; + t[116] = 237; + t[117] = 236; + t[118] = 238; + t[119] = 239; + t[120] = 241; + t[121] = 243; + t[122] = 242; + t[123] = 244; + t[124] = 246; + t[125] = 245; + t[126] = 250; + t[127] = 249; + t[128] = 251; + t[129] = 252; + t[130] = 8224; + t[131] = 176; + t[132] = 162; + t[133] = 163; + t[134] = 167; + t[135] = 8226; + t[136] = 182; + t[137] = 223; + t[138] = 174; + t[139] = 169; + t[140] = 8482; + t[141] = 180; + t[142] = 168; + t[143] = 8800; + t[144] = 198; + t[145] = 216; + t[146] = 8734; + t[147] = 177; + t[148] = 8804; + t[149] = 8805; + t[150] = 165; + t[151] = 181; + t[152] = 8706; + t[153] = 8721; + t[154] = 8719; + t[156] = 8747; + t[157] = 170; + t[158] = 186; + t[159] = 8486; + t[160] = 230; + t[161] = 248; + t[162] = 191; + t[163] = 161; + t[164] = 172; + t[165] = 8730; + t[166] = 402; + t[167] = 8776; + t[168] = 8710; + t[169] = 171; + t[170] = 187; + t[171] = 8230; + t[179] = 8220; + t[180] = 8221; + t[181] = 8216; + t[182] = 8217; + t[200] = 193; + t[203] = 205; + t[207] = 211; + t[210] = 218; + t[223] = 711; + t[224] = 321; + t[225] = 322; + t[226] = 352; + t[227] = 353; + t[228] = 381; + t[229] = 382; + t[233] = 221; + t[234] = 253; + t[252] = 263; + t[253] = 268; + t[254] = 269; + t[258] = 258; + t[260] = 260; + t[261] = 261; + t[265] = 280; + t[266] = 281; + t[267] = 282; + t[268] = 283; + t[269] = 313; + t[275] = 323; + t[276] = 324; + t[278] = 328; + t[283] = 344; + t[284] = 345; + t[285] = 346; + t[286] = 347; + t[292] = 367; + t[295] = 377; + t[296] = 378; + t[298] = 380; + t[305] = 963; + t[306] = 964; + t[307] = 966; + t[308] = 8215; + t[309] = 8252; + t[310] = 8319; + t[311] = 8359; + t[312] = 8592; + t[313] = 8593; + t[337] = 9552; + t[493] = 1039; + t[494] = 1040; + t[672] = 1488; + t[673] = 1489; + t[674] = 1490; + t[675] = 1491; + t[676] = 1492; + t[677] = 1493; + t[678] = 1494; + t[679] = 1495; + t[680] = 1496; + t[681] = 1497; + t[682] = 1498; + t[683] = 1499; + t[684] = 1500; + t[685] = 1501; + t[686] = 1502; + t[687] = 1503; + t[688] = 1504; + t[689] = 1505; + t[690] = 1506; + t[691] = 1507; + t[692] = 1508; + t[693] = 1509; + t[694] = 1510; + t[695] = 1511; + t[696] = 1512; + t[697] = 1513; + t[698] = 1514; + t[705] = 1524; + t[706] = 8362; + t[710] = 64288; + t[711] = 64298; + t[759] = 1617; + t[761] = 1776; + t[763] = 1778; + t[775] = 1652; + t[777] = 1764; + t[778] = 1780; + t[779] = 1781; + t[780] = 1782; + t[782] = 771; + t[783] = 64726; + t[786] = 8363; + t[788] = 8532; + t[790] = 768; + t[791] = 769; + t[792] = 768; + t[795] = 803; + t[797] = 64336; + t[798] = 64337; + t[799] = 64342; + t[800] = 64343; + t[801] = 64344; + t[802] = 64345; + t[803] = 64362; + t[804] = 64363; + t[805] = 64364; + t[2424] = 7821; + t[2425] = 7822; + t[2426] = 7823; + t[2427] = 7824; + t[2428] = 7825; + t[2429] = 7826; + t[2430] = 7827; + t[2433] = 7682; + t[2678] = 8045; + t[2679] = 8046; + t[2830] = 1552; + t[2838] = 686; + t[2840] = 751; + t[2842] = 753; + t[2843] = 754; + t[2844] = 755; + t[2846] = 757; + t[2856] = 767; + t[2857] = 848; + t[2858] = 849; + t[2862] = 853; + t[2863] = 854; + t[2864] = 855; + t[2865] = 861; + t[2866] = 862; + t[2906] = 7460; + t[2908] = 7462; + t[2909] = 7463; + t[2910] = 7464; + t[2912] = 7466; + t[2913] = 7467; + t[2914] = 7468; + t[2916] = 7470; + t[2917] = 7471; + t[2918] = 7472; + t[2920] = 7474; + t[2921] = 7475; + t[2922] = 7476; + t[2924] = 7478; + t[2925] = 7479; + t[2926] = 7480; + t[2928] = 7482; + t[2929] = 7483; + t[2930] = 7484; + t[2932] = 7486; + t[2933] = 7487; + t[2934] = 7488; + t[2936] = 7490; + t[2937] = 7491; + t[2938] = 7492; + t[2940] = 7494; + t[2941] = 7495; + t[2942] = 7496; + t[2944] = 7498; + t[2946] = 7500; + t[2948] = 7502; + t[2950] = 7504; + t[2951] = 7505; + t[2952] = 7506; + t[2954] = 7508; + t[2955] = 7509; + t[2956] = 7510; + t[2958] = 7512; + t[2959] = 7513; + t[2960] = 7514; + t[2962] = 7516; + t[2963] = 7517; + t[2964] = 7518; + t[2966] = 7520; + t[2967] = 7521; + t[2968] = 7522; + t[2970] = 7524; + t[2971] = 7525; + t[2972] = 7526; + t[2974] = 7528; + t[2975] = 7529; + t[2976] = 7530; + t[2978] = 1537; + t[2979] = 1538; + t[2980] = 1539; + t[2982] = 1549; + t[2983] = 1551; + t[2984] = 1552; + t[2986] = 1554; + t[2987] = 1555; + t[2988] = 1556; + t[2990] = 1623; + t[2991] = 1624; + t[2995] = 1775; + t[2999] = 1791; + t[3002] = 64290; + t[3003] = 64291; + t[3004] = 64292; + t[3006] = 64294; + t[3007] = 64295; + t[3008] = 64296; + t[3011] = 1900; + t[3014] = 8223; + t[3015] = 8244; + t[3017] = 7532; + t[3018] = 7533; + t[3019] = 7534; + t[3075] = 7590; + t[3076] = 7591; + t[3079] = 7594; + t[3080] = 7595; + t[3083] = 7598; + t[3084] = 7599; + t[3087] = 7602; + t[3088] = 7603; + t[3091] = 7606; + t[3092] = 7607; + t[3095] = 7610; + t[3096] = 7611; + t[3099] = 7614; + t[3100] = 7615; + t[3103] = 7618; + t[3104] = 7619; + t[3107] = 8337; + t[3108] = 8338; + t[3116] = 1884; + t[3119] = 1885; + t[3120] = 1885; + t[3123] = 1886; + t[3124] = 1886; + t[3127] = 1887; + t[3128] = 1887; + t[3131] = 1888; + t[3132] = 1888; + t[3135] = 1889; + t[3136] = 1889; + t[3139] = 1890; + t[3140] = 1890; + t[3143] = 1891; + t[3144] = 1891; + t[3147] = 1892; + t[3148] = 1892; + t[3153] = 580; + t[3154] = 581; + t[3157] = 584; + t[3158] = 585; + t[3161] = 588; + t[3162] = 589; + t[3165] = 891; + t[3166] = 892; + t[3169] = 1274; + t[3170] = 1275; + t[3173] = 1278; + t[3174] = 1279; + t[3181] = 7622; + t[3182] = 7623; + t[3282] = 11799; + t[3316] = 578; + t[3379] = 42785; + t[3393] = 1159; + t[3416] = 8377; +}); +const getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) { + t[227] = 322; + t[264] = 261; + t[291] = 346; +}); +const getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) { + t[1] = 32; + t[4] = 65; + t[5] = 192; + t[6] = 193; + t[9] = 196; + t[17] = 66; + t[18] = 67; + t[21] = 268; + t[24] = 68; + t[28] = 69; + t[29] = 200; + t[30] = 201; + t[32] = 282; + t[38] = 70; + t[39] = 71; + t[44] = 72; + t[47] = 73; + t[48] = 204; + t[49] = 205; + t[58] = 74; + t[60] = 75; + t[62] = 76; + t[68] = 77; + t[69] = 78; + t[75] = 79; + t[76] = 210; + t[80] = 214; + t[87] = 80; + t[89] = 81; + t[90] = 82; + t[92] = 344; + t[94] = 83; + t[97] = 352; + t[100] = 84; + t[104] = 85; + t[109] = 220; + t[115] = 86; + t[116] = 87; + t[121] = 88; + t[122] = 89; + t[124] = 221; + t[127] = 90; + t[129] = 381; + t[258] = 97; + t[259] = 224; + t[260] = 225; + t[263] = 228; + t[268] = 261; + t[271] = 98; + t[272] = 99; + t[273] = 263; + t[275] = 269; + t[282] = 100; + t[286] = 101; + t[287] = 232; + t[288] = 233; + t[290] = 283; + t[295] = 281; + t[296] = 102; + t[336] = 103; + t[346] = 104; + t[349] = 105; + t[350] = 236; + t[351] = 237; + t[361] = 106; + t[364] = 107; + t[367] = 108; + t[371] = 322; + t[373] = 109; + t[374] = 110; + t[381] = 111; + t[382] = 242; + t[383] = 243; + t[386] = 246; + t[393] = 112; + t[395] = 113; + t[396] = 114; + t[398] = 345; + t[400] = 115; + t[401] = 347; + t[403] = 353; + t[410] = 116; + t[437] = 117; + t[442] = 252; + t[448] = 118; + t[449] = 119; + t[454] = 120; + t[455] = 121; + t[457] = 253; + t[460] = 122; + t[462] = 382; + t[463] = 380; + t[853] = 44; + t[855] = 58; + t[856] = 46; + t[876] = 47; + t[878] = 45; + t[882] = 45; + t[894] = 40; + t[895] = 41; + t[896] = 91; + t[897] = 93; + t[923] = 64; + t[1004] = 48; + t[1005] = 49; + t[1006] = 50; + t[1007] = 51; + t[1008] = 52; + t[1009] = 53; + t[1010] = 54; + t[1011] = 55; + t[1012] = 56; + t[1013] = 57; + t[1081] = 37; + t[1085] = 43; + t[1086] = 45; +}); +function getStandardFontName(name) { + const fontName = normalizeFontName(name); + const stdFontMap = getStdFontMap(); + return stdFontMap[fontName]; +} +function isKnownFontName(name) { + const fontName = normalizeFontName(name); + return !!(getStdFontMap()[fontName] || getNonStdFontMap()[fontName] || getSerifFonts()[fontName] || getSymbolsFonts()[fontName]); +} + +;// ./src/core/to_unicode_map.js + +class ToUnicodeMap { + constructor(cmap = []) { + this._map = cmap; + } + get length() { + return this._map.length; + } + forEach(callback) { + for (const charCode in this._map) { + callback(charCode, this._map[charCode].charCodeAt(0)); + } + } + has(i) { + return this._map[i] !== undefined; + } + get(i) { + return this._map[i]; + } + charCodeOf(value) { + const map = this._map; + if (map.length <= 0x10000) { + return map.indexOf(value); + } + for (const charCode in map) { + if (map[charCode] === value) { + return charCode | 0; + } + } + return -1; + } + amend(map) { + for (const charCode in map) { + this._map[charCode] = map[charCode]; + } + } +} +class IdentityToUnicodeMap { + constructor(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; + } + get length() { + return this.lastChar + 1 - this.firstChar; + } + forEach(callback) { + for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } + } + has(i) { + return this.firstChar <= i && i <= this.lastChar; + } + get(i) { + if (this.firstChar <= i && i <= this.lastChar) { + return String.fromCharCode(i); + } + return undefined; + } + charCodeOf(v) { + return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1; + } + amend(map) { + unreachable("Should not call amend()"); + } +} + +;// ./src/core/cff_font.js + + + +class CFFFont { + constructor(file, properties) { + this.properties = properties; + const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); + this.cff = parser.parse(); + this.cff.duplicateFirstGlyph(); + const compiler = new CFFCompiler(this.cff); + this.seacs = this.cff.seacs; + try { + this.data = compiler.compile(); + } catch { + warn("Failed to compile font " + properties.loadedName); + this.data = file; + } + this._createBuiltInEncoding(); + } + get numGlyphs() { + return this.cff.charStrings.count; + } + getCharset() { + return this.cff.charset.charset; + } + getGlyphMapping() { + const cff = this.cff; + const properties = this.properties; + const { + cidToGidMap, + cMap + } = properties; + const charsets = cff.charset.charset; + let charCodeToGlyphId; + let glyphId; + if (properties.composite) { + let invCidToGidMap; + if (cidToGidMap?.length > 0) { + invCidToGidMap = Object.create(null); + for (let i = 0, ii = cidToGidMap.length; i < ii; i++) { + const gid = cidToGidMap[i]; + if (gid !== undefined) { + invCidToGidMap[gid] = i; + } + } + } + charCodeToGlyphId = Object.create(null); + let charCode; + if (cff.isCIDFont) { + for (glyphId = 0; glyphId < charsets.length; glyphId++) { + const cid = charsets[glyphId]; + charCode = cMap.charCodeOf(cid); + if (invCidToGidMap?.[charCode] !== undefined) { + charCode = invCidToGidMap[charCode]; + } + charCodeToGlyphId[charCode] = glyphId; + } + } else { + for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { + charCode = cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId; + } + } + return charCodeToGlyphId; + } + let encoding = cff.encoding ? cff.encoding.encoding : null; + if (properties.isInternalFont) { + encoding = properties.defaultEncoding; + } + charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); + return charCodeToGlyphId; + } + hasGlyphId(id) { + return this.cff.hasGlyphId(id); + } + _createBuiltInEncoding() { + const { + charset, + encoding + } = this.cff; + if (!charset || !encoding) { + return; + } + const charsets = charset.charset, + encodings = encoding.encoding; + const map = []; + for (const charCode in encodings) { + const glyphId = encodings[charCode]; + if (glyphId >= 0) { + const glyphName = charsets[glyphId]; + if (glyphName) { + map[charCode] = glyphName; + } + } + } + if (map.length > 0) { + this.properties.builtInEncoding = map; + } + } +} + +;// ./src/core/font_renderer.js + + + + + + +function getUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; +} +function getUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; +} +function getInt16(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16) >> 16; +} +function getInt8(data, offset) { + return data[offset] << 24 >> 24; +} +function getFloat214(data, offset) { + return getInt16(data, offset) / 16384; +} +function getSubroutineBias(subrs) { + const numSubrs = subrs.length; + let bias = 32768; + if (numSubrs < 1240) { + bias = 107; + } else if (numSubrs < 33900) { + bias = 1131; + } + return bias; +} +function parseCmap(data, start, end) { + const offset = getUint16(data, start + 2) === 1 ? getUint32(data, start + 8) : getUint32(data, start + 16); + const format = getUint16(data, start + offset); + let ranges, p, i; + if (format === 4) { + getUint16(data, start + offset + 2); + const segCount = getUint16(data, start + offset + 6) >> 1; + p = start + offset + 14; + ranges = []; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i] = { + end: getUint16(data, p) + }; + } + p += 2; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].start = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].idDelta = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + let idOffset = getUint16(data, p); + if (idOffset === 0) { + continue; + } + ranges[i].ids = []; + for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { + ranges[i].ids[j] = getUint16(data, p + idOffset); + idOffset += 2; + } + } + return ranges; + } else if (format === 12) { + const groups = getUint32(data, start + offset + 12); + p = start + offset + 16; + ranges = []; + for (i = 0; i < groups; i++) { + start = getUint32(data, p); + ranges.push({ + start, + end: getUint32(data, p + 4), + idDelta: getUint32(data, p + 8) - start + }); + p += 12; + } + return ranges; + } + throw new FormatError(`unsupported cmap: ${format}`); +} +function parseCff(data, start, end, seacAnalysisEnabled) { + const properties = {}; + const parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled); + const cff = parser.parse(); + return { + glyphs: cff.charStrings.objects, + subrs: cff.topDict.privateDict?.subrsIndex?.objects, + gsubrs: cff.globalSubrIndex?.objects, + isCFFCIDFont: cff.isCIDFont, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray + }; +} +function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { + let itemSize, itemDecode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = getUint32; + } else { + itemSize = 2; + itemDecode = (data, offset) => 2 * getUint16(data, offset); + } + const glyphs = []; + let startOffset = itemDecode(loca, 0); + for (let j = itemSize; j < loca.length; j += itemSize) { + const endOffset = itemDecode(loca, j); + glyphs.push(glyf.subarray(startOffset, endOffset)); + startOffset = endOffset; + } + return glyphs; +} +function lookupCmap(ranges, unicode) { + const code = unicode.codePointAt(0); + let gid = 0, + l = 0, + r = ranges.length - 1; + while (l < r) { + const c = l + r + 1 >> 1; + if (code < ranges[c].start) { + r = c - 1; + } else { + l = c; + } + } + if (ranges[l].start <= code && code <= ranges[l].end) { + gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff; + } + return { + charCode: code, + glyphId: gid + }; +} +function compileGlyf(code, cmds, font) { + function moveTo(x, y) { + cmds.add(FontRenderOps.MOVE_TO, [x, y]); + } + function lineTo(x, y) { + cmds.add(FontRenderOps.LINE_TO, [x, y]); + } + function quadraticCurveTo(xa, ya, x, y) { + cmds.add(FontRenderOps.QUADRATIC_CURVE_TO, [xa, ya, x, y]); + } + let i = 0; + const numberOfContours = getInt16(code, i); + let flags; + let x = 0, + y = 0; + i += 10; + if (numberOfContours < 0) { + do { + flags = getUint16(code, i); + const glyphIndex = getUint16(code, i + 2); + i += 4; + let arg1, arg2; + if (flags & 0x01) { + if (flags & 0x02) { + arg1 = getInt16(code, i); + arg2 = getInt16(code, i + 2); + } else { + arg1 = getUint16(code, i); + arg2 = getUint16(code, i + 2); + } + i += 4; + } else if (flags & 0x02) { + arg1 = getInt8(code, i++); + arg2 = getInt8(code, i++); + } else { + arg1 = code[i++]; + arg2 = code[i++]; + } + if (flags & 0x02) { + x = arg1; + y = arg2; + } else { + x = 0; + y = 0; + } + let scaleX = 1, + scaleY = 1, + scale01 = 0, + scale10 = 0; + if (flags & 0x08) { + scaleX = scaleY = getFloat214(code, i); + i += 2; + } else if (flags & 0x40) { + scaleX = getFloat214(code, i); + scaleY = getFloat214(code, i + 2); + i += 4; + } else if (flags & 0x80) { + scaleX = getFloat214(code, i); + scale01 = getFloat214(code, i + 2); + scale10 = getFloat214(code, i + 4); + scaleY = getFloat214(code, i + 6); + i += 8; + } + const subglyph = font.glyphs[glyphIndex]; + if (subglyph) { + cmds.add(FontRenderOps.SAVE); + cmds.add(FontRenderOps.TRANSFORM, [scaleX, scale01, scale10, scaleY, x, y]); + if (!(flags & 0x02)) {} + compileGlyf(subglyph, cmds, font); + cmds.add(FontRenderOps.RESTORE); + } + } while (flags & 0x20); + } else { + const endPtsOfContours = []; + let j, jj; + for (j = 0; j < numberOfContours; j++) { + endPtsOfContours.push(getUint16(code, i)); + i += 2; + } + const instructionLength = getUint16(code, i); + i += 2 + instructionLength; + const numberOfPoints = endPtsOfContours.at(-1) + 1; + const points = []; + while (points.length < numberOfPoints) { + flags = code[i++]; + let repeat = 1; + if (flags & 0x08) { + repeat += code[i++]; + } + while (repeat-- > 0) { + points.push({ + flags + }); + } + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x12) { + case 0x00: + x += getInt16(code, i); + i += 2; + break; + case 0x02: + x -= code[i++]; + break; + case 0x12: + x += code[i++]; + break; + } + points[j].x = x; + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x24) { + case 0x00: + y += getInt16(code, i); + i += 2; + break; + case 0x04: + y -= code[i++]; + break; + case 0x24: + y += code[i++]; + break; + } + points[j].y = y; + } + let startPoint = 0; + for (i = 0; i < numberOfContours; i++) { + const endPoint = endPtsOfContours[i]; + const contour = points.slice(startPoint, endPoint + 1); + if (contour[0].flags & 1) { + contour.push(contour[0]); + } else if (contour.at(-1).flags & 1) { + contour.unshift(contour.at(-1)); + } else { + const p = { + flags: 1, + x: (contour[0].x + contour.at(-1).x) / 2, + y: (contour[0].y + contour.at(-1).y) / 2 + }; + contour.unshift(p); + contour.push(p); + } + moveTo(contour[0].x, contour[0].y); + for (j = 1, jj = contour.length; j < jj; j++) { + if (contour[j].flags & 1) { + lineTo(contour[j].x, contour[j].y); + } else if (contour[j + 1].flags & 1) { + quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); + j++; + } else { + quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); + } + } + startPoint = endPoint + 1; + } + } +} +function compileCharString(charStringCode, cmds, font, glyphId) { + function moveTo(x, y) { + cmds.add(FontRenderOps.MOVE_TO, [x, y]); + } + function lineTo(x, y) { + cmds.add(FontRenderOps.LINE_TO, [x, y]); + } + function bezierCurveTo(x1, y1, x2, y2, x, y) { + cmds.add(FontRenderOps.BEZIER_CURVE_TO, [x1, y1, x2, y2, x, y]); + } + const stack = []; + let x = 0, + y = 0; + let stems = 0; + function parse(code) { + let i = 0; + while (i < code.length) { + let stackClean = false; + let v = code[i++]; + let xa, xb, ya, yb, y1, y2, y3, n, subrCode; + switch (v) { + case 1: + stems += stack.length >> 1; + stackClean = true; + break; + case 3: + stems += stack.length >> 1; + stackClean = true; + break; + case 4: + y += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 5: + while (stack.length > 0) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + break; + case 6: + while (stack.length > 0) { + x += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + y += stack.shift(); + lineTo(x, y); + } + break; + case 7: + while (stack.length > 0) { + y += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + x += stack.shift(); + lineTo(x, y); + } + break; + case 8: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 10: + n = stack.pop(); + subrCode = null; + if (font.isCFFCIDFont) { + const fdIndex = font.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < font.fdArray.length) { + const fontDict = font.fdArray[fdIndex]; + let subrs; + if (fontDict.privateDict?.subrsIndex) { + subrs = fontDict.privateDict.subrsIndex.objects; + } + if (subrs) { + n += getSubroutineBias(subrs); + subrCode = subrs[n]; + } + } else { + warn("Invalid fd index for glyph index."); + } + } else { + subrCode = font.subrs[n + font.subrsBias]; + } + if (subrCode) { + parse(subrCode); + } + break; + case 11: + return; + case 12: + v = code[i++]; + switch (v) { + case 34: + xa = x + stack.shift(); + xb = xa + stack.shift(); + y1 = y + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y, xb, y1, x, y1); + xa = x + stack.shift(); + xb = xa + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y, x, y); + break; + case 35: + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + stack.pop(); + break; + case 36: + xa = x + stack.shift(); + y1 = y + stack.shift(); + xb = xa + stack.shift(); + y2 = y1 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y2, x, y2); + xa = x + stack.shift(); + xb = xa + stack.shift(); + y3 = y2 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y2, xb, y3, x, y); + break; + case 37: + const x0 = x, + y0 = y; + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb; + if (Math.abs(x - x0) > Math.abs(y - y0)) { + x += stack.shift(); + } else { + y += stack.shift(); + } + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + default: + throw new FormatError(`unknown operator: 12 ${v}`); + } + break; + case 14: + if (stack.length >= 4) { + const achar = stack.pop(); + const bchar = stack.pop(); + y = stack.pop(); + x = stack.pop(); + cmds.add(FontRenderOps.SAVE); + cmds.add(FontRenderOps.TRANSLATE, [x, y]); + let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + cmds.add(FontRenderOps.RESTORE); + cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + } + return; + case 18: + stems += stack.length >> 1; + stackClean = true; + break; + case 19: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 20: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 21: + y += stack.pop(); + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 22: + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 23: + stems += stack.length >> 1; + stackClean = true; + break; + case 24: + while (stack.length > 2) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + break; + case 25: + while (stack.length > 6) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + case 26: + if (stack.length % 2) { + x += stack.shift(); + } + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 27: + if (stack.length % 2) { + y += stack.shift(); + } + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb; + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 28: + stack.push((code[i] << 24 | code[i + 1] << 16) >> 16); + i += 2; + break; + case 29: + n = stack.pop() + font.gsubrsBias; + subrCode = font.gsubrs[n]; + if (subrCode) { + parse(subrCode); + } + break; + case 30: + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 31: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + default: + if (v < 32) { + throw new FormatError(`unknown operator: ${v}`); + } + if (v < 247) { + stack.push(v - 139); + } else if (v < 251) { + stack.push((v - 247) * 256 + code[i++] + 108); + } else if (v < 255) { + stack.push(-(v - 251) * 256 - code[i++] - 108); + } else { + stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536); + i += 4; + } + break; + } + if (stackClean) { + stack.length = 0; + } + } + } + parse(charStringCode); +} +const NOOP = []; +class Commands { + cmds = []; + add(cmd, args) { + if (args) { + if (!isNumberArray(args, null)) { + warn(`Commands.add - "${cmd}" has at least one non-number arg: "${args}".`); + const newArgs = args.map(arg => typeof arg === "number" ? arg : 0); + this.cmds.push(cmd, ...newArgs); + } else { + this.cmds.push(cmd, ...args); + } + } else { + this.cmds.push(cmd); + } + } +} +class CompiledFont { + constructor(fontMatrix) { + this.fontMatrix = fontMatrix; + this.compiledGlyphs = Object.create(null); + this.compiledCharCodeToGlyphId = Object.create(null); + } + getPathJs(unicode) { + const { + charCode, + glyphId + } = lookupCmap(this.cmap, unicode); + let fn = this.compiledGlyphs[glyphId], + compileEx; + if (!fn) { + try { + fn = this.compileGlyph(this.glyphs[glyphId], glyphId); + } catch (ex) { + fn = NOOP; + compileEx = ex; + } + this.compiledGlyphs[glyphId] = fn; + } + this.compiledCharCodeToGlyphId[charCode] ??= glyphId; + if (compileEx) { + throw compileEx; + } + return fn; + } + compileGlyph(code, glyphId) { + if (!code || code.length === 0 || code[0] === 14) { + return NOOP; + } + let fontMatrix = this.fontMatrix; + if (this.isCFFCIDFont) { + const fdIndex = this.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < this.fdArray.length) { + const fontDict = this.fdArray[fdIndex]; + fontMatrix = fontDict.getByName("FontMatrix") || FONT_IDENTITY_MATRIX; + } else { + warn("Invalid fd index for glyph index."); + } + } + const cmds = new Commands(); + cmds.add(FontRenderOps.SAVE); + cmds.add(FontRenderOps.TRANSFORM, fontMatrix.slice()); + cmds.add(FontRenderOps.SCALE); + this.compileGlyphImpl(code, cmds, glyphId); + cmds.add(FontRenderOps.RESTORE); + return cmds.cmds; + } + compileGlyphImpl() { + unreachable("Children classes should implement this."); + } + hasBuiltPath(unicode) { + const { + charCode, + glyphId + } = lookupCmap(this.cmap, unicode); + return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== undefined; + } +} +class TrueTypeCompiled extends CompiledFont { + constructor(glyphs, cmap, fontMatrix) { + super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]); + this.glyphs = glyphs; + this.cmap = cmap; + } + compileGlyphImpl(code, cmds) { + compileGlyf(code, cmds, this); + } +} +class Type2Compiled extends CompiledFont { + constructor(cffInfo, cmap, fontMatrix, glyphNameMap) { + super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]); + this.glyphs = cffInfo.glyphs; + this.gsubrs = cffInfo.gsubrs || []; + this.subrs = cffInfo.subrs || []; + this.cmap = cmap; + this.glyphNameMap = glyphNameMap || getGlyphsUnicode(); + this.gsubrsBias = getSubroutineBias(this.gsubrs); + this.subrsBias = getSubroutineBias(this.subrs); + this.isCFFCIDFont = cffInfo.isCFFCIDFont; + this.fdSelect = cffInfo.fdSelect; + this.fdArray = cffInfo.fdArray; + } + compileGlyphImpl(code, cmds, glyphId) { + compileCharString(code, cmds, this, glyphId); + } +} +class FontRendererFactory { + static create(font, seacAnalysisEnabled) { + const data = new Uint8Array(font.data); + let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; + const numTables = getUint16(data, 4); + for (let i = 0, p = 12; i < numTables; i++, p += 16) { + const tag = bytesToString(data.subarray(p, p + 4)); + const offset = getUint32(data, p + 8); + const length = getUint32(data, p + 12); + switch (tag) { + case "cmap": + cmap = parseCmap(data, offset, offset + length); + break; + case "glyf": + glyf = data.subarray(offset, offset + length); + break; + case "loca": + loca = data.subarray(offset, offset + length); + break; + case "head": + unitsPerEm = getUint16(data, offset + 18); + indexToLocFormat = getUint16(data, offset + 50); + break; + case "CFF ": + cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); + break; + } + } + if (glyf) { + const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; + return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); + } + return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); + } +} + +;// ./src/core/metrics.js + +const getMetrics = getLookupTableFactory(function (t) { + t.Courier = 600; + t["Courier-Bold"] = 600; + t["Courier-BoldOblique"] = 600; + t["Courier-Oblique"] = 600; + t.Helvetica = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-Bold"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-BoldOblique"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-Oblique"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t.Symbol = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.universal = 713; + t.numbersign = 500; + t.existential = 549; + t.percent = 833; + t.ampersand = 778; + t.suchthat = 439; + t.parenleft = 333; + t.parenright = 333; + t.asteriskmath = 500; + t.plus = 549; + t.comma = 250; + t.minus = 549; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 549; + t.equal = 549; + t.greater = 549; + t.question = 444; + t.congruent = 549; + t.Alpha = 722; + t.Beta = 667; + t.Chi = 722; + t.Delta = 612; + t.Epsilon = 611; + t.Phi = 763; + t.Gamma = 603; + t.Eta = 722; + t.Iota = 333; + t.theta1 = 631; + t.Kappa = 722; + t.Lambda = 686; + t.Mu = 889; + t.Nu = 722; + t.Omicron = 722; + t.Pi = 768; + t.Theta = 741; + t.Rho = 556; + t.Sigma = 592; + t.Tau = 611; + t.Upsilon = 690; + t.sigma1 = 439; + t.Omega = 768; + t.Xi = 645; + t.Psi = 795; + t.Zeta = 611; + t.bracketleft = 333; + t.therefore = 863; + t.bracketright = 333; + t.perpendicular = 658; + t.underscore = 500; + t.radicalex = 500; + t.alpha = 631; + t.beta = 549; + t.chi = 549; + t.delta = 494; + t.epsilon = 439; + t.phi = 521; + t.gamma = 411; + t.eta = 603; + t.iota = 329; + t.phi1 = 603; + t.kappa = 549; + t.lambda = 549; + t.mu = 576; + t.nu = 521; + t.omicron = 549; + t.pi = 549; + t.theta = 521; + t.rho = 549; + t.sigma = 603; + t.tau = 439; + t.upsilon = 576; + t.omega1 = 713; + t.omega = 686; + t.xi = 493; + t.psi = 686; + t.zeta = 494; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.similar = 549; + t.Euro = 750; + t.Upsilon1 = 620; + t.minute = 247; + t.lessequal = 549; + t.fraction = 167; + t.infinity = 713; + t.florin = 500; + t.club = 753; + t.diamond = 753; + t.heart = 753; + t.spade = 753; + t.arrowboth = 1042; + t.arrowleft = 987; + t.arrowup = 603; + t.arrowright = 987; + t.arrowdown = 603; + t.degree = 400; + t.plusminus = 549; + t.second = 411; + t.greaterequal = 549; + t.multiply = 549; + t.proportional = 713; + t.partialdiff = 494; + t.bullet = 460; + t.divide = 549; + t.notequal = 549; + t.equivalence = 549; + t.approxequal = 549; + t.ellipsis = 1000; + t.arrowvertex = 603; + t.arrowhorizex = 1000; + t.carriagereturn = 658; + t.aleph = 823; + t.Ifraktur = 686; + t.Rfraktur = 795; + t.weierstrass = 987; + t.circlemultiply = 768; + t.circleplus = 768; + t.emptyset = 823; + t.intersection = 768; + t.union = 768; + t.propersuperset = 713; + t.reflexsuperset = 713; + t.notsubset = 713; + t.propersubset = 713; + t.reflexsubset = 713; + t.element = 713; + t.notelement = 713; + t.angle = 768; + t.gradient = 713; + t.registerserif = 790; + t.copyrightserif = 790; + t.trademarkserif = 890; + t.product = 823; + t.radical = 549; + t.dotmath = 250; + t.logicalnot = 713; + t.logicaland = 603; + t.logicalor = 603; + t.arrowdblboth = 1042; + t.arrowdblleft = 987; + t.arrowdblup = 603; + t.arrowdblright = 987; + t.arrowdbldown = 603; + t.lozenge = 494; + t.angleleft = 329; + t.registersans = 790; + t.copyrightsans = 790; + t.trademarksans = 786; + t.summation = 713; + t.parenlefttp = 384; + t.parenleftex = 384; + t.parenleftbt = 384; + t.bracketlefttp = 384; + t.bracketleftex = 384; + t.bracketleftbt = 384; + t.bracelefttp = 494; + t.braceleftmid = 494; + t.braceleftbt = 494; + t.braceex = 494; + t.angleright = 329; + t.integral = 274; + t.integraltp = 686; + t.integralex = 686; + t.integralbt = 686; + t.parenrighttp = 384; + t.parenrightex = 384; + t.parenrightbt = 384; + t.bracketrighttp = 384; + t.bracketrightex = 384; + t.bracketrightbt = 384; + t.bracerighttp = 494; + t.bracerightmid = 494; + t.bracerightbt = 494; + t.apple = 790; + }); + t["Times-Roman"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 408; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 564; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 564; + t.equal = 564; + t.greater = 564; + t.question = 444; + t.at = 921; + t.A = 722; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 556; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 389; + t.K = 722; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 556; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 722; + t.W = 944; + t.X = 722; + t.Y = 722; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 469; + t.underscore = 500; + t.quoteleft = 333; + t.a = 444; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 333; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.asciitilde = 541; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 180; + t.quotedblleft = 444; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 453; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 444; + t.quotedblright = 444; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 444; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 889; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 444; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 564; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 444; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 444; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 444; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 444; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 444; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 444; + t.Amacron = 722; + t.rcaron = 333; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 556; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 588; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 564; + t.uacute = 500; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 444; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 722; + t.Iacute = 333; + t.plusminus = 564; + t.brokenbar = 200; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 333; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 326; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 444; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 344; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 722; + t.zdotaccent = 444; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 500; + t.minus = 564; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 564; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Bold"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 1000; + t.ampersand = 833; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 930; + t.A = 722; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 778; + t.L = 667; + t.M = 944; + t.N = 722; + t.O = 778; + t.P = 611; + t.Q = 778; + t.R = 722; + t.S = 556; + t.T = 667; + t.U = 722; + t.V = 722; + t.W = 1000; + t.X = 722; + t.Y = 722; + t.Z = 667; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 581; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 556; + t.c = 444; + t.d = 556; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 333; + t.k = 556; + t.l = 278; + t.m = 833; + t.n = 556; + t.o = 500; + t.p = 556; + t.q = 556; + t.r = 444; + t.s = 389; + t.t = 333; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 394; + t.bar = 220; + t.braceright = 394; + t.asciitilde = 520; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 540; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 300; + t.Lslash = 667; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 330; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 556; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 570; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 667; + t.Cacute = 722; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 722; + t.rcaron = 444; + t.ccedilla = 444; + t.Zdotaccent = 667; + t.Thorn = 611; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 556; + t.dcaron = 672; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 667; + t.partialdiff = 494; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 778; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 444; + t.omacron = 500; + t.Zacute = 667; + t.Zcaron = 667; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 416; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 300; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 394; + t.Kcommaaccent = 778; + t.Lacute = 667; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 667; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 444; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 722; + t.Lcommaaccent = 667; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 444; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 556; + t.minus = 570; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 333; + t.logicalnot = 570; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-BoldItalic"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 389; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 832; + t.A = 667; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 667; + t.F = 667; + t.G = 722; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 667; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 889; + t.X = 667; + t.Y = 611; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 570; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 556; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 556; + t.v = 444; + t.w = 667; + t.x = 500; + t.y = 444; + t.z = 389; + t.braceleft = 348; + t.bar = 220; + t.braceright = 348; + t.asciitilde = 570; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 500; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 944; + t.ordfeminine = 266; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 300; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 611; + t.divide = 570; + t.Yacute = 611; + t.Acircumflex = 667; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 667; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 608; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 444; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 722; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 366; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 576; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 382; + t.Kcommaaccent = 667; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 500; + t.minus = 606; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 606; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Italic"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 420; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 675; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 675; + t.equal = 675; + t.greater = 675; + t.question = 500; + t.at = 920; + t.A = 611; + t.B = 611; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 611; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 444; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 667; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 611; + t.S = 500; + t.T = 556; + t.U = 722; + t.V = 611; + t.W = 833; + t.X = 611; + t.Y = 556; + t.Z = 556; + t.bracketleft = 389; + t.backslash = 278; + t.bracketright = 389; + t.asciicircum = 422; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 278; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 444; + t.l = 278; + t.m = 722; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 444; + t.w = 667; + t.x = 444; + t.y = 444; + t.z = 389; + t.braceleft = 400; + t.bar = 275; + t.braceright = 400; + t.asciitilde = 541; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 214; + t.quotedblleft = 556; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 523; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 556; + t.quotedblright = 556; + t.guillemotright = 500; + t.ellipsis = 889; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 889; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 556; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 667; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 556; + t.divide = 675; + t.Yacute = 556; + t.Acircumflex = 611; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 667; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 556; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 611; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 500; + t.Amacron = 611; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 556; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 611; + t.Sacute = 500; + t.dcaron = 544; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 611; + t.Abreve = 611; + t.multiply = 675; + t.uacute = 500; + t.Tcaron = 556; + t.partialdiff = 476; + t.ydieresis = 444; + t.Nacute = 667; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 667; + t.Iacute = 333; + t.plusminus = 675; + t.brokenbar = 275; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 389; + t.omacron = 500; + t.Zacute = 556; + t.Zcaron = 556; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 300; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 611; + t.Adieresis = 611; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 500; + t.lcaron = 300; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 500; + t.Scommaaccent = 500; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 667; + t.otilde = 500; + t.Rcommaaccent = 611; + t.Lcommaaccent = 556; + t.Atilde = 611; + t.Aogonek = 611; + t.Aring = 611; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 444; + t.minus = 675; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 675; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t.ZapfDingbats = getLookupTableFactory(function (t) { + t.space = 278; + t.a1 = 974; + t.a2 = 961; + t.a202 = 974; + t.a3 = 980; + t.a4 = 719; + t.a5 = 789; + t.a119 = 790; + t.a118 = 791; + t.a117 = 690; + t.a11 = 960; + t.a12 = 939; + t.a13 = 549; + t.a14 = 855; + t.a15 = 911; + t.a16 = 933; + t.a105 = 911; + t.a17 = 945; + t.a18 = 974; + t.a19 = 755; + t.a20 = 846; + t.a21 = 762; + t.a22 = 761; + t.a23 = 571; + t.a24 = 677; + t.a25 = 763; + t.a26 = 760; + t.a27 = 759; + t.a28 = 754; + t.a6 = 494; + t.a7 = 552; + t.a8 = 537; + t.a9 = 577; + t.a10 = 692; + t.a29 = 786; + t.a30 = 788; + t.a31 = 788; + t.a32 = 790; + t.a33 = 793; + t.a34 = 794; + t.a35 = 816; + t.a36 = 823; + t.a37 = 789; + t.a38 = 841; + t.a39 = 823; + t.a40 = 833; + t.a41 = 816; + t.a42 = 831; + t.a43 = 923; + t.a44 = 744; + t.a45 = 723; + t.a46 = 749; + t.a47 = 790; + t.a48 = 792; + t.a49 = 695; + t.a50 = 776; + t.a51 = 768; + t.a52 = 792; + t.a53 = 759; + t.a54 = 707; + t.a55 = 708; + t.a56 = 682; + t.a57 = 701; + t.a58 = 826; + t.a59 = 815; + t.a60 = 789; + t.a61 = 789; + t.a62 = 707; + t.a63 = 687; + t.a64 = 696; + t.a65 = 689; + t.a66 = 786; + t.a67 = 787; + t.a68 = 713; + t.a69 = 791; + t.a70 = 785; + t.a71 = 791; + t.a72 = 873; + t.a73 = 761; + t.a74 = 762; + t.a203 = 762; + t.a75 = 759; + t.a204 = 759; + t.a76 = 892; + t.a77 = 892; + t.a78 = 788; + t.a79 = 784; + t.a81 = 438; + t.a82 = 138; + t.a83 = 277; + t.a84 = 415; + t.a97 = 392; + t.a98 = 392; + t.a99 = 668; + t.a100 = 668; + t.a89 = 390; + t.a90 = 390; + t.a93 = 317; + t.a94 = 317; + t.a91 = 276; + t.a92 = 276; + t.a205 = 509; + t.a85 = 509; + t.a206 = 410; + t.a86 = 410; + t.a87 = 234; + t.a88 = 234; + t.a95 = 334; + t.a96 = 334; + t.a101 = 732; + t.a102 = 544; + t.a103 = 544; + t.a104 = 910; + t.a106 = 667; + t.a107 = 760; + t.a108 = 760; + t.a112 = 776; + t.a111 = 595; + t.a110 = 694; + t.a109 = 626; + t.a120 = 788; + t.a121 = 788; + t.a122 = 788; + t.a123 = 788; + t.a124 = 788; + t.a125 = 788; + t.a126 = 788; + t.a127 = 788; + t.a128 = 788; + t.a129 = 788; + t.a130 = 788; + t.a131 = 788; + t.a132 = 788; + t.a133 = 788; + t.a134 = 788; + t.a135 = 788; + t.a136 = 788; + t.a137 = 788; + t.a138 = 788; + t.a139 = 788; + t.a140 = 788; + t.a141 = 788; + t.a142 = 788; + t.a143 = 788; + t.a144 = 788; + t.a145 = 788; + t.a146 = 788; + t.a147 = 788; + t.a148 = 788; + t.a149 = 788; + t.a150 = 788; + t.a151 = 788; + t.a152 = 788; + t.a153 = 788; + t.a154 = 788; + t.a155 = 788; + t.a156 = 788; + t.a157 = 788; + t.a158 = 788; + t.a159 = 788; + t.a160 = 894; + t.a161 = 838; + t.a163 = 1016; + t.a164 = 458; + t.a196 = 748; + t.a165 = 924; + t.a192 = 748; + t.a166 = 918; + t.a167 = 927; + t.a168 = 928; + t.a169 = 928; + t.a170 = 834; + t.a171 = 873; + t.a172 = 828; + t.a173 = 924; + t.a162 = 924; + t.a174 = 917; + t.a175 = 930; + t.a176 = 931; + t.a177 = 463; + t.a178 = 883; + t.a179 = 836; + t.a193 = 836; + t.a180 = 867; + t.a199 = 867; + t.a181 = 696; + t.a200 = 696; + t.a182 = 874; + t.a201 = 874; + t.a183 = 760; + t.a184 = 946; + t.a197 = 771; + t.a185 = 865; + t.a194 = 771; + t.a198 = 888; + t.a186 = 967; + t.a195 = 888; + t.a187 = 831; + t.a188 = 873; + t.a189 = 927; + t.a190 = 970; + t.a191 = 918; + }); +}); +const getFontBasicMetrics = getLookupTableFactory(function (t) { + t.Courier = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: -426 + }; + t["Courier-Bold"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 439 + }; + t["Courier-Oblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426 + }; + t["Courier-BoldOblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426 + }; + t.Helvetica = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523 + }; + t["Helvetica-Bold"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532 + }; + t["Helvetica-Oblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523 + }; + t["Helvetica-BoldOblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532 + }; + t["Times-Roman"] = { + ascent: 683, + descent: -217, + capHeight: 662, + xHeight: 450 + }; + t["Times-Bold"] = { + ascent: 683, + descent: -217, + capHeight: 676, + xHeight: 461 + }; + t["Times-Italic"] = { + ascent: 683, + descent: -217, + capHeight: 653, + xHeight: 441 + }; + t["Times-BoldItalic"] = { + ascent: 683, + descent: -217, + capHeight: 669, + xHeight: 462 + }; + t.Symbol = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN + }; + t.ZapfDingbats = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN + }; +}); + +;// ./src/core/glyf.js +const ON_CURVE_POINT = 1 << 0; +const X_SHORT_VECTOR = 1 << 1; +const Y_SHORT_VECTOR = 1 << 2; +const REPEAT_FLAG = 1 << 3; +const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4; +const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5; +const OVERLAP_SIMPLE = 1 << 6; +const ARG_1_AND_2_ARE_WORDS = 1 << 0; +const ARGS_ARE_XY_VALUES = 1 << 1; +const WE_HAVE_A_SCALE = 1 << 3; +const MORE_COMPONENTS = 1 << 5; +const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; +const WE_HAVE_A_TWO_BY_TWO = 1 << 7; +const WE_HAVE_INSTRUCTIONS = 1 << 8; +class GlyfTable { + constructor({ + glyfTable, + isGlyphLocationsLong, + locaTable, + numGlyphs + }) { + this.glyphs = []; + const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); + const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); + const offsetSize = isGlyphLocationsLong ? 4 : 2; + let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); + let pos = 0; + for (let i = 0; i < numGlyphs; i++) { + pos += offsetSize; + const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); + if (next === prev) { + this.glyphs.push(new Glyph({})); + continue; + } + const glyph = Glyph.parse(prev, glyf); + this.glyphs.push(glyph); + prev = next; + } + } + getSize() { + return this.glyphs.reduce((a, g) => { + const size = g.getSize(); + return a + (size + 3 & ~3); + }, 0); + } + write() { + const totalSize = this.getSize(); + const glyfTable = new DataView(new ArrayBuffer(totalSize)); + const isLocationLong = totalSize > 0x1fffe; + const offsetSize = isLocationLong ? 4 : 2; + const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); + if (isLocationLong) { + locaTable.setUint32(0, 0); + } else { + locaTable.setUint16(0, 0); + } + let pos = 0; + let locaIndex = 0; + for (const glyph of this.glyphs) { + pos += glyph.write(pos, glyfTable); + pos = pos + 3 & ~3; + locaIndex += offsetSize; + if (isLocationLong) { + locaTable.setUint32(locaIndex, pos); + } else { + locaTable.setUint16(locaIndex, pos >> 1); + } + } + return { + isLocationLong, + loca: new Uint8Array(locaTable.buffer), + glyf: new Uint8Array(glyfTable.buffer) + }; + } + scale(factors) { + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + this.glyphs[i].scale(factors[i]); + } + } +} +class Glyph { + constructor({ + header = null, + simple = null, + composites = null + }) { + this.header = header; + this.simple = simple; + this.composites = composites; + } + static parse(pos, glyf) { + const [read, header] = GlyphHeader.parse(pos, glyf); + pos += read; + if (header.numberOfContours < 0) { + const composites = []; + while (true) { + const [n, composite] = CompositeGlyph.parse(pos, glyf); + pos += n; + composites.push(composite); + if (!(composite.flags & MORE_COMPONENTS)) { + break; + } + } + return new Glyph({ + header, + composites + }); + } + const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); + return new Glyph({ + header, + simple + }); + } + getSize() { + if (!this.header) { + return 0; + } + const size = this.simple ? this.simple.getSize() : this.composites.reduce((a, c) => a + c.getSize(), 0); + return this.header.getSize() + size; + } + write(pos, buf) { + if (!this.header) { + return 0; + } + const spos = pos; + pos += this.header.write(pos, buf); + if (this.simple) { + pos += this.simple.write(pos, buf); + } else { + for (const composite of this.composites) { + pos += composite.write(pos, buf); + } + } + return pos - spos; + } + scale(factor) { + if (!this.header) { + return; + } + const xMiddle = (this.header.xMin + this.header.xMax) / 2; + this.header.scale(xMiddle, factor); + if (this.simple) { + this.simple.scale(xMiddle, factor); + } else { + for (const composite of this.composites) { + composite.scale(xMiddle, factor); + } + } + } +} +class GlyphHeader { + constructor({ + numberOfContours, + xMin, + yMin, + xMax, + yMax + }) { + this.numberOfContours = numberOfContours; + this.xMin = xMin; + this.yMin = yMin; + this.xMax = xMax; + this.yMax = yMax; + } + static parse(pos, glyf) { + return [10, new GlyphHeader({ + numberOfContours: glyf.getInt16(pos), + xMin: glyf.getInt16(pos + 2), + yMin: glyf.getInt16(pos + 4), + xMax: glyf.getInt16(pos + 6), + yMax: glyf.getInt16(pos + 8) + })]; + } + getSize() { + return 10; + } + write(pos, buf) { + buf.setInt16(pos, this.numberOfContours); + buf.setInt16(pos + 2, this.xMin); + buf.setInt16(pos + 4, this.yMin); + buf.setInt16(pos + 6, this.xMax); + buf.setInt16(pos + 8, this.yMax); + return 10; + } + scale(x, factor) { + this.xMin = Math.round(x + (this.xMin - x) * factor); + this.xMax = Math.round(x + (this.xMax - x) * factor); + } +} +class Contour { + constructor({ + flags, + xCoordinates, + yCoordinates + }) { + this.xCoordinates = xCoordinates; + this.yCoordinates = yCoordinates; + this.flags = flags; + } +} +class SimpleGlyph { + constructor({ + contours, + instructions + }) { + this.contours = contours; + this.instructions = instructions; + } + static parse(pos, glyf, numberOfContours) { + const endPtsOfContours = []; + for (let i = 0; i < numberOfContours; i++) { + const endPt = glyf.getUint16(pos); + pos += 2; + endPtsOfContours.push(endPt); + } + const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1; + const instructionLength = glyf.getUint16(pos); + pos += 2; + const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + const flags = []; + for (let i = 0; i < numberOfPt; pos++, i++) { + let flag = glyf.getUint8(pos); + flags.push(flag); + if (flag & REPEAT_FLAG) { + const count = glyf.getUint8(++pos); + flag ^= REPEAT_FLAG; + for (let m = 0; m < count; m++) { + flags.push(flag); + } + i += count; + } + } + const allXCoordinates = []; + let xCoordinates = []; + let yCoordinates = []; + let pointFlags = []; + const contours = []; + let endPtsOfContoursIndex = 0; + let lastCoordinate = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + const x = glyf.getUint8(pos++); + lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; + xCoordinates.push(lastCoordinate); + } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { + xCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + xCoordinates.push(lastCoordinate); + } + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + endPtsOfContoursIndex++; + allXCoordinates.push(xCoordinates); + xCoordinates = []; + } + } + lastCoordinate = 0; + endPtsOfContoursIndex = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + const y = glyf.getUint8(pos++); + lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y; + yCoordinates.push(lastCoordinate); + } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) { + yCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + yCoordinates.push(lastCoordinate); + } + pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + xCoordinates = allXCoordinates[endPtsOfContoursIndex]; + endPtsOfContoursIndex++; + contours.push(new Contour({ + flags: pointFlags, + xCoordinates, + yCoordinates + })); + yCoordinates = []; + pointFlags = []; + } + } + return new SimpleGlyph({ + contours, + instructions + }); + } + getSize() { + let size = this.contours.length * 2 + 2 + this.instructions.length; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + size += contour.flags.length; + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + const x = contour.xCoordinates[i]; + const y = contour.yCoordinates[i]; + let abs = Math.abs(x - lastX); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastX = x; + abs = Math.abs(y - lastY); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastY = y; + } + } + return size; + } + write(pos, buf) { + const spos = pos; + const xCoordinates = []; + const yCoordinates = []; + const flags = []; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + let flag = contour.flags[i]; + const x = contour.xCoordinates[i]; + let delta = x - lastX; + if (delta === 0) { + flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; + xCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR; + xCoordinates.push(abs); + } else { + xCoordinates.push(delta); + } + } + lastX = x; + const y = contour.yCoordinates[i]; + delta = y - lastY; + if (delta === 0) { + flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; + yCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR; + yCoordinates.push(abs); + } else { + yCoordinates.push(delta); + } + } + lastY = y; + flags.push(flag); + } + buf.setUint16(pos, xCoordinates.length - 1); + pos += 2; + } + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + for (const flag of flags) { + buf.setUint8(pos++, flag); + } + for (let i = 0, ii = xCoordinates.length; i < ii; i++) { + const x = xCoordinates[i]; + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + buf.setUint8(pos++, x); + } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { + buf.setInt16(pos, x); + pos += 2; + } + } + for (let i = 0, ii = yCoordinates.length; i < ii; i++) { + const y = yCoordinates[i]; + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + buf.setUint8(pos++, y); + } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { + buf.setInt16(pos, y); + pos += 2; + } + } + return pos - spos; + } + scale(x, factor) { + for (const contour of this.contours) { + if (contour.xCoordinates.length === 0) { + continue; + } + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); + } + } + } +} +class CompositeGlyph { + constructor({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + }) { + this.flags = flags; + this.glyphIndex = glyphIndex; + this.argument1 = argument1; + this.argument2 = argument2; + this.transf = transf; + this.instructions = instructions; + } + static parse(pos, glyf) { + const spos = pos; + const transf = []; + let flags = glyf.getUint16(pos); + const glyphIndex = glyf.getUint16(pos + 2); + pos += 4; + let argument1, argument2; + if (flags & ARG_1_AND_2_ARE_WORDS) { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt16(pos); + argument2 = glyf.getInt16(pos + 2); + } else { + argument1 = glyf.getUint16(pos); + argument2 = glyf.getUint16(pos + 2); + } + pos += 4; + flags ^= ARG_1_AND_2_ARE_WORDS; + } else { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt8(pos); + argument2 = glyf.getInt8(pos + 1); + } else { + argument1 = glyf.getUint8(pos); + argument2 = glyf.getUint8(pos + 1); + } + pos += 2; + } + if (flags & WE_HAVE_A_SCALE) { + transf.push(glyf.getUint16(pos)); + pos += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); + pos += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); + pos += 8; + } + let instructions = null; + if (flags & WE_HAVE_INSTRUCTIONS) { + const instructionLength = glyf.getUint16(pos); + pos += 2; + instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + } + return [pos - spos, new CompositeGlyph({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + })]; + } + getSize() { + let size = 2 + 2 + this.transf.length * 2; + if (this.flags & WE_HAVE_INSTRUCTIONS) { + size += 2 + this.instructions.length; + } + size += 2; + if (this.flags & 2) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + size += 2; + } + } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + size += 2; + } + return size; + } + write(pos, buf) { + const spos = pos; + if (this.flags & ARGS_ARE_XY_VALUES) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + buf.setUint16(pos, this.flags); + buf.setUint16(pos + 2, this.glyphIndex); + pos += 4; + if (this.flags & ARG_1_AND_2_ARE_WORDS) { + if (this.flags & ARGS_ARE_XY_VALUES) { + buf.setInt16(pos, this.argument1); + buf.setInt16(pos + 2, this.argument2); + } else { + buf.setUint16(pos, this.argument1); + buf.setUint16(pos + 2, this.argument2); + } + pos += 4; + } else { + buf.setUint8(pos, this.argument1); + buf.setUint8(pos + 1, this.argument2); + pos += 2; + } + if (this.flags & WE_HAVE_INSTRUCTIONS) { + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + } + return pos - spos; + } + scale(x, factor) {} +} + +;// ./src/core/opentype_file_builder.js + + +function writeInt16(dest, offset, num) { + dest[offset] = num >> 8 & 0xff; + dest[offset + 1] = num & 0xff; +} +function writeInt32(dest, offset, num) { + dest[offset] = num >> 24 & 0xff; + dest[offset + 1] = num >> 16 & 0xff; + dest[offset + 2] = num >> 8 & 0xff; + dest[offset + 3] = num & 0xff; +} +function writeData(dest, offset, data) { + if (data instanceof Uint8Array) { + dest.set(data, offset); + } else if (typeof data === "string") { + for (let i = 0, ii = data.length; i < ii; i++) { + dest[offset++] = data.charCodeAt(i) & 0xff; + } + } else { + for (const num of data) { + dest[offset++] = num & 0xff; + } + } +} +const OTF_HEADER_SIZE = 12; +const OTF_TABLE_ENTRY_SIZE = 16; +class OpenTypeFileBuilder { + constructor(sfnt) { + this.sfnt = sfnt; + this.tables = Object.create(null); + } + static getSearchParams(entriesCount, entrySize) { + let maxPower2 = 1, + log2 = 0; + while ((maxPower2 ^ entriesCount) > maxPower2) { + maxPower2 <<= 1; + log2++; + } + const searchRange = maxPower2 * entrySize; + return { + range: searchRange, + entry: log2, + rangeShift: entrySize * entriesCount - searchRange + }; + } + toArray() { + let sfnt = this.sfnt; + const tables = this.tables; + const tablesNames = Object.keys(tables); + tablesNames.sort(); + const numTables = tablesNames.length; + let i, j, jj, table, tableName; + let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; + const tableOffsets = [offset]; + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + const paddedLength = (table.length + 3 & ~3) >>> 0; + offset += paddedLength; + tableOffsets.push(offset); + } + const file = new Uint8Array(offset); + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + writeData(file, tableOffsets[i], table); + } + if (sfnt === "true") { + sfnt = string32(0x00010000); + } + file[0] = sfnt.charCodeAt(0) & 0xff; + file[1] = sfnt.charCodeAt(1) & 0xff; + file[2] = sfnt.charCodeAt(2) & 0xff; + file[3] = sfnt.charCodeAt(3) & 0xff; + writeInt16(file, 4, numTables); + const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); + writeInt16(file, 6, searchParams.range); + writeInt16(file, 8, searchParams.entry); + writeInt16(file, 10, searchParams.rangeShift); + offset = OTF_HEADER_SIZE; + for (i = 0; i < numTables; i++) { + tableName = tablesNames[i]; + file[offset] = tableName.charCodeAt(0) & 0xff; + file[offset + 1] = tableName.charCodeAt(1) & 0xff; + file[offset + 2] = tableName.charCodeAt(2) & 0xff; + file[offset + 3] = tableName.charCodeAt(3) & 0xff; + let checksum = 0; + for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { + const quad = readUint32(file, j); + checksum = checksum + quad >>> 0; + } + writeInt32(file, offset + 4, checksum); + writeInt32(file, offset + 8, tableOffsets[i]); + writeInt32(file, offset + 12, tables[tableName].length); + offset += OTF_TABLE_ENTRY_SIZE; + } + return file; + } + addTable(tag, data) { + if (tag in this.tables) { + throw new Error("Table " + tag + " already exists"); + } + this.tables[tag] = data; + } +} + +;// ./src/core/type1_parser.js + + + + +const HINTING_ENABLED = false; +const COMMAND_MAP = { + hstem: [1], + vstem: [3], + vmoveto: [4], + rlineto: [5], + hlineto: [6], + vlineto: [7], + rrcurveto: [8], + callsubr: [10], + flex: [12, 35], + drop: [12, 18], + endchar: [14], + rmoveto: [21], + hmoveto: [22], + vhcurveto: [30], + hvcurveto: [31] +}; +class Type1CharString { + constructor() { + this.width = 0; + this.lsb = 0; + this.flexing = false; + this.output = []; + this.stack = []; + } + convert(encoded, subrs, seacAnalysisEnabled) { + const count = encoded.length; + let error = false; + let wx, sbx, subrNumber; + for (let i = 0; i < count; i++) { + let value = encoded[i]; + if (value < 32) { + if (value === 12) { + value = (value << 8) + encoded[++i]; + } + switch (value) { + case 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case 3: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case 4: + if (this.flexing) { + if (this.stack.length < 1) { + error = true; + break; + } + const dy = this.stack.pop(); + this.stack.push(0, dy); + break; + } + error = this.executeCommand(1, COMMAND_MAP.vmoveto); + break; + case 5: + error = this.executeCommand(2, COMMAND_MAP.rlineto); + break; + case 6: + error = this.executeCommand(1, COMMAND_MAP.hlineto); + break; + case 7: + error = this.executeCommand(1, COMMAND_MAP.vlineto); + break; + case 8: + error = this.executeCommand(6, COMMAND_MAP.rrcurveto); + break; + case 9: + this.stack = []; + break; + case 10: + if (this.stack.length < 1) { + error = true; + break; + } + subrNumber = this.stack.pop(); + if (!subrs[subrNumber]) { + error = true; + break; + } + error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); + break; + case 11: + return error; + case 13: + if (this.stack.length < 2) { + error = true; + break; + } + wx = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx); + error = this.executeCommand(2, COMMAND_MAP.hmoveto); + break; + case 14: + this.output.push(COMMAND_MAP.endchar[0]); + break; + case 21: + if (this.flexing) { + break; + } + error = this.executeCommand(2, COMMAND_MAP.rmoveto); + break; + case 22: + if (this.flexing) { + this.stack.push(0); + break; + } + error = this.executeCommand(1, COMMAND_MAP.hmoveto); + break; + case 30: + error = this.executeCommand(4, COMMAND_MAP.vhcurveto); + break; + case 31: + error = this.executeCommand(4, COMMAND_MAP.hvcurveto); + break; + case (12 << 8) + 0: + this.stack = []; + break; + case (12 << 8) + 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case (12 << 8) + 2: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case (12 << 8) + 6: + if (seacAnalysisEnabled) { + const asb = this.stack.at(-5); + this.seac = this.stack.splice(-4, 4); + this.seac[0] += this.lsb - asb; + error = this.executeCommand(0, COMMAND_MAP.endchar); + } else { + error = this.executeCommand(4, COMMAND_MAP.endchar); + } + break; + case (12 << 8) + 7: + if (this.stack.length < 4) { + error = true; + break; + } + this.stack.pop(); + wx = this.stack.pop(); + const sby = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx, sby); + error = this.executeCommand(3, COMMAND_MAP.rmoveto); + break; + case (12 << 8) + 12: + if (this.stack.length < 2) { + error = true; + break; + } + const num2 = this.stack.pop(); + const num1 = this.stack.pop(); + this.stack.push(num1 / num2); + break; + case (12 << 8) + 16: + if (this.stack.length < 2) { + error = true; + break; + } + subrNumber = this.stack.pop(); + const numArgs = this.stack.pop(); + if (subrNumber === 0 && numArgs === 3) { + const flexArgs = this.stack.splice(-17, 17); + this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]); + error = this.executeCommand(13, COMMAND_MAP.flex, true); + this.flexing = false; + this.stack.push(flexArgs[15], flexArgs[16]); + } else if (subrNumber === 1 && numArgs === 0) { + this.flexing = true; + } + break; + case (12 << 8) + 17: + break; + case (12 << 8) + 33: + this.stack = []; + break; + default: + warn('Unknown type 1 charstring command of "' + value + '"'); + break; + } + if (error) { + break; + } + continue; + } else if (value <= 246) { + value -= 139; + } else if (value <= 250) { + value = (value - 247) * 256 + encoded[++i] + 108; + } else if (value <= 254) { + value = -((value - 251) * 256) - encoded[++i] - 108; + } else { + value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; + } + this.stack.push(value); + } + return error; + } + executeCommand(howManyArgs, command, keepStack) { + const stackLength = this.stack.length; + if (howManyArgs > stackLength) { + return true; + } + const start = stackLength - howManyArgs; + for (let i = start; i < stackLength; i++) { + let value = this.stack[i]; + if (Number.isInteger(value)) { + this.output.push(28, value >> 8 & 0xff, value & 0xff); + } else { + value = 65536 * value | 0; + this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + } + this.output.push(...command); + if (keepStack) { + this.stack.splice(start, howManyArgs); + } else { + this.stack.length = 0; + } + return false; + } +} +const EEXEC_ENCRYPT_KEY = 55665; +const CHAR_STRS_ENCRYPT_KEY = 4330; +function isHexDigit(code) { + return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102; +} +function decrypt(data, key, discardNumber) { + if (discardNumber >= data.length) { + return new Uint8Array(0); + } + const c1 = 52845, + c2 = 22719; + let r = key | 0, + i, + j; + for (i = 0; i < discardNumber; i++) { + r = (data[i] + r) * c1 + c2 & (1 << 16) - 1; + } + const count = data.length - discardNumber; + const decrypted = new Uint8Array(count); + for (i = discardNumber, j = 0; j < count; i++, j++) { + const value = data[i]; + decrypted[j] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + return decrypted; +} +function decryptAscii(data, key, discardNumber) { + const c1 = 52845, + c2 = 22719; + let r = key | 0; + const count = data.length, + maybeLength = count >>> 1; + const decrypted = new Uint8Array(maybeLength); + let i, j; + for (i = 0, j = 0; i < count; i++) { + const digit1 = data[i]; + if (!isHexDigit(digit1)) { + continue; + } + i++; + let digit2; + while (i < count && !isHexDigit(digit2 = data[i])) { + i++; + } + if (i < count) { + const value = parseInt(String.fromCharCode(digit1, digit2), 16); + decrypted[j++] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + } + return decrypted.slice(discardNumber, j); +} +function isSpecial(c) { + return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29; +} +class Type1Parser { + constructor(stream, encrypted, seacAnalysisEnabled) { + if (encrypted) { + const data = stream.getBytes(); + const isBinary = !((isHexDigit(data[0]) || isWhiteSpace(data[0])) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7])); + stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); + } + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + this.stream = stream; + this.nextChar(); + } + readNumberArray() { + this.getToken(); + const array = []; + while (true) { + const token = this.getToken(); + if (token === null || token === "]" || token === "}") { + break; + } + array.push(parseFloat(token || 0)); + } + return array; + } + readNumber() { + const token = this.getToken(); + return parseFloat(token || 0); + } + readInt() { + const token = this.getToken(); + return parseInt(token || 0, 10) | 0; + } + readBoolean() { + const token = this.getToken(); + return token === "true" ? 1 : 0; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + prevChar() { + this.stream.skip(-2); + return this.currentChar = this.stream.getByte(); + } + getToken() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch === -1) { + return null; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isWhiteSpace(ch)) { + break; + } + ch = this.nextChar(); + } + if (isSpecial(ch)) { + this.nextChar(); + return String.fromCharCode(ch); + } + let token = ""; + do { + token += String.fromCharCode(ch); + ch = this.nextChar(); + } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch)); + return token; + } + readCharStrings(bytes, lenIV) { + if (lenIV === -1) { + return bytes; + } + return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV); + } + extractFontProgram(properties) { + const stream = this.stream; + const subrs = [], + charstrings = []; + const privateData = Object.create(null); + privateData.lenIV = 4; + const program = { + subrs: [], + charstrings: [], + properties: { + privateData + } + }; + let token, length, data, lenIV; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "CharStrings": + this.getToken(); + this.getToken(); + this.getToken(); + this.getToken(); + while (true) { + token = this.getToken(); + if (token === null || token === "end") { + break; + } + if (token !== "/") { + continue; + } + const glyph = this.getToken(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } else if (token === "/") { + this.prevChar(); + } + charstrings.push({ + glyph, + encoded + }); + } + break; + case "Subrs": + this.readInt(); + this.getToken(); + while (this.getToken() === "dup") { + const index = this.readInt(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } + subrs[index] = encoded; + } + break; + case "BlueValues": + case "OtherBlues": + case "FamilyBlues": + case "FamilyOtherBlues": + const blueArray = this.readNumberArray(); + if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) { + program.properties.privateData[token] = blueArray; + } + break; + case "StemSnapH": + case "StemSnapV": + program.properties.privateData[token] = this.readNumberArray(); + break; + case "StdHW": + case "StdVW": + program.properties.privateData[token] = this.readNumberArray()[0]; + break; + case "BlueShift": + case "lenIV": + case "BlueFuzz": + case "BlueScale": + case "LanguageGroup": + program.properties.privateData[token] = this.readNumber(); + break; + case "ExpansionFactor": + program.properties.privateData[token] = this.readNumber() || 0.06; + break; + case "ForceBold": + program.properties.privateData[token] = this.readBoolean(); + break; + } + } + for (const { + encoded, + glyph + } of charstrings) { + const charString = new Type1CharString(); + const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); + let output = charString.output; + if (error) { + output = [14]; + } + const charStringObject = { + glyphName: glyph, + charstring: output, + width: charString.width, + lsb: charString.lsb, + seac: charString.seac + }; + if (glyph === ".notdef") { + program.charstrings.unshift(charStringObject); + } else { + program.charstrings.push(charStringObject); + } + if (properties.builtInEncoding) { + const index = properties.builtInEncoding.indexOf(glyph); + if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) { + properties.widths[index] = charString.width; + } + } + } + return program; + } + extractFontHeader(properties) { + let token; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "FontMatrix": + const matrix = this.readNumberArray(); + properties.fontMatrix = matrix; + break; + case "Encoding": + const encodingArg = this.getToken(); + let encoding; + if (!/^\d+$/.test(encodingArg)) { + encoding = getEncoding(encodingArg); + } else { + encoding = []; + const size = parseInt(encodingArg, 10) | 0; + this.getToken(); + for (let j = 0; j < size; j++) { + token = this.getToken(); + while (token !== "dup" && token !== "def") { + token = this.getToken(); + if (token === null) { + return; + } + } + if (token === "def") { + break; + } + const index = this.readInt(); + this.getToken(); + const glyph = this.getToken(); + encoding[index] = glyph; + this.getToken(); + } + } + properties.builtInEncoding = encoding; + break; + case "FontBBox": + const fontBBox = this.readNumberArray(); + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + break; + } + } + } +} + +;// ./src/core/type1_font.js + + + + + + +function findBlock(streamBytes, signature, startIndex) { + const streamBytesLength = streamBytes.length; + const signatureLength = signature.length; + const scanLength = streamBytesLength - signatureLength; + let i = startIndex, + found = false; + while (i < scanLength) { + let j = 0; + while (j < signatureLength && streamBytes[i + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + i += j; + while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) { + i++; + } + found = true; + break; + } + i++; + } + return { + found, + length: i + }; +} +function getHeaderBlock(stream, suggestedLength) { + const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; + const streamStartPos = stream.pos; + let headerBytes, headerBytesLength, block; + try { + headerBytes = stream.getBytes(suggestedLength); + headerBytesLength = headerBytes.length; + } catch {} + if (headerBytesLength === suggestedLength) { + block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length); + if (block.found && block.length === suggestedLength) { + return { + stream: new Stream(headerBytes), + length: suggestedLength + }; + } + } + warn('Invalid "Length1" property in Type1 font -- trying to recover.'); + stream.pos = streamStartPos; + const SCAN_BLOCK_LENGTH = 2048; + let actualLength; + while (true) { + const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); + if (block.length === 0) { + break; + } + stream.pos += block.length; + if (block.found) { + actualLength = stream.pos - streamStartPos; + break; + } + } + stream.pos = streamStartPos; + if (actualLength) { + return { + stream: new Stream(stream.getBytes(actualLength)), + length: actualLength + }; + } + warn('Unable to recover "Length1" property in Type1 font -- using as is.'); + return { + stream: new Stream(stream.getBytes(suggestedLength)), + length: suggestedLength + }; +} +function getEexecBlock(stream, suggestedLength) { + const eexecBytes = stream.getBytes(); + if (eexecBytes.length === 0) { + throw new FormatError("getEexecBlock - no font program found."); + } + return { + stream: new Stream(eexecBytes), + length: eexecBytes.length + }; +} +class Type1Font { + constructor(name, file, properties) { + const PFB_HEADER_SIZE = 6; + let headerBlockLength = properties.length1; + let eexecBlockLength = properties.length2; + let pfbHeader = file.peekBytes(PFB_HEADER_SIZE); + const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; + if (pfbHeaderPresent) { + file.skip(PFB_HEADER_SIZE); + headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + const headerBlock = getHeaderBlock(file, headerBlockLength); + const headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED); + headerBlockParser.extractFontHeader(properties); + if (pfbHeaderPresent) { + pfbHeader = file.getBytes(PFB_HEADER_SIZE); + eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + const eexecBlock = getEexecBlock(file, eexecBlockLength); + const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); + const data = eexecBlockParser.extractFontProgram(properties); + for (const key in data.properties) { + properties[key] = data.properties[key]; + } + const charstrings = data.charstrings; + const type2Charstrings = this.getType2Charstrings(charstrings); + const subrs = this.getType2Subrs(data.subrs); + this.charstrings = charstrings; + this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); + this.seacs = this.getSeacs(data.charstrings); + } + get numGlyphs() { + return this.charstrings.length + 1; + } + getCharset() { + const charset = [".notdef"]; + for (const { + glyphName + } of this.charstrings) { + charset.push(glyphName); + } + return charset; + } + getGlyphMapping(properties) { + const charstrings = this.charstrings; + if (properties.composite) { + const charCodeToGlyphId = Object.create(null); + for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) { + const charCode = properties.cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId + 1; + } + return charCodeToGlyphId; + } + const glyphNames = [".notdef"]; + let builtInEncoding, glyphId; + for (glyphId = 0; glyphId < charstrings.length; glyphId++) { + glyphNames.push(charstrings[glyphId].glyphName); + } + const encoding = properties.builtInEncoding; + if (encoding) { + builtInEncoding = Object.create(null); + for (const charCode in encoding) { + glyphId = glyphNames.indexOf(encoding[charCode]); + if (glyphId >= 0) { + builtInEncoding[charCode] = glyphId; + } + } + } + return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); + } + hasGlyphId(id) { + if (id < 0 || id >= this.numGlyphs) { + return false; + } + if (id === 0) { + return true; + } + const glyph = this.charstrings[id - 1]; + return glyph.charstring.length > 0; + } + getSeacs(charstrings) { + const seacMap = []; + for (let i = 0, ii = charstrings.length; i < ii; i++) { + const charstring = charstrings[i]; + if (charstring.seac) { + seacMap[i + 1] = charstring.seac; + } + } + return seacMap; + } + getType2Charstrings(type1Charstrings) { + const type2Charstrings = []; + for (const type1Charstring of type1Charstrings) { + type2Charstrings.push(type1Charstring.charstring); + } + return type2Charstrings; + } + getType2Subrs(type1Subrs) { + let bias = 0; + const count = type1Subrs.length; + if (count < 1133) { + bias = 107; + } else if (count < 33769) { + bias = 1131; + } else { + bias = 32768; + } + const type2Subrs = []; + let i; + for (i = 0; i < bias; i++) { + type2Subrs.push([0x0b]); + } + for (i = 0; i < count; i++) { + type2Subrs.push(type1Subrs[i]); + } + return type2Subrs; + } + wrap(name, glyphs, charstrings, subrs, properties) { + const cff = new CFF(); + cff.header = new CFFHeader(1, 0, 4, 4); + cff.names = [name]; + const topDict = new CFFTopDict(); + topDict.setByName("version", 391); + topDict.setByName("Notice", 392); + topDict.setByName("FullName", 393); + topDict.setByName("FamilyName", 394); + topDict.setByName("Weight", 395); + topDict.setByName("Encoding", null); + topDict.setByName("FontMatrix", properties.fontMatrix); + topDict.setByName("FontBBox", properties.bbox); + topDict.setByName("charset", null); + topDict.setByName("CharStrings", null); + topDict.setByName("Private", null); + cff.topDict = topDict; + const strings = new CFFStrings(); + strings.add("Version 0.11"); + strings.add("See original notice"); + strings.add(name); + strings.add(name); + strings.add("Medium"); + cff.strings = strings; + cff.globalSubrIndex = new CFFIndex(); + const count = glyphs.length; + const charsetArray = [".notdef"]; + let i, ii; + for (i = 0; i < count; i++) { + const glyphName = charstrings[i].glyphName; + const index = CFFStandardStrings.indexOf(glyphName); + if (index === -1) { + strings.add(glyphName); + } + charsetArray.push(glyphName); + } + cff.charset = new CFFCharset(false, 0, charsetArray); + const charStringsIndex = new CFFIndex(); + charStringsIndex.add([0x8b, 0x0e]); + for (i = 0; i < count; i++) { + charStringsIndex.add(glyphs[i]); + } + cff.charStrings = charStringsIndex; + const privateDict = new CFFPrivateDict(); + privateDict.setByName("Subrs", null); + const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"]; + for (i = 0, ii = fields.length; i < ii; i++) { + const field = fields[i]; + if (!(field in properties.privateData)) { + continue; + } + const value = properties.privateData[field]; + if (Array.isArray(value)) { + for (let j = value.length - 1; j > 0; j--) { + value[j] -= value[j - 1]; + } + } + privateDict.setByName(field, value); + } + cff.topDict.privateDict = privateDict; + const subrIndex = new CFFIndex(); + for (i = 0, ii = subrs.length; i < ii; i++) { + subrIndex.add(subrs[i]); + } + privateDict.subrsIndex = subrIndex; + const compiler = new CFFCompiler(cff); + return compiler.compile(); + } +} + +;// ./src/core/fonts.js + + + + + + + + + + + + + + + + + +const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; +const PDF_GLYPH_SPACE_UNITS = 1000; +const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "subtype", "systemFontInfo", "type", "vertical"]; +const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "toFontChar", "toUnicode", "vmetrics", "widths"]; +function adjustWidths(properties) { + if (!properties.fontMatrix) { + return; + } + if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { + return; + } + const scale = 0.001 / properties.fontMatrix[0]; + const glyphsWidths = properties.widths; + for (const glyph in glyphsWidths) { + glyphsWidths[glyph] *= scale; + } + properties.defaultWidth *= scale; +} +function adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) { + if (properties.isInternalFont) { + return; + } + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (properties.hasEncoding) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + if (!isSymbolicFont) { + return; + } + if (nameRecords.length === 0) { + return; + } + if (properties.defaultEncoding === WinAnsiEncoding) { + return; + } + for (const r of nameRecords) { + if (!isWinNameRecord(r)) { + return; + } + } + const encoding = WinAnsiEncoding; + const toUnicode = [], + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in encoding) { + const glyphName = encoding[charCode]; + if (glyphName === "") { + continue; + } + const unicode = glyphsUnicodeMap[glyphName]; + if (unicode === undefined) { + continue; + } + toUnicode[charCode] = String.fromCharCode(unicode); + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +function adjustType1ToUnicode(properties, builtInEncoding) { + if (properties.isInternalFont) { + return; + } + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (builtInEncoding === properties.defaultEncoding) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + const toUnicode = [], + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in builtInEncoding) { + if (properties.hasEncoding) { + if (properties.baseEncodingName || properties.differences[charCode] !== undefined) { + continue; + } + } + const glyphName = builtInEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + toUnicode[charCode] = String.fromCharCode(unicode); + } + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +function amendFallbackToUnicode(properties) { + if (!properties.fallbackToUnicode) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + const toUnicode = []; + for (const charCode in properties.fallbackToUnicode) { + if (properties.toUnicode.has(charCode)) { + continue; + } + toUnicode[charCode] = properties.fallbackToUnicode[charCode]; + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +class fonts_Glyph { + constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { + this.originalCharCode = originalCharCode; + this.fontChar = fontChar; + this.unicode = unicode; + this.accent = accent; + this.width = width; + this.vmetric = vmetric; + this.operatorListId = operatorListId; + this.isSpace = isSpace; + this.isInFont = isInFont; + } + get category() { + return shadow(this, "category", getCharUnicodeCategory(this.unicode), true); + } +} +function int16(b0, b1) { + return (b0 << 8) + b1; +} +function writeSignedInt16(bytes, index, value) { + bytes[index + 1] = value; + bytes[index] = value >>> 8; +} +function signedInt16(b0, b1) { + const value = (b0 << 8) + b1; + return value & 1 << 15 ? value - 0x10000 : value; +} +function writeUint32(bytes, index, value) { + bytes[index + 3] = value & 0xff; + bytes[index + 2] = value >>> 8; + bytes[index + 1] = value >>> 16; + bytes[index] = value >>> 24; +} +function int32(b0, b1, b2, b3) { + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; +} +function string16(value) { + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); +} +function safeString16(value) { + if (value > 0x7fff) { + value = 0x7fff; + } else if (value < -0x8000) { + value = -0x8000; + } + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); +} +function isTrueTypeFile(file) { + const header = file.peekBytes(4); + return readUint32(header, 0) === 0x00010000 || bytesToString(header) === "true"; +} +function isTrueTypeCollectionFile(file) { + const header = file.peekBytes(4); + return bytesToString(header) === "ttcf"; +} +function isOpenTypeFile(file) { + const header = file.peekBytes(4); + return bytesToString(header) === "OTTO"; +} +function isType1File(file) { + const header = file.peekBytes(2); + if (header[0] === 0x25 && header[1] === 0x21) { + return true; + } + if (header[0] === 0x80 && header[1] === 0x01) { + return true; + } + return false; +} +function isCFFFile(file) { + const header = file.peekBytes(4); + if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) { + return true; + } + return false; +} +function getFontFileType(file, { + type, + subtype, + composite +}) { + let fileType, fileSubtype; + if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) { + fileType = composite ? "CIDFontType2" : "TrueType"; + } else if (isOpenTypeFile(file)) { + fileType = composite ? "CIDFontType2" : "OpenType"; + } else if (isType1File(file)) { + if (composite) { + fileType = "CIDFontType0"; + } else { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + } + } else if (isCFFFile(file)) { + if (composite) { + fileType = "CIDFontType0"; + fileSubtype = "CIDFontType0C"; + } else { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + fileSubtype = "Type1C"; + } + } else { + warn("getFontFileType: Unable to detect correct font file Type/Subtype."); + fileType = type; + fileSubtype = subtype; + } + return [fileType, fileSubtype]; +} +function applyStandardFontGlyphMap(map, glyphMap) { + for (const charCode in glyphMap) { + map[+charCode] = glyphMap[charCode]; + } +} +function buildToFontChar(encoding, glyphsUnicodeMap, differences) { + const toFontChar = []; + let unicode; + for (let i = 0, ii = encoding.length; i < ii; i++) { + unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[i] = unicode; + } + } + for (const charCode in differences) { + unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[+charCode] = unicode; + } + } + return toFontChar; +} +function isMacNameRecord(r) { + return r.platform === 1 && r.encoding === 0 && r.language === 0; +} +function isWinNameRecord(r) { + return r.platform === 3 && r.encoding === 1 && r.language === 0x409; +} +function convertCidString(charCode, cid, shouldThrow = false) { + switch (cid.length) { + case 1: + return cid.charCodeAt(0); + case 2: + return cid.charCodeAt(0) << 8 | cid.charCodeAt(1); + } + const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; + if (shouldThrow) { + throw new FormatError(msg); + } + warn(msg); + return cid; +} +function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { + const newMap = Object.create(null); + const toUnicodeExtraMap = new Map(); + const toFontChar = []; + const usedGlyphIds = new Set(); + let privateUseAreaIndex = 0; + const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + let nextAvailableFontCharCode = privateUseOffetStart; + let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + const isInPrivateArea = code => PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1] || PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1]; + for (const originalCharCode in charCodeToGlyphId) { + let glyphId = charCodeToGlyphId[originalCharCode]; + if (!hasGlyph(glyphId)) { + continue; + } + if (nextAvailableFontCharCode > privateUseOffetEnd) { + privateUseAreaIndex++; + if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) { + warn("Ran out of space in font private use area."); + break; + } + nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + } + const fontCharCode = nextAvailableFontCharCode++; + if (glyphId === 0) { + glyphId = newGlyphZeroId; + } + let unicode = toUnicode.get(originalCharCode); + if (typeof unicode === "string") { + unicode = unicode.codePointAt(0); + } + if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) { + toUnicodeExtraMap.set(unicode, glyphId); + usedGlyphIds.add(glyphId); + } + newMap[fontCharCode] = glyphId; + toFontChar[originalCharCode] = fontCharCode; + } + return { + toFontChar, + charCodeToGlyphId: newMap, + toUnicodeExtraMap, + nextAvailableFontCharCode + }; +} +function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) { + const codes = []; + for (const charCode in glyphs) { + if (glyphs[charCode] >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: charCode | 0, + glyphId: glyphs[charCode] + }); + } + if (toUnicodeExtraMap) { + for (const [unicode, glyphId] of toUnicodeExtraMap) { + if (glyphId >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: unicode, + glyphId + }); + } + } + if (codes.length === 0) { + codes.push({ + fontCharCode: 0, + glyphId: 0 + }); + } + codes.sort(function fontGetRangesSort(a, b) { + return a.fontCharCode - b.fontCharCode; + }); + const ranges = []; + const length = codes.length; + for (let n = 0; n < length;) { + const start = codes[n].fontCharCode; + const codeIndices = [codes[n].glyphId]; + ++n; + let end = start; + while (n < length && end + 1 === codes[n].fontCharCode) { + codeIndices.push(codes[n].glyphId); + ++end; + ++n; + if (end === 0xffff) { + break; + } + } + ranges.push([start, end, codeIndices]); + } + return ranges; +} +function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) { + const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs); + const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1; + let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + string32(4 + numTables * 8); + let i, ii, j, jj; + for (i = ranges.length - 1; i >= 0; --i) { + if (ranges[i][0] <= 0xffff) { + break; + } + } + const bmpLength = i + 1; + if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) { + ranges[i][1] = 0xfffe; + } + const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0; + const segCount = bmpLength + trailingRangesCount; + const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); + let startCount = ""; + let endCount = ""; + let idDeltas = ""; + let idRangeOffsets = ""; + let glyphsIds = ""; + let bias = 0; + let range, start, end, codes; + for (i = 0, ii = bmpLength; i < ii; i++) { + range = ranges[i]; + start = range[0]; + end = range[1]; + startCount += string16(start); + endCount += string16(end); + codes = range[2]; + let contiguous = true; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + contiguous = false; + break; + } + } + if (!contiguous) { + const offset = (segCount - i) * 2 + bias * 2; + bias += end - start + 1; + idDeltas += string16(0); + idRangeOffsets += string16(offset); + for (j = 0, jj = codes.length; j < jj; ++j) { + glyphsIds += string16(codes[j]); + } + } else { + const startCode = codes[0]; + idDeltas += string16(startCode - start & 0xffff); + idRangeOffsets += string16(0); + } + } + if (trailingRangesCount > 0) { + endCount += "\xFF\xFF"; + startCount += "\xFF\xFF"; + idDeltas += "\x00\x01"; + idRangeOffsets += "\x00\x00"; + } + const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + idDeltas + idRangeOffsets + glyphsIds; + let format31012 = ""; + let header31012 = ""; + if (numTables > 1) { + cmap += "\x00\x03" + "\x00\x0A" + string32(4 + numTables * 8 + 4 + format314.length); + format31012 = ""; + for (i = 0, ii = ranges.length; i < ii; i++) { + range = ranges[i]; + start = range[0]; + codes = range[2]; + let code = codes[0]; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + end = range[0] + j - 1; + format31012 += string32(start) + string32(end) + string32(code); + start = end + 1; + code = codes[j]; + } + } + format31012 += string32(start) + string32(range[1]) + string32(code); + } + header31012 = "\x00\x0C" + "\x00\x00" + string32(format31012.length + 16) + "\x00\x00\x00\x00" + string32(format31012.length / 12); + } + return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012; +} +function validateOS2Table(os2, file) { + file.pos = (file.start || 0) + os2.offset; + const version = file.getUint16(); + file.skip(60); + const selection = file.getUint16(); + if (version < 4 && selection & 0x0300) { + return false; + } + const firstChar = file.getUint16(); + const lastChar = file.getUint16(); + if (firstChar > lastChar) { + return false; + } + file.skip(6); + const usWinAscent = file.getUint16(); + if (usWinAscent === 0) { + return false; + } + os2.data[8] = os2.data[9] = 0; + return true; +} +function createOS2Table(properties, charstrings, override) { + override ||= { + unitsPerEm: 0, + yMax: 0, + yMin: 0, + ascent: 0, + descent: 0 + }; + let ulUnicodeRange1 = 0; + let ulUnicodeRange2 = 0; + let ulUnicodeRange3 = 0; + let ulUnicodeRange4 = 0; + let firstCharIndex = null; + let lastCharIndex = 0; + let position = -1; + if (charstrings) { + for (let code in charstrings) { + code |= 0; + if (firstCharIndex > code || !firstCharIndex) { + firstCharIndex = code; + } + if (lastCharIndex < code) { + lastCharIndex = code; + } + position = getUnicodeRangeFor(code, position); + if (position < 32) { + ulUnicodeRange1 |= 1 << position; + } else if (position < 64) { + ulUnicodeRange2 |= 1 << position - 32; + } else if (position < 96) { + ulUnicodeRange3 |= 1 << position - 64; + } else if (position < 123) { + ulUnicodeRange4 |= 1 << position - 96; + } else { + throw new FormatError("Unicode ranges Bits > 123 are reserved for internal usage"); + } + } + if (lastCharIndex > 0xffff) { + lastCharIndex = 0xffff; + } + } else { + firstCharIndex = 0; + lastCharIndex = 255; + } + const bbox = properties.bbox || [0, 0, 0, 0]; + const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000); + const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; + const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); + let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); + if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { + typoDescent = -typoDescent; + } + const winAscent = override.yMax || typoAscent; + const winDescent = -override.yMin || -typoDescent; + return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + "\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + "\x00\x00\x00\x00\x00\x00" + string32(ulUnicodeRange1) + string32(ulUnicodeRange2) + string32(ulUnicodeRange3) + string32(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + "\x00\x03"; +} +function createPostTable(properties) { + const angle = Math.floor(properties.italicAngle * 2 ** 16); + return "\x00\x03\x00\x00" + string32(angle) + "\x00\x00" + "\x00\x00" + string32(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00"; +} +function createPostscriptName(name) { + return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); +} +function createNameTable(name, proto) { + if (!proto) { + proto = [[], []]; + } + const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"]; + const stringsUnicode = []; + let i, ii, j, jj, str; + for (i = 0, ii = strings.length; i < ii; i++) { + str = proto[1][i] || strings[i]; + const strBufUnicode = []; + for (j = 0, jj = str.length; j < jj; j++) { + strBufUnicode.push(string16(str.charCodeAt(j))); + } + stringsUnicode.push(strBufUnicode.join("")); + } + const names = [strings, stringsUnicode]; + const platforms = ["\x00\x01", "\x00\x03"]; + const encodings = ["\x00\x00", "\x00\x01"]; + const languages = ["\x00\x00", "\x04\x09"]; + const namesRecordCount = strings.length * platforms.length; + let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6); + let strOffset = 0; + for (i = 0, ii = platforms.length; i < ii; i++) { + const strs = names[i]; + for (j = 0, jj = strs.length; j < jj; j++) { + str = strs[j]; + const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset); + nameTable += nameRecord; + strOffset += str.length; + } + } + nameTable += strings.join("") + stringsUnicode.join(""); + return nameTable; +} +class Font { + constructor(name, file, properties) { + this.name = name; + this.psName = null; + this.mimetype = null; + this.disableFontFace = false; + this.loadedName = properties.loadedName; + this.isType3Font = properties.isType3Font; + this.missingFile = false; + this.cssFontInfo = properties.cssFontInfo; + this._charsCache = Object.create(null); + this._glyphCache = Object.create(null); + let isSerifFont = !!(properties.flags & FontFlags.Serif); + if (!isSerifFont && !properties.isSimulatedFlags) { + const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0], + serifFonts = getSerifFonts(); + for (const namePart of baseName.split("+")) { + if (serifFonts[namePart]) { + isSerifFont = true; + break; + } + } + } + this.isSerifFont = isSerifFont; + this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); + let { + type, + subtype + } = properties; + this.type = type; + this.subtype = subtype; + this.systemFontInfo = properties.systemFontInfo; + const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/); + this.isInvalidPDFjsFont = !!matches; + if (this.isInvalidPDFjsFont) { + this.fallbackName = matches[1]; + } else if (this.isMonospace) { + this.fallbackName = "monospace"; + } else if (this.isSerifFont) { + this.fallbackName = "serif"; + } else { + this.fallbackName = "sans-serif"; + } + if (this.systemFontInfo?.guessFallback) { + this.systemFontInfo.guessFallback = false; + this.systemFontInfo.css += `,${this.fallbackName}`; + } + this.differences = properties.differences; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.composite = properties.composite; + this.cMap = properties.cMap; + this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS; + this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; + this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; + this.lineHeight = this.ascent - this.descent; + this.fontMatrix = properties.fontMatrix; + this.bbox = properties.bbox; + this.defaultEncoding = properties.defaultEncoding; + this.toUnicode = properties.toUnicode; + this.toFontChar = []; + if (properties.type === "Type3") { + for (let charCode = 0; charCode < 256; charCode++) { + this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode]; + } + return; + } + this.cidEncoding = properties.cidEncoding || ""; + this.vertical = !!properties.vertical; + if (this.vertical) { + this.vmetrics = properties.vmetrics; + this.defaultVMetrics = properties.defaultVMetrics; + } + if (!file || file.isEmpty) { + if (file) { + warn('Font file is empty in "' + name + '" (' + this.loadedName + ")"); + } + this.fallbackToSystemFont(properties); + return; + } + [type, subtype] = getFontFileType(file, properties); + if (type !== this.type || subtype !== this.subtype) { + info("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`); + } + let data; + try { + switch (type) { + case "MMType1": + info("MMType1 font (" + name + "), falling back to Type1."); + case "Type1": + case "CIDFontType0": + this.mimetype = "font/opentype"; + const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new CFFFont(file, properties) : new Type1Font(name, file, properties); + adjustWidths(properties); + data = this.convert(name, cff, properties); + break; + case "OpenType": + case "TrueType": + case "CIDFontType2": + this.mimetype = "font/opentype"; + data = this.checkAndRepair(name, file, properties); + if (this.isOpenType) { + adjustWidths(properties); + type = "OpenType"; + } + break; + default: + throw new FormatError(`Font ${type} is not supported`); + } + } catch (e) { + warn(e); + this.fallbackToSystemFont(properties); + return; + } + amendFallbackToUnicode(properties); + this.data = data; + this.type = type; + this.subtype = subtype; + this.fontMatrix = properties.fontMatrix; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.toUnicode = properties.toUnicode; + this.seacMap = properties.seacMap; + } + get renderer() { + const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); + return shadow(this, "renderer", renderer); + } + exportData(extraProperties = false) { + const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES; + const data = Object.create(null); + let property, value; + for (property of exportDataProperties) { + value = this[property]; + if (value !== undefined) { + data[property] = value; + } + } + return data; + } + fallbackToSystemFont(properties) { + this.missingFile = true; + const { + name, + type + } = this; + let fontName = normalizeFontName(name); + const stdFontMap = getStdFontMap(), + nonStdFontMap = getNonStdFontMap(); + const isStandardFont = !!stdFontMap[fontName]; + const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + const fontBasicMetricsMap = getFontBasicMetrics(); + const metrics = fontBasicMetricsMap[fontName]; + if (metrics) { + if (isNaN(this.ascent)) { + this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.descent)) { + this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.capHeight)) { + this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS; + } + } + this.bold = /bold/gi.test(fontName); + this.italic = /oblique|italic/gi.test(fontName); + this.black = /Black/g.test(name); + const isNarrow = /Narrow/g.test(name); + this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; + if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) { + const cidToGidMap = properties.cidToGidMap; + const map = []; + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + if (/Arial-?Black/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack()); + } else if (/Calibri/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri()); + } + if (cidToGidMap) { + for (const charCode in map) { + const cid = map[charCode]; + if (cidToGidMap[cid] !== undefined) { + map[+charCode] = cidToGidMap[cid]; + } + } + if (cidToGidMap.length !== this.toUnicode.length && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof IdentityToUnicodeMap) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + const cid = map[charCode]; + if (cidToGidMap[cid] === undefined) { + map[+charCode] = unicodeCharCode; + } + }); + } + } + if (!(this.toUnicode instanceof IdentityToUnicodeMap)) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + this.toUnicode = new ToUnicodeMap(map); + } else if (/Symbol/i.test(fontName)) { + this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), this.differences); + } else if (/Dingbats/i.test(fontName)) { + this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), this.differences); + } else if (isStandardFont || isMappedToStandardFont) { + const map = buildToFontChar(this.defaultEncoding, getGlyphsUnicode(), this.differences); + if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof IdentityToUnicodeMap)) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + } else { + const glyphsUnicodeMap = getGlyphsUnicode(); + const map = []; + this.toUnicode.forEach((charCode, unicodeCharCode) => { + if (!this.composite) { + const glyphName = this.differences[charCode] || this.defaultEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + unicodeCharCode = unicode; + } + } + map[+charCode] = unicodeCharCode; + }); + if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) { + if (/Tahoma|Verdana/i.test(name)) { + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + } + } + this.toFontChar = map; + } + amendFallbackToUnicode(properties); + this.loadedName = fontName.split("-", 1)[0]; + } + checkAndRepair(name, font, properties) { + const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "]; + function readTables(file, numTables) { + const tables = Object.create(null); + tables["OS/2"] = null; + tables.cmap = null; + tables.head = null; + tables.hhea = null; + tables.hmtx = null; + tables.maxp = null; + tables.name = null; + tables.post = null; + for (let i = 0; i < numTables; i++) { + const table = readTableEntry(file); + if (!VALID_TABLES.includes(table.tag)) { + continue; + } + if (table.length === 0) { + continue; + } + tables[table.tag] = table; + } + return tables; + } + function readTableEntry(file) { + const tag = file.getString(4); + const checksum = file.getInt32() >>> 0; + const offset = file.getInt32() >>> 0; + const length = file.getInt32() >>> 0; + const previousPosition = file.pos; + file.pos = file.start || 0; + file.skip(offset); + const data = file.getBytes(length); + file.pos = previousPosition; + if (tag === "head") { + data[8] = data[9] = data[10] = data[11] = 0; + data[17] |= 0x20; + } + return { + tag, + checksum, + length, + offset, + data + }; + } + function readOpenTypeHeader(ttf) { + return { + version: ttf.getString(4), + numTables: ttf.getUint16(), + searchRange: ttf.getUint16(), + entrySelector: ttf.getUint16(), + rangeShift: ttf.getUint16() + }; + } + function readTrueTypeCollectionHeader(ttc) { + const ttcTag = ttc.getString(4); + assert(ttcTag === "ttcf", "Must be a TrueType Collection font."); + const majorVersion = ttc.getUint16(); + const minorVersion = ttc.getUint16(); + const numFonts = ttc.getInt32() >>> 0; + const offsetTable = []; + for (let i = 0; i < numFonts; i++) { + offsetTable.push(ttc.getInt32() >>> 0); + } + const header = { + ttcTag, + majorVersion, + minorVersion, + numFonts, + offsetTable + }; + switch (majorVersion) { + case 1: + return header; + case 2: + header.dsigTag = ttc.getInt32() >>> 0; + header.dsigLength = ttc.getInt32() >>> 0; + header.dsigOffset = ttc.getInt32() >>> 0; + return header; + } + throw new FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`); + } + function readTrueTypeCollectionData(ttc, fontName) { + const { + numFonts, + offsetTable + } = readTrueTypeCollectionHeader(ttc); + const fontNameParts = fontName.split("+"); + let fallbackData; + for (let i = 0; i < numFonts; i++) { + ttc.pos = (ttc.start || 0) + offsetTable[i]; + const potentialHeader = readOpenTypeHeader(ttc); + const potentialTables = readTables(ttc, potentialHeader.numTables); + if (!potentialTables.name) { + throw new FormatError('TrueType Collection font must contain a "name" table.'); + } + const [nameTable] = readNameTable(potentialTables.name); + for (let j = 0, jj = nameTable.length; j < jj; j++) { + for (let k = 0, kk = nameTable[j].length; k < kk; k++) { + const nameEntry = nameTable[j][k]?.replaceAll(/\s/g, ""); + if (!nameEntry) { + continue; + } + if (nameEntry === fontName) { + return { + header: potentialHeader, + tables: potentialTables + }; + } + if (fontNameParts.length < 2) { + continue; + } + for (const part of fontNameParts) { + if (nameEntry === part) { + fallbackData = { + name: part, + header: potentialHeader, + tables: potentialTables + }; + } + } + } + } + } + if (fallbackData) { + warn(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`); + return { + header: fallbackData.header, + tables: fallbackData.tables + }; + } + throw new FormatError(`TrueType Collection does not contain "${fontName}" font.`); + } + function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) { + if (!cmap) { + warn("No cmap table available."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + let segment; + let start = (file.start || 0) + cmap.offset; + file.pos = start; + file.skip(2); + const numTables = file.getUint16(); + let potentialTable; + let canBreak = false; + for (let i = 0; i < numTables; i++) { + const platformId = file.getUint16(); + const encodingId = file.getUint16(); + const offset = file.getInt32() >>> 0; + let useTable = false; + if (potentialTable?.platformId === platformId && potentialTable?.encodingId === encodingId) { + continue; + } + if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) { + useTable = true; + } else if (platformId === 1 && encodingId === 0) { + useTable = true; + } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) { + useTable = true; + if (!isSymbolicFont) { + canBreak = true; + } + } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { + useTable = true; + let correctlySorted = true; + if (i < numTables - 1) { + const nextBytes = file.peekBytes(2), + nextPlatformId = int16(nextBytes[0], nextBytes[1]); + if (nextPlatformId < platformId) { + correctlySorted = false; + } + } + if (correctlySorted) { + canBreak = true; + } + } + if (useTable) { + potentialTable = { + platformId, + encodingId, + offset + }; + } + if (canBreak) { + break; + } + } + if (potentialTable) { + file.pos = start + potentialTable.offset; + } + if (!potentialTable || file.peekByte() === -1) { + warn("Could not find a preferred cmap table."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + const format = file.getUint16(); + let hasShortCmap = false; + const mappings = []; + let j, glyphId; + if (format === 0) { + file.skip(2 + 2); + for (j = 0; j < 256; j++) { + const index = file.getByte(); + if (!index) { + continue; + } + mappings.push({ + charCode: j, + glyphId: index + }); + } + hasShortCmap = true; + } else if (format === 2) { + file.skip(2 + 2); + const subHeaderKeys = []; + let maxSubHeaderKey = 0; + for (let i = 0; i < 256; i++) { + const subHeaderKey = file.getUint16() >> 3; + subHeaderKeys.push(subHeaderKey); + maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey); + } + const subHeaders = []; + for (let i = 0; i <= maxSubHeaderKey; i++) { + subHeaders.push({ + firstCode: file.getUint16(), + entryCount: file.getUint16(), + idDelta: signedInt16(file.getByte(), file.getByte()), + idRangePos: file.pos + file.getUint16() + }); + } + for (let i = 0; i < 256; i++) { + if (subHeaderKeys[i] === 0) { + file.pos = subHeaders[0].idRangePos + 2 * i; + glyphId = file.getUint16(); + mappings.push({ + charCode: i, + glyphId + }); + } else { + const s = subHeaders[subHeaderKeys[i]]; + for (j = 0; j < s.entryCount; j++) { + const charCode = (i << 8) + j + s.firstCode; + file.pos = s.idRangePos + 2 * j; + glyphId = file.getUint16(); + if (glyphId !== 0) { + glyphId = (glyphId + s.idDelta) % 65536; + } + mappings.push({ + charCode, + glyphId + }); + } + } + } + } else if (format === 4) { + file.skip(2 + 2); + const segCount = file.getUint16() >> 1; + file.skip(6); + const segments = []; + let segIndex; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments.push({ + end: file.getUint16() + }); + } + file.skip(2); + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].start = file.getUint16(); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].delta = file.getUint16(); + } + let offsetsCount = 0, + offsetIndex; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + const rangeOffset = file.getUint16(); + if (!rangeOffset) { + segment.offsetIndex = -1; + continue; + } + offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); + segment.offsetIndex = offsetIndex; + offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1); + } + const offsets = []; + for (j = 0; j < offsetsCount; j++) { + offsets.push(file.getUint16()); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + start = segment.start; + const end = segment.end; + const delta = segment.delta; + offsetIndex = segment.offsetIndex; + for (j = start; j <= end; j++) { + if (j === 0xffff) { + continue; + } + glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; + glyphId = glyphId + delta & 0xffff; + mappings.push({ + charCode: j, + glyphId + }); + } + } + } else if (format === 6) { + file.skip(2 + 2); + const firstCode = file.getUint16(); + const entryCount = file.getUint16(); + for (j = 0; j < entryCount; j++) { + glyphId = file.getUint16(); + const charCode = firstCode + j; + mappings.push({ + charCode, + glyphId + }); + } + } else if (format === 12) { + file.skip(2 + 4 + 4); + const nGroups = file.getInt32() >>> 0; + for (j = 0; j < nGroups; j++) { + const startCharCode = file.getInt32() >>> 0; + const endCharCode = file.getInt32() >>> 0; + let glyphCode = file.getInt32() >>> 0; + for (let charCode = startCharCode; charCode <= endCharCode; charCode++) { + mappings.push({ + charCode, + glyphId: glyphCode++ + }); + } + } + } else { + warn("cmap table has unsupported format: " + format); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + mappings.sort(function (a, b) { + return a.charCode - b.charCode; + }); + for (let i = 1; i < mappings.length; i++) { + if (mappings[i - 1].charCode === mappings[i].charCode) { + mappings.splice(i, 1); + i--; + } + } + return { + platformId: potentialTable.platformId, + encodingId: potentialTable.encodingId, + mappings, + hasShortCmap + }; + } + function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) { + if (!header) { + if (metrics) { + metrics.data = null; + } + return; + } + file.pos = (file.start || 0) + header.offset; + file.pos += 4; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + const caretOffset = file.getUint16(); + file.pos += 8; + file.pos += 2; + let numOfMetrics = file.getUint16(); + if (caretOffset !== 0) { + const macStyle = int16(headTable.data[44], headTable.data[45]); + if (!(macStyle & 2)) { + header.data[22] = 0; + header.data[23] = 0; + } + } + if (numOfMetrics > numGlyphs) { + info(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs (${numGlyphs}).`); + numOfMetrics = numGlyphs; + header.data[34] = (numOfMetrics & 0xff00) >> 8; + header.data[35] = numOfMetrics & 0x00ff; + } + const numOfSidebearings = numGlyphs - numOfMetrics; + const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1); + if (numMissing > 0) { + const entries = new Uint8Array(metrics.length + numMissing * 2); + entries.set(metrics.data); + if (dupFirstEntry) { + entries[metrics.length] = metrics.data[2]; + entries[metrics.length + 1] = metrics.data[3]; + } + metrics.data = entries; + } + } + function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) { + const glyphProfile = { + length: 0, + sizeOfInstructions: 0 + }; + if (sourceStart < 0 || sourceStart >= source.length || sourceEnd > source.length || sourceEnd - sourceStart <= 12) { + return glyphProfile; + } + const glyf = source.subarray(sourceStart, sourceEnd); + const xMin = signedInt16(glyf[2], glyf[3]); + const yMin = signedInt16(glyf[4], glyf[5]); + const xMax = signedInt16(glyf[6], glyf[7]); + const yMax = signedInt16(glyf[8], glyf[9]); + if (xMin > xMax) { + writeSignedInt16(glyf, 2, xMax); + writeSignedInt16(glyf, 6, xMin); + } + if (yMin > yMax) { + writeSignedInt16(glyf, 4, yMax); + writeSignedInt16(glyf, 8, yMin); + } + const contoursCount = signedInt16(glyf[0], glyf[1]); + if (contoursCount < 0) { + if (contoursCount < -1) { + return glyphProfile; + } + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + let i, + j = 10, + flagsCount = 0; + for (i = 0; i < contoursCount; i++) { + const endPoint = glyf[j] << 8 | glyf[j + 1]; + flagsCount = endPoint + 1; + j += 2; + } + const instructionsStart = j; + const instructionsLength = glyf[j] << 8 | glyf[j + 1]; + glyphProfile.sizeOfInstructions = instructionsLength; + j += 2 + instructionsLength; + const instructionsEnd = j; + let coordinatesLength = 0; + for (i = 0; i < flagsCount; i++) { + const flag = glyf[j++]; + if (flag & 0xc0) { + glyf[j - 1] = flag & 0x3f; + } + let xLength = 2; + if (flag & 2) { + xLength = 1; + } else if (flag & 16) { + xLength = 0; + } + let yLength = 2; + if (flag & 4) { + yLength = 1; + } else if (flag & 32) { + yLength = 0; + } + const xyLength = xLength + yLength; + coordinatesLength += xyLength; + if (flag & 8) { + const repeat = glyf[j++]; + if (repeat === 0) { + glyf[j - 1] ^= 8; + } + i += repeat; + coordinatesLength += repeat * xyLength; + } + } + if (coordinatesLength === 0) { + return glyphProfile; + } + let glyphDataLength = j + coordinatesLength; + if (glyphDataLength > glyf.length) { + return glyphProfile; + } + if (!hintsValid && instructionsLength > 0) { + dest.set(glyf.subarray(0, instructionsStart), destStart); + dest.set([0, 0], destStart + instructionsStart); + dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2); + glyphDataLength -= instructionsLength; + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + } + glyphProfile.length = glyphDataLength; + return glyphProfile; + } + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + dest.set(glyf.subarray(0, glyphDataLength), destStart); + glyphProfile.length = glyphDataLength; + return glyphProfile; + } + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + function sanitizeHead(head, numGlyphs, locaLength) { + const data = head.data; + const version = int32(data[0], data[1], data[2], data[3]); + if (version >> 16 !== 1) { + info("Attempting to fix invalid version in head table: " + version); + data[0] = 0; + data[1] = 1; + data[2] = 0; + data[3] = 0; + } + const indexToLocFormat = int16(data[50], data[51]); + if (indexToLocFormat < 0 || indexToLocFormat > 1) { + info("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat); + const numGlyphsPlusOne = numGlyphs + 1; + if (locaLength === numGlyphsPlusOne << 1) { + data[50] = 0; + data[51] = 0; + } else if (locaLength === numGlyphsPlusOne << 2) { + data[50] = 0; + data[51] = 1; + } else { + throw new FormatError("Could not fix indexToLocFormat: " + indexToLocFormat); + } + } + } + function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) { + let itemSize, itemDecode, itemEncode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = function fontItemDecodeLong(data, offset) { + return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; + }; + itemEncode = function fontItemEncodeLong(data, offset, value) { + data[offset] = value >>> 24 & 0xff; + data[offset + 1] = value >> 16 & 0xff; + data[offset + 2] = value >> 8 & 0xff; + data[offset + 3] = value & 0xff; + }; + } else { + itemSize = 2; + itemDecode = function fontItemDecode(data, offset) { + return data[offset] << 9 | data[offset + 1] << 1; + }; + itemEncode = function fontItemEncode(data, offset, value) { + data[offset] = value >> 9 & 0xff; + data[offset + 1] = value >> 1 & 0xff; + }; + } + const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs; + const locaDataSize = itemSize * (1 + numGlyphsOut); + const locaData = new Uint8Array(locaDataSize); + locaData.set(loca.data.subarray(0, locaDataSize)); + loca.data = locaData; + const oldGlyfData = glyf.data; + const oldGlyfDataLength = oldGlyfData.length; + const newGlyfData = new Uint8Array(oldGlyfDataLength); + let i, j; + const locaEntries = []; + for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) { + let offset = itemDecode(locaData, j); + if (offset > oldGlyfDataLength) { + offset = oldGlyfDataLength; + } + locaEntries.push({ + index: i, + offset, + endOffset: 0 + }); + } + locaEntries.sort((a, b) => a.offset - b.offset); + for (i = 0; i < numGlyphs; i++) { + locaEntries[i].endOffset = locaEntries[i + 1].offset; + } + locaEntries.sort((a, b) => a.index - b.index); + for (i = 0; i < numGlyphs; i++) { + const { + offset, + endOffset + } = locaEntries[i]; + if (offset !== 0 || endOffset !== 0) { + break; + } + const nextOffset = locaEntries[i + 1].offset; + if (nextOffset === 0) { + continue; + } + locaEntries[i].endOffset = nextOffset; + break; + } + const last = locaEntries.at(-2); + if (last.offset !== 0 && last.endOffset === 0) { + last.endOffset = oldGlyfDataLength; + } + const missingGlyphs = Object.create(null); + let writeOffset = 0; + itemEncode(locaData, 0, writeOffset); + for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { + const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); + const newLength = glyphProfile.length; + if (newLength === 0) { + missingGlyphs[i] = true; + } + if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) { + maxSizeOfInstructions = glyphProfile.sizeOfInstructions; + } + writeOffset += newLength; + itemEncode(locaData, j, writeOffset); + } + if (writeOffset === 0) { + const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); + for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) { + itemEncode(locaData, j, simpleGlyph.length); + } + glyf.data = simpleGlyph; + } else if (dupFirstEntry) { + const firstEntryLength = itemDecode(locaData, itemSize); + if (newGlyfData.length > firstEntryLength + writeOffset) { + glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); + } else { + glyf.data = new Uint8Array(firstEntryLength + writeOffset); + glyf.data.set(newGlyfData.subarray(0, writeOffset)); + } + glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); + itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength); + } else { + glyf.data = newGlyfData.subarray(0, writeOffset); + } + return { + missingGlyphs, + maxSizeOfInstructions + }; + } + function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) { + const start = (font.start || 0) + post.offset; + font.pos = start; + const length = post.length, + end = start + length; + const version = font.getInt32(); + font.skip(28); + let glyphNames; + let valid = true; + let i; + switch (version) { + case 0x00010000: + glyphNames = MacStandardGlyphOrdering; + break; + case 0x00020000: + const numGlyphs = font.getUint16(); + if (numGlyphs !== maxpNumGlyphs) { + valid = false; + break; + } + const glyphNameIndexes = []; + for (i = 0; i < numGlyphs; ++i) { + const index = font.getUint16(); + if (index >= 32768) { + valid = false; + break; + } + glyphNameIndexes.push(index); + } + if (!valid) { + break; + } + const customNames = [], + strBuf = []; + while (font.pos < end) { + const stringLength = font.getByte(); + strBuf.length = stringLength; + for (i = 0; i < stringLength; ++i) { + strBuf[i] = String.fromCharCode(font.getByte()); + } + customNames.push(strBuf.join("")); + } + glyphNames = []; + for (i = 0; i < numGlyphs; ++i) { + const j = glyphNameIndexes[i]; + if (j < 258) { + glyphNames.push(MacStandardGlyphOrdering[j]); + continue; + } + glyphNames.push(customNames[j - 258]); + } + break; + case 0x00030000: + break; + default: + warn("Unknown/unsupported post table version " + version); + valid = false; + if (propertiesObj.defaultEncoding) { + glyphNames = propertiesObj.defaultEncoding; + } + break; + } + propertiesObj.glyphNames = glyphNames; + return valid; + } + function readNameTable(nameTable) { + const start = (font.start || 0) + nameTable.offset; + font.pos = start; + const names = [[], []], + records = []; + const length = nameTable.length, + end = start + length; + const format = font.getUint16(); + const FORMAT_0_HEADER_LENGTH = 6; + if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { + return [names, records]; + } + const numRecords = font.getUint16(); + const stringsStart = font.getUint16(); + const NAME_RECORD_LENGTH = 12; + let i, ii; + for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) { + const r = { + platform: font.getUint16(), + encoding: font.getUint16(), + language: font.getUint16(), + name: font.getUint16(), + length: font.getUint16(), + offset: font.getUint16() + }; + if (isMacNameRecord(r) || isWinNameRecord(r)) { + records.push(r); + } + } + for (i = 0, ii = records.length; i < ii; i++) { + const record = records[i]; + if (record.length <= 0) { + continue; + } + const pos = start + stringsStart + record.offset; + if (pos + record.length > end) { + continue; + } + font.pos = pos; + const nameIndex = record.name; + if (record.encoding) { + let str = ""; + for (let j = 0, jj = record.length; j < jj; j += 2) { + str += String.fromCharCode(font.getUint16()); + } + names[1][nameIndex] = str; + } else { + names[0][nameIndex] = font.getString(record.length); + } + } + return [names, records]; + } + const TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; + function sanitizeTTProgram(table, ttContext) { + let data = table.data; + let i = 0, + j, + n, + b, + funcId, + pc, + lastEndf = 0, + lastDeff = 0; + const stack = []; + const callstack = []; + const functionsCalled = []; + let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; + let inFDEF = false, + ifLevel = 0, + inELSE = 0; + for (let ii = data.length; i < ii;) { + const op = data[i++]; + if (op === 0x40) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if (op === 0x41) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(b << 8 | data[i++]); + } + } + } else if ((op & 0xf8) === 0xb0) { + n = op - 0xb0 + 1; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if ((op & 0xf8) === 0xb8) { + n = op - 0xb8 + 1; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(signedInt16(b, data[i++])); + } + } + } else if (op === 0x2b && !tooComplexToFollowFunctions) { + if (!inFDEF && !inELSE) { + funcId = stack.at(-1); + if (isNaN(funcId)) { + info("TT: CALL empty stack (or invalid entry)."); + } else { + ttContext.functionsUsed[funcId] = true; + if (funcId in ttContext.functionsStackDeltas) { + const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId]; + if (newStackLength < 0) { + warn("TT: CALL invalid functions stack delta."); + ttContext.hintsValid = false; + return; + } + stack.length = newStackLength; + } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) { + callstack.push({ + data, + i, + stackTop: stack.length - 1 + }); + functionsCalled.push(funcId); + pc = ttContext.functionsDefined[funcId]; + if (!pc) { + warn("TT: CALL non-existent function"); + ttContext.hintsValid = false; + return; + } + data = pc.data; + i = pc.i; + } + } + } + } else if (op === 0x2c && !tooComplexToFollowFunctions) { + if (inFDEF || inELSE) { + warn("TT: nested FDEFs not allowed"); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + funcId = stack.pop(); + ttContext.functionsDefined[funcId] = { + data, + i + }; + } else if (op === 0x2d) { + if (inFDEF) { + inFDEF = false; + lastEndf = i; + } else { + pc = callstack.pop(); + if (!pc) { + warn("TT: ENDF bad stack"); + ttContext.hintsValid = false; + return; + } + funcId = functionsCalled.pop(); + data = pc.data; + i = pc.i; + ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; + } + } else if (op === 0x89) { + if (inFDEF || inELSE) { + warn("TT: nested IDEFs not allowed"); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + } else if (op === 0x58) { + ++ifLevel; + } else if (op === 0x1b) { + inELSE = ifLevel; + } else if (op === 0x59) { + if (inELSE === ifLevel) { + inELSE = 0; + } + --ifLevel; + } else if (op === 0x1c) { + if (!inFDEF && !inELSE) { + const offset = stack.at(-1); + if (offset > 0) { + i += offset - 1; + } + } + } + if (!inFDEF && !inELSE) { + let stackDelta = 0; + if (op <= 0x8e) { + stackDelta = TTOpsStackDeltas[op]; + } else if (op >= 0xc0 && op <= 0xdf) { + stackDelta = -1; + } else if (op >= 0xe0) { + stackDelta = -2; + } + if (op >= 0x71 && op <= 0x75) { + n = stack.pop(); + if (!isNaN(n)) { + stackDelta = -n * 2; + } + } + while (stackDelta < 0 && stack.length > 0) { + stack.pop(); + stackDelta++; + } + while (stackDelta > 0) { + stack.push(NaN); + stackDelta--; + } + } + } + ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; + const content = [data]; + if (i > data.length) { + content.push(new Uint8Array(i - data.length)); + } + if (lastDeff > lastEndf) { + warn("TT: complementing a missing function tail"); + content.push(new Uint8Array([0x22, 0x2d])); + } + foldTTTable(table, content); + } + function checkInvalidFunctions(ttContext, maxFunctionDefs) { + if (ttContext.tooComplexToFollowFunctions) { + return; + } + if (ttContext.functionsDefined.length > maxFunctionDefs) { + warn("TT: more functions defined than expected"); + ttContext.hintsValid = false; + return; + } + for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { + if (j > maxFunctionDefs) { + warn("TT: invalid function id: " + j); + ttContext.hintsValid = false; + return; + } + if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { + warn("TT: undefined function: " + j); + ttContext.hintsValid = false; + return; + } + } + } + function foldTTTable(table, content) { + if (content.length > 1) { + let newLength = 0; + let j, jj; + for (j = 0, jj = content.length; j < jj; j++) { + newLength += content[j].length; + } + newLength = newLength + 3 & ~3; + const result = new Uint8Array(newLength); + let pos = 0; + for (j = 0, jj = content.length; j < jj; j++) { + result.set(content[j], pos); + pos += content[j].length; + } + table.data = result; + table.length = newLength; + } + } + function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { + const ttContext = { + functionsDefined: [], + functionsUsed: [], + functionsStackDeltas: [], + tooComplexToFollowFunctions: false, + hintsValid: true + }; + if (fpgm) { + sanitizeTTProgram(fpgm, ttContext); + } + if (prep) { + sanitizeTTProgram(prep, ttContext); + } + if (fpgm) { + checkInvalidFunctions(ttContext, maxFunctionDefs); + } + if (cvt && cvt.length & 1) { + const cvtData = new Uint8Array(cvt.length + 1); + cvtData.set(cvt.data); + cvt.data = cvtData; + } + return ttContext.hintsValid; + } + font = new Stream(new Uint8Array(font.getBytes())); + let header, tables; + if (isTrueTypeCollectionFile(font)) { + const ttcData = readTrueTypeCollectionData(font, this.name); + header = ttcData.header; + tables = ttcData.tables; + } else { + header = readOpenTypeHeader(font); + tables = readTables(font, header.numTables); + } + let cff, cffFile; + const isTrueType = !tables["CFF "]; + if (!isTrueType) { + const isComposite = properties.composite && (properties.cidToGidMap?.length > 0 || !(properties.cMap instanceof IdentityCMap)); + if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { + cffFile = new Stream(tables["CFF "].data); + cff = new CFFFont(cffFile, properties); + adjustWidths(properties); + return this.convert(name, cff, properties); + } + delete tables.glyf; + delete tables.loca; + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + this.isOpenType = true; + } else { + if (!tables.loca) { + throw new FormatError('Required "loca" table is not found'); + } + if (!tables.glyf) { + warn('Required "glyf" table is not found -- trying to recover.'); + tables.glyf = { + tag: "glyf", + data: new Uint8Array(0) + }; + } + this.isOpenType = false; + } + if (!tables.maxp) { + throw new FormatError('Required "maxp" table is not found'); + } + font.pos = (font.start || 0) + tables.maxp.offset; + let version = font.getInt32(); + const numGlyphs = font.getUint16(); + if (version !== 0x00010000 && version !== 0x00005000) { + if (tables.maxp.length === 6) { + version = 0x0005000; + } else if (tables.maxp.length >= 32) { + version = 0x00010000; + } else { + throw new FormatError(`"maxp" table has a wrong version number`); + } + writeUint32(tables.maxp.data, 0, version); + } + if (properties.scaleFactors?.length === numGlyphs && isTrueType) { + const { + scaleFactors + } = properties; + const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + const glyphs = new GlyfTable({ + glyfTable: tables.glyf.data, + isGlyphLocationsLong, + locaTable: tables.loca.data, + numGlyphs + }); + glyphs.scale(scaleFactors); + const { + glyf, + loca, + isLocationLong + } = glyphs.write(); + tables.glyf.data = glyf; + tables.loca.data = loca; + if (isLocationLong !== !!isGlyphLocationsLong) { + tables.head.data[50] = 0; + tables.head.data[51] = isLocationLong ? 1 : 0; + } + const metrics = tables.hmtx.data; + for (let i = 0; i < numGlyphs; i++) { + const j = 4 * i; + const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1])); + metrics[j] = advanceWidth >> 8 & 0xff; + metrics[j + 1] = advanceWidth & 0xff; + const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3])); + writeSignedInt16(metrics, j + 2, lsb); + } + } + let numGlyphsOut = numGlyphs + 1; + let dupFirstEntry = true; + if (numGlyphsOut > 0xffff) { + dupFirstEntry = false; + numGlyphsOut = numGlyphs; + warn("Not enough space in glyfs to duplicate first glyph."); + } + let maxFunctionDefs = 0; + let maxSizeOfInstructions = 0; + if (version >= 0x00010000 && tables.maxp.length >= 32) { + font.pos += 8; + const maxZones = font.getUint16(); + if (maxZones > 2) { + tables.maxp.data[14] = 0; + tables.maxp.data[15] = 2; + } + font.pos += 4; + maxFunctionDefs = font.getUint16(); + font.pos += 4; + maxSizeOfInstructions = font.getUint16(); + } + tables.maxp.data[4] = numGlyphsOut >> 8; + tables.maxp.data[5] = numGlyphsOut & 255; + const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs); + if (!hintsValid) { + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + } + sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry); + if (!tables.head) { + throw new FormatError('Required "head" table is not found'); + } + sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); + let missingGlyphs = Object.create(null); + if (isTrueType) { + const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions); + missingGlyphs = glyphsInfo.missingGlyphs; + if (version >= 0x00010000 && tables.maxp.length >= 32) { + tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8; + tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255; + } + } + if (!tables.hhea) { + throw new FormatError('Required "hhea" table is not found'); + } + if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { + tables.hhea.data[10] = 0xff; + tables.hhea.data[11] = 0xff; + } + const metricsOverride = { + unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), + yMax: signedInt16(tables.head.data[42], tables.head.data[43]), + yMin: signedInt16(tables.head.data[38], tables.head.data[39]), + ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]), + descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]), + lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9]) + }; + this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; + this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; + this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm; + if (this.cssFontInfo?.lineHeight) { + this.lineHeight = this.cssFontInfo.metrics.lineHeight; + this.lineGap = this.cssFontInfo.metrics.lineGap; + } else { + this.lineHeight = this.ascent - this.descent + this.lineGap; + } + if (tables.post) { + readPostScriptTable(tables.post, properties, numGlyphs); + } + tables.post = { + tag: "post", + data: createPostTable(properties) + }; + const charCodeToGlyphId = Object.create(null); + function hasGlyph(glyphId) { + return !missingGlyphs[glyphId]; + } + if (properties.composite) { + const cidToGidMap = properties.cidToGidMap || []; + const isCidToGidMapEmpty = cidToGidMap.length === 0; + properties.cMap.forEach(function (charCode, cid) { + if (typeof cid === "string") { + cid = convertCidString(charCode, cid, true); + } + if (cid > 0xffff) { + throw new FormatError("Max size of CID is 65,535"); + } + let glyphId = -1; + if (isCidToGidMapEmpty) { + glyphId = cid; + } else if (cidToGidMap[cid] !== undefined) { + glyphId = cidToGidMap[cid]; + } + if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) { + charCodeToGlyphId[charCode] = glyphId; + } + }); + } else { + const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding); + const cmapPlatformId = cmapTable.platformId; + const cmapEncodingId = cmapTable.encodingId; + const cmapMappings = cmapTable.mappings; + let baseEncoding = [], + forcePostTable = false; + if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) { + baseEncoding = getEncoding(properties.baseEncodingName); + } + if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) { + const glyphsUnicodeMap = getGlyphsUnicode(); + for (let charCode = 0; charCode < 256; charCode++) { + let glyphName; + if (this.differences[charCode] !== undefined) { + glyphName = this.differences[charCode]; + } else if (baseEncoding.length && baseEncoding[charCode] !== "") { + glyphName = baseEncoding[charCode]; + } else { + glyphName = StandardEncoding[charCode]; + } + if (!glyphName) { + continue; + } + const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + let unicodeOrCharCode; + if (cmapPlatformId === 3 && cmapEncodingId === 1) { + unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; + } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { + unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); + } + if (unicodeOrCharCode === undefined) { + if (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap)) { + const unicode = this.toUnicode.get(charCode); + if (unicode) { + unicodeOrCharCode = unicode.codePointAt(0); + } + } + if (unicodeOrCharCode === undefined) { + continue; + } + } + for (const mapping of cmapMappings) { + if (mapping.charCode !== unicodeOrCharCode) { + continue; + } + charCodeToGlyphId[charCode] = mapping.glyphId; + break; + } + } + } else if (cmapPlatformId === 0) { + for (const mapping of cmapMappings) { + charCodeToGlyphId[mapping.charCode] = mapping.glyphId; + } + forcePostTable = true; + } else if (cmapPlatformId === 3 && cmapEncodingId === 0) { + for (const mapping of cmapMappings) { + let charCode = mapping.charCode; + if (charCode >= 0xf000 && charCode <= 0xf0ff) { + charCode &= 0xff; + } + charCodeToGlyphId[charCode] = mapping.glyphId; + } + } else { + for (const mapping of cmapMappings) { + charCodeToGlyphId[mapping.charCode] = mapping.glyphId; + } + } + if (properties.glyphNames && (baseEncoding.length || this.differences.length)) { + for (let i = 0; i < 256; ++i) { + if (!forcePostTable && charCodeToGlyphId[i] !== undefined) { + continue; + } + const glyphName = this.differences[i] || baseEncoding[i]; + if (!glyphName) { + continue; + } + const glyphId = properties.glyphNames.indexOf(glyphName); + if (glyphId > 0 && hasGlyph(glyphId)) { + charCodeToGlyphId[i] = glyphId; + } + } + } + } + if (charCodeToGlyphId.length === 0) { + charCodeToGlyphId[0] = 0; + } + let glyphZeroId = numGlyphsOut - 1; + if (!dupFirstEntry) { + glyphZeroId = 0; + } + if (!properties.cssFontInfo) { + const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode); + this.toFontChar = newMapping.toFontChar; + tables.cmap = { + tag: "cmap", + data: createCmapTable(newMapping.charCodeToGlyphId, newMapping.toUnicodeExtraMap, numGlyphsOut) + }; + if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) { + tables["OS/2"] = { + tag: "OS/2", + data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride) + }; + } + } + if (!isTrueType) { + try { + cffFile = new Stream(tables["CFF "].data); + const parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED); + cff = parser.parse(); + cff.duplicateFirstGlyph(); + const compiler = new CFFCompiler(cff); + tables["CFF "].data = compiler.compile(); + } catch { + warn("Failed to compile font " + properties.loadedName); + } + } + if (!tables.name) { + tables.name = { + tag: "name", + data: createNameTable(this.name) + }; + } else { + const [namePrototype, nameRecords] = readNameTable(tables.name); + tables.name.data = createNameTable(name, namePrototype); + this.psName = namePrototype[0][6] || null; + if (!properties.composite) { + adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords); + } + } + const builder = new OpenTypeFileBuilder(header.version); + for (const tableTag in tables) { + builder.addTable(tableTag, tables[tableTag].data); + } + return builder.toArray(); + } + convert(fontName, font, properties) { + properties.fixedPitch = false; + if (properties.builtInEncoding) { + adjustType1ToUnicode(properties, properties.builtInEncoding); + } + let glyphZeroId = 1; + if (font instanceof CFFFont) { + glyphZeroId = font.numGlyphs - 1; + } + const mapping = font.getGlyphMapping(properties); + let newMapping = null; + let newCharCodeToGlyphId = mapping; + let toUnicodeExtraMap = null; + if (!properties.cssFontInfo) { + newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId, this.toUnicode); + this.toFontChar = newMapping.toFontChar; + newCharCodeToGlyphId = newMapping.charCodeToGlyphId; + toUnicodeExtraMap = newMapping.toUnicodeExtraMap; + } + const numGlyphs = font.numGlyphs; + function getCharCodes(charCodeToGlyphId, glyphId) { + let charCodes = null; + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + (charCodes ||= []).push(charCode | 0); + } + } + return charCodes; + } + function createCharCode(charCodeToGlyphId, glyphId) { + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + return charCode | 0; + } + } + newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId; + return newMapping.nextAvailableFontCharCode++; + } + const seacs = font.seacs; + if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) { + const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; + const charset = font.getCharset(); + const seacMap = Object.create(null); + for (let glyphId in seacs) { + glyphId |= 0; + const seac = seacs[glyphId]; + const baseGlyphName = StandardEncoding[seac[2]]; + const accentGlyphName = StandardEncoding[seac[3]]; + const baseGlyphId = charset.indexOf(baseGlyphName); + const accentGlyphId = charset.indexOf(accentGlyphName); + if (baseGlyphId < 0 || accentGlyphId < 0) { + continue; + } + const accentOffset = { + x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], + y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] + }; + const charCodes = getCharCodes(mapping, glyphId); + if (!charCodes) { + continue; + } + for (const charCode of charCodes) { + const charCodeToGlyphId = newMapping.charCodeToGlyphId; + const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); + const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); + seacMap[charCode] = { + baseFontCharCode, + accentFontCharCode, + accentOffset + }; + } + } + properties.seacMap = seacMap; + } + const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000; + const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F"); + builder.addTable("CFF ", font.data); + builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); + builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs)); + builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + "\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + "\x00\x00" + "\x00\x00"); + builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs)); + builder.addTable("hmtx", function fontFieldsHmtx() { + const charstrings = font.charstrings; + const cffWidths = font.cff ? font.cff.widths : null; + let hmtx = "\x00\x00\x00\x00"; + for (let i = 1, ii = numGlyphs; i < ii; i++) { + let width = 0; + if (charstrings) { + const charstring = charstrings[i - 1]; + width = "width" in charstring ? charstring.width : 0; + } else if (cffWidths) { + width = Math.ceil(cffWidths[i] || 0); + } + hmtx += string16(width) + string16(0); + } + return hmtx; + }()); + builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs)); + builder.addTable("name", createNameTable(fontName)); + builder.addTable("post", createPostTable(properties)); + return builder.toArray(); + } + get _spaceWidth() { + const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; + let width; + for (const glyphName of possibleSpaceReplacements) { + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + const glyphUnicode = glyphsUnicodeMap[glyphName]; + let charcode = 0; + if (this.composite && this.cMap.contains(glyphUnicode)) { + charcode = this.cMap.lookup(glyphUnicode); + if (typeof charcode === "string") { + charcode = convertCidString(glyphUnicode, charcode); + } + } + if (!charcode && this.toUnicode) { + charcode = this.toUnicode.charCodeOf(glyphUnicode); + } + if (charcode <= 0) { + charcode = glyphUnicode; + } + width = this.widths[charcode]; + if (width) { + break; + } + } + return shadow(this, "_spaceWidth", width || this.defaultWidth); + } + _charToGlyph(charcode, isSpace = false) { + let glyph = this._glyphCache[charcode]; + if (glyph?.isSpace === isSpace) { + return glyph; + } + let fontCharCode, width, operatorListId; + let widthCode = charcode; + if (this.cMap?.contains(charcode)) { + widthCode = this.cMap.lookup(charcode); + if (typeof widthCode === "string") { + widthCode = convertCidString(charcode, widthCode); + } + } + width = this.widths[widthCode]; + if (typeof width !== "number") { + width = this.defaultWidth; + } + const vmetric = this.vmetrics?.[widthCode]; + let unicode = this.toUnicode.get(charcode) || charcode; + if (typeof unicode === "number") { + unicode = String.fromCharCode(unicode); + } + let isInFont = this.toFontChar[charcode] !== undefined; + fontCharCode = this.toFontChar[charcode] || charcode; + if (this.missingFile) { + const glyphName = this.differences[charcode] || this.defaultEncoding[charcode]; + if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { + fontCharCode = 0x20; + if (glyphName === "") { + width ||= this._spaceWidth; + unicode = String.fromCharCode(fontCharCode); + } + } + fontCharCode = mapSpecialUnicodeValues(fontCharCode); + } + if (this.isType3Font) { + operatorListId = fontCharCode; + } + let accent = null; + if (this.seacMap?.[charcode]) { + isInFont = true; + const seac = this.seacMap[charcode]; + fontCharCode = seac.baseFontCharCode; + accent = { + fontChar: String.fromCodePoint(seac.accentFontCharCode), + offset: seac.accentOffset + }; + } + let fontChar = ""; + if (typeof fontCharCode === "number") { + if (fontCharCode <= 0x10ffff) { + fontChar = String.fromCodePoint(fontCharCode); + } else { + warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); + } + } + if (this.missingFile && this.vertical && fontChar.length === 1) { + const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)]; + if (vertical) { + fontChar = unicode = String.fromCharCode(vertical); + } + } + glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); + return this._glyphCache[charcode] = glyph; + } + charsToGlyphs(chars) { + let glyphs = this._charsCache[chars]; + if (glyphs) { + return glyphs; + } + glyphs = []; + if (this.cMap) { + const c = Object.create(null), + ii = chars.length; + let i = 0; + while (i < ii) { + this.cMap.readCharCode(chars, i, c); + const { + charcode, + length + } = c; + i += length; + const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20); + glyphs.push(glyph); + } + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + const charcode = chars.charCodeAt(i); + const glyph = this._charToGlyph(charcode, charcode === 0x20); + glyphs.push(glyph); + } + } + return this._charsCache[chars] = glyphs; + } + getCharPositions(chars) { + const positions = []; + if (this.cMap) { + const c = Object.create(null); + let i = 0; + while (i < chars.length) { + this.cMap.readCharCode(chars, i, c); + const length = c.length; + positions.push([i, i + length]); + i += length; + } + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + positions.push([i, i + 1]); + } + } + return positions; + } + get glyphCacheValues() { + return Object.values(this._glyphCache); + } + encodeString(str) { + const buffers = []; + const currentBuf = []; + const hasCurrentBufErrors = () => buffers.length % 2 === 1; + const getCharCode = this.toUnicode instanceof IdentityToUnicodeMap ? unicode => this.toUnicode.charCodeOf(unicode) : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode)); + for (let i = 0, ii = str.length; i < ii; i++) { + const unicode = str.codePointAt(i); + if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) { + i++; + } + if (this.toUnicode) { + const charCode = getCharCode(unicode); + if (charCode !== -1) { + if (hasCurrentBufErrors()) { + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1; + for (let j = charCodeLength - 1; j >= 0; j--) { + currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff)); + } + continue; + } + } + if (!hasCurrentBufErrors()) { + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + currentBuf.push(String.fromCodePoint(unicode)); + } + buffers.push(currentBuf.join("")); + return buffers; + } +} +class ErrorFont { + constructor(error) { + this.error = error; + this.loadedName = "g_font_error"; + this.missingFile = true; + } + charsToGlyphs() { + return []; + } + encodeString(chars) { + return [chars]; + } + exportData(extraProperties = false) { + return { + error: this.error + }; + } +} + +;// ./src/core/pattern.js + + + + +const ShadingType = { + FUNCTION_BASED: 1, + AXIAL: 2, + RADIAL: 3, + FREE_FORM_MESH: 4, + LATTICE_FORM_MESH: 5, + COONS_PATCH_MESH: 6, + TENSOR_PATCH_MESH: 7 +}; +class Pattern { + constructor() { + unreachable("Cannot initialize Pattern."); + } + static parseShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache) { + const dict = shading instanceof BaseStream ? shading.dict : shading; + const type = dict.get("ShadingType"); + try { + switch (type) { + case ShadingType.AXIAL: + case ShadingType.RADIAL: + return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, localColorSpaceCache); + case ShadingType.FREE_FORM_MESH: + case ShadingType.LATTICE_FORM_MESH: + case ShadingType.COONS_PATCH_MESH: + case ShadingType.TENSOR_PATCH_MESH: + return new MeshShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache); + default: + throw new FormatError("Unsupported ShadingType: " + type); + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(ex); + return new DummyShading(); + } + } +} +class BaseShading { + static SMALL_NUMBER = 1e-6; + getIR() { + unreachable("Abstract method `getIR` called."); + } +} +class RadialAxialShading extends BaseShading { + constructor(dict, xref, resources, pdfFunctionFactory, localColorSpaceCache) { + super(); + this.shadingType = dict.get("ShadingType"); + let coordsLen = 0; + if (this.shadingType === ShadingType.AXIAL) { + coordsLen = 4; + } else if (this.shadingType === ShadingType.RADIAL) { + coordsLen = 6; + } + this.coordsArr = dict.getArray("Coords"); + if (!isNumberArray(this.coordsArr, coordsLen)) { + throw new FormatError("RadialAxialShading: Invalid /Coords array."); + } + const cs = ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache + }); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + let t0 = 0.0, + t1 = 1.0; + const domainArr = dict.getArray("Domain"); + if (isNumberArray(domainArr, 2)) { + [t0, t1] = domainArr; + } + let extendStart = false, + extendEnd = false; + const extendArr = dict.getArray("Extend"); + if (isBooleanArray(extendArr, 2)) { + [extendStart, extendEnd] = extendArr; + } + if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { + const [x1, y1, r1, x2, y2, r2] = this.coordsArr; + const distance = Math.hypot(x1 - x2, y1 - y2); + if (r1 <= r2 + distance && r2 <= r1 + distance) { + warn("Unsupported radial gradient."); + } + } + this.extendStart = extendStart; + this.extendEnd = extendEnd; + const fnObj = dict.getRaw("Function"); + const fn = pdfFunctionFactory.createFromArray(fnObj); + const NUMBER_OF_SAMPLES = 840; + const step = (t1 - t0) / NUMBER_OF_SAMPLES; + const colorStops = this.colorStops = []; + if (t0 >= t1 || step <= 0) { + info("Bad shading domain."); + return; + } + const color = new Float32Array(cs.numComps), + ratio = new Float32Array(1); + let rgbColor; + let iBase = 0; + ratio[0] = t0; + fn(ratio, 0, color, 0); + let rgbBase = cs.getRgb(color, 0); + const cssColorBase = Util.makeHexColor(rgbBase[0], rgbBase[1], rgbBase[2]); + colorStops.push([0, cssColorBase]); + let iPrev = 1; + ratio[0] = t0 + step; + fn(ratio, 0, color, 0); + let rgbPrev = cs.getRgb(color, 0); + let maxSlopeR = rgbPrev[0] - rgbBase[0] + 1; + let maxSlopeG = rgbPrev[1] - rgbBase[1] + 1; + let maxSlopeB = rgbPrev[2] - rgbBase[2] + 1; + let minSlopeR = rgbPrev[0] - rgbBase[0] - 1; + let minSlopeG = rgbPrev[1] - rgbBase[1] - 1; + let minSlopeB = rgbPrev[2] - rgbBase[2] - 1; + for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { + ratio[0] = t0 + i * step; + fn(ratio, 0, color, 0); + rgbColor = cs.getRgb(color, 0); + const run = i - iBase; + maxSlopeR = Math.min(maxSlopeR, (rgbColor[0] - rgbBase[0] + 1) / run); + maxSlopeG = Math.min(maxSlopeG, (rgbColor[1] - rgbBase[1] + 1) / run); + maxSlopeB = Math.min(maxSlopeB, (rgbColor[2] - rgbBase[2] + 1) / run); + minSlopeR = Math.max(minSlopeR, (rgbColor[0] - rgbBase[0] - 1) / run); + minSlopeG = Math.max(minSlopeG, (rgbColor[1] - rgbBase[1] - 1) / run); + minSlopeB = Math.max(minSlopeB, (rgbColor[2] - rgbBase[2] - 1) / run); + const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB; + if (!slopesExist) { + const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); + colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); + maxSlopeR = rgbColor[0] - rgbPrev[0] + 1; + maxSlopeG = rgbColor[1] - rgbPrev[1] + 1; + maxSlopeB = rgbColor[2] - rgbPrev[2] + 1; + minSlopeR = rgbColor[0] - rgbPrev[0] - 1; + minSlopeG = rgbColor[1] - rgbPrev[1] - 1; + minSlopeB = rgbColor[2] - rgbPrev[2] - 1; + iBase = iPrev; + rgbBase = rgbPrev; + } + iPrev = i; + rgbPrev = rgbColor; + } + const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); + colorStops.push([1, cssColor]); + let background = "transparent"; + if (dict.has("Background")) { + rgbColor = cs.getRgb(dict.get("Background"), 0); + background = Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]); + } + if (!extendStart) { + colorStops.unshift([0, background]); + colorStops[1][0] += BaseShading.SMALL_NUMBER; + } + if (!extendEnd) { + colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; + colorStops.push([1, background]); + } + this.colorStops = colorStops; + } + getIR() { + const { + coordsArr, + shadingType + } = this; + let type, p0, p1, r0, r1; + if (shadingType === ShadingType.AXIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[2], coordsArr[3]]; + r0 = null; + r1 = null; + type = "axial"; + } else if (shadingType === ShadingType.RADIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[3], coordsArr[4]]; + r0 = coordsArr[2]; + r1 = coordsArr[5]; + type = "radial"; + } else { + unreachable(`getPattern type unknown: ${shadingType}`); + } + return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; + } +} +class MeshStreamReader { + constructor(stream, context) { + this.stream = stream; + this.context = context; + this.buffer = 0; + this.bufferLength = 0; + const numComps = context.numComps; + this.tmpCompsBuf = new Float32Array(numComps); + const csNumComps = context.colorSpace.numComps; + this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; + } + get hasData() { + if (this.stream.end) { + return this.stream.pos < this.stream.end; + } + if (this.bufferLength > 0) { + return true; + } + const nextByte = this.stream.getByte(); + if (nextByte < 0) { + return false; + } + this.buffer = nextByte; + this.bufferLength = 8; + return true; + } + readBits(n) { + let buffer = this.buffer; + let bufferLength = this.bufferLength; + if (n === 32) { + if (bufferLength === 0) { + return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0; + } + buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte(); + const nextByte = this.stream.getByte(); + this.buffer = nextByte & (1 << bufferLength) - 1; + return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; + } + if (n === 8 && bufferLength === 0) { + return this.stream.getByte(); + } + while (bufferLength < n) { + buffer = buffer << 8 | this.stream.getByte(); + bufferLength += 8; + } + bufferLength -= n; + this.bufferLength = bufferLength; + this.buffer = buffer & (1 << bufferLength) - 1; + return buffer >> bufferLength; + } + align() { + this.buffer = 0; + this.bufferLength = 0; + } + readFlag() { + return this.readBits(this.context.bitsPerFlag); + } + readCoordinate() { + const bitsPerCoordinate = this.context.bitsPerCoordinate; + const xi = this.readBits(bitsPerCoordinate); + const yi = this.readBits(bitsPerCoordinate); + const decode = this.context.decode; + const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; + return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]]; + } + readComponents() { + const numComps = this.context.numComps; + const bitsPerComponent = this.context.bitsPerComponent; + const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; + const decode = this.context.decode; + const components = this.tmpCompsBuf; + for (let i = 0, j = 4; i < numComps; i++, j += 2) { + const ci = this.readBits(bitsPerComponent); + components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; + } + const color = this.tmpCsCompsBuf; + if (this.context.colorFn) { + this.context.colorFn(components, 0, color, 0); + } + return this.context.colorSpace.getRgb(color, 0); + } +} +let bCache = Object.create(null); +function buildB(count) { + const lut = []; + for (let i = 0; i <= count; i++) { + const t = i / count, + t_ = 1 - t; + lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])); + } + return lut; +} +function getB(count) { + return bCache[count] ||= buildB(count); +} +function clearPatternCaches() { + bCache = Object.create(null); +} +class MeshShading extends BaseShading { + static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; + static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; + static TRIANGLE_DENSITY = 20; + constructor(stream, xref, resources, pdfFunctionFactory, localColorSpaceCache) { + super(); + if (!(stream instanceof BaseStream)) { + throw new FormatError("Mesh data is not a stream"); + } + const dict = stream.dict; + this.shadingType = dict.get("ShadingType"); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const cs = ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache + }); + this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; + const fnObj = dict.getRaw("Function"); + const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null; + this.coords = []; + this.colors = []; + this.figures = []; + const decodeContext = { + bitsPerCoordinate: dict.get("BitsPerCoordinate"), + bitsPerComponent: dict.get("BitsPerComponent"), + bitsPerFlag: dict.get("BitsPerFlag"), + decode: dict.getArray("Decode"), + colorFn: fn, + colorSpace: cs, + numComps: fn ? 1 : cs.numComps + }; + const reader = new MeshStreamReader(stream, decodeContext); + let patchMesh = false; + switch (this.shadingType) { + case ShadingType.FREE_FORM_MESH: + this._decodeType4Shading(reader); + break; + case ShadingType.LATTICE_FORM_MESH: + const verticesPerRow = dict.get("VerticesPerRow") | 0; + if (verticesPerRow < 2) { + throw new FormatError("Invalid VerticesPerRow"); + } + this._decodeType5Shading(reader, verticesPerRow); + break; + case ShadingType.COONS_PATCH_MESH: + this._decodeType6Shading(reader); + patchMesh = true; + break; + case ShadingType.TENSOR_PATCH_MESH: + this._decodeType7Shading(reader); + patchMesh = true; + break; + default: + unreachable("Unsupported mesh type."); + break; + } + if (patchMesh) { + this._updateBounds(); + for (let i = 0, ii = this.figures.length; i < ii; i++) { + this._buildFigureFromPatch(i); + } + } + this._updateBounds(); + this._packData(); + } + _decodeType4Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const operators = []; + const ps = []; + let verticesLeft = 0; + while (reader.hasData) { + const f = reader.readFlag(); + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + if (verticesLeft === 0) { + if (!(0 <= f && f <= 2)) { + throw new FormatError("Unknown type4 flag"); + } + switch (f) { + case 0: + verticesLeft = 3; + break; + case 1: + ps.push(ps.at(-2), ps.at(-1)); + verticesLeft = 1; + break; + case 2: + ps.push(ps.at(-3), ps.at(-1)); + verticesLeft = 1; + break; + } + operators.push(f); + } + ps.push(coords.length); + coords.push(coord); + colors.push(color); + verticesLeft--; + reader.align(); + } + this.figures.push({ + type: "triangles", + coords: new Int32Array(ps), + colors: new Int32Array(ps) + }); + } + _decodeType5Shading(reader, verticesPerRow) { + const coords = this.coords; + const colors = this.colors; + const ps = []; + while (reader.hasData) { + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + ps.push(coords.length); + coords.push(coord); + colors.push(color); + } + this.figures.push({ + type: "lattice", + coords: new Int32Array(ps), + colors: new Int32Array(ps), + verticesPerRow + }); + } + _decodeType6Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type6 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + ps[5] = coords.length; + coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]); + ps[6] = coords.length; + coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]); + ps[9] = coords.length; + coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]); + ps[10] = coords.length; + coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]); + this.figures.push({ + type: "patch", + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _decodeType7Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type7 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[9] = pi + 13; + ps[10] = pi + 14; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[5] = pi + 12; + ps[6] = pi + 15; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + this.figures.push({ + type: "patch", + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _buildFigureFromPatch(index) { + const figure = this.figures[index]; + assert(figure.type === "patch", "Unexpected patch mesh figure"); + const coords = this.coords, + colors = this.colors; + const pi = figure.coords; + const ci = figure.colors; + const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); + splitXBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); + let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); + splitYBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); + const verticesPerRow = splitXBy + 1; + const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); + const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); + let k = 0; + const cl = new Uint8Array(3), + cr = new Uint8Array(3); + const c0 = colors[ci[0]], + c1 = colors[ci[1]], + c2 = colors[ci[2]], + c3 = colors[ci[3]]; + const bRow = getB(splitYBy), + bCol = getB(splitXBy); + for (let row = 0; row <= splitYBy; row++) { + cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; + cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; + cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; + cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; + cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; + cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; + for (let col = 0; col <= splitXBy; col++, k++) { + if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { + continue; + } + let x = 0, + y = 0; + let q = 0; + for (let i = 0; i <= 3; i++) { + for (let j = 0; j <= 3; j++, q++) { + const m = bRow[row][i] * bCol[col][j]; + x += coords[pi[q]][0] * m; + y += coords[pi[q]][1] * m; + } + } + figureCoords[k] = coords.length; + coords.push([x, y]); + figureColors[k] = colors.length; + const newColor = new Uint8Array(3); + newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; + newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; + newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; + colors.push(newColor); + } + } + figureCoords[0] = pi[0]; + figureColors[0] = ci[0]; + figureCoords[splitXBy] = pi[3]; + figureColors[splitXBy] = ci[1]; + figureCoords[verticesPerRow * splitYBy] = pi[12]; + figureColors[verticesPerRow * splitYBy] = ci[2]; + figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; + figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; + this.figures[index] = { + type: "lattice", + coords: figureCoords, + colors: figureColors, + verticesPerRow + }; + } + _updateBounds() { + let minX = this.coords[0][0], + minY = this.coords[0][1], + maxX = minX, + maxY = minY; + for (let i = 1, ii = this.coords.length; i < ii; i++) { + const x = this.coords[i][0], + y = this.coords[i][1]; + minX = minX > x ? x : minX; + minY = minY > y ? y : minY; + maxX = maxX < x ? x : maxX; + maxY = maxY < y ? y : maxY; + } + this.bounds = [minX, minY, maxX, maxY]; + } + _packData() { + let i, ii, j, jj; + const coords = this.coords; + const coordsPacked = new Float32Array(coords.length * 2); + for (i = 0, j = 0, ii = coords.length; i < ii; i++) { + const xy = coords[i]; + coordsPacked[j++] = xy[0]; + coordsPacked[j++] = xy[1]; + } + this.coords = coordsPacked; + const colors = this.colors; + const colorsPacked = new Uint8Array(colors.length * 3); + for (i = 0, j = 0, ii = colors.length; i < ii; i++) { + const c = colors[i]; + colorsPacked[j++] = c[0]; + colorsPacked[j++] = c[1]; + colorsPacked[j++] = c[2]; + } + this.colors = colorsPacked; + const figures = this.figures; + for (i = 0, ii = figures.length; i < ii; i++) { + const figure = figures[i], + ps = figure.coords, + cs = figure.colors; + for (j = 0, jj = ps.length; j < jj; j++) { + ps[j] *= 2; + cs[j] *= 3; + } + } + } + getIR() { + const { + bounds + } = this; + if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) { + throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`); + } + return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, bounds, this.bbox, this.background]; + } +} +class DummyShading extends BaseShading { + getIR() { + return ["Dummy"]; + } +} +function getTilingPatternIR(operatorList, dict, color) { + const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { + throw new FormatError(`Invalid getTilingPatternIR /BBox array.`); + } + const xstep = dict.get("XStep"); + if (typeof xstep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /XStep value.`); + } + const ystep = dict.get("YStep"); + if (typeof ystep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /YStep value.`); + } + const paintType = dict.get("PaintType"); + if (!Number.isInteger(paintType)) { + throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`); + } + const tilingType = dict.get("TilingType"); + if (!Number.isInteger(tilingType)) { + throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`); + } + return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType]; +} + +;// ./src/core/calibri_factors.js +const CalibriBoldFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriBoldMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +const CalibriBoldItalicFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795, 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577, 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908, 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401, 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411, 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887, 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411, 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289, 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921, 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331, 1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, 0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, 0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988, 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581, 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015, 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88323, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794, 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527, 1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriBoldItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +const CalibriItalicFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374, 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306, 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245, 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918, 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562, 0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, 0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, 0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, 0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, 0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, 0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, 0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776, 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306, 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824, 0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, 0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, 0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, 0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, 0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, 1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, 0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, 0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85865, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, 0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +const CalibriRegularFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503, 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306, 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128, 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297, 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469, 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284, 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464, 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469, 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675, 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, 0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, 0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, 0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, 0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, 1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128, 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254, 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275, 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122, 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772, 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018, 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516, 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442, 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181, 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, 0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, 0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const CalibriRegularMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; + +;// ./src/core/helvetica_factors.js +const HelveticaBoldFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973, 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const HelveticaBoldItalicFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, 1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, 1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, 1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, 0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, 0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, 1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, 1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, 0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, 0.99973, 1.00066, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977, 1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 0.99964, 1.00031, 1.00001, 0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999, 0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99955, 0.9995, 1.00026, 1.00026, 1.00032, 0.99989, 1.00034, 0.99999, 1.00026, 1.00026, 1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 0.99999, 0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 0.99973, 0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaBoldItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2 +}; +const HelveticaItalicFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, 0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, 1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, 1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, 0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, 1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, 0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, 1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, 1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 1.00001, 1.00038, 0.99954, 0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001, 0.99977, 1.00026, 0.99975, 1.0001, 1.00001, 0.99993, 0.9995, 0.99955, 1.00016, 0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99973, 1.00089, 1.00005, 0.99967, 1.00048, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973, 0.99964, 1.00006, 1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1, 0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 0.99985, 1.00022, 1.00023, 1.00061, 1.00006, 0.99966, 0.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1, 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1, 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2 +}; +const HelveticaRegularFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, 0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, 0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, 1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, 0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, 0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, 0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, 1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, 1.00001, 1.00092, 0.99964, 1.00001, 0.99963, 0.99999, 1.00035, 1.00035, 1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.9996, 0.99967, 1.00001, 1.00034, 1.00074, 1.00054, 1.00053, 1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 0.99973, 1.00043, 0.99953, 1.0007, 0.99915, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073, 1.00114, 0.99915, 1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1, 1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 1.00035, 1.00001, 0.9995, 1, 1.00092, 0.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1, 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const HelveticaRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; + +;// ./src/core/liberationsans_widths.js +const LiberationSansBoldWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906, 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722, 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278, 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278, 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753, 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556, 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 904, 626, 719, 719, 610, 702, 833, 722, 778, 719, 667, 722, 611, 622, 854, 667, 730, 703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 556, 618, 615, 417, 635, 556, 709, 497, 615, 615, 500, 635, 740, 604, 611, 604, 611, 556, 490, 556, 875, 556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 556, 556, 611, 417, 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487, 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; +const LiberationSansBoldMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +const LiberationSansBoldItalicWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906, 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722, 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278, 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278, 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773, 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556, 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, 643, 719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, 729, 708, 979, 989, 854, 1000, 708, 719, 1042, 729, 556, 619, 604, 534, 618, 556, 736, 510, 611, 611, 507, 622, 740, 604, 611, 611, 611, 556, 889, 556, 885, 556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 556, 556, 611, 469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575, 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; +const LiberationSansBoldItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +const LiberationSansItalicWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, 556, 400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, 846, 389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, 667, 667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, 278, 667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, 222, 500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, 728, 779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, 500, 1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 667, 917, 614, 715, 715, 589, 686, 833, 722, 778, 725, 667, 722, 611, 639, 795, 667, 727, 673, 920, 923, 805, 886, 651, 694, 1022, 682, 556, 562, 522, 493, 553, 556, 688, 465, 556, 556, 472, 564, 686, 550, 556, 556, 556, 500, 833, 500, 835, 500, 572, 518, 830, 851, 621, 736, 526, 492, 752, 534, 556, 556, 556, 378, 496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, 492, 339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 998, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; +const LiberationSansItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +const LiberationSansRegularWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556, 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838, 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667, 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278, 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222, 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713, 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500, 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 667, 923, 604, 719, 719, 583, 656, 833, 722, 778, 719, 667, 722, 611, 635, 760, 667, 740, 667, 917, 938, 792, 885, 656, 719, 1010, 722, 556, 573, 531, 365, 583, 556, 669, 458, 559, 559, 438, 583, 688, 552, 556, 542, 556, 500, 458, 500, 823, 500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 556, 556, 556, 365, 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489, 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; +const LiberationSansRegularMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; + +;// ./src/core/myriadpro_factors.js +const MyriadProBoldFactors = [1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169, 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const MyriadProBoldItalicFactors = [1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222, 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582, 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655, 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222, 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605, 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058, 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796, 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168, 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236, 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276, 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074, 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1, 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043, 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729, 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621, 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058, 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216, 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381, 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364, 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783, 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523, 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036, 0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, 0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, 0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513, 0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, 0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, 0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, 0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, 0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275, 1.04502, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.00899, 1.30628, 0.85576, 0.80178, 0.66862, 0.7927, 0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, 0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, 0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, 0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, 0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, 0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, 0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, 0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, 0.85923, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, 1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, 0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, 1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.20006, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProBoldItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const MyriadProItalicFactors = [1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307, 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945, 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058, 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125, 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588, 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832, 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012, 0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075, 1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, 0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, 0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, 0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, 0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, 0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, 0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, 0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, 0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1, 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728, 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475, 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865, 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867, 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866, 0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512, 0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, 0.8075, 0.85751, 0.8562, 1, 1, 0.77598, 1.12658, 1.15012, 1.15012, 1.15012, 1.15012, 1.15012, 1.15313, 1.15012, 1.15012, 1.15012, 1.08106, 1.03901, 0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, 1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, 0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, 0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, 0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, 0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, 0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, 0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, 0.91123, 0.86799, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, 1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1, 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, 1.06233, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +const MyriadProRegularFactors = [1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706, 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002, 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051, 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761, 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111, 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231, 0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938, 1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, 0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, 1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, 0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, 1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, 0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, 0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, 0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284, 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377, 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441, 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991, 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434, 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1, 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856, 0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936, 0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, 0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, 0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, 0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, 0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, 0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89633, 1.01915, 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1, 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903, 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241, 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1, 0.74705, 0.71119, 1.02058, 1.024, 1.02119, 1, 1, 1.1536, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05638, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const MyriadProRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; + +;// ./src/core/segoeui_factors.js +const SegoeuiBoldFactors = [1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.97278, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511, 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiBoldMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +const SegoeuiBoldItalicFactors = [1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378, 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723, 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128, 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527, 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293, 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042, 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236, 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922, 0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107, 1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754, 1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, 1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, 1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, 1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, 1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, 0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, 0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, 1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, 0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, 1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922, 1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168, 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385, 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126, 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205, 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815, 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552, 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945, 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961, 0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518, 0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377, 1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514, 0.94165, 1.07514, 1.00351, 0.79429, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09097, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.93503, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, 1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1, 0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633, 0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, 0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, 0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, 1.13904, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21339, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18775, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiBoldItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +const SegoeuiItalicFactors = [1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373, 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383, 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308, 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016, 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989, 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143, 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627, 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454, 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225, 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973, 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748, 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781, 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971, 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836, 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782, 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402, 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146, 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225, 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351, 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729, 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454, 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484, 0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, 1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, 1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, 0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, 0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043, 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498, 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965, 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2, 0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924, 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642, 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284, 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205, 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119, 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679, 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675, 1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03754, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973, 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945, 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621, 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836, 1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.97622, 1.96791, 1.24822, 1.24822, 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10742, 1.10742, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +const SegoeuiRegularFactors = [1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985, 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084, 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831, 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968, 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433, 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484, 1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011, 1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, 0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, 0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, 0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, 0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, 0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, 0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, 0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, 0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, 0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, 1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, 1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, 0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, 1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, 0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, 1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, 0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, 1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, 0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771, 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287, 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571, 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771, 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572, 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366, 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, 0.96491, 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796, 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287, 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424, 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424, 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087, 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205, 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03719, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9403, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965, 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196, 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714, 1.18416, 1.14589, 0.69825, 0.97622, 1.9697, 1.24822, 1.24822, 1.17238, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10938, 1.10938, 1, 1, 1, 1.05425, 1.09971, 1.09971, 1.09971, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +const SegoeuiRegularMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; + +;// ./src/core/xfa_fonts.js + + + + + + + + +const getXFAFontMap = getLookupTableFactory(function (t) { + t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { + name: "LiberationSans-Regular", + factors: MyriadProRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: MyriadProRegularMetrics + }; + t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = { + name: "LiberationSans-Bold", + factors: MyriadProBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: MyriadProBoldMetrics + }; + t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = { + name: "LiberationSans-Italic", + factors: MyriadProItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: MyriadProItalicMetrics + }; + t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: MyriadProBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: MyriadProBoldItalicMetrics + }; + t.ArialMT = t.Arial = t["Arial-Regular"] = { + name: "LiberationSans-Regular", + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping + }; + t["Arial-BoldMT"] = t["Arial-Bold"] = { + name: "LiberationSans-Bold", + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping + }; + t["Arial-ItalicMT"] = t["Arial-Italic"] = { + name: "LiberationSans-Italic", + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping + }; + t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping + }; + t["Calibri-Regular"] = { + name: "LiberationSans-Regular", + factors: CalibriRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: CalibriRegularMetrics + }; + t["Calibri-Bold"] = { + name: "LiberationSans-Bold", + factors: CalibriBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: CalibriBoldMetrics + }; + t["Calibri-Italic"] = { + name: "LiberationSans-Italic", + factors: CalibriItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: CalibriItalicMetrics + }; + t["Calibri-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: CalibriBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: CalibriBoldItalicMetrics + }; + t["Segoeui-Regular"] = { + name: "LiberationSans-Regular", + factors: SegoeuiRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: SegoeuiRegularMetrics + }; + t["Segoeui-Bold"] = { + name: "LiberationSans-Bold", + factors: SegoeuiBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: SegoeuiBoldMetrics + }; + t["Segoeui-Italic"] = { + name: "LiberationSans-Italic", + factors: SegoeuiItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: SegoeuiItalicMetrics + }; + t["Segoeui-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: SegoeuiBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: SegoeuiBoldItalicMetrics + }; + t["Helvetica-Regular"] = t.Helvetica = { + name: "LiberationSans-Regular", + factors: HelveticaRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: HelveticaRegularMetrics + }; + t["Helvetica-Bold"] = { + name: "LiberationSans-Bold", + factors: HelveticaBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: HelveticaBoldMetrics + }; + t["Helvetica-Italic"] = { + name: "LiberationSans-Italic", + factors: HelveticaItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: HelveticaItalicMetrics + }; + t["Helvetica-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: HelveticaBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: HelveticaBoldItalicMetrics + }; +}); +function getXfaFontName(name) { + const fontName = normalizeFontName(name); + const fontMap = getXFAFontMap(); + return fontMap[fontName]; +} +function getXfaFontWidths(name) { + const info = getXfaFontName(name); + if (!info) { + return null; + } + const { + baseWidths, + baseMapping, + factors + } = info; + const rescaledBaseWidths = !factors ? baseWidths : baseWidths.map((w, i) => w * factors[i]); + let currentCode = -2; + let currentArray; + const newWidths = []; + for (const [unicode, glyphIndex] of baseMapping.map((charUnicode, index) => [charUnicode, index]).sort(([unicode1], [unicode2]) => unicode1 - unicode2)) { + if (unicode === -1) { + continue; + } + if (unicode === currentCode + 1) { + currentArray.push(rescaledBaseWidths[glyphIndex]); + currentCode += 1; + } else { + currentCode = unicode; + currentArray = [rescaledBaseWidths[glyphIndex]]; + newWidths.push(unicode, currentArray); + } + } + return newWidths; +} +function getXfaFontDict(name) { + const widths = getXfaFontWidths(name); + const dict = new Dict(null); + dict.set("BaseFont", Name.get(name)); + dict.set("Type", Name.get("Font")); + dict.set("Subtype", Name.get("CIDFontType2")); + dict.set("Encoding", Name.get("Identity-H")); + dict.set("CIDToGIDMap", Name.get("Identity")); + dict.set("W", widths); + dict.set("FirstChar", widths[0]); + dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1); + const descriptor = new Dict(null); + dict.set("FontDescriptor", descriptor); + const systemInfo = new Dict(null); + systemInfo.set("Ordering", "Identity"); + systemInfo.set("Registry", "Adobe"); + systemInfo.set("Supplement", 0); + dict.set("CIDSystemInfo", systemInfo); + return dict; +} + +;// ./src/core/ps_parser.js + + + +class PostScriptParser { + constructor(lexer) { + this.lexer = lexer; + this.operators = []; + this.token = null; + this.prev = null; + } + nextToken() { + this.prev = this.token; + this.token = this.lexer.getToken(); + } + accept(type) { + if (this.token.type === type) { + this.nextToken(); + return true; + } + return false; + } + expect(type) { + if (this.accept(type)) { + return true; + } + throw new FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`); + } + parse() { + this.nextToken(); + this.expect(PostScriptTokenTypes.LBRACE); + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + return this.operators; + } + parseBlock() { + while (true) { + if (this.accept(PostScriptTokenTypes.NUMBER)) { + this.operators.push(this.prev.value); + } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { + this.operators.push(this.prev.value); + } else if (this.accept(PostScriptTokenTypes.LBRACE)) { + this.parseCondition(); + } else { + return; + } + } + } + parseCondition() { + const conditionLocation = this.operators.length; + this.operators.push(null, null); + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + if (this.accept(PostScriptTokenTypes.IF)) { + this.operators[conditionLocation] = this.operators.length; + this.operators[conditionLocation + 1] = "jz"; + } else if (this.accept(PostScriptTokenTypes.LBRACE)) { + const jumpLocation = this.operators.length; + this.operators.push(null, null); + const endOfTrue = this.operators.length; + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + this.expect(PostScriptTokenTypes.IFELSE); + this.operators[jumpLocation] = this.operators.length; + this.operators[jumpLocation + 1] = "j"; + this.operators[conditionLocation] = endOfTrue; + this.operators[conditionLocation + 1] = "jz"; + } else { + throw new FormatError("PS Function: error parsing conditional."); + } + } +} +const PostScriptTokenTypes = { + LBRACE: 0, + RBRACE: 1, + NUMBER: 2, + OPERATOR: 3, + IF: 4, + IFELSE: 5 +}; +class PostScriptToken { + static get opCache() { + return shadow(this, "opCache", Object.create(null)); + } + constructor(type, value) { + this.type = type; + this.value = value; + } + static getOperator(op) { + return PostScriptToken.opCache[op] ||= new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); + } + static get LBRACE() { + return shadow(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{")); + } + static get RBRACE() { + return shadow(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}")); + } + static get IF() { + return shadow(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF")); + } + static get IFELSE() { + return shadow(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE")); + } +} +class PostScriptLexer { + constructor(stream) { + this.stream = stream; + this.nextChar(); + this.strBuf = []; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + getToken() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isWhiteSpace(ch)) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2b: + case 0x2d: + case 0x2e: + return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber()); + case 0x7b: + this.nextChar(); + return PostScriptToken.LBRACE; + case 0x7d: + this.nextChar(); + return PostScriptToken.RBRACE; + } + const strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) { + strBuf.push(String.fromCharCode(ch)); + } + const str = strBuf.join(""); + switch (str.toLowerCase()) { + case "if": + return PostScriptToken.IF; + case "ifelse": + return PostScriptToken.IFELSE; + default: + return PostScriptToken.getOperator(str); + } + } + getNumber() { + let ch = this.currentChar; + const strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) { + strBuf.push(String.fromCharCode(ch)); + } else { + break; + } + } + const value = parseFloat(strBuf.join("")); + if (isNaN(value)) { + throw new FormatError(`Invalid floating point number: ${value}`); + } + return value; + } +} + +;// ./src/core/image_utils.js + + +class BaseLocalCache { + constructor(options) { + this._onlyRefs = options?.onlyRefs === true; + if (!this._onlyRefs) { + this._nameRefMap = new Map(); + this._imageMap = new Map(); + } + this._imageCache = new RefSetCache(); + } + getByName(name) { + if (this._onlyRefs) { + unreachable("Should not call `getByName` method."); + } + const ref = this._nameRefMap.get(name); + if (ref) { + return this.getByRef(ref); + } + return this._imageMap.get(name) || null; + } + getByRef(ref) { + return this._imageCache.get(ref) || null; + } + set(name, ref, data) { + unreachable("Abstract method `set` called."); + } +} +class LocalImageCache extends BaseLocalCache { + set(name, ref = null, data) { + if (typeof name !== "string") { + throw new Error('LocalImageCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalColorSpaceCache extends BaseLocalCache { + set(name = null, ref = null, data) { + if (typeof name !== "string" && !ref) { + throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + if (name !== null) { + this._nameRefMap.set(name, ref); + } + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalFunctionCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('LocalFunctionCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class LocalGStateCache extends BaseLocalCache { + set(name, ref = null, data) { + if (typeof name !== "string") { + throw new Error('LocalGStateCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +class LocalTilingPatternCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('LocalTilingPatternCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class RegionalImageCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('RegionalImageCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +class GlobalImageCache { + static NUM_PAGES_THRESHOLD = 2; + static MIN_IMAGES_TO_CACHE = 10; + static MAX_BYTE_SIZE = 5 * MAX_IMAGE_SIZE_TO_CACHE; + #decodeFailedSet = new RefSet(); + constructor() { + this._refCache = new RefSetCache(); + this._imageCache = new RefSetCache(); + } + get #byteSize() { + let byteSize = 0; + for (const imageData of this._imageCache) { + byteSize += imageData.byteSize; + } + return byteSize; + } + get #cacheLimitReached() { + if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) { + return false; + } + if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) { + return false; + } + return true; + } + shouldCache(ref, pageIndex) { + let pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + pageIndexSet = new Set(); + this._refCache.put(ref, pageIndexSet); + } + pageIndexSet.add(pageIndex); + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return false; + } + if (!this._imageCache.has(ref) && this.#cacheLimitReached) { + return false; + } + return true; + } + addDecodeFailed(ref) { + this.#decodeFailedSet.put(ref); + } + hasDecodeFailed(ref) { + return this.#decodeFailedSet.has(ref); + } + addByteSize(ref, byteSize) { + const imageData = this._imageCache.get(ref); + if (!imageData) { + return; + } + if (imageData.byteSize) { + return; + } + imageData.byteSize = byteSize; + } + getData(ref, pageIndex) { + const pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + return null; + } + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return null; + } + const imageData = this._imageCache.get(ref); + if (!imageData) { + return null; + } + pageIndexSet.add(pageIndex); + return imageData; + } + setData(ref, data) { + if (!this._refCache.has(ref)) { + throw new Error('GlobalImageCache.setData - expected "shouldCache" to have been called.'); + } + if (this._imageCache.has(ref)) { + return; + } + if (this.#cacheLimitReached) { + warn("GlobalImageCache.setData - cache limit reached."); + return; + } + this._imageCache.put(ref, data); + } + clear(onlyData = false) { + if (!onlyData) { + this.#decodeFailedSet.clear(); + this._refCache.clear(); + } + this._imageCache.clear(); + } +} + +;// ./src/core/function.js + + + + + + +class PDFFunctionFactory { + constructor({ + xref, + isEvalSupported = true + }) { + this.xref = xref; + this.isEvalSupported = isEvalSupported !== false; + } + create(fn) { + const cachedFunction = this.getCached(fn); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parse({ + xref: this.xref, + isEvalSupported: this.isEvalSupported, + fn: fn instanceof Ref ? this.xref.fetch(fn) : fn + }); + this._cache(fn, parsedFunction); + return parsedFunction; + } + createFromArray(fnObj) { + const cachedFunction = this.getCached(fnObj); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parseArray({ + xref: this.xref, + isEvalSupported: this.isEvalSupported, + fnObj: fnObj instanceof Ref ? this.xref.fetch(fnObj) : fnObj + }); + this._cache(fnObj, parsedFunction); + return parsedFunction; + } + getCached(cacheKey) { + let fnRef; + if (cacheKey instanceof Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof BaseStream) { + fnRef = cacheKey.dict?.objId; + } + if (fnRef) { + const localFunction = this._localFunctionCache.getByRef(fnRef); + if (localFunction) { + return localFunction; + } + } + return null; + } + _cache(cacheKey, parsedFunction) { + if (!parsedFunction) { + throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.'); + } + let fnRef; + if (cacheKey instanceof Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof BaseStream) { + fnRef = cacheKey.dict?.objId; + } + if (fnRef) { + this._localFunctionCache.set(null, fnRef, parsedFunction); + } + } + get _localFunctionCache() { + return shadow(this, "_localFunctionCache", new LocalFunctionCache()); + } +} +function toNumberArray(arr) { + if (!Array.isArray(arr)) { + return null; + } + if (!isNumberArray(arr, null)) { + return arr.map(x => +x); + } + return arr; +} +class PDFFunction { + static getSampleArray(size, outputSize, bps, stream) { + let i, ii; + let length = 1; + for (i = 0, ii = size.length; i < ii; i++) { + length *= size[i]; + } + length *= outputSize; + const array = new Array(length); + let codeSize = 0; + let codeBuf = 0; + const sampleMul = 1.0 / (2.0 ** bps - 1); + const strBytes = stream.getBytes((length * bps + 7) / 8); + let strIdx = 0; + for (i = 0; i < length; i++) { + while (codeSize < bps) { + codeBuf <<= 8; + codeBuf |= strBytes[strIdx++]; + codeSize += 8; + } + codeSize -= bps; + array[i] = (codeBuf >> codeSize) * sampleMul; + codeBuf &= (1 << codeSize) - 1; + } + return array; + } + static parse({ + xref, + isEvalSupported, + fn + }) { + const dict = fn.dict || fn; + const typeNum = dict.get("FunctionType"); + switch (typeNum) { + case 0: + return this.constructSampled({ + xref, + isEvalSupported, + fn, + dict + }); + case 1: + break; + case 2: + return this.constructInterpolated({ + xref, + isEvalSupported, + dict + }); + case 3: + return this.constructStiched({ + xref, + isEvalSupported, + dict + }); + case 4: + return this.constructPostScript({ + xref, + isEvalSupported, + fn, + dict + }); + } + throw new FormatError("Unknown type of function"); + } + static parseArray({ + xref, + isEvalSupported, + fnObj + }) { + if (!Array.isArray(fnObj)) { + return this.parse({ + xref, + isEvalSupported, + fn: fnObj + }); + } + const fnArray = []; + for (const fn of fnObj) { + fnArray.push(this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn) + })); + } + return function (src, srcOffset, dest, destOffset) { + for (let i = 0, ii = fnArray.length; i < ii; i++) { + fnArray[i](src, srcOffset, dest, destOffset + i); + } + }; + } + static constructSampled({ + xref, + isEvalSupported, + fn, + dict + }) { + function toMultiArray(arr) { + const inputLength = arr.length; + const out = []; + let index = 0; + for (let i = 0; i < inputLength; i += 2) { + out[index++] = [arr[i], arr[i + 1]]; + } + return out; + } + function interpolate(x, xmin, xmax, ymin, ymax) { + return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); + } + let domain = toNumberArray(dict.getArray("Domain")); + let range = toNumberArray(dict.getArray("Range")); + if (!domain || !range) { + throw new FormatError("No domain or range"); + } + const inputSize = domain.length / 2; + const outputSize = range.length / 2; + domain = toMultiArray(domain); + range = toMultiArray(range); + const size = toNumberArray(dict.getArray("Size")); + const bps = dict.get("BitsPerSample"); + const order = dict.get("Order") || 1; + if (order !== 1) { + info("No support for cubic spline interpolation: " + order); + } + let encode = toNumberArray(dict.getArray("Encode")); + if (!encode) { + encode = []; + for (let i = 0; i < inputSize; ++i) { + encode.push([0, size[i] - 1]); + } + } else { + encode = toMultiArray(encode); + } + let decode = toNumberArray(dict.getArray("Decode")); + decode = !decode ? range : toMultiArray(decode); + const samples = this.getSampleArray(size, outputSize, bps, fn); + return function constructSampledFn(src, srcOffset, dest, destOffset) { + const cubeVertices = 1 << inputSize; + const cubeN = new Float64Array(cubeVertices); + const cubeVertex = new Uint32Array(cubeVertices); + let i, j; + for (j = 0; j < cubeVertices; j++) { + cubeN[j] = 1; + } + let k = outputSize, + pos = 1; + for (i = 0; i < inputSize; ++i) { + const domain_2i = domain[i][0]; + const domain_2i_1 = domain[i][1]; + const xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1); + let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); + const size_i = size[i]; + e = Math.min(Math.max(e, 0), size_i - 1); + const e0 = e < size_i - 1 ? Math.floor(e) : e - 1; + const n0 = e0 + 1 - e; + const n1 = e - e0; + const offset0 = e0 * k; + const offset1 = offset0 + k; + for (j = 0; j < cubeVertices; j++) { + if (j & pos) { + cubeN[j] *= n1; + cubeVertex[j] += offset1; + } else { + cubeN[j] *= n0; + cubeVertex[j] += offset0; + } + } + k *= size_i; + pos <<= 1; + } + for (j = 0; j < outputSize; ++j) { + let rj = 0; + for (i = 0; i < cubeVertices; i++) { + rj += samples[cubeVertex[i] + j] * cubeN[i]; + } + rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); + dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); + } + }; + } + static constructInterpolated({ + xref, + isEvalSupported, + dict + }) { + const c0 = toNumberArray(dict.getArray("C0")) || [0]; + const c1 = toNumberArray(dict.getArray("C1")) || [1]; + const n = dict.get("N"); + const diff = []; + for (let i = 0, ii = c0.length; i < ii; ++i) { + diff.push(c1[i] - c0[i]); + } + const length = diff.length; + return function constructInterpolatedFn(src, srcOffset, dest, destOffset) { + const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n; + for (let j = 0; j < length; ++j) { + dest[destOffset + j] = c0[j] + x * diff[j]; + } + }; + } + static constructStiched({ + xref, + isEvalSupported, + dict + }) { + const domain = toNumberArray(dict.getArray("Domain")); + if (!domain) { + throw new FormatError("No domain"); + } + const inputSize = domain.length / 2; + if (inputSize !== 1) { + throw new FormatError("Bad domain for stiched function"); + } + const fns = []; + for (const fn of dict.get("Functions")) { + fns.push(this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn) + })); + } + const bounds = toNumberArray(dict.getArray("Bounds")); + const encode = toNumberArray(dict.getArray("Encode")); + const tmpBuf = new Float32Array(1); + return function constructStichedFn(src, srcOffset, dest, destOffset) { + const clip = function constructStichedFromIRClip(v, min, max) { + if (v > max) { + v = max; + } else if (v < min) { + v = min; + } + return v; + }; + const v = clip(src[srcOffset], domain[0], domain[1]); + const length = bounds.length; + let i; + for (i = 0; i < length; ++i) { + if (v < bounds[i]) { + break; + } + } + let dmin = domain[0]; + if (i > 0) { + dmin = bounds[i - 1]; + } + let dmax = domain[1]; + if (i < bounds.length) { + dmax = bounds[i]; + } + const rmin = encode[2 * i]; + const rmax = encode[2 * i + 1]; + tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); + fns[i](tmpBuf, 0, dest, destOffset); + }; + } + static constructPostScript({ + xref, + isEvalSupported, + fn, + dict + }) { + const domain = toNumberArray(dict.getArray("Domain")); + const range = toNumberArray(dict.getArray("Range")); + if (!domain) { + throw new FormatError("No domain."); + } + if (!range) { + throw new FormatError("No range."); + } + const lexer = new PostScriptLexer(fn); + const parser = new PostScriptParser(lexer); + const code = parser.parse(); + if (isEvalSupported && FeatureTest.isEvalSupported) { + const compiled = new PostScriptCompiler().compile(code, domain, range); + if (compiled) { + return new Function("src", "srcOffset", "dest", "destOffset", compiled); + } + } + info("Unable to compile PS function"); + const numOutputs = range.length >> 1; + const numInputs = domain.length >> 1; + const evaluator = new PostScriptEvaluator(code); + const cache = Object.create(null); + const MAX_CACHE_SIZE = 2048 * 4; + let cache_available = MAX_CACHE_SIZE; + const tmpBuf = new Float32Array(numInputs); + return function constructPostScriptFn(src, srcOffset, dest, destOffset) { + let i, value; + let key = ""; + const input = tmpBuf; + for (i = 0; i < numInputs; i++) { + value = src[srcOffset + i]; + input[i] = value; + key += value + "_"; + } + const cachedValue = cache[key]; + if (cachedValue !== undefined) { + dest.set(cachedValue, destOffset); + return; + } + const output = new Float32Array(numOutputs); + const stack = evaluator.execute(input); + const stackIndex = stack.length - numOutputs; + for (i = 0; i < numOutputs; i++) { + value = stack[stackIndex + i]; + let bound = range[i * 2]; + if (value < bound) { + value = bound; + } else { + bound = range[i * 2 + 1]; + if (value > bound) { + value = bound; + } + } + output[i] = value; + } + if (cache_available > 0) { + cache_available--; + cache[key] = output; + } + dest.set(output, destOffset); + }; + } +} +function isPDFFunction(v) { + let fnDict; + if (v instanceof Dict) { + fnDict = v; + } else if (v instanceof BaseStream) { + fnDict = v.dict; + } else { + return false; + } + return fnDict.has("FunctionType"); +} +class PostScriptStack { + static MAX_STACK_SIZE = 100; + constructor(initialStack) { + this.stack = initialStack ? Array.from(initialStack) : []; + } + push(value) { + if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) { + throw new Error("PostScript function stack overflow."); + } + this.stack.push(value); + } + pop() { + if (this.stack.length <= 0) { + throw new Error("PostScript function stack underflow."); + } + return this.stack.pop(); + } + copy(n) { + if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) { + throw new Error("PostScript function stack overflow."); + } + const stack = this.stack; + for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) { + stack.push(stack[i]); + } + } + index(n) { + this.push(this.stack[this.stack.length - n - 1]); + } + roll(n, p) { + const stack = this.stack; + const l = stack.length - n; + const r = stack.length - 1; + const c = l + (p - Math.floor(p / n) * n); + for (let i = l, j = r; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + for (let i = l, j = c - 1; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + for (let i = c, j = r; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + } +} +class PostScriptEvaluator { + constructor(operators) { + this.operators = operators; + } + execute(initialStack) { + const stack = new PostScriptStack(initialStack); + let counter = 0; + const operators = this.operators; + const length = operators.length; + let operator, a, b; + while (counter < length) { + operator = operators[counter++]; + if (typeof operator === "number") { + stack.push(operator); + continue; + } + switch (operator) { + case "jz": + b = stack.pop(); + a = stack.pop(); + if (!a) { + counter = b; + } + break; + case "j": + a = stack.pop(); + counter = a; + break; + case "abs": + a = stack.pop(); + stack.push(Math.abs(a)); + break; + case "add": + b = stack.pop(); + a = stack.pop(); + stack.push(a + b); + break; + case "and": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a && b); + } else { + stack.push(a & b); + } + break; + case "atan": + b = stack.pop(); + a = stack.pop(); + a = Math.atan2(a, b) / Math.PI * 180; + if (a < 0) { + a += 360; + } + stack.push(a); + break; + case "bitshift": + b = stack.pop(); + a = stack.pop(); + if (a > 0) { + stack.push(a << b); + } else { + stack.push(a >> b); + } + break; + case "ceiling": + a = stack.pop(); + stack.push(Math.ceil(a)); + break; + case "copy": + a = stack.pop(); + stack.copy(a); + break; + case "cos": + a = stack.pop(); + stack.push(Math.cos(a % 360 / 180 * Math.PI)); + break; + case "cvi": + a = stack.pop() | 0; + stack.push(a); + break; + case "cvr": + break; + case "div": + b = stack.pop(); + a = stack.pop(); + stack.push(a / b); + break; + case "dup": + stack.copy(1); + break; + case "eq": + b = stack.pop(); + a = stack.pop(); + stack.push(a === b); + break; + case "exch": + stack.roll(2, 1); + break; + case "exp": + b = stack.pop(); + a = stack.pop(); + stack.push(a ** b); + break; + case "false": + stack.push(false); + break; + case "floor": + a = stack.pop(); + stack.push(Math.floor(a)); + break; + case "ge": + b = stack.pop(); + a = stack.pop(); + stack.push(a >= b); + break; + case "gt": + b = stack.pop(); + a = stack.pop(); + stack.push(a > b); + break; + case "idiv": + b = stack.pop(); + a = stack.pop(); + stack.push(a / b | 0); + break; + case "index": + a = stack.pop(); + stack.index(a); + break; + case "le": + b = stack.pop(); + a = stack.pop(); + stack.push(a <= b); + break; + case "ln": + a = stack.pop(); + stack.push(Math.log(a)); + break; + case "log": + a = stack.pop(); + stack.push(Math.log10(a)); + break; + case "lt": + b = stack.pop(); + a = stack.pop(); + stack.push(a < b); + break; + case "mod": + b = stack.pop(); + a = stack.pop(); + stack.push(a % b); + break; + case "mul": + b = stack.pop(); + a = stack.pop(); + stack.push(a * b); + break; + case "ne": + b = stack.pop(); + a = stack.pop(); + stack.push(a !== b); + break; + case "neg": + a = stack.pop(); + stack.push(-a); + break; + case "not": + a = stack.pop(); + if (typeof a === "boolean") { + stack.push(!a); + } else { + stack.push(~a); + } + break; + case "or": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a || b); + } else { + stack.push(a | b); + } + break; + case "pop": + stack.pop(); + break; + case "roll": + b = stack.pop(); + a = stack.pop(); + stack.roll(a, b); + break; + case "round": + a = stack.pop(); + stack.push(Math.round(a)); + break; + case "sin": + a = stack.pop(); + stack.push(Math.sin(a % 360 / 180 * Math.PI)); + break; + case "sqrt": + a = stack.pop(); + stack.push(Math.sqrt(a)); + break; + case "sub": + b = stack.pop(); + a = stack.pop(); + stack.push(a - b); + break; + case "true": + stack.push(true); + break; + case "truncate": + a = stack.pop(); + a = a < 0 ? Math.ceil(a) : Math.floor(a); + stack.push(a); + break; + case "xor": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a !== b); + } else { + stack.push(a ^ b); + } + break; + default: + throw new FormatError(`Unknown operator ${operator}`); + } + } + return stack.stack; + } +} +class AstNode { + constructor(type) { + this.type = type; + } + visit(visitor) { + unreachable("abstract method"); + } +} +class AstArgument extends AstNode { + constructor(index, min, max) { + super("args"); + this.index = index; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitArgument(this); + } +} +class AstLiteral extends AstNode { + constructor(number) { + super("literal"); + this.number = number; + this.min = number; + this.max = number; + } + visit(visitor) { + visitor.visitLiteral(this); + } +} +class AstBinaryOperation extends AstNode { + constructor(op, arg1, arg2, min, max) { + super("binary"); + this.op = op; + this.arg1 = arg1; + this.arg2 = arg2; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitBinaryOperation(this); + } +} +class AstMin extends AstNode { + constructor(arg, max) { + super("max"); + this.arg = arg; + this.min = arg.min; + this.max = max; + } + visit(visitor) { + visitor.visitMin(this); + } +} +class AstVariable extends AstNode { + constructor(index, min, max) { + super("var"); + this.index = index; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitVariable(this); + } +} +class AstVariableDefinition extends AstNode { + constructor(variable, arg) { + super("definition"); + this.variable = variable; + this.arg = arg; + } + visit(visitor) { + visitor.visitVariableDefinition(this); + } +} +class ExpressionBuilderVisitor { + constructor() { + this.parts = []; + } + visitArgument(arg) { + this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))"); + } + visitVariable(variable) { + this.parts.push("v", variable.index); + } + visitLiteral(literal) { + this.parts.push(literal.number); + } + visitBinaryOperation(operation) { + this.parts.push("("); + operation.arg1.visit(this); + this.parts.push(" ", operation.op, " "); + operation.arg2.visit(this); + this.parts.push(")"); + } + visitVariableDefinition(definition) { + this.parts.push("var "); + definition.variable.visit(this); + this.parts.push(" = "); + definition.arg.visit(this); + this.parts.push(";"); + } + visitMin(max) { + this.parts.push("Math.min("); + max.arg.visit(this); + this.parts.push(", ", max.max, ")"); + } + toString() { + return this.parts.join(""); + } +} +function buildAddOperation(num1, num2) { + if (num2.type === "literal" && num2.number === 0) { + return num1; + } + if (num1.type === "literal" && num1.number === 0) { + return num2; + } + if (num2.type === "literal" && num1.type === "literal") { + return new AstLiteral(num1.number + num2.number); + } + return new AstBinaryOperation("+", num1, num2, num1.min + num2.min, num1.max + num2.max); +} +function buildMulOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return new AstLiteral(0); + } else if (num2.number === 1) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number * num2.number); + } + } + if (num1.type === "literal") { + if (num1.number === 0) { + return new AstLiteral(0); + } else if (num1.number === 1) { + return num2; + } + } + const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + return new AstBinaryOperation("*", num1, num2, min, max); +} +function buildSubOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number - num2.number); + } + } + if (num2.type === "binary" && num2.op === "-" && num1.type === "literal" && num1.number === 1 && num2.arg1.type === "literal" && num2.arg1.number === 1) { + return num2.arg2; + } + return new AstBinaryOperation("-", num1, num2, num1.min - num2.max, num1.max - num2.min); +} +function buildMinOperation(num1, max) { + if (num1.min >= max) { + return new AstLiteral(max); + } else if (num1.max <= max) { + return num1; + } + return new AstMin(num1, max); +} +class PostScriptCompiler { + compile(code, domain, range) { + const stack = []; + const instructions = []; + const inputSize = domain.length >> 1, + outputSize = range.length >> 1; + let lastRegister = 0; + let n, j; + let num1, num2, ast1, ast2, tmpVar, item; + for (let i = 0; i < inputSize; i++) { + stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); + } + for (let i = 0, ii = code.length; i < ii; i++) { + item = code[i]; + if (typeof item === "number") { + stack.push(new AstLiteral(item)); + continue; + } + switch (item) { + case "add": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildAddOperation(num1, num2)); + break; + case "cvr": + if (stack.length < 1) { + return null; + } + break; + case "mul": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildMulOperation(num1, num2)); + break; + case "sub": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildSubOperation(num1, num2)); + break; + case "exch": + if (stack.length < 2) { + return null; + } + ast1 = stack.pop(); + ast2 = stack.pop(); + stack.push(ast1, ast2); + break; + case "pop": + if (stack.length < 1) { + return null; + } + stack.pop(); + break; + case "index": + if (stack.length < 1) { + return null; + } + num1 = stack.pop(); + if (num1.type !== "literal") { + return null; + } + n = num1.number; + if (n < 0 || !Number.isInteger(n) || stack.length < n) { + return null; + } + ast1 = stack[stack.length - n - 1]; + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - n - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "dup": + if (stack.length < 1) { + return null; + } + if (typeof code[i + 1] === "number" && code[i + 2] === "gt" && code[i + 3] === i + 7 && code[i + 4] === "jz" && code[i + 5] === "pop" && code[i + 6] === code[i + 1]) { + num1 = stack.pop(); + stack.push(buildMinOperation(num1, code[i + 1])); + i += 6; + break; + } + ast1 = stack.at(-1); + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "roll": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + if (num2.type !== "literal" || num1.type !== "literal") { + return null; + } + j = num2.number; + n = num1.number; + if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) { + return null; + } + j = (j % n + n) % n; + if (j === 0) { + break; + } + stack.push(...stack.splice(stack.length - n, n - j)); + break; + default: + return null; + } + } + if (stack.length !== outputSize) { + return null; + } + const result = []; + for (const instruction of instructions) { + const statementBuilder = new ExpressionBuilderVisitor(); + instruction.visit(statementBuilder); + result.push(statementBuilder.toString()); + } + for (let i = 0, ii = stack.length; i < ii; i++) { + const expr = stack[i], + statementBuilder = new ExpressionBuilderVisitor(); + expr.visit(statementBuilder); + const min = range[i * 2], + max = range[i * 2 + 1]; + const out = [statementBuilder.toString()]; + if (min > expr.min) { + out.unshift("Math.max(", min, ", "); + out.push(")"); + } + if (max < expr.max) { + out.unshift("Math.min(", max, ", "); + out.push(")"); + } + out.unshift("dest[destOffset + ", i, "] = "); + out.push(";"); + result.push(out.join("")); + } + return result.join("\n"); + } +} + +;// ./src/core/bidi.js + +const baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", "ON", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "L", "ON", "ON", "BN", "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L"]; +const arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", "ON", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"]; +function isOdd(i) { + return (i & 1) !== 0; +} +function isEven(i) { + return (i & 1) === 0; +} +function findUnequal(arr, start, value) { + let j, jj; + for (j = start, jj = arr.length; j < jj; ++j) { + if (arr[j] !== value) { + return j; + } + } + return j; +} +function setValues(arr, start, end, value) { + for (let j = start; j < end; ++j) { + arr[j] = value; + } +} +function reverseValues(arr, start, end) { + for (let i = start, j = end - 1; i < j; ++i, --j) { + const temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } +} +function createBidiText(str, isLTR, vertical = false) { + let dir = "ltr"; + if (vertical) { + dir = "ttb"; + } else if (!isLTR) { + dir = "rtl"; + } + return { + str, + dir + }; +} +const chars = []; +const types = []; +function bidi(str, startLevel = -1, vertical = false) { + let isLTR = true; + const strLength = str.length; + if (strLength === 0 || vertical) { + return createBidiText(str, isLTR, vertical); + } + chars.length = strLength; + types.length = strLength; + let numBidi = 0; + let i, ii; + for (i = 0; i < strLength; ++i) { + chars[i] = str.charAt(i); + const charCode = str.charCodeAt(i); + let charType = "L"; + if (charCode <= 0x00ff) { + charType = baseTypes[charCode]; + } else if (0x0590 <= charCode && charCode <= 0x05f4) { + charType = "R"; + } else if (0x0600 <= charCode && charCode <= 0x06ff) { + charType = arabicTypes[charCode & 0xff]; + if (!charType) { + warn("Bidi: invalid Unicode character " + charCode.toString(16)); + } + } else if (0x0700 <= charCode && charCode <= 0x08ac || 0xfb50 <= charCode && charCode <= 0xfdff || 0xfe70 <= charCode && charCode <= 0xfeff) { + charType = "AL"; + } + if (charType === "R" || charType === "AL" || charType === "AN") { + numBidi++; + } + types[i] = charType; + } + if (numBidi === 0) { + isLTR = true; + return createBidiText(str, isLTR); + } + if (startLevel === -1) { + if (numBidi / strLength < 0.3 && strLength > 4) { + isLTR = true; + startLevel = 0; + } else { + isLTR = false; + startLevel = 1; + } + } + const levels = []; + for (i = 0; i < strLength; ++i) { + levels[i] = startLevel; + } + const e = isOdd(startLevel) ? "R" : "L"; + const sor = e; + const eor = sor; + let lastType = sor; + for (i = 0; i < strLength; ++i) { + if (types[i] === "NSM") { + types[i] = lastType; + } else { + lastType = types[i]; + } + } + lastType = sor; + let t; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "AL" ? "AN" : "EN"; + } else if (t === "R" || t === "L" || t === "AL") { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "AL") { + types[i] = "R"; + } + } + for (i = 1; i < strLength - 1; ++i) { + if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") { + types[i] = "EN"; + } + if (types[i] === "CS" && (types[i - 1] === "EN" || types[i - 1] === "AN") && types[i + 1] === types[i - 1]) { + types[i] = types[i - 1]; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "EN") { + for (let j = i - 1; j >= 0; --j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + for (let j = i + 1; j < strLength; ++j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "WS" || t === "ES" || t === "ET" || t === "CS") { + types[i] = "ON"; + } + } + lastType = sor; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "L" ? "L" : "EN"; + } else if (t === "R" || t === "L") { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + const end = findUnequal(types, i + 1, "ON"); + let before = sor; + if (i > 0) { + before = types[i - 1]; + } + let after = eor; + if (end + 1 < strLength) { + after = types[end + 1]; + } + if (before !== "L") { + before = "R"; + } + if (after !== "L") { + after = "R"; + } + if (before === after) { + setValues(types, i, end, before); + } + i = end - 1; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + types[i] = e; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (isEven(levels[i])) { + if (t === "R") { + levels[i] += 1; + } else if (t === "AN" || t === "EN") { + levels[i] += 2; + } + } else if (t === "L" || t === "AN" || t === "EN") { + levels[i] += 1; + } + } + let highestLevel = -1; + let lowestOddLevel = 99; + let level; + for (i = 0, ii = levels.length; i < ii; ++i) { + level = levels[i]; + if (highestLevel < level) { + highestLevel = level; + } + if (lowestOddLevel > level && isOdd(level)) { + lowestOddLevel = level; + } + } + for (level = highestLevel; level >= lowestOddLevel; --level) { + let start = -1; + for (i = 0, ii = levels.length; i < ii; ++i) { + if (levels[i] < level) { + if (start >= 0) { + reverseValues(chars, start, i); + start = -1; + } + } else if (start < 0) { + start = i; + } + } + if (start >= 0) { + reverseValues(chars, start, levels.length); + } + } + for (i = 0, ii = chars.length; i < ii; ++i) { + const ch = chars[i]; + if (ch === "<" || ch === ">") { + chars[i] = ""; + } + } + return createBidiText(chars.join(""), isLTR); +} + +;// ./src/core/font_substitutions.js + + + +const NORMAL = { + style: "normal", + weight: "normal" +}; +const BOLD = { + style: "normal", + weight: "bold" +}; +const ITALIC = { + style: "italic", + weight: "normal" +}; +const BOLDITALIC = { + style: "italic", + weight: "bold" +}; +const substitutionMap = new Map([["Times-Roman", { + local: ["Times New Roman", "Times-Roman", "Times", "Liberation Serif", "Nimbus Roman", "Nimbus Roman L", "Tinos", "Thorndale", "TeX Gyre Termes", "FreeSerif", "Linux Libertine O", "Libertinus Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"], + style: NORMAL, + ultimate: "serif" +}], ["Times-Bold", { + alias: "Times-Roman", + style: BOLD, + ultimate: "serif" +}], ["Times-Italic", { + alias: "Times-Roman", + style: ITALIC, + ultimate: "serif" +}], ["Times-BoldItalic", { + alias: "Times-Roman", + style: BOLDITALIC, + ultimate: "serif" +}], ["Helvetica", { + local: ["Helvetica", "Helvetica Neue", "Arial", "Arial Nova", "Liberation Sans", "Arimo", "Nimbus Sans", "Nimbus Sans L", "A030", "TeX Gyre Heros", "FreeSans", "DejaVu Sans", "Albany", "Bitstream Vera Sans", "Arial Unicode MS", "Microsoft Sans Serif", "Apple Symbols", "Cantarell"], + path: "LiberationSans-Regular.ttf", + style: NORMAL, + ultimate: "sans-serif" +}], ["Helvetica-Bold", { + alias: "Helvetica", + path: "LiberationSans-Bold.ttf", + style: BOLD, + ultimate: "sans-serif" +}], ["Helvetica-Oblique", { + alias: "Helvetica", + path: "LiberationSans-Italic.ttf", + style: ITALIC, + ultimate: "sans-serif" +}], ["Helvetica-BoldOblique", { + alias: "Helvetica", + path: "LiberationSans-BoldItalic.ttf", + style: BOLDITALIC, + ultimate: "sans-serif" +}], ["Courier", { + local: ["Courier", "Courier New", "Liberation Mono", "Nimbus Mono", "Nimbus Mono L", "Cousine", "Cumberland", "TeX Gyre Cursor", "FreeMono", "Linux Libertine Mono O", "Libertinus Mono"], + style: NORMAL, + ultimate: "monospace" +}], ["Courier-Bold", { + alias: "Courier", + style: BOLD, + ultimate: "monospace" +}], ["Courier-Oblique", { + alias: "Courier", + style: ITALIC, + ultimate: "monospace" +}], ["Courier-BoldOblique", { + alias: "Courier", + style: BOLDITALIC, + ultimate: "monospace" +}], ["ArialBlack", { + local: ["Arial Black"], + style: { + style: "normal", + weight: "900" + }, + fallback: "Helvetica-Bold" +}], ["ArialBlack-Bold", { + alias: "ArialBlack" +}], ["ArialBlack-Italic", { + alias: "ArialBlack", + style: { + style: "italic", + weight: "900" + }, + fallback: "Helvetica-BoldOblique" +}], ["ArialBlack-BoldItalic", { + alias: "ArialBlack-Italic" +}], ["ArialNarrow", { + local: ["Arial Narrow", "Liberation Sans Narrow", "Helvetica Condensed", "Nimbus Sans Narrow", "TeX Gyre Heros Cn"], + style: NORMAL, + fallback: "Helvetica" +}], ["ArialNarrow-Bold", { + alias: "ArialNarrow", + style: BOLD, + fallback: "Helvetica-Bold" +}], ["ArialNarrow-Italic", { + alias: "ArialNarrow", + style: ITALIC, + fallback: "Helvetica-Oblique" +}], ["ArialNarrow-BoldItalic", { + alias: "ArialNarrow", + style: BOLDITALIC, + fallback: "Helvetica-BoldOblique" +}], ["Calibri", { + local: ["Calibri", "Carlito"], + style: NORMAL, + fallback: "Helvetica" +}], ["Calibri-Bold", { + alias: "Calibri", + style: BOLD, + fallback: "Helvetica-Bold" +}], ["Calibri-Italic", { + alias: "Calibri", + style: ITALIC, + fallback: "Helvetica-Oblique" +}], ["Calibri-BoldItalic", { + alias: "Calibri", + style: BOLDITALIC, + fallback: "Helvetica-BoldOblique" +}], ["Wingdings", { + local: ["Wingdings", "URW Dingbats"], + style: NORMAL +}], ["Wingdings-Regular", { + alias: "Wingdings" +}], ["Wingdings-Bold", { + alias: "Wingdings" +}]]); +const fontAliases = new Map([["Arial-Black", "ArialBlack"]]); +function getStyleToAppend(style) { + switch (style) { + case BOLD: + return "Bold"; + case ITALIC: + return "Italic"; + case BOLDITALIC: + return "Bold Italic"; + default: + if (style?.weight === "bold") { + return "Bold"; + } + if (style?.style === "italic") { + return "Italic"; + } + } + return ""; +} +function getFamilyName(str) { + const keywords = new Set(["thin", "extralight", "ultralight", "demilight", "semilight", "light", "book", "regular", "normal", "medium", "demibold", "semibold", "bold", "extrabold", "ultrabold", "black", "heavy", "extrablack", "ultrablack", "roman", "italic", "oblique", "ultracondensed", "extracondensed", "condensed", "semicondensed", "normal", "semiexpanded", "expanded", "extraexpanded", "ultraexpanded", "bolditalic"]); + return str.split(/[- ,+]+/g).filter(tok => !keywords.has(tok.toLowerCase())).join(" "); +} +function generateFont({ + alias, + local, + path, + fallback, + style, + ultimate +}, src, localFontPath, useFallback = true, usePath = true, append = "") { + const result = { + style: null, + ultimate: null + }; + if (local) { + const extra = append ? ` ${append}` : ""; + for (const name of local) { + src.push(`local(${name}${extra})`); + } + } + if (alias) { + const substitution = substitutionMap.get(alias); + const aliasAppend = append || getStyleToAppend(style); + Object.assign(result, generateFont(substitution, src, localFontPath, useFallback && !fallback, usePath && !path, aliasAppend)); + } + if (style) { + result.style = style; + } + if (ultimate) { + result.ultimate = ultimate; + } + if (useFallback && fallback) { + const fallbackInfo = substitutionMap.get(fallback); + const { + ultimate: fallbackUltimate + } = generateFont(fallbackInfo, src, localFontPath, useFallback, usePath && !path, append); + result.ultimate ||= fallbackUltimate; + } + if (usePath && path && localFontPath) { + src.push(`url(${localFontPath}${path})`); + } + return result; +} +function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName, type) { + if (baseFontName.startsWith("InvalidPDFjsFont_")) { + return null; + } + if ((type === "TrueType" || type === "Type1") && /^[A-Z]{6}\+/.test(baseFontName)) { + baseFontName = baseFontName.slice(7); + } + baseFontName = normalizeFontName(baseFontName); + const key = baseFontName; + let substitutionInfo = systemFontCache.get(key); + if (substitutionInfo) { + return substitutionInfo; + } + let substitution = substitutionMap.get(baseFontName); + if (!substitution) { + for (const [alias, subst] of fontAliases) { + if (baseFontName.startsWith(alias)) { + baseFontName = `${subst}${baseFontName.substring(alias.length)}`; + substitution = substitutionMap.get(baseFontName); + break; + } + } + } + let mustAddBaseFont = false; + if (!substitution) { + substitution = substitutionMap.get(standardFontName); + mustAddBaseFont = true; + } + const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`; + if (!substitution) { + if (!validateFontName(baseFontName)) { + warn(`Cannot substitute the font because of its name: ${baseFontName}`); + systemFontCache.set(key, null); + return null; + } + const bold = /bold/gi.test(baseFontName); + const italic = /oblique|italic/gi.test(baseFontName); + const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || NORMAL; + substitutionInfo = { + css: `"${getFamilyName(baseFontName)}",${loadedName}`, + guessFallback: true, + loadedName, + baseFontName, + src: `local(${baseFontName})`, + style + }; + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; + } + const src = []; + if (mustAddBaseFont && validateFontName(baseFontName)) { + src.push(`local(${baseFontName})`); + } + const { + style, + ultimate + } = generateFont(substitution, src, localFontPath); + const guessFallback = ultimate === null; + const fallback = guessFallback ? "" : `,${ultimate}`; + substitutionInfo = { + css: `"${getFamilyName(baseFontName)}",${loadedName}${fallback}`, + guessFallback, + loadedName, + baseFontName, + src: src.join(","), + style + }; + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; +} + +;// ./src/core/image_resizer.js + + + +const MIN_IMAGE_DIM = 2048; +const MAX_IMAGE_DIM = 65537; +const MAX_ERROR = 128; +class ImageResizer { + static #goodSquareLength = MIN_IMAGE_DIM; + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; + constructor(imgData, isMask) { + this._imgData = imgData; + this._isMask = isMask; + } + static get canUseImageDecoder() { + return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false)); + } + static needsToBeResized(width, height) { + if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) { + return false; + } + const { + MAX_DIM + } = this; + if (width > MAX_DIM || height > MAX_DIM) { + return true; + } + const area = width * height; + if (this._hasMaxArea) { + return area > this.MAX_AREA; + } + if (area < this.#goodSquareLength ** 2) { + return false; + } + if (this._areGoodDims(width, height)) { + this.#goodSquareLength = Math.max(this.#goodSquareLength, Math.floor(Math.sqrt(width * height))); + return false; + } + this.#goodSquareLength = this._guessMax(this.#goodSquareLength, MAX_DIM, MAX_ERROR, 0); + const maxArea = this.MAX_AREA = this.#goodSquareLength ** 2; + return area > maxArea; + } + static get MAX_DIM() { + return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); + } + static get MAX_AREA() { + this._hasMaxArea = true; + return shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); + } + static set MAX_AREA(area) { + if (area >= 0) { + this._hasMaxArea = true; + shadow(this, "MAX_AREA", area); + } + } + static setOptions({ + canvasMaxAreaInBytes = -1, + isImageDecoderSupported = false + }) { + if (!this._hasMaxArea) { + this.MAX_AREA = canvasMaxAreaInBytes >> 2; + } + this.#isImageDecoderSupported = isImageDecoderSupported; + } + static _areGoodDims(width, height) { + try { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.fillRect(0, 0, 1, 1); + const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; + canvas.width = canvas.height = 1; + return opacity !== 0; + } catch { + return false; + } + } + static _guessMax(start, end, tolerance, defaultHeight) { + while (start + tolerance + 1 < end) { + const middle = Math.floor((start + end) / 2); + const height = defaultHeight || middle; + if (this._areGoodDims(middle, height)) { + start = middle; + } else { + end = middle; + } + } + return start; + } + static async createImage(imgData, isMask = false) { + return new ImageResizer(imgData, isMask)._createImage(); + } + async _createImage() { + const { + _imgData: imgData + } = this; + const { + width, + height + } = imgData; + if (width * height * 4 > MAX_INT_32) { + const result = this.#rescaleImageData(); + if (result) { + return result; + } + } + const data = this._encodeBMP(); + let decoder, imagePromise; + if (await ImageResizer.canUseImageDecoder) { + decoder = new ImageDecoder({ + data, + type: "image/bmp", + preferAnimation: false, + transfer: [data.buffer] + }); + imagePromise = decoder.decode().catch(reason => { + warn(`BMP image decoding failed: ${reason}`); + return createImageBitmap(new Blob([this._encodeBMP().buffer], { + type: "image/bmp" + })); + }).finally(() => { + decoder.close(); + }); + } else { + imagePromise = createImageBitmap(new Blob([data.buffer], { + type: "image/bmp" + })); + } + const { + MAX_AREA, + MAX_DIM + } = ImageResizer; + const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA)); + const firstFactor = Math.max(minFactor, 2); + const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; + const N = Math.floor(Math.log2(factor)); + const steps = new Array(N + 2).fill(2); + steps[0] = firstFactor; + steps.splice(-1, 1, factor / (1 << N)); + let newWidth = width; + let newHeight = height; + const result = await imagePromise; + let bitmap = result.image || result; + for (const step of steps) { + const prevWidth = newWidth; + const prevHeight = newHeight; + newWidth = Math.floor(newWidth / step) - 1; + newHeight = Math.floor(newHeight / step) - 1; + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap.close(); + bitmap = canvas.transferToImageBitmap(); + } + imgData.data = null; + imgData.bitmap = bitmap; + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + #rescaleImageData() { + const { + _imgData: imgData + } = this; + const { + data, + width, + height, + kind + } = imgData; + const rgbaSize = width * height * 4; + const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32)); + const newWidth = width >> K; + const newHeight = height >> K; + let rgbaData; + let maxHeight = height; + try { + rgbaData = new Uint8Array(rgbaSize); + } catch { + let n = Math.floor(Math.log2(rgbaSize + 1)); + while (true) { + try { + rgbaData = new Uint8Array(2 ** n - 1); + break; + } catch { + n -= 1; + } + } + maxHeight = Math.floor((2 ** n - 1) / (width * 4)); + const newSize = width * maxHeight * 4; + if (newSize < rgbaData.length) { + rgbaData = new Uint8Array(newSize); + } + } + const src32 = new Uint32Array(rgbaData.buffer); + const dest32 = new Uint32Array(newWidth * newHeight); + let srcPos = 0; + let newIndex = 0; + const step = Math.ceil(height / maxHeight); + const remainder = height % maxHeight === 0 ? height : height % maxHeight; + for (let k = 0; k < step; k++) { + const h = k < step - 1 ? maxHeight : remainder; + ({ + srcPos + } = convertToRGBA({ + kind, + src: data, + dest: src32, + width, + height: h, + inverseDecode: this._isMask, + srcPos + })); + for (let i = 0, ii = h >> K; i < ii; i++) { + const buf = src32.subarray((i << K) * width); + for (let j = 0; j < newWidth; j++) { + dest32[newIndex++] = buf[j << K]; + } + } + } + if (ImageResizer.needsToBeResized(newWidth, newHeight)) { + imgData.data = dest32; + imgData.width = newWidth; + imgData.height = newHeight; + imgData.kind = ImageKind.RGBA_32BPP; + return null; + } + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0); + imgData.data = null; + imgData.bitmap = canvas.transferToImageBitmap(); + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + _encodeBMP() { + const { + width, + height, + kind + } = this._imgData; + let data = this._imgData.data; + let bitPerPixel; + let colorTable = new Uint8Array(0); + let maskTable = colorTable; + let compression = 0; + switch (kind) { + case ImageKind.GRAYSCALE_1BPP: + { + bitPerPixel = 1; + colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]); + const rowLen = width + 7 >> 3; + const rowSize = rowLen + 3 & -4; + if (rowLen !== rowSize) { + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) { + newData.set(data.subarray(i, i + rowLen), k); + } + data = newData; + } + break; + } + case ImageKind.RGB_24BPP: + { + bitPerPixel = 24; + if (width & 3) { + const rowLen = 3 * width; + const rowSize = rowLen + 3 & -4; + const extraLen = rowSize - rowLen; + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { + const row = data.subarray(i, i + rowLen); + for (let j = 0; j < rowLen; j += 3) { + newData[k++] = row[j + 2]; + newData[k++] = row[j + 1]; + newData[k++] = row[j]; + } + k += extraLen; + } + data = newData; + } else { + for (let i = 0, ii = data.length; i < ii; i += 3) { + const tmp = data[i]; + data[i] = data[i + 2]; + data[i + 2] = tmp; + } + } + break; + } + case ImageKind.RGBA_32BPP: + bitPerPixel = 32; + compression = 3; + maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); + const view = new DataView(maskTable.buffer); + if (FeatureTest.isLittleEndian) { + view.setUint32(0, 0x000000ff, true); + view.setUint32(4, 0x0000ff00, true); + view.setUint32(8, 0x00ff0000, true); + view.setUint32(12, 0xff000000, true); + } else { + view.setUint32(0, 0xff000000, true); + view.setUint32(4, 0x00ff0000, true); + view.setUint32(8, 0x0000ff00, true); + view.setUint32(12, 0x000000ff, true); + } + break; + default: + throw new Error("invalid format"); + } + let i = 0; + const headerLength = 40 + maskTable.length; + const fileLength = 14 + headerLength + colorTable.length + data.length; + const bmpData = new Uint8Array(fileLength); + const view = new DataView(bmpData.buffer); + view.setUint16(i, 0x4d42, true); + i += 2; + view.setUint32(i, fileLength, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setUint32(i, 14 + headerLength + colorTable.length, true); + i += 4; + view.setUint32(i, headerLength, true); + i += 4; + view.setInt32(i, width, true); + i += 4; + view.setInt32(i, -height, true); + i += 4; + view.setUint16(i, 1, true); + i += 2; + view.setUint16(i, bitPerPixel, true); + i += 2; + view.setUint32(i, compression, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setUint32(i, colorTable.length / 4, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + bmpData.set(maskTable, i); + i += maskTable.length; + bmpData.set(colorTable, i); + i += colorTable.length; + bmpData.set(data, i); + return bmpData; + } +} + +;// ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/core/operator_list.js + +function addState(parentState, pattern, checkFn, iterateFn, processFn) { + let state = parentState; + for (let i = 0, ii = pattern.length - 1; i < ii; i++) { + const item = pattern[i]; + state = state[item] ||= []; + } + state[pattern.at(-1)] = { + checkFn, + iterateFn, + processFn + }; +} +const InitialState = []; +addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintInlineImageXObject; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); +}, function foundInlineImageGroup(context, i) { + const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; + const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; + const MAX_WIDTH = 1000; + const IMAGE_PADDING = 1; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIIXO = curr - 1; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); + if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let maxX = 0; + const map = []; + let maxLineHeight = 0; + let currentX = IMAGE_PADDING, + currentY = IMAGE_PADDING; + for (let q = 0; q < count; q++) { + const transform = argsArray[iFirstTransform + (q << 2)]; + const img = argsArray[iFirstPIIXO + (q << 2)][0]; + if (currentX + img.width > MAX_WIDTH) { + maxX = Math.max(maxX, currentX); + currentY += maxLineHeight + 2 * IMAGE_PADDING; + currentX = 0; + maxLineHeight = 0; + } + map.push({ + transform, + x: currentX, + y: currentY, + w: img.width, + h: img.height + }); + currentX += img.width + 2 * IMAGE_PADDING; + maxLineHeight = Math.max(maxLineHeight, img.height); + } + const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; + const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; + const imgData = new Uint8Array(imgWidth * imgHeight * 4); + const imgRowSize = imgWidth << 2; + for (let q = 0; q < count; q++) { + const data = argsArray[iFirstPIIXO + (q << 2)][0].data; + const rowSize = map[q].w << 2; + let dataOffset = 0; + let offset = map[q].x + map[q].y * imgWidth << 2; + imgData.set(data.subarray(0, rowSize), offset - imgRowSize); + for (let k = 0, kk = map[q].h; k < kk; k++) { + imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); + dataOffset += rowSize; + offset += imgRowSize; + } + imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); + while (offset >= 0) { + data[offset - 4] = data[offset]; + data[offset - 3] = data[offset + 1]; + data[offset - 2] = data[offset + 2]; + data[offset - 1] = data[offset + 3]; + data[offset + rowSize] = data[offset + rowSize - 4]; + data[offset + rowSize + 1] = data[offset + rowSize - 3]; + data[offset + rowSize + 2] = data[offset + rowSize - 2]; + data[offset + rowSize + 3] = data[offset + rowSize - 1]; + offset -= imgRowSize; + } + } + const img = { + width: imgWidth, + height: imgHeight + }; + if (context.isOffscreenCanvasSupported) { + const canvas = new OffscreenCanvas(imgWidth, imgHeight); + const ctx = canvas.getContext("2d"); + ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0); + img.bitmap = canvas.transferToImageBitmap(); + img.data = null; + } else { + img.kind = ImageKind.RGBA_32BPP; + img.data = imgData; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [img, map]); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintImageMaskXObject; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); +}, function foundImageMaskGroup(context, i) { + const MIN_IMAGES_IN_MASKS_BLOCK = 10; + const MAX_IMAGES_IN_MASKS_BLOCK = 100; + const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIMXO = curr - 1; + let count = Math.floor((i - iFirstSave) / 4); + if (count < MIN_IMAGES_IN_MASKS_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let isSameImage = false; + let iTransform, transformArgs; + const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0], + firstTransformArg1 = argsArray[iFirstTransform][1], + firstTransformArg2 = argsArray[iFirstTransform][2], + firstTransformArg3 = argsArray[iFirstTransform][3]; + if (firstTransformArg1 === firstTransformArg2) { + isSameImage = true; + iTransform = iFirstTransform + 4; + let iPIMXO = iFirstPIMXO + 4; + for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { + transformArgs = argsArray[iTransform]; + if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { + if (q < MIN_IMAGES_IN_MASKS_BLOCK) { + isSameImage = false; + } else { + count = q; + } + break; + } + } + } + if (isSameImage) { + count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); + const positions = new Float32Array(count * 2); + iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); + } else { + count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); + const images = []; + for (let q = 0; q < count; q++) { + transformArgs = argsArray[iFirstTransform + (q << 2)]; + const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; + images.push({ + data: maskParams.data, + width: maskParams.width, + height: maskParams.height, + interpolate: maskParams.interpolate, + count: maskParams.count, + transform: transformArgs + }); + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [images]); + } + return iFirstSave + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) { + const argsArray = context.argsArray; + const iFirstTransform = context.iCurr - 2; + return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; +}, function iterateImageGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + if (fnArray[i] !== OPS.transform) { + return false; + } + const iFirstTransform = context.iCurr - 2; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) { + return false; + } + return true; + case 2: + if (fnArray[i] !== OPS.paintImageXObject) { + return false; + } + const iFirstPIXO = context.iCurr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + if (argsArray[i][0] !== firstPIXOArg0) { + return false; + } + return true; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_IMAGES_IN_BLOCK = 3; + const MAX_IMAGES_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIXO = curr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); + if (count < MIN_IMAGES_IN_BLOCK) { + return i - (i - iFirstSave) % 4; + } + const positions = new Float32Array(count * 2); + let iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + const transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; + fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, args); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 4; + const pos = (i - iFirstSave) % 5; + switch (pos) { + case 0: + return fnArray[i] === OPS.beginText; + case 1: + return fnArray[i] === OPS.setFont; + case 2: + return fnArray[i] === OPS.setTextMatrix; + case 3: + if (fnArray[i] !== OPS.showText) { + return false; + } + const iFirstSetFont = context.iCurr - 3; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) { + return false; + } + return true; + case 4: + return fnArray[i] === OPS.endText; + } + throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_CHARS_IN_BLOCK = 3; + const MAX_CHARS_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstBeginText = curr - 4; + const iFirstSetFont = curr - 3; + const iFirstSetTextMatrix = curr - 2; + const iFirstShowText = curr - 1; + const iFirstEndText = curr; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); + if (count < MIN_CHARS_IN_BLOCK) { + return i - (i - iFirstBeginText) % 5; + } + let iFirst = iFirstBeginText; + if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { + count++; + iFirst -= 5; + } + let iEndText = iFirst + 4; + for (let q = 1; q < count; q++) { + fnArray.splice(iEndText, 3); + argsArray.splice(iEndText, 3); + iEndText += 2; + } + return iEndText + 1; +}); +class NullOptimizer { + constructor(queue) { + this.queue = queue; + } + _optimize() {} + push(fn, args) { + this.queue.fnArray.push(fn); + this.queue.argsArray.push(args); + this._optimize(); + } + flush() {} + reset() {} +} +class QueueOptimizer extends NullOptimizer { + constructor(queue) { + super(queue); + this.state = null; + this.context = { + iCurr: 0, + fnArray: queue.fnArray, + argsArray: queue.argsArray, + isOffscreenCanvasSupported: false + }; + this.match = null; + this.lastProcessed = 0; + } + set isOffscreenCanvasSupported(value) { + this.context.isOffscreenCanvasSupported = value; + } + _optimize() { + const fnArray = this.queue.fnArray; + let i = this.lastProcessed, + ii = fnArray.length; + let state = this.state; + let match = this.match; + if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { + this.lastProcessed = ii; + return; + } + const context = this.context; + while (i < ii) { + if (match) { + const iterate = (0, match.iterateFn)(context, i); + if (iterate) { + i++; + continue; + } + i = (0, match.processFn)(context, i + 1); + ii = fnArray.length; + match = null; + state = null; + if (i >= ii) { + break; + } + } + state = (state || InitialState)[fnArray[i]]; + if (!state || Array.isArray(state)) { + i++; + continue; + } + context.iCurr = i; + i++; + if (state.checkFn && !(0, state.checkFn)(context)) { + state = null; + continue; + } + match = state; + state = null; + } + this.state = state; + this.match = match; + this.lastProcessed = i; + } + flush() { + while (this.match) { + const length = this.queue.fnArray.length; + this.lastProcessed = (0, this.match.processFn)(this.context, length); + this.match = null; + this.state = null; + this._optimize(); + } + } + reset() { + this.state = null; + this.match = null; + this.lastProcessed = 0; + } +} +class OperatorList { + static CHUNK_SIZE = 1000; + static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; + constructor(intent = 0, streamSink) { + this._streamSink = streamSink; + this.fnArray = []; + this.argsArray = []; + this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this); + this.dependencies = new Set(); + this._totalLength = 0; + this.weight = 0; + this._resolved = streamSink ? null : Promise.resolve(); + } + set isOffscreenCanvasSupported(value) { + this.optimizer.isOffscreenCanvasSupported = value; + } + get length() { + return this.argsArray.length; + } + get ready() { + return this._resolved || this._streamSink.ready; + } + get totalLength() { + return this._totalLength + this.length; + } + addOp(fn, args) { + this.optimizer.push(fn, args); + this.weight++; + if (this._streamSink) { + if (this.weight >= OperatorList.CHUNK_SIZE) { + this.flush(); + } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { + this.flush(); + } + } + } + addImageOps(fn, args, optionalContent) { + if (optionalContent !== undefined) { + this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + this.addOp(fn, args); + if (optionalContent !== undefined) { + this.addOp(OPS.endMarkedContent, []); + } + } + addDependency(dependency) { + if (this.dependencies.has(dependency)) { + return; + } + this.dependencies.add(dependency); + this.addOp(OPS.dependency, [dependency]); + } + addDependencies(dependencies) { + for (const dependency of dependencies) { + this.addDependency(dependency); + } + } + addOpList(opList) { + if (!(opList instanceof OperatorList)) { + warn('addOpList - ignoring invalid "opList" parameter.'); + return; + } + for (const dependency of opList.dependencies) { + this.dependencies.add(dependency); + } + for (let i = 0, ii = opList.length; i < ii; i++) { + this.addOp(opList.fnArray[i], opList.argsArray[i]); + } + } + getIR() { + return { + fnArray: this.fnArray, + argsArray: this.argsArray, + length: this.length + }; + } + get _transfers() { + const transfers = []; + const { + fnArray, + argsArray, + length + } = this; + for (let i = 0; i < length; i++) { + switch (fnArray[i]) { + case OPS.paintInlineImageXObject: + case OPS.paintInlineImageXObjectGroup: + case OPS.paintImageMaskXObject: + const arg = argsArray[i][0]; + if (!arg.cached && arg.data?.buffer instanceof ArrayBuffer) { + transfers.push(arg.data.buffer); + } + break; + } + } + return transfers; + } + flush(lastChunk = false, separateAnnots = null) { + this.optimizer.flush(); + const length = this.length; + this._totalLength += length; + this._streamSink.enqueue({ + fnArray: this.fnArray, + argsArray: this.argsArray, + lastChunk, + separateAnnots, + length + }, 1, this._transfers); + this.dependencies.clear(); + this.fnArray.length = 0; + this.argsArray.length = 0; + this.weight = 0; + this.optimizer.reset(); + } +} + +;// ./src/core/image.js + + + + + + + + + +function decodeAndClamp(value, addend, coefficient, max) { + value = addend + value * coefficient; + if (value < 0) { + value = 0; + } else if (value > max) { + value = max; + } + return value; +} +function resizeImageMask(src, bpc, w1, h1, w2, h2) { + const length = w2 * h2; + let dest; + if (bpc <= 8) { + dest = new Uint8Array(length); + } else if (bpc <= 16) { + dest = new Uint16Array(length); + } else { + dest = new Uint32Array(length); + } + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let i, + j, + py, + newIndex = 0, + oldIndex; + const xScaled = new Uint16Array(w2); + const w1Scanline = w1; + for (i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + for (i = 0; i < h2; i++) { + py = Math.floor(i * yRatio) * w1Scanline; + for (j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex]; + } + } + return dest; +} +class PDFImage { + constructor({ + xref, + res, + image, + isInline = false, + smask = null, + mask = null, + isMask = false, + pdfFunctionFactory, + localColorSpaceCache + }) { + this.image = image; + const dict = image.dict; + const filter = dict.get("F", "Filter"); + let filterName; + if (filter instanceof Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = xref.fetchIfRef(filter[0]); + if (filterZero instanceof Name) { + filterName = filterZero.name; + } + } + switch (filterName) { + case "JPXDecode": + ({ + width: image.width, + height: image.height, + componentsCount: image.numComps, + bitsPerComponent: image.bitsPerComponent + } = JpxImage.parseImageProperties(image.stream)); + image.stream.reset(); + this.jpxDecoderOptions = { + numComponents: 0, + isIndexedColormap: false, + smaskInData: dict.has("SMaskInData") + }; + break; + case "JBIG2Decode": + image.bitsPerComponent = 1; + image.numComps = 1; + break; + } + let width = dict.get("W", "Width"); + let height = dict.get("H", "Height"); + if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) { + warn("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary."); + width = image.width; + height = image.height; + } + if (width < 1 || height < 1) { + throw new FormatError(`Invalid image width: ${width} or height: ${height}`); + } + this.width = width; + this.height = height; + this.interpolate = dict.get("I", "Interpolate"); + this.imageMask = dict.get("IM", "ImageMask") || false; + this.matte = dict.get("Matte") || false; + let bitsPerComponent = image.bitsPerComponent; + if (!bitsPerComponent) { + bitsPerComponent = dict.get("BPC", "BitsPerComponent"); + if (!bitsPerComponent) { + if (this.imageMask) { + bitsPerComponent = 1; + } else { + throw new FormatError(`Bits per component missing in image: ${this.imageMask}`); + } + } + } + this.bpc = bitsPerComponent; + if (!this.imageMask) { + let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); + const hasColorSpace = !!colorSpace; + if (!hasColorSpace) { + if (this.jpxDecoderOptions) { + colorSpace = Name.get("DeviceRGBA"); + } else { + switch (image.numComps) { + case 1: + colorSpace = Name.get("DeviceGray"); + break; + case 3: + colorSpace = Name.get("DeviceRGB"); + break; + case 4: + colorSpace = Name.get("DeviceCMYK"); + break; + default: + throw new Error(`Images with ${image.numComps} color components not supported.`); + } + } + } else if (this.jpxDecoderOptions?.smaskInData) { + colorSpace = Name.get("DeviceRGBA"); + } + this.colorSpace = ColorSpace.parse({ + cs: colorSpace, + xref, + resources: isInline ? res : null, + pdfFunctionFactory, + localColorSpaceCache + }); + this.numComps = this.colorSpace.numComps; + if (this.jpxDecoderOptions) { + this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComp : 0; + this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed"; + } + } + this.decode = dict.getArray("D", "Decode"); + this.needsDecode = false; + if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) { + this.needsDecode = true; + const max = (1 << bitsPerComponent) - 1; + this.decodeCoefficients = []; + this.decodeAddends = []; + const isIndexed = this.colorSpace?.name === "Indexed"; + for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) { + const dmin = this.decode[i]; + const dmax = this.decode[i + 1]; + this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin; + this.decodeAddends[j] = isIndexed ? dmin : max * dmin; + } + } + if (smask) { + this.smask = new PDFImage({ + xref, + res, + image: smask, + isInline, + pdfFunctionFactory, + localColorSpaceCache + }); + } else if (mask) { + if (mask instanceof BaseStream) { + const maskDict = mask.dict, + imageMask = maskDict.get("IM", "ImageMask"); + if (!imageMask) { + warn("Ignoring /Mask in image without /ImageMask."); + } else { + this.mask = new PDFImage({ + xref, + res, + image: mask, + isInline, + isMask: true, + pdfFunctionFactory, + localColorSpaceCache + }); + } + } else { + this.mask = mask; + } + } + } + static async buildImage({ + xref, + res, + image, + isInline = false, + pdfFunctionFactory, + localColorSpaceCache + }) { + const imageData = image; + let smaskData = null; + let maskData = null; + const smask = image.dict.get("SMask"); + const mask = image.dict.get("Mask"); + if (smask) { + if (smask instanceof BaseStream) { + smaskData = smask; + } else { + warn("Unsupported /SMask format."); + } + } else if (mask) { + if (mask instanceof BaseStream || Array.isArray(mask)) { + maskData = mask; + } else { + warn("Unsupported /Mask format."); + } + } + return new PDFImage({ + xref, + res, + image: imageData, + isInline, + smask: smaskData, + mask: maskData, + pdfFunctionFactory, + localColorSpaceCache + }); + } + static createRawMask({ + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate + }) { + const computedLength = (width + 7 >> 3) * height; + const actualLength = imgArray.byteLength; + const haveFullData = computedLength === actualLength; + let data, i; + if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { + data = imgArray; + } else if (!inverseDecode) { + data = new Uint8Array(imgArray); + } else { + data = new Uint8Array(computedLength); + data.set(imgArray); + data.fill(0xff, actualLength); + } + if (inverseDecode) { + for (i = 0; i < actualLength; i++) { + data[i] ^= 0xff; + } + } + return { + data, + width, + height, + interpolate + }; + } + static async createMask({ + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate, + isOffscreenCanvasSupported = false + }) { + const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); + if (isSingleOpaquePixel) { + return { + isSingleOpaquePixel + }; + } + if (isOffscreenCanvasSupported) { + if (ImageResizer.needsToBeResized(width, height)) { + const data = new Uint8ClampedArray(width * height * 4); + convertBlackAndWhiteToRGBA({ + src: imgArray, + dest: data, + width, + height, + nonBlackColor: 0, + inverseDecode + }); + return ImageResizer.createImage({ + kind: ImageKind.RGBA_32BPP, + data, + width, + height, + interpolate + }); + } + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + const imgData = ctx.createImageData(width, height); + convertBlackAndWhiteToRGBA({ + src: imgArray, + dest: imgData.data, + width, + height, + nonBlackColor: 0, + inverseDecode + }); + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + interpolate, + bitmap + }; + } + return this.createRawMask({ + imgArray, + width, + height, + inverseDecode, + imageIsFromDecodeStream, + interpolate + }); + } + get drawWidth() { + return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0); + } + get drawHeight() { + return Math.max(this.height, this.smask?.height || 0, this.mask?.height || 0); + } + decodeBuffer(buffer) { + const bpc = this.bpc; + const numComps = this.numComps; + const decodeAddends = this.decodeAddends; + const decodeCoefficients = this.decodeCoefficients; + const max = (1 << bpc) - 1; + let i, ii; + if (bpc === 1) { + for (i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] = +!buffer[i]; + } + return; + } + let index = 0; + for (i = 0, ii = this.width * this.height; i < ii; i++) { + for (let j = 0; j < numComps; j++) { + buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max); + index++; + } + } + } + getComponents(buffer) { + const bpc = this.bpc; + if (bpc === 8) { + return buffer; + } + const width = this.width; + const height = this.height; + const numComps = this.numComps; + const length = width * height * numComps; + let bufferPos = 0; + let output; + if (bpc <= 8) { + output = new Uint8Array(length); + } else if (bpc <= 16) { + output = new Uint16Array(length); + } else { + output = new Uint32Array(length); + } + const rowComps = width * numComps; + const max = (1 << bpc) - 1; + let i = 0, + ii, + buf; + if (bpc === 1) { + let mask, loop1End, loop2End; + for (let j = 0; j < height; j++) { + loop1End = i + (rowComps & ~7); + loop2End = i + rowComps; + while (i < loop1End) { + buf = buffer[bufferPos++]; + output[i] = buf >> 7 & 1; + output[i + 1] = buf >> 6 & 1; + output[i + 2] = buf >> 5 & 1; + output[i + 3] = buf >> 4 & 1; + output[i + 4] = buf >> 3 & 1; + output[i + 5] = buf >> 2 & 1; + output[i + 6] = buf >> 1 & 1; + output[i + 7] = buf & 1; + i += 8; + } + if (i < loop2End) { + buf = buffer[bufferPos++]; + mask = 128; + while (i < loop2End) { + output[i++] = +!!(buf & mask); + mask >>= 1; + } + } + } + } else { + let bits = 0; + buf = 0; + for (i = 0, ii = length; i < ii; ++i) { + if (i % rowComps === 0) { + buf = 0; + bits = 0; + } + while (bits < bpc) { + buf = buf << 8 | buffer[bufferPos++]; + bits += 8; + } + const remainingBits = bits - bpc; + let value = buf >> remainingBits; + if (value < 0) { + value = 0; + } else if (value > max) { + value = max; + } + output[i] = value; + buf &= (1 << remainingBits) - 1; + bits = remainingBits; + } + } + return output; + } + async fillOpacity(rgbaBuf, width, height, actualHeight, image) { + const smask = this.smask; + const mask = this.mask; + let alphaBuf, sw, sh, i, ii, j; + if (smask) { + sw = smask.width; + sh = smask.height; + alphaBuf = new Uint8ClampedArray(sw * sh); + await smask.fillGrayBuffer(alphaBuf); + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); + } + } else if (mask) { + if (mask instanceof PDFImage) { + sw = mask.width; + sh = mask.height; + alphaBuf = new Uint8ClampedArray(sw * sh); + mask.numComps = 1; + await mask.fillGrayBuffer(alphaBuf); + for (i = 0, ii = sw * sh; i < ii; ++i) { + alphaBuf[i] = 255 - alphaBuf[i]; + } + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height); + } + } else if (Array.isArray(mask)) { + alphaBuf = new Uint8ClampedArray(width * height); + const numComps = this.numComps; + for (i = 0, ii = width * height; i < ii; ++i) { + let opacity = 0; + const imageOffset = i * numComps; + for (j = 0; j < numComps; ++j) { + const color = image[imageOffset + j]; + const maskOffset = j * 2; + if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { + opacity = 255; + break; + } + } + alphaBuf[i] = opacity; + } + } else { + throw new FormatError("Unknown mask format."); + } + } + if (alphaBuf) { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = alphaBuf[i]; + } + } else { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = 255; + } + } + } + undoPreblend(buffer, width, height) { + const matte = this.smask?.matte; + if (!matte) { + return; + } + const matteRgb = this.colorSpace.getRgb(matte, 0); + const matteR = matteRgb[0]; + const matteG = matteRgb[1]; + const matteB = matteRgb[2]; + const length = width * height * 4; + for (let i = 0; i < length; i += 4) { + const alpha = buffer[i + 3]; + if (alpha === 0) { + buffer[i] = 255; + buffer[i + 1] = 255; + buffer[i + 2] = 255; + continue; + } + const k = 255 / alpha; + buffer[i] = (buffer[i] - matteR) * k + matteR; + buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG; + buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB; + } + } + async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) { + const drawWidth = this.drawWidth; + const drawHeight = this.drawHeight; + const imgData = { + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate, + kind: 0, + data: null + }; + const numComps = this.numComps; + const originalWidth = this.width; + const originalHeight = this.height; + const bpc = this.bpc; + const rowBytes = originalWidth * numComps * bpc + 7 >> 3; + const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight); + if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") { + imgData.kind = ImageKind.RGBA_32BPP; + const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, {}); + if (isOffscreenCanvasSupported) { + if (!mustBeResized) { + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray); + } + return ImageResizer.createImage(imgData, false); + } + return imgData; + } + if (!forceRGBA) { + let kind; + if (this.colorSpace.name === "DeviceGray" && bpc === 1) { + kind = ImageKind.GRAYSCALE_1BPP; + } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) { + kind = ImageKind.RGB_24BPP; + } + if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { + const image = await this.#getImage(originalWidth, originalHeight); + if (image) { + return image; + } + const data = await this.getImageBytes(originalHeight * rowBytes, {}); + if (isOffscreenCanvasSupported) { + if (mustBeResized) { + return ImageResizer.createImage({ + data, + kind, + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate + }, this.needsDecode); + } + return this.createBitmap(kind, originalWidth, originalHeight, data); + } + imgData.kind = kind; + imgData.data = data; + if (this.needsDecode) { + assert(kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale."); + const buffer = imgData.data; + for (let i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] ^= 0xff; + } + } + return imgData; + } + if (this.image instanceof JpegStream && !this.smask && !this.mask && !this.needsDecode) { + let imageLength = originalHeight * rowBytes; + if (isOffscreenCanvasSupported && !mustBeResized) { + let isHandled = false; + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 4; + isHandled = true; + break; + case "DeviceRGB": + imageLength = imageLength / 3 * 4; + isHandled = true; + break; + case "DeviceCMYK": + isHandled = true; + break; + } + if (isHandled) { + const image = await this.#getImage(drawWidth, drawHeight); + if (image) { + return image; + } + const rgba = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGBA: true + }); + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba); + } + } else { + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 3; + case "DeviceRGB": + case "DeviceCMYK": + imgData.kind = ImageKind.RGB_24BPP; + imgData.data = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGB: true + }); + if (mustBeResized) { + return ImageResizer.createImage(imgData); + } + return imgData; + } + } + } + } + const imgArray = await this.getImageBytes(originalHeight * rowBytes, { + internal: true + }); + const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; + const comps = this.getComponents(imgArray); + let alpha01, maybeUndoPreblend; + let canvas, ctx, canvasImgData, data; + if (isOffscreenCanvasSupported && !mustBeResized) { + canvas = new OffscreenCanvas(drawWidth, drawHeight); + ctx = canvas.getContext("2d"); + canvasImgData = ctx.createImageData(drawWidth, drawHeight); + data = canvasImgData.data; + } + imgData.kind = ImageKind.RGBA_32BPP; + if (!forceRGBA && !this.smask && !this.mask) { + if (!isOffscreenCanvasSupported || mustBeResized) { + imgData.kind = ImageKind.RGB_24BPP; + data = new Uint8ClampedArray(drawWidth * drawHeight * 3); + alpha01 = 0; + } else { + const arr = new Uint32Array(data.buffer); + arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff); + alpha01 = 1; + } + maybeUndoPreblend = false; + } else { + if (!isOffscreenCanvasSupported || mustBeResized) { + data = new Uint8ClampedArray(drawWidth * drawHeight * 4); + } + alpha01 = 1; + maybeUndoPreblend = true; + await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + this.colorSpace.fillRgb(data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); + if (maybeUndoPreblend) { + this.undoPreblend(data, drawWidth, actualHeight); + } + if (isOffscreenCanvasSupported && !mustBeResized) { + ctx.putImageData(canvasImgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width: drawWidth, + height: drawHeight, + bitmap, + interpolate: this.interpolate + }; + } + imgData.data = data; + if (mustBeResized) { + return ImageResizer.createImage(imgData); + } + return imgData; + } + async fillGrayBuffer(buffer) { + const numComps = this.numComps; + if (numComps !== 1) { + throw new FormatError(`Reading gray scale from a color image: ${numComps}`); + } + const width = this.width; + const height = this.height; + const bpc = this.bpc; + const rowBytes = width * numComps * bpc + 7 >> 3; + const imgArray = await this.getImageBytes(height * rowBytes, { + internal: true + }); + const comps = this.getComponents(imgArray); + let i, length; + if (bpc === 1) { + length = width * height; + if (this.needsDecode) { + for (i = 0; i < length; ++i) { + buffer[i] = comps[i] - 1 & 255; + } + } else { + for (i = 0; i < length; ++i) { + buffer[i] = -comps[i] & 255; + } + } + return; + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + length = width * height; + const scale = 255 / ((1 << bpc) - 1); + for (i = 0; i < length; ++i) { + buffer[i] = scale * comps[i]; + } + } + createBitmap(kind, width, height, src) { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + let imgData; + if (kind === ImageKind.RGBA_32BPP) { + imgData = new ImageData(src, width, height); + } else { + imgData = ctx.createImageData(width, height); + convertToRGBA({ + kind, + src, + dest: new Uint32Array(imgData.data.buffer), + width, + height, + inverseDecode: this.needsDecode + }); + } + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + bitmap, + interpolate: this.interpolate + }; + } + async #getImage(width, height) { + const bitmap = await this.image.getTransferableImage(); + if (!bitmap) { + return null; + } + return { + data: null, + width, + height, + bitmap, + interpolate: this.interpolate + }; + } + async getImageBytes(length, { + drawWidth, + drawHeight, + forceRGBA = false, + forceRGB = false, + internal = false + }) { + this.image.reset(); + this.image.drawWidth = drawWidth || this.width; + this.image.drawHeight = drawHeight || this.height; + this.image.forceRGBA = !!forceRGBA; + this.image.forceRGB = !!forceRGB; + const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions); + if (internal || this.image instanceof DecodeStream) { + return imageBytes; + } + assert(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.'); + return new Uint8Array(imageBytes); + } +} + +;// ./src/core/evaluator.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const DefaultPartialEvaluatorOptions = Object.freeze({ + maxImageSize: -1, + disableFontFace: false, + ignoreErrors: false, + isEvalSupported: true, + isOffscreenCanvasSupported: false, + isImageDecoderSupported: false, + canvasMaxAreaInBytes: -1, + fontExtraProperties: false, + useSystemFonts: true, + cMapUrl: null, + standardFontDataUrl: null +}); +const PatternType = { + TILING: 1, + SHADING: 2 +}; +const TEXT_CHUNK_BATCH_SIZE = 10; +const deferred = Promise.resolve(); +function normalizeBlendMode(value, parsingArray = false) { + if (Array.isArray(value)) { + for (const val of value) { + const maybeBM = normalizeBlendMode(val, true); + if (maybeBM) { + return maybeBM; + } + } + warn(`Unsupported blend mode Array: ${value}`); + return "source-over"; + } + if (!(value instanceof Name)) { + if (parsingArray) { + return null; + } + return "source-over"; + } + switch (value.name) { + case "Normal": + case "Compatible": + return "source-over"; + case "Multiply": + return "multiply"; + case "Screen": + return "screen"; + case "Overlay": + return "overlay"; + case "Darken": + return "darken"; + case "Lighten": + return "lighten"; + case "ColorDodge": + return "color-dodge"; + case "ColorBurn": + return "color-burn"; + case "HardLight": + return "hard-light"; + case "SoftLight": + return "soft-light"; + case "Difference": + return "difference"; + case "Exclusion": + return "exclusion"; + case "Hue": + return "hue"; + case "Saturation": + return "saturation"; + case "Color": + return "color"; + case "Luminosity": + return "luminosity"; + } + if (parsingArray) { + return null; + } + warn(`Unsupported blend mode: ${value.name}`); + return "source-over"; +} +function addLocallyCachedImageOps(opList, data) { + if (data.objId) { + opList.addDependency(data.objId); + } + opList.addImageOps(data.fn, data.args, data.optionalContent); + if (data.fn === OPS.paintImageMaskXObject && data.args[0]?.count > 0) { + data.args[0].count++; + } +} +class TimeSlotManager { + static TIME_SLOT_DURATION_MS = 20; + static CHECK_TIME_EVERY = 100; + constructor() { + this.reset(); + } + check() { + if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) { + return false; + } + this.checked = 0; + return this.endTime <= Date.now(); + } + reset() { + this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS; + this.checked = 0; + } +} +class PartialEvaluator { + constructor({ + xref, + handler, + pageIndex, + idFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + systemFontCache, + options = null + }) { + this.xref = xref; + this.handler = handler; + this.pageIndex = pageIndex; + this.idFactory = idFactory; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalImageCache = globalImageCache; + this.systemFontCache = systemFontCache; + this.options = options || DefaultPartialEvaluatorOptions; + this.type3FontRefs = null; + this._regionalImageCache = new RegionalImageCache(); + this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); + ImageResizer.setOptions(this.options); + JpegStream.setOptions(this.options); + } + get _pdfFunctionFactory() { + const pdfFunctionFactory = new PDFFunctionFactory({ + xref: this.xref, + isEvalSupported: this.options.isEvalSupported + }); + return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); + } + get parsingType3Font() { + return !!this.type3FontRefs; + } + clone(newOptions = null) { + const newEvaluator = Object.create(this); + newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions); + return newEvaluator; + } + hasBlendModes(resources, nonBlendModesSet) { + if (!(resources instanceof Dict)) { + return false; + } + if (resources.objId && nonBlendModesSet.has(resources.objId)) { + return false; + } + const processed = new RefSet(nonBlendModesSet); + if (resources.objId) { + processed.put(resources.objId); + } + const nodes = [resources], + xref = this.xref; + while (nodes.length) { + const node = nodes.shift(); + const graphicStates = node.get("ExtGState"); + if (graphicStates instanceof Dict) { + for (let graphicState of graphicStates.getRawValues()) { + if (graphicState instanceof Ref) { + if (processed.has(graphicState)) { + continue; + } + try { + graphicState = xref.fetch(graphicState); + } catch (ex) { + processed.put(graphicState); + info(`hasBlendModes - ignoring ExtGState: "${ex}".`); + continue; + } + } + if (!(graphicState instanceof Dict)) { + continue; + } + if (graphicState.objId) { + processed.put(graphicState.objId); + } + const bm = graphicState.get("BM"); + if (bm instanceof Name) { + if (bm.name !== "Normal") { + return true; + } + continue; + } + if (bm !== undefined && Array.isArray(bm)) { + for (const element of bm) { + if (element instanceof Name && element.name !== "Normal") { + return true; + } + } + } + } + } + const xObjects = node.get("XObject"); + if (!(xObjects instanceof Dict)) { + continue; + } + for (let xObject of xObjects.getRawValues()) { + if (xObject instanceof Ref) { + if (processed.has(xObject)) { + continue; + } + try { + xObject = xref.fetch(xObject); + } catch (ex) { + processed.put(xObject); + info(`hasBlendModes - ignoring XObject: "${ex}".`); + continue; + } + } + if (!(xObject instanceof BaseStream)) { + continue; + } + if (xObject.dict.objId) { + processed.put(xObject.dict.objId); + } + const xResources = xObject.dict.get("Resources"); + if (!(xResources instanceof Dict)) { + continue; + } + if (xResources.objId && processed.has(xResources.objId)) { + continue; + } + nodes.push(xResources); + if (xResources.objId) { + processed.put(xResources.objId); + } + } + } + for (const ref of processed) { + nonBlendModesSet.put(ref); + } + return false; + } + async #fetchData(url) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`); + } + return new Uint8Array(await response.arrayBuffer()); + } + async fetchBuiltInCMap(name) { + const cachedData = this.builtInCMapCache.get(name); + if (cachedData) { + return cachedData; + } + let data; + if (this.options.cMapUrl !== null) { + const cMapData = await this.#fetchData(`${this.options.cMapUrl}${name}.bcmap`); + data = { + cMapData, + isCompressed: true + }; + } else { + data = await this.handler.sendWithPromise("FetchBuiltInCMap", { + name + }); + } + this.builtInCMapCache.set(name, data); + return data; + } + async fetchStandardFontData(name) { + const cachedData = this.standardFontDataCache.get(name); + if (cachedData) { + return new Stream(cachedData); + } + if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") { + return null; + } + const standardFontNameToFileName = getFontNameToFileMap(), + filename = standardFontNameToFileName[name]; + let data; + try { + if (this.options.standardFontDataUrl !== null) { + data = await this.#fetchData(`${this.options.standardFontDataUrl}${filename}`); + } else { + data = await this.handler.sendWithPromise("FetchStandardFontData", { + filename + }); + } + } catch (ex) { + warn(ex); + return null; + } + this.standardFontDataCache.set(name, data); + return new Stream(data); + } + async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) { + const dict = xobj.dict; + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + let optionalContent, groupOptions; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); + } + if (optionalContent !== undefined) { + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + const group = dict.get("Group"); + if (group) { + groupOptions = { + matrix, + bbox, + smask, + isolated: false, + knockout: false + }; + const groupSubtype = group.get("S"); + let colorSpace = null; + if (isName(groupSubtype, "Transparency")) { + groupOptions.isolated = group.get("I") || false; + groupOptions.knockout = group.get("K") || false; + if (group.has("CS")) { + const cs = group.getRaw("CS"); + const cachedColorSpace = ColorSpace.getCached(cs, this.xref, localColorSpaceCache); + if (cachedColorSpace) { + colorSpace = cachedColorSpace; + } else { + colorSpace = await this.parseColorSpace({ + cs, + resources, + localColorSpaceCache + }); + } + } + } + if (smask?.backdrop) { + colorSpace ||= ColorSpace.singletons.rgb; + smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); + } + operatorList.addOp(OPS.beginGroup, [groupOptions]); + } + const args = group ? [matrix, null] : [matrix, bbox]; + operatorList.addOp(OPS.paintFormXObjectBegin, args); + await this.getOperatorList({ + stream: xobj, + task, + resources: dict.get("Resources") || resources, + operatorList, + initialState + }); + operatorList.addOp(OPS.paintFormXObjectEnd, []); + if (group) { + operatorList.addOp(OPS.endGroup, [groupOptions]); + } + if (optionalContent !== undefined) { + operatorList.addOp(OPS.endMarkedContent, []); + } + } + _sendImgData(objId, imgData, cacheGlobally = false) { + const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null; + if (this.parsingType3Font || cacheGlobally) { + return this.handler.send("commonobj", [objId, "Image", imgData], transfers); + } + return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers); + } + async buildPaintImageXObject({ + resources, + image, + isInline = false, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + }) { + const dict = image.dict; + const imageRef = dict.objId; + const w = dict.get("W", "Width"); + const h = dict.get("H", "Height"); + if (!(w && typeof w === "number") || !(h && typeof h === "number")) { + warn("Image dimensions are missing, or not numbers."); + return; + } + const maxImageSize = this.options.maxImageSize; + if (maxImageSize !== -1 && w * h > maxImageSize) { + const msg = "Image exceeded maximum allowed size and was removed."; + if (this.options.ignoreErrors) { + warn(msg); + return; + } + throw new Error(msg); + } + let optionalContent; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); + } + const imageMask = dict.get("IM", "ImageMask") || false; + let imgData, args; + if (imageMask) { + const interpolate = dict.get("I", "Interpolate"); + const bitStrideLength = w + 7 >> 3; + const imgArray = image.getBytes(bitStrideLength * h); + const decode = dict.getArray("D", "Decode"); + if (this.parsingType3Font) { + imgData = PDFImage.createRawMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof DecodeStream, + inverseDecode: decode?.[0] > 0, + interpolate + }); + imgData.cached = !!cacheKey; + args = [imgData]; + operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); + if (cacheKey) { + const cacheData = { + fn: OPS.paintImageMaskXObject, + args, + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + imgData = await PDFImage.createMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof DecodeStream, + inverseDecode: decode?.[0] > 0, + interpolate, + isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported + }); + if (imgData.isSingleOpaquePixel) { + operatorList.addImageOps(OPS.paintSolidColorImageMask, [], optionalContent); + if (cacheKey) { + const cacheData = { + fn: OPS.paintSolidColorImageMask, + args: [], + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + const objId = `mask_${this.idFactory.createObjId()}`; + operatorList.addDependency(objId); + imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; + this._sendImgData(objId, imgData); + args = [{ + data: objId, + width: imgData.width, + height: imgData.height, + interpolate: imgData.interpolate, + count: 1 + }]; + operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); + if (cacheKey) { + const cacheData = { + objId, + fn: OPS.paintImageMaskXObject, + args, + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } + } + return; + } + const SMALL_IMAGE_DIMENSIONS = 200; + if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !dict.has("SMask") && !dict.has("Mask")) { + try { + const imageObj = new PDFImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }); + imgData = await imageObj.createImageData(true, false); + operatorList.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported; + operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent); + } catch (reason) { + const msg = `Unable to decode inline image: "${reason}".`; + if (!this.options.ignoreErrors) { + throw new Error(msg); + } + warn(msg); + } + return; + } + let objId = `img_${this.idFactory.createObjId()}`, + cacheGlobally = false; + if (this.parsingType3Font) { + objId = `${this.idFactory.getDocId()}_type3_${objId}`; + } else if (cacheKey && imageRef) { + cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex); + if (cacheGlobally) { + assert(!isInline, "Cannot cache an inline image globally."); + objId = `${this.idFactory.getDocId()}_${objId}`; + } + } + operatorList.addDependency(objId); + args = [objId, w, h]; + operatorList.addImageOps(OPS.paintImageXObject, args, optionalContent); + if (cacheGlobally) { + if (this.globalImageCache.hasDecodeFailed(imageRef)) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + byteSize: 0 + }); + this._sendImgData(objId, null, cacheGlobally); + return; + } + if (w * h > 250000 || dict.has("SMask") || dict.has("Mask")) { + const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", { + imageRef + }]); + if (localLength) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + byteSize: 0 + }); + this.globalImageCache.addByteSize(imageRef, localLength); + return; + } + } + } + PDFImage.buildImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }).then(async imageObj => { + imgData = await imageObj.createImageData(false, this.options.isOffscreenCanvasSupported); + imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; + imgData.ref = imageRef; + if (cacheGlobally) { + this.globalImageCache.addByteSize(imageRef, imgData.dataLen); + } + return this._sendImgData(objId, imgData, cacheGlobally); + }).catch(reason => { + warn(`Unable to decode image "${objId}": "${reason}".`); + if (imageRef) { + this.globalImageCache.addDecodeFailed(imageRef); + } + return this._sendImgData(objId, null, cacheGlobally); + }); + if (cacheKey) { + const cacheData = { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + if (cacheGlobally) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + byteSize: 0 + }); + } + } + } + } + handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) { + const smaskContent = smask.get("G"); + const smaskOptions = { + subtype: smask.get("S").name, + backdrop: smask.get("BC") + }; + const transferObj = smask.get("TR"); + if (isPDFFunction(transferObj)) { + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256); + const tmp = new Float32Array(1); + for (let i = 0; i < 256; i++) { + tmp[0] = i / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[i] = tmp[0] * 255 | 0; + } + smaskOptions.transferMap = transferMap; + } + return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone(), localColorSpaceCache); + } + handleTransferFunction(tr) { + let transferArray; + if (Array.isArray(tr)) { + transferArray = tr; + } else if (isPDFFunction(tr)) { + transferArray = [tr]; + } else { + return null; + } + const transferMaps = []; + let numFns = 0, + numEffectfulFns = 0; + for (const entry of transferArray) { + const transferObj = this.xref.fetchIfRef(entry); + numFns++; + if (isName(transferObj, "Identity")) { + transferMaps.push(null); + continue; + } else if (!isPDFFunction(transferObj)) { + return null; + } + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256), + tmp = new Float32Array(1); + for (let j = 0; j < 256; j++) { + tmp[0] = j / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[j] = tmp[0] * 255 | 0; + } + transferMaps.push(transferMap); + numEffectfulFns++; + } + if (!(numFns === 1 || numFns === 4)) { + return null; + } + if (numEffectfulFns === 0) { + return null; + } + return transferMaps; + } + handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache) { + const tilingOpList = new OperatorList(); + const patternResources = Dict.merge({ + xref: this.xref, + dictArray: [patternDict.get("Resources"), resources] + }); + return this.getOperatorList({ + stream: pattern, + task, + resources: patternResources, + operatorList: tilingOpList + }).then(function () { + const operatorListIR = tilingOpList.getIR(); + const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color); + operatorList.addDependencies(tilingOpList.dependencies); + operatorList.addOp(fn, tilingPatternIR); + if (patternDict.objId) { + localTilingPatternCache.set(null, patternDict.objId, { + operatorListIR, + dict: patternDict + }); + } + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`handleTilingType - ignoring pattern: "${reason}".`); + return; + } + throw reason; + }); + } + async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null) { + const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null; + let translated = await this.loadFont(fontName, fontRef, resources, fallbackFontDict, cssFontInfo); + if (translated.font.isType3Font) { + try { + await translated.loadType3Data(this, resources, task); + operatorList.addDependencies(translated.type3Dependencies); + } catch (reason) { + translated = new TranslatedFont({ + loadedName: "g_font_error", + font: new ErrorFont(`Type3 font load error: ${reason}`), + dict: translated.font, + evaluatorOptions: this.options + }); + } + } + state.font = translated.font; + translated.send(this.handler); + return translated.loadedName; + } + handleText(chars, state) { + const font = state.font; + const glyphs = font.charsToGlyphs(chars); + if (font.data) { + const isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || this.options.disableFontFace) { + PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options); + } + } + return glyphs; + } + ensureStateFont(state) { + if (state.font) { + return; + } + const reason = new FormatError("Missing setFont (Tf) operator before text rendering operator."); + if (this.options.ignoreErrors) { + warn(`ensureStateFont: "${reason}".`); + return; + } + throw reason; + } + async setGState({ + resources, + gState, + operatorList, + cacheKey, + task, + stateManager, + localGStateCache, + localColorSpaceCache + }) { + const gStateRef = gState.objId; + let isSimpleGState = true; + const gStateObj = []; + let promise = Promise.resolve(); + for (const key of gState.getKeys()) { + const value = gState.get(key); + switch (key) { + case "Type": + break; + case "LW": + case "LC": + case "LJ": + case "ML": + case "D": + case "RI": + case "FL": + case "CA": + case "ca": + gStateObj.push([key, value]); + break; + case "Font": + isSimpleGState = false; + promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) { + operatorList.addDependency(loadedName); + gStateObj.push([key, [loadedName, value[1]]]); + })); + break; + case "BM": + gStateObj.push([key, normalizeBlendMode(value)]); + break; + case "SMask": + if (isName(value, "None")) { + gStateObj.push([key, false]); + break; + } + if (value instanceof Dict) { + isSimpleGState = false; + promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache)); + gStateObj.push([key, true]); + } else { + warn("Unsupported SMask type"); + } + break; + case "TR": + const transferMaps = this.handleTransferFunction(value); + gStateObj.push([key, transferMaps]); + break; + case "OP": + case "op": + case "OPM": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + case "TR2": + case "HT": + case "SM": + case "SA": + case "AIS": + case "TK": + info("graphic state operator " + key); + break; + default: + info("Unknown graphic state operator " + key); + break; + } + } + await promise; + if (gStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [gStateObj]); + } + if (isSimpleGState) { + localGStateCache.set(cacheKey, gStateRef, gStateObj); + } + } + loadFont(fontName, font, resources, fallbackFontDict = null, cssFontInfo = null) { + const errorFont = async () => { + return new TranslatedFont({ + loadedName: "g_font_error", + font: new ErrorFont(`Font "${fontName}" is not available.`), + dict: font, + evaluatorOptions: this.options + }); + }; + let fontRef; + if (font) { + if (font instanceof Ref) { + fontRef = font; + } + } else { + const fontRes = resources.get("Font"); + if (fontRes) { + fontRef = fontRes.getRaw(fontName); + } + } + if (fontRef) { + if (this.type3FontRefs?.has(fontRef)) { + return errorFont(); + } + if (this.fontCache.has(fontRef)) { + return this.fontCache.get(fontRef); + } + try { + font = this.xref.fetchIfRef(fontRef); + } catch (ex) { + warn(`loadFont - lookup failed: "${ex}".`); + } + } + if (!(font instanceof Dict)) { + if (!this.options.ignoreErrors && !this.parsingType3Font) { + warn(`Font "${fontName}" is not available.`); + return errorFont(); + } + warn(`Font "${fontName}" is not available -- attempting to fallback to a default font.`); + font = fallbackFontDict || PartialEvaluator.fallbackFontDict; + } + if (font.cacheKey && this.fontCache.has(font.cacheKey)) { + return this.fontCache.get(font.cacheKey); + } + const { + promise, + resolve + } = Promise.withResolvers(); + let preEvaluatedFont; + try { + preEvaluatedFont = this.preEvaluateFont(font); + preEvaluatedFont.cssFontInfo = cssFontInfo; + } catch (reason) { + warn(`loadFont - preEvaluateFont failed: "${reason}".`); + return errorFont(); + } + const { + descriptor, + hash + } = preEvaluatedFont; + const fontRefIsRef = fontRef instanceof Ref; + let fontID; + if (hash && descriptor instanceof Dict) { + const fontAliases = descriptor.fontAliases ||= Object.create(null); + if (fontAliases[hash]) { + const aliasFontRef = fontAliases[hash].aliasRef; + if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) { + this.fontCache.putAlias(fontRef, aliasFontRef); + return this.fontCache.get(fontRef); + } + } else { + fontAliases[hash] = { + fontID: this.idFactory.createFontId() + }; + } + if (fontRefIsRef) { + fontAliases[hash].aliasRef = fontRef; + } + fontID = fontAliases[hash].fontID; + } else { + fontID = this.idFactory.createFontId(); + } + assert(fontID?.startsWith("f"), 'The "fontID" must be (correctly) defined.'); + if (fontRefIsRef) { + this.fontCache.put(fontRef, promise); + } else { + font.cacheKey = `cacheKey_${fontID}`; + this.fontCache.put(font.cacheKey, promise); + } + font.loadedName = `${this.idFactory.getDocId()}_${fontID}`; + this.translateFont(preEvaluatedFont).then(translatedFont => { + resolve(new TranslatedFont({ + loadedName: font.loadedName, + font: translatedFont, + dict: font, + evaluatorOptions: this.options + })); + }).catch(reason => { + warn(`loadFont - translateFont failed: "${reason}".`); + resolve(new TranslatedFont({ + loadedName: font.loadedName, + font: new ErrorFont(reason instanceof Error ? reason.message : reason), + dict: font, + evaluatorOptions: this.options + })); + }); + return promise; + } + buildPath(operatorList, fn, args, parsingText = false) { + const lastIndex = operatorList.length - 1; + if (!args) { + args = []; + } + if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== OPS.constructPath) { + if (parsingText) { + warn(`Encountered path operator "${fn}" inside of a text object.`); + operatorList.addOp(OPS.save, null); + } + let minMax; + switch (fn) { + case OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax = [Math.min(args[0], x), Math.min(args[1], y), Math.max(args[0], x), Math.max(args[1], y)]; + break; + case OPS.moveTo: + case OPS.lineTo: + minMax = [args[0], args[1], args[0], args[1]]; + break; + default: + minMax = [Infinity, Infinity, -Infinity, -Infinity]; + break; + } + operatorList.addOp(OPS.constructPath, [[fn], args, minMax]); + if (parsingText) { + operatorList.addOp(OPS.restore, null); + } + } else { + const opArgs = operatorList.argsArray[lastIndex]; + opArgs[0].push(fn); + opArgs[1].push(...args); + const minMax = opArgs[2]; + switch (fn) { + case OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax[0] = Math.min(minMax[0], args[0], x); + minMax[1] = Math.min(minMax[1], args[1], y); + minMax[2] = Math.max(minMax[2], args[0], x); + minMax[3] = Math.max(minMax[3], args[1], y); + break; + case OPS.moveTo: + case OPS.lineTo: + minMax[0] = Math.min(minMax[0], args[0]); + minMax[1] = Math.min(minMax[1], args[1]); + minMax[2] = Math.max(minMax[2], args[0]); + minMax[3] = Math.max(minMax[3], args[1]); + break; + } + } + } + parseColorSpace({ + cs, + resources, + localColorSpaceCache + }) { + return ColorSpace.parseAsync({ + cs, + xref: this.xref, + resources, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }).catch(reason => { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`parseColorSpace - ignoring ColorSpace: "${reason}".`); + return null; + } + throw reason; + }); + } + parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }) { + let id = localShadingPatternCache.get(shading); + if (id) { + return id; + } + let patternIR; + try { + const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, localColorSpaceCache); + patternIR = shadingFill.getIR(); + } catch (reason) { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`parseShading - ignoring shading: "${reason}".`); + localShadingPatternCache.set(shading, null); + return null; + } + throw reason; + } + id = `pattern_${this.idFactory.createObjId()}`; + if (this.parsingType3Font) { + id = `${this.idFactory.getDocId()}_type3_${id}`; + } + localShadingPatternCache.set(shading, id); + if (this.parsingType3Font) { + this.handler.send("commonobj", [id, "Pattern", patternIR]); + } else { + this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); + } + return id; + } + handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache) { + const patternName = args.pop(); + if (patternName instanceof Name) { + const rawPattern = patterns.getRaw(patternName.name); + const localTilingPattern = rawPattern instanceof Ref && localTilingPatternCache.getByRef(rawPattern); + if (localTilingPattern) { + try { + const color = cs.base ? cs.base.getRgb(args, 0) : null; + const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color); + operatorList.addOp(fn, tilingPatternIR); + return undefined; + } catch {} + } + const pattern = this.xref.fetchIfRef(rawPattern); + if (pattern) { + const dict = pattern instanceof BaseStream ? pattern.dict : pattern; + const typeNum = dict.get("PatternType"); + if (typeNum === PatternType.TILING) { + const color = cs.base ? cs.base.getRgb(args, 0) : null; + return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache); + } else if (typeNum === PatternType.SHADING) { + const shading = dict.get("Shading"); + const objId = this.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }); + if (objId) { + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + operatorList.addOp(fn, ["Shading", objId, matrix]); + } + return undefined; + } + throw new FormatError(`Unknown PatternType: ${typeNum}`); + } + } + throw new FormatError(`Unknown PatternName: ${patternName}`); + } + _parseVisibilityExpression(array, nestingCounter, currentResult) { + const MAX_NESTING = 10; + if (++nestingCounter > MAX_NESTING) { + warn("Visibility expression is too deeply nested"); + return; + } + const length = array.length; + const operator = this.xref.fetchIfRef(array[0]); + if (length < 2 || !(operator instanceof Name)) { + warn("Invalid visibility expression"); + return; + } + switch (operator.name) { + case "And": + case "Or": + case "Not": + currentResult.push(operator.name); + break; + default: + warn(`Invalid operator ${operator.name} in visibility expression`); + return; + } + for (let i = 1; i < length; i++) { + const raw = array[i]; + const object = this.xref.fetchIfRef(raw); + if (Array.isArray(object)) { + const nestedResult = []; + currentResult.push(nestedResult); + this._parseVisibilityExpression(object, nestingCounter, nestedResult); + } else if (raw instanceof Ref) { + currentResult.push(raw.toString()); + } + } + } + async parseMarkedContentProps(contentProperties, resources) { + let optionalContent; + if (contentProperties instanceof Name) { + const properties = resources.get("Properties"); + optionalContent = properties.get(contentProperties.name); + } else if (contentProperties instanceof Dict) { + optionalContent = contentProperties; + } else { + throw new FormatError("Optional content properties malformed."); + } + const optionalContentType = optionalContent.get("Type")?.name; + if (optionalContentType === "OCG") { + return { + type: optionalContentType, + id: optionalContent.objId + }; + } else if (optionalContentType === "OCMD") { + const expression = optionalContent.get("VE"); + if (Array.isArray(expression)) { + const result = []; + this._parseVisibilityExpression(expression, 0, result); + if (result.length > 0) { + return { + type: "OCMD", + expression: result + }; + } + } + const optionalContentGroups = optionalContent.get("OCGs"); + if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) { + const groupIds = []; + if (Array.isArray(optionalContentGroups)) { + for (const ocg of optionalContentGroups) { + groupIds.push(ocg.toString()); + } + } else { + groupIds.push(optionalContentGroups.objId); + } + return { + type: optionalContentType, + ids: groupIds, + policy: optionalContent.get("P") instanceof Name ? optionalContent.get("P").name : null, + expression: null + }; + } else if (optionalContentGroups instanceof Ref) { + return { + type: optionalContentType, + id: optionalContentGroups.toString() + }; + } + } + return null; + } + getOperatorList({ + stream, + task, + resources, + operatorList, + initialState = null, + fallbackFontDict = null + }) { + resources ||= Dict.empty; + initialState ||= new EvalState(); + if (!operatorList) { + throw new Error('getOperatorList: missing "operatorList" parameter'); + } + const self = this; + const xref = this.xref; + let parsingText = false; + const localImageCache = new LocalImageCache(); + const localColorSpaceCache = new LocalColorSpaceCache(); + const localGStateCache = new LocalGStateCache(); + const localTilingPatternCache = new LocalTilingPatternCache(); + const localShadingPatternCache = new Map(); + const xobjs = resources.get("XObject") || Dict.empty; + const patterns = resources.get("Pattern") || Dict.empty; + const stateManager = new StateManager(initialState); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + const timeSlotManager = new TimeSlotManager(); + function closePendingRestoreOPS(argument) { + for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { + operatorList.addOp(OPS.restore, []); + } + } + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + Promise.all([promise, operatorList.ready]).then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, i, ii, cs, name, isValidName; + while (!(stop = timeSlotManager.check())) { + operation.args = null; + if (!preprocessor.read(operation)) { + break; + } + let args = operation.args; + let fn = operation.fn; + switch (fn | 0) { + case OPS.paintXObject: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName) { + const localImage = localImageCache.getByName(name); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + args = null; + continue; + } + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new FormatError("XObject must be referred to by name."); + } + let xobj = xobjs.getRaw(name); + if (xobj instanceof Ref) { + const localImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); + if (globalImage) { + operatorList.addDependency(globalImage.objId); + operatorList.addImageOps(globalImage.fn, globalImage.args, globalImage.optionalContent); + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof BaseStream)) { + throw new FormatError("XObject should be a stream"); + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("XObject should have a Name subtype"); + } + if (type.name === "Form") { + stateManager.save(); + self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () { + stateManager.restore(); + resolveXObject(); + }, rejectXObject); + return; + } else if (type.name === "Image") { + self.buildPaintImageXObject({ + resources, + image: xobj, + operatorList, + cacheKey: name, + localImageCache, + localColorSpaceCache + }).then(resolveXObject, rejectXObject); + return; + } else if (type.name === "PS") { + info("Ignored XObject subtype PS"); + } else { + throw new FormatError(`Unhandled XObject subtype ${type.name}`); + } + resolveXObject(); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.setFont: + const fontSize = args[1]; + next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) { + operatorList.addDependency(loadedName); + operatorList.addOp(OPS.setFont, [loadedName, fontSize]); + })); + return; + case OPS.beginText: + parsingText = true; + break; + case OPS.endText: + parsingText = false; + break; + case OPS.endInlineImage: + const cacheKey = args[0].cacheKey; + if (cacheKey) { + const localImage = localImageCache.getByName(cacheKey); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + args = null; + continue; + } + } + next(self.buildPaintImageXObject({ + resources, + image: args[0], + isInline: true, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + })); + return; + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + args[0] = self.handleText(args[0], stateManager.state); + break; + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + const combinedGlyphs = [], + state = stateManager.state; + for (const arrItem of args[0]) { + if (typeof arrItem === "string") { + combinedGlyphs.push(...self.handleText(arrItem, state)); + } else if (typeof arrItem === "number") { + combinedGlyphs.push(arrItem); + } + } + args[0] = combinedGlyphs; + fn = OPS.showText; + break; + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + operatorList.addOp(OPS.nextLine); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + operatorList.addOp(OPS.nextLine); + operatorList.addOp(OPS.setWordSpacing, [args.shift()]); + operatorList.addOp(OPS.setCharSpacing, [args.shift()]); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.setTextRenderingMode: + stateManager.state.textRenderingMode = args[0]; + break; + case OPS.setFillColorSpace: + { + const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); + if (cachedColorSpace) { + stateManager.state.fillColorSpace = cachedColorSpace; + continue; + } + next(self.parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache + }).then(function (colorSpace) { + stateManager.state.fillColorSpace = colorSpace || ColorSpace.singletons.gray; + })); + return; + } + case OPS.setStrokeColorSpace: + { + const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); + if (cachedColorSpace) { + stateManager.state.strokeColorSpace = cachedColorSpace; + continue; + } + next(self.parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache + }).then(function (colorSpace) { + stateManager.state.strokeColorSpace = colorSpace || ColorSpace.singletons.gray; + })); + return; + } + case OPS.setFillColor: + cs = stateManager.state.fillColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColor: + cs = stateManager.state.strokeColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillGray: + stateManager.state.fillColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeGray: + stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillCMYKColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeCMYKColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillRGBColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setStrokeRGBColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setFillColorN: + cs = stateManager.state.patternFillColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + } + args = []; + fn = OPS.setFillTransparent; + break; + } + if (cs.name === "Pattern") { + next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColorN: + cs = stateManager.state.patternStrokeColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + } + args = []; + fn = OPS.setStrokeTransparent; + break; + } + if (cs.name === "Pattern") { + next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.shadingFill: + let shading; + try { + const shadingRes = resources.get("Shading"); + if (!shadingRes) { + throw new FormatError("No shading resource found"); + } + shading = shadingRes.get(args[0].name); + if (!shading) { + throw new FormatError("No shading object found"); + } + } catch (reason) { + if (reason instanceof AbortException) { + continue; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring Shading: "${reason}".`); + continue; + } + throw reason; + } + const patternId = self.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }); + if (!patternId) { + continue; + } + args = [patternId]; + fn = OPS.shadingFill; + break; + case OPS.setGState: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName) { + const localGStateObj = localGStateCache.getByName(name); + if (localGStateObj) { + if (localGStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [localGStateObj]); + } + args = null; + continue; + } + } + next(new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { + throw new FormatError("GState must be referred to by name."); + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof Dict)) { + throw new FormatError("ExtGState should be a dictionary."); + } + const gState = extGState.get(name); + if (!(gState instanceof Dict)) { + throw new FormatError("GState should be a dictionary."); + } + self.setGState({ + resources, + gState, + operatorList, + cacheKey: name, + task, + stateManager, + localGStateCache, + localColorSpaceCache + }).then(resolveGState, rejectGState); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.moveTo: + case OPS.lineTo: + case OPS.curveTo: + case OPS.curveTo2: + case OPS.curveTo3: + case OPS.closePath: + case OPS.rectangle: + self.buildPath(operatorList, fn, args, parsingText); + continue; + case OPS.markPoint: + case OPS.markPointProps: + case OPS.beginCompat: + case OPS.endCompat: + continue; + case OPS.beginMarkedContentProps: + if (!(args[0] instanceof Name)) { + warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`); + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); + continue; + } + if (args[0].name === "OC") { + next(self.parseMarkedContentProps(args[1], resources).then(data => { + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", data]); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`); + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); + return; + } + throw reason; + })); + return; + } + args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null]; + break; + case OPS.beginMarkedContent: + case OPS.endMarkedContent: + default: + if (args !== null) { + for (i = 0, ii = args.length; i < ii; i++) { + if (args[i] instanceof Dict) { + break; + } + } + if (i < ii) { + warn("getOperatorList - ignoring operator: " + fn); + continue; + } + } + } + operatorList.addOp(fn, args); + } + if (stop) { + next(deferred); + return; + } + closePendingRestoreOPS(); + resolve(); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + closePendingRestoreOPS(); + return; + } + throw reason; + }); + } + getTextContent({ + stream, + task, + resources, + stateManager = null, + includeMarkedContent = false, + sink, + seenStyles = new Set(), + viewBox, + lang = null, + markedContentData = null, + disableNormalization = false, + keepWhiteSpace = false + }) { + resources ||= Dict.empty; + stateManager ||= new StateManager(new TextState()); + if (includeMarkedContent) { + markedContentData ||= { + level: 0 + }; + } + const textContent = { + items: [], + styles: Object.create(null), + lang + }; + const textContentItem = { + initialized: false, + str: [], + totalWidth: 0, + totalHeight: 0, + width: 0, + height: 0, + vertical: false, + prevTransform: null, + textAdvanceScale: 0, + spaceInFlowMin: 0, + spaceInFlowMax: 0, + trackingSpaceMin: Infinity, + negativeSpaceMax: -Infinity, + notASpace: -Infinity, + transform: null, + fontName: null, + hasEOL: false + }; + const twoLastChars = [" ", " "]; + let twoLastCharsPos = 0; + function saveLastChar(char) { + const nextPos = (twoLastCharsPos + 1) % 2; + const ret = twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " "; + twoLastChars[twoLastCharsPos] = char; + twoLastCharsPos = nextPos; + return !keepWhiteSpace && ret; + } + function shouldAddWhitepsace() { + return !keepWhiteSpace && twoLastChars[twoLastCharsPos] !== " " && twoLastChars[(twoLastCharsPos + 1) % 2] === " "; + } + function resetLastChars() { + twoLastChars[0] = twoLastChars[1] = " "; + twoLastCharsPos = 0; + } + const TRACKING_SPACE_FACTOR = 0.102; + const NOT_A_SPACE_FACTOR = 0.03; + const NEGATIVE_SPACE_FACTOR = -0.2; + const SPACE_IN_FLOW_MIN_FACTOR = 0.102; + const SPACE_IN_FLOW_MAX_FACTOR = 0.6; + const VERTICAL_SHIFT_RATIO = 0.25; + const self = this; + const xref = this.xref; + const showSpacedTextBuffer = []; + let xobjs = null; + const emptyXObjectCache = new LocalImageCache(); + const emptyGStateCache = new LocalGStateCache(); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + let textState; + function pushWhitespace({ + width = 0, + height = 0, + transform = textContentItem.prevTransform, + fontName = textContentItem.fontName + }) { + textContent.items.push({ + str: " ", + dir: "ltr", + width, + height, + transform, + fontName, + hasEOL: false + }); + } + function getCurrentTextTransform() { + const font = textState.font; + const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; + if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)) { + const glyphHeight = font.bbox[3] - font.bbox[1]; + if (glyphHeight > 0) { + tsm[3] *= glyphHeight * textState.fontMatrix[3]; + } + } + return Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm)); + } + function ensureTextContentItem() { + if (textContentItem.initialized) { + return textContentItem; + } + const { + font, + loadedName + } = textState; + if (!seenStyles.has(loadedName)) { + seenStyles.add(loadedName); + textContent.styles[loadedName] = { + fontFamily: font.fallbackName, + ascent: font.ascent, + descent: font.descent, + vertical: font.vertical + }; + if (self.options.fontExtraProperties && font.systemFontInfo) { + const style = textContent.styles[loadedName]; + style.fontSubstitution = font.systemFontInfo.css; + style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName; + } + } + textContentItem.fontName = loadedName; + const trm = textContentItem.transform = getCurrentTextTransform(); + if (!font.vertical) { + textContentItem.width = textContentItem.totalWidth = 0; + textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]); + textContentItem.vertical = false; + } else { + textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]); + textContentItem.height = textContentItem.totalHeight = 0; + textContentItem.vertical = true; + } + const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; + const { + fontSize + } = textState; + textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR; + textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR; + textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR; + textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR; + textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR; + textContentItem.hasEOL = false; + textContentItem.initialized = true; + return textContentItem; + } + function updateAdvanceScale() { + if (!textContentItem.initialized) { + return; + } + const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + const scaleFactor = scaleCtmX * scaleLineX; + if (scaleFactor === textContentItem.textAdvanceScale) { + return; + } + if (!textContentItem.vertical) { + textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; + textContentItem.width = 0; + } else { + textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; + textContentItem.height = 0; + } + textContentItem.textAdvanceScale = scaleFactor; + } + function runBidiTransform(textChunk) { + let text = textChunk.str.join(""); + if (!disableNormalization) { + text = normalizeUnicode(text); + } + const bidiResult = bidi(text, -1, textChunk.vertical); + return { + str: bidiResult.str, + dir: bidiResult.dir, + width: Math.abs(textChunk.totalWidth), + height: Math.abs(textChunk.totalHeight), + transform: textChunk.transform, + fontName: textChunk.fontName, + hasEOL: textChunk.hasEOL + }; + } + async function handleSetFont(fontName, fontRef) { + const translated = await self.loadFont(fontName, fontRef, resources); + if (translated.font.isType3Font) { + try { + await translated.loadType3Data(self, resources, task); + } catch {} + } + textState.loadedName = translated.loadedName; + textState.font = translated.font; + textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; + } + function applyInverseRotation(x, y, matrix) { + const scale = Math.hypot(matrix[0], matrix[1]); + return [(matrix[0] * x + matrix[1] * y) / scale, (matrix[2] * x + matrix[3] * y) / scale]; + } + function compareWithLastPosition(glyphWidth) { + const currentTransform = getCurrentTextTransform(); + let posX = currentTransform[4]; + let posY = currentTransform[5]; + if (textState.font?.vertical) { + if (posX < viewBox[0] || posX > viewBox[2] || posY + glyphWidth < viewBox[1] || posY > viewBox[3]) { + return false; + } + } else if (posX + glyphWidth < viewBox[0] || posX > viewBox[2] || posY < viewBox[1] || posY > viewBox[3]) { + return false; + } + if (!textState.font || !textContentItem.prevTransform) { + return true; + } + let lastPosX = textContentItem.prevTransform[4]; + let lastPosY = textContentItem.prevTransform[5]; + if (lastPosX === posX && lastPosY === posY) { + return true; + } + let rotate = -1; + if (currentTransform[0] && currentTransform[1] === 0 && currentTransform[2] === 0) { + rotate = currentTransform[0] > 0 ? 0 : 180; + } else if (currentTransform[1] && currentTransform[0] === 0 && currentTransform[3] === 0) { + rotate = currentTransform[1] > 0 ? 90 : 270; + } + switch (rotate) { + case 0: + break; + case 90: + [posX, posY] = [posY, posX]; + [lastPosX, lastPosY] = [lastPosY, lastPosX]; + break; + case 180: + [posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY]; + break; + case 270: + [posX, posY] = [-posY, -posX]; + [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; + break; + default: + [posX, posY] = applyInverseRotation(posX, posY, currentTransform); + [lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform); + } + if (textState.font.vertical) { + const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; + const advanceX = posX - lastPosX; + const textOrientation = Math.sign(textContentItem.height); + if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceX) > 0.5 * textContentItem.width) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + if (Math.abs(advanceX) > textContentItem.width) { + appendEOL(); + return true; + } + if (advanceY <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { + if (shouldAddWhitepsace()) { + resetLastChars(); + flushTextContentItem(); + pushWhitespace({ + height: Math.abs(advanceY) + }); + } else { + textContentItem.height += advanceY; + } + } else if (!addFakeSpaces(advanceY, textContentItem.prevTransform, textOrientation)) { + if (textContentItem.str.length === 0) { + resetLastChars(); + pushWhitespace({ + height: Math.abs(advanceY) + }); + } else { + textContentItem.height += advanceY; + } + } + if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; + } + const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; + const advanceY = posY - lastPosY; + const textOrientation = Math.sign(textContentItem.width); + if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceY) > 0.5 * textContentItem.height) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + if (Math.abs(advanceY) > textContentItem.height) { + appendEOL(); + return true; + } + if (advanceX <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { + if (shouldAddWhitepsace()) { + resetLastChars(); + flushTextContentItem(); + pushWhitespace({ + width: Math.abs(advanceX) + }); + } else { + textContentItem.width += advanceX; + } + } else if (!addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)) { + if (textContentItem.str.length === 0) { + resetLastChars(); + pushWhitespace({ + width: Math.abs(advanceX) + }); + } else { + textContentItem.width += advanceX; + } + } + if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; + } + function buildTextContentItem({ + chars, + extraSpacing + }) { + const font = textState.font; + if (!chars) { + const charSpacing = textState.charSpacing + extraSpacing; + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + if (keepWhiteSpace) { + compareWithLastPosition(0); + } + return; + } + const glyphs = font.charsToGlyphs(chars); + const scale = textState.fontMatrix[0] * textState.fontSize; + for (let i = 0, ii = glyphs.length; i < ii; i++) { + const glyph = glyphs[i]; + const { + category + } = glyph; + if (category.isInvisibleFormatMark) { + continue; + } + let charSpacing = textState.charSpacing + (i + 1 === ii ? extraSpacing : 0); + let glyphWidth = glyph.width; + if (font.vertical) { + glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth; + } + let scaledDim = glyphWidth * scale; + if (!keepWhiteSpace && category.isWhitespace) { + if (!font.vertical) { + charSpacing += scaledDim + textState.wordSpacing; + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + charSpacing += -scaledDim + textState.wordSpacing; + textState.translateTextMatrix(0, -charSpacing); + } + saveLastChar(" "); + continue; + } + if (!category.isZeroWidthDiacritic && !compareWithLastPosition(scaledDim)) { + if (!font.vertical) { + textState.translateTextMatrix(scaledDim * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, scaledDim); + } + continue; + } + const textChunk = ensureTextContentItem(); + if (category.isZeroWidthDiacritic) { + scaledDim = 0; + } + if (!font.vertical) { + scaledDim *= textState.textHScale; + textState.translateTextMatrix(scaledDim, 0); + textChunk.width += scaledDim; + } else { + textState.translateTextMatrix(0, scaledDim); + scaledDim = Math.abs(scaledDim); + textChunk.height += scaledDim; + } + if (scaledDim) { + textChunk.prevTransform = getCurrentTextTransform(); + } + const glyphUnicode = glyph.unicode; + if (saveLastChar(glyphUnicode)) { + textChunk.str.push(" "); + } + textChunk.str.push(glyphUnicode); + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + } + } + function appendEOL() { + resetLastChars(); + if (textContentItem.initialized) { + textContentItem.hasEOL = true; + flushTextContentItem(); + } else { + textContent.items.push({ + str: "", + dir: "ltr", + width: 0, + height: 0, + transform: getCurrentTextTransform(), + fontName: textState.loadedName, + hasEOL: true + }); + } + } + function addFakeSpaces(width, transf, textOrientation) { + if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) { + if (textContentItem.initialized) { + resetLastChars(); + textContentItem.str.push(" "); + } + return false; + } + const fontName = textContentItem.fontName; + let height = 0; + if (textContentItem.vertical) { + height = width; + width = 0; + } + flushTextContentItem(); + resetLastChars(); + pushWhitespace({ + width: Math.abs(width), + height: Math.abs(height), + transform: transf || getCurrentTextTransform(), + fontName + }); + return true; + } + function flushTextContentItem() { + if (!textContentItem.initialized || !textContentItem.str) { + return; + } + if (!textContentItem.vertical) { + textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; + } else { + textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; + } + textContent.items.push(runBidiTransform(textContentItem)); + textContentItem.initialized = false; + textContentItem.str.length = 0; + } + function enqueueChunk(batch = false) { + const length = textContent.items.length; + if (length === 0) { + return; + } + if (batch && length < TEXT_CHUNK_BATCH_SIZE) { + return; + } + sink.enqueue(textContent, length); + textContent.items = []; + textContent.styles = Object.create(null); + } + const timeSlotManager = new TimeSlotManager(); + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + enqueueChunk(true); + Promise.all([promise, sink.ready]).then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, + name, + isValidName, + args = []; + while (!(stop = timeSlotManager.check())) { + args.length = 0; + operation.args = args; + if (!preprocessor.read(operation)) { + break; + } + const previousState = textState; + textState = stateManager.state; + const fn = operation.fn; + args = operation.args; + switch (fn | 0) { + case OPS.setFont: + const fontNameArg = args[0].name, + fontSizeArg = args[1]; + if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { + break; + } + flushTextContentItem(); + textState.fontName = fontNameArg; + textState.fontSize = fontSizeArg; + next(handleSetFont(fontNameArg, null)); + return; + case OPS.setTextRise: + textState.textRise = args[0]; + break; + case OPS.setHScale: + textState.textHScale = args[0] / 100; + break; + case OPS.setLeading: + textState.leading = args[0]; + break; + case OPS.moveText: + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.setLeadingMoveText: + textState.leading = -args[1]; + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.nextLine: + textState.carriageReturn(); + break; + case OPS.setTextMatrix: + textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + updateAdvanceScale(); + break; + case OPS.setCharSpacing: + textState.charSpacing = args[0]; + break; + case OPS.setWordSpacing: + textState.wordSpacing = args[0]; + break; + case OPS.beginText: + textState.textMatrix = IDENTITY_MATRIX.slice(); + textState.textLineMatrix = IDENTITY_MATRIX.slice(); + break; + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000; + const elements = args[0]; + for (let i = 0, ii = elements.length; i < ii; i++) { + const item = elements[i]; + if (typeof item === "string") { + showSpacedTextBuffer.push(item); + } else if (typeof item === "number" && item !== 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: item * spaceFactor + }); + } + } + if (showSpacedTextBuffer.length > 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: 0 + }); + } + break; + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.carriageReturn(); + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.wordSpacing = args[0]; + textState.charSpacing = args[1]; + textState.carriageReturn(); + buildTextContentItem({ + chars: args[2], + extraSpacing: 0 + }); + break; + case OPS.paintXObject: + flushTextContentItem(); + xobjs ??= resources.get("XObject") || Dict.empty; + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName && emptyXObjectCache.getByName(name)) { + break; + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new FormatError("XObject must be referred to by name."); + } + let xobj = xobjs.getRaw(name); + if (xobj instanceof Ref) { + if (emptyXObjectCache.getByRef(xobj)) { + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); + if (globalImage) { + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof BaseStream)) { + throw new FormatError("XObject should be a stream"); + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("XObject should have a Name subtype"); + } + if (type.name !== "Form") { + emptyXObjectCache.set(name, xobj.dict.objId, true); + resolveXObject(); + return; + } + const currentState = stateManager.state.clone(); + const xObjStateManager = new StateManager(currentState); + const matrix = lookupMatrix(xobj.dict.getArray("Matrix"), null); + if (matrix) { + xObjStateManager.transform(matrix); + } + enqueueChunk(); + const sinkWrapper = { + enqueueInvoked: false, + enqueue(chunk, size) { + this.enqueueInvoked = true; + sink.enqueue(chunk, size); + }, + get desiredSize() { + return sink.desiredSize; + }, + get ready() { + return sink.ready; + } + }; + self.getTextContent({ + stream: xobj, + task, + resources: xobj.dict.get("Resources") || resources, + stateManager: xObjStateManager, + includeMarkedContent, + sink: sinkWrapper, + seenStyles, + viewBox, + lang, + markedContentData, + disableNormalization, + keepWhiteSpace + }).then(function () { + if (!sinkWrapper.enqueueInvoked) { + emptyXObjectCache.set(name, xobj.dict.objId, true); + } + resolveXObject(); + }, rejectXObject); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.setGState: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName && emptyGStateCache.getByName(name)) { + break; + } + next(new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { + throw new FormatError("GState must be referred to by name."); + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof Dict)) { + throw new FormatError("ExtGState should be a dictionary."); + } + const gState = extGState.get(name); + if (!(gState instanceof Dict)) { + throw new FormatError("GState should be a dictionary."); + } + const gStateFont = gState.get("Font"); + if (!gStateFont) { + emptyGStateCache.set(name, gState.objId, true); + resolveGState(); + return; + } + flushTextContentItem(); + textState.fontName = null; + textState.fontSize = gStateFont[1]; + handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case OPS.beginMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentData.level++; + textContent.items.push({ + type: "beginMarkedContent", + tag: args[0] instanceof Name ? args[0].name : null + }); + } + break; + case OPS.beginMarkedContentProps: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentData.level++; + let mcid = null; + if (args[1] instanceof Dict) { + mcid = args[1].get("MCID"); + } + textContent.items.push({ + type: "beginMarkedContentProps", + id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null, + tag: args[0] instanceof Name ? args[0].name : null + }); + } + break; + case OPS.endMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + if (markedContentData.level === 0) { + break; + } + markedContentData.level--; + textContent.items.push({ + type: "endMarkedContent" + }); + } + break; + case OPS.restore: + if (previousState && (previousState.font !== textState.font || previousState.fontSize !== textState.fontSize || previousState.fontName !== textState.fontName)) { + flushTextContentItem(); + } + break; + } + if (textContent.items.length >= sink.desiredSize) { + stop = true; + break; + } + } + if (stop) { + next(deferred); + return; + } + flushTextContentItem(); + enqueueChunk(); + resolve(); + }).catch(reason => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + flushTextContentItem(); + enqueueChunk(); + return; + } + throw reason; + }); + } + async extractDataStructures(dict, properties) { + const xref = this.xref; + let cidToGidBytes; + const toUnicodePromise = this.readToUnicode(properties.toUnicode); + if (properties.composite) { + const cidSystemInfo = dict.get("CIDSystemInfo"); + if (cidSystemInfo instanceof Dict) { + properties.cidSystemInfo = { + registry: stringToPDFString(cidSystemInfo.get("Registry")), + ordering: stringToPDFString(cidSystemInfo.get("Ordering")), + supplement: cidSystemInfo.get("Supplement") + }; + } + try { + const cidToGidMap = dict.get("CIDToGIDMap"); + if (cidToGidMap instanceof BaseStream) { + cidToGidBytes = cidToGidMap.getBytes(); + } + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + warn(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`); + } + } + const differences = []; + let baseEncodingName = null; + let encoding; + if (dict.has("Encoding")) { + encoding = dict.get("Encoding"); + if (encoding instanceof Dict) { + baseEncodingName = encoding.get("BaseEncoding"); + baseEncodingName = baseEncodingName instanceof Name ? baseEncodingName.name : null; + if (encoding.has("Differences")) { + const diffEncoding = encoding.get("Differences"); + let index = 0; + for (const entry of diffEncoding) { + const data = xref.fetchIfRef(entry); + if (typeof data === "number") { + index = data; + } else if (data instanceof Name) { + differences[index++] = data.name; + } else { + throw new FormatError(`Invalid entry in 'Differences' array: ${data}`); + } + } + } + } else if (encoding instanceof Name) { + baseEncodingName = encoding.name; + } else { + const msg = "Encoding is not a Name nor a Dict"; + if (!this.options.ignoreErrors) { + throw new FormatError(msg); + } + warn(msg); + } + if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") { + baseEncodingName = null; + } + } + const nonEmbeddedFont = !properties.file || properties.isInternalFont, + isSymbolsFontName = getSymbolsFonts()[properties.name]; + if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { + baseEncodingName = null; + } + if (baseEncodingName) { + properties.defaultEncoding = getEncoding(baseEncodingName); + } else { + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); + encoding = StandardEncoding; + if (properties.type === "TrueType" && !isNonsymbolicFont) { + encoding = WinAnsiEncoding; + } + if (isSymbolicFont || isSymbolsFontName) { + encoding = MacRomanEncoding; + if (nonEmbeddedFont) { + if (/Symbol/i.test(properties.name)) { + encoding = SymbolSetEncoding; + } else if (/Dingbats/i.test(properties.name)) { + encoding = ZapfDingbatsEncoding; + } else if (/Wingdings/i.test(properties.name)) { + encoding = WinAnsiEncoding; + } + } + } + properties.defaultEncoding = encoding; + } + properties.differences = differences; + properties.baseEncodingName = baseEncodingName; + properties.hasEncoding = !!baseEncodingName || differences.length > 0; + properties.dict = dict; + properties.toUnicode = await toUnicodePromise; + const builtToUnicode = await this.buildToUnicode(properties); + properties.toUnicode = builtToUnicode; + if (cidToGidBytes) { + properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode); + } + return properties; + } + _simpleFontToUnicode(properties, forceGlyphs = false) { + assert(!properties.composite, "Must be a simple font."); + const toUnicode = []; + const encoding = properties.defaultEncoding.slice(); + const baseEncodingName = properties.baseEncodingName; + const differences = properties.differences; + for (const charcode in differences) { + const glyphName = differences[charcode]; + if (glyphName === ".notdef") { + continue; + } + encoding[charcode] = glyphName; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + for (const charcode in encoding) { + let glyphName = encoding[charcode]; + if (glyphName === "") { + continue; + } + let unicode = glyphsUnicodeMap[glyphName]; + if (unicode !== undefined) { + toUnicode[charcode] = String.fromCharCode(unicode); + continue; + } + let code = 0; + switch (glyphName[0]) { + case "G": + if (glyphName.length === 3) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "g": + if (glyphName.length === 5) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "C": + case "c": + if (glyphName.length >= 3 && glyphName.length <= 4) { + const codeStr = glyphName.substring(1); + if (forceGlyphs) { + code = parseInt(codeStr, 16); + break; + } + code = +codeStr; + if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) { + return this._simpleFontToUnicode(properties, true); + } + } + break; + case "u": + unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + code = unicode; + } + break; + default: + switch (glyphName) { + case "f_h": + case "f_t": + case "T_h": + toUnicode[charcode] = glyphName.replaceAll("_", ""); + continue; + } + break; + } + if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { + if (baseEncodingName && code === +charcode) { + const baseEncoding = getEncoding(baseEncodingName); + if (baseEncoding && (glyphName = baseEncoding[charcode])) { + toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); + continue; + } + } + toUnicode[charcode] = String.fromCodePoint(code); + } + } + return toUnicode; + } + async buildToUnicode(properties) { + properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0; + if (properties.hasIncludedToUnicodeMap) { + if (!properties.composite && properties.hasEncoding) { + properties.fallbackToUnicode = this._simpleFontToUnicode(properties); + } + return properties.toUnicode; + } + if (!properties.composite) { + return new ToUnicodeMap(this._simpleFontToUnicode(properties)); + } + if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof IdentityCMap) || properties.cidSystemInfo?.registry === "Adobe" && (properties.cidSystemInfo.ordering === "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" || properties.cidSystemInfo.ordering === "Korea1"))) { + const { + registry, + ordering + } = properties.cidSystemInfo; + const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`); + const ucs2CMap = await CMapFactory.create({ + encoding: ucs2CMapName, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + const toUnicode = [], + buf = []; + properties.cMap.forEach(function (charcode, cid) { + if (cid > 0xffff) { + throw new FormatError("Max size of CID is 65,535"); + } + const ucs2 = ucs2CMap.lookup(cid); + if (ucs2) { + buf.length = 0; + for (let i = 0, ii = ucs2.length; i < ii; i += 2) { + buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1)); + } + toUnicode[charcode] = String.fromCharCode(...buf); + } + }); + return new ToUnicodeMap(toUnicode); + } + return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar); + } + async readToUnicode(cmapObj) { + if (!cmapObj) { + return null; + } + if (cmapObj instanceof Name) { + const cmap = await CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + return new ToUnicodeMap(cmap.getMap()); + } + if (cmapObj instanceof BaseStream) { + try { + const cmap = await CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + const map = new Array(cmap.length); + cmap.forEach(function (charCode, token) { + if (typeof token === "number") { + map[charCode] = String.fromCodePoint(token); + return; + } + if (token.length % 2 !== 0) { + token = "\u0000" + token; + } + const str = []; + for (let k = 0; k < token.length; k += 2) { + const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + if ((w1 & 0xf800) !== 0xd800) { + str.push(w1); + continue; + } + k += 2; + const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); + } + map[charCode] = String.fromCodePoint(...str); + }); + return new ToUnicodeMap(map); + } catch (reason) { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); + return null; + } + throw reason; + } + } + return null; + } + readCidToGidMap(glyphsData, toUnicode) { + const result = []; + for (let j = 0, jj = glyphsData.length; j < jj; j++) { + const glyphID = glyphsData[j++] << 8 | glyphsData[j]; + const code = j >> 1; + if (glyphID === 0 && !toUnicode.has(code)) { + continue; + } + result[code] = glyphID; + } + return result; + } + extractWidths(dict, descriptor, properties) { + const xref = this.xref; + let glyphsWidths = []; + let defaultWidth = 0; + const glyphsVMetrics = []; + let defaultVMetrics; + if (properties.composite) { + const dw = dict.get("DW"); + defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000; + const widths = dict.get("W"); + if (Array.isArray(widths)) { + for (let i = 0, ii = widths.length; i < ii; i++) { + let start = xref.fetchIfRef(widths[i++]); + if (!Number.isInteger(start)) { + break; + } + const code = xref.fetchIfRef(widths[i]); + if (Array.isArray(code)) { + for (const c of code) { + const width = xref.fetchIfRef(c); + if (typeof width === "number") { + glyphsWidths[start] = width; + } + start++; + } + } else if (Number.isInteger(code)) { + const width = xref.fetchIfRef(widths[++i]); + if (typeof width !== "number") { + continue; + } + for (let j = start; j <= code; j++) { + glyphsWidths[j] = width; + } + } else { + break; + } + } + } + if (properties.vertical) { + const dw2 = dict.getArray("DW2"); + let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000]; + defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; + vmetrics = dict.get("W2"); + if (Array.isArray(vmetrics)) { + for (let i = 0, ii = vmetrics.length; i < ii; i++) { + let start = xref.fetchIfRef(vmetrics[i++]); + if (!Number.isInteger(start)) { + break; + } + const code = xref.fetchIfRef(vmetrics[i]); + if (Array.isArray(code)) { + for (let j = 0, jj = code.length; j < jj; j++) { + const vmetric = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])]; + if (isNumberArray(vmetric, null)) { + glyphsVMetrics[start] = vmetric; + } + start++; + } + } else if (Number.isInteger(code)) { + const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])]; + if (!isNumberArray(vmetric, null)) { + continue; + } + for (let j = start; j <= code; j++) { + glyphsVMetrics[j] = vmetric; + } + } else { + break; + } + } + } + } + } else { + const widths = dict.get("Widths"); + if (Array.isArray(widths)) { + let j = properties.firstChar; + for (const w of widths) { + const width = xref.fetchIfRef(w); + if (typeof width === "number") { + glyphsWidths[j] = width; + } + j++; + } + const missingWidth = descriptor.get("MissingWidth"); + defaultWidth = typeof missingWidth === "number" ? missingWidth : 0; + } else { + const baseFontName = dict.get("BaseFont"); + if (baseFontName instanceof Name) { + const metrics = this.getBaseFontMetrics(baseFontName.name); + glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); + defaultWidth = metrics.defaultWidth; + } + } + } + let isMonospace = true; + let firstWidth = defaultWidth; + for (const glyph in glyphsWidths) { + const glyphWidth = glyphsWidths[glyph]; + if (!glyphWidth) { + continue; + } + if (!firstWidth) { + firstWidth = glyphWidth; + continue; + } + if (firstWidth !== glyphWidth) { + isMonospace = false; + break; + } + } + if (isMonospace) { + properties.flags |= FontFlags.FixedPitch; + } else { + properties.flags &= ~FontFlags.FixedPitch; + } + properties.defaultWidth = defaultWidth; + properties.widths = glyphsWidths; + properties.defaultVMetrics = defaultVMetrics; + properties.vmetrics = glyphsVMetrics; + } + isSerifFont(baseFontName) { + const fontNameWoStyle = baseFontName.split("-", 1)[0]; + return fontNameWoStyle in getSerifFonts() || /serif/gi.test(fontNameWoStyle); + } + getBaseFontMetrics(name) { + let defaultWidth = 0; + let widths = Object.create(null); + let monospace = false; + const stdFontMap = getStdFontMap(); + let lookupName = stdFontMap[name] || name; + const Metrics = getMetrics(); + if (!(lookupName in Metrics)) { + lookupName = this.isSerifFont(name) ? "Times-Roman" : "Helvetica"; + } + const glyphWidths = Metrics[lookupName]; + if (typeof glyphWidths === "number") { + defaultWidth = glyphWidths; + monospace = true; + } else { + widths = glyphWidths(); + } + return { + defaultWidth, + monospace, + widths + }; + } + buildCharCodeToWidth(widthsByGlyphName, properties) { + const widths = Object.create(null); + const differences = properties.differences; + const encoding = properties.defaultEncoding; + for (let charCode = 0; charCode < 256; charCode++) { + if (charCode in differences && widthsByGlyphName[differences[charCode]]) { + widths[charCode] = widthsByGlyphName[differences[charCode]]; + continue; + } + if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { + widths[charCode] = widthsByGlyphName[encoding[charCode]]; + continue; + } + } + return widths; + } + preEvaluateFont(dict) { + const baseDict = dict; + let type = dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("invalid font Subtype"); + } + let composite = false; + let hash; + if (type.name === "Type0") { + const df = dict.get("DescendantFonts"); + if (!df) { + throw new FormatError("Descendant fonts are not specified"); + } + dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df; + if (!(dict instanceof Dict)) { + throw new FormatError("Descendant font is not a dictionary."); + } + type = dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("invalid font Subtype"); + } + composite = true; + } + let firstChar = dict.get("FirstChar"); + if (!Number.isInteger(firstChar)) { + firstChar = 0; + } + let lastChar = dict.get("LastChar"); + if (!Number.isInteger(lastChar)) { + lastChar = composite ? 0xffff : 0xff; + } + const descriptor = dict.get("FontDescriptor"); + const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode"); + if (descriptor) { + hash = new MurmurHash3_64(); + const encoding = baseDict.getRaw("Encoding"); + if (encoding instanceof Name) { + hash.update(encoding.name); + } else if (encoding instanceof Ref) { + hash.update(encoding.toString()); + } else if (encoding instanceof Dict) { + for (const entry of encoding.getRawValues()) { + if (entry instanceof Name) { + hash.update(entry.name); + } else if (entry instanceof Ref) { + hash.update(entry.toString()); + } else if (Array.isArray(entry)) { + const diffLength = entry.length, + diffBuf = new Array(diffLength); + for (let j = 0; j < diffLength; j++) { + const diffEntry = entry[j]; + if (diffEntry instanceof Name) { + diffBuf[j] = diffEntry.name; + } else if (typeof diffEntry === "number" || diffEntry instanceof Ref) { + diffBuf[j] = diffEntry.toString(); + } + } + hash.update(diffBuf.join()); + } + } + } + hash.update(`${firstChar}-${lastChar}`); + if (toUnicode instanceof BaseStream) { + const stream = toUnicode.str || toUnicode; + const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); + hash.update(uint8array); + } else if (toUnicode instanceof Name) { + hash.update(toUnicode.name); + } + const widths = dict.get("Widths") || baseDict.get("Widths"); + if (Array.isArray(widths)) { + const widthsBuf = []; + for (const entry of widths) { + if (typeof entry === "number" || entry instanceof Ref) { + widthsBuf.push(entry.toString()); + } + } + hash.update(widthsBuf.join()); + } + if (composite) { + hash.update("compositeFont"); + const compositeWidths = dict.get("W") || baseDict.get("W"); + if (Array.isArray(compositeWidths)) { + const widthsBuf = []; + for (const entry of compositeWidths) { + if (typeof entry === "number" || entry instanceof Ref) { + widthsBuf.push(entry.toString()); + } else if (Array.isArray(entry)) { + const subWidthsBuf = []; + for (const element of entry) { + if (typeof element === "number" || element instanceof Ref) { + subWidthsBuf.push(element.toString()); + } + } + widthsBuf.push(`[${subWidthsBuf.join()}]`); + } + } + hash.update(widthsBuf.join()); + } + const cidToGidMap = dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap"); + if (cidToGidMap instanceof Name) { + hash.update(cidToGidMap.name); + } else if (cidToGidMap instanceof Ref) { + hash.update(cidToGidMap.toString()); + } else if (cidToGidMap instanceof BaseStream) { + hash.update(cidToGidMap.peekBytes()); + } + } + } + return { + descriptor, + dict, + baseDict, + composite, + type: type.name, + firstChar, + lastChar, + toUnicode, + hash: hash ? hash.hexdigest() : "" + }; + } + async translateFont({ + descriptor, + dict, + baseDict, + composite, + type, + firstChar, + lastChar, + toUnicode, + cssFontInfo + }) { + const isType3Font = type === "Type3"; + if (!descriptor) { + if (isType3Font) { + const bbox = lookupNormalRect(dict.getArray("FontBBox"), [0, 0, 0, 0]); + descriptor = new Dict(null); + descriptor.set("FontName", Name.get(type)); + descriptor.set("FontBBox", bbox); + } else { + let baseFontName = dict.get("BaseFont"); + if (!(baseFontName instanceof Name)) { + throw new FormatError("Base font is not specified"); + } + baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-"); + const metrics = this.getBaseFontMetrics(baseFontName); + const fontNameWoStyle = baseFontName.split("-", 1)[0]; + const flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic); + const properties = { + type, + name: baseFontName, + loadedName: baseDict.loadedName, + systemFontInfo: null, + widths: metrics.widths, + defaultWidth: metrics.defaultWidth, + isSimulatedFlags: true, + flags, + firstChar, + lastChar, + toUnicode, + xHeight: 0, + capHeight: 0, + italicAngle: 0, + isType3Font + }; + const widths = dict.get("Widths"); + const standardFontName = getStandardFontName(baseFontName); + let file = null; + if (standardFontName) { + file = await this.fetchStandardFontData(standardFontName); + properties.isInternalFont = !!file; + } + if (!properties.isInternalFont && this.options.useSystemFonts) { + properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName, type); + } + const newProperties = await this.extractDataStructures(dict, properties); + if (Array.isArray(widths)) { + const glyphWidths = []; + let j = firstChar; + for (const w of widths) { + const width = this.xref.fetchIfRef(w); + if (typeof width === "number") { + glyphWidths[j] = width; + } + j++; + } + newProperties.widths = glyphWidths; + } else { + newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties); + } + return new Font(baseFontName, file, newProperties); + } + } + let fontName = descriptor.get("FontName"); + let baseFont = dict.get("BaseFont"); + if (typeof fontName === "string") { + fontName = Name.get(fontName); + } + if (typeof baseFont === "string") { + baseFont = Name.get(baseFont); + } + const fontNameStr = fontName?.name; + const baseFontStr = baseFont?.name; + if (!isType3Font && fontNameStr !== baseFontStr) { + info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`); + if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) { + fontName = null; + } + } + fontName ||= baseFont; + if (!(fontName instanceof Name)) { + throw new FormatError("invalid font name"); + } + let fontFile, subtype, length1, length2, length3; + try { + fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3"); + if (fontFile) { + if (!(fontFile instanceof BaseStream)) { + throw new FormatError("FontFile should be a stream"); + } else if (fontFile.isEmpty) { + throw new FormatError("FontFile is empty"); + } + } + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`); + fontFile = null; + } + let isInternalFont = false; + let glyphScaleFactors = null; + let systemFontInfo = null; + if (fontFile) { + if (fontFile.dict) { + const subtypeEntry = fontFile.dict.get("Subtype"); + if (subtypeEntry instanceof Name) { + subtype = subtypeEntry.name; + } + length1 = fontFile.dict.get("Length1"); + length2 = fontFile.dict.get("Length2"); + length3 = fontFile.dict.get("Length3"); + } + } else if (cssFontInfo) { + const standardFontName = getXfaFontName(fontName.name); + if (standardFontName) { + cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`; + cssFontInfo.metrics = standardFontName.metrics || null; + glyphScaleFactors = standardFontName.factors || null; + fontFile = await this.fetchStandardFontData(standardFontName.name); + isInternalFont = !!fontFile; + baseDict = dict = getXfaFontDict(fontName.name); + composite = true; + } + } else if (!isType3Font) { + const standardFontName = getStandardFontName(fontName.name); + if (standardFontName) { + fontFile = await this.fetchStandardFontData(standardFontName); + isInternalFont = !!fontFile; + } + if (!isInternalFont && this.options.useSystemFonts) { + systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); + } + } + const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX); + const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), undefined); + let ascent = descriptor.get("Ascent"); + if (typeof ascent !== "number") { + ascent = undefined; + } + let descent = descriptor.get("Descent"); + if (typeof descent !== "number") { + descent = undefined; + } + let xHeight = descriptor.get("XHeight"); + if (typeof xHeight !== "number") { + xHeight = 0; + } + let capHeight = descriptor.get("CapHeight"); + if (typeof capHeight !== "number") { + capHeight = 0; + } + let flags = descriptor.get("Flags"); + if (!Number.isInteger(flags)) { + flags = 0; + } + let italicAngle = descriptor.get("ItalicAngle"); + if (typeof italicAngle !== "number") { + italicAngle = 0; + } + const properties = { + type, + name: fontName.name, + subtype, + file: fontFile, + length1, + length2, + length3, + isInternalFont, + loadedName: baseDict.loadedName, + composite, + fixedPitch: false, + fontMatrix, + firstChar, + lastChar, + toUnicode, + bbox, + ascent, + descent, + xHeight, + capHeight, + flags, + italicAngle, + isType3Font, + cssFontInfo, + scaleFactors: glyphScaleFactors, + systemFontInfo + }; + if (composite) { + const cidEncoding = baseDict.get("Encoding"); + if (cidEncoding instanceof Name) { + properties.cidEncoding = cidEncoding.name; + } + const cMap = await CMapFactory.create({ + encoding: cidEncoding, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + } + const newProperties = await this.extractDataStructures(dict, properties); + this.extractWidths(dict, descriptor, newProperties); + return new Font(fontName.name, fontFile, newProperties); + } + static buildFontPaths(font, glyphs, handler, evaluatorOptions) { + function buildPath(fontChar) { + const glyphName = `${font.loadedName}_path_${fontChar}`; + try { + if (font.renderer.hasBuiltPath(fontChar)) { + return; + } + handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); + } catch (reason) { + if (evaluatorOptions.ignoreErrors) { + warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); + return; + } + throw reason; + } + } + for (const glyph of glyphs) { + buildPath(glyph.fontChar); + const accent = glyph.accent; + if (accent?.fontChar) { + buildPath(accent.fontChar); + } + } + } + static get fallbackFontDict() { + const dict = new Dict(); + dict.set("BaseFont", Name.get("Helvetica")); + dict.set("Type", Name.get("FallbackType")); + dict.set("Subtype", Name.get("FallbackType")); + dict.set("Encoding", Name.get("WinAnsiEncoding")); + return shadow(this, "fallbackFontDict", dict); + } +} +class TranslatedFont { + constructor({ + loadedName, + font, + dict, + evaluatorOptions + }) { + this.loadedName = loadedName; + this.font = font; + this.dict = dict; + this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions; + this.type3Loaded = null; + this.type3Dependencies = font.isType3Font ? new Set() : null; + this.sent = false; + } + send(handler) { + if (this.sent) { + return; + } + this.sent = true; + handler.send("commonobj", [this.loadedName, "Font", this.font.exportData(this._evaluatorOptions.fontExtraProperties)]); + } + fallback(handler) { + if (!this.font.data) { + return; + } + this.font.disableFontFace = true; + PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, this._evaluatorOptions); + } + loadType3Data(evaluator, resources, task) { + if (this.type3Loaded) { + return this.type3Loaded; + } + if (!this.font.isType3Font) { + throw new Error("Must be a Type3 font."); + } + const type3Evaluator = evaluator.clone({ + ignoreErrors: false + }); + const type3FontRefs = new RefSet(evaluator.type3FontRefs); + if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) { + type3FontRefs.put(this.dict.objId); + } + type3Evaluator.type3FontRefs = type3FontRefs; + const translatedFont = this.font, + type3Dependencies = this.type3Dependencies; + let loadCharProcsPromise = Promise.resolve(); + const charProcs = this.dict.get("CharProcs"); + const fontResources = this.dict.get("Resources") || resources; + const charProcOperatorList = Object.create(null); + const fontBBox = Util.normalizeRect(translatedFont.bbox || [0, 0, 0, 0]), + width = fontBBox[2] - fontBBox[0], + height = fontBBox[3] - fontBBox[1]; + const fontBBoxSize = Math.hypot(width, height); + for (const key of charProcs.getKeys()) { + loadCharProcsPromise = loadCharProcsPromise.then(() => { + const glyphStream = charProcs.get(key); + const operatorList = new OperatorList(); + return type3Evaluator.getOperatorList({ + stream: glyphStream, + task, + resources: fontResources, + operatorList + }).then(() => { + if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) { + this._removeType3ColorOperators(operatorList, fontBBoxSize); + } + charProcOperatorList[key] = operatorList.getIR(); + for (const dependency of operatorList.dependencies) { + type3Dependencies.add(dependency); + } + }).catch(function (reason) { + warn(`Type3 font resource "${key}" is not available.`); + const dummyOperatorList = new OperatorList(); + charProcOperatorList[key] = dummyOperatorList.getIR(); + }); + }); + } + this.type3Loaded = loadCharProcsPromise.then(() => { + translatedFont.charProcOperatorList = charProcOperatorList; + if (this._bbox) { + translatedFont.isCharBBox = true; + translatedFont.bbox = this._bbox; + } + }); + return this.type3Loaded; + } + _removeType3ColorOperators(operatorList, fontBBoxSize = NaN) { + const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)), + width = charBBox[2] - charBBox[0], + height = charBBox[3] - charBBox[1]; + const charBBoxSize = Math.hypot(width, height); + if (width === 0 || height === 0) { + operatorList.fnArray.splice(0, 1); + operatorList.argsArray.splice(0, 1); + } else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) { + if (!this._bbox) { + this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; + } + this._bbox[0] = Math.min(this._bbox[0], charBBox[0]); + this._bbox[1] = Math.min(this._bbox[1], charBBox[1]); + this._bbox[2] = Math.max(this._bbox[2], charBBox[2]); + this._bbox[3] = Math.max(this._bbox[3], charBBox[3]); + } + let i = 0, + ii = operatorList.length; + while (i < ii) { + switch (operatorList.fnArray[i]) { + case OPS.setCharWidthAndBounds: + break; + case OPS.setStrokeColorSpace: + case OPS.setFillColorSpace: + case OPS.setStrokeColor: + case OPS.setStrokeColorN: + case OPS.setFillColor: + case OPS.setFillColorN: + case OPS.setStrokeGray: + case OPS.setFillGray: + case OPS.setStrokeRGBColor: + case OPS.setFillRGBColor: + case OPS.setStrokeCMYKColor: + case OPS.setFillCMYKColor: + case OPS.shadingFill: + case OPS.setRenderingIntent: + operatorList.fnArray.splice(i, 1); + operatorList.argsArray.splice(i, 1); + ii--; + continue; + case OPS.setGState: + const [gStateObj] = operatorList.argsArray[i]; + let j = 0, + jj = gStateObj.length; + while (j < jj) { + const [gStateKey] = gStateObj[j]; + switch (gStateKey) { + case "TR": + case "TR2": + case "HT": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + gStateObj.splice(j, 1); + jj--; + continue; + } + j++; + } + break; + } + i++; + } + } +} +class StateManager { + constructor(initialState = new EvalState()) { + this.state = initialState; + this.stateStack = []; + } + save() { + const old = this.state; + this.stateStack.push(this.state); + this.state = old.clone(); + } + restore() { + const prev = this.stateStack.pop(); + if (prev) { + this.state = prev; + } + } + transform(args) { + this.state.ctm = Util.transform(this.state.ctm, args); + } +} +class TextState { + constructor() { + this.ctm = new Float32Array(IDENTITY_MATRIX); + this.fontName = null; + this.fontSize = 0; + this.loadedName = null; + this.font = null; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.textMatrix = IDENTITY_MATRIX.slice(); + this.textLineMatrix = IDENTITY_MATRIX.slice(); + this.charSpacing = 0; + this.wordSpacing = 0; + this.leading = 0; + this.textHScale = 1; + this.textRise = 0; + } + setTextMatrix(a, b, c, d, e, f) { + const m = this.textMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + } + setTextLineMatrix(a, b, c, d, e, f) { + const m = this.textLineMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + } + translateTextMatrix(x, y) { + const m = this.textMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + } + translateTextLineMatrix(x, y) { + const m = this.textLineMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + } + carriageReturn() { + this.translateTextLineMatrix(0, -this.leading); + this.textMatrix = this.textLineMatrix.slice(); + } + clone() { + const clone = Object.create(this); + clone.textMatrix = this.textMatrix.slice(); + clone.textLineMatrix = this.textLineMatrix.slice(); + clone.fontMatrix = this.fontMatrix.slice(); + return clone; + } +} +class EvalState { + constructor() { + this.ctm = new Float32Array(IDENTITY_MATRIX); + this.font = null; + this.textRenderingMode = TextRenderingMode.FILL; + this._fillColorSpace = ColorSpace.singletons.gray; + this._strokeColorSpace = ColorSpace.singletons.gray; + this.patternFillColorSpace = null; + this.patternStrokeColorSpace = null; + } + get fillColorSpace() { + return this._fillColorSpace; + } + set fillColorSpace(colorSpace) { + this._fillColorSpace = this.patternFillColorSpace = colorSpace; + } + get strokeColorSpace() { + return this._strokeColorSpace; + } + set strokeColorSpace(colorSpace) { + this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace; + } + clone() { + return Object.create(this); + } +} +class EvaluatorPreprocessor { + static get opMap() { + return shadow(this, "opMap", Object.assign(Object.create(null), { + w: { + id: OPS.setLineWidth, + numArgs: 1, + variableArgs: false + }, + J: { + id: OPS.setLineCap, + numArgs: 1, + variableArgs: false + }, + j: { + id: OPS.setLineJoin, + numArgs: 1, + variableArgs: false + }, + M: { + id: OPS.setMiterLimit, + numArgs: 1, + variableArgs: false + }, + d: { + id: OPS.setDash, + numArgs: 2, + variableArgs: false + }, + ri: { + id: OPS.setRenderingIntent, + numArgs: 1, + variableArgs: false + }, + i: { + id: OPS.setFlatness, + numArgs: 1, + variableArgs: false + }, + gs: { + id: OPS.setGState, + numArgs: 1, + variableArgs: false + }, + q: { + id: OPS.save, + numArgs: 0, + variableArgs: false + }, + Q: { + id: OPS.restore, + numArgs: 0, + variableArgs: false + }, + cm: { + id: OPS.transform, + numArgs: 6, + variableArgs: false + }, + m: { + id: OPS.moveTo, + numArgs: 2, + variableArgs: false + }, + l: { + id: OPS.lineTo, + numArgs: 2, + variableArgs: false + }, + c: { + id: OPS.curveTo, + numArgs: 6, + variableArgs: false + }, + v: { + id: OPS.curveTo2, + numArgs: 4, + variableArgs: false + }, + y: { + id: OPS.curveTo3, + numArgs: 4, + variableArgs: false + }, + h: { + id: OPS.closePath, + numArgs: 0, + variableArgs: false + }, + re: { + id: OPS.rectangle, + numArgs: 4, + variableArgs: false + }, + S: { + id: OPS.stroke, + numArgs: 0, + variableArgs: false + }, + s: { + id: OPS.closeStroke, + numArgs: 0, + variableArgs: false + }, + f: { + id: OPS.fill, + numArgs: 0, + variableArgs: false + }, + F: { + id: OPS.fill, + numArgs: 0, + variableArgs: false + }, + "f*": { + id: OPS.eoFill, + numArgs: 0, + variableArgs: false + }, + B: { + id: OPS.fillStroke, + numArgs: 0, + variableArgs: false + }, + "B*": { + id: OPS.eoFillStroke, + numArgs: 0, + variableArgs: false + }, + b: { + id: OPS.closeFillStroke, + numArgs: 0, + variableArgs: false + }, + "b*": { + id: OPS.closeEOFillStroke, + numArgs: 0, + variableArgs: false + }, + n: { + id: OPS.endPath, + numArgs: 0, + variableArgs: false + }, + W: { + id: OPS.clip, + numArgs: 0, + variableArgs: false + }, + "W*": { + id: OPS.eoClip, + numArgs: 0, + variableArgs: false + }, + BT: { + id: OPS.beginText, + numArgs: 0, + variableArgs: false + }, + ET: { + id: OPS.endText, + numArgs: 0, + variableArgs: false + }, + Tc: { + id: OPS.setCharSpacing, + numArgs: 1, + variableArgs: false + }, + Tw: { + id: OPS.setWordSpacing, + numArgs: 1, + variableArgs: false + }, + Tz: { + id: OPS.setHScale, + numArgs: 1, + variableArgs: false + }, + TL: { + id: OPS.setLeading, + numArgs: 1, + variableArgs: false + }, + Tf: { + id: OPS.setFont, + numArgs: 2, + variableArgs: false + }, + Tr: { + id: OPS.setTextRenderingMode, + numArgs: 1, + variableArgs: false + }, + Ts: { + id: OPS.setTextRise, + numArgs: 1, + variableArgs: false + }, + Td: { + id: OPS.moveText, + numArgs: 2, + variableArgs: false + }, + TD: { + id: OPS.setLeadingMoveText, + numArgs: 2, + variableArgs: false + }, + Tm: { + id: OPS.setTextMatrix, + numArgs: 6, + variableArgs: false + }, + "T*": { + id: OPS.nextLine, + numArgs: 0, + variableArgs: false + }, + Tj: { + id: OPS.showText, + numArgs: 1, + variableArgs: false + }, + TJ: { + id: OPS.showSpacedText, + numArgs: 1, + variableArgs: false + }, + "'": { + id: OPS.nextLineShowText, + numArgs: 1, + variableArgs: false + }, + '"': { + id: OPS.nextLineSetSpacingShowText, + numArgs: 3, + variableArgs: false + }, + d0: { + id: OPS.setCharWidth, + numArgs: 2, + variableArgs: false + }, + d1: { + id: OPS.setCharWidthAndBounds, + numArgs: 6, + variableArgs: false + }, + CS: { + id: OPS.setStrokeColorSpace, + numArgs: 1, + variableArgs: false + }, + cs: { + id: OPS.setFillColorSpace, + numArgs: 1, + variableArgs: false + }, + SC: { + id: OPS.setStrokeColor, + numArgs: 4, + variableArgs: true + }, + SCN: { + id: OPS.setStrokeColorN, + numArgs: 33, + variableArgs: true + }, + sc: { + id: OPS.setFillColor, + numArgs: 4, + variableArgs: true + }, + scn: { + id: OPS.setFillColorN, + numArgs: 33, + variableArgs: true + }, + G: { + id: OPS.setStrokeGray, + numArgs: 1, + variableArgs: false + }, + g: { + id: OPS.setFillGray, + numArgs: 1, + variableArgs: false + }, + RG: { + id: OPS.setStrokeRGBColor, + numArgs: 3, + variableArgs: false + }, + rg: { + id: OPS.setFillRGBColor, + numArgs: 3, + variableArgs: false + }, + K: { + id: OPS.setStrokeCMYKColor, + numArgs: 4, + variableArgs: false + }, + k: { + id: OPS.setFillCMYKColor, + numArgs: 4, + variableArgs: false + }, + sh: { + id: OPS.shadingFill, + numArgs: 1, + variableArgs: false + }, + BI: { + id: OPS.beginInlineImage, + numArgs: 0, + variableArgs: false + }, + ID: { + id: OPS.beginImageData, + numArgs: 0, + variableArgs: false + }, + EI: { + id: OPS.endInlineImage, + numArgs: 1, + variableArgs: false + }, + Do: { + id: OPS.paintXObject, + numArgs: 1, + variableArgs: false + }, + MP: { + id: OPS.markPoint, + numArgs: 1, + variableArgs: false + }, + DP: { + id: OPS.markPointProps, + numArgs: 2, + variableArgs: false + }, + BMC: { + id: OPS.beginMarkedContent, + numArgs: 1, + variableArgs: false + }, + BDC: { + id: OPS.beginMarkedContentProps, + numArgs: 2, + variableArgs: false + }, + EMC: { + id: OPS.endMarkedContent, + numArgs: 0, + variableArgs: false + }, + BX: { + id: OPS.beginCompat, + numArgs: 0, + variableArgs: false + }, + EX: { + id: OPS.endCompat, + numArgs: 0, + variableArgs: false + }, + BM: null, + BD: null, + true: null, + fa: null, + fal: null, + fals: null, + false: null, + nu: null, + nul: null, + null: null + })); + } + static MAX_INVALID_PATH_OPS = 10; + constructor(stream, xref, stateManager = new StateManager()) { + this.parser = new Parser({ + lexer: new Lexer(stream, EvaluatorPreprocessor.opMap), + xref + }); + this.stateManager = stateManager; + this.nonProcessedArgs = []; + this._isPathOp = false; + this._numInvalidPathOPS = 0; + } + get savedStatesDepth() { + return this.stateManager.stateStack.length; + } + read(operation) { + let args = operation.args; + while (true) { + const obj = this.parser.getObj(); + if (obj instanceof Cmd) { + const cmd = obj.cmd; + const opSpec = EvaluatorPreprocessor.opMap[cmd]; + if (!opSpec) { + warn(`Unknown command "${cmd}".`); + continue; + } + const fn = opSpec.id; + const numArgs = opSpec.numArgs; + let argsLength = args !== null ? args.length : 0; + if (!this._isPathOp) { + this._numInvalidPathOPS = 0; + } + this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath; + if (!opSpec.variableArgs) { + if (argsLength !== numArgs) { + const nonProcessedArgs = this.nonProcessedArgs; + while (argsLength > numArgs) { + nonProcessedArgs.push(args.shift()); + argsLength--; + } + while (argsLength < numArgs && nonProcessedArgs.length !== 0) { + if (args === null) { + args = []; + } + args.unshift(nonProcessedArgs.pop()); + argsLength++; + } + } + if (argsLength < numArgs) { + const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`; + if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) { + throw new FormatError(`Invalid ${partialMsg}`); + } + warn(`Skipping ${partialMsg}`); + if (args !== null) { + args.length = 0; + } + continue; + } + } else if (argsLength > numArgs) { + info(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`); + } + this.preprocessCommand(fn, args); + operation.fn = fn; + operation.args = args; + return true; + } + if (obj === EOF) { + return false; + } + if (obj !== null) { + if (args === null) { + args = []; + } + args.push(obj); + if (args.length > 33) { + throw new FormatError("Too many arguments"); + } + } + } + } + preprocessCommand(fn, args) { + switch (fn | 0) { + case OPS.save: + this.stateManager.save(); + break; + case OPS.restore: + this.stateManager.restore(); + break; + case OPS.transform: + this.stateManager.transform(args); + break; + } + } +} + +;// ./src/core/default_appearance.js + + + + + + + + +class DefaultAppearanceEvaluator extends EvaluatorPreprocessor { + constructor(str) { + super(new StringStream(str)); + } + parse() { + const operation = { + fn: 0, + args: [] + }; + const result = { + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3) + }; + try { + while (true) { + operation.args.length = 0; + if (!this.read(operation)) { + break; + } + if (this.savedStatesDepth !== 0) { + continue; + } + const { + fn, + args + } = operation; + switch (fn | 0) { + case OPS.setFont: + const [fontName, fontSize] = args; + if (fontName instanceof Name) { + result.fontName = fontName.name; + } + if (typeof fontSize === "number" && fontSize > 0) { + result.fontSize = fontSize; + } + break; + case OPS.setFillRGBColor: + ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillGray: + ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillCMYKColor: + ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + } + } + } catch (reason) { + warn(`parseDefaultAppearance - ignoring errors: "${reason}".`); + } + return result; + } +} +function parseDefaultAppearance(str) { + return new DefaultAppearanceEvaluator(str).parse(); +} +class AppearanceStreamEvaluator extends EvaluatorPreprocessor { + constructor(stream, evaluatorOptions, xref) { + super(stream); + this.stream = stream; + this.evaluatorOptions = evaluatorOptions; + this.xref = xref; + this.resources = stream.dict?.get("Resources"); + } + parse() { + const operation = { + fn: 0, + args: [] + }; + let result = { + scaleFactor: 1, + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3), + fillColorSpace: ColorSpace.singletons.gray + }; + let breakLoop = false; + const stack = []; + try { + while (true) { + operation.args.length = 0; + if (breakLoop || !this.read(operation)) { + break; + } + const { + fn, + args + } = operation; + switch (fn | 0) { + case OPS.save: + stack.push({ + scaleFactor: result.scaleFactor, + fontSize: result.fontSize, + fontName: result.fontName, + fontColor: result.fontColor.slice(), + fillColorSpace: result.fillColorSpace + }); + break; + case OPS.restore: + result = stack.pop() || result; + break; + case OPS.setTextMatrix: + result.scaleFactor *= Math.hypot(args[0], args[1]); + break; + case OPS.setFont: + const [fontName, fontSize] = args; + if (fontName instanceof Name) { + result.fontName = fontName.name; + } + if (typeof fontSize === "number" && fontSize > 0) { + result.fontSize = fontSize * result.scaleFactor; + } + break; + case OPS.setFillColorSpace: + result.fillColorSpace = ColorSpace.parse({ + cs: args[0], + xref: this.xref, + resources: this.resources, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache: this._localColorSpaceCache + }); + break; + case OPS.setFillColor: + const cs = result.fillColorSpace; + cs.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillRGBColor: + ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillGray: + ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillCMYKColor: + ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.showText: + case OPS.showSpacedText: + case OPS.nextLineShowText: + case OPS.nextLineSetSpacingShowText: + breakLoop = true; + break; + } + } + } catch (reason) { + warn(`parseAppearanceStream - ignoring errors: "${reason}".`); + } + this.stream.reset(); + delete result.scaleFactor; + delete result.fillColorSpace; + return result; + } + get _localColorSpaceCache() { + return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache()); + } + get _pdfFunctionFactory() { + const pdfFunctionFactory = new PDFFunctionFactory({ + xref: this.xref, + isEvalSupported: this.evaluatorOptions.isEvalSupported + }); + return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); + } +} +function parseAppearanceStream(stream, evaluatorOptions, xref) { + return new AppearanceStreamEvaluator(stream, evaluatorOptions, xref).parse(); +} +function getPdfColor(color, isFill) { + if (color[0] === color[1] && color[1] === color[2]) { + const gray = color[0] / 255; + return `${numberToString(gray)} ${isFill ? "g" : "G"}`; + } + return Array.from(color, c => numberToString(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`; +} +function createDefaultAppearance({ + fontSize, + fontName, + fontColor +}) { + return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; +} +class FakeUnicodeFont { + constructor(xref, fontFamily) { + this.xref = xref; + this.widths = null; + this.firstChar = Infinity; + this.lastChar = -Infinity; + this.fontFamily = fontFamily; + const canvas = new OffscreenCanvas(1, 1); + this.ctxMeasure = canvas.getContext("2d", { + willReadFrequently: true + }); + if (!FakeUnicodeFont._fontNameId) { + FakeUnicodeFont._fontNameId = 1; + } + this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`); + } + get fontDescriptorRef() { + if (!FakeUnicodeFont._fontDescriptorRef) { + const fontDescriptor = new Dict(this.xref); + fontDescriptor.set("Type", Name.get("FontDescriptor")); + fontDescriptor.set("FontName", this.fontName); + fontDescriptor.set("FontFamily", "MyriadPro Regular"); + fontDescriptor.set("FontBBox", [0, 0, 0, 0]); + fontDescriptor.set("FontStretch", Name.get("Normal")); + fontDescriptor.set("FontWeight", 400); + fontDescriptor.set("ItalicAngle", 0); + FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor); + } + return FakeUnicodeFont._fontDescriptorRef; + } + get descendantFontRef() { + const descendantFont = new Dict(this.xref); + descendantFont.set("BaseFont", this.fontName); + descendantFont.set("Type", Name.get("Font")); + descendantFont.set("Subtype", Name.get("CIDFontType0")); + descendantFont.set("CIDToGIDMap", Name.get("Identity")); + descendantFont.set("FirstChar", this.firstChar); + descendantFont.set("LastChar", this.lastChar); + descendantFont.set("FontDescriptor", this.fontDescriptorRef); + descendantFont.set("DW", 1000); + const widths = []; + const chars = [...this.widths.entries()].sort(); + let currentChar = null; + let currentWidths = null; + for (const [char, width] of chars) { + if (!currentChar) { + currentChar = char; + currentWidths = [width]; + continue; + } + if (char === currentChar + currentWidths.length) { + currentWidths.push(width); + } else { + widths.push(currentChar, currentWidths); + currentChar = char; + currentWidths = [width]; + } + } + if (currentChar) { + widths.push(currentChar, currentWidths); + } + descendantFont.set("W", widths); + const cidSystemInfo = new Dict(this.xref); + cidSystemInfo.set("Ordering", "Identity"); + cidSystemInfo.set("Registry", "Adobe"); + cidSystemInfo.set("Supplement", 0); + descendantFont.set("CIDSystemInfo", cidSystemInfo); + return this.xref.getNewPersistentRef(descendantFont); + } + get baseFontRef() { + const baseFont = new Dict(this.xref); + baseFont.set("BaseFont", this.fontName); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type0")); + baseFont.set("Encoding", Name.get("Identity-H")); + baseFont.set("DescendantFonts", [this.descendantFontRef]); + baseFont.set("ToUnicode", Name.get("Identity-H")); + return this.xref.getNewPersistentRef(baseFont); + } + get resources() { + const resources = new Dict(this.xref); + const font = new Dict(this.xref); + font.set(this.fontName.name, this.baseFontRef); + resources.set("Font", font); + return resources; + } + _createContext() { + this.widths = new Map(); + this.ctxMeasure.font = `1000px ${this.fontFamily}`; + return this.ctxMeasure; + } + createFontResources(text) { + const ctx = this._createContext(); + for (const line of text.split(/\r\n?|\n/)) { + for (const char of line.split("")) { + const code = char.charCodeAt(0); + if (this.widths.has(code)) { + continue; + } + const metrics = ctx.measureText(char); + const width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); + } + } + return this.resources; + } + static getFirstPositionInfo(rect, rotation, fontSize) { + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + const lineHeight = LINE_FACTOR * fontSize; + const lineDescent = LINE_DESCENT_FACTOR * fontSize; + return { + coords: [0, h + lineDescent - lineHeight], + bbox: [0, 0, w, h], + matrix: rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined + }; + } + createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) { + const ctx = this._createContext(); + const lines = []; + let maxWidth = -Infinity; + for (const line of text.split(/\r\n?|\n/)) { + lines.push(line); + const lineWidth = ctx.measureText(line).width; + maxWidth = Math.max(maxWidth, lineWidth); + for (const code of codePointIter(line)) { + const char = String.fromCodePoint(code); + let width = this.widths.get(code); + if (width === undefined) { + const metrics = ctx.measureText(char); + width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); + } + } + } + maxWidth *= fontSize / 1000; + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + let hscale = 1; + if (maxWidth > w) { + hscale = w / maxWidth; + } + let vscale = 1; + const lineHeight = LINE_FACTOR * fontSize; + const lineDescent = LINE_DESCENT_FACTOR * fontSize; + const maxHeight = lineHeight * lines.length; + if (maxHeight > h) { + vscale = h / maxHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + const buffer = ["q", `0 0 ${numberToString(w)} ${numberToString(h)} re W n`, `BT`, `1 0 0 1 0 ${numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, `/${this.fontName.name} ${numberToString(newFontSize)} Tf`]; + const { + resources + } = this; + strokeAlpha = typeof strokeAlpha === "number" && strokeAlpha >= 0 && strokeAlpha <= 1 ? strokeAlpha : 1; + if (strokeAlpha !== 1) { + buffer.push("/R0 gs"); + const extGState = new Dict(this.xref); + const r0 = new Dict(this.xref); + r0.set("ca", strokeAlpha); + r0.set("CA", strokeAlpha); + r0.set("Type", Name.get("ExtGState")); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + } + const vShift = numberToString(lineHeight); + for (const line of lines) { + buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new Dict(this.xref); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, w, h]); + appearanceStreamDict.set("Length", appearance.length); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = getRotationMatrix(rotation, w, h); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} + +;// ./src/core/name_number_tree.js + + +class NameOrNumberTree { + constructor(root, xref, type) { + this.root = root; + this.xref = xref; + this._type = type; + } + getAll() { + const map = new Map(); + if (!this.root) { + return map; + } + const xref = this.xref; + const processed = new RefSet(); + processed.put(this.root); + const queue = [this.root]; + while (queue.length > 0) { + const obj = xref.fetchIfRef(queue.shift()); + if (!(obj instanceof Dict)) { + continue; + } + if (obj.has("Kids")) { + const kids = obj.get("Kids"); + if (!Array.isArray(kids)) { + continue; + } + for (const kid of kids) { + if (processed.has(kid)) { + throw new FormatError(`Duplicate entry in "${this._type}" tree.`); + } + queue.push(kid); + processed.put(kid); + } + continue; + } + const entries = obj.get(this._type); + if (!Array.isArray(entries)) { + continue; + } + for (let i = 0, ii = entries.length; i < ii; i += 2) { + map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); + } + } + return map; + } + getRaw(key) { + if (!this.root) { + return null; + } + const xref = this.xref; + let kidsOrEntries = xref.fetchIfRef(this.root); + let loopCount = 0; + const MAX_LEVELS = 10; + while (kidsOrEntries.has("Kids")) { + if (++loopCount > MAX_LEVELS) { + warn(`Search depth limit reached for "${this._type}" tree.`); + return null; + } + const kids = kidsOrEntries.get("Kids"); + if (!Array.isArray(kids)) { + return null; + } + let l = 0, + r = kids.length - 1; + while (l <= r) { + const m = l + r >> 1; + const kid = xref.fetchIfRef(kids[m]); + const limits = kid.get("Limits"); + if (key < xref.fetchIfRef(limits[0])) { + r = m - 1; + } else if (key > xref.fetchIfRef(limits[1])) { + l = m + 1; + } else { + kidsOrEntries = kid; + break; + } + } + if (l > r) { + return null; + } + } + const entries = kidsOrEntries.get(this._type); + if (Array.isArray(entries)) { + let l = 0, + r = entries.length - 2; + while (l <= r) { + const tmp = l + r >> 1, + m = tmp + (tmp & 1); + const currentKey = xref.fetchIfRef(entries[m]); + if (key < currentKey) { + r = m - 2; + } else if (key > currentKey) { + l = m + 2; + } else { + return entries[m + 1]; + } + } + } + return null; + } + get(key) { + return this.xref.fetchIfRef(this.getRaw(key)); + } +} +class NameTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Names"); + } +} +class NumberTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Nums"); + } +} + +;// ./src/core/cleanup_helper.js + + + + +function clearGlobalCaches() { + clearPatternCaches(); + clearPrimitiveCaches(); + clearUnicodeCaches(); + JpxImage.cleanup(); +} + +;// ./src/core/file_spec.js + + + +function pickPlatformItem(dict) { + if (!(dict instanceof Dict)) { + return null; + } + if (dict.has("UF")) { + return dict.get("UF"); + } else if (dict.has("F")) { + return dict.get("F"); + } else if (dict.has("Unix")) { + return dict.get("Unix"); + } else if (dict.has("Mac")) { + return dict.get("Mac"); + } else if (dict.has("DOS")) { + return dict.get("DOS"); + } + return null; +} +function stripPath(str) { + return str.substring(str.lastIndexOf("/") + 1); +} +class FileSpec { + #contentAvailable = false; + constructor(root, xref, skipContent = false) { + if (!(root instanceof Dict)) { + return; + } + this.xref = xref; + this.root = root; + if (root.has("FS")) { + this.fs = root.get("FS"); + } + if (root.has("RF")) { + warn("Related file specifications are not supported"); + } + if (!skipContent) { + if (root.has("EF")) { + this.#contentAvailable = true; + } else { + warn("Non-embedded file specifications are not supported"); + } + } + } + get filename() { + let filename = ""; + const item = pickPlatformItem(this.root); + if (item && typeof item === "string") { + filename = stringToPDFString(item).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); + } + return shadow(this, "filename", filename || "unnamed"); + } + get content() { + if (!this.#contentAvailable) { + return null; + } + this._contentRef ||= pickPlatformItem(this.root?.get("EF")); + let content = null; + if (this._contentRef) { + const fileObj = this.xref.fetchIfRef(this._contentRef); + if (fileObj instanceof BaseStream) { + content = fileObj.getBytes(); + } else { + warn("Embedded file specification points to non-existing/invalid content"); + } + } else { + warn("Embedded file specification does not have any content"); + } + return content; + } + get description() { + let description = ""; + const desc = this.root?.get("Desc"); + if (desc && typeof desc === "string") { + description = stringToPDFString(desc); + } + return shadow(this, "description", description); + } + get serializable() { + return { + rawFilename: this.filename, + filename: stripPath(this.filename), + content: this.content, + description: this.description + }; + } +} + +;// ./src/core/xml_parser.js + +const XMLParserErrorCode = { + NoError: 0, + EndOfDocument: -1, + UnterminatedCdat: -2, + UnterminatedXmlDeclaration: -3, + UnterminatedDoctypeDeclaration: -4, + UnterminatedComment: -5, + MalformedElement: -6, + OutOfMemory: -7, + UnterminatedAttributeValue: -8, + UnterminatedElement: -9, + ElementNeverBegun: -10 +}; +function isWhitespace(s, index) { + const ch = s[index]; + return ch === " " || ch === "\n" || ch === "\r" || ch === "\t"; +} +function isWhitespaceString(s) { + for (let i = 0, ii = s.length; i < ii; i++) { + if (!isWhitespace(s, i)) { + return false; + } + } + return true; +} +class XMLParserBase { + _resolveEntities(s) { + return s.replaceAll(/&([^;]+);/g, (all, entity) => { + if (entity.substring(0, 2) === "#x") { + return String.fromCodePoint(parseInt(entity.substring(2), 16)); + } else if (entity.substring(0, 1) === "#") { + return String.fromCodePoint(parseInt(entity.substring(1), 10)); + } + switch (entity) { + case "lt": + return "<"; + case "gt": + return ">"; + case "amp": + return "&"; + case "quot": + return '"'; + case "apos": + return "'"; + } + return this.onResolveEntity(entity); + }); + } + _parseContent(s, start) { + const attributes = []; + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") { + skipWs(); + let attrName = "", + attrValue = ""; + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") { + attrName += s[pos]; + ++pos; + } + skipWs(); + if (s[pos] !== "=") { + return null; + } + ++pos; + skipWs(); + const attrEndChar = s[pos]; + if (attrEndChar !== '"' && attrEndChar !== "'") { + return null; + } + const attrEndIndex = s.indexOf(attrEndChar, ++pos); + if (attrEndIndex < 0) { + return null; + } + attrValue = s.substring(pos, attrEndIndex); + attributes.push({ + name: attrName, + value: this._resolveEntities(attrValue) + }); + pos = attrEndIndex + 1; + skipWs(); + } + return { + name, + attributes, + parsed: pos - start + }; + } + _parseProcessingInstruction(s, start) { + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + const attrStart = pos; + while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) { + ++pos; + } + const value = s.substring(attrStart, pos); + return { + name, + value, + parsed: pos - start + }; + } + parseXml(s) { + let i = 0; + while (i < s.length) { + const ch = s[i]; + let j = i; + if (ch === "<") { + ++j; + const ch2 = s[j]; + let q; + switch (ch2) { + case "/": + ++j; + q = s.indexOf(">", j); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onEndElement(s.substring(j, q)); + j = q + 1; + break; + case "?": + ++j; + const pi = this._parseProcessingInstruction(s, j); + if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") { + this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration); + return; + } + this.onPi(pi.name, pi.value); + j += pi.parsed + 2; + break; + case "!": + if (s.substring(j + 1, j + 3) === "--") { + q = s.indexOf("-->", j + 3); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedComment); + return; + } + this.onComment(s.substring(j + 3, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "[CDATA[") { + q = s.indexOf("]]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedCdat); + return; + } + this.onCdata(s.substring(j + 8, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "DOCTYPE") { + const q2 = s.indexOf("[", j + 8); + let complexDoctype = false; + q = s.indexOf(">", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + if (q2 > 0 && q > q2) { + q = s.indexOf("]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + complexDoctype = true; + } + const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); + this.onDoctype(doctypeContent); + j = q + (complexDoctype ? 2 : 1); + } else { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + break; + default: + const content = this._parseContent(s, j); + if (content === null) { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + let isClosed = false; + if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { + isClosed = true; + } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onBeginElement(content.name, content.attributes, isClosed); + j += content.parsed + (isClosed ? 2 : 1); + break; + } + } else { + while (j < s.length && s[j] !== "<") { + j++; + } + const text = s.substring(i, j); + this.onText(this._resolveEntities(text)); + } + i = j; + } + } + onResolveEntity(name) { + return `&${name};`; + } + onPi(name, value) {} + onComment(text) {} + onCdata(text) {} + onDoctype(doctypeContent) {} + onText(text) {} + onBeginElement(name, attributes, isEmpty) {} + onEndElement(name) {} + onError(code) {} +} +class SimpleDOMNode { + constructor(nodeName, nodeValue) { + this.nodeName = nodeName; + this.nodeValue = nodeValue; + Object.defineProperty(this, "parentNode", { + value: null, + writable: true + }); + } + get firstChild() { + return this.childNodes?.[0]; + } + get nextSibling() { + const childNodes = this.parentNode.childNodes; + if (!childNodes) { + return undefined; + } + const index = childNodes.indexOf(this); + if (index === -1) { + return undefined; + } + return childNodes[index + 1]; + } + get textContent() { + if (!this.childNodes) { + return this.nodeValue || ""; + } + return this.childNodes.map(function (child) { + return child.textContent; + }).join(""); + } + get children() { + return this.childNodes || []; + } + hasChildNodes() { + return this.childNodes?.length > 0; + } + searchNode(paths, pos) { + if (pos >= paths.length) { + return this; + } + const component = paths[pos]; + if (component.name.startsWith("#") && pos < paths.length - 1) { + return this.searchNode(paths, pos + 1); + } + const stack = []; + let node = this; + while (true) { + if (component.name === node.nodeName) { + if (component.pos === 0) { + const res = node.searchNode(paths, pos + 1); + if (res !== null) { + return res; + } + } else if (stack.length === 0) { + return null; + } else { + const [parent] = stack.pop(); + let siblingPos = 0; + for (const child of parent.childNodes) { + if (component.name === child.nodeName) { + if (siblingPos === component.pos) { + return child.searchNode(paths, pos + 1); + } + siblingPos++; + } + } + return node.searchNode(paths, pos + 1); + } + } + if (node.childNodes?.length > 0) { + stack.push([node, 0]); + node = node.childNodes[0]; + } else if (stack.length === 0) { + return null; + } else { + while (stack.length !== 0) { + const [parent, currentPos] = stack.pop(); + const newPos = currentPos + 1; + if (newPos < parent.childNodes.length) { + stack.push([parent, newPos]); + node = parent.childNodes[newPos]; + break; + } + } + if (stack.length === 0) { + return null; + } + } + } + } + dump(buffer) { + if (this.nodeName === "#text") { + buffer.push(encodeToXmlString(this.nodeValue)); + return; + } + buffer.push(`<${this.nodeName}`); + if (this.attributes) { + for (const attribute of this.attributes) { + buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`); + } + } + if (this.hasChildNodes()) { + buffer.push(">"); + for (const child of this.childNodes) { + child.dump(buffer); + } + buffer.push(``); + } else if (this.nodeValue) { + buffer.push(`>${encodeToXmlString(this.nodeValue)}`); + } else { + buffer.push("/>"); + } + } +} +class SimpleXMLParser extends XMLParserBase { + constructor({ + hasAttributes = false, + lowerCaseName = false + }) { + super(); + this._currentFragment = null; + this._stack = null; + this._errorCode = XMLParserErrorCode.NoError; + this._hasAttributes = hasAttributes; + this._lowerCaseName = lowerCaseName; + } + parseFromString(data) { + this._currentFragment = []; + this._stack = []; + this._errorCode = XMLParserErrorCode.NoError; + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; + } + const [documentElement] = this._currentFragment; + if (!documentElement) { + return undefined; + } + return { + documentElement + }; + } + onText(text) { + if (isWhitespaceString(text)) { + return; + } + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onCdata(text) { + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onBeginElement(name, attributes, isEmpty) { + if (this._lowerCaseName) { + name = name.toLowerCase(); + } + const node = new SimpleDOMNode(name); + node.childNodes = []; + if (this._hasAttributes) { + node.attributes = attributes; + } + this._currentFragment.push(node); + if (isEmpty) { + return; + } + this._stack.push(this._currentFragment); + this._currentFragment = node.childNodes; + } + onEndElement(name) { + this._currentFragment = this._stack.pop() || []; + const lastElement = this._currentFragment.at(-1); + if (!lastElement) { + return null; + } + for (const childNode of lastElement.childNodes) { + childNode.parentNode = lastElement; + } + return lastElement; + } + onError(code) { + this._errorCode = code; + } +} + +;// ./src/core/metadata_parser.js + +class MetadataParser { + constructor(data) { + data = this._repair(data); + const parser = new SimpleXMLParser({ + lowerCaseName: true + }); + const xmlDocument = parser.parseFromString(data); + this._metadataMap = new Map(); + this._data = data; + if (xmlDocument) { + this._parse(xmlDocument); + } + } + _repair(data) { + return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { + const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { + return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); + }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) { + switch (name) { + case "amp": + return "&"; + case "apos": + return "'"; + case "gt": + return ">"; + case "lt": + return "<"; + case "quot": + return '"'; + } + throw new Error(`_repair: ${name} isn't defined.`); + }); + const charBuf = [">"]; + for (let i = 0, ii = bytes.length; i < ii; i += 2) { + const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); + if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) { + charBuf.push(String.fromCharCode(code)); + } else { + charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";"); + } + } + return charBuf.join(""); + }); + } + _getSequence(entry) { + const name = entry.nodeName; + if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { + return null; + } + return entry.childNodes.filter(node => node.nodeName === "rdf:li"); + } + _parseArray(entry) { + if (!entry.hasChildNodes()) { + return; + } + const [seqNode] = entry.childNodes; + const sequence = this._getSequence(seqNode) || []; + this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); + } + _parse(xmlDocument) { + let rdf = xmlDocument.documentElement; + if (rdf.nodeName !== "rdf:rdf") { + rdf = rdf.firstChild; + while (rdf && rdf.nodeName !== "rdf:rdf") { + rdf = rdf.nextSibling; + } + } + if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { + return; + } + for (const desc of rdf.childNodes) { + if (desc.nodeName !== "rdf:description") { + continue; + } + for (const entry of desc.childNodes) { + const name = entry.nodeName; + switch (name) { + case "#text": + continue; + case "dc:creator": + case "dc:subject": + this._parseArray(entry); + continue; + } + this._metadataMap.set(name, entry.textContent.trim()); + } + } + } + get serializable() { + return { + parsedData: this._metadataMap, + rawData: this._data + }; + } +} + +;// ./src/core/struct_tree.js + + + + +const MAX_DEPTH = 40; +const StructElementType = { + PAGE_CONTENT: 1, + STREAM_CONTENT: 2, + OBJECT: 3, + ANNOTATION: 4, + ELEMENT: 5 +}; +class StructTreeRoot { + constructor(rootDict, rootRef) { + this.dict = rootDict; + this.ref = rootRef instanceof Ref ? rootRef : null; + this.roleMap = new Map(); + this.structParentIds = null; + } + init() { + this.readRoleMap(); + } + #addIdToPage(pageRef, id, type) { + if (!(pageRef instanceof Ref) || id < 0) { + return; + } + this.structParentIds ||= new RefSetCache(); + let ids = this.structParentIds.get(pageRef); + if (!ids) { + ids = []; + this.structParentIds.put(pageRef, ids); + } + ids.push([id, type]); + } + addAnnotationIdToPage(pageRef, id) { + this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION); + } + readRoleMap() { + const roleMapDict = this.dict.get("RoleMap"); + if (!(roleMapDict instanceof Dict)) { + return; + } + for (const [key, value] of roleMapDict) { + if (value instanceof Name) { + this.roleMap.set(key, value.name); + } + } + } + static async canCreateStructureTree({ + catalogRef, + pdfManager, + newAnnotationsByPage + }) { + if (!(catalogRef instanceof Ref)) { + warn("Cannot save the struct tree: no catalog reference."); + return false; + } + let nextKey = 0; + let hasNothingToUpdate = true; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const { + ref: pageRef + } = await pdfManager.getPage(pageIndex); + if (!(pageRef instanceof Ref)) { + warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`); + hasNothingToUpdate = true; + break; + } + for (const element of elements) { + if (element.accessibilityData?.type) { + element.parentTreeId = nextKey++; + hasNothingToUpdate = false; + } + } + } + if (hasNothingToUpdate) { + for (const elements of newAnnotationsByPage.values()) { + for (const element of elements) { + delete element.parentTreeId; + } + } + return false; + } + return true; + } + static async createStructureTree({ + newAnnotationsByPage, + xref, + catalogRef, + pdfManager, + changes + }) { + const root = pdfManager.catalog.cloneDict(); + const cache = new RefSetCache(); + cache.put(catalogRef, root); + const structTreeRootRef = xref.getNewTemporaryRef(); + root.set("StructTreeRoot", structTreeRootRef); + const structTreeRoot = new Dict(xref); + structTreeRoot.set("Type", Name.get("StructTreeRoot")); + const parentTreeRef = xref.getNewTemporaryRef(); + structTreeRoot.set("ParentTree", parentTreeRef); + const kids = []; + structTreeRoot.set("K", kids); + cache.put(structTreeRootRef, structTreeRoot); + const parentTree = new Dict(xref); + const nums = []; + parentTree.set("Nums", nums); + const nextKey = await this.#writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot: null, + kids, + nums, + xref, + pdfManager, + changes, + cache + }); + structTreeRoot.set("ParentTreeNextKey", nextKey); + cache.put(parentTreeRef, parentTree); + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj + }); + } + } + async canUpdateStructTree({ + pdfManager, + xref, + newAnnotationsByPage + }) { + if (!this.ref) { + warn("Cannot update the struct tree: no root reference."); + return false; + } + let nextKey = this.dict.get("ParentTreeNextKey"); + if (!Number.isInteger(nextKey) || nextKey < 0) { + warn("Cannot update the struct tree: invalid next key."); + return false; + } + const parentTree = this.dict.get("ParentTree"); + if (!(parentTree instanceof Dict)) { + warn("Cannot update the struct tree: ParentTree isn't a dict."); + return false; + } + const nums = parentTree.get("Nums"); + if (!Array.isArray(nums)) { + warn("Cannot update the struct tree: nums isn't an array."); + return false; + } + const numberTree = new NumberTree(parentTree, xref); + for (const pageIndex of newAnnotationsByPage.keys()) { + const { + pageDict + } = await pdfManager.getPage(pageIndex); + if (!pageDict.has("StructParents")) { + continue; + } + const id = pageDict.get("StructParents"); + if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) { + warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`); + return false; + } + } + let hasNothingToUpdate = true; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const { + pageDict + } = await pdfManager.getPage(pageIndex); + StructTreeRoot.#collectParents({ + elements, + xref: this.dict.xref, + pageDict, + numberTree + }); + for (const element of elements) { + if (element.accessibilityData?.type) { + if (!(element.accessibilityData.structParent >= 0)) { + element.parentTreeId = nextKey++; + } + hasNothingToUpdate = false; + } + } + } + if (hasNothingToUpdate) { + for (const elements of newAnnotationsByPage.values()) { + for (const element of elements) { + delete element.parentTreeId; + delete element.structTreeParent; + } + } + return false; + } + return true; + } + async updateStructureTree({ + newAnnotationsByPage, + pdfManager, + changes + }) { + const xref = this.dict.xref; + const structTreeRoot = this.dict.clone(); + const structTreeRootRef = this.ref; + const cache = new RefSetCache(); + cache.put(structTreeRootRef, structTreeRoot); + let parentTreeRef = structTreeRoot.getRaw("ParentTree"); + let parentTree; + if (parentTreeRef instanceof Ref) { + parentTree = xref.fetch(parentTreeRef); + } else { + parentTree = parentTreeRef; + parentTreeRef = xref.getNewTemporaryRef(); + structTreeRoot.set("ParentTree", parentTreeRef); + } + parentTree = parentTree.clone(); + cache.put(parentTreeRef, parentTree); + let nums = parentTree.getRaw("Nums"); + let numsRef = null; + if (nums instanceof Ref) { + numsRef = nums; + nums = xref.fetch(numsRef); + } + nums = nums.slice(); + if (!numsRef) { + parentTree.set("Nums", nums); + } + const newNextKey = await StructTreeRoot.#writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot: this, + kids: null, + nums, + xref, + pdfManager, + changes, + cache + }); + if (newNextKey === -1) { + return; + } + structTreeRoot.set("ParentTreeNextKey", newNextKey); + if (numsRef) { + cache.put(numsRef, nums); + } + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj + }); + } + } + static async #writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot, + kids, + nums, + xref, + pdfManager, + changes, + cache + }) { + const objr = Name.get("OBJR"); + let nextKey = -1; + let structTreePageObjs; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const page = await pdfManager.getPage(pageIndex); + const { + ref: pageRef + } = page; + const isPageRef = pageRef instanceof Ref; + for (const { + accessibilityData, + ref, + parentTreeId, + structTreeParent + } of elements) { + if (!accessibilityData?.type) { + continue; + } + const { + structParent + } = accessibilityData; + if (structTreeRoot && Number.isInteger(structParent) && structParent >= 0) { + let objs = (structTreePageObjs ||= new Map()).get(pageIndex); + if (objs === undefined) { + const structTreePage = new StructTreePage(structTreeRoot, page.pageDict); + objs = structTreePage.collectObjects(pageRef); + structTreePageObjs.set(pageIndex, objs); + } + const objRef = objs?.get(structParent); + if (objRef) { + const tagDict = xref.fetch(objRef).clone(); + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + changes.put(objRef, { + data: tagDict + }); + continue; + } + } + nextKey = Math.max(nextKey, parentTreeId); + const tagRef = xref.getNewTemporaryRef(); + const tagDict = new Dict(xref); + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + await this.#updateParentTag({ + structTreeParent, + tagDict, + newTagRef: tagRef, + structTreeRootRef, + fallbackKids: kids, + xref, + cache + }); + const objDict = new Dict(xref); + tagDict.set("K", objDict); + objDict.set("Type", objr); + if (isPageRef) { + objDict.set("Pg", pageRef); + } + objDict.set("Obj", ref); + cache.put(tagRef, tagDict); + nums.push(parentTreeId, tagRef); + } + } + return nextKey + 1; + } + static #writeProperties(tagDict, { + type, + title, + lang, + alt, + expanded, + actualText + }) { + tagDict.set("S", Name.get(type)); + if (title) { + tagDict.set("T", stringToAsciiOrUTF16BE(title)); + } + if (lang) { + tagDict.set("Lang", stringToAsciiOrUTF16BE(lang)); + } + if (alt) { + tagDict.set("Alt", stringToAsciiOrUTF16BE(alt)); + } + if (expanded) { + tagDict.set("E", stringToAsciiOrUTF16BE(expanded)); + } + if (actualText) { + tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText)); + } + } + static #collectParents({ + elements, + xref, + pageDict, + numberTree + }) { + const idToElements = new Map(); + for (const element of elements) { + if (element.structTreeParentId) { + const id = parseInt(element.structTreeParentId.split("_mc")[1], 10); + let elems = idToElements.get(id); + if (!elems) { + elems = []; + idToElements.set(id, elems); + } + elems.push(element); + } + } + const id = pageDict.get("StructParents"); + if (!Number.isInteger(id)) { + return; + } + const parentArray = numberTree.get(id); + const updateElement = (kid, pageKid, kidRef) => { + const elems = idToElements.get(kid); + if (elems) { + const parentRef = pageKid.getRaw("P"); + const parentDict = xref.fetchIfRef(parentRef); + if (parentRef instanceof Ref && parentDict instanceof Dict) { + const params = { + ref: kidRef, + dict: pageKid + }; + for (const element of elems) { + element.structTreeParent = params; + } + } + return true; + } + return false; + }; + for (const kidRef of parentArray) { + if (!(kidRef instanceof Ref)) { + continue; + } + const pageKid = xref.fetch(kidRef); + const k = pageKid.get("K"); + if (Number.isInteger(k)) { + updateElement(k, pageKid, kidRef); + continue; + } + if (!Array.isArray(k)) { + continue; + } + for (let kid of k) { + kid = xref.fetchIfRef(kid); + if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) { + break; + } + if (!(kid instanceof Dict)) { + continue; + } + if (!isName(kid.get("Type"), "MCR")) { + break; + } + const mcid = kid.get("MCID"); + if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) { + break; + } + } + } + } + static async #updateParentTag({ + structTreeParent, + tagDict, + newTagRef, + structTreeRootRef, + fallbackKids, + xref, + cache + }) { + let ref = null; + let parentRef; + if (structTreeParent) { + ({ + ref + } = structTreeParent); + parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef; + } else { + parentRef = structTreeRootRef; + } + tagDict.set("P", parentRef); + const parentDict = xref.fetchIfRef(parentRef); + if (!parentDict) { + fallbackKids.push(newTagRef); + return; + } + let cachedParentDict = cache.get(parentRef); + if (!cachedParentDict) { + cachedParentDict = parentDict.clone(); + cache.put(parentRef, cachedParentDict); + } + const parentKidsRaw = cachedParentDict.getRaw("K"); + let cachedParentKids = parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null; + if (!cachedParentKids) { + cachedParentKids = xref.fetchIfRef(parentKidsRaw); + cachedParentKids = Array.isArray(cachedParentKids) ? cachedParentKids.slice() : [parentKidsRaw]; + const parentKidsRef = xref.getNewTemporaryRef(); + cachedParentDict.set("K", parentKidsRef); + cache.put(parentKidsRef, cachedParentKids); + } + const index = cachedParentKids.indexOf(ref); + cachedParentKids.splice(index >= 0 ? index + 1 : cachedParentKids.length, 0, newTagRef); + } +} +class StructElementNode { + constructor(tree, dict) { + this.tree = tree; + this.dict = dict; + this.kids = []; + this.parseKids(); + } + get role() { + const nameObj = this.dict.get("S"); + const name = nameObj instanceof Name ? nameObj.name : ""; + const { + root + } = this.tree; + if (root.roleMap.has(name)) { + return root.roleMap.get(name); + } + return name; + } + parseKids() { + let pageObjId = null; + const objRef = this.dict.getRaw("Pg"); + if (objRef instanceof Ref) { + pageObjId = objRef.toString(); + } + const kids = this.dict.get("K"); + if (Array.isArray(kids)) { + for (const kid of kids) { + const element = this.parseKid(pageObjId, kid); + if (element) { + this.kids.push(element); + } + } + } else { + const element = this.parseKid(pageObjId, kids); + if (element) { + this.kids.push(element); + } + } + } + parseKid(pageObjId, kid) { + if (Number.isInteger(kid)) { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + return new StructElement({ + type: StructElementType.PAGE_CONTENT, + mcid: kid, + pageObjId + }); + } + let kidDict = null; + if (kid instanceof Ref) { + kidDict = this.dict.xref.fetch(kid); + } else if (kid instanceof Dict) { + kidDict = kid; + } + if (!kidDict) { + return null; + } + const pageRef = kidDict.getRaw("Pg"); + if (pageRef instanceof Ref) { + pageObjId = pageRef.toString(); + } + const type = kidDict.get("Type") instanceof Name ? kidDict.get("Type").name : null; + if (type === "MCR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kidDict.getRaw("Stm"); + return new StructElement({ + type: StructElementType.STREAM_CONTENT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId, + mcid: kidDict.get("MCID") + }); + } + if (type === "OBJR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kidDict.getRaw("Obj"); + return new StructElement({ + type: StructElementType.OBJECT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId + }); + } + return new StructElement({ + type: StructElementType.ELEMENT, + dict: kidDict + }); + } +} +class StructElement { + constructor({ + type, + dict = null, + mcid = null, + pageObjId = null, + refObjId = null + }) { + this.type = type; + this.dict = dict; + this.mcid = mcid; + this.pageObjId = pageObjId; + this.refObjId = refObjId; + this.parentNode = null; + } +} +class StructTreePage { + constructor(structTreeRoot, pageDict) { + this.root = structTreeRoot; + this.rootDict = structTreeRoot ? structTreeRoot.dict : null; + this.pageDict = pageDict; + this.nodes = []; + } + collectObjects(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return null; + } + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return null; + } + const ids = this.root.structParentIds?.get(pageRef); + if (!ids) { + return null; + } + const map = new Map(); + const numberTree = new NumberTree(parentTree, this.rootDict.xref); + for (const [elemId] of ids) { + const obj = numberTree.getRaw(elemId); + if (obj instanceof Ref) { + map.set(elemId, obj); + } + } + return map; + } + parse(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return; + } + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return; + } + const id = this.pageDict.get("StructParents"); + const ids = this.root.structParentIds?.get(pageRef); + if (!Number.isInteger(id) && !ids) { + return; + } + const map = new Map(); + const numberTree = new NumberTree(parentTree, this.rootDict.xref); + if (Number.isInteger(id)) { + const parentArray = numberTree.get(id); + if (Array.isArray(parentArray)) { + for (const ref of parentArray) { + if (ref instanceof Ref) { + this.addNode(this.rootDict.xref.fetch(ref), map); + } + } + } + } + if (!ids) { + return; + } + for (const [elemId, type] of ids) { + const obj = numberTree.get(elemId); + if (obj) { + const elem = this.addNode(this.rootDict.xref.fetchIfRef(obj), map); + if (elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT) { + elem.kids[0].type = type; + } + } + } + } + addNode(dict, map, level = 0) { + if (level > MAX_DEPTH) { + warn("StructTree MAX_DEPTH reached."); + return null; + } + if (!(dict instanceof Dict)) { + return null; + } + if (map.has(dict)) { + return map.get(dict); + } + const element = new StructElementNode(this, dict); + map.set(dict, element); + const parent = dict.get("P"); + if (!parent || isName(parent.get("Type"), "StructTreeRoot")) { + if (!this.addTopLevelNode(dict, element)) { + map.delete(dict); + } + return element; + } + const parentNode = this.addNode(parent, map, level + 1); + if (!parentNode) { + return element; + } + let save = false; + for (const kid of parentNode.kids) { + if (kid.type === StructElementType.ELEMENT && kid.dict === dict) { + kid.parentNode = element; + save = true; + } + } + if (!save) { + map.delete(dict); + } + return element; + } + addTopLevelNode(dict, element) { + const obj = this.rootDict.get("K"); + if (!obj) { + return false; + } + if (obj instanceof Dict) { + if (obj.objId !== dict.objId) { + return false; + } + this.nodes[0] = element; + return true; + } + if (!Array.isArray(obj)) { + return true; + } + let save = false; + for (let i = 0; i < obj.length; i++) { + const kidRef = obj[i]; + if (kidRef?.toString() === dict.objId) { + this.nodes[i] = element; + save = true; + } + } + return save; + } + get serializable() { + function nodeToSerializable(node, parent, level = 0) { + if (level > MAX_DEPTH) { + warn("StructTree too deep to be fully serialized."); + return; + } + const obj = Object.create(null); + obj.role = node.role; + obj.children = []; + parent.children.push(obj); + let alt = node.dict.get("Alt"); + if (typeof alt !== "string") { + alt = node.dict.get("ActualText"); + } + if (typeof alt === "string") { + obj.alt = stringToPDFString(alt); + } + const a = node.dict.get("A"); + if (a instanceof Dict) { + const bbox = lookupNormalRect(a.getArray("BBox"), null); + if (bbox) { + obj.bbox = bbox; + } else { + const width = a.get("Width"); + const height = a.get("Height"); + if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) { + obj.bbox = [0, 0, width, height]; + } + } + } + const lang = node.dict.get("Lang"); + if (typeof lang === "string") { + obj.lang = stringToPDFString(lang); + } + for (const kid of node.kids) { + const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null; + if (kidElement) { + nodeToSerializable(kidElement, obj, level + 1); + continue; + } else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === StructElementType.STREAM_CONTENT) { + obj.children.push({ + type: "content", + id: `p${kid.pageObjId}_mc${kid.mcid}` + }); + } else if (kid.type === StructElementType.OBJECT) { + obj.children.push({ + type: "object", + id: kid.refObjId + }); + } else if (kid.type === StructElementType.ANNOTATION) { + obj.children.push({ + type: "annotation", + id: `${AnnotationPrefix}${kid.refObjId}` + }); + } + } + } + const root = Object.create(null); + root.children = []; + root.role = "Root"; + for (const child of this.nodes) { + if (!child) { + continue; + } + nodeToSerializable(child, root); + } + return root; + } +} + +;// ./src/core/catalog.js + + + + + + + + + + + +function isValidExplicitDest(dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!(page instanceof Ref) && !Number.isInteger(page)) { + return false; + } + if (!(zoom instanceof Name)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (!(typeof arg === "number" || allowNull && arg === null)) { + return false; + } + } + return true; +} +function fetchDest(dest) { + if (dest instanceof Dict) { + dest = dest.get("D"); + } + return isValidExplicitDest(dest) ? dest : null; +} +function fetchRemoteDest(action) { + let dest = action.get("D"); + if (dest) { + if (dest instanceof Name) { + dest = dest.name; + } + if (typeof dest === "string") { + return stringToPDFString(dest); + } else if (isValidExplicitDest(dest)) { + return JSON.stringify(dest); + } + } + return null; +} +class Catalog { + constructor(pdfManager, xref) { + this.pdfManager = pdfManager; + this.xref = xref; + this._catDict = xref.getCatalogObj(); + if (!(this._catDict instanceof Dict)) { + throw new FormatError("Catalog object is not a dictionary."); + } + this.toplevelPagesDict; + this._actualNumPages = null; + this.fontCache = new RefSetCache(); + this.builtInCMapCache = new Map(); + this.standardFontDataCache = new Map(); + this.globalImageCache = new GlobalImageCache(); + this.pageKidsCountCache = new RefSetCache(); + this.pageIndexCache = new RefSetCache(); + this.pageDictCache = new RefSetCache(); + this.nonBlendModesSet = new RefSet(); + this.systemFontCache = new Map(); + } + cloneDict() { + return this._catDict.clone(); + } + get version() { + const version = this._catDict.get("Version"); + if (version instanceof Name) { + if (PDF_VERSION_REGEXP.test(version.name)) { + return shadow(this, "version", version.name); + } + warn(`Invalid PDF catalog version: ${version.name}`); + } + return shadow(this, "version", null); + } + get lang() { + const lang = this._catDict.get("Lang"); + return shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null); + } + get needsRendering() { + const needsRendering = this._catDict.get("NeedsRendering"); + return shadow(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false); + } + get collection() { + let collection = null; + try { + const obj = this._catDict.get("Collection"); + if (obj instanceof Dict && obj.size > 0) { + collection = obj; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info("Cannot fetch Collection entry; assuming no collection is present."); + } + return shadow(this, "collection", collection); + } + get acroForm() { + let acroForm = null; + try { + const obj = this._catDict.get("AcroForm"); + if (obj instanceof Dict && obj.size > 0) { + acroForm = obj; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info("Cannot fetch AcroForm entry; assuming no forms are present."); + } + return shadow(this, "acroForm", acroForm); + } + get acroFormRef() { + const value = this._catDict.getRaw("AcroForm"); + return shadow(this, "acroFormRef", value instanceof Ref ? value : null); + } + get metadata() { + const streamRef = this._catDict.getRaw("Metadata"); + if (!(streamRef instanceof Ref)) { + return shadow(this, "metadata", null); + } + let metadata = null; + try { + const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata); + if (stream instanceof BaseStream && stream.dict instanceof Dict) { + const type = stream.dict.get("Type"); + const subtype = stream.dict.get("Subtype"); + if (isName(type, "Metadata") && isName(subtype, "XML")) { + const data = stringToUTF8String(stream.getString()); + if (data) { + metadata = new MetadataParser(data).serializable; + } + } + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info(`Skipping invalid Metadata: "${ex}".`); + } + return shadow(this, "metadata", metadata); + } + get markInfo() { + let markInfo = null; + try { + markInfo = this._readMarkInfo(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read mark info."); + } + return shadow(this, "markInfo", markInfo); + } + _readMarkInfo() { + const obj = this._catDict.get("MarkInfo"); + if (!(obj instanceof Dict)) { + return null; + } + const markInfo = { + Marked: false, + UserProperties: false, + Suspects: false + }; + for (const key in markInfo) { + const value = obj.get(key); + if (typeof value === "boolean") { + markInfo[key] = value; + } + } + return markInfo; + } + get structTreeRoot() { + let structTree = null; + try { + structTree = this._readStructTreeRoot(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable read to structTreeRoot info."); + } + return shadow(this, "structTreeRoot", structTree); + } + _readStructTreeRoot() { + const rawObj = this._catDict.getRaw("StructTreeRoot"); + const obj = this.xref.fetchIfRef(rawObj); + if (!(obj instanceof Dict)) { + return null; + } + const root = new StructTreeRoot(obj, rawObj); + root.init(); + return root; + } + get toplevelPagesDict() { + const pagesObj = this._catDict.get("Pages"); + if (!(pagesObj instanceof Dict)) { + throw new FormatError("Invalid top-level pages dictionary."); + } + return shadow(this, "toplevelPagesDict", pagesObj); + } + get documentOutline() { + let obj = null; + try { + obj = this._readDocumentOutline(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read document outline."); + } + return shadow(this, "documentOutline", obj); + } + _readDocumentOutline() { + let obj = this._catDict.get("Outlines"); + if (!(obj instanceof Dict)) { + return null; + } + obj = obj.getRaw("First"); + if (!(obj instanceof Ref)) { + return null; + } + const root = { + items: [] + }; + const queue = [{ + obj, + parent: root + }]; + const processed = new RefSet(); + processed.put(obj); + const xref = this.xref, + blackColor = new Uint8ClampedArray(3); + while (queue.length > 0) { + const i = queue.shift(); + const outlineDict = xref.fetchIfRef(i.obj); + if (outlineDict === null) { + continue; + } + if (!outlineDict.has("Title")) { + warn("Invalid outline item encountered."); + } + const data = { + url: null, + dest: null, + action: null + }; + Catalog.parseDestDictionary({ + destDict: outlineDict, + resultObj: data, + docBaseUrl: this.baseUrl, + docAttachments: this.attachments + }); + const title = outlineDict.get("Title"); + const flags = outlineDict.get("F") || 0; + const color = outlineDict.getArray("C"); + const count = outlineDict.get("Count"); + let rgbColor = blackColor; + if (isNumberArray(color, 3) && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { + rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); + } + const outlineItem = { + action: data.action, + attachment: data.attachment, + dest: data.dest, + url: data.url, + unsafeUrl: data.unsafeUrl, + newWindow: data.newWindow, + setOCGState: data.setOCGState, + title: typeof title === "string" ? stringToPDFString(title) : "", + color: rgbColor, + count: Number.isInteger(count) ? count : undefined, + bold: !!(flags & 2), + italic: !!(flags & 1), + items: [] + }; + i.parent.items.push(outlineItem); + obj = outlineDict.getRaw("First"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: outlineItem + }); + processed.put(obj); + } + obj = outlineDict.getRaw("Next"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: i.parent + }); + processed.put(obj); + } + } + return root.items.length > 0 ? root.items : null; + } + get permissions() { + let permissions = null; + try { + permissions = this._readPermissions(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read permissions."); + } + return shadow(this, "permissions", permissions); + } + _readPermissions() { + const encrypt = this.xref.trailer.get("Encrypt"); + if (!(encrypt instanceof Dict)) { + return null; + } + let flags = encrypt.get("P"); + if (typeof flags !== "number") { + return null; + } + flags += 2 ** 32; + const permissions = []; + for (const key in PermissionFlag) { + const value = PermissionFlag[key]; + if (flags & value) { + permissions.push(value); + } + } + return permissions; + } + get optionalContentConfig() { + let config = null; + try { + const properties = this._catDict.get("OCProperties"); + if (!properties) { + return shadow(this, "optionalContentConfig", null); + } + const defaultConfig = properties.get("D"); + if (!defaultConfig) { + return shadow(this, "optionalContentConfig", null); + } + const groupsData = properties.get("OCGs"); + if (!Array.isArray(groupsData)) { + return shadow(this, "optionalContentConfig", null); + } + const groupRefCache = new RefSetCache(); + for (const groupRef of groupsData) { + if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) { + continue; + } + groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef)); + } + config = this.#readOptionalContentConfig(defaultConfig, groupRefCache); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Unable to read optional content config: ${ex}`); + } + return shadow(this, "optionalContentConfig", config); + } + #readOptionalContentGroup(groupRef) { + const group = this.xref.fetch(groupRef); + const obj = { + id: groupRef.toString(), + name: null, + intent: null, + usage: { + print: null, + view: null + }, + rbGroups: [] + }; + const name = group.get("Name"); + if (typeof name === "string") { + obj.name = stringToPDFString(name); + } + let intent = group.getArray("Intent"); + if (!Array.isArray(intent)) { + intent = [intent]; + } + if (intent.every(i => i instanceof Name)) { + obj.intent = intent.map(i => i.name); + } + const usage = group.get("Usage"); + if (!(usage instanceof Dict)) { + return obj; + } + const usageObj = obj.usage; + const print = usage.get("Print"); + if (print instanceof Dict) { + const printState = print.get("PrintState"); + if (printState instanceof Name) { + switch (printState.name) { + case "ON": + case "OFF": + usageObj.print = { + printState: printState.name + }; + } + } + } + const view = usage.get("View"); + if (view instanceof Dict) { + const viewState = view.get("ViewState"); + if (viewState instanceof Name) { + switch (viewState.name) { + case "ON": + case "OFF": + usageObj.view = { + viewState: viewState.name + }; + } + } + } + return obj; + } + #readOptionalContentConfig(config, groupRefCache) { + function parseOnOff(refs) { + const onParsed = []; + if (Array.isArray(refs)) { + for (const value of refs) { + if (!(value instanceof Ref)) { + continue; + } + if (groupRefCache.has(value)) { + onParsed.push(value.toString()); + } + } + } + return onParsed; + } + function parseOrder(refs, nestedLevels = 0) { + if (!Array.isArray(refs)) { + return null; + } + const order = []; + for (const value of refs) { + if (value instanceof Ref && groupRefCache.has(value)) { + parsedOrderRefs.put(value); + order.push(value.toString()); + continue; + } + const nestedOrder = parseNestedOrder(value, nestedLevels); + if (nestedOrder) { + order.push(nestedOrder); + } + } + if (nestedLevels > 0) { + return order; + } + const hiddenGroups = []; + for (const [groupRef] of groupRefCache.items()) { + if (parsedOrderRefs.has(groupRef)) { + continue; + } + hiddenGroups.push(groupRef.toString()); + } + if (hiddenGroups.length) { + order.push({ + name: null, + order: hiddenGroups + }); + } + return order; + } + function parseNestedOrder(ref, nestedLevels) { + if (++nestedLevels > MAX_NESTED_LEVELS) { + warn("parseNestedOrder - reached MAX_NESTED_LEVELS."); + return null; + } + const value = xref.fetchIfRef(ref); + if (!Array.isArray(value)) { + return null; + } + const nestedName = xref.fetchIfRef(value[0]); + if (typeof nestedName !== "string") { + return null; + } + const nestedOrder = parseOrder(value.slice(1), nestedLevels); + if (!nestedOrder || !nestedOrder.length) { + return null; + } + return { + name: stringToPDFString(nestedName), + order: nestedOrder + }; + } + function parseRBGroups(rbGroups) { + if (!Array.isArray(rbGroups)) { + return; + } + for (const value of rbGroups) { + const rbGroup = xref.fetchIfRef(value); + if (!Array.isArray(rbGroup) || !rbGroup.length) { + continue; + } + const parsedRbGroup = new Set(); + for (const ref of rbGroup) { + if (ref instanceof Ref && groupRefCache.has(ref) && !parsedRbGroup.has(ref.toString())) { + parsedRbGroup.add(ref.toString()); + groupRefCache.get(ref).rbGroups.push(parsedRbGroup); + } + } + } + } + const xref = this.xref, + parsedOrderRefs = new RefSet(), + MAX_NESTED_LEVELS = 10; + parseRBGroups(config.get("RBGroups")); + return { + name: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null, + creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null, + baseState: config.get("BaseState") instanceof Name ? config.get("BaseState").name : null, + on: parseOnOff(config.get("ON")), + off: parseOnOff(config.get("OFF")), + order: parseOrder(config.get("Order")), + groups: [...groupRefCache] + }; + } + setActualNumPages(num = null) { + this._actualNumPages = num; + } + get hasActualNumPages() { + return this._actualNumPages !== null; + } + get _pagesCount() { + const obj = this.toplevelPagesDict.get("Count"); + if (!Number.isInteger(obj)) { + throw new FormatError("Page count in top-level pages dictionary is not an integer."); + } + return shadow(this, "_pagesCount", obj); + } + get numPages() { + return this.hasActualNumPages ? this._actualNumPages : this._pagesCount; + } + get destinations() { + const obj = this._readDests(), + dests = Object.create(null); + if (obj instanceof NameTree) { + for (const [key, value] of obj.getAll()) { + const dest = fetchDest(value); + if (dest) { + dests[stringToPDFString(key)] = dest; + } + } + } else if (obj instanceof Dict) { + for (const [key, value] of obj) { + const dest = fetchDest(value); + if (dest) { + dests[key] = dest; + } + } + } + return shadow(this, "destinations", dests); + } + getDestination(id) { + const obj = this._readDests(); + if (obj instanceof NameTree) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; + } + const allDest = this.destinations[id]; + if (allDest) { + warn(`Found "${id}" at an incorrect position in the NameTree.`); + return allDest; + } + } else if (obj instanceof Dict) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; + } + } + return null; + } + _readDests() { + const obj = this._catDict.get("Names"); + if (obj?.has("Dests")) { + return new NameTree(obj.getRaw("Dests"), this.xref); + } else if (this._catDict.has("Dests")) { + return this._catDict.get("Dests"); + } + return undefined; + } + get pageLabels() { + let obj = null; + try { + obj = this._readPageLabels(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read page labels."); + } + return shadow(this, "pageLabels", obj); + } + _readPageLabels() { + const obj = this._catDict.getRaw("PageLabels"); + if (!obj) { + return null; + } + const pageLabels = new Array(this.numPages); + let style = null, + prefix = ""; + const numberTree = new NumberTree(obj, this.xref); + const nums = numberTree.getAll(); + let currentLabel = "", + currentIndex = 1; + for (let i = 0, ii = this.numPages; i < ii; i++) { + const labelDict = nums.get(i); + if (labelDict !== undefined) { + if (!(labelDict instanceof Dict)) { + throw new FormatError("PageLabel is not a dictionary."); + } + if (labelDict.has("Type") && !isName(labelDict.get("Type"), "PageLabel")) { + throw new FormatError("Invalid type in PageLabel dictionary."); + } + if (labelDict.has("S")) { + const s = labelDict.get("S"); + if (!(s instanceof Name)) { + throw new FormatError("Invalid style in PageLabel dictionary."); + } + style = s.name; + } else { + style = null; + } + if (labelDict.has("P")) { + const p = labelDict.get("P"); + if (typeof p !== "string") { + throw new FormatError("Invalid prefix in PageLabel dictionary."); + } + prefix = stringToPDFString(p); + } else { + prefix = ""; + } + if (labelDict.has("St")) { + const st = labelDict.get("St"); + if (!(Number.isInteger(st) && st >= 1)) { + throw new FormatError("Invalid start in PageLabel dictionary."); + } + currentIndex = st; + } else { + currentIndex = 1; + } + } + switch (style) { + case "D": + currentLabel = currentIndex; + break; + case "R": + case "r": + currentLabel = toRomanNumerals(currentIndex, style === "r"); + break; + case "A": + case "a": + const LIMIT = 26; + const A_UPPER_CASE = 0x41, + A_LOWER_CASE = 0x61; + const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE; + const letterIndex = currentIndex - 1; + const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT); + currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1); + break; + default: + if (style) { + throw new FormatError(`Invalid style "${style}" in PageLabel dictionary.`); + } + currentLabel = ""; + } + pageLabels[i] = prefix + currentLabel; + currentIndex++; + } + return pageLabels; + } + get pageLayout() { + const obj = this._catDict.get("PageLayout"); + let pageLayout = ""; + if (obj instanceof Name) { + switch (obj.name) { + case "SinglePage": + case "OneColumn": + case "TwoColumnLeft": + case "TwoColumnRight": + case "TwoPageLeft": + case "TwoPageRight": + pageLayout = obj.name; + } + } + return shadow(this, "pageLayout", pageLayout); + } + get pageMode() { + const obj = this._catDict.get("PageMode"); + let pageMode = "UseNone"; + if (obj instanceof Name) { + switch (obj.name) { + case "UseNone": + case "UseOutlines": + case "UseThumbs": + case "FullScreen": + case "UseOC": + case "UseAttachments": + pageMode = obj.name; + } + } + return shadow(this, "pageMode", pageMode); + } + get viewerPreferences() { + const obj = this._catDict.get("ViewerPreferences"); + if (!(obj instanceof Dict)) { + return shadow(this, "viewerPreferences", null); + } + let prefs = null; + for (const key of obj.getKeys()) { + const value = obj.get(key); + let prefValue; + switch (key) { + case "HideToolbar": + case "HideMenubar": + case "HideWindowUI": + case "FitWindow": + case "CenterWindow": + case "DisplayDocTitle": + case "PickTrayByPDFSize": + if (typeof value === "boolean") { + prefValue = value; + } + break; + case "NonFullScreenPageMode": + if (value instanceof Name) { + switch (value.name) { + case "UseNone": + case "UseOutlines": + case "UseThumbs": + case "UseOC": + prefValue = value.name; + break; + default: + prefValue = "UseNone"; + } + } + break; + case "Direction": + if (value instanceof Name) { + switch (value.name) { + case "L2R": + case "R2L": + prefValue = value.name; + break; + default: + prefValue = "L2R"; + } + } + break; + case "ViewArea": + case "ViewClip": + case "PrintArea": + case "PrintClip": + if (value instanceof Name) { + switch (value.name) { + case "MediaBox": + case "CropBox": + case "BleedBox": + case "TrimBox": + case "ArtBox": + prefValue = value.name; + break; + default: + prefValue = "CropBox"; + } + } + break; + case "PrintScaling": + if (value instanceof Name) { + switch (value.name) { + case "None": + case "AppDefault": + prefValue = value.name; + break; + default: + prefValue = "AppDefault"; + } + } + break; + case "Duplex": + if (value instanceof Name) { + switch (value.name) { + case "Simplex": + case "DuplexFlipShortEdge": + case "DuplexFlipLongEdge": + prefValue = value.name; + break; + default: + prefValue = "None"; + } + } + break; + case "PrintPageRange": + if (Array.isArray(value) && value.length % 2 === 0) { + const isValid = value.every((page, i, arr) => Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages); + if (isValid) { + prefValue = value; + } + } + break; + case "NumCopies": + if (Number.isInteger(value) && value > 0) { + prefValue = value; + } + break; + default: + warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`); + continue; + } + if (prefValue === undefined) { + warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); + continue; + } + if (!prefs) { + prefs = Object.create(null); + } + prefs[key] = prefValue; + } + return shadow(this, "viewerPreferences", prefs); + } + get openAction() { + const obj = this._catDict.get("OpenAction"); + const openAction = Object.create(null); + if (obj instanceof Dict) { + const destDict = new Dict(this.xref); + destDict.set("A", obj); + const resultObj = { + url: null, + dest: null, + action: null + }; + Catalog.parseDestDictionary({ + destDict, + resultObj + }); + if (Array.isArray(resultObj.dest)) { + openAction.dest = resultObj.dest; + } else if (resultObj.action) { + openAction.action = resultObj.action; + } + } else if (Array.isArray(obj)) { + openAction.dest = obj; + } + return shadow(this, "openAction", objectSize(openAction) > 0 ? openAction : null); + } + get attachments() { + const obj = this._catDict.get("Names"); + let attachments = null; + if (obj instanceof Dict && obj.has("EmbeddedFiles")) { + const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + for (const [key, value] of nameTree.getAll()) { + const fs = new FileSpec(value, this.xref); + if (!attachments) { + attachments = Object.create(null); + } + attachments[stringToPDFString(key)] = fs.serializable; + } + } + return shadow(this, "attachments", attachments); + } + get xfaImages() { + const obj = this._catDict.get("Names"); + let xfaImages = null; + if (obj instanceof Dict && obj.has("XFAImages")) { + const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref); + for (const [key, value] of nameTree.getAll()) { + if (!xfaImages) { + xfaImages = new Dict(this.xref); + } + xfaImages.set(stringToPDFString(key), value); + } + } + return shadow(this, "xfaImages", xfaImages); + } + _collectJavaScript() { + const obj = this._catDict.get("Names"); + let javaScript = null; + function appendIfJavaScriptDict(name, jsDict) { + if (!(jsDict instanceof Dict)) { + return; + } + if (!isName(jsDict.get("S"), "JavaScript")) { + return; + } + let js = jsDict.get("JS"); + if (js instanceof BaseStream) { + js = js.getString(); + } else if (typeof js !== "string") { + return; + } + js = stringToPDFString(js).replaceAll("\x00", ""); + if (js) { + (javaScript ||= new Map()).set(name, js); + } + } + if (obj instanceof Dict && obj.has("JavaScript")) { + const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref); + for (const [key, value] of nameTree.getAll()) { + appendIfJavaScriptDict(stringToPDFString(key), value); + } + } + const openAction = this._catDict.get("OpenAction"); + if (openAction) { + appendIfJavaScriptDict("OpenAction", openAction); + } + return javaScript; + } + get jsActions() { + const javaScript = this._collectJavaScript(); + let actions = collectActions(this.xref, this._catDict, DocumentActionEventType); + if (javaScript) { + actions ||= Object.create(null); + for (const [key, val] of javaScript) { + if (key in actions) { + actions[key].push(val); + } else { + actions[key] = [val]; + } + } + } + return shadow(this, "jsActions", actions); + } + async fontFallback(id, handler) { + const translatedFonts = await Promise.all(this.fontCache); + for (const translatedFont of translatedFonts) { + if (translatedFont.loadedName === id) { + translatedFont.fallback(handler); + return; + } + } + } + async cleanup(manuallyTriggered = false) { + clearGlobalCaches(); + this.globalImageCache.clear(manuallyTriggered); + this.pageKidsCountCache.clear(); + this.pageIndexCache.clear(); + this.pageDictCache.clear(); + this.nonBlendModesSet.clear(); + const translatedFonts = await Promise.all(this.fontCache); + for (const { + dict + } of translatedFonts) { + delete dict.cacheKey; + } + this.fontCache.clear(); + this.builtInCMapCache.clear(); + this.standardFontDataCache.clear(); + this.systemFontCache.clear(); + } + async getPageDict(pageIndex) { + const nodesToVisit = [this.toplevelPagesDict]; + const visitedNodes = new RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof Ref) { + visitedNodes.put(pagesRef); + } + const xref = this.xref, + pageKidsCountCache = this.pageKidsCountCache, + pageIndexCache = this.pageIndexCache, + pageDictCache = this.pageDictCache; + let currentPageIndex = 0; + while (nodesToVisit.length) { + const currentNode = nodesToVisit.pop(); + if (currentNode instanceof Ref) { + const count = pageKidsCountCache.get(currentNode); + if (count >= 0 && currentPageIndex + count <= pageIndex) { + currentPageIndex += count; + continue; + } + if (visitedNodes.has(currentNode)) { + throw new FormatError("Pages tree contains circular reference."); + } + visitedNodes.put(currentNode); + const obj = await (pageDictCache.get(currentNode) || xref.fetchAsync(currentNode)); + if (obj instanceof Dict) { + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !obj.has("Kids")) { + if (!pageKidsCountCache.has(currentNode)) { + pageKidsCountCache.put(currentNode, 1); + } + if (!pageIndexCache.has(currentNode)) { + pageIndexCache.put(currentNode, currentPageIndex); + } + if (currentPageIndex === pageIndex) { + return [obj, currentNode]; + } + currentPageIndex++; + continue; + } + } + nodesToVisit.push(obj); + continue; + } + if (!(currentNode instanceof Dict)) { + throw new FormatError("Page dictionary kid reference points to wrong type of object."); + } + const { + objId + } = currentNode; + let count = currentNode.getRaw("Count"); + if (count instanceof Ref) { + count = await xref.fetchAsync(count); + } + if (Number.isInteger(count) && count >= 0) { + if (objId && !pageKidsCountCache.has(objId)) { + pageKidsCountCache.put(objId, count); + } + if (currentPageIndex + count <= pageIndex) { + currentPageIndex += count; + continue; + } + } + let kids = currentNode.getRaw("Kids"); + if (kids instanceof Ref) { + kids = await xref.fetchAsync(kids); + } + if (!Array.isArray(kids)) { + let type = currentNode.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !currentNode.has("Kids")) { + if (currentPageIndex === pageIndex) { + return [currentNode, null]; + } + currentPageIndex++; + continue; + } + throw new FormatError("Page dictionary kids object is not an array."); + } + for (let last = kids.length - 1; last >= 0; last--) { + const lastKid = kids[last]; + nodesToVisit.push(lastKid); + if (currentNode === this.toplevelPagesDict && lastKid instanceof Ref && !pageDictCache.has(lastKid)) { + pageDictCache.put(lastKid, xref.fetchAsync(lastKid)); + } + } + } + throw new Error(`Page index ${pageIndex} not found.`); + } + async getAllPageDicts(recoveryMode = false) { + const { + ignoreErrors + } = this.pdfManager.evaluatorOptions; + const queue = [{ + currentNode: this.toplevelPagesDict, + posInKids: 0 + }]; + const visitedNodes = new RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof Ref) { + visitedNodes.put(pagesRef); + } + const map = new Map(), + xref = this.xref, + pageIndexCache = this.pageIndexCache; + let pageIndex = 0; + function addPageDict(pageDict, pageRef) { + if (pageRef && !pageIndexCache.has(pageRef)) { + pageIndexCache.put(pageRef, pageIndex); + } + map.set(pageIndex++, [pageDict, pageRef]); + } + function addPageError(error) { + if (error instanceof XRefEntryException && !recoveryMode) { + throw error; + } + if (recoveryMode && ignoreErrors && pageIndex === 0) { + warn(`getAllPageDicts - Skipping invalid first page: "${error}".`); + error = Dict.empty; + } + map.set(pageIndex++, [error, null]); + } + while (queue.length > 0) { + const queueItem = queue.at(-1); + const { + currentNode, + posInKids + } = queueItem; + let kids = currentNode.getRaw("Kids"); + if (kids instanceof Ref) { + try { + kids = await xref.fetchAsync(kids); + } catch (ex) { + addPageError(ex); + break; + } + } + if (!Array.isArray(kids)) { + addPageError(new FormatError("Page dictionary kids object is not an array.")); + break; + } + if (posInKids >= kids.length) { + queue.pop(); + continue; + } + const kidObj = kids[posInKids]; + let obj; + if (kidObj instanceof Ref) { + if (visitedNodes.has(kidObj)) { + addPageError(new FormatError("Pages tree contains circular reference.")); + break; + } + visitedNodes.put(kidObj); + try { + obj = await xref.fetchAsync(kidObj); + } catch (ex) { + addPageError(ex); + break; + } + } else { + obj = kidObj; + } + if (!(obj instanceof Dict)) { + addPageError(new FormatError("Page dictionary kid reference points to wrong type of object.")); + break; + } + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + try { + type = await xref.fetchAsync(type); + } catch (ex) { + addPageError(ex); + break; + } + } + if (isName(type, "Page") || !obj.has("Kids")) { + addPageDict(obj, kidObj instanceof Ref ? kidObj : null); + } else { + queue.push({ + currentNode: obj, + posInKids: 0 + }); + } + queueItem.posInKids++; + } + return map; + } + getPageIndex(pageRef) { + const cachedPageIndex = this.pageIndexCache.get(pageRef); + if (cachedPageIndex !== undefined) { + return Promise.resolve(cachedPageIndex); + } + const xref = this.xref; + function pagesBeforeRef(kidRef) { + let total = 0, + parentRef; + return xref.fetchAsync(kidRef).then(function (node) { + if (isRefsEqual(kidRef, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) { + throw new FormatError("The reference does not point to a /Page dictionary."); + } + if (!node) { + return null; + } + if (!(node instanceof Dict)) { + throw new FormatError("Node must be a dictionary."); + } + parentRef = node.getRaw("Parent"); + return node.getAsync("Parent"); + }).then(function (parent) { + if (!parent) { + return null; + } + if (!(parent instanceof Dict)) { + throw new FormatError("Parent must be a dictionary."); + } + return parent.getAsync("Kids"); + }).then(function (kids) { + if (!kids) { + return null; + } + const kidPromises = []; + let found = false; + for (const kid of kids) { + if (!(kid instanceof Ref)) { + throw new FormatError("Kid must be a reference."); + } + if (isRefsEqual(kid, kidRef)) { + found = true; + break; + } + kidPromises.push(xref.fetchAsync(kid).then(function (obj) { + if (!(obj instanceof Dict)) { + throw new FormatError("Kid node must be a dictionary."); + } + if (obj.has("Count")) { + total += obj.get("Count"); + } else { + total++; + } + })); + } + if (!found) { + throw new FormatError("Kid reference not found in parent's kids."); + } + return Promise.all(kidPromises).then(function () { + return [total, parentRef]; + }); + }); + } + let total = 0; + const next = ref => pagesBeforeRef(ref).then(args => { + if (!args) { + this.pageIndexCache.put(pageRef, total); + return total; + } + const [count, parentRef] = args; + total += count; + return next(parentRef); + }); + return next(pageRef); + } + get baseUrl() { + const uri = this._catDict.get("URI"); + if (uri instanceof Dict) { + const base = uri.get("Base"); + if (typeof base === "string") { + const absoluteUrl = createValidAbsoluteUrl(base, null, { + tryConvertEncoding: true + }); + if (absoluteUrl) { + return shadow(this, "baseUrl", absoluteUrl.href); + } + } + } + return shadow(this, "baseUrl", this.pdfManager.docBaseUrl); + } + static parseDestDictionary({ + destDict, + resultObj, + docBaseUrl = null, + docAttachments = null + }) { + if (!(destDict instanceof Dict)) { + warn("parseDestDictionary: `destDict` must be a dictionary."); + return; + } + let action = destDict.get("A"), + url, + dest; + if (!(action instanceof Dict)) { + if (destDict.has("Dest")) { + action = destDict.get("Dest"); + } else { + action = destDict.get("AA"); + if (action instanceof Dict) { + if (action.has("D")) { + action = action.get("D"); + } else if (action.has("U")) { + action = action.get("U"); + } + } + } + } + if (action instanceof Dict) { + const actionType = action.get("S"); + if (!(actionType instanceof Name)) { + warn("parseDestDictionary: Invalid type in Action dictionary."); + return; + } + const actionName = actionType.name; + switch (actionName) { + case "ResetForm": + const flags = action.get("Flags"); + const include = ((typeof flags === "number" ? flags : 0) & 1) === 0; + const fields = []; + const refs = []; + for (const obj of action.get("Fields") || []) { + if (obj instanceof Ref) { + refs.push(obj.toString()); + } else if (typeof obj === "string") { + fields.push(stringToPDFString(obj)); + } + } + resultObj.resetForm = { + fields, + refs, + include + }; + break; + case "URI": + url = action.get("URI"); + if (url instanceof Name) { + url = "/" + url.name; + } + break; + case "GoTo": + dest = action.get("D"); + break; + case "Launch": + case "GoToR": + const urlDict = action.get("F"); + if (urlDict instanceof Dict) { + const fs = new FileSpec(urlDict, null, true); + const { + rawFilename + } = fs.serializable; + url = rawFilename; + } else if (typeof urlDict === "string") { + url = urlDict; + } + const remoteDest = fetchRemoteDest(action); + if (remoteDest && typeof url === "string") { + url = url.split("#", 1)[0] + "#" + remoteDest; + } + const newWindow = action.get("NewWindow"); + if (typeof newWindow === "boolean") { + resultObj.newWindow = newWindow; + } + break; + case "GoToE": + const target = action.get("T"); + let attachment; + if (docAttachments && target instanceof Dict) { + const relationship = target.get("R"); + const name = target.get("N"); + if (isName(relationship, "C") && typeof name === "string") { + attachment = docAttachments[stringToPDFString(name)]; + } + } + if (attachment) { + resultObj.attachment = attachment; + const attachmentDest = fetchRemoteDest(action); + if (attachmentDest) { + resultObj.attachmentDest = attachmentDest; + } + } else { + warn(`parseDestDictionary - unimplemented "GoToE" action.`); + } + break; + case "Named": + const namedAction = action.get("N"); + if (namedAction instanceof Name) { + resultObj.action = namedAction.name; + } + break; + case "SetOCGState": + const state = action.get("State"); + const preserveRB = action.get("PreserveRB"); + if (!Array.isArray(state) || state.length === 0) { + break; + } + const stateArr = []; + for (const elem of state) { + if (elem instanceof Name) { + switch (elem.name) { + case "ON": + case "OFF": + case "Toggle": + stateArr.push(elem.name); + break; + } + } else if (elem instanceof Ref) { + stateArr.push(elem.toString()); + } + } + if (stateArr.length !== state.length) { + break; + } + resultObj.setOCGState = { + state: stateArr, + preserveRB: typeof preserveRB === "boolean" ? preserveRB : true + }; + break; + case "JavaScript": + const jsAction = action.get("JS"); + let js; + if (jsAction instanceof BaseStream) { + js = jsAction.getString(); + } else if (typeof jsAction === "string") { + js = jsAction; + } + const jsURL = js && recoverJsURL(stringToPDFString(js)); + if (jsURL) { + url = jsURL.url; + resultObj.newWindow = jsURL.newWindow; + break; + } + default: + if (actionName === "JavaScript" || actionName === "SubmitForm") { + break; + } + warn(`parseDestDictionary - unsupported action: "${actionName}".`); + break; + } + } else if (destDict.has("Dest")) { + dest = destDict.get("Dest"); + } + if (typeof url === "string") { + const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, { + addDefaultProtocol: true, + tryConvertEncoding: true + }); + if (absoluteUrl) { + resultObj.url = absoluteUrl.href; + } + resultObj.unsafeUrl = url; + } + if (dest) { + if (dest instanceof Name) { + dest = dest.name; + } + if (typeof dest === "string") { + resultObj.dest = stringToPDFString(dest); + } else if (isValidExplicitDest(dest)) { + resultObj.dest = dest; + } + } + } +} + +;// ./src/core/object_loader.js + + + + +function mayHaveChildren(value) { + return value instanceof Ref || value instanceof Dict || value instanceof BaseStream || Array.isArray(value); +} +function addChildren(node, nodesToVisit) { + if (node instanceof Dict) { + node = node.getRawValues(); + } else if (node instanceof BaseStream) { + node = node.dict.getRawValues(); + } else if (!Array.isArray(node)) { + return; + } + for (const rawValue of node) { + if (mayHaveChildren(rawValue)) { + nodesToVisit.push(rawValue); + } + } +} +class ObjectLoader { + constructor(dict, keys, xref) { + this.dict = dict; + this.keys = keys; + this.xref = xref; + this.refSet = null; + } + async load() { + if (this.xref.stream.isDataLoaded) { + return undefined; + } + const { + keys, + dict + } = this; + this.refSet = new RefSet(); + const nodesToVisit = []; + for (const key of keys) { + const rawValue = dict.getRaw(key); + if (rawValue !== undefined) { + nodesToVisit.push(rawValue); + } + } + return this._walk(nodesToVisit); + } + async _walk(nodesToVisit) { + const nodesToRevisit = []; + const pendingRequests = []; + while (nodesToVisit.length) { + let currentNode = nodesToVisit.pop(); + if (currentNode instanceof Ref) { + if (this.refSet.has(currentNode)) { + continue; + } + try { + this.refSet.put(currentNode); + currentNode = this.xref.fetch(currentNode); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + warn(`ObjectLoader._walk - requesting all data: "${ex}".`); + this.refSet = null; + const { + manager + } = this.xref.stream; + return manager.requestAllChunks(); + } + nodesToRevisit.push(currentNode); + pendingRequests.push({ + begin: ex.begin, + end: ex.end + }); + } + } + if (currentNode instanceof BaseStream) { + const baseStreams = currentNode.getBaseStreams(); + if (baseStreams) { + let foundMissingData = false; + for (const stream of baseStreams) { + if (stream.isDataLoaded) { + continue; + } + foundMissingData = true; + pendingRequests.push({ + begin: stream.start, + end: stream.end + }); + } + if (foundMissingData) { + nodesToRevisit.push(currentNode); + } + } + } + addChildren(currentNode, nodesToVisit); + } + if (pendingRequests.length) { + await this.xref.stream.manager.requestRanges(pendingRequests); + for (const node of nodesToRevisit) { + if (node instanceof Ref) { + this.refSet.remove(node); + } + } + return this._walk(nodesToRevisit); + } + this.refSet = null; + return undefined; + } +} + +;// ./src/core/xfa/symbol_utils.js +const $acceptWhitespace = Symbol(); +const $addHTML = Symbol(); +const $appendChild = Symbol(); +const $childrenToHTML = Symbol(); +const $clean = Symbol(); +const $cleanPage = Symbol(); +const $cleanup = Symbol(); +const $clone = Symbol(); +const $consumed = Symbol(); +const $content = Symbol("content"); +const $data = Symbol("data"); +const $dump = Symbol(); +const $extra = Symbol("extra"); +const $finalize = Symbol(); +const $flushHTML = Symbol(); +const $getAttributeIt = Symbol(); +const $getAttributes = Symbol(); +const $getAvailableSpace = Symbol(); +const $getChildrenByClass = Symbol(); +const $getChildrenByName = Symbol(); +const $getChildrenByNameIt = Symbol(); +const $getDataValue = Symbol(); +const $getExtra = Symbol(); +const $getRealChildrenByNameIt = Symbol(); +const $getChildren = Symbol(); +const $getContainedChildren = Symbol(); +const $getNextPage = Symbol(); +const $getSubformParent = Symbol(); +const $getParent = Symbol(); +const $getTemplateRoot = Symbol(); +const $globalData = Symbol(); +const $hasSettableValue = Symbol(); +const $ids = Symbol(); +const $indexOf = Symbol(); +const $insertAt = Symbol(); +const $isCDATAXml = Symbol(); +const $isBindable = Symbol(); +const $isDataValue = Symbol(); +const $isDescendent = Symbol(); +const $isNsAgnostic = Symbol(); +const $isSplittable = Symbol(); +const $isThereMoreWidth = Symbol(); +const $isTransparent = Symbol(); +const $isUsable = Symbol(); +const $lastAttribute = Symbol(); +const $namespaceId = Symbol("namespaceId"); +const $nodeName = Symbol("nodeName"); +const $nsAttributes = Symbol(); +const $onChild = Symbol(); +const $onChildCheck = Symbol(); +const $onText = Symbol(); +const $pushGlyphs = Symbol(); +const $popPara = Symbol(); +const $pushPara = Symbol(); +const $removeChild = Symbol(); +const $root = Symbol("root"); +const $resolvePrototypes = Symbol(); +const $searchNode = Symbol(); +const $setId = Symbol(); +const $setSetAttributes = Symbol(); +const $setValue = Symbol(); +const $tabIndex = Symbol(); +const $text = Symbol(); +const $toPages = Symbol(); +const $toHTML = Symbol(); +const $toString = Symbol(); +const $toStyle = Symbol(); +const $uid = Symbol("uid"); + +;// ./src/core/xfa/namespaces.js +const $buildXFAObject = Symbol(); +const NamespaceIds = { + config: { + id: 0, + check: ns => ns.startsWith("http://www.xfa.org/schema/xci/") + }, + connectionSet: { + id: 1, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/") + }, + datasets: { + id: 2, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/") + }, + form: { + id: 3, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/") + }, + localeSet: { + id: 4, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/") + }, + pdf: { + id: 5, + check: ns => ns === "http://ns.adobe.com/xdp/pdf/" + }, + signature: { + id: 6, + check: ns => ns === "http://www.w3.org/2000/09/xmldsig#" + }, + sourceSet: { + id: 7, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/") + }, + stylesheet: { + id: 8, + check: ns => ns === "http://www.w3.org/1999/XSL/Transform" + }, + template: { + id: 9, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/") + }, + xdc: { + id: 10, + check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/") + }, + xdp: { + id: 11, + check: ns => ns === "http://ns.adobe.com/xdp/" + }, + xfdf: { + id: 12, + check: ns => ns === "http://ns.adobe.com/xfdf/" + }, + xhtml: { + id: 13, + check: ns => ns === "http://www.w3.org/1999/xhtml" + }, + xmpmeta: { + id: 14, + check: ns => ns === "http://ns.adobe.com/xmpmeta/" + } +}; + +;// ./src/core/xfa/utils.js + +const dimConverters = { + pt: x => x, + cm: x => x / 2.54 * 72, + mm: x => x / (10 * 2.54) * 72, + in: x => x * 72, + px: x => x +}; +const measurementPattern = /([+-]?\d+\.?\d*)(.*)/; +function stripQuotes(str) { + if (str.startsWith("'") || str.startsWith('"')) { + return str.slice(1, -1); + } + return str; +} +function getInteger({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseInt(data, 10); + if (!isNaN(n) && validate(n)) { + return n; + } + return defaultValue; +} +function getFloat({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseFloat(data); + if (!isNaN(n) && validate(n)) { + return n; + } + return defaultValue; +} +function getKeyword({ + data, + defaultValue, + validate +}) { + if (!data) { + return defaultValue; + } + data = data.trim(); + if (validate(data)) { + return data; + } + return defaultValue; +} +function getStringOption(data, options) { + return getKeyword({ + data, + defaultValue: options[0], + validate: k => options.includes(k) + }); +} +function getMeasurement(str, def = "0") { + def ||= "0"; + if (!str) { + return getMeasurement(def); + } + const match = str.trim().match(measurementPattern); + if (!match) { + return getMeasurement(def); + } + const [, valueStr, unit] = match; + const value = parseFloat(valueStr); + if (isNaN(value)) { + return getMeasurement(def); + } + if (value === 0) { + return 0; + } + const conv = dimConverters[unit]; + if (conv) { + return conv(value); + } + return value; +} +function getRatio(data) { + if (!data) { + return { + num: 1, + den: 1 + }; + } + const ratio = data.trim().split(/\s*:\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x)); + if (ratio.length === 1) { + ratio.push(1); + } + if (ratio.length === 0) { + return { + num: 1, + den: 1 + }; + } + const [num, den] = ratio; + return { + num, + den + }; +} +function getRelevant(data) { + if (!data) { + return []; + } + return data.trim().split(/\s+/).map(e => ({ + excluded: e[0] === "-", + viewname: e.substring(1) + })); +} +function getColor(data, def = [0, 0, 0]) { + let [r, g, b] = def; + if (!data) { + return { + r, + g, + b + }; + } + const color = data.trim().split(/\s*,\s*/).map(c => Math.min(Math.max(0, parseInt(c.trim(), 10)), 255)).map(c => isNaN(c) ? 0 : c); + if (color.length < 3) { + return { + r, + g, + b + }; + } + [r, g, b] = color; + return { + r, + g, + b + }; +} +function getBBox(data) { + const def = -1; + if (!data) { + return { + x: def, + y: def, + width: def, + height: def + }; + } + const bbox = data.trim().split(/\s*,\s*/).map(m => getMeasurement(m, "-1")); + if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) { + return { + x: def, + y: def, + width: def, + height: def + }; + } + const [x, y, width, height] = bbox; + return { + x, + y, + width, + height + }; +} +class HTMLResult { + static get FAILURE() { + return shadow(this, "FAILURE", new HTMLResult(false, null, null, null)); + } + static get EMPTY() { + return shadow(this, "EMPTY", new HTMLResult(true, null, null, null)); + } + constructor(success, html, bbox, breakNode) { + this.success = success; + this.html = html; + this.bbox = bbox; + this.breakNode = breakNode; + } + isBreak() { + return !!this.breakNode; + } + static breakNode(node) { + return new HTMLResult(false, null, null, node); + } + static success(html, bbox = null) { + return new HTMLResult(true, html, bbox, null); + } +} + +;// ./src/core/xfa/fonts.js + + + +class FontFinder { + constructor(pdfFonts) { + this.fonts = new Map(); + this.cache = new Map(); + this.warned = new Set(); + this.defaultFont = null; + this.add(pdfFonts); + } + add(pdfFonts, reallyMissingFonts = null) { + for (const pdfFont of pdfFonts) { + this.addPdfFont(pdfFont); + } + for (const pdfFont of this.fonts.values()) { + if (!pdfFont.regular) { + pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic; + } + } + if (!reallyMissingFonts || reallyMissingFonts.size === 0) { + return; + } + const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA"); + for (const missing of reallyMissingFonts) { + this.fonts.set(missing, myriad); + } + } + addPdfFont(pdfFont) { + const cssFontInfo = pdfFont.cssFontInfo; + const name = cssFontInfo.fontFamily; + let font = this.fonts.get(name); + if (!font) { + font = Object.create(null); + this.fonts.set(name, font); + if (!this.defaultFont) { + this.defaultFont = font; + } + } + let property = ""; + const fontWeight = parseFloat(cssFontInfo.fontWeight); + if (parseFloat(cssFontInfo.italicAngle) !== 0) { + property = fontWeight >= 700 ? "bolditalic" : "italic"; + } else if (fontWeight >= 700) { + property = "bold"; + } + if (!property) { + if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) { + property = "bold"; + } + if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName?.includes("Italic") || pdfFont.psName?.endsWith("It")) { + property += "italic"; + } + } + if (!property) { + property = "regular"; + } + font[property] = pdfFont; + } + getDefault() { + return this.defaultFont; + } + find(fontName, mustWarn = true) { + let font = this.fonts.get(fontName) || this.cache.get(fontName); + if (font) { + return font; + } + const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; + let name = fontName.replaceAll(pattern, ""); + font = this.fonts.get(name); + if (font) { + this.cache.set(fontName, font); + return font; + } + name = name.toLowerCase(); + const maybe = []; + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + if (maybe.length === 0) { + for (const [, pdfFont] of this.fonts.entries()) { + if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + name = name.replaceAll(/psmt|mt/gi, ""); + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + for (const pdfFont of this.fonts.values()) { + if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length >= 1) { + if (maybe.length !== 1 && mustWarn) { + warn(`XFA - Too many choices to guess the correct font: ${fontName}`); + } + this.cache.set(fontName, maybe[0]); + return maybe[0]; + } + if (mustWarn && !this.warned.has(fontName)) { + this.warned.add(fontName); + warn(`XFA - Cannot find the font: ${fontName}`); + } + return null; + } +} +function selectFont(xfaFont, typeface) { + if (xfaFont.posture === "italic") { + if (xfaFont.weight === "bold") { + return typeface.bolditalic; + } + return typeface.italic; + } else if (xfaFont.weight === "bold") { + return typeface.bold; + } + return typeface.regular; +} +function fonts_getMetrics(xfaFont, real = false) { + let pdfFont = null; + if (xfaFont) { + const name = stripQuotes(xfaFont.typeface); + const typeface = xfaFont[$globalData].fontFinder.find(name); + pdfFont = selectFont(xfaFont, typeface); + } + if (!pdfFont) { + return { + lineHeight: 12, + lineGap: 2, + lineNoGap: 10 + }; + } + const size = xfaFont.size || 10; + const lineHeight = pdfFont.lineHeight ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) : 1.2; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + return { + lineHeight: lineHeight * size, + lineGap: lineGap * size, + lineNoGap: Math.max(1, lineHeight - lineGap) * size + }; +} + +;// ./src/core/xfa/text.js + +const WIDTH_FACTOR = 1.02; +class FontInfo { + constructor(xfaFont, margin, lineHeight, fontFinder) { + this.lineHeight = lineHeight; + this.paraMargin = margin || { + top: 0, + bottom: 0, + left: 0, + right: 0 + }; + if (!xfaFont) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.xfaFont = { + typeface: xfaFont.typeface, + posture: xfaFont.posture, + weight: xfaFont.weight, + size: xfaFont.size, + letterSpacing: xfaFont.letterSpacing + }; + const typeface = fontFinder.find(xfaFont.typeface); + if (!typeface) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.pdfFont = selectFont(xfaFont, typeface); + if (!this.pdfFont) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + } + } + defaultFont(fontFinder) { + const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || fontFinder.find("Arial", false) || fontFinder.getDefault(); + if (font?.regular) { + const pdfFont = font.regular; + const info = pdfFont.cssFontInfo; + const xfaFont = { + typeface: info.fontFamily, + posture: "normal", + weight: "normal", + size: 10, + letterSpacing: 0 + }; + return [pdfFont, xfaFont]; + } + const xfaFont = { + typeface: "Courier", + posture: "normal", + weight: "normal", + size: 10, + letterSpacing: 0 + }; + return [null, xfaFont]; + } +} +class FontSelector { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) { + this.fontFinder = fontFinder; + this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)]; + } + pushData(xfaFont, margin, lineHeight) { + const lastFont = this.stack.at(-1); + for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) { + if (!xfaFont[name]) { + xfaFont[name] = lastFont.xfaFont[name]; + } + } + for (const name of ["top", "bottom", "left", "right"]) { + if (isNaN(margin[name])) { + margin[name] = lastFont.paraMargin[name]; + } + } + const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder); + if (!fontInfo.pdfFont) { + fontInfo.pdfFont = lastFont.pdfFont; + } + this.stack.push(fontInfo); + } + popFont() { + this.stack.pop(); + } + topFont() { + return this.stack.at(-1); + } +} +class TextMeasure { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) { + this.glyphs = []; + this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts); + this.extraHeight = 0; + } + pushData(xfaFont, margin, lineHeight) { + this.fontSelector.pushData(xfaFont, margin, lineHeight); + } + popFont(xfaFont) { + return this.fontSelector.popFont(); + } + addPara() { + const lastFont = this.fontSelector.topFont(); + this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom; + } + addString(str) { + if (!str) { + return; + } + const lastFont = this.fontSelector.topFont(); + const fontSize = lastFont.xfaFont.size; + if (lastFont.pdfFont) { + const letterSpacing = lastFont.xfaFont.letterSpacing; + const pdfFont = lastFont.pdfFont; + const fontLineHeight = pdfFont.lineHeight || 1.2; + const lineHeight = lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + const noGap = fontLineHeight - lineGap; + const firstLineHeight = Math.max(1, noGap) * fontSize; + const scale = fontSize / 1000; + const fallbackWidth = pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width; + for (const line of str.split(/[\u2029\n]/)) { + const encodedLine = pdfFont.encodeString(line).join(""); + const glyphs = pdfFont.charsToGlyphs(encodedLine); + for (const glyph of glyphs) { + const width = glyph.width || fallbackWidth; + this.glyphs.push([width * scale + letterSpacing, lineHeight, firstLineHeight, glyph.unicode, false]); + } + this.glyphs.push([0, 0, 0, "\n", true]); + } + this.glyphs.pop(); + return; + } + for (const line of str.split(/[\u2029\n]/)) { + for (const char of line.split("")) { + this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]); + } + this.glyphs.push([0, 0, 0, "\n", true]); + } + this.glyphs.pop(); + } + compute(maxWidth) { + let lastSpacePos = -1, + lastSpaceWidth = 0, + width = 0, + height = 0, + currentLineWidth = 0, + currentLineHeight = 0; + let isBroken = false; + let isFirstLine = true; + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = this.glyphs[i]; + const isSpace = char === " "; + const glyphHeight = isFirstLine ? firstLineHeight : lineHeight; + if (isEOL) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isFirstLine = false; + continue; + } + if (isSpace) { + if (currentLineWidth + glyphWidth > maxWidth) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isBroken = true; + isFirstLine = false; + } else { + currentLineHeight = Math.max(glyphHeight, currentLineHeight); + lastSpaceWidth = currentLineWidth; + currentLineWidth += glyphWidth; + lastSpacePos = i; + } + continue; + } + if (currentLineWidth + glyphWidth > maxWidth) { + height += currentLineHeight; + currentLineHeight = glyphHeight; + if (lastSpacePos !== -1) { + i = lastSpacePos; + width = Math.max(width, lastSpaceWidth); + currentLineWidth = 0; + lastSpacePos = -1; + lastSpaceWidth = 0; + } else { + width = Math.max(width, currentLineWidth); + currentLineWidth = glyphWidth; + } + isBroken = true; + isFirstLine = false; + continue; + } + currentLineWidth += glyphWidth; + currentLineHeight = Math.max(glyphHeight, currentLineHeight); + } + width = Math.max(width, currentLineWidth); + height += currentLineHeight + this.extraHeight; + return { + width: WIDTH_FACTOR * width, + height, + isBroken + }; + } +} + +;// ./src/core/xfa/som.js + + +const namePattern = /^[^.[]+/; +const indexPattern = /^[^\]]+/; +const operators = { + dot: 0, + dotDot: 1, + dotHash: 2, + dotBracket: 3, + dotParen: 4 +}; +const shortcuts = new Map([["$data", (root, current) => root.datasets ? root.datasets.data : root], ["$record", (root, current) => (root.datasets ? root.datasets.data : root)[$getChildren]()[0]], ["$template", (root, current) => root.template], ["$connectionSet", (root, current) => root.connectionSet], ["$form", (root, current) => root.form], ["$layout", (root, current) => root.layout], ["$host", (root, current) => root.host], ["$dataWindow", (root, current) => root.dataWindow], ["$event", (root, current) => root.event], ["!", (root, current) => root.datasets], ["$xfa", (root, current) => root], ["xfa", (root, current) => root], ["$", (root, current) => current]]); +const somCache = new WeakMap(); +function parseIndex(index) { + index = index.trim(); + if (index === "*") { + return Infinity; + } + return parseInt(index, 10) || 0; +} +function parseExpression(expr, dotDotAllowed, noExpr = true) { + let match = expr.match(namePattern); + if (!match) { + return null; + } + let [name] = match; + const parsed = [{ + name, + cacheName: "." + name, + index: 0, + js: null, + formCalc: null, + operator: operators.dot + }]; + let pos = name.length; + while (pos < expr.length) { + const spos = pos; + const char = expr.charAt(pos++); + if (char === "[") { + match = expr.slice(pos).match(indexPattern); + if (!match) { + warn("XFA - Invalid index in SOM expression"); + return null; + } + parsed.at(-1).index = parseIndex(match[0]); + pos += match[0].length + 1; + continue; + } + let operator; + switch (expr.charAt(pos)) { + case ".": + if (!dotDotAllowed) { + return null; + } + pos++; + operator = operators.dotDot; + break; + case "#": + pos++; + operator = operators.dotHash; + break; + case "[": + if (noExpr) { + warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now."); + return null; + } + operator = operators.dotBracket; + break; + case "(": + if (noExpr) { + warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now."); + return null; + } + operator = operators.dotParen; + break; + default: + operator = operators.dot; + break; + } + match = expr.slice(pos).match(namePattern); + if (!match) { + break; + } + [name] = match; + pos += name.length; + parsed.push({ + name, + cacheName: expr.slice(spos, pos), + operator, + index: 0, + js: null, + formCalc: null + }); + } + return parsed; +} +function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) { + const parsed = parseExpression(expr, dotDotAllowed); + if (!parsed) { + return null; + } + const fn = shortcuts.get(parsed[0].name); + let i = 0; + let isQualified; + if (fn) { + isQualified = true; + root = [fn(root, container)]; + i = 1; + } else { + isQualified = container === null; + root = [container || root]; + } + for (let ii = parsed.length; i < ii; i++) { + const { + name, + cacheName, + operator, + index + } = parsed[i]; + const nodes = []; + for (const node of root) { + if (!node.isXFAObject) { + continue; + } + let children, cached; + if (useCache) { + cached = somCache.get(node); + if (!cached) { + cached = new Map(); + somCache.set(node, cached); + } + children = cached.get(cacheName); + } + if (!children) { + switch (operator) { + case operators.dot: + children = node[$getChildrenByName](name, false); + break; + case operators.dotDot: + children = node[$getChildrenByName](name, true); + break; + case operators.dotHash: + children = node[$getChildrenByClass](name); + children = children.isXFAObjectArray ? children.children : [children]; + break; + default: + break; + } + if (useCache) { + cached.set(cacheName, children); + } + } + if (children.length > 0) { + nodes.push(children); + } + } + if (nodes.length === 0 && !isQualified && i === 0) { + const parent = container[$getParent](); + container = parent; + if (!container) { + return null; + } + i = -1; + root = [container]; + continue; + } + root = isFinite(index) ? nodes.filter(node => index < node.length).map(node => node[index]) : nodes.flat(); + } + if (root.length === 0) { + return null; + } + return root; +} +function createDataNode(root, container, expr) { + const parsed = parseExpression(expr); + if (!parsed) { + return null; + } + if (parsed.some(x => x.operator === operators.dotDot)) { + return null; + } + const fn = shortcuts.get(parsed[0].name); + let i = 0; + if (fn) { + root = fn(root, container); + i = 1; + } else { + root = container || root; + } + for (let ii = parsed.length; i < ii; i++) { + const { + name, + operator, + index + } = parsed[i]; + if (!isFinite(index)) { + parsed[i].index = 0; + return root.createNodes(parsed.slice(i)); + } + let children; + switch (operator) { + case operators.dot: + children = root[$getChildrenByName](name, false); + break; + case operators.dotDot: + children = root[$getChildrenByName](name, true); + break; + case operators.dotHash: + children = root[$getChildrenByClass](name); + children = children.isXFAObjectArray ? children.children : [children]; + break; + default: + break; + } + if (children.length === 0) { + return root.createNodes(parsed.slice(i)); + } + if (index < children.length) { + const child = children[index]; + if (!child.isXFAObject) { + warn(`XFA - Cannot create a node.`); + return null; + } + root = child; + } else { + parsed[i].index = index - children.length; + return root.createNodes(parsed.slice(i)); + } + } + return null; +} + +;// ./src/core/xfa/xfa_object.js + + + + + + +const _applyPrototype = Symbol(); +const _attributes = Symbol(); +const _attributeNames = Symbol(); +const _children = Symbol("_children"); +const _cloneAttribute = Symbol(); +const _dataValue = Symbol(); +const _defaultValue = Symbol(); +const _filteredChildrenGenerator = Symbol(); +const _getPrototype = Symbol(); +const _getUnsetAttributes = Symbol(); +const _hasChildren = Symbol(); +const _max = Symbol(); +const _options = Symbol(); +const _parent = Symbol("parent"); +const _resolvePrototypesHelper = Symbol(); +const _setAttributes = Symbol(); +const _validator = Symbol(); +let uid = 0; +const NS_DATASETS = NamespaceIds.datasets.id; +class XFAObject { + constructor(nsId, name, hasChildren = false) { + this[$namespaceId] = nsId; + this[$nodeName] = name; + this[_hasChildren] = hasChildren; + this[_parent] = null; + this[_children] = []; + this[$uid] = `${name}${uid++}`; + this[$globalData] = null; + } + get isXFAObject() { + return true; + } + get isXFAObjectArray() { + return false; + } + createNodes(path) { + let root = this, + node = null; + for (const { + name, + index + } of path) { + for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) { + const nsId = root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId]; + node = new XmlObject(nsId, name); + root[$appendChild](node); + } + root = node; + } + return node; + } + [$onChild](child) { + if (!this[_hasChildren] || !this[$onChildCheck](child)) { + return false; + } + const name = child[$nodeName]; + const node = this[name]; + if (node instanceof XFAObjectArray) { + if (node.push(child)) { + this[$appendChild](child); + return true; + } + } else { + if (node !== null) { + this[$removeChild](node); + } + this[name] = child; + this[$appendChild](child); + return true; + } + let id = ""; + if (this.id) { + id = ` (id: ${this.id})`; + } else if (this.name) { + id = ` (name: ${this.name} ${this.h.value})`; + } + warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`); + return false; + } + [$onChildCheck](child) { + return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; + } + [$isNsAgnostic]() { + return false; + } + [$acceptWhitespace]() { + return false; + } + [$isCDATAXml]() { + return false; + } + [$isBindable]() { + return false; + } + [$popPara]() { + if (this.para) { + this[$getTemplateRoot]()[$extra].paraStack.pop(); + } + } + [$pushPara]() { + this[$getTemplateRoot]()[$extra].paraStack.push(this.para); + } + [$setId](ids) { + if (this.id && this[$namespaceId] === NamespaceIds.template.id) { + ids.set(this.id, this); + } + } + [$getTemplateRoot]() { + return this[$globalData].template; + } + [$isSplittable]() { + return false; + } + [$isThereMoreWidth]() { + return false; + } + [$appendChild](child) { + child[_parent] = this; + this[_children].push(child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$removeChild](child) { + const i = this[_children].indexOf(child); + this[_children].splice(i, 1); + } + [$hasSettableValue]() { + return this.hasOwnProperty("value"); + } + [$setValue](_) {} + [$onText](_) {} + [$finalize]() {} + [$clean](builder) { + delete this[_hasChildren]; + if (this[$cleanup]) { + builder.clean(this[$cleanup]); + delete this[$cleanup]; + } + } + [$indexOf](child) { + return this[_children].indexOf(child); + } + [$insertAt](i, child) { + child[_parent] = this; + this[_children].splice(i, 0, child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$isTransparent]() { + return !this.name; + } + [$lastAttribute]() { + return ""; + } + [$text]() { + if (this[_children].length === 0) { + return this[$content]; + } + return this[_children].map(c => c[$text]()).join(""); + } + get [_attributeNames]() { + const proto = Object.getPrototypeOf(this); + if (!proto._attributes) { + const attributes = proto._attributes = new Set(); + for (const name of Object.getOwnPropertyNames(this)) { + if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) { + break; + } + attributes.add(name); + } + } + return shadow(this, _attributeNames, proto._attributes); + } + [$isDescendent](parent) { + let node = this; + while (node) { + if (node === parent) { + return true; + } + node = node[$getParent](); + } + return false; + } + [$getParent]() { + return this[_parent]; + } + [$getSubformParent]() { + return this[$getParent](); + } + [$getChildren](name = null) { + if (!name) { + return this[_children]; + } + return this[name]; + } + [$dump]() { + const dumped = Object.create(null); + if (this[$content]) { + dumped.$content = this[$content]; + } + for (const name of Object.getOwnPropertyNames(this)) { + const value = this[name]; + if (value === null) { + continue; + } + if (value instanceof XFAObject) { + dumped[name] = value[$dump](); + } else if (value instanceof XFAObjectArray) { + if (!value.isEmpty()) { + dumped[name] = value.dump(); + } + } else { + dumped[name] = value; + } + } + return dumped; + } + [$toStyle]() { + return null; + } + [$toHTML]() { + return HTMLResult.EMPTY; + } + *[$getContainedChildren]() { + for (const node of this[$getChildren]()) { + yield node; + } + } + *[_filteredChildrenGenerator](filter, include) { + for (const node of this[$getContainedChildren]()) { + if (!filter || include === filter.has(node[$nodeName])) { + const availableSpace = this[$getAvailableSpace](); + const res = node[$toHTML](availableSpace); + if (!res.success) { + this[$extra].failingNode = node; + } + yield res; + } + } + } + [$flushHTML]() { + return null; + } + [$addHTML](html, bbox) { + this[$extra].children.push(html); + } + [$getAvailableSpace]() {} + [$childrenToHTML]({ + filter = null, + include = true + }) { + if (!this[$extra].generator) { + this[$extra].generator = this[_filteredChildrenGenerator](filter, include); + } else { + const availableSpace = this[$getAvailableSpace](); + const res = this[$extra].failingNode[$toHTML](availableSpace); + if (!res.success) { + return res; + } + if (res.html) { + this[$addHTML](res.html, res.bbox); + } + delete this[$extra].failingNode; + } + while (true) { + const gen = this[$extra].generator.next(); + if (gen.done) { + break; + } + const res = gen.value; + if (!res.success) { + return res; + } + if (res.html) { + this[$addHTML](res.html, res.bbox); + } + } + this[$extra].generator = null; + return HTMLResult.EMPTY; + } + [$setSetAttributes](attributes) { + this[_setAttributes] = new Set(Object.keys(attributes)); + } + [_getUnsetAttributes](protoAttributes) { + const allAttr = this[_attributeNames]; + const setAttr = this[_setAttributes]; + return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x)); + } + [$resolvePrototypes](ids, ancestors = new Set()) { + for (const child of this[_children]) { + child[_resolvePrototypesHelper](ids, ancestors); + } + } + [_resolvePrototypesHelper](ids, ancestors) { + const proto = this[_getPrototype](ids, ancestors); + if (proto) { + this[_applyPrototype](proto, ids, ancestors); + } else { + this[$resolvePrototypes](ids, ancestors); + } + } + [_getPrototype](ids, ancestors) { + const { + use, + usehref + } = this; + if (!use && !usehref) { + return null; + } + let proto = null; + let somExpression = null; + let id = null; + let ref = use; + if (usehref) { + ref = usehref; + if (usehref.startsWith("#som(") && usehref.endsWith(")")) { + somExpression = usehref.slice("#som(".length, -1); + } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) { + somExpression = usehref.slice(".#som(".length, -1); + } else if (usehref.startsWith("#")) { + id = usehref.slice(1); + } else if (usehref.startsWith(".#")) { + id = usehref.slice(2); + } + } else if (use.startsWith("#")) { + id = use.slice(1); + } else { + somExpression = use; + } + this.use = this.usehref = ""; + if (id) { + proto = ids.get(id); + } else { + proto = searchNode(ids.get($root), this, somExpression, true, false); + if (proto) { + proto = proto[0]; + } + } + if (!proto) { + warn(`XFA - Invalid prototype reference: ${ref}.`); + return null; + } + if (proto[$nodeName] !== this[$nodeName]) { + warn(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`); + return null; + } + if (ancestors.has(proto)) { + warn(`XFA - Cycle detected in prototypes use.`); + return null; + } + ancestors.add(proto); + const protoProto = proto[_getPrototype](ids, ancestors); + if (protoProto) { + proto[_applyPrototype](protoProto, ids, ancestors); + } + proto[$resolvePrototypes](ids, ancestors); + ancestors.delete(proto); + return proto; + } + [_applyPrototype](proto, ids, ancestors) { + if (ancestors.has(proto)) { + warn(`XFA - Cycle detected in prototypes use.`); + return; + } + if (!this[$content] && proto[$content]) { + this[$content] = proto[$content]; + } + const newAncestors = new Set(ancestors); + newAncestors.add(proto); + for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) { + this[unsetAttrName] = proto[unsetAttrName]; + if (this[_setAttributes]) { + this[_setAttributes].add(unsetAttrName); + } + } + for (const name of Object.getOwnPropertyNames(this)) { + if (this[_attributeNames].has(name)) { + continue; + } + const value = this[name]; + const protoValue = proto[name]; + if (value instanceof XFAObjectArray) { + for (const child of value[_children]) { + child[_resolvePrototypesHelper](ids, ancestors); + } + for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) { + const child = proto[_children][i][$clone](); + if (value.push(child)) { + child[_parent] = this; + this[_children].push(child); + child[_resolvePrototypesHelper](ids, ancestors); + } else { + break; + } + } + continue; + } + if (value !== null) { + value[$resolvePrototypes](ids, ancestors); + if (protoValue) { + value[_applyPrototype](protoValue, ids, ancestors); + } + continue; + } + if (protoValue !== null) { + const child = protoValue[$clone](); + child[_parent] = this; + this[name] = child; + this[_children].push(child); + child[_resolvePrototypesHelper](ids, ancestors); + } + } + } + static [_cloneAttribute](obj) { + if (Array.isArray(obj)) { + return obj.map(x => XFAObject[_cloneAttribute](x)); + } + if (typeof obj === "object" && obj !== null) { + return Object.assign({}, obj); + } + return obj; + } + [$clone]() { + const clone = Object.create(Object.getPrototypeOf(this)); + for (const $symbol of Object.getOwnPropertySymbols(this)) { + try { + clone[$symbol] = this[$symbol]; + } catch { + shadow(clone, $symbol, this[$symbol]); + } + } + clone[$uid] = `${clone[$nodeName]}${uid++}`; + clone[_children] = []; + for (const name of Object.getOwnPropertyNames(this)) { + if (this[_attributeNames].has(name)) { + clone[name] = XFAObject[_cloneAttribute](this[name]); + continue; + } + const value = this[name]; + clone[name] = value instanceof XFAObjectArray ? new XFAObjectArray(value[_max]) : null; + } + for (const child of this[_children]) { + const name = child[$nodeName]; + const clonedChild = child[$clone](); + clone[_children].push(clonedChild); + clonedChild[_parent] = clone; + if (clone[name] === null) { + clone[name] = clonedChild; + } else { + clone[name][_children].push(clonedChild); + } + } + return clone; + } + [$getChildren](name = null) { + if (!name) { + return this[_children]; + } + return this[_children].filter(c => c[$nodeName] === name); + } + [$getChildrenByClass](name) { + return this[name]; + } + [$getChildrenByName](name, allTransparent, first = true) { + return Array.from(this[$getChildrenByNameIt](name, allTransparent, first)); + } + *[$getChildrenByNameIt](name, allTransparent, first = true) { + if (name === "parent") { + yield this[_parent]; + return; + } + for (const child of this[_children]) { + if (child[$nodeName] === name) { + yield child; + } + if (child.name === name) { + yield child; + } + if (allTransparent || child[$isTransparent]()) { + yield* child[$getChildrenByNameIt](name, allTransparent, false); + } + } + if (first && this[_attributeNames].has(name)) { + yield new XFAAttribute(this, name, this[name]); + } + } +} +class XFAObjectArray { + constructor(max = Infinity) { + this[_max] = max; + this[_children] = []; + } + get isXFAObject() { + return false; + } + get isXFAObjectArray() { + return true; + } + push(child) { + const len = this[_children].length; + if (len <= this[_max]) { + this[_children].push(child); + return true; + } + warn(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`); + return false; + } + isEmpty() { + return this[_children].length === 0; + } + dump() { + return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]()); + } + [$clone]() { + const clone = new XFAObjectArray(this[_max]); + clone[_children] = this[_children].map(c => c[$clone]()); + return clone; + } + get children() { + return this[_children]; + } + clear() { + this[_children].length = 0; + } +} +class XFAAttribute { + constructor(node, name, value) { + this[_parent] = node; + this[$nodeName] = name; + this[$content] = value; + this[$consumed] = false; + this[$uid] = `attribute${uid++}`; + } + [$getParent]() { + return this[_parent]; + } + [$isDataValue]() { + return true; + } + [$getDataValue]() { + return this[$content].trim(); + } + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$text]() { + return this[$content]; + } + [$isDescendent](parent) { + return this[_parent] === parent || this[_parent][$isDescendent](parent); + } +} +class XmlObject extends XFAObject { + constructor(nsId, name, attributes = {}) { + super(nsId, name); + this[$content] = ""; + this[_dataValue] = null; + if (name !== "#text") { + const map = new Map(); + this[_attributes] = map; + for (const [attrName, value] of Object.entries(attributes)) { + map.set(attrName, new XFAAttribute(this, attrName, value)); + } + if (attributes.hasOwnProperty($nsAttributes)) { + const dataNode = attributes[$nsAttributes].xfa.dataNode; + if (dataNode !== undefined) { + if (dataNode === "dataGroup") { + this[_dataValue] = false; + } else if (dataNode === "dataValue") { + this[_dataValue] = true; + } + } + } + } + this[$consumed] = false; + } + [$toString](buf) { + const tagName = this[$nodeName]; + if (tagName === "#text") { + buf.push(encodeToXmlString(this[$content])); + return; + } + const utf8TagName = utf8StringToString(tagName); + const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; + buf.push(`<${prefix}${utf8TagName}`); + for (const [name, value] of this[_attributes].entries()) { + const utf8Name = utf8StringToString(name); + buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`); + } + if (this[_dataValue] !== null) { + if (this[_dataValue]) { + buf.push(` xfa:dataNode="dataValue"`); + } else { + buf.push(` xfa:dataNode="dataGroup"`); + } + } + if (!this[$content] && this[_children].length === 0) { + buf.push("/>"); + return; + } + buf.push(">"); + if (this[$content]) { + if (typeof this[$content] === "string") { + buf.push(encodeToXmlString(this[$content])); + } else { + this[$content][$toString](buf); + } + } else { + for (const child of this[_children]) { + child[$toString](buf); + } + } + buf.push(``); + } + [$onChild](child) { + if (this[$content]) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + this[$content] = ""; + } + this[$appendChild](child); + return true; + } + [$onText](str) { + this[$content] += str; + } + [$finalize]() { + if (this[$content] && this[_children].length > 0) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + delete this[$content]; + } + } + [$toHTML]() { + if (this[$nodeName] === "#text") { + return HTMLResult.success({ + name: "#text", + value: this[$content] + }); + } + return HTMLResult.EMPTY; + } + [$getChildren](name = null) { + if (!name) { + return this[_children]; + } + return this[_children].filter(c => c[$nodeName] === name); + } + [$getAttributes]() { + return this[_attributes]; + } + [$getChildrenByClass](name) { + const value = this[_attributes].get(name); + if (value !== undefined) { + return value; + } + return this[$getChildren](name); + } + *[$getChildrenByNameIt](name, allTransparent) { + const value = this[_attributes].get(name); + if (value) { + yield value; + } + for (const child of this[_children]) { + if (child[$nodeName] === name) { + yield child; + } + if (allTransparent) { + yield* child[$getChildrenByNameIt](name, allTransparent); + } + } + } + *[$getAttributeIt](name, skipConsumed) { + const value = this[_attributes].get(name); + if (value && (!skipConsumed || !value[$consumed])) { + yield value; + } + for (const child of this[_children]) { + yield* child[$getAttributeIt](name, skipConsumed); + } + } + *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) { + for (const child of this[_children]) { + if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) { + yield child; + } + if (allTransparent) { + yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed); + } + } + } + [$isDataValue]() { + if (this[_dataValue] === null) { + return this[_children].length === 0 || this[_children][0][$namespaceId] === NamespaceIds.xhtml.id; + } + return this[_dataValue]; + } + [$getDataValue]() { + if (this[_dataValue] === null) { + if (this[_children].length === 0) { + return this[$content].trim(); + } + if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) { + return this[_children][0][$text]().trim(); + } + return null; + } + return this[$content].trim(); + } + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$dump](hasNS = false) { + const dumped = Object.create(null); + if (hasNS) { + dumped.$ns = this[$namespaceId]; + } + if (this[$content]) { + dumped.$content = this[$content]; + } + dumped.$name = this[$nodeName]; + dumped.children = []; + for (const child of this[_children]) { + dumped.children.push(child[$dump](hasNS)); + } + dumped.attributes = Object.create(null); + for (const [name, value] of this[_attributes]) { + dumped.attributes[name] = value[$content]; + } + return dumped; + } +} +class ContentObject extends XFAObject { + constructor(nsId, name) { + super(nsId, name); + this[$content] = ""; + } + [$onText](text) { + this[$content] += text; + } + [$finalize]() {} +} +class OptionObject extends ContentObject { + constructor(nsId, name, options) { + super(nsId, name); + this[_options] = options; + } + [$finalize]() { + this[$content] = getKeyword({ + data: this[$content], + defaultValue: this[_options][0], + validate: k => this[_options].includes(k) + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_options]; + } +} +class StringObject extends ContentObject { + [$finalize]() { + this[$content] = this[$content].trim(); + } +} +class IntegerObject extends ContentObject { + constructor(nsId, name, defaultValue, validator) { + super(nsId, name); + this[_defaultValue] = defaultValue; + this[_validator] = validator; + } + [$finalize]() { + this[$content] = getInteger({ + data: this[$content], + defaultValue: this[_defaultValue], + validate: this[_validator] + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_defaultValue]; + delete this[_validator]; + } +} +class Option01 extends IntegerObject { + constructor(nsId, name) { + super(nsId, name, 0, n => n === 1); + } +} +class Option10 extends IntegerObject { + constructor(nsId, name) { + super(nsId, name, 1, n => n === 0); + } +} + +;// ./src/core/xfa/html_utils.js + + + + + + +function measureToString(m) { + if (typeof m === "string") { + return "0px"; + } + return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`; +} +const converters = { + anchorType(node, style) { + const parent = node[$getSubformParent](); + if (!parent || parent.layout && parent.layout !== "position") { + return; + } + if (!("transform" in style)) { + style.transform = ""; + } + switch (node.anchorType) { + case "bottomCenter": + style.transform += "translate(-50%, -100%)"; + break; + case "bottomLeft": + style.transform += "translate(0,-100%)"; + break; + case "bottomRight": + style.transform += "translate(-100%,-100%)"; + break; + case "middleCenter": + style.transform += "translate(-50%,-50%)"; + break; + case "middleLeft": + style.transform += "translate(0,-50%)"; + break; + case "middleRight": + style.transform += "translate(-100%,-50%)"; + break; + case "topCenter": + style.transform += "translate(-50%,0)"; + break; + case "topRight": + style.transform += "translate(-100%,0)"; + break; + } + }, + dimensions(node, style) { + const parent = node[$getSubformParent](); + let width = node.w; + const height = node.h; + if (parent.layout?.includes("row")) { + const extra = parent[$extra]; + const colSpan = node.colSpan; + let w; + if (colSpan === -1) { + w = extra.columnWidths.slice(extra.currentColumn).reduce((a, x) => a + x, 0); + extra.currentColumn = 0; + } else { + w = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, x) => a + x, 0); + extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length; + } + if (!isNaN(w)) { + width = node.w = w; + } + } + style.width = width !== "" ? measureToString(width) : "auto"; + style.height = height !== "" ? measureToString(height) : "auto"; + }, + position(node, style) { + const parent = node[$getSubformParent](); + if (parent?.layout && parent.layout !== "position") { + return; + } + style.position = "absolute"; + style.left = measureToString(node.x); + style.top = measureToString(node.y); + }, + rotate(node, style) { + if (node.rotate) { + if (!("transform" in style)) { + style.transform = ""; + } + style.transform += `rotate(-${node.rotate}deg)`; + style.transformOrigin = "top left"; + } + }, + presence(node, style) { + switch (node.presence) { + case "invisible": + style.visibility = "hidden"; + break; + case "hidden": + case "inactive": + style.display = "none"; + break; + } + }, + hAlign(node, style) { + if (node[$nodeName] === "para") { + switch (node.hAlign) { + case "justifyAll": + style.textAlign = "justify-all"; + break; + case "radix": + style.textAlign = "left"; + break; + default: + style.textAlign = node.hAlign; + } + } else { + switch (node.hAlign) { + case "left": + style.alignSelf = "start"; + break; + case "center": + style.alignSelf = "center"; + break; + case "right": + style.alignSelf = "end"; + break; + } + } + }, + margin(node, style) { + if (node.margin) { + style.margin = node.margin[$toStyle]().margin; + } + } +}; +function setMinMaxDimensions(node, style) { + const parent = node[$getSubformParent](); + if (parent.layout === "position") { + if (node.minW > 0) { + style.minWidth = measureToString(node.minW); + } + if (node.maxW > 0) { + style.maxWidth = measureToString(node.maxW); + } + if (node.minH > 0) { + style.minHeight = measureToString(node.minH); + } + if (node.maxH > 0) { + style.maxHeight = measureToString(node.maxH); + } + } +} +function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) { + const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder); + if (typeof text === "string") { + measure.addString(text); + } else { + text[$pushGlyphs](measure); + } + return measure.compute(width); +} +function layoutNode(node, availableSpace) { + let height = null; + let width = null; + let isBroken = false; + if ((!node.w || !node.h) && node.value) { + let marginH = 0; + let marginV = 0; + if (node.margin) { + marginH = node.margin.leftInset + node.margin.rightInset; + marginV = node.margin.topInset + node.margin.bottomInset; + } + let lineHeight = null; + let margin = null; + if (node.para) { + margin = Object.create(null); + lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight; + margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove; + margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow; + margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft; + margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight; + } + let font = node.font; + if (!font) { + const root = node[$getTemplateRoot](); + let parent = node[$getParent](); + while (parent && parent !== root) { + if (parent.font) { + font = parent.font; + break; + } + parent = parent[$getParent](); + } + } + const maxWidth = (node.w || availableSpace.width) - marginH; + const fontFinder = node[$globalData].fontFinder; + if (node.value.exData && node.value.exData[$content] && node.value.exData.contentType === "text/html") { + const res = layoutText(node.value.exData[$content], font, margin, lineHeight, fontFinder, maxWidth); + width = res.width; + height = res.height; + isBroken = res.isBroken; + } else { + const text = node.value[$text](); + if (text) { + const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth); + width = res.width; + height = res.height; + isBroken = res.isBroken; + } + } + if (width !== null && !node.w) { + width += marginH; + } + if (height !== null && !node.h) { + height += marginV; + } + } + return { + w: width, + h: height, + isBroken + }; +} +function computeBbox(node, html, availableSpace) { + let bbox; + if (node.w !== "" && node.h !== "") { + bbox = [node.x, node.y, node.w, node.h]; + } else { + if (!availableSpace) { + return null; + } + let width = node.w; + if (width === "") { + if (node.maxW === 0) { + const parent = node[$getSubformParent](); + width = parent.layout === "position" && parent.w !== "" ? 0 : node.minW; + } else { + width = Math.min(node.maxW, availableSpace.width); + } + html.attributes.style.width = measureToString(width); + } + let height = node.h; + if (height === "") { + if (node.maxH === 0) { + const parent = node[$getSubformParent](); + height = parent.layout === "position" && parent.h !== "" ? 0 : node.minH; + } else { + height = Math.min(node.maxH, availableSpace.height); + } + html.attributes.style.height = measureToString(height); + } + bbox = [node.x, node.y, width, height]; + } + return bbox; +} +function fixDimensions(node) { + const parent = node[$getSubformParent](); + if (parent.layout?.includes("row")) { + const extra = parent[$extra]; + const colSpan = node.colSpan; + let width; + if (colSpan === -1) { + width = extra.columnWidths.slice(extra.currentColumn).reduce((a, w) => a + w, 0); + } else { + width = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, w) => a + w, 0); + } + if (!isNaN(width)) { + node.w = width; + } + } + if (parent.layout && parent.layout !== "position") { + node.x = node.y = 0; + } + if (node.layout === "table") { + if (node.w === "" && Array.isArray(node.columnWidths)) { + node.w = node.columnWidths.reduce((a, x) => a + x, 0); + } + } +} +function layoutClass(node) { + switch (node.layout) { + case "position": + return "xfaPosition"; + case "lr-tb": + return "xfaLrTb"; + case "rl-row": + return "xfaRlRow"; + case "rl-tb": + return "xfaRlTb"; + case "row": + return "xfaRow"; + case "table": + return "xfaTable"; + case "tb": + return "xfaTb"; + default: + return "xfaPosition"; + } +} +function toStyle(node, ...names) { + const style = Object.create(null); + for (const name of names) { + const value = node[name]; + if (value === null) { + continue; + } + if (converters.hasOwnProperty(name)) { + converters[name](node, style); + continue; + } + if (value instanceof XFAObject) { + const newStyle = value[$toStyle](); + if (newStyle) { + Object.assign(style, newStyle); + } else { + warn(`(DEBUG) - XFA - style for ${name} not implemented yet`); + } + } + } + return style; +} +function createWrapper(node, html) { + const { + attributes + } = html; + const { + style + } = attributes; + const wrapper = { + name: "div", + attributes: { + class: ["xfaWrapper"], + style: Object.create(null) + }, + children: [] + }; + attributes.class.push("xfaWrapped"); + if (node.border) { + const { + widths, + insets + } = node.border[$extra]; + let width, height; + let top = insets[0]; + let left = insets[3]; + const insetsH = insets[0] + insets[2]; + const insetsW = insets[1] + insets[3]; + switch (node.border.hand) { + case "even": + top -= widths[0] / 2; + left -= widths[3] / 2; + width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`; + height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`; + break; + case "left": + top -= widths[0]; + left -= widths[3]; + width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`; + height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`; + break; + case "right": + width = insetsW ? `calc(100% - ${insetsW}px)` : "100%"; + height = insetsH ? `calc(100% - ${insetsH}px)` : "100%"; + break; + } + const classNames = ["xfaBorder"]; + if (isPrintOnly(node.border)) { + classNames.push("xfaPrintOnly"); + } + const border = { + name: "div", + attributes: { + class: classNames, + style: { + top: `${top}px`, + left: `${left}px`, + width, + height + } + }, + children: [] + }; + for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) { + if (style[key] !== undefined) { + border.attributes.style[key] = style[key]; + delete style[key]; + } + } + wrapper.children.push(border, html); + } else { + wrapper.children.push(html); + } + for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) { + if (style[key] !== undefined) { + wrapper.attributes.style[key] = style[key]; + delete style[key]; + } + } + wrapper.attributes.style.position = style.position === "absolute" ? "absolute" : "relative"; + delete style.position; + if (style.alignSelf) { + wrapper.attributes.style.alignSelf = style.alignSelf; + delete style.alignSelf; + } + return wrapper; +} +function fixTextIndent(styles) { + const indent = getMeasurement(styles.textIndent, "0px"); + if (indent >= 0) { + return; + } + const align = styles.textAlign === "right" ? "right" : "left"; + const name = "padding" + (align === "left" ? "Left" : "Right"); + const padding = getMeasurement(styles[name], "0px"); + styles[name] = `${padding - indent}px`; +} +function setAccess(node, classNames) { + switch (node.access) { + case "nonInteractive": + classNames.push("xfaNonInteractive"); + break; + case "readOnly": + classNames.push("xfaReadOnly"); + break; + case "protected": + classNames.push("xfaDisabled"); + break; + } +} +function isPrintOnly(node) { + return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print"; +} +function getCurrentPara(node) { + const stack = node[$getTemplateRoot]()[$extra].paraStack; + return stack.length ? stack.at(-1) : null; +} +function setPara(node, nodeStyle, value) { + if (value.attributes.class?.includes("xfaRich")) { + if (nodeStyle) { + if (node.h === "") { + nodeStyle.height = "auto"; + } + if (node.w === "") { + nodeStyle.width = "auto"; + } + } + const para = getCurrentPara(node); + if (para) { + const valueStyle = value.attributes.style; + valueStyle.display = "flex"; + valueStyle.flexDirection = "column"; + switch (para.vAlign) { + case "top": + valueStyle.justifyContent = "start"; + break; + case "bottom": + valueStyle.justifyContent = "end"; + break; + case "middle": + valueStyle.justifyContent = "center"; + break; + } + const paraStyle = para[$toStyle](); + for (const [key, val] of Object.entries(paraStyle)) { + if (!(key in valueStyle)) { + valueStyle[key] = val; + } + } + } + } +} +function setFontFamily(xfaFont, node, fontFinder, style) { + if (!fontFinder) { + delete style.fontFamily; + return; + } + const name = stripQuotes(xfaFont.typeface); + style.fontFamily = `"${name}"`; + const typeface = fontFinder.find(name); + if (typeface) { + const { + fontFamily + } = typeface.regular.cssFontInfo; + if (fontFamily !== name) { + style.fontFamily = `"${fontFamily}"`; + } + const para = getCurrentPara(node); + if (para && para.lineHeight !== "") { + return; + } + if (style.lineHeight) { + return; + } + const pdfFont = selectFont(xfaFont, typeface); + if (pdfFont) { + style.lineHeight = Math.max(1.2, pdfFont.lineHeight); + } + } +} +function fixURL(str) { + const absoluteUrl = createValidAbsoluteUrl(str, null, { + addDefaultProtocol: true, + tryConvertEncoding: true + }); + return absoluteUrl ? absoluteUrl.href : null; +} + +;// ./src/core/xfa/layout.js + + +function createLine(node, children) { + return { + name: "div", + attributes: { + class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"] + }, + children + }; +} +function flushHTML(node) { + if (!node[$extra]) { + return null; + } + const attributes = node[$extra].attributes; + const html = { + name: "div", + attributes, + children: node[$extra].children + }; + if (node[$extra].failingNode) { + const htmlFromFailing = node[$extra].failingNode[$flushHTML](); + if (htmlFromFailing) { + if (node.layout.endsWith("-tb")) { + html.children.push(createLine(node, [htmlFromFailing])); + } else { + html.children.push(htmlFromFailing); + } + } + } + if (html.children.length === 0) { + return null; + } + return html; +} +function addHTML(node, html, bbox) { + const extra = node[$extra]; + const availableSpace = extra.availableSpace; + const [x, y, w, h] = bbox; + switch (node.layout) { + case "position": + { + extra.width = Math.max(extra.width, x + w); + extra.height = Math.max(extra.height, y + h); + extra.children.push(html); + break; + } + case "lr-tb": + case "rl-tb": + if (!extra.line || extra.attempt === 1) { + extra.line = createLine(node, []); + extra.children.push(extra.line); + extra.numberInLine = 0; + } + extra.numberInLine += 1; + extra.line.children.push(html); + if (extra.attempt === 0) { + extra.currentWidth += w; + extra.height = Math.max(extra.height, extra.prevHeight + h); + } else { + extra.currentWidth = w; + extra.prevHeight = extra.height; + extra.height += h; + extra.attempt = 0; + } + extra.width = Math.max(extra.width, extra.currentWidth); + break; + case "rl-row": + case "row": + { + extra.children.push(html); + extra.width += w; + extra.height = Math.max(extra.height, h); + const height = measureToString(extra.height); + for (const child of extra.children) { + child.attributes.style.height = height; + } + break; + } + case "table": + { + extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.height += h; + extra.children.push(html); + break; + } + case "tb": + { + extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.height += h; + extra.children.push(html); + break; + } + } +} +function getAvailableSpace(node) { + const availableSpace = node[$extra].availableSpace; + const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0; + const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0; + switch (node.layout) { + case "lr-tb": + case "rl-tb": + if (node[$extra].attempt === 0) { + return { + width: availableSpace.width - marginH - node[$extra].currentWidth, + height: availableSpace.height - marginV - node[$extra].prevHeight + }; + } + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[$extra].height + }; + case "rl-row": + case "row": + const width = node[$extra].columnWidths.slice(node[$extra].currentColumn).reduce((a, x) => a + x); + return { + width, + height: availableSpace.height - marginH + }; + case "table": + case "tb": + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[$extra].height + }; + case "position": + default: + return availableSpace; + } +} +function getTransformedBBox(node) { + let w = node.w === "" ? NaN : node.w; + let h = node.h === "" ? NaN : node.h; + let [centerX, centerY] = [0, 0]; + switch (node.anchorType || "") { + case "bottomCenter": + [centerX, centerY] = [w / 2, h]; + break; + case "bottomLeft": + [centerX, centerY] = [0, h]; + break; + case "bottomRight": + [centerX, centerY] = [w, h]; + break; + case "middleCenter": + [centerX, centerY] = [w / 2, h / 2]; + break; + case "middleLeft": + [centerX, centerY] = [0, h / 2]; + break; + case "middleRight": + [centerX, centerY] = [w, h / 2]; + break; + case "topCenter": + [centerX, centerY] = [w / 2, 0]; + break; + case "topRight": + [centerX, centerY] = [w, 0]; + break; + } + let x, y; + switch (node.rotate || 0) { + case 0: + [x, y] = [-centerX, -centerY]; + break; + case 90: + [x, y] = [-centerY, centerX]; + [w, h] = [h, -w]; + break; + case 180: + [x, y] = [centerX, centerY]; + [w, h] = [-w, -h]; + break; + case 270: + [x, y] = [centerY, -centerX]; + [w, h] = [-h, w]; + break; + } + return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)]; +} +function checkDimensions(node, space) { + if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null) { + return true; + } + if (node.w === 0 || node.h === 0) { + return true; + } + const ERROR = 2; + const parent = node[$getSubformParent](); + const attempt = parent[$extra]?.attempt || 0; + const [, y, w, h] = getTransformedBBox(node); + switch (parent.layout) { + case "lr-tb": + case "rl-tb": + if (attempt === 0) { + if (!node[$getTemplateRoot]()[$extra].noLayoutFailure) { + if (node.h !== "" && Math.round(h - space.height) > ERROR) { + return false; + } + if (node.w !== "") { + if (Math.round(w - space.width) <= ERROR) { + return true; + } + if (parent[$extra].numberInLine === 0) { + return space.height > ERROR; + } + return false; + } + return space.width > ERROR; + } + if (node.w !== "") { + return Math.round(w - space.width) <= ERROR; + } + return space.width > ERROR; + } + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h !== "" && Math.round(h - space.height) > ERROR) { + return false; + } + if (node.w === "" || Math.round(w - space.width) <= ERROR) { + return space.height > ERROR; + } + if (parent[$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; + case "table": + case "tb": + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h !== "" && !node[$isSplittable]()) { + return Math.round(h - space.height) <= ERROR; + } + if (node.w === "" || Math.round(w - space.width) <= ERROR) { + return space.height > ERROR; + } + if (parent[$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; + case "position": + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h === "" || Math.round(h + y - space.height) <= ERROR) { + return true; + } + const area = node[$getTemplateRoot]()[$extra].currentContentArea; + return h + y > area.h; + case "rl-row": + case "row": + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h !== "") { + return Math.round(h - space.height) <= ERROR; + } + return true; + default: + return true; + } +} + +;// ./src/core/xfa/template.js + + + + + + + + + + +const TEMPLATE_NS_ID = NamespaceIds.template.id; +const SVG_NS = "http://www.w3.org/2000/svg"; +const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; +const MAX_EMPTY_PAGES = 3; +const DEFAULT_TAB_INDEX = 5000; +const HEADING_PATTERN = /^H(\d+)$/; +const MIMES = new Set(["image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/png", "image/apng", "image/x-png", "image/bmp", "image/x-ms-bmp", "image/tiff", "image/tif", "application/octet-stream"]); +const IMAGES_HEADERS = [[[0x42, 0x4d], "image/bmp"], [[0xff, 0xd8, 0xff], "image/jpeg"], [[0x49, 0x49, 0x2a, 0x00], "image/tiff"], [[0x4d, 0x4d, 0x00, 0x2a], "image/tiff"], [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], "image/gif"], [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], "image/png"]]; +function getBorderDims(node) { + if (!node || !node.border) { + return { + w: 0, + h: 0 + }; + } + const borderExtra = node.border[$getExtra](); + if (!borderExtra) { + return { + w: 0, + h: 0 + }; + } + return { + w: borderExtra.widths[0] + borderExtra.widths[2] + borderExtra.insets[0] + borderExtra.insets[2], + h: borderExtra.widths[1] + borderExtra.widths[3] + borderExtra.insets[1] + borderExtra.insets[3] + }; +} +function hasMargin(node) { + return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset); +} +function _setValue(templateNode, value) { + if (!templateNode.value) { + const nodeValue = new Value({}); + templateNode[$appendChild](nodeValue); + templateNode.value = nodeValue; + } + templateNode.value[$setValue](value); +} +function* getContainedChildren(node) { + for (const child of node[$getChildren]()) { + if (child instanceof SubformSet) { + yield* child[$getContainedChildren](); + continue; + } + yield child; + } +} +function isRequired(node) { + return node.validate?.nullTest === "error"; +} +function setTabIndex(node) { + while (node) { + if (!node.traversal) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; + return; + } + if (node[$tabIndex]) { + return; + } + let next = null; + for (const child of node.traversal[$getChildren]()) { + if (child.operation === "next") { + next = child; + break; + } + } + if (!next || !next.ref) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; + return; + } + const root = node[$getTemplateRoot](); + node[$tabIndex] = ++root[$tabIndex]; + const ref = root[$searchNode](next.ref, node); + if (!ref) { + return; + } + node = ref[0]; + } +} +function applyAssist(obj, attributes) { + const assist = obj.assist; + if (assist) { + const assistTitle = assist[$toHTML](); + if (assistTitle) { + attributes.title = assistTitle; + } + const role = assist.role; + const match = role.match(HEADING_PATTERN); + if (match) { + const ariaRole = "heading"; + const ariaLevel = match[1]; + attributes.role = ariaRole; + attributes["aria-level"] = ariaLevel; + } + } + if (obj.layout === "table") { + attributes.role = "table"; + } else if (obj.layout === "row") { + attributes.role = "row"; + } else { + const parent = obj[$getParent](); + if (parent.layout === "row") { + attributes.role = parent.assist?.role === "TH" ? "columnheader" : "cell"; + } + } +} +function ariaLabel(obj) { + if (!obj.assist) { + return null; + } + const assist = obj.assist; + if (assist.speak && assist.speak[$content] !== "") { + return assist.speak[$content]; + } + if (assist.toolTip) { + return assist.toolTip[$content]; + } + return null; +} +function valueToHtml(value) { + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: Object.create(null) + }, + children: [{ + name: "span", + attributes: { + style: Object.create(null) + }, + value + }] + }); +} +function setFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === null) { + root[$extra].firstUnsplittable = node; + root[$extra].noLayoutFailure = true; + } +} +function unsetFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === node) { + root[$extra].noLayoutFailure = false; + } +} +function handleBreak(node) { + if (node[$extra]) { + return false; + } + node[$extra] = Object.create(null); + if (node.targetType === "auto") { + return false; + } + const root = node[$getTemplateRoot](); + let target = null; + if (node.target) { + target = root[$searchNode](node.target, node[$getParent]()); + if (!target) { + return false; + } + target = target[0]; + } + const { + currentPageArea, + currentContentArea + } = root[$extra]; + if (node.targetType === "pageArea") { + if (!(target instanceof PageArea)) { + target = null; + } + if (node.startNew) { + node[$extra].target = target || currentPageArea; + return true; + } else if (target && target !== currentPageArea) { + node[$extra].target = target; + return true; + } + return false; + } + if (!(target instanceof ContentArea)) { + target = null; + } + const pageArea = target && target[$getParent](); + let index; + let nextPageArea = pageArea; + if (node.startNew) { + if (target) { + const contentAreas = pageArea.contentArea.children; + const indexForCurrent = contentAreas.indexOf(currentContentArea); + const indexForTarget = contentAreas.indexOf(target); + if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) { + nextPageArea = null; + } + index = indexForTarget - 1; + } else { + index = currentPageArea.contentArea.children.indexOf(currentContentArea); + } + } else if (target && target !== currentContentArea) { + const contentAreas = pageArea.contentArea.children; + index = contentAreas.indexOf(target) - 1; + nextPageArea = pageArea === currentPageArea ? null : pageArea; + } else { + return false; + } + node[$extra].target = nextPageArea; + node[$extra].index = index; + return true; +} +function handleOverflow(node, extraNode, space) { + const root = node[$getTemplateRoot](); + const saved = root[$extra].noLayoutFailure; + const savedMethod = extraNode[$getSubformParent]; + extraNode[$getSubformParent] = () => node; + root[$extra].noLayoutFailure = true; + const res = extraNode[$toHTML](space); + node[$addHTML](res.html, res.bbox); + root[$extra].noLayoutFailure = saved; + extraNode[$getSubformParent] = savedMethod; +} +class AppearanceFilter extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "appearanceFilter"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Arc extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "arc", true); + this.circular = getInteger({ + data: attributes.circular, + defaultValue: 0, + validate: x => x === 1 + }); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.startAngle = getFloat({ + data: attributes.startAngle, + defaultValue: 0, + validate: x => true + }); + this.sweepAngle = getFloat({ + data: attributes.sweepAngle, + defaultValue: 360, + validate: x => true + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.edge = null; + this.fill = null; + } + [$toHTML]() { + const edge = this.edge || new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); + style.stroke = edgeStyle.color; + let arc; + const attributes = { + xmlns: SVG_NS, + style: { + width: "100%", + height: "100%", + overflow: "visible" + } + }; + if (this.sweepAngle === 360) { + arc = { + name: "ellipse", + attributes: { + xmlns: SVG_NS, + cx: "50%", + cy: "50%", + rx: "50%", + ry: "50%", + style + } + }; + } else { + const startAngle = this.startAngle * Math.PI / 180; + const sweepAngle = this.sweepAngle * Math.PI / 180; + const largeArc = this.sweepAngle > 180 ? 1 : 0; + const [x1, y1, x2, y2] = [50 * (1 + Math.cos(startAngle)), 50 * (1 - Math.sin(startAngle)), 50 * (1 + Math.cos(startAngle + sweepAngle)), 50 * (1 - Math.sin(startAngle + sweepAngle))]; + arc = { + name: "path", + attributes: { + xmlns: SVG_NS, + d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`, + vectorEffect: "non-scaling-stroke", + style + } + }; + Object.assign(attributes, { + viewBox: "0 0 100 100", + preserveAspectRatio: "none" + }); + } + const svg = { + name: "svg", + children: [arc], + attributes + }; + const parent = this[$getParent]()[$getParent](); + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class Area extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "area", true); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.desc = null; + this.extras = null; + this.area = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$isTransparent]() { + return true; + } + [$isBindable]() { + return true; + } + [$addHTML](html, bbox) { + const [x, y, w, h] = bbox; + this[$extra].width = Math.max(this[$extra].width, x + w); + this[$extra].height = Math.max(this[$extra].height, y + h); + this[$extra].children.push(html); + } + [$getAvailableSpace]() { + return this[$extra].availableSpace; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "position"); + const attributes = { + style, + id: this[$uid], + class: ["xfaArea"] + }; + if (isPrintOnly(this)) { + attributes.class.push("xfaPrintOnly"); + } + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + this[$extra] = { + children, + width: 0, + height: 0, + availableSpace + }; + const result = this[$childrenToHTML]({ + filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]), + include: true + }); + if (!result.success) { + if (result.isBreak()) { + return result; + } + delete this[$extra]; + return HTMLResult.FAILURE; + } + style.width = measureToString(this[$extra].width); + style.height = measureToString(this[$extra].height); + const html = { + name: "div", + attributes, + children + }; + const bbox = [this.x, this.y, this[$extra].width, this[$extra].height]; + delete this[$extra]; + return HTMLResult.success(html, bbox); + } +} +class Assist extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "assist", true); + this.id = attributes.id || ""; + this.role = attributes.role || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.speak = null; + this.toolTip = null; + } + [$toHTML]() { + return this.toolTip?.[$content] || null; + } +} +class Barcode extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "barcode", true); + this.charEncoding = getKeyword({ + data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + this.checksum = getStringOption(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]); + this.dataColumnCount = getInteger({ + data: attributes.dataColumnCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataLength = getInteger({ + data: attributes.dataLength, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataPrep = getStringOption(attributes.dataPrep, ["none", "flateCompress"]); + this.dataRowCount = getInteger({ + data: attributes.dataRowCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.endChar = attributes.endChar || ""; + this.errorCorrectionLevel = getInteger({ + data: attributes.errorCorrectionLevel, + defaultValue: -1, + validate: x => x >= 0 && x <= 8 + }); + this.id = attributes.id || ""; + this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm"); + this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm"); + this.printCheckDigit = getInteger({ + data: attributes.printCheckDigit, + defaultValue: 0, + validate: x => x === 1 + }); + this.rowColumnRatio = getRatio(attributes.rowColumnRatio); + this.startChar = attributes.startChar || ""; + this.textLocation = getStringOption(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]); + this.truncate = getInteger({ + data: attributes.truncate, + defaultValue: 0, + validate: x => x === 1 + }); + this.type = getStringOption(attributes.type ? attributes.type.toLowerCase() : "", ["aztec", "codabar", "code2of5industrial", "code2of5interleaved", "code2of5matrix", "code2of5standard", "code3of9", "code3of9extended", "code11", "code49", "code93", "code128", "code128a", "code128b", "code128c", "code128sscc", "datamatrix", "ean8", "ean8add2", "ean8add5", "ean13", "ean13add2", "ean13add5", "ean13pwcd", "fim", "logmars", "maxicode", "msi", "pdf417", "pdf417macro", "plessey", "postauscust2", "postauscust3", "postausreplypaid", "postausstandard", "postukrm4scc", "postusdpbc", "postusimb", "postusstandard", "postus5zip", "qrcode", "rfid", "rss14", "rss14expanded", "rss14limited", "rss14stacked", "rss14stackedomni", "rss14truncated", "telepen", "ucc128", "ucc128random", "ucc128sscc", "upca", "upcaadd2", "upcaadd5", "upcapwcd", "upce", "upceadd2", "upceadd5", "upcean2", "upcean5", "upsmaxicode"]); + this.upsMode = getStringOption(attributes.upsMode, ["usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio); + this.encrypt = null; + this.extras = null; + } +} +class Bind extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bind", true); + this.match = getStringOption(attributes.match, ["once", "dataRef", "global", "none"]); + this.ref = attributes.ref || ""; + this.picture = null; + } +} +class BindItems extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bindItems"); + this.connection = attributes.connection || ""; + this.labelRef = attributes.labelRef || ""; + this.ref = attributes.ref || ""; + this.valueRef = attributes.valueRef || ""; + } +} +class Bookend extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bookend"); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class BooleanElement extends Option01 { + constructor(attributes) { + super(TEMPLATE_NS_ID, "boolean"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] === 1 ? "1" : "0"); + } +} +class Border extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "border", true); + this.break = getStringOption(attributes.break, ["close", "open"]); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.corner = new XFAObjectArray(4); + this.edge = new XFAObjectArray(4); + this.extras = null; + this.fill = null; + this.margin = null; + } + [$getExtra]() { + if (!this[$extra]) { + const edges = this.edge.children.slice(); + if (edges.length < 4) { + const defaultEdge = edges.at(-1) || new Edge({}); + for (let i = edges.length; i < 4; i++) { + edges.push(defaultEdge); + } + } + const widths = edges.map(edge => edge.thickness); + const insets = [0, 0, 0, 0]; + if (this.margin) { + insets[0] = this.margin.topInset; + insets[1] = this.margin.rightInset; + insets[2] = this.margin.bottomInset; + insets[3] = this.margin.leftInset; + } + this[$extra] = { + widths, + insets, + edges + }; + } + return this[$extra]; + } + [$toStyle]() { + const { + edges + } = this[$getExtra](); + const edgeStyles = edges.map(node => { + const style = node[$toStyle](); + style.color ||= "#000000"; + return style; + }); + const style = Object.create(null); + if (this.margin) { + Object.assign(style, this.margin[$toStyle]()); + } + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } + if (this.corner.children.some(node => node.radius !== 0)) { + const cornerStyles = this.corner.children.map(node => node[$toStyle]()); + if (cornerStyles.length === 2 || cornerStyles.length === 3) { + const last = cornerStyles.at(-1); + for (let i = cornerStyles.length; i < 4; i++) { + cornerStyles.push(last); + } + } + style.borderRadius = cornerStyles.map(s => s.radius).join(" "); + } + switch (this.presence) { + case "invisible": + case "hidden": + style.borderStyle = ""; + break; + case "inactive": + style.borderStyle = "none"; + break; + default: + style.borderStyle = edgeStyles.map(s => s.style).join(" "); + break; + } + style.borderWidth = edgeStyles.map(s => s.width).join(" "); + style.borderColor = edgeStyles.map(s => s.color).join(" "); + return style; + } +} +class Break extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "break", true); + this.after = getStringOption(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.afterTarget = attributes.afterTarget || ""; + this.before = getStringOption(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.beforeTarget = attributes.beforeTarget || ""; + this.bookendLeader = attributes.bookendLeader || ""; + this.bookendTrailer = attributes.bookendTrailer || ""; + this.id = attributes.id || ""; + this.overflowLeader = attributes.overflowLeader || ""; + this.overflowTarget = attributes.overflowTarget || ""; + this.overflowTrailer = attributes.overflowTrailer || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class BreakAfter extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakAfter", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } +} +class BreakBefore extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakBefore", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = getInteger({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } + [$toHTML](availableSpace) { + this[$extra] = {}; + return HTMLResult.FAILURE; + } +} +class Button extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "button", true); + this.highlight = getStringOption(attributes.highlight, ["inverted", "none", "outline", "push"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$toHTML](availableSpace) { + const parent = this[$getParent](); + const grandpa = parent[$getParent](); + const htmlButton = { + name: "button", + attributes: { + id: this[$uid], + class: ["xfaButton"], + style: {} + }, + children: [] + }; + for (const event of grandpa.event.children) { + if (event.activity !== "click" || !event.script) { + continue; + } + const jsURL = recoverJsURL(event.script[$content]); + if (!jsURL) { + continue; + } + const href = fixURL(jsURL.url); + if (!href) { + continue; + } + htmlButton.children.push({ + name: "a", + attributes: { + id: "link" + this[$uid], + href, + newWindow: jsURL.newWindow, + class: ["xfaLink"], + style: {} + }, + children: [] + }); + } + return HTMLResult.success(htmlButton); + } +} +class Calculate extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "calculate", true); + this.id = attributes.id || ""; + this.override = getStringOption(attributes.override, ["disabled", "error", "ignore", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.script = null; + } +} +class Caption extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "caption", true); + this.id = attributes.id || ""; + this.placement = getStringOption(attributes.placement, ["left", "bottom", "inline", "right", "top"]); + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.reserve = Math.ceil(getMeasurement(attributes.reserve)); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.font = null; + this.margin = null; + this.para = null; + this.value = null; + } + [$setValue](value) { + _setValue(this, value); + } + [$getExtra](availableSpace) { + if (!this[$extra]) { + let { + width, + height + } = availableSpace; + switch (this.placement) { + case "left": + case "right": + case "inline": + width = this.reserve <= 0 ? width : this.reserve; + break; + case "top": + case "bottom": + height = this.reserve <= 0 ? height : this.reserve; + break; + } + this[$extra] = layoutNode(this, { + width, + height + }); + } + return this[$extra]; + } + [$toHTML](availableSpace) { + if (!this.value) { + return HTMLResult.EMPTY; + } + this[$pushPara](); + const value = this.value[$toHTML](availableSpace).html; + if (!value) { + this[$popPara](); + return HTMLResult.EMPTY; + } + const savedReserve = this.reserve; + if (this.reserve <= 0) { + const { + w, + h + } = this[$getExtra](availableSpace); + switch (this.placement) { + case "left": + case "right": + case "inline": + this.reserve = w; + break; + case "top": + case "bottom": + this.reserve = h; + break; + } + } + const children = []; + if (typeof value === "string") { + children.push({ + name: "#text", + value + }); + } else { + children.push(value); + } + const style = toStyle(this, "font", "margin", "visibility"); + switch (this.placement) { + case "left": + case "right": + if (this.reserve > 0) { + style.width = measureToString(this.reserve); + } + break; + case "top": + case "bottom": + if (this.reserve > 0) { + style.height = measureToString(this.reserve); + } + break; + } + setPara(this, null, value); + this[$popPara](); + this.reserve = savedReserve; + return HTMLResult.success({ + name: "div", + attributes: { + style, + class: ["xfaCaption"] + }, + children + }); + } +} +class Certificate extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificate"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Certificates extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificates", true); + this.credentialServerPolicy = getStringOption(attributes.credentialServerPolicy, ["optional", "required"]); + this.id = attributes.id || ""; + this.url = attributes.url || ""; + this.urlPolicy = attributes.urlPolicy || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encryption = null; + this.issuers = null; + this.keyUsage = null; + this.oids = null; + this.signing = null; + this.subjectDNs = null; + } +} +class CheckButton extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "checkButton", true); + this.id = attributes.id || ""; + this.mark = getStringOption(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]); + this.shape = getStringOption(attributes.shape, ["square", "round"]); + this.size = getMeasurement(attributes.size, "10pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle("margin"); + const size = measureToString(this.size); + style.width = style.height = size; + let type; + let className; + let groupId; + const field = this[$getParent]()[$getParent](); + const items = field.items.children.length && field.items.children[0][$toHTML]().html || []; + const exportedValue = { + on: (items[0] !== undefined ? items[0] : "on").toString(), + off: (items[1] !== undefined ? items[1] : "off").toString() + }; + const value = field.value?.[$text]() || "off"; + const checked = value === exportedValue.on || undefined; + const container = field[$getSubformParent](); + const fieldId = field[$uid]; + let dataId; + if (container instanceof ExclGroup) { + groupId = container[$uid]; + type = "radio"; + className = "xfaRadio"; + dataId = container[$data]?.[$uid] || container[$uid]; + } else { + type = "checkbox"; + className = "xfaCheckbox"; + dataId = field[$data]?.[$uid] || field[$uid]; + } + const input = { + name: "input", + attributes: { + class: [className], + style, + fieldId, + dataId, + type, + checked, + xfaOn: exportedValue.on, + xfaOff: exportedValue.off, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (groupId) { + input.attributes.name = groupId; + } + if (isRequired(field)) { + input.attributes["aria-required"] = true; + input.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [input] + }); + } +} +class ChoiceList extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "choiceList", true); + this.commitOn = getStringOption(attributes.commitOn, ["select", "exit"]); + this.id = attributes.id || ""; + this.open = getStringOption(attributes.open, ["userControl", "always", "multiSelect", "onEntry"]); + this.textEntry = getInteger({ + data: attributes.textEntry, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "margin"); + const ui = this[$getParent](); + const field = ui[$getParent](); + const fontSize = field.font?.size || 10; + const optionStyle = { + fontSize: `calc(${fontSize}px * var(--scale-factor))` + }; + const children = []; + if (field.items.children.length > 0) { + const items = field.items; + let displayedIndex = 0; + let saveIndex = 0; + if (items.children.length === 2) { + displayedIndex = items.children[0].save; + saveIndex = 1 - displayedIndex; + } + const displayed = items.children[displayedIndex][$toHTML]().html; + const values = items.children[saveIndex][$toHTML]().html; + let selected = false; + const value = field.value?.[$text]() || ""; + for (let i = 0, ii = displayed.length; i < ii; i++) { + const option = { + name: "option", + attributes: { + value: values[i] || displayed[i], + style: optionStyle + }, + value: displayed[i] + }; + if (values[i] === value) { + option.attributes.selected = selected = true; + } + children.push(option); + } + if (!selected) { + children.splice(0, 0, { + name: "option", + attributes: { + hidden: true, + selected: true + }, + value: " " + }); + } + } + const selectAttributes = { + class: ["xfaSelect"], + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + style, + "aria-label": ariaLabel(field), + "aria-required": false + }; + if (isRequired(field)) { + selectAttributes["aria-required"] = true; + selectAttributes.required = true; + } + if (this.open === "multiSelect") { + selectAttributes.multiple = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [{ + name: "select", + children, + attributes: selectAttributes + }] + }); + } +} +class Color extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "color", true); + this.cSpace = getStringOption(attributes.cSpace, ["SRGB"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.value = attributes.value ? getColor(attributes.value) : ""; + this.extras = null; + } + [$hasSettableValue]() { + return false; + } + [$toStyle]() { + return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null; + } +} +class Comb extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "comb"); + this.id = attributes.id || ""; + this.numberOfCells = getInteger({ + data: attributes.numberOfCells, + defaultValue: 0, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Connect extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "connect", true); + this.connection = attributes.connection || ""; + this.id = attributes.id || ""; + this.ref = attributes.ref || ""; + this.usage = getStringOption(attributes.usage, ["exportAndImport", "exportOnly", "importOnly"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.picture = null; + } +} +class ContentArea extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "contentArea", true); + this.h = getMeasurement(attributes.h); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = getMeasurement(attributes.w); + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.desc = null; + this.extras = null; + } + [$toHTML](availableSpace) { + const left = measureToString(this.x); + const top = measureToString(this.y); + const style = { + left, + top, + width: measureToString(this.w), + height: measureToString(this.h) + }; + const classNames = ["xfaContentarea"]; + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + return HTMLResult.success({ + name: "div", + children: [], + attributes: { + style, + class: classNames, + id: this[$uid] + } + }); + } +} +class Corner extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "corner", true); + this.id = attributes.id || ""; + this.inverted = getInteger({ + data: attributes.inverted, + defaultValue: 0, + validate: x => x === 1 + }); + this.join = getStringOption(attributes.join, ["square", "round"]); + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.radius = getMeasurement(attributes.radius); + this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle]() { + const style = toStyle(this, "visibility"); + style.radius = measureToString(this.join === "square" ? 0 : this.radius); + return style; + } +} +class DateElement extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "date"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class DateTime extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTime"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class DateTimeEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTimeEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.picker = getStringOption(attributes.picker, ["host", "none"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + const field = this[$getParent]()[$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Decimal extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "decimal"); + this.fracDigits = getInteger({ + data: attributes.fracDigits, + defaultValue: 2, + validate: x => true + }); + this.id = attributes.id || ""; + this.leadDigits = getInteger({ + data: attributes.leadDigits, + defaultValue: -1, + validate: x => true + }); + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class DefaultUi extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "defaultUi", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class Desc extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "desc", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class DigestMethod extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class DigestMethods extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethods", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.digestMethod = new XFAObjectArray(); + } +} +class Draw extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "draw", true); + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.rotate = getInteger({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.border = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.font = null; + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.value = null; + this.setProperty = new XFAObjectArray(); + } + [$setValue](value) { + _setValue(this, value); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive") { + return HTMLResult.EMPTY; + } + fixDimensions(this); + this[$pushPara](); + const savedW = this.w; + const savedH = this.h; + const { + w, + h, + isBroken + } = layoutNode(this, availableSpace); + if (w && this.w === "") { + if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { + this[$popPara](); + return HTMLResult.FAILURE; + } + this.w = w; + } + if (h && this.h === "") { + this.h = h; + } + setFirstUnsplittable(this); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = toStyle(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin"); + setMinMaxDimensions(this, style); + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + const classNames = ["xfaDraw"]; + if (this.font) { + classNames.push("xfaFont"); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + const attributes = { + style, + id: this[$uid], + class: classNames + }; + if (this.name) { + attributes.xfaName = this.name; + } + const html = { + name: "div", + attributes, + children: [] + }; + applyAssist(this, attributes); + const bbox = computeBbox(this, html, availableSpace); + const value = this.value ? this.value[$toHTML](availableSpace).html : null; + if (value === null) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.success(createWrapper(this, html), bbox); + } + html.children.push(value); + setPara(this, style, value); + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.success(createWrapper(this, html), bbox); + } +} +class Edge extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "edge", true); + this.cap = getStringOption(attributes.cap, ["square", "butt", "round"]); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle]() { + const style = toStyle(this, "visibility"); + Object.assign(style, { + linecap: this.cap, + width: measureToString(this.thickness), + color: this.color ? this.color[$toStyle]() : "#000000", + style: "" + }); + if (this.presence !== "visible") { + style.style = "none"; + } else { + switch (this.stroke) { + case "solid": + style.style = "solid"; + break; + case "dashDot": + style.style = "dashed"; + break; + case "dashDotDot": + style.style = "dashed"; + break; + case "dashed": + style.style = "dashed"; + break; + case "dotted": + style.style = "dotted"; + break; + case "embossed": + style.style = "ridge"; + break; + case "etched": + style.style = "groove"; + break; + case "lowered": + style.style = "inset"; + break; + case "raised": + style.style = "outset"; + break; + } + } + return style; + } +} +class Encoding extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Encodings extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encodings", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encoding = new XFAObjectArray(); + } +} +class Encrypt extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encrypt", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = null; + } +} +class EncryptData extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptData", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, ["encrypt", "decrypt"]); + this.target = attributes.target || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.filter = null; + this.manifest = null; + } +} +class Encryption extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryption", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new XFAObjectArray(); + } +} +class EncryptionMethod extends OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class EncryptionMethods extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethods", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encryptionMethod = new XFAObjectArray(); + } +} +class Event extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "event", true); + this.activity = getStringOption(attributes.activity, ["click", "change", "docClose", "docReady", "enter", "exit", "full", "indexChange", "initialize", "mouseDown", "mouseEnter", "mouseExit", "mouseUp", "postExecute", "postOpen", "postPrint", "postSave", "postSign", "postSubmit", "preExecute", "preOpen", "prePrint", "preSave", "preSign", "preSubmit", "ready", "validationState"]); + this.id = attributes.id || ""; + this.listen = getStringOption(attributes.listen, ["refOnly", "refAndDescendents"]); + this.name = attributes.name || ""; + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.encryptData = null; + this.execute = null; + this.script = null; + this.signData = null; + this.submit = null; + } +} +class ExData extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exData"); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.maxLength = getInteger({ + data: attributes.maxLength, + defaultValue: -1, + validate: x => x >= -1 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, ["none", "base64", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$isCDATAXml]() { + return this.contentType === "text/html"; + } + [$onChild](child) { + if (this.contentType === "text/html" && child[$namespaceId] === NamespaceIds.xhtml.id) { + this[$content] = child; + return true; + } + if (this.contentType === "text/xml") { + this[$content] = child; + return true; + } + return false; + } + [$toHTML](availableSpace) { + if (this.contentType !== "text/html" || !this[$content]) { + return HTMLResult.EMPTY; + } + return this[$content][$toHTML](availableSpace); + } +} +class ExObject extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exObject", true); + this.archive = attributes.archive || ""; + this.classId = attributes.classId || ""; + this.codeBase = attributes.codeBase || ""; + this.codeType = attributes.codeType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class ExclGroup extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exclGroup", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.border = null; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.connect = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + } + [$isBindable]() { + return true; + } + [$hasSettableValue]() { + return true; + } + [$setValue](value) { + for (const field of this.field.children) { + if (!field.value) { + const nodeValue = new Value({}); + field[$appendChild](nodeValue); + field.value = nodeValue; + } + field.value[$setValue](value); + } + } + [$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); + } + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; + } + if (this[$extra]._isSplittable !== undefined) { + return this[$extra]._isSplittable; + } + if (this.layout === "position" || this.layout.includes("row")) { + this[$extra]._isSplittable = false; + return false; + } + if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { + return false; + } + this[$extra]._isSplittable = true; + return true; + } + [$flushHTML]() { + return flushHTML(this); + } + [$addHTML](html, bbox) { + addHTML(this, html, bbox); + } + [$getAvailableSpace]() { + return getAvailableSpace(this); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return HTMLResult.EMPTY; + } + fixDimensions(this); + const children = []; + const attributes = { + id: this[$uid], + class: [] + }; + setAccess(this, attributes.class); + if (!this[$extra]) { + this[$extra] = Object.create(null); + } + Object.assign(this[$extra], { + children, + attributes, + attempt: 0, + line: null, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const isSplittable = this[$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!checkDimensions(this, availableSpace)) { + return HTMLResult.FAILURE; + } + const filter = new Set(["field"]); + if (this.layout.includes("row")) { + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; + } + } + const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); + const classNames = ["xfaExclgroup"]; + const cl = layoutClass(this); + if (cl) { + classNames.push(cl); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } + this[$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { + if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[$extra].numberInLine = 0; + } + const result = this[$childrenToHTML]({ + filter, + include: true + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[$popPara](); + return result; + } + if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !this[$getTemplateRoot]()[$extra].noLayoutFailure) { + this[$extra].attempt = maxRun; + break; + } + } + this[$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + if (this[$extra].attempt === maxRun) { + if (!isSplittable) { + delete this[$extra]; + } + return HTMLResult.FAILURE; + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[$extra].width + marginH, this.w || 0); + const height = Math.max(this[$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = measureToString(width); + } + if (this.h === "") { + style.height = measureToString(height); + } + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + delete this[$extra]; + return HTMLResult.success(createWrapper(this, html), bbox); + } +} +class Execute extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "execute"); + this.connection = attributes.connection || ""; + this.executeType = getStringOption(attributes.executeType, ["import", "remerge"]); + this.id = attributes.id || ""; + this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Extras extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "extras", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.extras = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } +} +class Field extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "field", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.rotate = getInteger({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.border = null; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.font = null; + this.format = null; + this.items = new XFAObjectArray(2); + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.validate = null; + this.value = null; + this.bindItems = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + } + [$isBindable]() { + return true; + } + [$setValue](value) { + _setValue(this, value); + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (!this.ui) { + this.ui = new Ui({}); + this.ui[$globalData] = this[$globalData]; + this[$appendChild](this.ui); + let node; + switch (this.items.children.length) { + case 0: + node = new TextEdit({}); + this.ui.textEdit = node; + break; + case 1: + node = new CheckButton({}); + this.ui.checkButton = node; + break; + case 2: + node = new ChoiceList({}); + this.ui.choiceList = node; + break; + } + this.ui[$appendChild](node); + } + if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return HTMLResult.EMPTY; + } + if (this.caption) { + delete this.caption[$extra]; + } + this[$pushPara](); + const caption = this.caption ? this.caption[$toHTML](availableSpace).html : null; + const savedW = this.w; + const savedH = this.h; + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + let borderDims = null; + if (this.w === "" || this.h === "") { + let width = null; + let height = null; + let uiW = 0; + let uiH = 0; + if (this.ui.checkButton) { + uiW = uiH = this.ui.checkButton.size; + } else { + const { + w, + h + } = layoutNode(this, availableSpace); + if (w !== null) { + uiW = w; + uiH = h; + } else { + uiH = fonts_getMetrics(this.font, true).lineNoGap; + } + } + borderDims = getBorderDims(this.ui[$getExtra]()); + uiW += borderDims.w; + uiH += borderDims.h; + if (this.caption) { + const { + w, + h, + isBroken + } = this.caption[$getExtra](availableSpace); + if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { + this[$popPara](); + return HTMLResult.FAILURE; + } + width = w; + height = h; + switch (this.caption.placement) { + case "left": + case "right": + case "inline": + width += uiW; + break; + case "top": + case "bottom": + height += uiH; + break; + } + } else { + width = uiW; + height = uiH; + } + if (width && this.w === "") { + width += marginH; + this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW); + } + if (height && this.h === "") { + height += marginV; + this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH); + } + } + this[$popPara](); + fixDimensions(this); + setFirstUnsplittable(this); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = toStyle(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign"); + setMinMaxDimensions(this, style); + const classNames = ["xfaField"]; + if (this.font) { + classNames.push("xfaFont"); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + const attributes = { + style, + id: this[$uid], + class: classNames + }; + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + setAccess(this, classNames); + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + const borderStyle = this.border ? this.border[$toStyle]() : null; + const bbox = computeBbox(this, html, availableSpace); + const ui = this.ui[$toHTML]().html; + if (!ui) { + Object.assign(style, borderStyle); + return HTMLResult.success(createWrapper(this, html), bbox); + } + if (this[$tabIndex]) { + if (ui.children?.[0]) { + ui.children[0].attributes.tabindex = this[$tabIndex]; + } else { + ui.attributes.tabindex = this[$tabIndex]; + } + } + if (!ui.attributes.style) { + ui.attributes.style = Object.create(null); + } + let aElement = null; + if (this.ui.button) { + if (ui.children.length === 1) { + [aElement] = ui.children.splice(0, 1); + } + Object.assign(ui.attributes.style, borderStyle); + } else { + Object.assign(style, borderStyle); + } + children.push(ui); + if (this.value) { + if (this.ui.imageEdit) { + ui.children.push(this.value[$toHTML]().html); + } else if (!this.ui.button) { + let value = ""; + if (this.value.exData) { + value = this.value.exData[$text](); + } else if (this.value.text) { + value = this.value.text[$getExtra](); + } else { + const htmlValue = this.value[$toHTML]().html; + if (htmlValue !== null) { + value = htmlValue.children[0].value; + } + } + if (this.ui.textEdit && this.value.text?.maxChars) { + ui.children[0].attributes.maxLength = this.value.text.maxChars; + } + if (value) { + if (this.ui.numericEdit) { + value = parseFloat(value); + value = isNaN(value) ? "" : value.toString(); + } + if (ui.children[0].name === "textarea") { + ui.children[0].attributes.textContent = value; + } else { + ui.children[0].attributes.value = value; + } + } + } + } + if (!this.ui.imageEdit && ui.children?.[0] && this.h) { + borderDims = borderDims || getBorderDims(this.ui[$getExtra]()); + let captionHeight = 0; + if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { + captionHeight = this.caption.reserve; + if (captionHeight <= 0) { + captionHeight = this.caption[$getExtra](availableSpace).h; + } + const inputHeight = this.h - captionHeight - marginV - borderDims.h; + ui.children[0].attributes.style.height = measureToString(inputHeight); + } else { + ui.children[0].attributes.style.height = "100%"; + } + } + if (aElement) { + ui.children.push(aElement); + } + if (!caption) { + if (ui.attributes.class) { + ui.attributes.class.push("xfaLeft"); + } + this.w = savedW; + this.h = savedH; + return HTMLResult.success(createWrapper(this, html), bbox); + } + if (this.ui.button) { + if (style.padding) { + delete style.padding; + } + if (caption.name === "div") { + caption.name = "span"; + } + ui.children.push(caption); + return HTMLResult.success(html, bbox); + } else if (this.ui.checkButton) { + caption.attributes.class[0] = "xfaCaptionForCheckButton"; + } + if (!ui.attributes.class) { + ui.attributes.class = []; + } + ui.children.splice(0, 0, caption); + switch (this.caption.placement) { + case "left": + ui.attributes.class.push("xfaLeft"); + break; + case "right": + ui.attributes.class.push("xfaRight"); + break; + case "top": + ui.attributes.class.push("xfaTop"); + break; + case "bottom": + ui.attributes.class.push("xfaBottom"); + break; + case "inline": + ui.attributes.class.push("xfaLeft"); + break; + } + this.w = savedW; + this.h = savedH; + return HTMLResult.success(createWrapper(this, html), bbox); + } +} +class Fill extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "fill", true); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + this.linear = null; + this.pattern = null; + this.radial = null; + this.solid = null; + this.stipple = null; + } + [$toStyle]() { + const parent = this[$getParent](); + const grandpa = parent[$getParent](); + const ggrandpa = grandpa[$getParent](); + const style = Object.create(null); + let propName = "color"; + let altPropName = propName; + if (parent instanceof Border) { + propName = "background-color"; + altPropName = "background"; + if (ggrandpa instanceof Ui) { + style.backgroundColor = "white"; + } + } + if (parent instanceof Rectangle || parent instanceof Arc) { + propName = altPropName = "fill"; + style.fill = "white"; + } + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "color") { + continue; + } + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + const color = obj[$toStyle](this.color); + if (color) { + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; + } + if (this.color?.value) { + const color = this.color[$toStyle](); + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; + } +} +class Filter extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "filter", true); + this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, ["", "required", "optional", "none"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.version = getInteger({ + data: this.version, + defaultValue: 5, + validate: x => x >= 1 && x <= 5 + }); + this.appearanceFilter = null; + this.certificates = null; + this.digestMethods = null; + this.encodings = null; + this.encryptionMethods = null; + this.handler = null; + this.lockDocument = null; + this.mdp = null; + this.reasons = null; + this.timeStamp = null; + } +} +class Float extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "float"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class template_Font extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "font", true); + this.baselineShift = getMeasurement(attributes.baselineShift); + this.fontHorizontalScale = getFloat({ + data: attributes.fontHorizontalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.fontVerticalScale = getFloat({ + data: attributes.fontVerticalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.id = attributes.id || ""; + this.kerningMode = getStringOption(attributes.kerningMode, ["none", "pair"]); + this.letterSpacing = getMeasurement(attributes.letterSpacing, "0"); + this.lineThrough = getInteger({ + data: attributes.lineThrough, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, ["all", "word"]); + this.overline = getInteger({ + data: attributes.overline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.overlinePeriod = getStringOption(attributes.overlinePeriod, ["all", "word"]); + this.posture = getStringOption(attributes.posture, ["normal", "italic"]); + this.size = getMeasurement(attributes.size, "10pt"); + this.typeface = attributes.typeface || "Courier"; + this.underline = getInteger({ + data: attributes.underline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.underlinePeriod = getStringOption(attributes.underlinePeriod, ["all", "word"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.weight = getStringOption(attributes.weight, ["normal", "bold"]); + this.extras = null; + this.fill = null; + } + [$clean](builder) { + super[$clean](builder); + this[$globalData].usedTypefaces.add(this.typeface); + } + [$toStyle]() { + const style = toStyle(this, "fill"); + const color = style.color; + if (color) { + if (color === "#000000") { + delete style.color; + } else if (!color.startsWith("#")) { + style.background = color; + style.backgroundClip = "text"; + style.color = "transparent"; + } + } + if (this.baselineShift) { + style.verticalAlign = measureToString(this.baselineShift); + } + style.fontKerning = this.kerningMode === "none" ? "none" : "normal"; + style.letterSpacing = measureToString(this.letterSpacing); + if (this.lineThrough !== 0) { + style.textDecoration = "line-through"; + if (this.lineThrough === 2) { + style.textDecorationStyle = "double"; + } + } + if (this.overline !== 0) { + style.textDecoration = "overline"; + if (this.overline === 2) { + style.textDecorationStyle = "double"; + } + } + style.fontStyle = this.posture; + style.fontSize = measureToString(0.99 * this.size); + setFontFamily(this, this, this[$globalData].fontFinder, style); + if (this.underline !== 0) { + style.textDecoration = "underline"; + if (this.underline === 2) { + style.textDecorationStyle = "double"; + } + } + style.fontWeight = this.weight; + return style; + } +} +class Format extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "format", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.picture = null; + } +} +class Handler extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "handler"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Hyphenation extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "hyphenation"); + this.excludeAllCaps = getInteger({ + data: attributes.excludeAllCaps, + defaultValue: 0, + validate: x => x === 1 + }); + this.excludeInitialCap = getInteger({ + data: attributes.excludeInitialCap, + defaultValue: 0, + validate: x => x === 1 + }); + this.hyphenate = getInteger({ + data: attributes.hyphenate, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.pushCharacterCount = getInteger({ + data: attributes.pushCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.remainCharacterCount = getInteger({ + data: attributes.remainCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wordCharacterCount = getInteger({ + data: attributes.wordCharacterCount, + defaultValue: 7, + validate: x => x >= 0 + }); + } +} +class Image extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "image"); + this.aspect = getStringOption(attributes.aspect, ["fit", "actual", "height", "none", "width"]); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, ["base64", "none", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$toHTML]() { + if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { + return HTMLResult.EMPTY; + } + let buffer = this[$globalData].images && this[$globalData].images.get(this.href); + if (!buffer && (this.href || !this[$content])) { + return HTMLResult.EMPTY; + } + if (!buffer && this.transferEncoding === "base64") { + buffer = fromBase64Util(this[$content]); + } + if (!buffer) { + return HTMLResult.EMPTY; + } + if (!this.contentType) { + for (const [header, type] of IMAGES_HEADERS) { + if (buffer.length > header.length && header.every((x, i) => x === buffer[i])) { + this.contentType = type; + break; + } + } + if (!this.contentType) { + return HTMLResult.EMPTY; + } + } + const blob = new Blob([buffer], { + type: this.contentType + }); + let style; + switch (this.aspect) { + case "fit": + case "actual": + break; + case "height": + style = { + height: "100%", + objectFit: "fill" + }; + break; + case "none": + style = { + width: "100%", + height: "100%", + objectFit: "fill" + }; + break; + case "width": + style = { + width: "100%", + objectFit: "fill" + }; + break; + } + const parent = this[$getParent](); + return HTMLResult.success({ + name: "img", + attributes: { + class: ["xfaImage"], + style, + src: URL.createObjectURL(blob), + alt: parent ? ariaLabel(parent[$getParent]()) : null + } + }); + } +} +class ImageEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "imageEdit", true); + this.data = getStringOption(attributes.data, ["link", "embed"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + if (this.data === "embed") { + return HTMLResult.success({ + name: "div", + children: [], + attributes: {} + }); + } + return HTMLResult.EMPTY; + } +} +class Integer extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "integer"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const number = parseInt(this[$content].trim(), 10); + this[$content] = isNaN(number) ? null : number; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); + } +} +class Issuers extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "issuers", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new XFAObjectArray(); + } +} +class Items extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "items", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.ref = attributes.ref || ""; + this.save = getInteger({ + data: attributes.save, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } + [$toHTML]() { + const output = []; + for (const child of this[$getChildren]()) { + output.push(child[$text]()); + } + return HTMLResult.success(output); + } +} +class Keep extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "keep", true); + this.id = attributes.id || ""; + const options = ["none", "contentArea", "pageArea"]; + this.intact = getStringOption(attributes.intact, options); + this.next = getStringOption(attributes.next, options); + this.previous = getStringOption(attributes.previous, options); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class KeyUsage extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "keyUsage"); + const options = ["", "yes", "no"]; + this.crlSign = getStringOption(attributes.crlSign, options); + this.dataEncipherment = getStringOption(attributes.dataEncipherment, options); + this.decipherOnly = getStringOption(attributes.decipherOnly, options); + this.digitalSignature = getStringOption(attributes.digitalSignature, options); + this.encipherOnly = getStringOption(attributes.encipherOnly, options); + this.id = attributes.id || ""; + this.keyAgreement = getStringOption(attributes.keyAgreement, options); + this.keyCertSign = getStringOption(attributes.keyCertSign, options); + this.keyEncipherment = getStringOption(attributes.keyEncipherment, options); + this.nonRepudiation = getStringOption(attributes.nonRepudiation, options); + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Line extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "line", true); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.slope = getStringOption(attributes.slope, ["\\", "/"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.edge = null; + } + [$toHTML]() { + const parent = this[$getParent]()[$getParent](); + const edge = this.edge || new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + const thickness = edge.presence === "visible" ? edge.thickness : 0; + style.strokeWidth = measureToString(thickness); + style.stroke = edgeStyle.color; + let x1, y1, x2, y2; + let width = "100%"; + let height = "100%"; + if (parent.w <= thickness) { + [x1, y1, x2, y2] = ["50%", 0, "50%", "100%"]; + width = style.strokeWidth; + } else if (parent.h <= thickness) { + [x1, y1, x2, y2] = [0, "50%", "100%", "50%"]; + height = style.strokeWidth; + } else if (this.slope === "\\") { + [x1, y1, x2, y2] = [0, 0, "100%", "100%"]; + } else { + [x1, y1, x2, y2] = [0, "100%", "100%", 0]; + } + const line = { + name: "line", + attributes: { + xmlns: SVG_NS, + x1, + y1, + x2, + y2, + style + } + }; + const svg = { + name: "svg", + children: [line], + attributes: { + xmlns: SVG_NS, + width, + height, + style: { + overflow: "visible" + } + } + }; + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class Linear extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "linear", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase(); + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + return `linear-gradient(${transf}, ${startColor}, ${endColor})`; + } +} +class LockDocument extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "lockDocument"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + this[$content] = getStringOption(this[$content], ["auto", "0", "1"]); + } +} +class Manifest extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "manifest", true); + this.action = getStringOption(attributes.action, ["include", "all", "exclude"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.ref = new XFAObjectArray(); + } +} +class Margin extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "margin", true); + this.bottomInset = getMeasurement(attributes.bottomInset, "0"); + this.id = attributes.id || ""; + this.leftInset = getMeasurement(attributes.leftInset, "0"); + this.rightInset = getMeasurement(attributes.rightInset, "0"); + this.topInset = getMeasurement(attributes.topInset, "0"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$toStyle]() { + return { + margin: measureToString(this.topInset) + " " + measureToString(this.rightInset) + " " + measureToString(this.bottomInset) + " " + measureToString(this.leftInset) + }; + } +} +class Mdp extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "mdp"); + this.id = attributes.id || ""; + this.permissions = getInteger({ + data: attributes.permissions, + defaultValue: 2, + validate: x => x === 1 || x === 3 + }); + this.signatureType = getStringOption(attributes.signatureType, ["filler", "author"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Medium extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "medium"); + this.id = attributes.id || ""; + this.imagingBBox = getBBox(attributes.imagingBBox); + this.long = getMeasurement(attributes.long); + this.orientation = getStringOption(attributes.orientation, ["portrait", "landscape"]); + this.short = getMeasurement(attributes.short); + this.stock = attributes.stock || ""; + this.trayIn = getStringOption(attributes.trayIn, ["auto", "delegate", "pageFront"]); + this.trayOut = getStringOption(attributes.trayOut, ["auto", "delegate"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Message extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "message", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.text = new XFAObjectArray(); + } +} +class NumericEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "numericEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + const field = this[$getParent]()[$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Occur extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "occur", true); + this.id = attributes.id || ""; + this.initial = attributes.initial !== "" ? getInteger({ + data: attributes.initial, + defaultValue: "", + validate: x => true + }) : ""; + this.max = attributes.max !== "" ? getInteger({ + data: attributes.max, + defaultValue: 1, + validate: x => true + }) : ""; + this.min = attributes.min !== "" ? getInteger({ + data: attributes.min, + defaultValue: 1, + validate: x => true + }) : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$clean]() { + const parent = this[$getParent](); + const originalMin = this.min; + if (this.min === "") { + this.min = parent instanceof PageArea || parent instanceof PageSet ? 0 : 1; + } + if (this.max === "") { + if (originalMin === "") { + this.max = parent instanceof PageArea || parent instanceof PageSet ? -1 : 1; + } else { + this.max = this.min; + } + } + if (this.max !== -1 && this.max < this.min) { + this.max = this.min; + } + if (this.initial === "") { + this.initial = parent instanceof Template ? 1 : this.min; + } + } +} +class Oid extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "oid"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Oids extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "oids", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.oid = new XFAObjectArray(); + } +} +class Overflow extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "overflow"); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.target = attributes.target || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$getExtra]() { + if (!this[$extra]) { + const parent = this[$getParent](); + const root = this[$getTemplateRoot](); + const target = root[$searchNode](this.target, parent); + const leader = root[$searchNode](this.leader, parent); + const trailer = root[$searchNode](this.trailer, parent); + this[$extra] = { + target: target?.[0] || null, + leader: leader?.[0] || null, + trailer: trailer?.[0] || null, + addLeader: false, + addTrailer: false + }; + } + return this[$extra]; + } +} +class PageArea extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageArea", true); + this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]); + this.id = attributes.id || ""; + this.initialNumber = getInteger({ + data: attributes.initialNumber, + defaultValue: 1, + validate: x => true + }); + this.name = attributes.name || ""; + this.numbered = getInteger({ + data: attributes.numbered, + defaultValue: 1, + validate: x => true + }); + this.oddOrEven = getStringOption(attributes.oddOrEven, ["any", "even", "odd"]); + this.pagePosition = getStringOption(attributes.pagePosition, ["any", "first", "last", "only", "rest"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.desc = null; + this.extras = null; + this.medium = null; + this.occur = null; + this.area = new XFAObjectArray(); + this.contentArea = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + } + [$isUsable]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 0 + }; + return true; + } + return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; + } + [$cleanPage]() { + delete this[$extra]; + } + [$getNextPage]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 0 + }; + } + const parent = this[$getParent](); + if (parent.relation === "orderedOccurrence") { + if (this[$isUsable]()) { + this[$extra].numberOfUse += 1; + return this; + } + } + return parent[$getNextPage](); + } + [$getAvailableSpace]() { + return this[$extra].space || { + width: 0, + height: 0 + }; + } + [$toHTML]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 1 + }; + } + const children = []; + this[$extra].children = children; + const style = Object.create(null); + if (this.medium && this.medium.short && this.medium.long) { + style.width = measureToString(this.medium.short); + style.height = measureToString(this.medium.long); + this[$extra].space = { + width: this.medium.short, + height: this.medium.long + }; + if (this.medium.orientation === "landscape") { + const x = style.width; + style.width = style.height; + style.height = x; + this[$extra].space = { + width: this.medium.long, + height: this.medium.short + }; + } + } else { + warn("XFA - No medium specified in pageArea: please file a bug."); + } + this[$childrenToHTML]({ + filter: new Set(["area", "draw", "field", "subform"]), + include: true + }); + this[$childrenToHTML]({ + filter: new Set(["contentArea"]), + include: true + }); + return HTMLResult.success({ + name: "div", + children, + attributes: { + class: ["xfaPage"], + id: this[$uid], + style, + xfaName: this.name + } + }); + } +} +class PageSet extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageSet", true); + this.duplexImposition = getStringOption(attributes.duplexImposition, ["longEdge", "shortEdge"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = getStringOption(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.occur = null; + this.pageArea = new XFAObjectArray(); + this.pageSet = new XFAObjectArray(); + } + [$cleanPage]() { + for (const page of this.pageArea.children) { + page[$cleanPage](); + } + for (const page of this.pageSet.children) { + page[$cleanPage](); + } + } + [$isUsable]() { + return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; + } + [$getNextPage]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 1, + pageIndex: -1, + pageSetIndex: -1 + }; + } + if (this.relation === "orderedOccurrence") { + if (this[$extra].pageIndex + 1 < this.pageArea.children.length) { + this[$extra].pageIndex += 1; + const pageArea = this.pageArea.children[this[$extra].pageIndex]; + return pageArea[$getNextPage](); + } + if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) { + this[$extra].pageSetIndex += 1; + return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage](); + } + if (this[$isUsable]()) { + this[$extra].numberOfUse += 1; + this[$extra].pageIndex = -1; + this[$extra].pageSetIndex = -1; + return this[$getNextPage](); + } + const parent = this[$getParent](); + if (parent instanceof PageSet) { + return parent[$getNextPage](); + } + this[$cleanPage](); + return this[$getNextPage](); + } + const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber; + const parity = pageNumber % 2 === 0 ? "even" : "odd"; + const position = pageNumber === 0 ? "first" : "rest"; + let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position); + if (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position); + if (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any"); + if (page) { + return page; + } + return this.pageArea.children[0]; + } +} +class Para extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "para", true); + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.lineHeight = attributes.lineHeight ? getMeasurement(attributes.lineHeight, "0pt") : ""; + this.marginLeft = attributes.marginLeft ? getMeasurement(attributes.marginLeft, "0pt") : ""; + this.marginRight = attributes.marginRight ? getMeasurement(attributes.marginRight, "0pt") : ""; + this.orphans = getInteger({ + data: attributes.orphans, + defaultValue: 0, + validate: x => x >= 0 + }); + this.preserve = attributes.preserve || ""; + this.radixOffset = attributes.radixOffset ? getMeasurement(attributes.radixOffset, "0pt") : ""; + this.spaceAbove = attributes.spaceAbove ? getMeasurement(attributes.spaceAbove, "0pt") : ""; + this.spaceBelow = attributes.spaceBelow ? getMeasurement(attributes.spaceBelow, "0pt") : ""; + this.tabDefault = attributes.tabDefault ? getMeasurement(this.tabDefault) : ""; + this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? getMeasurement(x) : x); + this.textIndent = attributes.textIndent ? getMeasurement(attributes.textIndent, "0pt") : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vAlign = getStringOption(attributes.vAlign, ["top", "bottom", "middle"]); + this.widows = getInteger({ + data: attributes.widows, + defaultValue: 0, + validate: x => x >= 0 + }); + this.hyphenation = null; + } + [$toStyle]() { + const style = toStyle(this, "hAlign"); + if (this.marginLeft !== "") { + style.paddingLeft = measureToString(this.marginLeft); + } + if (this.marginRight !== "") { + style.paddingRight = measureToString(this.marginRight); + } + if (this.spaceAbove !== "") { + style.paddingTop = measureToString(this.spaceAbove); + } + if (this.spaceBelow !== "") { + style.paddingBottom = measureToString(this.spaceBelow); + } + if (this.textIndent !== "") { + style.textIndent = measureToString(this.textIndent); + fixTextIndent(style); + } + if (this.lineHeight > 0) { + style.lineHeight = measureToString(this.lineHeight); + } + if (this.tabDefault !== "") { + style.tabSize = measureToString(this.tabDefault); + } + if (this.tabStops.length > 0) {} + if (this.hyphenatation) { + Object.assign(style, this.hyphenatation[$toStyle]()); + } + return style; + } +} +class PasswordEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "passwordEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.passwordChar = attributes.passwordChar || "*"; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } +} +class template_Pattern extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pattern", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + const width = 5; + const cmd = "repeating-linear-gradient"; + const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`; + switch (this.type) { + case "crossHatch": + return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`; + case "crossDiagonal": + return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`; + case "diagonalLeft": + return `${cmd}(45deg,${colors})`; + case "diagonalRight": + return `${cmd}(-45deg,${colors})`; + case "horizontal": + return `${cmd}(to top,${colors})`; + case "vertical": + return `${cmd}(to right,${colors})`; + } + return ""; + } +} +class Picture extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "picture"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Proto extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "proto", true); + this.appearanceFilter = new XFAObjectArray(); + this.arc = new XFAObjectArray(); + this.area = new XFAObjectArray(); + this.assist = new XFAObjectArray(); + this.barcode = new XFAObjectArray(); + this.bindItems = new XFAObjectArray(); + this.bookend = new XFAObjectArray(); + this.boolean = new XFAObjectArray(); + this.border = new XFAObjectArray(); + this.break = new XFAObjectArray(); + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.button = new XFAObjectArray(); + this.calculate = new XFAObjectArray(); + this.caption = new XFAObjectArray(); + this.certificate = new XFAObjectArray(); + this.certificates = new XFAObjectArray(); + this.checkButton = new XFAObjectArray(); + this.choiceList = new XFAObjectArray(); + this.color = new XFAObjectArray(); + this.comb = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.contentArea = new XFAObjectArray(); + this.corner = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.dateTimeEdit = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.defaultUi = new XFAObjectArray(); + this.desc = new XFAObjectArray(); + this.digestMethod = new XFAObjectArray(); + this.digestMethods = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.edge = new XFAObjectArray(); + this.encoding = new XFAObjectArray(); + this.encodings = new XFAObjectArray(); + this.encrypt = new XFAObjectArray(); + this.encryptData = new XFAObjectArray(); + this.encryption = new XFAObjectArray(); + this.encryptionMethod = new XFAObjectArray(); + this.encryptionMethods = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.execute = new XFAObjectArray(); + this.extras = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.fill = new XFAObjectArray(); + this.filter = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.font = new XFAObjectArray(); + this.format = new XFAObjectArray(); + this.handler = new XFAObjectArray(); + this.hyphenation = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.imageEdit = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.issuers = new XFAObjectArray(); + this.items = new XFAObjectArray(); + this.keep = new XFAObjectArray(); + this.keyUsage = new XFAObjectArray(); + this.line = new XFAObjectArray(); + this.linear = new XFAObjectArray(); + this.lockDocument = new XFAObjectArray(); + this.manifest = new XFAObjectArray(); + this.margin = new XFAObjectArray(); + this.mdp = new XFAObjectArray(); + this.medium = new XFAObjectArray(); + this.message = new XFAObjectArray(); + this.numericEdit = new XFAObjectArray(); + this.occur = new XFAObjectArray(); + this.oid = new XFAObjectArray(); + this.oids = new XFAObjectArray(); + this.overflow = new XFAObjectArray(); + this.pageArea = new XFAObjectArray(); + this.pageSet = new XFAObjectArray(); + this.para = new XFAObjectArray(); + this.passwordEdit = new XFAObjectArray(); + this.pattern = new XFAObjectArray(); + this.picture = new XFAObjectArray(); + this.radial = new XFAObjectArray(); + this.reason = new XFAObjectArray(); + this.reasons = new XFAObjectArray(); + this.rectangle = new XFAObjectArray(); + this.ref = new XFAObjectArray(); + this.script = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + this.signData = new XFAObjectArray(); + this.signature = new XFAObjectArray(); + this.signing = new XFAObjectArray(); + this.solid = new XFAObjectArray(); + this.speak = new XFAObjectArray(); + this.stipple = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + this.subjectDN = new XFAObjectArray(); + this.subjectDNs = new XFAObjectArray(); + this.submit = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.textEdit = new XFAObjectArray(); + this.time = new XFAObjectArray(); + this.timeStamp = new XFAObjectArray(); + this.toolTip = new XFAObjectArray(); + this.traversal = new XFAObjectArray(); + this.traverse = new XFAObjectArray(); + this.ui = new XFAObjectArray(); + this.validate = new XFAObjectArray(); + this.value = new XFAObjectArray(); + this.variables = new XFAObjectArray(); + } +} +class Radial extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "radial", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["toEdge", "toCenter"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`; + return `radial-gradient(circle at center, ${colors})`; + } +} +class Reason extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "reason"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Reasons extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "reasons", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.reason = new XFAObjectArray(); + } +} +class Rectangle extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "rectangle", true); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.corner = new XFAObjectArray(4); + this.edge = new XFAObjectArray(4); + this.fill = null; + } + [$toHTML]() { + const edge = this.edge.children.length ? this.edge.children[0] : new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); + style.stroke = edgeStyle.color; + const corner = this.corner.children.length ? this.corner.children[0] : new Corner({}); + const cornerStyle = corner[$toStyle](); + const rect = { + name: "rect", + attributes: { + xmlns: SVG_NS, + width: "100%", + height: "100%", + x: 0, + y: 0, + rx: cornerStyle.radius, + ry: cornerStyle.radius, + style + } + }; + const svg = { + name: "svg", + children: [rect], + attributes: { + xmlns: SVG_NS, + style: { + overflow: "visible" + }, + width: "100%", + height: "100%" + } + }; + const parent = this[$getParent]()[$getParent](); + if (hasMargin(parent)) { + return HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); + } +} +class RefElement extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ref"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Script extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "script"); + this.binding = attributes.binding || ""; + this.contentType = attributes.contentType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SetProperty extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "setProperty"); + this.connection = attributes.connection || ""; + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; + } +} +class SignData extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signData", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, ["sign", "clear", "verify"]); + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.filter = null; + this.manifest = null; + } +} +class Signature extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signature", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["PDF1.3", "PDF1.6"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.filter = null; + this.manifest = null; + this.margin = null; + } +} +class Signing extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signing", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new XFAObjectArray(); + } +} +class Solid extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "solid", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [$toStyle](startColor) { + return startColor ? startColor[$toStyle]() : "#FFFFFF"; + } +} +class Speak extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "speak"); + this.disable = getInteger({ + data: attributes.disable, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.priority = getStringOption(attributes.priority, ["custom", "caption", "name", "toolTip"]); + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Stipple extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "stipple", true); + this.id = attributes.id || ""; + this.rate = getInteger({ + data: attributes.rate, + defaultValue: 50, + validate: x => x >= 0 && x <= 100 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [$toStyle](bgColor) { + const alpha = this.rate / 100; + return Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha)); + } +} +class Subform extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subform", true); + this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.allowMacro = getInteger({ + data: attributes.allowMacro, + defaultValue: 0, + validate: x => x === 1 + }); + this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = getInteger({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : getMeasurement(x)); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.mergeMode = getStringOption(attributes.mergeMode, ["consumeData", "matchTemplate"]); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = getRelevant(attributes.relevant); + this.restoreState = getStringOption(attributes.restoreState, ["manual", "auto"]); + this.scope = getStringOption(attributes.scope, ["name", "none"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.bookend = null; + this.border = null; + this.break = null; + this.calculate = null; + this.desc = null; + this.extras = null; + this.keep = null; + this.margin = null; + this.occur = null; + this.overflow = null; + this.pageSet = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.variables = null; + this.area = new XFAObjectArray(); + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.connect = new XFAObjectArray(); + this.draw = new XFAObjectArray(); + this.event = new XFAObjectArray(); + this.exObject = new XFAObjectArray(); + this.exclGroup = new XFAObjectArray(); + this.field = new XFAObjectArray(); + this.proto = new XFAObjectArray(); + this.setProperty = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + [$getSubformParent]() { + const parent = this[$getParent](); + if (parent instanceof SubformSet) { + return parent[$getSubformParent](); + } + return parent; + } + [$isBindable]() { + return true; + } + [$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$flushHTML]() { + return flushHTML(this); + } + [$addHTML](html, bbox) { + addHTML(this, html, bbox); + } + [$getAvailableSpace]() { + return getAvailableSpace(this); + } + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; + } + if (this[$extra]._isSplittable !== undefined) { + return this[$extra]._isSplittable; + } + if (this.layout === "position" || this.layout.includes("row")) { + this[$extra]._isSplittable = false; + return false; + } + if (this.keep && this.keep.intact !== "none") { + this[$extra]._isSplittable = false; + return false; + } + if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { + return false; + } + this[$extra]._isSplittable = true; + return true; + } + [$toHTML](availableSpace) { + setTabIndex(this); + if (this.break) { + if (this.break.after !== "auto" || this.break.afterTarget !== "") { + const node = new BreakAfter({ + targetType: this.break.after, + target: this.break.afterTarget, + startNew: this.break.startNew.toString() + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakAfter.push(node); + } + if (this.break.before !== "auto" || this.break.beforeTarget !== "") { + const node = new BreakBefore({ + targetType: this.break.before, + target: this.break.beforeTarget, + startNew: this.break.startNew.toString() + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakBefore.push(node); + } + if (this.break.overflowTarget !== "") { + const node = new Overflow({ + target: this.break.overflowTarget, + leader: this.break.overflowLeader, + trailer: this.break.overflowTrailer + }); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.overflow.push(node); + } + this[$removeChild](this.break); + this.break = null; + } + if (this.presence === "hidden" || this.presence === "inactive") { + return HTMLResult.EMPTY; + } + if (this.breakBefore.children.length > 1 || this.breakAfter.children.length > 1) { + warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug."); + } + if (this.breakBefore.children.length >= 1) { + const breakBefore = this.breakBefore.children[0]; + if (handleBreak(breakBefore)) { + return HTMLResult.breakNode(breakBefore); + } + } + if (this[$extra]?.afterBreakAfter) { + return HTMLResult.EMPTY; + } + fixDimensions(this); + const children = []; + const attributes = { + id: this[$uid], + class: [] + }; + setAccess(this, attributes.class); + if (!this[$extra]) { + this[$extra] = Object.create(null); + } + Object.assign(this[$extra], { + children, + line: null, + attributes, + attempt: 0, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const root = this[$getTemplateRoot](); + const savedNoLayoutFailure = root[$extra].noLayoutFailure; + const isSplittable = this[$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!checkDimensions(this, availableSpace)) { + return HTMLResult.FAILURE; + } + const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]); + if (this.layout.includes("row")) { + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; + } + } + const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); + const classNames = ["xfaSubform"]; + const cl = layoutClass(this); + if (cl) { + classNames.push(cl); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } + if (this.overflow) { + const overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addLeader) { + overflowExtra.addLeader = false; + handleOverflow(this, overflowExtra.leader, availableSpace); + } + } + this[$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { + if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[$extra].numberInLine = 0; + } + const result = this[$childrenToHTML]({ + filter, + include: true + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[$popPara](); + return result; + } + if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !root[$extra].noLayoutFailure) { + this[$extra].attempt = maxRun; + break; + } + } + this[$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + root[$extra].noLayoutFailure = savedNoLayoutFailure; + if (this[$extra].attempt === maxRun) { + if (this.overflow) { + this[$getTemplateRoot]()[$extra].overflowNode = this.overflow; + } + if (!isSplittable) { + delete this[$extra]; + } + return HTMLResult.FAILURE; + } + if (this.overflow) { + const overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addTrailer) { + overflowExtra.addTrailer = false; + handleOverflow(this, overflowExtra.trailer, availableSpace); + } + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[$extra].width + marginH, this.w || 0); + const height = Math.max(this[$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = measureToString(width); + } + if (this.h === "") { + style.height = measureToString(height); + } + if ((style.width === "0px" || style.height === "0px") && children.length === 0) { + return HTMLResult.EMPTY; + } + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + const result = HTMLResult.success(createWrapper(this, html), bbox); + if (this.breakAfter.children.length >= 1) { + const breakAfter = this.breakAfter.children[0]; + if (handleBreak(breakAfter)) { + this[$extra].afterBreakAfter = result; + return HTMLResult.breakNode(breakAfter); + } + } + delete this[$extra]; + return result; + } +} +class SubformSet extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subformSet", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = getStringOption(attributes.relation, ["ordered", "choice", "unordered"]); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.bookend = null; + this.break = null; + this.desc = null; + this.extras = null; + this.occur = null; + this.overflow = null; + this.breakAfter = new XFAObjectArray(); + this.breakBefore = new XFAObjectArray(); + this.subform = new XFAObjectArray(); + this.subformSet = new XFAObjectArray(); + } + *[$getContainedChildren]() { + yield* getContainedChildren(this); + } + [$getSubformParent]() { + let parent = this[$getParent](); + while (!(parent instanceof Subform)) { + parent = parent[$getParent](); + } + return parent; + } + [$isBindable]() { + return true; + } +} +class SubjectDN extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDN"); + this.delimiter = attributes.delimiter || ","; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + this[$content] = new Map(this[$content].split(this.delimiter).map(kv => { + kv = kv.split("=", 2); + kv[0] = kv[0].trim(); + return kv; + })); + } +} +class SubjectDNs extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDNs", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.subjectDN = new XFAObjectArray(); + } +} +class Submit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "submit", true); + this.embedPDF = getInteger({ + data: attributes.embedPDF, + defaultValue: 0, + validate: x => x === 1 + }); + this.format = getStringOption(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]); + this.id = attributes.id || ""; + this.target = attributes.target || ""; + this.textEncoding = getKeyword({ + data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.xdpContent = attributes.xdpContent || ""; + this.encrypt = null; + this.encryptData = new XFAObjectArray(); + this.signData = new XFAObjectArray(); + } +} +class Template extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "template", true); + this.baseProfile = getStringOption(attributes.baseProfile, ["full", "interactiveForms"]); + this.extras = null; + this.subform = new XFAObjectArray(); + } + [$finalize]() { + if (this.subform.children.length === 0) { + warn("XFA - No subforms in template node."); + } + if (this.subform.children.length >= 2) { + warn("XFA - Several subforms in template node: please file a bug."); + } + this[$tabIndex] = DEFAULT_TAB_INDEX; + } + [$isSplittable]() { + return true; + } + [$searchNode](expr, container) { + if (expr.startsWith("#")) { + return [this[$ids].get(expr.slice(1))]; + } + return searchNode(this, container, expr, true, true); + } + *[$toPages]() { + if (!this.subform.children.length) { + return HTMLResult.success({ + name: "div", + children: [] + }); + } + this[$extra] = { + overflowNode: null, + firstUnsplittable: null, + currentContentArea: null, + currentPageArea: null, + noLayoutFailure: false, + pageNumber: 1, + pagePosition: "first", + oddOrEven: "odd", + blankOrNotBlank: "nonBlank", + paraStack: [] + }; + const root = this.subform.children[0]; + root.pageSet[$cleanPage](); + const pageAreas = root.pageSet.pageArea.children; + const mainHtml = { + name: "div", + children: [] + }; + let pageArea = null; + let breakBefore = null; + let breakBeforeTarget = null; + if (root.breakBefore.children.length >= 1) { + breakBefore = root.breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) { + breakBefore = root.subform.children[0].breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.break?.beforeTarget) { + breakBefore = root.break; + breakBeforeTarget = breakBefore.beforeTarget; + } else if (root.subform.children.length >= 1 && root.subform.children[0].break?.beforeTarget) { + breakBefore = root.subform.children[0].break; + breakBeforeTarget = breakBefore.beforeTarget; + } + if (breakBefore) { + const target = this[$searchNode](breakBeforeTarget, breakBefore[$getParent]()); + if (target instanceof PageArea) { + pageArea = target; + breakBefore[$extra] = {}; + } + } + if (!pageArea) { + pageArea = pageAreas[0]; + } + pageArea[$extra] = { + numberOfUse: 1 + }; + const pageAreaParent = pageArea[$getParent](); + pageAreaParent[$extra] = { + numberOfUse: 1, + pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea), + pageSetIndex: 0 + }; + let targetPageArea; + let leader = null; + let trailer = null; + let hasSomething = true; + let hasSomethingCounter = 0; + let startIndex = 0; + while (true) { + if (!hasSomething) { + mainHtml.children.pop(); + if (++hasSomethingCounter === MAX_EMPTY_PAGES) { + warn("XFA - Something goes wrong: please file a bug."); + return mainHtml; + } + } else { + hasSomethingCounter = 0; + } + targetPageArea = null; + this[$extra].currentPageArea = pageArea; + const page = pageArea[$toHTML]().html; + mainHtml.children.push(page); + if (leader) { + this[$extra].noLayoutFailure = true; + page.children.push(leader[$toHTML](pageArea[$extra].space).html); + leader = null; + } + if (trailer) { + this[$extra].noLayoutFailure = true; + page.children.push(trailer[$toHTML](pageArea[$extra].space).html); + trailer = null; + } + const contentAreas = pageArea.contentArea.children; + const htmlContentAreas = page.children.filter(node => node.attributes.class.includes("xfaContentarea")); + hasSomething = false; + this[$extra].firstUnsplittable = null; + this[$extra].noLayoutFailure = false; + const flush = index => { + const html = root[$flushHTML](); + if (html) { + hasSomething ||= html.children?.length > 0; + htmlContentAreas[index].children.push(html); + } + }; + for (let i = startIndex, ii = contentAreas.length; i < ii; i++) { + const contentArea = this[$extra].currentContentArea = contentAreas[i]; + const space = { + width: contentArea.w, + height: contentArea.h + }; + startIndex = 0; + if (leader) { + htmlContentAreas[i].children.push(leader[$toHTML](space).html); + leader = null; + } + if (trailer) { + htmlContentAreas[i].children.push(trailer[$toHTML](space).html); + trailer = null; + } + const html = root[$toHTML](space); + if (html.success) { + if (html.html) { + hasSomething ||= html.html.children?.length > 0; + htmlContentAreas[i].children.push(html.html); + } else if (!hasSomething && mainHtml.children.length > 1) { + mainHtml.children.pop(); + } + return mainHtml; + } + if (html.isBreak()) { + const node = html.breakNode; + flush(i); + if (node.targetType === "auto") { + continue; + } + if (node.leader) { + leader = this[$searchNode](node.leader, node[$getParent]()); + leader = leader ? leader[0] : null; + } + if (node.trailer) { + trailer = this[$searchNode](node.trailer, node[$getParent]()); + trailer = trailer ? trailer[0] : null; + } + if (node.targetType === "pageArea") { + targetPageArea = node[$extra].target; + i = Infinity; + } else if (!node[$extra].target) { + i = node[$extra].index; + } else { + targetPageArea = node[$extra].target; + startIndex = node[$extra].index + 1; + i = Infinity; + } + continue; + } + if (this[$extra].overflowNode) { + const node = this[$extra].overflowNode; + this[$extra].overflowNode = null; + const overflowExtra = node[$getExtra](); + const target = overflowExtra.target; + overflowExtra.addLeader = overflowExtra.leader !== null; + overflowExtra.addTrailer = overflowExtra.trailer !== null; + flush(i); + const currentIndex = i; + i = Infinity; + if (target instanceof PageArea) { + targetPageArea = target; + } else if (target instanceof ContentArea) { + const index = contentAreas.indexOf(target); + if (index !== -1) { + if (index > currentIndex) { + i = index - 1; + } else { + startIndex = index; + } + } else { + targetPageArea = target[$getParent](); + startIndex = targetPageArea.contentArea.children.indexOf(target); + } + } + continue; + } + flush(i); + } + this[$extra].pageNumber += 1; + if (targetPageArea) { + if (targetPageArea[$isUsable]()) { + targetPageArea[$extra].numberOfUse += 1; + } else { + targetPageArea = null; + } + } + pageArea = targetPageArea || pageArea[$getNextPage](); + yield null; + } + } +} +class Text extends ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "text"); + this.id = attributes.id || ""; + this.maxChars = getInteger({ + data: attributes.maxChars, + defaultValue: 0, + validate: x => x >= 0 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$acceptWhitespace]() { + return true; + } + [$onChild](child) { + if (child[$namespaceId] === NamespaceIds.xhtml.id) { + this[$content] = child; + return true; + } + warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`); + return false; + } + [$onText](str) { + if (this[$content] instanceof XFAObject) { + return; + } + super[$onText](str); + } + [$finalize]() { + if (typeof this[$content] === "string") { + this[$content] = this[$content].replaceAll("\r\n", "\n"); + } + } + [$getExtra]() { + if (typeof this[$content] === "string") { + return this[$content].split(/[\u2029\u2028\n]/).reduce((acc, line) => { + if (line) { + acc.push(line); + } + return acc; + }, []).join("\n"); + } + return this[$content][$text](); + } + [$toHTML](availableSpace) { + if (typeof this[$content] === "string") { + const html = valueToHtml(this[$content]).html; + if (this[$content].includes("\u2029")) { + html.name = "div"; + html.children = []; + this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).reduce((acc, line) => { + acc.push({ + name: "span", + value: line + }, { + name: "br" + }); + return acc; + }, [])).forEach(lines => { + html.children.push({ + name: "p", + children: lines + }); + }); + } else if (/[\u2028\n]/.test(this[$content])) { + html.name = "div"; + html.children = []; + this[$content].split(/[\u2028\n]/).forEach(line => { + html.children.push({ + name: "span", + value: line + }, { + name: "br" + }); + }); + } + return HTMLResult.success(html); + } + return this[$content][$toHTML](availableSpace); + } +} +class TextEdit extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "textEdit", true); + this.allowRichText = getInteger({ + data: attributes.allowRichText, + defaultValue: 0, + validate: x => x === 1 + }); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.multiLine = getInteger({ + data: attributes.multiLine, + defaultValue: "", + validate: x => x === 0 || x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, ["auto", "off", "on"]); + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + let html; + const field = this[$getParent]()[$getParent](); + if (this.multiLine === "") { + this.multiLine = field instanceof Draw ? 1 : 0; + } + if (this.multiLine === 1) { + html = { + name: "textarea", + attributes: { + dataId: field[$data]?.[$uid] || field[$uid], + fieldId: field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + } else { + html = { + name: "input", + attributes: { + type: "text", + dataId: field[$data]?.[$uid] || field[$uid], + fieldId: field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + } + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Time extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "time"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; + } + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); + } +} +class TimeStamp extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "timeStamp"); + this.id = attributes.id || ""; + this.server = attributes.server || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class ToolTip extends StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "toolTip"); + this.id = attributes.id || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Traversal extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "traversal", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.traverse = new XFAObjectArray(); + } +} +class Traverse extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "traverse", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]); + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.script = null; + } + get name() { + return this.operation; + } + [$isTransparent]() { + return false; + } +} +class Ui extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ui", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.picture = null; + this.barcode = null; + this.button = null; + this.checkButton = null; + this.choiceList = null; + this.dateTimeEdit = null; + this.defaultUi = null; + this.imageEdit = null; + this.numericEdit = null; + this.passwordEdit = null; + this.signature = null; + this.textEdit = null; + } + [$getExtra]() { + if (this[$extra] === undefined) { + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "picture") { + continue; + } + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + this[$extra] = obj; + return obj; + } + this[$extra] = null; + } + return this[$extra]; + } + [$toHTML](availableSpace) { + const obj = this[$getExtra](); + if (obj) { + return obj[$toHTML](availableSpace); + } + return HTMLResult.EMPTY; + } +} +class Validate extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "validate", true); + this.formatTest = getStringOption(attributes.formatTest, ["warning", "disabled", "error"]); + this.id = attributes.id || ""; + this.nullTest = getStringOption(attributes.nullTest, ["disabled", "error", "warning"]); + this.scriptTest = getStringOption(attributes.scriptTest, ["error", "disabled", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.picture = null; + this.script = null; + } +} +class Value extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "value", true); + this.id = attributes.id || ""; + this.override = getInteger({ + data: attributes.override, + defaultValue: 0, + validate: x => x === 1 + }); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.arc = null; + this.boolean = null; + this.date = null; + this.dateTime = null; + this.decimal = null; + this.exData = null; + this.float = null; + this.image = null; + this.integer = null; + this.line = null; + this.rectangle = null; + this.text = null; + this.time = null; + } + [$setValue](value) { + const parent = this[$getParent](); + if (parent instanceof Field) { + if (parent.ui?.imageEdit) { + if (!this.image) { + this.image = new Image({}); + this[$appendChild](this.image); + } + this.image[$content] = value[$content]; + return; + } + } + const valueName = value[$nodeName]; + if (this[valueName] !== null) { + this[valueName][$content] = value[$content]; + return; + } + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (obj instanceof XFAObject) { + this[name] = null; + this[$removeChild](obj); + } + } + this[value[$nodeName]] = value; + this[$appendChild](value); + } + [$text]() { + if (this.exData) { + if (typeof this.exData[$content] === "string") { + return this.exData[$content].trim(); + } + return this.exData[$content][$text]().trim(); + } + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "image") { + continue; + } + const obj = this[name]; + if (obj instanceof XFAObject) { + return (obj[$content] || "").toString().trim(); + } + } + return null; + } + [$toHTML](availableSpace) { + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + return obj[$toHTML](availableSpace); + } + return HTMLResult.EMPTY; + } +} +class Variables extends XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "variables", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new XFAObjectArray(); + this.date = new XFAObjectArray(); + this.dateTime = new XFAObjectArray(); + this.decimal = new XFAObjectArray(); + this.exData = new XFAObjectArray(); + this.float = new XFAObjectArray(); + this.image = new XFAObjectArray(); + this.integer = new XFAObjectArray(); + this.manifest = new XFAObjectArray(); + this.script = new XFAObjectArray(); + this.text = new XFAObjectArray(); + this.time = new XFAObjectArray(); + } + [$isTransparent]() { + return true; + } +} +class TemplateNamespace { + static [$buildXFAObject](name, attributes) { + if (TemplateNamespace.hasOwnProperty(name)) { + const node = TemplateNamespace[name](attributes); + node[$setSetAttributes](attributes); + return node; + } + return undefined; + } + static appearanceFilter(attrs) { + return new AppearanceFilter(attrs); + } + static arc(attrs) { + return new Arc(attrs); + } + static area(attrs) { + return new Area(attrs); + } + static assist(attrs) { + return new Assist(attrs); + } + static barcode(attrs) { + return new Barcode(attrs); + } + static bind(attrs) { + return new Bind(attrs); + } + static bindItems(attrs) { + return new BindItems(attrs); + } + static bookend(attrs) { + return new Bookend(attrs); + } + static boolean(attrs) { + return new BooleanElement(attrs); + } + static border(attrs) { + return new Border(attrs); + } + static break(attrs) { + return new Break(attrs); + } + static breakAfter(attrs) { + return new BreakAfter(attrs); + } + static breakBefore(attrs) { + return new BreakBefore(attrs); + } + static button(attrs) { + return new Button(attrs); + } + static calculate(attrs) { + return new Calculate(attrs); + } + static caption(attrs) { + return new Caption(attrs); + } + static certificate(attrs) { + return new Certificate(attrs); + } + static certificates(attrs) { + return new Certificates(attrs); + } + static checkButton(attrs) { + return new CheckButton(attrs); + } + static choiceList(attrs) { + return new ChoiceList(attrs); + } + static color(attrs) { + return new Color(attrs); + } + static comb(attrs) { + return new Comb(attrs); + } + static connect(attrs) { + return new Connect(attrs); + } + static contentArea(attrs) { + return new ContentArea(attrs); + } + static corner(attrs) { + return new Corner(attrs); + } + static date(attrs) { + return new DateElement(attrs); + } + static dateTime(attrs) { + return new DateTime(attrs); + } + static dateTimeEdit(attrs) { + return new DateTimeEdit(attrs); + } + static decimal(attrs) { + return new Decimal(attrs); + } + static defaultUi(attrs) { + return new DefaultUi(attrs); + } + static desc(attrs) { + return new Desc(attrs); + } + static digestMethod(attrs) { + return new DigestMethod(attrs); + } + static digestMethods(attrs) { + return new DigestMethods(attrs); + } + static draw(attrs) { + return new Draw(attrs); + } + static edge(attrs) { + return new Edge(attrs); + } + static encoding(attrs) { + return new Encoding(attrs); + } + static encodings(attrs) { + return new Encodings(attrs); + } + static encrypt(attrs) { + return new Encrypt(attrs); + } + static encryptData(attrs) { + return new EncryptData(attrs); + } + static encryption(attrs) { + return new Encryption(attrs); + } + static encryptionMethod(attrs) { + return new EncryptionMethod(attrs); + } + static encryptionMethods(attrs) { + return new EncryptionMethods(attrs); + } + static event(attrs) { + return new Event(attrs); + } + static exData(attrs) { + return new ExData(attrs); + } + static exObject(attrs) { + return new ExObject(attrs); + } + static exclGroup(attrs) { + return new ExclGroup(attrs); + } + static execute(attrs) { + return new Execute(attrs); + } + static extras(attrs) { + return new Extras(attrs); + } + static field(attrs) { + return new Field(attrs); + } + static fill(attrs) { + return new Fill(attrs); + } + static filter(attrs) { + return new Filter(attrs); + } + static float(attrs) { + return new Float(attrs); + } + static font(attrs) { + return new template_Font(attrs); + } + static format(attrs) { + return new Format(attrs); + } + static handler(attrs) { + return new Handler(attrs); + } + static hyphenation(attrs) { + return new Hyphenation(attrs); + } + static image(attrs) { + return new Image(attrs); + } + static imageEdit(attrs) { + return new ImageEdit(attrs); + } + static integer(attrs) { + return new Integer(attrs); + } + static issuers(attrs) { + return new Issuers(attrs); + } + static items(attrs) { + return new Items(attrs); + } + static keep(attrs) { + return new Keep(attrs); + } + static keyUsage(attrs) { + return new KeyUsage(attrs); + } + static line(attrs) { + return new Line(attrs); + } + static linear(attrs) { + return new Linear(attrs); + } + static lockDocument(attrs) { + return new LockDocument(attrs); + } + static manifest(attrs) { + return new Manifest(attrs); + } + static margin(attrs) { + return new Margin(attrs); + } + static mdp(attrs) { + return new Mdp(attrs); + } + static medium(attrs) { + return new Medium(attrs); + } + static message(attrs) { + return new Message(attrs); + } + static numericEdit(attrs) { + return new NumericEdit(attrs); + } + static occur(attrs) { + return new Occur(attrs); + } + static oid(attrs) { + return new Oid(attrs); + } + static oids(attrs) { + return new Oids(attrs); + } + static overflow(attrs) { + return new Overflow(attrs); + } + static pageArea(attrs) { + return new PageArea(attrs); + } + static pageSet(attrs) { + return new PageSet(attrs); + } + static para(attrs) { + return new Para(attrs); + } + static passwordEdit(attrs) { + return new PasswordEdit(attrs); + } + static pattern(attrs) { + return new template_Pattern(attrs); + } + static picture(attrs) { + return new Picture(attrs); + } + static proto(attrs) { + return new Proto(attrs); + } + static radial(attrs) { + return new Radial(attrs); + } + static reason(attrs) { + return new Reason(attrs); + } + static reasons(attrs) { + return new Reasons(attrs); + } + static rectangle(attrs) { + return new Rectangle(attrs); + } + static ref(attrs) { + return new RefElement(attrs); + } + static script(attrs) { + return new Script(attrs); + } + static setProperty(attrs) { + return new SetProperty(attrs); + } + static signData(attrs) { + return new SignData(attrs); + } + static signature(attrs) { + return new Signature(attrs); + } + static signing(attrs) { + return new Signing(attrs); + } + static solid(attrs) { + return new Solid(attrs); + } + static speak(attrs) { + return new Speak(attrs); + } + static stipple(attrs) { + return new Stipple(attrs); + } + static subform(attrs) { + return new Subform(attrs); + } + static subformSet(attrs) { + return new SubformSet(attrs); + } + static subjectDN(attrs) { + return new SubjectDN(attrs); + } + static subjectDNs(attrs) { + return new SubjectDNs(attrs); + } + static submit(attrs) { + return new Submit(attrs); + } + static template(attrs) { + return new Template(attrs); + } + static text(attrs) { + return new Text(attrs); + } + static textEdit(attrs) { + return new TextEdit(attrs); + } + static time(attrs) { + return new Time(attrs); + } + static timeStamp(attrs) { + return new TimeStamp(attrs); + } + static toolTip(attrs) { + return new ToolTip(attrs); + } + static traversal(attrs) { + return new Traversal(attrs); + } + static traverse(attrs) { + return new Traverse(attrs); + } + static ui(attrs) { + return new Ui(attrs); + } + static validate(attrs) { + return new Validate(attrs); + } + static value(attrs) { + return new Value(attrs); + } + static variables(attrs) { + return new Variables(attrs); + } +} + +;// ./src/core/xfa/bind.js + + + + + + +const bind_NS_DATASETS = NamespaceIds.datasets.id; +function createText(content) { + const node = new Text({}); + node[$content] = content; + return node; +} +class Binder { + constructor(root) { + this.root = root; + this.datasets = root.datasets; + this.data = root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, "data"); + this.emptyMerge = this.data[$getChildren]().length === 0; + this.root.form = this.form = root.template[$clone](); + } + _isConsumeData() { + return !this.emptyMerge && this._mergeMode; + } + _isMatchTemplate() { + return !this._isConsumeData(); + } + bind() { + this._bindElement(this.form, this.data); + return this.form; + } + getData() { + return this.data; + } + _bindValue(formNode, data, picture) { + formNode[$data] = data; + if (formNode[$hasSettableValue]()) { + if (data[$isDataValue]()) { + const value = data[$getDataValue](); + formNode[$setValue](createText(value)); + } else if (formNode instanceof Field && formNode.ui?.choiceList?.open === "multiSelect") { + const value = data[$getChildren]().map(child => child[$content].trim()).join("\n"); + formNode[$setValue](createText(value)); + } else if (this._isConsumeData()) { + warn(`XFA - Nodes haven't the same type.`); + } + } else if (!data[$isDataValue]() || this._isMatchTemplate()) { + this._bindElement(formNode, data); + } else { + warn(`XFA - Nodes haven't the same type.`); + } + } + _findDataByNameToConsume(name, isValue, dataNode, global) { + if (!name) { + return null; + } + let generator, match; + for (let i = 0; i < 3; i++) { + generator = dataNode[$getRealChildrenByNameIt](name, false, true); + while (true) { + match = generator.next().value; + if (!match) { + break; + } + if (isValue === match[$isDataValue]()) { + return match; + } + } + if (dataNode[$namespaceId] === NamespaceIds.datasets.id && dataNode[$nodeName] === "data") { + break; + } + dataNode = dataNode[$getParent](); + } + if (!global) { + return null; + } + generator = this.data[$getRealChildrenByNameIt](name, true, false); + match = generator.next().value; + if (match) { + return match; + } + generator = this.data[$getAttributeIt](name, true); + match = generator.next().value; + if (match?.[$isDataValue]()) { + return match; + } + return null; + } + _setProperties(formNode, dataNode) { + if (!formNode.hasOwnProperty("setProperty")) { + return; + } + for (const { + ref, + target, + connection + } of formNode.setProperty.children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = searchNode(this.root, dataNode, ref, false, false); + if (!nodes) { + warn(`XFA - Invalid reference: ${ref}.`); + continue; + } + const [node] = nodes; + if (!node[$isDescendent](this.data)) { + warn(`XFA - Invalid node: must be a data node.`); + continue; + } + const targetNodes = searchNode(this.root, formNode, target, false, false); + if (!targetNodes) { + warn(`XFA - Invalid target: ${target}.`); + continue; + } + const [targetNode] = targetNodes; + if (!targetNode[$isDescendent](formNode)) { + warn(`XFA - Invalid target: must be a property or subproperty.`); + continue; + } + const targetParent = targetNode[$getParent](); + if (targetNode instanceof SetProperty || targetParent instanceof SetProperty) { + warn(`XFA - Invalid target: cannot be a setProperty or one of its properties.`); + continue; + } + if (targetNode instanceof BindItems || targetParent instanceof BindItems) { + warn(`XFA - Invalid target: cannot be a bindItems or one of its properties.`); + continue; + } + const content = node[$text](); + const name = targetNode[$nodeName]; + if (targetNode instanceof XFAAttribute) { + const attrs = Object.create(null); + attrs[name] = content; + const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]); + targetParent[name] = obj[name]; + continue; + } + if (!targetNode.hasOwnProperty($content)) { + warn(`XFA - Invalid node to use in setProperty`); + continue; + } + targetNode[$data] = node; + targetNode[$content] = content; + targetNode[$finalize](); + } + } + _bindItems(formNode, dataNode) { + if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || formNode.bindItems.isEmpty()) { + return; + } + for (const item of formNode.items.children) { + formNode[$removeChild](item); + } + formNode.items.clear(); + const labels = new Items({}); + const values = new Items({}); + formNode[$appendChild](labels); + formNode.items.push(labels); + formNode[$appendChild](values); + formNode.items.push(values); + for (const { + ref, + labelRef, + valueRef, + connection + } of formNode.bindItems.children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = searchNode(this.root, dataNode, ref, false, false); + if (!nodes) { + warn(`XFA - Invalid reference: ${ref}.`); + continue; + } + for (const node of nodes) { + if (!node[$isDescendent](this.datasets)) { + warn(`XFA - Invalid ref (${ref}): must be a datasets child.`); + continue; + } + const labelNodes = searchNode(this.root, node, labelRef, true, false); + if (!labelNodes) { + warn(`XFA - Invalid label: ${labelRef}.`); + continue; + } + const [labelNode] = labelNodes; + if (!labelNode[$isDescendent](this.datasets)) { + warn(`XFA - Invalid label: must be a datasets child.`); + continue; + } + const valueNodes = searchNode(this.root, node, valueRef, true, false); + if (!valueNodes) { + warn(`XFA - Invalid value: ${valueRef}.`); + continue; + } + const [valueNode] = valueNodes; + if (!valueNode[$isDescendent](this.datasets)) { + warn(`XFA - Invalid value: must be a datasets child.`); + continue; + } + const label = createText(labelNode[$text]()); + const value = createText(valueNode[$text]()); + labels[$appendChild](label); + labels.text.push(label); + values[$appendChild](value); + values.text.push(value); + } + } + } + _bindOccurrences(formNode, matches, picture) { + let baseClone; + if (matches.length > 1) { + baseClone = formNode[$clone](); + baseClone[$removeChild](baseClone.occur); + baseClone.occur = null; + } + this._bindValue(formNode, matches[0], picture); + this._setProperties(formNode, matches[0]); + this._bindItems(formNode, matches[0]); + if (matches.length === 1) { + return; + } + const parent = formNode[$getParent](); + const name = formNode[$nodeName]; + const pos = parent[$indexOf](formNode); + for (let i = 1, ii = matches.length; i < ii; i++) { + const match = matches[i]; + const clone = baseClone[$clone](); + parent[name].push(clone); + parent[$insertAt](pos + i, clone); + this._bindValue(clone, match, picture); + this._setProperties(clone, match); + this._bindItems(clone, match); + } + } + _createOccurrences(formNode) { + if (!this.emptyMerge) { + return; + } + const { + occur + } = formNode; + if (!occur || occur.initial <= 1) { + return; + } + const parent = formNode[$getParent](); + const name = formNode[$nodeName]; + if (!(parent[name] instanceof XFAObjectArray)) { + return; + } + let currentNumber; + if (formNode.name) { + currentNumber = parent[name].children.filter(e => e.name === formNode.name).length; + } else { + currentNumber = parent[name].children.length; + } + const pos = parent[$indexOf](formNode) + 1; + const ii = occur.initial - currentNumber; + if (ii) { + const nodeClone = formNode[$clone](); + nodeClone[$removeChild](nodeClone.occur); + nodeClone.occur = null; + parent[name].push(nodeClone); + parent[$insertAt](pos, nodeClone); + for (let i = 1; i < ii; i++) { + const clone = nodeClone[$clone](); + parent[name].push(clone); + parent[$insertAt](pos + i, clone); + } + } + } + _getOccurInfo(formNode) { + const { + name, + occur + } = formNode; + if (!occur || !name) { + return [1, 1]; + } + const max = occur.max === -1 ? Infinity : occur.max; + return [occur.min, max]; + } + _setAndBind(formNode, dataNode) { + this._setProperties(formNode, dataNode); + this._bindItems(formNode, dataNode); + this._bindElement(formNode, dataNode); + } + _bindElement(formNode, dataNode) { + const uselessNodes = []; + this._createOccurrences(formNode); + for (const child of formNode[$getChildren]()) { + if (child[$data]) { + continue; + } + if (this._mergeMode === undefined && child[$nodeName] === "subform") { + this._mergeMode = child.mergeMode === "consumeData"; + const dataChildren = dataNode[$getChildren](); + if (dataChildren.length > 0) { + this._bindOccurrences(child, [dataChildren[0]], null); + } else if (this.emptyMerge) { + const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; + const dataChild = child[$data] = new XmlObject(nsId, child.name || "root"); + dataNode[$appendChild](dataChild); + this._bindElement(child, dataChild); + } + continue; + } + if (!child[$isBindable]()) { + continue; + } + let global = false; + let picture = null; + let ref = null; + let match = null; + if (child.bind) { + switch (child.bind.match) { + case "none": + this._setAndBind(child, dataNode); + continue; + case "global": + global = true; + break; + case "dataRef": + if (!child.bind.ref) { + warn(`XFA - ref is empty in node ${child[$nodeName]}.`); + this._setAndBind(child, dataNode); + continue; + } + ref = child.bind.ref; + break; + default: + break; + } + if (child.bind.picture) { + picture = child.bind.picture[$content]; + } + } + const [min, max] = this._getOccurInfo(child); + if (ref) { + match = searchNode(this.root, dataNode, ref, true, false); + if (match === null) { + match = createDataNode(this.data, dataNode, ref); + if (!match) { + continue; + } + if (this._isConsumeData()) { + match[$consumed] = true; + } + this._setAndBind(child, match); + continue; + } else { + if (this._isConsumeData()) { + match = match.filter(node => !node[$consumed]); + } + if (match.length > max) { + match = match.slice(0, max); + } else if (match.length === 0) { + match = null; + } + if (match && this._isConsumeData()) { + match.forEach(node => { + node[$consumed] = true; + }); + } + } + } else { + if (!child.name) { + this._setAndBind(child, dataNode); + continue; + } + if (this._isConsumeData()) { + const matches = []; + while (matches.length < max) { + const found = this._findDataByNameToConsume(child.name, child[$hasSettableValue](), dataNode, global); + if (!found) { + break; + } + found[$consumed] = true; + matches.push(found); + } + match = matches.length > 0 ? matches : null; + } else { + match = dataNode[$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value; + if (!match) { + if (min === 0) { + uselessNodes.push(child); + continue; + } + const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; + match = child[$data] = new XmlObject(nsId, child.name); + if (this.emptyMerge) { + match[$consumed] = true; + } + dataNode[$appendChild](match); + this._setAndBind(child, match); + continue; + } + if (this.emptyMerge) { + match[$consumed] = true; + } + match = [match]; + } + } + if (match) { + this._bindOccurrences(child, match, picture); + } else if (min > 0) { + this._setAndBind(child, dataNode); + } else { + uselessNodes.push(child); + } + } + uselessNodes.forEach(node => node[$getParent]()[$removeChild](node)); + } +} + +;// ./src/core/xfa/data.js + +class DataHandler { + constructor(root, data) { + this.data = data; + this.dataset = root.datasets || null; + } + serialize(storage) { + const stack = [[-1, this.data[$getChildren]()]]; + while (stack.length > 0) { + const last = stack.at(-1); + const [i, children] = last; + if (i + 1 === children.length) { + stack.pop(); + continue; + } + const child = children[++last[0]]; + const storageEntry = storage.get(child[$uid]); + if (storageEntry) { + child[$setValue](storageEntry); + } else { + const attributes = child[$getAttributes](); + for (const value of attributes.values()) { + const entry = storage.get(value[$uid]); + if (entry) { + value[$setValue](entry); + break; + } + } + } + const nodes = child[$getChildren](); + if (nodes.length > 0) { + stack.push([-1, nodes]); + } + } + const buf = [``]; + if (this.dataset) { + for (const child of this.dataset[$getChildren]()) { + if (child[$nodeName] !== "data") { + child[$toString](buf); + } + } + } + this.data[$toString](buf); + buf.push(""); + return buf.join(""); + } +} + +;// ./src/core/xfa/config.js + + + + + +const CONFIG_NS_ID = NamespaceIds.config.id; +class Acrobat extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat", true); + this.acrobat7 = null; + this.autoSave = null; + this.common = null; + this.validate = null; + this.validateApprovalSignatures = null; + this.submitUrl = new XFAObjectArray(); + } +} +class Acrobat7 extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat7", true); + this.dynamicRender = null; + } +} +class ADBE_JSConsole extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); + } +} +class ADBE_JSDebugger extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); + } +} +class AddSilentPrint extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addSilentPrint"); + } +} +class AddViewerPreferences extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addViewerPreferences"); + } +} +class AdjustData extends Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "adjustData"); + } +} +class AdobeExtensionLevel extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8); + } +} +class Agent extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "agent", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.common = new XFAObjectArray(); + } +} +class AlwaysEmbed extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "alwaysEmbed"); + } +} +class Amd extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "amd"); + } +} +class config_Area extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "area"); + this.level = getInteger({ + data: attributes.level, + defaultValue: 0, + validate: n => n >= 1 && n <= 3 + }); + this.name = getStringOption(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]); + } +} +class Attributes extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]); + } +} +class AutoSave extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]); + } +} +class Base extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "base"); + } +} +class BatchOutput extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "batchOutput"); + this.format = getStringOption(attributes.format, ["none", "concat", "zip", "zipCompress"]); + } +} +class BehaviorOverride extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "behaviorOverride"); + } + [$finalize]() { + this[$content] = new Map(this[$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2))); + } +} +class Cache extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "cache", true); + this.templateCache = null; + } +} +class Change extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "change"); + } +} +class Common extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "common", true); + this.data = null; + this.locale = null; + this.localeSet = null; + this.messaging = null; + this.suppressBanner = null; + this.template = null; + this.validationMessaging = null; + this.versionControl = null; + this.log = new XFAObjectArray(); + } +} +class Compress extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compress"); + this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]); + } +} +class CompressLogicalStructure extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressLogicalStructure"); + } +} +class CompressObjectStream extends Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressObjectStream"); + } +} +class Compression extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compression", true); + this.compressLogicalStructure = null; + this.compressObjectStream = null; + this.level = null; + this.type = null; + } +} +class Config extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "config", true); + this.acrobat = null; + this.present = null; + this.trace = null; + this.agent = new XFAObjectArray(); + } +} +class Conformance extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "conformance", ["A", "B"]); + } +} +class ContentCopy extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "contentCopy"); + } +} +class Copies extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "copies", 1, n => n >= 1); + } +} +class Creator extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "creator"); + } +} +class CurrentPage extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0); + } +} +class Data extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "data", true); + this.adjustData = null; + this.attributes = null; + this.incrementalLoad = null; + this.outputXSL = null; + this.range = null; + this.record = null; + this.startNode = null; + this.uri = null; + this.window = null; + this.xsl = null; + this.excludeNS = new XFAObjectArray(); + this.transform = new XFAObjectArray(); + } +} +class Debug extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "debug", true); + this.uri = null; + } +} +class DefaultTypeface extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "defaultTypeface"); + this.writingScript = getStringOption(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]); + } +} +class Destination extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]); + } +} +class DocumentAssembly extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "documentAssembly"); + } +} +class Driver extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "driver", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class DuplexOption extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]); + } +} +class DynamicRender extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]); + } +} +class Embed extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "embed"); + } +} +class config_Encrypt extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "encrypt"); + } +} +class config_Encryption extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryption", true); + this.encrypt = null; + this.encryptionLevel = null; + this.permissions = null; + } +} +class EncryptionLevel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]); + } +} +class Enforce extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "enforce"); + } +} +class Equate extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equate"); + this.force = getInteger({ + data: attributes.force, + defaultValue: 1, + validate: n => n === 0 + }); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + } +} +class EquateRange extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equateRange"); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + this._unicodeRange = attributes.unicodeRange || ""; + } + get unicodeRange() { + const ranges = []; + const unicodeRegex = /U\+([0-9a-fA-F]+)/; + const unicodeRange = this._unicodeRange; + for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) { + range = range.split("-", 2).map(x => { + const found = x.match(unicodeRegex); + if (!found) { + return 0; + } + return parseInt(found[1], 16); + }); + if (range.length === 1) { + range.push(range[0]); + } + ranges.push(range); + } + return shadow(this, "unicodeRange", ranges); + } +} +class Exclude extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "exclude"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x)); + } +} +class ExcludeNS extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "excludeNS"); + } +} +class FlipLabel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]); + } +} +class config_FontInfo extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "fontInfo", true); + this.embed = null; + this.map = null; + this.subsetBelow = null; + this.alwaysEmbed = new XFAObjectArray(); + this.defaultTypeface = new XFAObjectArray(); + this.neverEmbed = new XFAObjectArray(); + } +} +class FormFieldFilling extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "formFieldFilling"); + } +} +class GroupParent extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "groupParent"); + } +} +class IfEmpty extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]); + } +} +class IncludeXDPContent extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "includeXDPContent"); + } +} +class IncrementalLoad extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]); + } +} +class IncrementalMerge extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalMerge"); + } +} +class Interactive extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "interactive"); + } +} +class Jog extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]); + } +} +class LabelPrinter extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "labelPrinter", true); + this.name = getStringOption(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]); + this.batchOutput = null; + this.flipLabel = null; + this.fontInfo = null; + this.xdc = null; + } +} +class Layout extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "layout", ["paginate", "panel"]); + } +} +class Level extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "level", 0, n => n > 0); + } +} +class Linearized extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "linearized"); + } +} +class Locale extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "locale"); + } +} +class LocaleSet extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "localeSet"); + } +} +class Log extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "log", true); + this.mode = null; + this.threshold = null; + this.to = null; + this.uri = null; + } +} +class MapElement extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "map", true); + this.equate = new XFAObjectArray(); + this.equateRange = new XFAObjectArray(); + } +} +class MediumInfo extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mediumInfo", true); + this.map = null; + } +} +class config_Message extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "message", true); + this.msgId = null; + this.severity = null; + } +} +class Messaging extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "messaging", true); + this.message = new XFAObjectArray(); + } +} +class Mode extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mode", ["append", "overwrite"]); + } +} +class ModifyAnnots extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "modifyAnnots"); + } +} +class MsgId extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "msgId", 1, n => n >= 1); + } +} +class NameAttr extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "nameAttr"); + } +} +class NeverEmbed extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "neverEmbed"); + } +} +class NumberOfCopies extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5); + } +} +class OpenAction extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "openAction", true); + this.destination = null; + } +} +class Output extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "output", true); + this.to = null; + this.type = null; + this.uri = null; + } +} +class OutputBin extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputBin"); + } +} +class OutputXSL extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputXSL", true); + this.uri = null; + } +} +class Overprint extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]); + } +} +class Packets extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "packets"); + } + [$finalize]() { + if (this[$content] === "*") { + return; + } + this[$content] = this[$content].trim().split(/\s+/).filter(x => ["config", "datasets", "template", "xfdf", "xslt"].includes(x)); + } +} +class PageOffset extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pageOffset"); + this.x = getInteger({ + data: attributes.x, + defaultValue: "useXDCSetting", + validate: n => true + }); + this.y = getInteger({ + data: attributes.y, + defaultValue: "useXDCSetting", + validate: n => true + }); + } +} +class PageRange extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pageRange"); + } + [$finalize]() { + const numbers = this[$content].trim().split(/\s+/).map(x => parseInt(x, 10)); + const ranges = []; + for (let i = 0, ii = numbers.length; i < ii; i += 2) { + ranges.push(numbers.slice(i, i + 2)); + } + this[$content] = ranges; + } +} +class Pagination extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]); + } +} +class PaginationOverride extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]); + } +} +class Part extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "part", 1, n => false); + } +} +class Pcl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pcl", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.pageOffset = null; + this.staple = null; + this.xdc = null; + } +} +class Pdf extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdf", true); + this.name = attributes.name || ""; + this.adobeExtensionLevel = null; + this.batchOutput = null; + this.compression = null; + this.creator = null; + this.encryption = null; + this.fontInfo = null; + this.interactive = null; + this.linearized = null; + this.openAction = null; + this.pdfa = null; + this.producer = null; + this.renderPolicy = null; + this.scriptModel = null; + this.silentPrint = null; + this.submitFormat = null; + this.tagged = null; + this.version = null; + this.viewerPreferences = null; + this.xdc = null; + } +} +class Pdfa extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdfa", true); + this.amd = null; + this.conformance = null; + this.includeXDPContent = null; + this.part = null; + } +} +class Permissions extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "permissions", true); + this.accessibleContent = null; + this.change = null; + this.contentCopy = null; + this.documentAssembly = null; + this.formFieldFilling = null; + this.modifyAnnots = null; + this.plaintextMetadata = null; + this.print = null; + this.printHighQuality = null; + } +} +class PickTrayByPDFSize extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "pickTrayByPDFSize"); + } +} +class config_Picture extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "picture"); + } +} +class PlaintextMetadata extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "plaintextMetadata"); + } +} +class Presence extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]); + } +} +class Present extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "present", true); + this.behaviorOverride = null; + this.cache = null; + this.common = null; + this.copies = null; + this.destination = null; + this.incrementalMerge = null; + this.layout = null; + this.output = null; + this.overprint = null; + this.pagination = null; + this.paginationOverride = null; + this.script = null; + this.validate = null; + this.xdp = null; + this.driver = new XFAObjectArray(); + this.labelPrinter = new XFAObjectArray(); + this.pcl = new XFAObjectArray(); + this.pdf = new XFAObjectArray(); + this.ps = new XFAObjectArray(); + this.submitUrl = new XFAObjectArray(); + this.webClient = new XFAObjectArray(); + this.zpl = new XFAObjectArray(); + } +} +class Print extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "print"); + } +} +class PrintHighQuality extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "printHighQuality"); + } +} +class PrintScaling extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]); + } +} +class PrinterName extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printerName"); + } +} +class Producer extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "producer"); + } +} +class Ps extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ps", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.staple = null; + this.xdc = null; + } +} +class Range extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "range"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s*,\s*/, 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => { + if (range.length === 1) { + range.push(range[0]); + } + return range; + }); + } +} +class Record extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "record"); + } + [$finalize]() { + this[$content] = this[$content].trim(); + const n = parseInt(this[$content], 10); + if (!isNaN(n) && n >= 0) { + this[$content] = n; + } + } +} +class Relevant extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "relevant"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/); + } +} +class Rename extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "rename"); + } + [$finalize]() { + this[$content] = this[$content].trim(); + if (this[$content].toLowerCase().startsWith("xml") || new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[$content])) { + warn("XFA - Rename: invalid XFA name"); + } + } +} +class RenderPolicy extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]); + } +} +class RunScripts extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]); + } +} +class config_Script extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "script", true); + this.currentPage = null; + this.exclude = null; + this.runScripts = null; + } +} +class ScriptModel extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]); + } +} +class Severity extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]); + } +} +class SilentPrint extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "silentPrint", true); + this.addSilentPrint = null; + this.printerName = null; + } +} +class Staple extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "staple"); + this.mode = getStringOption(attributes.mode, ["usePrinterSetting", "on", "off"]); + } +} +class StartNode extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startNode"); + } +} +class StartPage extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startPage", 0, n => true); + } +} +class SubmitFormat extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]); + } +} +class SubmitUrl extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitUrl"); + } +} +class SubsetBelow extends IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100); + } +} +class SuppressBanner extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "suppressBanner"); + } +} +class Tagged extends Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "tagged"); + } +} +class config_Template extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "template", true); + this.base = null; + this.relevant = null; + this.startPage = null; + this.uri = null; + this.xsl = null; + } +} +class Threshold extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]); + } +} +class To extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]); + } +} +class TemplateCache extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "templateCache"); + this.maxEntries = getInteger({ + data: attributes.maxEntries, + defaultValue: 5, + validate: n => n >= 0 + }); + } +} +class Trace extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "trace", true); + this.area = new XFAObjectArray(); + } +} +class Transform extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "transform", true); + this.groupParent = null; + this.ifEmpty = null; + this.nameAttr = null; + this.picture = null; + this.presence = null; + this.rename = null; + this.whitespace = null; + } +} +class Type extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]); + } +} +class Uri extends StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "uri"); + } +} +class config_Validate extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]); + } +} +class ValidateApprovalSignatures extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validateApprovalSignatures"); + } + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x)); + } +} +class ValidationMessaging extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]); + } +} +class Version extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); + } +} +class VersionControl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "VersionControl"); + this.outputBelow = getStringOption(attributes.outputBelow, ["warn", "error", "update"]); + this.sourceAbove = getStringOption(attributes.sourceAbove, ["warn", "error"]); + this.sourceBelow = getStringOption(attributes.sourceBelow, ["update", "maintain"]); + } +} +class ViewerPreferences extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "viewerPreferences", true); + this.ADBE_JSConsole = null; + this.ADBE_JSDebugger = null; + this.addViewerPreferences = null; + this.duplexOption = null; + this.enforce = null; + this.numberOfCopies = null; + this.pageRange = null; + this.pickTrayByPDFSize = null; + this.printScaling = null; + } +} +class WebClient extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "webClient", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class Whitespace extends OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]); + } +} +class Window extends ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "window"); + } + [$finalize]() { + const pair = this[$content].trim().split(/\s*,\s*/, 2).map(x => parseInt(x, 10)); + if (pair.some(x => isNaN(x))) { + this[$content] = [0, 0]; + return; + } + if (pair.length === 1) { + pair.push(pair[0]); + } + this[$content] = pair; + } +} +class Xdc extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xdc", true); + this.uri = new XFAObjectArray(); + this.xsl = new XFAObjectArray(); + } +} +class Xdp extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xdp", true); + this.packets = null; + } +} +class Xsl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xsl", true); + this.debug = null; + this.uri = null; + } +} +class Zpl extends XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "zpl", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.batchOutput = null; + this.flipLabel = null; + this.fontInfo = null; + this.xdc = null; + } +} +class ConfigNamespace { + static [$buildXFAObject](name, attributes) { + if (ConfigNamespace.hasOwnProperty(name)) { + return ConfigNamespace[name](attributes); + } + return undefined; + } + static acrobat(attrs) { + return new Acrobat(attrs); + } + static acrobat7(attrs) { + return new Acrobat7(attrs); + } + static ADBE_JSConsole(attrs) { + return new ADBE_JSConsole(attrs); + } + static ADBE_JSDebugger(attrs) { + return new ADBE_JSDebugger(attrs); + } + static addSilentPrint(attrs) { + return new AddSilentPrint(attrs); + } + static addViewerPreferences(attrs) { + return new AddViewerPreferences(attrs); + } + static adjustData(attrs) { + return new AdjustData(attrs); + } + static adobeExtensionLevel(attrs) { + return new AdobeExtensionLevel(attrs); + } + static agent(attrs) { + return new Agent(attrs); + } + static alwaysEmbed(attrs) { + return new AlwaysEmbed(attrs); + } + static amd(attrs) { + return new Amd(attrs); + } + static area(attrs) { + return new config_Area(attrs); + } + static attributes(attrs) { + return new Attributes(attrs); + } + static autoSave(attrs) { + return new AutoSave(attrs); + } + static base(attrs) { + return new Base(attrs); + } + static batchOutput(attrs) { + return new BatchOutput(attrs); + } + static behaviorOverride(attrs) { + return new BehaviorOverride(attrs); + } + static cache(attrs) { + return new Cache(attrs); + } + static change(attrs) { + return new Change(attrs); + } + static common(attrs) { + return new Common(attrs); + } + static compress(attrs) { + return new Compress(attrs); + } + static compressLogicalStructure(attrs) { + return new CompressLogicalStructure(attrs); + } + static compressObjectStream(attrs) { + return new CompressObjectStream(attrs); + } + static compression(attrs) { + return new Compression(attrs); + } + static config(attrs) { + return new Config(attrs); + } + static conformance(attrs) { + return new Conformance(attrs); + } + static contentCopy(attrs) { + return new ContentCopy(attrs); + } + static copies(attrs) { + return new Copies(attrs); + } + static creator(attrs) { + return new Creator(attrs); + } + static currentPage(attrs) { + return new CurrentPage(attrs); + } + static data(attrs) { + return new Data(attrs); + } + static debug(attrs) { + return new Debug(attrs); + } + static defaultTypeface(attrs) { + return new DefaultTypeface(attrs); + } + static destination(attrs) { + return new Destination(attrs); + } + static documentAssembly(attrs) { + return new DocumentAssembly(attrs); + } + static driver(attrs) { + return new Driver(attrs); + } + static duplexOption(attrs) { + return new DuplexOption(attrs); + } + static dynamicRender(attrs) { + return new DynamicRender(attrs); + } + static embed(attrs) { + return new Embed(attrs); + } + static encrypt(attrs) { + return new config_Encrypt(attrs); + } + static encryption(attrs) { + return new config_Encryption(attrs); + } + static encryptionLevel(attrs) { + return new EncryptionLevel(attrs); + } + static enforce(attrs) { + return new Enforce(attrs); + } + static equate(attrs) { + return new Equate(attrs); + } + static equateRange(attrs) { + return new EquateRange(attrs); + } + static exclude(attrs) { + return new Exclude(attrs); + } + static excludeNS(attrs) { + return new ExcludeNS(attrs); + } + static flipLabel(attrs) { + return new FlipLabel(attrs); + } + static fontInfo(attrs) { + return new config_FontInfo(attrs); + } + static formFieldFilling(attrs) { + return new FormFieldFilling(attrs); + } + static groupParent(attrs) { + return new GroupParent(attrs); + } + static ifEmpty(attrs) { + return new IfEmpty(attrs); + } + static includeXDPContent(attrs) { + return new IncludeXDPContent(attrs); + } + static incrementalLoad(attrs) { + return new IncrementalLoad(attrs); + } + static incrementalMerge(attrs) { + return new IncrementalMerge(attrs); + } + static interactive(attrs) { + return new Interactive(attrs); + } + static jog(attrs) { + return new Jog(attrs); + } + static labelPrinter(attrs) { + return new LabelPrinter(attrs); + } + static layout(attrs) { + return new Layout(attrs); + } + static level(attrs) { + return new Level(attrs); + } + static linearized(attrs) { + return new Linearized(attrs); + } + static locale(attrs) { + return new Locale(attrs); + } + static localeSet(attrs) { + return new LocaleSet(attrs); + } + static log(attrs) { + return new Log(attrs); + } + static map(attrs) { + return new MapElement(attrs); + } + static mediumInfo(attrs) { + return new MediumInfo(attrs); + } + static message(attrs) { + return new config_Message(attrs); + } + static messaging(attrs) { + return new Messaging(attrs); + } + static mode(attrs) { + return new Mode(attrs); + } + static modifyAnnots(attrs) { + return new ModifyAnnots(attrs); + } + static msgId(attrs) { + return new MsgId(attrs); + } + static nameAttr(attrs) { + return new NameAttr(attrs); + } + static neverEmbed(attrs) { + return new NeverEmbed(attrs); + } + static numberOfCopies(attrs) { + return new NumberOfCopies(attrs); + } + static openAction(attrs) { + return new OpenAction(attrs); + } + static output(attrs) { + return new Output(attrs); + } + static outputBin(attrs) { + return new OutputBin(attrs); + } + static outputXSL(attrs) { + return new OutputXSL(attrs); + } + static overprint(attrs) { + return new Overprint(attrs); + } + static packets(attrs) { + return new Packets(attrs); + } + static pageOffset(attrs) { + return new PageOffset(attrs); + } + static pageRange(attrs) { + return new PageRange(attrs); + } + static pagination(attrs) { + return new Pagination(attrs); + } + static paginationOverride(attrs) { + return new PaginationOverride(attrs); + } + static part(attrs) { + return new Part(attrs); + } + static pcl(attrs) { + return new Pcl(attrs); + } + static pdf(attrs) { + return new Pdf(attrs); + } + static pdfa(attrs) { + return new Pdfa(attrs); + } + static permissions(attrs) { + return new Permissions(attrs); + } + static pickTrayByPDFSize(attrs) { + return new PickTrayByPDFSize(attrs); + } + static picture(attrs) { + return new config_Picture(attrs); + } + static plaintextMetadata(attrs) { + return new PlaintextMetadata(attrs); + } + static presence(attrs) { + return new Presence(attrs); + } + static present(attrs) { + return new Present(attrs); + } + static print(attrs) { + return new Print(attrs); + } + static printHighQuality(attrs) { + return new PrintHighQuality(attrs); + } + static printScaling(attrs) { + return new PrintScaling(attrs); + } + static printerName(attrs) { + return new PrinterName(attrs); + } + static producer(attrs) { + return new Producer(attrs); + } + static ps(attrs) { + return new Ps(attrs); + } + static range(attrs) { + return new Range(attrs); + } + static record(attrs) { + return new Record(attrs); + } + static relevant(attrs) { + return new Relevant(attrs); + } + static rename(attrs) { + return new Rename(attrs); + } + static renderPolicy(attrs) { + return new RenderPolicy(attrs); + } + static runScripts(attrs) { + return new RunScripts(attrs); + } + static script(attrs) { + return new config_Script(attrs); + } + static scriptModel(attrs) { + return new ScriptModel(attrs); + } + static severity(attrs) { + return new Severity(attrs); + } + static silentPrint(attrs) { + return new SilentPrint(attrs); + } + static staple(attrs) { + return new Staple(attrs); + } + static startNode(attrs) { + return new StartNode(attrs); + } + static startPage(attrs) { + return new StartPage(attrs); + } + static submitFormat(attrs) { + return new SubmitFormat(attrs); + } + static submitUrl(attrs) { + return new SubmitUrl(attrs); + } + static subsetBelow(attrs) { + return new SubsetBelow(attrs); + } + static suppressBanner(attrs) { + return new SuppressBanner(attrs); + } + static tagged(attrs) { + return new Tagged(attrs); + } + static template(attrs) { + return new config_Template(attrs); + } + static templateCache(attrs) { + return new TemplateCache(attrs); + } + static threshold(attrs) { + return new Threshold(attrs); + } + static to(attrs) { + return new To(attrs); + } + static trace(attrs) { + return new Trace(attrs); + } + static transform(attrs) { + return new Transform(attrs); + } + static type(attrs) { + return new Type(attrs); + } + static uri(attrs) { + return new Uri(attrs); + } + static validate(attrs) { + return new config_Validate(attrs); + } + static validateApprovalSignatures(attrs) { + return new ValidateApprovalSignatures(attrs); + } + static validationMessaging(attrs) { + return new ValidationMessaging(attrs); + } + static version(attrs) { + return new Version(attrs); + } + static versionControl(attrs) { + return new VersionControl(attrs); + } + static viewerPreferences(attrs) { + return new ViewerPreferences(attrs); + } + static webClient(attrs) { + return new WebClient(attrs); + } + static whitespace(attrs) { + return new Whitespace(attrs); + } + static window(attrs) { + return new Window(attrs); + } + static xdc(attrs) { + return new Xdc(attrs); + } + static xdp(attrs) { + return new Xdp(attrs); + } + static xsl(attrs) { + return new Xsl(attrs); + } + static zpl(attrs) { + return new Zpl(attrs); + } +} + +;// ./src/core/xfa/connection_set.js + + +const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id; +class ConnectionSet extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "connectionSet", true); + this.wsdlConnection = new XFAObjectArray(); + this.xmlConnection = new XFAObjectArray(); + this.xsdConnection = new XFAObjectArray(); + } +} +class EffectiveInputPolicy extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "effectiveInputPolicy"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class EffectiveOutputPolicy extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Operation extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "operation"); + this.id = attributes.id || ""; + this.input = attributes.input || ""; + this.name = attributes.name || ""; + this.output = attributes.output || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class RootElement extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "rootElement"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SoapAction extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "soapAction"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SoapAddress extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "soapAddress"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class connection_set_Uri extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "uri"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class WsdlAddress extends StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "wsdlAddress"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class WsdlConnection extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "wsdlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.effectiveInputPolicy = null; + this.effectiveOutputPolicy = null; + this.operation = null; + this.soapAction = null; + this.soapAddress = null; + this.wsdlAddress = null; + } +} +class XmlConnection extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "xmlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.uri = null; + } +} +class XsdConnection extends XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "xsdConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.rootElement = null; + this.uri = null; + } +} +class ConnectionSetNamespace { + static [$buildXFAObject](name, attributes) { + if (ConnectionSetNamespace.hasOwnProperty(name)) { + return ConnectionSetNamespace[name](attributes); + } + return undefined; + } + static connectionSet(attrs) { + return new ConnectionSet(attrs); + } + static effectiveInputPolicy(attrs) { + return new EffectiveInputPolicy(attrs); + } + static effectiveOutputPolicy(attrs) { + return new EffectiveOutputPolicy(attrs); + } + static operation(attrs) { + return new Operation(attrs); + } + static rootElement(attrs) { + return new RootElement(attrs); + } + static soapAction(attrs) { + return new SoapAction(attrs); + } + static soapAddress(attrs) { + return new SoapAddress(attrs); + } + static uri(attrs) { + return new connection_set_Uri(attrs); + } + static wsdlAddress(attrs) { + return new WsdlAddress(attrs); + } + static wsdlConnection(attrs) { + return new WsdlConnection(attrs); + } + static xmlConnection(attrs) { + return new XmlConnection(attrs); + } + static xsdConnection(attrs) { + return new XsdConnection(attrs); + } +} + +;// ./src/core/xfa/datasets.js + + + +const DATASETS_NS_ID = NamespaceIds.datasets.id; +class datasets_Data extends XmlObject { + constructor(attributes) { + super(DATASETS_NS_ID, "data", attributes); + } + [$isNsAgnostic]() { + return true; + } +} +class Datasets extends XFAObject { + constructor(attributes) { + super(DATASETS_NS_ID, "datasets", true); + this.data = null; + this.Signature = null; + } + [$onChild](child) { + const name = child[$nodeName]; + if (name === "data" && child[$namespaceId] === DATASETS_NS_ID || name === "Signature" && child[$namespaceId] === NamespaceIds.signature.id) { + this[name] = child; + } + this[$appendChild](child); + } +} +class DatasetsNamespace { + static [$buildXFAObject](name, attributes) { + if (DatasetsNamespace.hasOwnProperty(name)) { + return DatasetsNamespace[name](attributes); + } + return undefined; + } + static datasets(attributes) { + return new Datasets(attributes); + } + static data(attributes) { + return new datasets_Data(attributes); + } +} + +;// ./src/core/xfa/locale_set.js + + + +const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id; +class CalendarSymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "calendarSymbols", true); + this.name = "gregorian"; + this.dayNames = new XFAObjectArray(2); + this.eraNames = null; + this.meridiemNames = null; + this.monthNames = new XFAObjectArray(2); + } +} +class CurrencySymbol extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbol"); + this.name = getStringOption(attributes.name, ["symbol", "isoname", "decimal"]); + } +} +class CurrencySymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbols", true); + this.currencySymbol = new XFAObjectArray(3); + } +} +class DatePattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class DatePatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePatterns", true); + this.datePattern = new XFAObjectArray(4); + } +} +class DateTimeSymbols extends ContentObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dateTimeSymbols"); + } +} +class Day extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "day"); + } +} +class DayNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dayNames", true); + this.abbr = getInteger({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.day = new XFAObjectArray(7); + } +} +class Era extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "era"); + } +} +class EraNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "eraNames", true); + this.era = new XFAObjectArray(2); + } +} +class locale_set_Locale extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "locale", true); + this.desc = attributes.desc || ""; + this.name = "isoname"; + this.calendarSymbols = null; + this.currencySymbols = null; + this.datePatterns = null; + this.dateTimeSymbols = null; + this.numberPatterns = null; + this.numberSymbols = null; + this.timePatterns = null; + this.typeFaces = null; + } +} +class locale_set_LocaleSet extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "localeSet", true); + this.locale = new XFAObjectArray(); + } +} +class Meridiem extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiem"); + } +} +class MeridiemNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiemNames", true); + this.meridiem = new XFAObjectArray(2); + } +} +class Month extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "month"); + } +} +class MonthNames extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "monthNames", true); + this.abbr = getInteger({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.month = new XFAObjectArray(12); + } +} +class NumberPattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class NumberPatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPatterns", true); + this.numberPattern = new XFAObjectArray(4); + } +} +class NumberSymbol extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbol"); + this.name = getStringOption(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]); + } +} +class NumberSymbols extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbols", true); + this.numberSymbol = new XFAObjectArray(5); + } +} +class TimePattern extends StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePattern"); + this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); + } +} +class TimePatterns extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePatterns", true); + this.timePattern = new XFAObjectArray(4); + } +} +class TypeFace extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFace", true); + this.name = attributes.name | ""; + } +} +class TypeFaces extends XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFaces", true); + this.typeFace = new XFAObjectArray(); + } +} +class LocaleSetNamespace { + static [$buildXFAObject](name, attributes) { + if (LocaleSetNamespace.hasOwnProperty(name)) { + return LocaleSetNamespace[name](attributes); + } + return undefined; + } + static calendarSymbols(attrs) { + return new CalendarSymbols(attrs); + } + static currencySymbol(attrs) { + return new CurrencySymbol(attrs); + } + static currencySymbols(attrs) { + return new CurrencySymbols(attrs); + } + static datePattern(attrs) { + return new DatePattern(attrs); + } + static datePatterns(attrs) { + return new DatePatterns(attrs); + } + static dateTimeSymbols(attrs) { + return new DateTimeSymbols(attrs); + } + static day(attrs) { + return new Day(attrs); + } + static dayNames(attrs) { + return new DayNames(attrs); + } + static era(attrs) { + return new Era(attrs); + } + static eraNames(attrs) { + return new EraNames(attrs); + } + static locale(attrs) { + return new locale_set_Locale(attrs); + } + static localeSet(attrs) { + return new locale_set_LocaleSet(attrs); + } + static meridiem(attrs) { + return new Meridiem(attrs); + } + static meridiemNames(attrs) { + return new MeridiemNames(attrs); + } + static month(attrs) { + return new Month(attrs); + } + static monthNames(attrs) { + return new MonthNames(attrs); + } + static numberPattern(attrs) { + return new NumberPattern(attrs); + } + static numberPatterns(attrs) { + return new NumberPatterns(attrs); + } + static numberSymbol(attrs) { + return new NumberSymbol(attrs); + } + static numberSymbols(attrs) { + return new NumberSymbols(attrs); + } + static timePattern(attrs) { + return new TimePattern(attrs); + } + static timePatterns(attrs) { + return new TimePatterns(attrs); + } + static typeFace(attrs) { + return new TypeFace(attrs); + } + static typeFaces(attrs) { + return new TypeFaces(attrs); + } +} + +;// ./src/core/xfa/signature.js + + +const SIGNATURE_NS_ID = NamespaceIds.signature.id; +class signature_Signature extends XFAObject { + constructor(attributes) { + super(SIGNATURE_NS_ID, "signature", true); + } +} +class SignatureNamespace { + static [$buildXFAObject](name, attributes) { + if (SignatureNamespace.hasOwnProperty(name)) { + return SignatureNamespace[name](attributes); + } + return undefined; + } + static signature(attributes) { + return new signature_Signature(attributes); + } +} + +;// ./src/core/xfa/stylesheet.js + + +const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id; +class Stylesheet extends XFAObject { + constructor(attributes) { + super(STYLESHEET_NS_ID, "stylesheet", true); + } +} +class StylesheetNamespace { + static [$buildXFAObject](name, attributes) { + if (StylesheetNamespace.hasOwnProperty(name)) { + return StylesheetNamespace[name](attributes); + } + return undefined; + } + static stylesheet(attributes) { + return new Stylesheet(attributes); + } +} + +;// ./src/core/xfa/xdp.js + + + +const XDP_NS_ID = NamespaceIds.xdp.id; +class xdp_Xdp extends XFAObject { + constructor(attributes) { + super(XDP_NS_ID, "xdp", true); + this.uuid = attributes.uuid || ""; + this.timeStamp = attributes.timeStamp || ""; + this.config = null; + this.connectionSet = null; + this.datasets = null; + this.localeSet = null; + this.stylesheet = new XFAObjectArray(); + this.template = null; + } + [$onChildCheck](child) { + const ns = NamespaceIds[child[$nodeName]]; + return ns && child[$namespaceId] === ns.id; + } +} +class XdpNamespace { + static [$buildXFAObject](name, attributes) { + if (XdpNamespace.hasOwnProperty(name)) { + return XdpNamespace[name](attributes); + } + return undefined; + } + static xdp(attributes) { + return new xdp_Xdp(attributes); + } +} + +;// ./src/core/xfa/xhtml.js + + + + + +const XHTML_NS_ID = NamespaceIds.xhtml.id; +const $richText = Symbol(); +const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]); +const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => { + value = original.fontSize = getMeasurement(value); + return measureToString(0.99 * value); +}], ["letter-spacing", value => measureToString(getMeasurement(value))], ["line-height", value => measureToString(getMeasurement(value))], ["margin", value => measureToString(getMeasurement(value))], ["margin-bottom", value => measureToString(getMeasurement(value))], ["margin-left", value => measureToString(getMeasurement(value))], ["margin-right", value => measureToString(getMeasurement(value))], ["margin-top", value => measureToString(getMeasurement(value))], ["text-indent", value => measureToString(getMeasurement(value))], ["font-family", value => value], ["vertical-align", value => measureToString(getMeasurement(value))]]); +const spacesRegExp = /\s+/g; +const crlfRegExp = /[\r\n]+/g; +const crlfForRichTextRegExp = /\r\n?/g; +function mapStyle(styleStr, node, richText) { + const style = Object.create(null); + if (!styleStr) { + return style; + } + const original = Object.create(null); + for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) { + const mapping = StyleMapping.get(key); + if (mapping === "") { + continue; + } + let newValue = value; + if (mapping) { + newValue = typeof mapping === "string" ? mapping : mapping(value, original); + } + if (key.endsWith("scale")) { + style.transform = style.transform ? `${style[key]} ${newValue}` : newValue; + } else { + style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue; + } + } + if (style.fontFamily) { + setFontFamily({ + typeface: style.fontFamily, + weight: style.fontWeight || "normal", + posture: style.fontStyle || "normal", + size: original.fontSize || 0 + }, node, node[$globalData].fontFinder, style); + } + if (richText && style.verticalAlign && style.verticalAlign !== "0px" && style.fontSize) { + const SUB_SUPER_SCRIPT_FACTOR = 0.583; + const VERTICAL_FACTOR = 0.333; + const fontSize = getMeasurement(style.fontSize); + style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR); + style.verticalAlign = measureToString(Math.sign(getMeasurement(style.verticalAlign)) * fontSize * VERTICAL_FACTOR); + } + if (richText && style.fontSize) { + style.fontSize = `calc(${style.fontSize} * var(--scale-factor))`; + } + fixTextIndent(style); + return style; +} +function checkStyle(node) { + if (!node.style) { + return ""; + } + return node.style.trim().split(/\s*;\s*/).filter(s => !!s).map(s => s.split(/\s*:\s*/, 2)).filter(([key, value]) => { + if (key === "font-family") { + node[$globalData].usedTypefaces.add(value); + } + return VALID_STYLES.has(key); + }).map(kv => kv.join(":")).join(";"); +} +const NoWhites = new Set(["body", "html"]); +class XhtmlObject extends XmlObject { + constructor(attributes, name) { + super(XHTML_NS_ID, name); + this[$richText] = false; + this.style = attributes.style || ""; + } + [$clean](builder) { + super[$clean](builder); + this.style = checkStyle(this); + } + [$acceptWhitespace]() { + return !NoWhites.has(this[$nodeName]); + } + [$onText](str, richText = false) { + if (!richText) { + str = str.replaceAll(crlfRegExp, ""); + if (!this.style.includes("xfa-spacerun:yes")) { + str = str.replaceAll(spacesRegExp, " "); + } + } else { + this[$richText] = true; + } + if (str) { + this[$content] += str; + } + } + [$pushGlyphs](measure, mustPop = true) { + const xfaFont = Object.create(null); + const margin = { + top: NaN, + bottom: NaN, + left: NaN, + right: NaN + }; + let lineHeight = null; + for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) { + switch (key) { + case "font-family": + xfaFont.typeface = stripQuotes(value); + break; + case "font-size": + xfaFont.size = getMeasurement(value); + break; + case "font-weight": + xfaFont.weight = value; + break; + case "font-style": + xfaFont.posture = value; + break; + case "letter-spacing": + xfaFont.letterSpacing = getMeasurement(value); + break; + case "margin": + const values = value.split(/ \t/).map(x => getMeasurement(x)); + switch (values.length) { + case 1: + margin.top = margin.bottom = margin.left = margin.right = values[0]; + break; + case 2: + margin.top = margin.bottom = values[0]; + margin.left = margin.right = values[1]; + break; + case 3: + margin.top = values[0]; + margin.bottom = values[2]; + margin.left = margin.right = values[1]; + break; + case 4: + margin.top = values[0]; + margin.left = values[1]; + margin.bottom = values[2]; + margin.right = values[3]; + break; + } + break; + case "margin-top": + margin.top = getMeasurement(value); + break; + case "margin-bottom": + margin.bottom = getMeasurement(value); + break; + case "margin-left": + margin.left = getMeasurement(value); + break; + case "margin-right": + margin.right = getMeasurement(value); + break; + case "line-height": + lineHeight = getMeasurement(value); + break; + } + } + measure.pushData(xfaFont, margin, lineHeight); + if (this[$content]) { + measure.addString(this[$content]); + } else { + for (const child of this[$getChildren]()) { + if (child[$nodeName] === "#text") { + measure.addString(child[$content]); + continue; + } + child[$pushGlyphs](measure); + } + } + if (mustPop) { + measure.popFont(); + } + } + [$toHTML](availableSpace) { + const children = []; + this[$extra] = { + children + }; + this[$childrenToHTML]({}); + if (children.length === 0 && !this[$content]) { + return HTMLResult.EMPTY; + } + let value; + if (this[$richText]) { + value = this[$content] ? this[$content].replaceAll(crlfForRichTextRegExp, "\n") : undefined; + } else { + value = this[$content] || undefined; + } + return HTMLResult.success({ + name: this[$nodeName], + attributes: { + href: this.href, + style: mapStyle(this.style, this, this[$richText]) + }, + children, + value + }); + } +} +class A extends XhtmlObject { + constructor(attributes) { + super(attributes, "a"); + this.href = fixURL(attributes.href) || ""; + } +} +class B extends XhtmlObject { + constructor(attributes) { + super(attributes, "b"); + } + [$pushGlyphs](measure) { + measure.pushFont({ + weight: "bold" + }); + super[$pushGlyphs](measure); + measure.popFont(); + } +} +class Body extends XhtmlObject { + constructor(attributes) { + super(attributes, "body"); + } + [$toHTML](availableSpace) { + const res = super[$toHTML](availableSpace); + const { + html + } = res; + if (!html) { + return HTMLResult.EMPTY; + } + html.name = "div"; + html.attributes.class = ["xfaRich"]; + return res; + } +} +class Br extends XhtmlObject { + constructor(attributes) { + super(attributes, "br"); + } + [$text]() { + return "\n"; + } + [$pushGlyphs](measure) { + measure.addString("\n"); + } + [$toHTML](availableSpace) { + return HTMLResult.success({ + name: "br" + }); + } +} +class Html extends XhtmlObject { + constructor(attributes) { + super(attributes, "html"); + } + [$toHTML](availableSpace) { + const children = []; + this[$extra] = { + children + }; + this[$childrenToHTML]({}); + if (children.length === 0) { + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: {} + }, + value: this[$content] || "" + }); + } + if (children.length === 1) { + const child = children[0]; + if (child.attributes?.class.includes("xfaRich")) { + return HTMLResult.success(child); + } + } + return HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: {} + }, + children + }); + } +} +class I extends XhtmlObject { + constructor(attributes) { + super(attributes, "i"); + } + [$pushGlyphs](measure) { + measure.pushFont({ + posture: "italic" + }); + super[$pushGlyphs](measure); + measure.popFont(); + } +} +class Li extends XhtmlObject { + constructor(attributes) { + super(attributes, "li"); + } +} +class Ol extends XhtmlObject { + constructor(attributes) { + super(attributes, "ol"); + } +} +class P extends XhtmlObject { + constructor(attributes) { + super(attributes, "p"); + } + [$pushGlyphs](measure) { + super[$pushGlyphs](measure, false); + measure.addString("\n"); + measure.addPara(); + measure.popFont(); + } + [$text]() { + const siblings = this[$getParent]()[$getChildren](); + if (siblings.at(-1) === this) { + return super[$text](); + } + return super[$text]() + "\n"; + } +} +class Span extends XhtmlObject { + constructor(attributes) { + super(attributes, "span"); + } +} +class Sub extends XhtmlObject { + constructor(attributes) { + super(attributes, "sub"); + } +} +class Sup extends XhtmlObject { + constructor(attributes) { + super(attributes, "sup"); + } +} +class Ul extends XhtmlObject { + constructor(attributes) { + super(attributes, "ul"); + } +} +class XhtmlNamespace { + static [$buildXFAObject](name, attributes) { + if (XhtmlNamespace.hasOwnProperty(name)) { + return XhtmlNamespace[name](attributes); + } + return undefined; + } + static a(attributes) { + return new A(attributes); + } + static b(attributes) { + return new B(attributes); + } + static body(attributes) { + return new Body(attributes); + } + static br(attributes) { + return new Br(attributes); + } + static html(attributes) { + return new Html(attributes); + } + static i(attributes) { + return new I(attributes); + } + static li(attributes) { + return new Li(attributes); + } + static ol(attributes) { + return new Ol(attributes); + } + static p(attributes) { + return new P(attributes); + } + static span(attributes) { + return new Span(attributes); + } + static sub(attributes) { + return new Sub(attributes); + } + static sup(attributes) { + return new Sup(attributes); + } + static ul(attributes) { + return new Ul(attributes); + } +} + +;// ./src/core/xfa/setup.js + + + + + + + + + +const NamespaceSetUp = { + config: ConfigNamespace, + connection: ConnectionSetNamespace, + datasets: DatasetsNamespace, + localeSet: LocaleSetNamespace, + signature: SignatureNamespace, + stylesheet: StylesheetNamespace, + template: TemplateNamespace, + xdp: XdpNamespace, + xhtml: XhtmlNamespace +}; + +;// ./src/core/xfa/unknown.js + + +class UnknownNamespace { + constructor(nsId) { + this.namespaceId = nsId; + } + [$buildXFAObject](name, attributes) { + return new XmlObject(this.namespaceId, name, attributes); + } +} + +;// ./src/core/xfa/builder.js + + + + + + + +class Root extends XFAObject { + constructor(ids) { + super(-1, "root", Object.create(null)); + this.element = null; + this[$ids] = ids; + } + [$onChild](child) { + this.element = child; + return true; + } + [$finalize]() { + super[$finalize](); + if (this.element.template instanceof Template) { + this[$ids].set($root, this.element); + this.element.template[$resolvePrototypes](this[$ids]); + this.element.template[$ids] = this[$ids]; + } + } +} +class Empty extends XFAObject { + constructor() { + super(-1, "", Object.create(null)); + } + [$onChild](_) { + return false; + } +} +class Builder { + constructor(rootNameSpace = null) { + this._namespaceStack = []; + this._nsAgnosticLevel = 0; + this._namespacePrefixes = new Map(); + this._namespaces = new Map(); + this._nextNsId = Math.max(...Object.values(NamespaceIds).map(({ + id + }) => id)); + this._currentNamespace = rootNameSpace || new UnknownNamespace(++this._nextNsId); + } + buildRoot(ids) { + return new Root(ids); + } + build({ + nsPrefix, + name, + attributes, + namespace, + prefixes + }) { + const hasNamespaceDef = namespace !== null; + if (hasNamespaceDef) { + this._namespaceStack.push(this._currentNamespace); + this._currentNamespace = this._searchNamespace(namespace); + } + if (prefixes) { + this._addNamespacePrefix(prefixes); + } + if (attributes.hasOwnProperty($nsAttributes)) { + const dataTemplate = NamespaceSetUp.datasets; + const nsAttrs = attributes[$nsAttributes]; + let xfaAttrs = null; + for (const [ns, attrs] of Object.entries(nsAttrs)) { + const nsToUse = this._getNamespaceToUse(ns); + if (nsToUse === dataTemplate) { + xfaAttrs = { + xfa: attrs + }; + break; + } + } + if (xfaAttrs) { + attributes[$nsAttributes] = xfaAttrs; + } else { + delete attributes[$nsAttributes]; + } + } + const namespaceToUse = this._getNamespaceToUse(nsPrefix); + const node = namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty(); + if (node[$isNsAgnostic]()) { + this._nsAgnosticLevel++; + } + if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) { + node[$cleanup] = { + hasNamespace: hasNamespaceDef, + prefixes, + nsAgnostic: node[$isNsAgnostic]() + }; + } + return node; + } + isNsAgnostic() { + return this._nsAgnosticLevel > 0; + } + _searchNamespace(nsName) { + let ns = this._namespaces.get(nsName); + if (ns) { + return ns; + } + for (const [name, { + check + }] of Object.entries(NamespaceIds)) { + if (check(nsName)) { + ns = NamespaceSetUp[name]; + if (ns) { + this._namespaces.set(nsName, ns); + return ns; + } + break; + } + } + ns = new UnknownNamespace(++this._nextNsId); + this._namespaces.set(nsName, ns); + return ns; + } + _addNamespacePrefix(prefixes) { + for (const { + prefix, + value + } of prefixes) { + const namespace = this._searchNamespace(value); + let prefixStack = this._namespacePrefixes.get(prefix); + if (!prefixStack) { + prefixStack = []; + this._namespacePrefixes.set(prefix, prefixStack); + } + prefixStack.push(namespace); + } + } + _getNamespaceToUse(prefix) { + if (!prefix) { + return this._currentNamespace; + } + const prefixStack = this._namespacePrefixes.get(prefix); + if (prefixStack?.length > 0) { + return prefixStack.at(-1); + } + warn(`Unknown namespace prefix: ${prefix}.`); + return null; + } + clean(data) { + const { + hasNamespace, + prefixes, + nsAgnostic + } = data; + if (hasNamespace) { + this._currentNamespace = this._namespaceStack.pop(); + } + if (prefixes) { + prefixes.forEach(({ + prefix + }) => { + this._namespacePrefixes.get(prefix).pop(); + }); + } + if (nsAgnostic) { + this._nsAgnosticLevel--; + } + } +} + +;// ./src/core/xfa/parser.js + + + + +class XFAParser extends XMLParserBase { + constructor(rootNameSpace = null, richText = false) { + super(); + this._builder = new Builder(rootNameSpace); + this._stack = []; + this._globalData = { + usedTypefaces: new Set() + }; + this._ids = new Map(); + this._current = this._builder.buildRoot(this._ids); + this._errorCode = XMLParserErrorCode.NoError; + this._whiteRegex = /^\s+$/; + this._nbsps = /\xa0+/g; + this._richText = richText; + } + parse(data) { + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; + } + this._current[$finalize](); + return this._current.element; + } + onText(text) { + text = text.replace(this._nbsps, match => match.slice(1) + " "); + if (this._richText || this._current[$acceptWhitespace]()) { + this._current[$onText](text, this._richText); + return; + } + if (this._whiteRegex.test(text)) { + return; + } + this._current[$onText](text.trim()); + } + onCdata(text) { + this._current[$onText](text); + } + _mkAttributes(attributes, tagName) { + let namespace = null; + let prefixes = null; + const attributeObj = Object.create({}); + for (const { + name, + value + } of attributes) { + if (name === "xmlns") { + if (!namespace) { + namespace = value; + } else { + warn(`XFA - multiple namespace definition in <${tagName}>`); + } + } else if (name.startsWith("xmlns:")) { + const prefix = name.substring("xmlns:".length); + if (!prefixes) { + prefixes = []; + } + prefixes.push({ + prefix, + value + }); + } else { + const i = name.indexOf(":"); + if (i === -1) { + attributeObj[name] = value; + } else { + let nsAttrs = attributeObj[$nsAttributes]; + if (!nsAttrs) { + nsAttrs = attributeObj[$nsAttributes] = Object.create(null); + } + const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)]; + const attrs = nsAttrs[ns] ||= Object.create(null); + attrs[attrName] = value; + } + } + } + return [namespace, prefixes, attributeObj]; + } + _getNameAndPrefix(name, nsAgnostic) { + const i = name.indexOf(":"); + if (i === -1) { + return [name, null]; + } + return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)]; + } + onBeginElement(tagName, attributes, isEmpty) { + const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName); + const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic()); + const node = this._builder.build({ + nsPrefix, + name, + attributes: attributesObj, + namespace, + prefixes + }); + node[$globalData] = this._globalData; + if (isEmpty) { + node[$finalize](); + if (this._current[$onChild](node)) { + node[$setId](this._ids); + } + node[$clean](this._builder); + return; + } + this._stack.push(this._current); + this._current = node; + } + onEndElement(name) { + const node = this._current; + if (node[$isCDATAXml]() && typeof node[$content] === "string") { + const parser = new XFAParser(); + parser._globalData = this._globalData; + const root = parser.parse(node[$content]); + node[$content] = null; + node[$onChild](root); + } + node[$finalize](); + this._current = this._stack.pop(); + if (this._current[$onChild](node)) { + node[$setId](this._ids); + } + node[$clean](this._builder); + } + onError(code) { + this._errorCode = code; + } +} + +;// ./src/core/xfa/factory.js + + + + + + + + +class XFAFactory { + constructor(data) { + try { + this.root = new XFAParser().parse(XFAFactory._createDocument(data)); + const binder = new Binder(this.root); + this.form = binder.bind(); + this.dataHandler = new DataHandler(this.root, binder.getData()); + this.form[$globalData].template = this.form; + } catch (e) { + warn(`XFA - an error occurred during parsing and binding: ${e}`); + } + } + isValid() { + return this.root && this.form; + } + _createPagesHelper() { + const iterator = this.form[$toPages](); + return new Promise((resolve, reject) => { + const nextIteration = () => { + try { + const value = iterator.next(); + if (value.done) { + resolve(value.value); + } else { + setTimeout(nextIteration, 0); + } + } catch (e) { + reject(e); + } + }; + setTimeout(nextIteration, 0); + }); + } + async _createPages() { + try { + this.pages = await this._createPagesHelper(); + this.dims = this.pages.children.map(c => { + const { + width, + height + } = c.attributes.style; + return [0, 0, parseInt(width), parseInt(height)]; + }); + } catch (e) { + warn(`XFA - an error occurred during layout: ${e}`); + } + } + getBoundingBox(pageIndex) { + return this.dims[pageIndex]; + } + async getNumPages() { + if (!this.pages) { + await this._createPages(); + } + return this.dims.length; + } + setImages(images) { + this.form[$globalData].images = images; + } + setFonts(fonts) { + this.form[$globalData].fontFinder = new FontFinder(fonts); + const missingFonts = []; + for (let typeface of this.form[$globalData].usedTypefaces) { + typeface = stripQuotes(typeface); + const font = this.form[$globalData].fontFinder.find(typeface); + if (!font) { + missingFonts.push(typeface); + } + } + if (missingFonts.length > 0) { + return missingFonts; + } + return null; + } + appendFonts(fonts, reallyMissingFonts) { + this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts); + } + async getPages() { + if (!this.pages) { + await this._createPages(); + } + const pages = this.pages; + this.pages = null; + return pages; + } + serializeData(storage) { + return this.dataHandler.serialize(storage); + } + static _createDocument(data) { + if (!data["/xdp:xdp"]) { + return data["xdp:xdp"]; + } + return Object.values(data).join(""); + } + static getRichTextAsHtml(rc) { + if (!rc || typeof rc !== "string") { + return null; + } + try { + let root = new XFAParser(XhtmlNamespace, true).parse(rc); + if (!["body", "xhtml"].includes(root[$nodeName])) { + const newRoot = XhtmlNamespace.body({}); + newRoot[$appendChild](root); + root = newRoot; + } + const result = root[$toHTML](); + if (!result.success) { + return null; + } + const { + html + } = result; + const { + attributes + } = html; + if (attributes) { + if (attributes.class) { + attributes.class = attributes.class.filter(attr => !attr.startsWith("xfa")); + } + attributes.dir = "auto"; + } + return { + html, + str: root[$text]() + }; + } catch (e) { + warn(`XFA - an error occurred during parsing of rich text: ${e}`); + } + return null; + } +} + +;// ./src/core/annotation.js + + + + + + + + + + + + + + +class AnnotationFactory { + static createGlobals(pdfManager) { + return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments]) => { + return { + pdfManager, + acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, + xfaDatasets, + structTreeRoot, + baseUrl, + attachments + }; + }, reason => { + warn(`createGlobals: "${reason}".`); + return null; + }); + } + static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageRef) { + const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null; + return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageIndex, pageRef]); + } + static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, pageIndex = null, pageRef = null) { + const dict = xref.fetchIfRef(ref); + if (!(dict instanceof Dict)) { + return undefined; + } + const { + acroForm, + pdfManager + } = annotationGlobals; + const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; + let subtype = dict.get("Subtype"); + subtype = subtype instanceof Name ? subtype.name : null; + const parameters = { + xref, + ref, + dict, + subtype, + id, + annotationGlobals, + collectFields, + orphanFields, + needAppearances: !collectFields && acroForm.get("NeedAppearances") === true, + pageIndex, + evaluatorOptions: pdfManager.evaluatorOptions, + pageRef + }; + switch (subtype) { + case "Link": + return new LinkAnnotation(parameters); + case "Text": + return new TextAnnotation(parameters); + case "Widget": + let fieldType = getInheritableProperty({ + dict, + key: "FT" + }); + fieldType = fieldType instanceof Name ? fieldType.name : null; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotation(parameters); + case "Btn": + return new ButtonWidgetAnnotation(parameters); + case "Ch": + return new ChoiceWidgetAnnotation(parameters); + case "Sig": + return new SignatureWidgetAnnotation(parameters); + } + warn(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type."); + return new WidgetAnnotation(parameters); + case "Popup": + return new PopupAnnotation(parameters); + case "FreeText": + return new FreeTextAnnotation(parameters); + case "Line": + return new LineAnnotation(parameters); + case "Square": + return new SquareAnnotation(parameters); + case "Circle": + return new CircleAnnotation(parameters); + case "PolyLine": + return new PolylineAnnotation(parameters); + case "Polygon": + return new PolygonAnnotation(parameters); + case "Caret": + return new CaretAnnotation(parameters); + case "Ink": + return new InkAnnotation(parameters); + case "Highlight": + return new HighlightAnnotation(parameters); + case "Underline": + return new UnderlineAnnotation(parameters); + case "Squiggly": + return new SquigglyAnnotation(parameters); + case "StrikeOut": + return new StrikeOutAnnotation(parameters); + case "Stamp": + return new StampAnnotation(parameters); + case "FileAttachment": + return new FileAttachmentAnnotation(parameters); + default: + if (!collectFields) { + if (!subtype) { + warn("Annotation is missing the required /Subtype."); + } else { + warn(`Unimplemented annotation type "${subtype}", ` + "falling back to base annotation."); + } + } + return new Annotation(parameters); + } + } + static async _getPageIndex(xref, ref, pdfManager) { + try { + const annotDict = await xref.fetchIfRefAsync(ref); + if (!(annotDict instanceof Dict)) { + return -1; + } + const pageRef = annotDict.getRaw("P"); + if (pageRef instanceof Ref) { + try { + const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]); + return pageIndex; + } catch (ex) { + info(`_getPageIndex -- not a valid page reference: "${ex}".`); + } + } + if (annotDict.has("Kids")) { + return -1; + } + const numPages = await pdfManager.ensureDoc("numPages"); + for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { + const page = await pdfManager.getPage(pageIndex); + const annotations = await pdfManager.ensure(page, "annotations"); + for (const annotRef of annotations) { + if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) { + return pageIndex; + } + } + } + } catch (ex) { + warn(`_getPageIndex: "${ex}".`); + } + return -1; + } + static generateImages(annotations, xref, isOffscreenCanvasSupported) { + if (!isOffscreenCanvasSupported) { + warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images."); + return null; + } + let imagePromises; + for (const { + bitmapId, + bitmap + } of annotations) { + if (!bitmap) { + continue; + } + imagePromises ||= new Map(); + imagePromises.set(bitmapId, StampAnnotation.createImage(bitmap, xref)); + } + return imagePromises; + } + static async saveNewAnnotations(evaluator, task, annotations, imagePromises, changes) { + const xref = evaluator.xref; + let baseFontRef; + const promises = []; + const { + isOffscreenCanvasSupported + } = evaluator.options; + for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } + switch (annotation.annotationType) { + case AnnotationEditorType.FREETEXT: + if (!baseFontRef) { + const baseFont = new Dict(xref); + baseFont.set("BaseFont", Name.get("Helvetica")); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type1")); + baseFont.set("Encoding", Name.get("WinAnsiEncoding")); + baseFontRef = xref.getNewTemporaryRef(); + changes.put(baseFontRef, { + data: baseFont + }); + } + promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, { + evaluator, + task, + baseFontRef + })); + break; + case AnnotationEditorType.HIGHLIGHT: + if (annotation.quadPoints) { + promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes)); + } else { + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); + } + break; + case AnnotationEditorType.INK: + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); + break; + case AnnotationEditorType.STAMP: + const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; + if (image?.imageStream) { + const { + imageStream, + smaskStream + } = image; + if (smaskStream) { + const smaskRef = xref.getNewTemporaryRef(); + changes.put(smaskRef, { + data: smaskStream + }); + imageStream.dict.set("SMask", smaskRef); + } + const imageRef = image.imageRef = xref.getNewTemporaryRef(); + changes.put(imageRef, { + data: imageStream + }); + image.imageStream = image.smaskStream = null; + } + promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, { + image + })); + break; + } + } + return { + annotations: await Promise.all(promises) + }; + } + static async printNewAnnotations(annotationGlobals, evaluator, task, annotations, imagePromises) { + if (!annotations) { + return null; + } + const { + options, + xref + } = evaluator; + const promises = []; + for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } + switch (annotation.annotationType) { + case AnnotationEditorType.FREETEXT: + promises.push(FreeTextAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluator, + task, + evaluatorOptions: options + })); + break; + case AnnotationEditorType.HIGHLIGHT: + if (annotation.quadPoints) { + promises.push(HighlightAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + } else { + promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + } + break; + case AnnotationEditorType.INK: + promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + break; + case AnnotationEditorType.STAMP: + const image = options.isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; + if (image?.imageStream) { + const { + imageStream, + smaskStream + } = image; + if (smaskStream) { + imageStream.dict.set("SMask", smaskStream); + } + image.imageRef = new JpegStream(imageStream, imageStream.length); + image.imageStream = image.smaskStream = null; + } + promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + image, + evaluatorOptions: options + })); + break; + } + } + return Promise.all(promises); + } +} +function getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) { + if (!Array.isArray(color)) { + return defaultColor; + } + const rgbColor = defaultColor || new Uint8ClampedArray(3); + switch (color.length) { + case 0: + return null; + case 1: + ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 3: + ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 4: + ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + default: + return defaultColor; + } +} +function getPdfColorArray(color) { + return Array.from(color, c => c / 255); +} +function getQuadPoints(dict, rect) { + const quadPoints = dict.getArray("QuadPoints"); + if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { + return null; + } + const newQuadPoints = new Float32Array(quadPoints.length); + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8); + const minX = Math.min(x1, x2, x3, x4); + const maxX = Math.max(x1, x2, x3, x4); + const minY = Math.min(y1, y2, y3, y4); + const maxY = Math.max(y1, y2, y3, y4); + if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) { + return null; + } + newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i); + } + return newQuadPoints; +} +function getTransformMatrix(rect, bbox, matrix) { + const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(bbox, matrix); + if (minX === maxX || minY === maxY) { + return [1, 0, 0, 1, rect[0], rect[1]]; + } + const xRatio = (rect[2] - rect[0]) / (maxX - minX); + const yRatio = (rect[3] - rect[1]) / (maxY - minY); + return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio]; +} +class Annotation { + constructor(params) { + const { + dict, + xref, + annotationGlobals, + ref, + orphanFields + } = params; + const parentRef = orphanFields?.get(ref); + if (parentRef) { + dict.set("Parent", parentRef); + } + this.setTitle(dict.get("T")); + this.setContents(dict.get("Contents")); + this.setModificationDate(dict.get("M")); + this.setFlags(dict.get("F")); + this.setRectangle(dict.getArray("Rect")); + this.setColor(dict.getArray("C")); + this.setBorderStyle(dict); + this.setAppearance(dict); + this.setOptionalContent(dict); + const MK = dict.get("MK"); + this.setBorderAndBackgroundColors(MK); + this.setRotation(MK, dict); + this.ref = params.ref instanceof Ref ? params.ref : null; + this._streams = []; + if (this.appearance) { + this._streams.push(this.appearance); + } + const isLocked = !!(this.flags & AnnotationFlag.LOCKED); + const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS); + this.data = { + annotationFlags: this.flags, + borderStyle: this.borderStyle, + color: this.color, + backgroundColor: this.backgroundColor, + borderColor: this.borderColor, + rotation: this.rotation, + contentsObj: this._contents, + hasAppearance: !!this.appearance, + id: params.id, + modificationDate: this.modificationDate, + rect: this.rectangle, + subtype: params.subtype, + hasOwnCanvas: false, + noRotate: !!(this.flags & AnnotationFlag.NOROTATE), + noHTML: isLocked && isContentLocked, + isEditable: false, + structParent: -1 + }; + if (annotationGlobals.structTreeRoot) { + let structParent = dict.get("StructParent"); + this.data.structParent = structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1; + annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent); + } + if (params.collectFields) { + const kids = dict.get("Kids"); + if (Array.isArray(kids)) { + const kidIds = []; + for (const kid of kids) { + if (kid instanceof Ref) { + kidIds.push(kid.toString()); + } + } + if (kidIds.length !== 0) { + this.data.kidIds = kidIds; + } + } + this.data.actions = collectActions(xref, dict, AnnotationActionEventType); + this.data.fieldName = this._constructFieldName(dict); + this.data.pageIndex = params.pageIndex; + } + const it = dict.get("IT"); + if (it instanceof Name) { + this.data.it = it.name; + } + this._isOffscreenCanvasSupported = params.evaluatorOptions.isOffscreenCanvasSupported; + this._fallbackFontDict = null; + this._needAppearances = false; + } + _hasFlag(flags, flag) { + return !!(flags & flag); + } + _buildFlags(noView, noPrint) { + let { + flags + } = this; + if (noView === undefined) { + if (noPrint === undefined) { + return undefined; + } + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.PRINT; + } + if (noView) { + flags |= AnnotationFlag.PRINT; + if (noPrint) { + return flags & ~AnnotationFlag.NOVIEW | AnnotationFlag.HIDDEN; + } + return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW; + } + flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW); + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return flags | AnnotationFlag.PRINT; + } + _isViewable(flags) { + return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW); + } + _isPrintable(flags) { + return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE); + } + mustBeViewed(annotationStorage, _renderForms) { + const noView = annotationStorage?.get(this.data.id)?.noView; + if (noView !== undefined) { + return !noView; + } + return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN); + } + mustBePrinted(annotationStorage) { + const noPrint = annotationStorage?.get(this.data.id)?.noPrint; + if (noPrint !== undefined) { + return !noPrint; + } + return this.printable; + } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); + } + get viewable() { + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return true; + } + return this._isViewable(this.flags); + } + get printable() { + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return false; + } + return this._isPrintable(this.flags); + } + _parseStringHelper(data) { + const str = typeof data === "string" ? stringToPDFString(data) : ""; + const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr"; + return { + str, + dir + }; + } + setDefaultAppearance(params) { + const { + dict, + annotationGlobals + } = params; + const defaultAppearance = getInheritableProperty({ + dict, + key: "DA" + }) || annotationGlobals.acroForm.get("DA"); + this._defaultAppearance = typeof defaultAppearance === "string" ? defaultAppearance : ""; + this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance); + } + setTitle(title) { + this._title = this._parseStringHelper(title); + } + setContents(contents) { + this._contents = this._parseStringHelper(contents); + } + setModificationDate(modificationDate) { + this.modificationDate = typeof modificationDate === "string" ? modificationDate : null; + } + setFlags(flags) { + this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0; + if (this.flags & AnnotationFlag.INVISIBLE && this.constructor.name !== "Annotation") { + this.flags ^= AnnotationFlag.INVISIBLE; + } + } + hasFlag(flag) { + return this._hasFlag(this.flags, flag); + } + setRectangle(rectangle) { + this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]); + } + setColor(color) { + this.color = getRgbColor(color); + } + setLineEndings(lineEndings) { + this.lineEndings = ["None", "None"]; + if (Array.isArray(lineEndings) && lineEndings.length === 2) { + for (let i = 0; i < 2; i++) { + const obj = lineEndings[i]; + if (obj instanceof Name) { + switch (obj.name) { + case "None": + continue; + case "Square": + case "Circle": + case "Diamond": + case "OpenArrow": + case "ClosedArrow": + case "Butt": + case "ROpenArrow": + case "RClosedArrow": + case "Slash": + this.lineEndings[i] = obj.name; + continue; + } + } + warn(`Ignoring invalid lineEnding: ${obj}`); + } + } + } + setRotation(mk, dict) { + this.rotation = 0; + let angle = mk instanceof Dict ? mk.get("R") || 0 : dict.get("Rotate") || 0; + if (Number.isInteger(angle) && angle !== 0) { + angle %= 360; + if (angle < 0) { + angle += 360; + } + if (angle % 90 === 0) { + this.rotation = angle; + } + } + } + setBorderAndBackgroundColors(mk) { + if (mk instanceof Dict) { + this.borderColor = getRgbColor(mk.getArray("BC"), null); + this.backgroundColor = getRgbColor(mk.getArray("BG"), null); + } else { + this.borderColor = this.backgroundColor = null; + } + } + setBorderStyle(borderStyle) { + this.borderStyle = new AnnotationBorderStyle(); + if (!(borderStyle instanceof Dict)) { + return; + } + if (borderStyle.has("BS")) { + const dict = borderStyle.get("BS"); + if (dict instanceof Dict) { + const dictType = dict.get("Type"); + if (!dictType || isName(dictType, "Border")) { + this.borderStyle.setWidth(dict.get("W"), this.rectangle); + this.borderStyle.setStyle(dict.get("S")); + this.borderStyle.setDashArray(dict.getArray("D")); + } + } + } else if (borderStyle.has("Border")) { + const array = borderStyle.getArray("Border"); + if (Array.isArray(array) && array.length >= 3) { + this.borderStyle.setHorizontalCornerRadius(array[0]); + this.borderStyle.setVerticalCornerRadius(array[1]); + this.borderStyle.setWidth(array[2], this.rectangle); + if (array.length === 4) { + this.borderStyle.setDashArray(array[3], true); + } + } + } else { + this.borderStyle.setWidth(0); + } + } + setAppearance(dict) { + this.appearance = null; + const appearanceStates = dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return; + } + const normalAppearanceState = appearanceStates.get("N"); + if (normalAppearanceState instanceof BaseStream) { + this.appearance = normalAppearanceState; + return; + } + if (!(normalAppearanceState instanceof Dict)) { + return; + } + const as = dict.get("AS"); + if (!(as instanceof Name) || !normalAppearanceState.has(as.name)) { + return; + } + const appearance = normalAppearanceState.get(as.name); + if (appearance instanceof BaseStream) { + this.appearance = appearance; + } + } + setOptionalContent(dict) { + this.oc = null; + const oc = dict.get("OC"); + if (oc instanceof Name) { + warn("setOptionalContent: Support for /Name-entry is not implemented."); + } else if (oc instanceof Dict) { + this.oc = oc; + } + } + loadResources(keys, appearance) { + return appearance.dict.getAsync("Resources").then(resources => { + if (!resources) { + return undefined; + } + const objectLoader = new ObjectLoader(resources, keys, resources.xref); + return objectLoader.load().then(function () { + return resources; + }); + }); + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + const { + hasOwnCanvas, + id, + rect + } = this.data; + let appearance = this.appearance; + const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); + if (isUsingOwnCanvas && (rect[0] === rect[2] || rect[1] === rect[3])) { + this.data.hasOwnCanvas = false; + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + if (!appearance) { + if (!isUsingOwnCanvas) { + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + appearance = new StringStream(""); + appearance.dict = new Dict(); + } + const appearanceDict = appearance.dict; + const resources = await this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], appearance); + const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, 1, 1]); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX); + const transform = getTransformMatrix(rect, bbox, matrix); + const opList = new OperatorList(); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(OPS.beginAnnotation, [id, rect, transform, matrix, isUsingOwnCanvas]); + await evaluator.getOperatorList({ + stream: appearance, + task, + resources, + operatorList: opList, + fallbackFontDict: this._fallbackFontDict + }); + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } + this.reset(); + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas + }; + } + async save(evaluator, task, annotationStorage, changes) { + return null; + } + get hasTextContent() { + return false; + } + async extractTextContent(evaluator, task, viewBox) { + if (!this.appearance) { + return; + } + const resources = await this.loadResources(["ExtGState", "Font", "Properties", "XObject"], this.appearance); + const text = []; + const buffer = []; + let firstPosition = null; + const sink = { + desiredSize: Math.Infinity, + ready: true, + enqueue(chunk, size) { + for (const item of chunk.items) { + if (item.str === undefined) { + continue; + } + firstPosition ||= item.transform.slice(-2); + buffer.push(item.str); + if (item.hasEOL) { + text.push(buffer.join("").trimEnd()); + buffer.length = 0; + } + } + } + }; + await evaluator.getTextContent({ + stream: this.appearance, + task, + resources, + includeMarkedContent: true, + keepWhiteSpace: true, + sink, + viewBox + }); + this.reset(); + if (buffer.length) { + text.push(buffer.join("").trimEnd()); + } + if (text.length > 1 || text[0]) { + const appearanceDict = this.appearance.dict; + const bbox = lookupRect(appearanceDict.getArray("BBox"), null); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null); + this.data.textPosition = this._transformPoint(firstPosition, bbox, matrix); + this.data.textContent = text; + } + } + _transformPoint(coords, bbox, matrix) { + const { + rect + } = this.data; + bbox ||= [0, 0, 1, 1]; + matrix ||= [1, 0, 0, 1, 0, 0]; + const transform = getTransformMatrix(rect, bbox, matrix); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + coords = Util.applyTransform(coords, transform); + return Util.applyTransform(coords, matrix); + } + getFieldObject() { + if (this.data.kidIds) { + return { + id: this.data.id, + actions: this.data.actions, + name: this.data.fieldName, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + type: "", + kidIds: this.data.kidIds, + page: this.data.pageIndex, + rotation: this.rotation + }; + } + return null; + } + reset() { + for (const stream of this._streams) { + stream.reset(); + } + } + _constructFieldName(dict) { + if (!dict.has("T") && !dict.has("Parent")) { + warn("Unknown field name, falling back to empty field name."); + return ""; + } + if (!dict.has("Parent")) { + return stringToPDFString(dict.get("T")); + } + const fieldName = []; + if (dict.has("T")) { + fieldName.unshift(stringToPDFString(dict.get("T"))); + } + let loopDict = dict; + const visited = new RefSet(); + if (dict.objId) { + visited.put(dict.objId); + } + while (loopDict.has("Parent")) { + loopDict = loopDict.get("Parent"); + if (!(loopDict instanceof Dict) || loopDict.objId && visited.has(loopDict.objId)) { + break; + } + if (loopDict.objId) { + visited.put(loopDict.objId); + } + if (loopDict.has("T")) { + fieldName.unshift(stringToPDFString(loopDict.get("T"))); + } + } + return fieldName.join("."); + } +} +class AnnotationBorderStyle { + constructor() { + this.width = 1; + this.rawWidth = 1; + this.style = AnnotationBorderStyleType.SOLID; + this.dashArray = [3]; + this.horizontalCornerRadius = 0; + this.verticalCornerRadius = 0; + } + setWidth(width, rect = [0, 0, 0, 0]) { + if (width instanceof Name) { + this.width = 0; + return; + } + if (typeof width === "number") { + if (width > 0) { + this.rawWidth = width; + const maxWidth = (rect[2] - rect[0]) / 2; + const maxHeight = (rect[3] - rect[1]) / 2; + if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) { + warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`); + width = 1; + } + } + this.width = width; + } + } + setStyle(style) { + if (!(style instanceof Name)) { + return; + } + switch (style.name) { + case "S": + this.style = AnnotationBorderStyleType.SOLID; + break; + case "D": + this.style = AnnotationBorderStyleType.DASHED; + break; + case "B": + this.style = AnnotationBorderStyleType.BEVELED; + break; + case "I": + this.style = AnnotationBorderStyleType.INSET; + break; + case "U": + this.style = AnnotationBorderStyleType.UNDERLINE; + break; + default: + break; + } + } + setDashArray(dashArray, forceStyle = false) { + if (Array.isArray(dashArray)) { + let isValid = true; + let allZeros = true; + for (const element of dashArray) { + const validNumber = +element >= 0; + if (!validNumber) { + isValid = false; + break; + } else if (element > 0) { + allZeros = false; + } + } + if (dashArray.length === 0 || isValid && !allZeros) { + this.dashArray = dashArray; + if (forceStyle) { + this.setStyle(Name.get("D")); + } + } else { + this.width = 0; + } + } else if (dashArray) { + this.width = 0; + } + } + setHorizontalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.horizontalCornerRadius = radius; + } + } + setVerticalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.verticalCornerRadius = radius; + } + } +} +class MarkupAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict + } = params; + if (dict.has("IRT")) { + const rawIRT = dict.getRaw("IRT"); + this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null; + const rt = dict.get("RT"); + this.data.replyType = rt instanceof Name ? rt.name : AnnotationReplyType.REPLY; + } + let popupRef = null; + if (this.data.replyType === AnnotationReplyType.GROUP) { + const parent = dict.get("IRT"); + this.setTitle(parent.get("T")); + this.data.titleObj = this._title; + this.setContents(parent.get("Contents")); + this.data.contentsObj = this._contents; + if (!parent.has("CreationDate")) { + this.data.creationDate = null; + } else { + this.setCreationDate(parent.get("CreationDate")); + this.data.creationDate = this.creationDate; + } + if (!parent.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parent.get("M")); + this.data.modificationDate = this.modificationDate; + } + popupRef = parent.getRaw("Popup"); + if (!parent.has("C")) { + this.data.color = null; + } else { + this.setColor(parent.getArray("C")); + this.data.color = this.color; + } + } else { + this.data.titleObj = this._title; + this.setCreationDate(dict.get("CreationDate")); + this.data.creationDate = this.creationDate; + popupRef = dict.getRaw("Popup"); + if (!dict.has("C")) { + this.data.color = null; + } + } + this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null; + if (dict.has("RC")) { + this.data.richText = XFAFactory.getRichTextAsHtml(dict.get("RC")); + } + } + setCreationDate(creationDate) { + this.creationDate = typeof creationDate === "string" ? creationDate : null; + } + _setDefaultAppearance({ + xref, + extra, + strokeColor, + fillColor, + blendMode, + strokeAlpha, + fillAlpha, + pointsCallback + }) { + let minX = Number.MAX_VALUE; + let minY = Number.MAX_VALUE; + let maxX = Number.MIN_VALUE; + let maxY = Number.MIN_VALUE; + const buffer = ["q"]; + if (extra) { + buffer.push(extra); + } + if (strokeColor) { + buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`); + } + if (fillColor) { + buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); + } + let pointsArray = this.data.quadPoints; + if (!pointsArray) { + pointsArray = Float32Array.from([this.rectangle[0], this.rectangle[3], this.rectangle[2], this.rectangle[3], this.rectangle[0], this.rectangle[1], this.rectangle[2], this.rectangle[1]]); + } + for (let i = 0, ii = pointsArray.length; i < ii; i += 8) { + const [mX, MX, mY, MY] = pointsCallback(buffer, pointsArray.subarray(i, i + 8)); + minX = Math.min(minX, mX); + maxX = Math.max(maxX, MX); + minY = Math.min(minY, mY); + maxY = Math.max(maxY, MY); + } + buffer.push("Q"); + const formDict = new Dict(xref); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("Subtype", Name.get("Form")); + const appearanceStream = new StringStream(buffer.join(" ")); + appearanceStream.dict = appearanceStreamDict; + formDict.set("Fm0", appearanceStream); + const gsDict = new Dict(xref); + if (blendMode) { + gsDict.set("BM", Name.get(blendMode)); + } + if (typeof strokeAlpha === "number") { + gsDict.set("CA", strokeAlpha); + } + if (typeof fillAlpha === "number") { + gsDict.set("ca", fillAlpha); + } + const stateDict = new Dict(xref); + stateDict.set("GS0", gsDict); + const resources = new Dict(xref); + resources.set("ExtGState", stateDict); + resources.set("XObject", formDict); + const appearanceDict = new Dict(xref); + appearanceDict.set("Resources", resources); + const bbox = this.data.rect = [minX, minY, maxX, maxY]; + appearanceDict.set("BBox", bbox); + this.appearance = new StringStream("/GS0 gs /Fm0 Do"); + this.appearance.dict = appearanceDict; + this._streams.push(this.appearance, appearanceStream); + } + static async createNewAnnotation(xref, annotation, changes, params) { + if (!annotation.ref) { + annotation.ref = xref.getNewTemporaryRef(); + } + const annotationRef = annotation.ref; + const ap = await this.createNewAppearanceStream(annotation, xref, params); + let annotationDict; + if (ap) { + const apRef = xref.getNewTemporaryRef(); + annotationDict = this.createNewDict(annotation, xref, { + apRef + }); + changes.put(apRef, { + data: ap + }); + } else { + annotationDict = this.createNewDict(annotation, xref, {}); + } + if (Number.isInteger(annotation.parentTreeId)) { + annotationDict.set("StructParent", annotation.parentTreeId); + } + changes.put(annotationRef, { + data: annotationDict + }); + return { + ref: annotationRef + }; + } + static async createNewPrintAnnotation(annotationGlobals, xref, annotation, params) { + const ap = await this.createNewAppearanceStream(annotation, xref, params); + const annotationDict = this.createNewDict(annotation, xref, ap ? { + ap + } : {}); + const newAnnotation = new this.prototype.constructor({ + dict: annotationDict, + xref, + annotationGlobals, + evaluatorOptions: params.evaluatorOptions + }); + if (annotation.ref) { + newAnnotation.ref = newAnnotation.refToReplace = annotation.ref; + } + return newAnnotation; + } +} +class WidgetAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const data = this.data; + this._needAppearances = params.needAppearances; + data.annotationType = AnnotationType.WIDGET; + if (data.fieldName === undefined) { + data.fieldName = this._constructFieldName(dict); + } + if (data.actions === undefined) { + data.actions = collectActions(xref, dict, AnnotationActionEventType); + } + let fieldValue = getInheritableProperty({ + dict, + key: "V", + getArray: true + }); + data.fieldValue = this._decodeFormValue(fieldValue); + const defaultFieldValue = getInheritableProperty({ + dict, + key: "DV", + getArray: true + }); + data.defaultFieldValue = this._decodeFormValue(defaultFieldValue); + if (fieldValue === undefined && annotationGlobals.xfaDatasets) { + const path = this._title.str; + if (path) { + this._hasValueFromXFA = true; + data.fieldValue = fieldValue = annotationGlobals.xfaDatasets.getValue(path); + } + } + if (fieldValue === undefined && data.defaultFieldValue !== null) { + data.fieldValue = data.defaultFieldValue; + } + data.alternativeText = stringToPDFString(dict.get("TU") || ""); + this.setDefaultAppearance(params); + data.hasAppearance ||= this._needAppearances && data.fieldValue !== undefined && data.fieldValue !== null; + const fieldType = getInheritableProperty({ + dict, + key: "FT" + }); + data.fieldType = fieldType instanceof Name ? fieldType.name : null; + const localResources = getInheritableProperty({ + dict, + key: "DR" + }); + const acroFormResources = annotationGlobals.acroForm.get("DR"); + const appearanceResources = this.appearance?.dict.get("Resources"); + this._fieldResources = { + localResources, + acroFormResources, + appearanceResources, + mergedResources: Dict.merge({ + xref, + dictArray: [localResources, appearanceResources, acroFormResources], + mergeSubDicts: true + }) + }; + data.fieldFlags = getInheritableProperty({ + dict, + key: "Ff" + }); + if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { + data.fieldFlags = 0; + } + data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); + data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED); + data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW); + } + _decodeFormValue(formValue) { + if (Array.isArray(formValue)) { + return formValue.filter(item => typeof item === "string").map(item => stringToPDFString(item)); + } else if (formValue instanceof Name) { + return stringToPDFString(formValue.name); + } else if (typeof formValue === "string") { + return stringToPDFString(formValue); + } + return null; + } + hasFieldFlag(flag) { + return !!(this.data.fieldFlags & flag); + } + _isViewable(flags) { + return true; + } + mustBeViewed(annotationStorage, renderForms) { + if (renderForms) { + return this.viewable; + } + return super.mustBeViewed(annotationStorage, renderForms) && !this._hasFlag(this.flags, AnnotationFlag.NOVIEW); + } + getRotationMatrix(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (rotation === 0) { + return IDENTITY_MATRIX; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + return getRotationMatrix(rotation, width, height); + } + getBorderAndBackgroundAppearances(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (!this.backgroundColor && !this.borderColor) { + return ""; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const rect = rotation === 0 || rotation === 180 ? `0 0 ${width} ${height} re` : `0 0 ${height} ${width} re`; + let str = ""; + if (this.backgroundColor) { + str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `; + } + if (this.borderColor) { + const borderWidth = this.borderStyle.width || 1; + str += `${borderWidth} w ${getPdfColor(this.borderColor, false)} ${rect} S `; + } + return str; + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { + return { + opList: new OperatorList(), + separateForm: true, + separateCanvas: false + }; + } + if (!this._hasText) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + const content = await this._getAppearance(evaluator, task, intent, annotationStorage); + if (this.appearance && content === null) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + const opList = new OperatorList(); + if (!this._defaultAppearance || content === null) { + return { + opList, + separateForm: false, + separateCanvas: false + }; + } + const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); + const matrix = [1, 0, 0, 1, 0, 0]; + const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]; + const transform = getTransformMatrix(this.data.rect, bbox, matrix); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), isUsingOwnCanvas]); + const stream = new StringStream(content); + await evaluator.getOperatorList({ + stream, + task, + resources: this._fieldResources.mergedResources, + operatorList: opList + }); + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas + }; + } + _getMKDict(rotation) { + const mk = new Dict(null); + if (rotation) { + mk.set("R", rotation); + } + if (this.borderColor) { + mk.set("BC", getPdfColorArray(this.borderColor)); + } + if (this.backgroundColor) { + mk.set("BG", getPdfColorArray(this.backgroundColor)); + } + return mk.size > 0 ? mk : null; + } + amendSavedDict(annotationStorage, dict) {} + setValue(dict, value, xref, changes) { + const { + dict: parentDict, + ref: parentRef + } = getParentToUpdate(dict, this.ref, xref); + if (!parentDict) { + dict.set("V", value); + } else if (!changes.has(parentRef)) { + const newParentDict = parentDict.clone(); + newParentDict.set("V", value); + changes.put(parentRef, { + data: newParentDict + }); + return newParentDict; + } + return null; + } + async save(evaluator, task, annotationStorage, changes) { + const storageEntry = annotationStorage?.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let value = storageEntry?.value, + rotation = storageEntry?.rotation; + if (value === this.data.fieldValue || value === undefined) { + if (!this._hasValueFromXFA && rotation === undefined && flags === undefined) { + return; + } + value ||= this.data.fieldValue; + } + if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) { + return; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let appearance = null; + if (!this._needAppearances) { + appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage); + if (appearance === null && flags === undefined) { + return; + } + } else {} + let needAppearances = false; + if (appearance?.needAppearances) { + needAppearances = true; + appearance = null; + } + const { + xref + } = evaluator; + const originalDict = xref.fetchIfRef(this.ref); + if (!(originalDict instanceof Dict)) { + return; + } + const dict = new Dict(xref); + for (const key of originalDict.getKeys()) { + if (key !== "AP") { + dict.set(key, originalDict.getRaw(key)); + } + } + if (flags !== undefined) { + dict.set("F", flags); + if (appearance === null && !needAppearances) { + const ap = originalDict.getRaw("AP"); + if (ap) { + dict.set("AP", ap); + } + } + } + const xfa = { + path: this.data.fieldName, + value + }; + const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes); + this.amendSavedDict(annotationStorage, newParentDict || dict); + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances + }); + if (appearance !== null) { + const newRef = xref.getNewTemporaryRef(); + const AP = new Dict(xref); + dict.set("AP", AP); + AP.set("N", newRef); + const resources = this._getSaveFieldResources(xref); + const appearanceStream = new StringStream(appearance); + const appearanceDict = appearanceStream.dict = new Dict(xref); + appearanceDict.set("Subtype", Name.get("Form")); + appearanceDict.set("Resources", resources); + appearanceDict.set("BBox", [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]); + const rotationMatrix = this.getRotationMatrix(annotationStorage); + if (rotationMatrix !== IDENTITY_MATRIX) { + appearanceDict.set("Matrix", rotationMatrix); + } + changes.put(newRef, { + data: appearanceStream, + xfa: null, + needAppearances: false + }); + } + dict.set("M", `D:${getModificationDate()}`); + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + const isPassword = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); + if (isPassword) { + return null; + } + const storageEntry = annotationStorage?.get(this.data.id); + let value, rotation; + if (storageEntry) { + value = storageEntry.formattedValue || storageEntry.value; + rotation = storageEntry.rotation; + } + if (rotation === undefined && value === undefined && !this._needAppearances) { + if (!this._hasValueFromXFA || this.appearance) { + return null; + } + } + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + if (value === undefined) { + value = this.data.fieldValue; + if (!value) { + return `/Tx BMC q ${colors}Q EMC`; + } + } + if (Array.isArray(value) && value.length === 1) { + value = value[0]; + } + assert(typeof value === "string", "Expected `value` to be a string."); + value = value.trimEnd(); + if (this.data.combo) { + const option = this.data.options.find(({ + exportValue + }) => value === exportValue); + value = option?.displayValue || value; + } + if (value === "") { + return `/Tx BMC q ${colors}Q EMC`; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let lineCount = -1; + let lines; + if (this.data.multiLine) { + lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC")); + lineCount = lines.length; + } else { + lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); + } + let font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); + let defaultAppearance, fontSize, lineHeight; + const encodedLines = []; + let encodingError = false; + for (const line of lines) { + const encodedString = font.encodeString(line); + if (encodedString.length > 1) { + encodingError = true; + } + encodedLines.push(encodedString.join("")); + } + if (encodingError && intent & RenderingIntentFlag.SAVE) { + return { + needAppearances: true + }; + } + if (encodingError && this._isOffscreenCanvasSupported) { + const fontFamily = this.data.comb ? "monospace" : "sans-serif"; + const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily); + const resources = fakeUnicodeFont.createFontResources(lines.join("")); + const newFont = resources.getRaw("Font"); + if (this._fieldResources.mergedResources.has("Font")) { + const oldFont = this._fieldResources.mergedResources.get("Font"); + for (const key of newFont.getKeys()) { + oldFont.set(key, newFont.getRaw(key)); + } + } else { + this._fieldResources.mergedResources.set("Font", newFont); + } + const fontName = fakeUnicodeFont.fontName.name; + font = await WidgetAnnotation._getFontData(evaluator, task, { + fontName, + fontSize: 0 + }, resources); + for (let i = 0, ii = encodedLines.length; i < ii; i++) { + encodedLines[i] = stringToUTF16String(lines[i]); + } + const savedDefaultAppearance = Object.assign(Object.create(null), this.data.defaultAppearanceData); + this.data.defaultAppearanceData.fontSize = 0; + this.data.defaultAppearanceData.fontName = fontName; + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); + this.data.defaultAppearanceData = savedDefaultAppearance; + } else { + if (!this._isOffscreenCanvasSupported) { + warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly."); + } + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); + } + let descent = font.descent; + if (isNaN(descent)) { + descent = BASELINE_FACTOR * lineHeight; + } else { + descent = Math.max(BASELINE_FACTOR * lineHeight, Math.abs(descent) * fontSize); + } + const defaultVPadding = Math.min(Math.floor((totalHeight - fontSize) / 2), defaultPadding); + const alignment = this.data.textAlignment; + if (this.data.multiLine) { + return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); + } + if (this.data.comb) { + return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); + } + const bottomPadding = defaultVPadding + descent; + if (alignment === 0 || alignment > 2) { + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(bottomPadding)} Tm (${escapeString(encodedLines[0])}) Tj` + " ET Q EMC"; + } + const prevInfo = { + shift: 0 + }; + const renderedText = this._renderText(encodedLines[0], font, fontSize, totalWidth, alignment, prevInfo, defaultHPadding, bottomPadding); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC"; + } + static async _getFontData(evaluator, task, appearanceData, resources) { + const operatorList = new OperatorList(); + const initialState = { + font: null, + clone() { + return this; + } + }; + const { + fontName, + fontSize + } = appearanceData; + await evaluator.handleSetFont(resources, [fontName && Name.get(fontName), fontSize], null, operatorList, task, initialState, null); + return initialState.font; + } + _getTextWidth(text, font) { + return font.charsToGlyphs(text).reduce((width, glyph) => width + glyph.width, 0) / 1000; + } + _computeFontSize(height, width, text, font, lineCount) { + let { + fontSize + } = this.data.defaultAppearanceData; + let lineHeight = (fontSize || 12) * LINE_FACTOR, + numberOfLines = Math.round(height / lineHeight); + if (!fontSize) { + const roundWithTwoDigits = x => Math.floor(x * 100) / 100; + if (lineCount === -1) { + const textWidth = this._getTextWidth(text, font); + fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, width / textWidth)); + numberOfLines = 1; + } else { + const lines = text.split(/\r\n?|\n/); + const cachedLines = []; + for (const line of lines) { + const encoded = font.encodeString(line).join(""); + const glyphs = font.charsToGlyphs(encoded); + const positions = font.getCharPositions(encoded); + cachedLines.push({ + line: encoded, + glyphs, + positions + }); + } + const isTooBig = fsize => { + let totalHeight = 0; + for (const cache of cachedLines) { + const chunks = this._splitLine(null, font, fsize, width, cache); + totalHeight += chunks.length * fsize; + if (totalHeight > height) { + return true; + } + } + return false; + }; + numberOfLines = Math.max(numberOfLines, lineCount); + while (true) { + lineHeight = height / numberOfLines; + fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR); + if (isTooBig(fontSize)) { + numberOfLines++; + continue; + } + break; + } + } + const { + fontName, + fontColor + } = this.data.defaultAppearanceData; + this._defaultAppearance = createDefaultAppearance({ + fontSize, + fontName, + fontColor + }); + } + return [this._defaultAppearance, fontSize, height / numberOfLines]; + } + _renderText(text, font, fontSize, totalWidth, alignment, prevInfo, hPadding, vPadding) { + let shift; + if (alignment === 1) { + const width = this._getTextWidth(text, font) * fontSize; + shift = (totalWidth - width) / 2; + } else if (alignment === 2) { + const width = this._getTextWidth(text, font) * fontSize; + shift = totalWidth - width - hPadding; + } else { + shift = hPadding; + } + const shiftStr = numberToString(shift - prevInfo.shift); + prevInfo.shift = shift; + vPadding = numberToString(vPadding); + return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`; + } + _getSaveFieldResources(xref) { + const { + localResources, + appearanceResources, + acroFormResources + } = this._fieldResources; + const fontName = this.data.defaultAppearanceData?.fontName; + if (!fontName) { + return localResources || Dict.empty; + } + for (const resources of [localResources, appearanceResources]) { + if (resources instanceof Dict) { + const localFont = resources.get("Font"); + if (localFont instanceof Dict && localFont.has(fontName)) { + return resources; + } + } + } + if (acroFormResources instanceof Dict) { + const acroFormFont = acroFormResources.get("Font"); + if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) { + const subFontDict = new Dict(xref); + subFontDict.set(fontName, acroFormFont.getRaw(fontName)); + const subResourcesDict = new Dict(xref); + subResourcesDict.set("Font", subFontDict); + return Dict.merge({ + xref, + dictArray: [subResourcesDict, localResources], + mergeSubDicts: true + }); + } + } + return localResources || Dict.empty; + } + getFieldObject() { + return null; + } +} +class TextWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + const { + dict + } = params; + if (dict.has("PMD")) { + this.flags |= AnnotationFlag.HIDDEN; + this.data.hidden = true; + warn("Barcodes are not supported"); + } + this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; + this._hasText = true; + if (typeof this.data.fieldValue !== "string") { + this.data.fieldValue = ""; + } + let alignment = getInheritableProperty({ + dict, + key: "Q" + }); + if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) { + alignment = null; + } + this.data.textAlignment = alignment; + let maximumLength = getInheritableProperty({ + dict, + key: "MaxLen" + }); + if (!Number.isInteger(maximumLength) || maximumLength < 0) { + maximumLength = 0; + } + this.data.maxLen = maximumLength; + this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); + this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; + this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL); + } + get hasTextContent() { + return !!this.appearance && !this._needAppearances; + } + _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, hPadding, vPadding, descent, lineHeight, annotationStorage) { + const combWidth = width / this.data.maxLen; + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const buf = []; + const positions = font.getCharPositions(text); + for (const [start, end] of positions) { + buf.push(`(${escapeString(text.substring(start, end))}) Tj`); + } + const renderedComb = buf.join(` ${numberToString(combWidth)} 0 Td `); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hPadding)} ${numberToString(vPadding + descent)} Tm ${renderedComb}` + " ET Q EMC"; + } + _getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) { + const buf = []; + const totalWidth = width - 2 * hPadding; + const prevInfo = { + shift: 0 + }; + for (let i = 0, ii = lines.length; i < ii; i++) { + const line = lines[i]; + const chunks = this._splitLine(line, font, fontSize, totalWidth); + for (let j = 0, jj = chunks.length; j < jj; j++) { + const chunk = chunks[j]; + const vShift = i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight; + buf.push(this._renderText(chunk, font, fontSize, width, alignment, prevInfo, hPadding, vShift)); + } + } + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const renderedText = buf.join("\n"); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` + " ET Q EMC"; + } + _splitLine(line, font, fontSize, width, cache = {}) { + line = cache.line || line; + const glyphs = cache.glyphs || font.charsToGlyphs(line); + if (glyphs.length <= 1) { + return [line]; + } + const positions = cache.positions || font.getCharPositions(line); + const scale = fontSize / 1000; + const chunks = []; + let lastSpacePosInStringStart = -1, + lastSpacePosInStringEnd = -1, + lastSpacePos = -1, + startChunk = 0, + currentWidth = 0; + for (let i = 0, ii = glyphs.length; i < ii; i++) { + const [start, end] = positions[i]; + const glyph = glyphs[i]; + const glyphWidth = glyph.width * scale; + if (glyph.unicode === " ") { + if (currentWidth + glyphWidth > width) { + chunks.push(line.substring(startChunk, start)); + startChunk = start; + currentWidth = glyphWidth; + lastSpacePosInStringStart = -1; + lastSpacePos = -1; + } else { + currentWidth += glyphWidth; + lastSpacePosInStringStart = start; + lastSpacePosInStringEnd = end; + lastSpacePos = i; + } + } else if (currentWidth + glyphWidth > width) { + if (lastSpacePosInStringStart !== -1) { + chunks.push(line.substring(startChunk, lastSpacePosInStringEnd)); + startChunk = lastSpacePosInStringEnd; + i = lastSpacePos + 1; + lastSpacePosInStringStart = -1; + currentWidth = 0; + } else { + chunks.push(line.substring(startChunk, start)); + startChunk = start; + currentWidth = glyphWidth; + } + } else { + currentWidth += glyphWidth; + } + } + if (startChunk < line.length) { + chunks.push(line.substring(startChunk, line.length)); + } + return chunks; + } + async extractTextContent(evaluator, task, viewBox) { + await super.extractTextContent(evaluator, task, viewBox); + const text = this.data.textContent; + if (!text) { + return; + } + const allText = text.join("\n"); + if (allText === this.data.fieldValue) { + return; + } + const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => p1 ? `\\${p1}` : "\\s+"); + if (new RegExp(`^\\s*${regex}\\s*$`).test(this.data.fieldValue)) { + this.data.textContent = this.data.fieldValue.split("\n"); + } + } + getFieldObject() { + return { + id: this.data.id, + value: this.data.fieldValue, + defaultValue: this.data.defaultFieldValue || "", + multiline: this.data.multiLine, + password: this.hasFieldFlag(AnnotationFieldFlag.PASSWORD), + charLimit: this.data.maxLen, + comb: this.data.comb, + editable: !this.data.readOnly, + hidden: this.data.hidden, + name: this.data.fieldName, + rect: this.data.rect, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type: "text" + }; + } +} +class ButtonWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this.checkedAppearance = null; + this.uncheckedAppearance = null; + this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.isTooltipOnly = false; + if (this.data.checkBox) { + this._processCheckBox(params); + } else if (this.data.radioButton) { + this._processRadioButton(params); + } else if (this.data.pushButton) { + this.data.hasOwnCanvas = true; + this.data.noHTML = false; + this._processPushButton(params); + } else { + warn("Invalid field flags for button widget annotation"); + } + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (this.data.pushButton) { + return super.getOperatorList(evaluator, task, intent, false, annotationStorage); + } + let value = null; + let rotation = null; + if (annotationStorage) { + const storageEntry = annotationStorage.get(this.data.id); + value = storageEntry ? storageEntry.value : null; + rotation = storageEntry ? storageEntry.rotation : null; + } + if (value === null && this.appearance) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + if (value === null || value === undefined) { + value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue; + } + const appearance = value ? this.checkedAppearance : this.uncheckedAppearance; + if (appearance) { + const savedAppearance = this.appearance; + const savedMatrix = lookupMatrix(appearance.dict.getArray("Matrix"), IDENTITY_MATRIX); + if (rotation) { + appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); + } + this.appearance = appearance; + const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage); + this.appearance = savedAppearance; + appearance.dict.set("Matrix", savedMatrix); + return operatorList; + } + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + async save(evaluator, task, annotationStorage, changes) { + if (this.data.checkBox) { + this._saveCheckbox(evaluator, task, annotationStorage, changes); + return; + } + if (this.data.radioButton) { + this._saveRadioButton(evaluator, task, annotationStorage, changes); + } + } + async _saveCheckbox(evaluator, task, annotationStorage, changes) { + if (!annotationStorage) { + return; + } + const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let rotation = storageEntry?.rotation, + value = storageEntry?.value; + if (rotation === undefined && flags === undefined) { + if (value === undefined) { + return; + } + const defaultValue = this.data.fieldValue === this.data.exportValue; + if (defaultValue === value) { + return; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return; + } + dict = dict.clone(); + if (rotation === undefined) { + rotation = this.rotation; + } + if (value === undefined) { + value = this.data.fieldValue === this.data.exportValue; + } + const xfa = { + path: this.data.fieldName, + value: value ? this.data.exportValue : "" + }; + const name = Name.get(value ? this.data.exportValue : "Off"); + this.setValue(dict, name, evaluator.xref, changes); + dict.set("AS", name); + dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); + } + async _saveRadioButton(evaluator, task, annotationStorage, changes) { + if (!annotationStorage) { + return; + } + const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let rotation = storageEntry?.rotation, + value = storageEntry?.value; + if (rotation === undefined && flags === undefined) { + if (value === undefined) { + return; + } + const defaultValue = this.data.fieldValue === this.data.buttonValue; + if (defaultValue === value) { + return; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return; + } + dict = dict.clone(); + if (value === undefined) { + value = this.data.fieldValue === this.data.buttonValue; + } + if (rotation === undefined) { + rotation = this.rotation; + } + const xfa = { + path: this.data.fieldName, + value: value ? this.data.buttonValue : "" + }; + const name = Name.get(value ? this.data.buttonValue : "Off"); + if (value) { + this.setValue(dict, name, evaluator.xref, changes); + } + dict.set("AS", name); + dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); + } + _getDefaultCheckedAppearance(params, type) { + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const bbox = [0, 0, width, height]; + const FONT_RATIO = 0.8; + const fontSize = Math.min(width, height) * FONT_RATIO; + let metrics, char; + if (type === "check") { + metrics = { + width: 0.755 * fontSize, + height: 0.705 * fontSize + }; + char = "\x33"; + } else if (type === "disc") { + metrics = { + width: 0.791 * fontSize, + height: 0.705 * fontSize + }; + char = "\x6C"; + } else { + unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`); + } + const xShift = numberToString((width - metrics.width) / 2); + const yShift = numberToString((height - metrics.height) / 2); + const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; + const appearanceStreamDict = new Dict(params.xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", bbox); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(params.xref); + const font = new Dict(params.xref); + font.set("PdfJsZaDb", this.fallbackFontDict); + resources.set("Font", font); + appearanceStreamDict.set("Resources", resources); + this.checkedAppearance = new StringStream(appearance); + this.checkedAppearance.dict = appearanceStreamDict; + this._streams.push(this.checkedAppearance); + } + _processCheckBox(params) { + const customAppearance = params.dict.get("AP"); + if (!(customAppearance instanceof Dict)) { + return; + } + const normalAppearance = customAppearance.get("N"); + if (!(normalAppearance instanceof Dict)) { + return; + } + const asValue = this._decodeFormValue(params.dict.get("AS")); + if (typeof asValue === "string") { + this.data.fieldValue = asValue; + } + const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes"; + const exportValues = normalAppearance.getKeys(); + if (exportValues.length === 0) { + exportValues.push("Off", yes); + } else if (exportValues.length === 1) { + if (exportValues[0] === "Off") { + exportValues.push(yes); + } else { + exportValues.unshift("Off"); + } + } else if (exportValues.includes(yes)) { + exportValues.length = 0; + exportValues.push("Off", yes); + } else { + const otherYes = exportValues.find(v => v !== "Off"); + exportValues.length = 0; + exportValues.push("Off", otherYes); + } + if (!exportValues.includes(this.data.fieldValue)) { + this.data.fieldValue = "Off"; + } + this.data.exportValue = exportValues[1]; + const checkedAppearance = normalAppearance.get(this.data.exportValue); + this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; + const uncheckedAppearance = normalAppearance.get("Off"); + this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "check"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); + } + this._fallbackFontDict = this.fallbackFontDict; + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; + } + } + _processRadioButton(params) { + this.data.buttonValue = null; + const fieldParent = params.dict.get("Parent"); + if (fieldParent instanceof Dict) { + this.parent = params.dict.getRaw("Parent"); + const fieldParentValue = fieldParent.get("V"); + if (fieldParentValue instanceof Name) { + this.data.fieldValue = this._decodeFormValue(fieldParentValue); + } + } + const appearanceStates = params.dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return; + } + const normalAppearance = appearanceStates.get("N"); + if (!(normalAppearance instanceof Dict)) { + return; + } + for (const key of normalAppearance.getKeys()) { + if (key !== "Off") { + this.data.buttonValue = this._decodeFormValue(key); + break; + } + } + const checkedAppearance = normalAppearance.get(this.data.buttonValue); + this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; + const uncheckedAppearance = normalAppearance.get("Off"); + this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "disc"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); + } + this._fallbackFontDict = this.fallbackFontDict; + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; + } + } + _processPushButton(params) { + const { + dict, + annotationGlobals + } = params; + if (!dict.has("A") && !dict.has("AA") && !this.data.alternativeText) { + warn("Push buttons without action dictionaries are not supported"); + return; + } + this.data.isTooltipOnly = !dict.has("A") && !dict.has("AA"); + Catalog.parseDestDictionary({ + destDict: dict, + resultObj: this.data, + docBaseUrl: annotationGlobals.baseUrl, + docAttachments: annotationGlobals.attachments + }); + } + getFieldObject() { + let type = "button"; + let exportValues; + if (this.data.checkBox) { + type = "checkbox"; + exportValues = this.data.exportValue; + } else if (this.data.radioButton) { + type = "radiobutton"; + exportValues = this.data.buttonValue; + } + return { + id: this.data.id, + value: this.data.fieldValue || "Off", + defaultValue: this.data.defaultFieldValue, + exportValues, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + hidden: this.data.hidden, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + get fallbackFontDict() { + const dict = new Dict(); + dict.set("BaseFont", Name.get("ZapfDingbats")); + dict.set("Type", Name.get("FallbackType")); + dict.set("Subtype", Name.get("FallbackType")); + dict.set("Encoding", Name.get("ZapfDingbatsEncoding")); + return shadow(this, "fallbackFontDict", dict); + } +} +class ChoiceWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.indices = dict.getArray("I"); + this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0; + this.data.options = []; + const options = getInheritableProperty({ + dict, + key: "Opt" + }); + if (Array.isArray(options)) { + for (let i = 0, ii = options.length; i < ii; i++) { + const option = xref.fetchIfRef(options[i]); + const isOptionArray = Array.isArray(option); + this.data.options[i] = { + exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option), + displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option) + }; + } + } + if (!this.hasIndices) { + if (typeof this.data.fieldValue === "string") { + this.data.fieldValue = [this.data.fieldValue]; + } else if (!this.data.fieldValue) { + this.data.fieldValue = []; + } + } else { + this.data.fieldValue = []; + const ii = this.data.options.length; + for (const i of this.indices) { + if (Number.isInteger(i) && i >= 0 && i < ii) { + this.data.fieldValue.push(this.data.options[i].exportValue); + } + } + } + if (this.data.options.length === 0 && this.data.fieldValue.length > 0) { + this.data.options = this.data.fieldValue.map(value => ({ + exportValue: value, + displayValue: value + })); + } + this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); + this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); + this._hasText = true; + } + getFieldObject() { + const type = this.data.combo ? "combobox" : "listbox"; + const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null; + return { + id: this.data.id, + value, + defaultValue: this.data.defaultFieldValue, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + numItems: this.data.fieldValue.length, + multipleSelection: this.data.multiSelect, + hidden: this.data.hidden, + actions: this.data.actions, + items: this.data.options, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + amendSavedDict(annotationStorage, dict) { + if (!this.hasIndices) { + return; + } + let values = annotationStorage?.get(this.data.id)?.value; + if (!Array.isArray(values)) { + values = [values]; + } + const indices = []; + const { + options + } = this.data; + for (let i = 0, j = 0, ii = options.length; i < ii; i++) { + if (options[i].exportValue === values[j]) { + indices.push(i); + j += 1; + } + } + dict.set("I", indices); + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + if (this.data.combo) { + return super._getAppearance(evaluator, task, intent, annotationStorage); + } + let exportedValue, rotation; + const storageEntry = annotationStorage?.get(this.data.id); + if (storageEntry) { + rotation = storageEntry.rotation; + exportedValue = storageEntry.value; + } + if (rotation === undefined && exportedValue === undefined && !this._needAppearances) { + return null; + } + if (exportedValue === undefined) { + exportedValue = this.data.fieldValue; + } else if (!Array.isArray(exportedValue)) { + exportedValue = [exportedValue]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + const lineCount = this.data.options.length; + const valueIndices = []; + for (let i = 0; i < lineCount; i++) { + const { + exportValue + } = this.data.options[i]; + if (exportedValue.includes(exportValue)) { + valueIndices.push(i); + } + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); + } + const font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); + let defaultAppearance; + let { + fontSize + } = this.data.defaultAppearanceData; + if (!fontSize) { + const lineHeight = (totalHeight - defaultPadding) / lineCount; + let lineWidth = -1; + let value; + for (const { + displayValue + } of this.data.options) { + const width = this._getTextWidth(displayValue, font); + if (width > lineWidth) { + lineWidth = width; + value = displayValue; + } + } + [defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1); + } else { + defaultAppearance = this._defaultAppearance; + } + const lineHeight = fontSize * LINE_FACTOR; + const vPadding = (lineHeight - fontSize) / 2; + const numberOfVisibleLines = Math.floor(totalHeight / lineHeight); + let firstIndex = 0; + if (valueIndices.length > 0) { + const minIndex = Math.min(...valueIndices); + const maxIndex = Math.max(...valueIndices); + firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1); + if (firstIndex > minIndex) { + firstIndex = minIndex; + } + } + const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount); + const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`]; + if (valueIndices.length) { + buf.push("0.600006 0.756866 0.854904 rg"); + for (const index of valueIndices) { + if (firstIndex <= index && index < end) { + buf.push(`1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`); + } + } + } + buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`); + const prevInfo = { + shift: 0 + }; + for (let i = firstIndex; i < end; i++) { + const { + displayValue + } = this.data.options[i]; + const vpadding = i === firstIndex ? vPadding : 0; + buf.push(this._renderText(displayValue, font, fontSize, totalWidth, 0, prevInfo, defaultHPadding, -lineHeight + vpadding)); + } + buf.push("ET Q EMC"); + return buf.join("\n"); + } +} +class SignatureWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this.data.fieldValue = null; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = !this.data.hasOwnCanvas; + } + getFieldObject() { + return { + id: this.data.id, + value: null, + page: this.data.pageIndex, + type: "signature" + }; + } +} +class TextAnnotation extends MarkupAnnotation { + constructor(params) { + const DEFAULT_ICON_SIZE = 22; + super(params); + this.data.noRotate = true; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const { + dict + } = params; + this.data.annotationType = AnnotationType.TEXT; + if (this.data.hasAppearance) { + this.data.name = "NoIcon"; + } else { + this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; + this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; + this.data.name = dict.has("Name") ? dict.get("Name").name : "Note"; + } + if (dict.has("State")) { + this.data.state = dict.get("State") || null; + this.data.stateModel = dict.get("StateModel") || null; + } else { + this.data.state = null; + this.data.stateModel = null; + } + } +} +class LinkAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict, + annotationGlobals + } = params; + this.data.annotationType = AnnotationType.LINK; + this.data.noHTML = false; + const quadPoints = getQuadPoints(dict, this.rectangle); + if (quadPoints) { + this.data.quadPoints = quadPoints; + } + this.data.borderColor ||= this.data.color; + Catalog.parseDestDictionary({ + destDict: dict, + resultObj: this.data, + docBaseUrl: annotationGlobals.baseUrl, + docAttachments: annotationGlobals.attachments + }); + } +} +class PopupAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict + } = params; + this.data.annotationType = AnnotationType.POPUP; + this.data.noHTML = false; + if (this.data.rect[0] === this.data.rect[2] || this.data.rect[1] === this.data.rect[3]) { + this.data.rect = null; + } + let parentItem = dict.get("Parent"); + if (!parentItem) { + warn("Popup annotation has a missing or invalid parent annotation."); + return; + } + this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null); + const rt = parentItem.get("RT"); + if (isName(rt, AnnotationReplyType.GROUP)) { + parentItem = parentItem.get("IRT"); + } + if (!parentItem.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parentItem.get("M")); + this.data.modificationDate = this.modificationDate; + } + if (!parentItem.has("C")) { + this.data.color = null; + } else { + this.setColor(parentItem.getArray("C")); + this.data.color = this.color; + } + if (!this.viewable) { + const parentFlags = parentItem.get("F"); + if (this._isViewable(parentFlags)) { + this.setFlags(parentFlags); + } + } + this.setTitle(parentItem.get("T")); + this.data.titleObj = this._title; + this.setContents(parentItem.get("Contents")); + this.data.contentsObj = this._contents; + if (parentItem.has("RC")) { + this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC")); + } + this.data.open = !!dict.get("Open"); + } +} +class FreeTextAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + const { + evaluatorOptions, + xref + } = params; + this.data.annotationType = AnnotationType.FREETEXT; + this.setDefaultAppearance(params); + this._hasAppearance = !!this.appearance; + if (this._hasAppearance) { + const { + fontColor, + fontSize + } = parseAppearanceStream(this.appearance, evaluatorOptions, xref); + this.data.defaultAppearanceData.fontColor = fontColor; + this.data.defaultAppearanceData.fontSize = fontSize || 10; + } else { + this.data.defaultAppearanceData.fontSize ||= 10; + const { + fontColor, + fontSize + } = this.data.defaultAppearanceData; + if (this._contents.str) { + this.data.textContent = this._contents.str.split(/\r\n?|\n/).map(line => line.trimEnd()); + const { + coords, + bbox, + matrix + } = FakeUnicodeFont.getFirstPositionInfo(this.rectangle, this.rotation, fontSize); + this.data.textPosition = this._transformPoint(coords, bbox, matrix); + } + if (this._isOffscreenCanvasSupported) { + const strokeAlpha = params.dict.get("CA"); + const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif"); + this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontSize, fontColor, strokeAlpha); + this._streams.push(this.appearance); + } else { + warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly."); + } + } + } + get hasTextContent() { + return this._hasAppearance; + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + color, + fontSize, + oldAnnotation, + rect, + rotation, + user, + value + } = annotation; + const freetext = oldAnnotation || new Dict(xref); + freetext.set("Type", Name.get("Annot")); + freetext.set("Subtype", Name.get("FreeText")); + if (oldAnnotation) { + freetext.set("M", `D:${getModificationDate()}`); + freetext.delete("RC"); + } else { + freetext.set("CreationDate", `D:${getModificationDate()}`); + } + freetext.set("Rect", rect); + const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; + freetext.set("DA", da); + freetext.set("Contents", stringToAsciiOrUTF16BE(value)); + freetext.set("F", 4); + freetext.set("Border", [0, 0, 0]); + freetext.set("Rotate", rotation); + if (user) { + freetext.set("T", stringToAsciiOrUTF16BE(user)); + } + if (apRef || ap) { + const n = new Dict(xref); + freetext.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + } + return freetext; + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + baseFontRef, + evaluator, + task + } = params; + const { + color, + fontSize, + rect, + rotation, + value + } = annotation; + const resources = new Dict(xref); + const font = new Dict(xref); + if (baseFontRef) { + font.set("Helv", baseFontRef); + } else { + const baseFont = new Dict(xref); + baseFont.set("BaseFont", Name.get("Helvetica")); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type1")); + baseFont.set("Encoding", Name.get("WinAnsiEncoding")); + font.set("Helv", baseFont); + } + resources.set("Font", font); + const helv = await WidgetAnnotation._getFontData(evaluator, task, { + fontName: "Helv", + fontSize + }, resources); + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + const lines = value.split("\n"); + const scale = fontSize / 1000; + let totalWidth = -Infinity; + const encodedLines = []; + for (let line of lines) { + const encoded = helv.encodeString(line); + if (encoded.length > 1) { + return null; + } + line = encoded.join(""); + encodedLines.push(line); + let lineWidth = 0; + const glyphs = helv.charsToGlyphs(line); + for (const glyph of glyphs) { + lineWidth += glyph.width * scale; + } + totalWidth = Math.max(totalWidth, lineWidth); + } + let hscale = 1; + if (totalWidth > w) { + hscale = w / totalWidth; + } + let vscale = 1; + const lineHeight = LINE_FACTOR * fontSize; + const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize; + const totalHeight = lineHeight * lines.length; + if (totalHeight > h) { + vscale = h / totalHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + let firstPoint, clipBox, matrix; + switch (rotation) { + case 0: + matrix = [1, 0, 0, 1]; + clipBox = [rect[0], rect[1], w, h]; + firstPoint = [rect[0], rect[3] - lineAscent]; + break; + case 90: + matrix = [0, 1, -1, 0]; + clipBox = [rect[1], -rect[2], w, h]; + firstPoint = [rect[1], -rect[0] - lineAscent]; + break; + case 180: + matrix = [-1, 0, 0, -1]; + clipBox = [-rect[2], -rect[3], w, h]; + firstPoint = [-rect[2], -rect[1] - lineAscent]; + break; + case 270: + matrix = [0, -1, 1, 0]; + clipBox = [-rect[3], rect[0], w, h]; + firstPoint = [-rect[3], rect[2] - lineAscent]; + break; + } + const buffer = ["q", `${matrix.join(" ")} 0 0 cm`, `${clipBox.join(" ")} re W n`, `BT`, `${getPdfColor(color, true)}`, `0 Tc /Helv ${numberToString(newFontSize)} Tf`]; + buffer.push(`${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`); + const vShift = numberToString(lineHeight); + for (let i = 1, ii = encodedLines.length; i < ii; i++) { + const line = encodedLines[i]; + buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Resources", resources); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]); + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class LineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.LINE; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]); + this.data.lineCoordinates = Util.normalizeRect(lineCoordinates); + this.setLineEndings(dict.getArray("LE")); + this.data.lineEndings = this.lineEndings; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust]; + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S"); + return [points[0] - borderWidth, points[2] + borderWidth, points[7] - borderWidth, points[3] + borderWidth]; + } + }); + } + } +} +class SquareAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.SQUARE; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + this._setDefaultAppearance({ + xref, + extra: `${this.borderStyle.width} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x = points[4] + this.borderStyle.width / 2; + const y = points[5] + this.borderStyle.width / 2; + const width = points[6] - points[4] - this.borderStyle.width; + const height = points[3] - points[7] - this.borderStyle.width; + buffer.push(`${x} ${y} ${width} ${height} re`); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } +} +class CircleAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.CIRCLE; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4)); + this._setDefaultAppearance({ + xref, + extra: `${this.borderStyle.width} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x0 = points[0] + this.borderStyle.width / 2; + const y0 = points[1] - this.borderStyle.width / 2; + const x1 = points[6] - this.borderStyle.width / 2; + const y1 = points[7] + this.borderStyle.width / 2; + const xMid = x0 + (x1 - x0) / 2; + const yMid = y0 + (y1 - y0) / 2; + const xOffset = (x1 - x0) / 2 * controlPointsDistance; + const yOffset = (y1 - y0) / 2 * controlPointsDistance; + buffer.push(`${xMid} ${y1} m`, `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`, `${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`, `${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`, `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`, "h"); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } +} +class PolylineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.POLYLINE; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + this.data.vertices = null; + if (!(this instanceof PolygonAnnotation)) { + this.setLineEndings(dict.getArray("LE")); + this.data.lineEndings = this.lineEndings; + } + const rawVertices = dict.getArray("Vertices"); + if (!isNumberArray(rawVertices, null)) { + return; + } + const vertices = this.data.vertices = Float32Array.from(rawVertices); + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], vertices[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], vertices[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], vertices[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], vertices[i + 1] + borderAdjust); + } + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`); + } + buffer.push("S"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } +} +class PolygonAnnotation extends PolylineAnnotation { + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.POLYGON; + } +} +class CaretAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.CARET; + } +} +class InkAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.INK; + this.data.inkLists = []; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; + const rawInkLists = dict.getArray("InkList"); + if (!Array.isArray(rawInkLists)) { + return; + } + for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { + if (!Array.isArray(rawInkLists[i])) { + continue; + } + const inkList = new Float32Array(rawInkLists[i].length); + this.data.inkLists.push(inkList); + for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { + const x = xref.fetchIfRef(rawInkLists[i][j]), + y = xref.fetchIfRef(rawInkLists[i][j + 1]); + if (typeof x === "number" && typeof y === "number") { + inkList[j] = x; + inkList[j + 1] = y; + } + } + } + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], inkList[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], inkList[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], inkList[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], inkList[i + 1] + borderAdjust); + } + } + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`); + } + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + oldAnnotation, + color, + opacity, + paths, + outlines, + rect, + rotation, + thickness, + user + } = annotation; + const ink = oldAnnotation || new Dict(xref); + ink.set("Type", Name.get("Annot")); + ink.set("Subtype", Name.get("Ink")); + ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); + ink.set("Rect", rect); + ink.set("InkList", outlines?.points || paths.points); + ink.set("F", 4); + ink.set("Rotate", rotation); + if (user) { + ink.set("T", stringToAsciiOrUTF16BE(user)); + } + if (outlines) { + ink.set("IT", Name.get("InkHighlight")); + } + const bs = new Dict(xref); + ink.set("BS", bs); + bs.set("W", thickness); + ink.set("C", Array.from(color, c => c / 255)); + ink.set("CA", opacity); + const n = new Dict(xref); + ink.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + return ink; + } + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.outlines) { + return this.createNewAppearanceStreamForHighlight(annotation, xref, params); + } + const { + color, + rect, + paths, + thickness, + opacity + } = annotation; + const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`]; + if (opacity !== 1) { + appearanceBuffer.push("/R0 gs"); + } + for (const outline of paths.lines) { + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); + } else { + const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); + appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); + } + } + if (outline.length === 6) { + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} l`); + } + } + appearanceBuffer.push("S"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + if (opacity !== 1) { + const resources = new Dict(xref); + const extGState = new Dict(xref); + const r0 = new Dict(xref); + r0.set("CA", opacity); + r0.set("Type", Name.get("ExtGState")); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } + static async createNewAppearanceStreamForHighlight(annotation, xref, params) { + const { + color, + rect, + outlines: { + outline + }, + opacity + } = annotation; + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); + } else { + const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); + appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); + } + } + appearanceBuffer.push("h f"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(xref); + const extGState = new Dict(xref); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + const r0 = new Dict(xref); + extGState.set("R0", r0); + r0.set("BM", Name.get("Multiply")); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.set("Type", Name.get("ExtGState")); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class HighlightAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.HIGHLIGHT; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + const resources = this.appearance?.dict.get("Resources"); + if (!this.appearance || !resources?.has("ExtGState")) { + if (this.appearance) { + warn("HighlightAnnotation - ignoring built-in appearance stream."); + } + const fillColor = this.color ? getPdfColorArray(this.color) : [1, 1, 0]; + const fillAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + fillColor, + blendMode: "Multiply", + fillAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + color, + oldAnnotation, + opacity, + rect, + rotation, + user, + quadPoints + } = annotation; + const highlight = oldAnnotation || new Dict(xref); + highlight.set("Type", Name.get("Annot")); + highlight.set("Subtype", Name.get("Highlight")); + highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); + highlight.set("CreationDate", `D:${getModificationDate()}`); + highlight.set("Rect", rect); + highlight.set("F", 4); + highlight.set("Border", [0, 0, 0]); + highlight.set("Rotate", rotation); + highlight.set("QuadPoints", quadPoints); + highlight.set("C", Array.from(color, c => c / 255)); + highlight.set("CA", opacity); + if (user) { + highlight.set("T", stringToAsciiOrUTF16BE(user)); + } + if (apRef || ap) { + const n = new Dict(xref); + highlight.set("AP", n); + n.set("N", apRef || ap); + } + return highlight; + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + color, + rect, + outlines, + opacity + } = annotation; + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + const buffer = []; + for (const outline of outlines) { + buffer.length = 0; + buffer.push(`${numberToString(outline[0])} ${numberToString(outline[1])} m`); + for (let i = 2, ii = outline.length; i < ii; i += 2) { + buffer.push(`${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`); + } + buffer.push("h"); + appearanceBuffer.push(buffer.join("\n")); + } + appearanceBuffer.push("f*"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(xref); + const extGState = new Dict(xref); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + const r0 = new Dict(xref); + extGState.set("R0", r0); + r0.set("BM", Name.get("Multiply")); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.set("Type", Name.get("ExtGState")); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class UnderlineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.UNDERLINE; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 0.571 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } +} +class SquigglyAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.SQUIGGLY; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + const dy = (points[1] - points[5]) / 6; + let shift = dy; + let x = points[4]; + const y = points[5]; + const xEnd = points[6]; + buffer.push(`${x} ${y + shift} m`); + do { + x += 2; + shift = shift === 0 ? dy : 0; + buffer.push(`${x} ${y + shift} l`); + } while (x < xEnd); + buffer.push("S"); + return [points[4], xEnd, y - 2 * dy, y + 2 * dy]; + } + }); + } + } else { + this.data.popupRef = null; + } + } +} +class StrikeOutAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = AnnotationType.STRIKEOUT; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${(points[0] + points[4]) / 2} ` + `${(points[1] + points[5]) / 2} m`, `${(points[2] + points[6]) / 2} ` + `${(points[3] + points[7]) / 2} l`, "S"); + return [points[0], points[2], points[7], points[3]]; + } + }); + } + } else { + this.data.popupRef = null; + } + } +} +class StampAnnotation extends MarkupAnnotation { + #savedHasOwnCanvas; + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.STAMP; + this.#savedHasOwnCanvas = this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + if (isEditing) { + if (!this.data.isEditable) { + return false; + } + this.#savedHasOwnCanvas = this.data.hasOwnCanvas; + this.data.hasOwnCanvas = true; + return true; + } + this.data.hasOwnCanvas = this.#savedHasOwnCanvas; + return !modifiedIds?.has(this.data.id); + } + static async createImage(bitmap, xref) { + const { + width, + height + } = bitmap; + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d", { + alpha: true + }); + ctx.drawImage(bitmap, 0, 0); + const data = ctx.getImageData(0, 0, width, height).data; + const buf32 = new Uint32Array(data.buffer); + const hasAlpha = buf32.some(FeatureTest.isLittleEndian ? x => x >>> 24 !== 0xff : x => (x & 0xff) !== 0xff); + if (hasAlpha) { + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, width, height); + ctx.drawImage(bitmap, 0, 0); + } + const jpegBufferPromise = canvas.convertToBlob({ + type: "image/jpeg", + quality: 1 + }).then(blob => blob.arrayBuffer()); + const xobjectName = Name.get("XObject"); + const imageName = Name.get("Image"); + const image = new Dict(xref); + image.set("Type", xobjectName); + image.set("Subtype", imageName); + image.set("BitsPerComponent", 8); + image.set("ColorSpace", Name.get("DeviceRGB")); + image.set("Filter", Name.get("DCTDecode")); + image.set("BBox", [0, 0, width, height]); + image.set("Width", width); + image.set("Height", height); + let smaskStream = null; + if (hasAlpha) { + const alphaBuffer = new Uint8Array(buf32.length); + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] >>> 24; + } + } else { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] & 0xff; + } + } + const smask = new Dict(xref); + smask.set("Type", xobjectName); + smask.set("Subtype", imageName); + smask.set("BitsPerComponent", 8); + smask.set("ColorSpace", Name.get("DeviceGray")); + smask.set("Width", width); + smask.set("Height", height); + smaskStream = new Stream(alphaBuffer, 0, 0, smask); + } + const imageStream = new Stream(await jpegBufferPromise, 0, 0, image); + return { + imageStream, + smaskStream, + width, + height + }; + } + static createNewDict(annotation, xref, { + apRef, + ap + }) { + const { + oldAnnotation, + rect, + rotation, + user + } = annotation; + const stamp = oldAnnotation || new Dict(xref); + stamp.set("Type", Name.get("Annot")); + stamp.set("Subtype", Name.get("Stamp")); + stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); + stamp.set("Rect", rect); + stamp.set("F", 4); + stamp.set("Border", [0, 0, 0]); + stamp.set("Rotate", rotation); + if (user) { + stamp.set("T", stringToAsciiOrUTF16BE(user)); + } + if (apRef || ap) { + const n = new Dict(xref); + stamp.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + } + return stamp; + } + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.oldAnnotation) { + return null; + } + const { + rotation + } = annotation; + const { + imageRef, + width, + height + } = params.image; + const resources = new Dict(xref); + const xobject = new Dict(xref); + resources.set("XObject", xobject); + xobject.set("Im0", imageRef); + const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`; + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, width, height]); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = getRotationMatrix(rotation, width, height); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class FileAttachmentAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + const file = new FileSpec(dict.get("FS"), xref); + this.data.annotationType = AnnotationType.FILEATTACHMENT; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.noHTML = false; + this.data.file = file.serializable; + const name = dict.get("Name"); + this.data.name = name instanceof Name ? stringToPDFString(name.name) : "PushPin"; + const fillAlpha = dict.get("ca"); + this.data.fillAlpha = typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 ? fillAlpha : null; + } +} + +;// ./src/core/decrypt_stream.js + +const chunkSize = 512; +class DecryptStream extends DecodeStream { + constructor(str, maybeLength, decrypt) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.decrypt = decrypt; + this.nextChunk = null; + this.initialized = false; + } + readBlock() { + let chunk; + if (this.initialized) { + chunk = this.nextChunk; + } else { + chunk = this.str.getBytes(chunkSize); + this.initialized = true; + } + if (!chunk || chunk.length === 0) { + this.eof = true; + return; + } + this.nextChunk = this.str.getBytes(chunkSize); + const hasMoreData = this.nextChunk?.length > 0; + const decrypt = this.decrypt; + chunk = decrypt(chunk, !hasMoreData); + const bufferLength = this.bufferLength, + newLength = bufferLength + chunk.length, + buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } +} + +;// ./src/core/crypto.js + + + +class ARCFourCipher { + constructor(key) { + this.a = 0; + this.b = 0; + const s = new Uint8Array(256); + const keyLength = key.length; + for (let i = 0; i < 256; ++i) { + s[i] = i; + } + for (let i = 0, j = 0; i < 256; ++i) { + const tmp = s[i]; + j = j + tmp + key[i % keyLength] & 0xff; + s[i] = s[j]; + s[j] = tmp; + } + this.s = s; + } + encryptBlock(data) { + let a = this.a, + b = this.b; + const s = this.s; + const n = data.length; + const output = new Uint8Array(n); + for (let i = 0; i < n; ++i) { + a = a + 1 & 0xff; + const tmp = s[a]; + b = b + tmp & 0xff; + const tmp2 = s[b]; + s[a] = tmp2; + s[b] = tmp; + output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; + } + this.a = a; + this.b = b; + return output; + } + decryptBlock(data) { + return this.encryptBlock(data); + } + encrypt(data) { + return this.encryptBlock(data); + } +} +const calculateMD5 = function calculateMD5Closure() { + const r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); + const k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]); + function hash(data, offset, length) { + let h0 = 1732584193, + h1 = -271733879, + h2 = -1732584194, + h3 = 271733878; + const paddedLength = length + 72 & ~63; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = length << 3 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + const w = new Int32Array(16); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j, i += 4) { + w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; + } + let a = h0, + b = h1, + c = h2, + d = h3, + f, + g; + for (j = 0; j < 64; ++j) { + if (j < 16) { + f = b & c | ~b & d; + g = j; + } else if (j < 32) { + f = d & b | ~d & c; + g = 5 * j + 1 & 15; + } else if (j < 48) { + f = b ^ c ^ d; + g = 3 * j + 5 & 15; + } else { + f = c ^ (b | ~d); + g = 7 * j & 15; + } + const tmp = d, + rotateArg = a + f + k[j] + w[g] | 0, + rotate = r[j]; + d = c; + c = b; + b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; + a = tmp; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + } + return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]); + } + return hash; +}(); +class Word64 { + constructor(highInteger, lowInteger) { + this.high = highInteger | 0; + this.low = lowInteger | 0; + } + and(word) { + this.high &= word.high; + this.low &= word.low; + } + xor(word) { + this.high ^= word.high; + this.low ^= word.low; + } + or(word) { + this.high |= word.high; + this.low |= word.low; + } + shiftRight(places) { + if (places >= 32) { + this.low = this.high >>> places - 32 | 0; + this.high = 0; + } else { + this.low = this.low >>> places | this.high << 32 - places; + this.high = this.high >>> places | 0; + } + } + shiftLeft(places) { + if (places >= 32) { + this.high = this.low << places - 32; + this.low = 0; + } else { + this.high = this.high << places | this.low >>> 32 - places; + this.low <<= places; + } + } + rotateRight(places) { + let low, high; + if (places & 32) { + high = this.low; + low = this.high; + } else { + low = this.low; + high = this.high; + } + places &= 31; + this.low = low >>> places | high << 32 - places; + this.high = high >>> places | low << 32 - places; + } + not() { + this.high = ~this.high; + this.low = ~this.low; + } + add(word) { + const lowAdd = (this.low >>> 0) + (word.low >>> 0); + let highAdd = (this.high >>> 0) + (word.high >>> 0); + if (lowAdd > 0xffffffff) { + highAdd += 1; + } + this.low = lowAdd | 0; + this.high = highAdd | 0; + } + copyTo(bytes, offset) { + bytes[offset] = this.high >>> 24 & 0xff; + bytes[offset + 1] = this.high >> 16 & 0xff; + bytes[offset + 2] = this.high >> 8 & 0xff; + bytes[offset + 3] = this.high & 0xff; + bytes[offset + 4] = this.low >>> 24 & 0xff; + bytes[offset + 5] = this.low >> 16 & 0xff; + bytes[offset + 6] = this.low >> 8 & 0xff; + bytes[offset + 7] = this.low & 0xff; + } + assign(word) { + this.high = word.high; + this.low = word.low; + } +} +const calculateSHA256 = function calculateSHA256Closure() { + function rotr(x, n) { + return x >>> n | x << 32 - n; + } + function ch(x, y, z) { + return x & y ^ ~x & z; + } + function maj(x, y, z) { + return x & y ^ x & z ^ y & z; + } + function sigma(x) { + return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); + } + function sigmaPrime(x) { + return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); + } + function littleSigma(x) { + return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; + } + function littleSigmaPrime(x) { + return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; + } + const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; + function hash(data, offset, length) { + let h0 = 0x6a09e667, + h1 = 0xbb67ae85, + h2 = 0x3c6ef372, + h3 = 0xa54ff53a, + h4 = 0x510e527f, + h5 = 0x9b05688c, + h6 = 0x1f83d9ab, + h7 = 0x5be0cd19; + const paddedLength = Math.ceil((length + 9) / 64) * 64; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Uint32Array(64); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + i += 4; + } + for (j = 16; j < 64; ++j) { + w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0; + } + let a = h0, + b = h1, + c = h2, + d = h3, + e = h4, + f = h5, + g = h6, + h = h7, + t1, + t2; + for (j = 0; j < 64; ++j) { + t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; + t2 = sigma(a) + maj(a, b, c); + h = g; + g = f; + f = e; + e = d + t1 | 0; + d = c; + c = b; + b = a; + a = t1 + t2 | 0; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + h4 = h4 + e | 0; + h5 = h5 + f | 0; + h6 = h6 + g | 0; + h7 = h7 + h | 0; + } + return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]); + } + return hash; +}(); +const calculateSHA512 = function calculateSHA512Closure() { + function ch(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.not(); + tmp.and(z); + result.xor(tmp); + } + function maj(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.and(z); + result.xor(tmp); + tmp.assign(y); + tmp.and(z); + result.xor(tmp); + } + function sigma(result, x, tmp) { + result.assign(x); + result.rotateRight(28); + tmp.assign(x); + tmp.rotateRight(34); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(39); + result.xor(tmp); + } + function sigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(14); + tmp.assign(x); + tmp.rotateRight(18); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(41); + result.xor(tmp); + } + function littleSigma(result, x, tmp) { + result.assign(x); + result.rotateRight(1); + tmp.assign(x); + tmp.rotateRight(8); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(7); + result.xor(tmp); + } + function littleSigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(19); + tmp.assign(x); + tmp.rotateRight(61); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(6); + result.xor(tmp); + } + const k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; + function hash(data, offset, length, mode384 = false) { + let h0, h1, h2, h3, h4, h5, h6, h7; + if (!mode384) { + h0 = new Word64(0x6a09e667, 0xf3bcc908); + h1 = new Word64(0xbb67ae85, 0x84caa73b); + h2 = new Word64(0x3c6ef372, 0xfe94f82b); + h3 = new Word64(0xa54ff53a, 0x5f1d36f1); + h4 = new Word64(0x510e527f, 0xade682d1); + h5 = new Word64(0x9b05688c, 0x2b3e6c1f); + h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); + h7 = new Word64(0x5be0cd19, 0x137e2179); + } else { + h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); + h1 = new Word64(0x629a292a, 0x367cd507); + h2 = new Word64(0x9159015a, 0x3070dd17); + h3 = new Word64(0x152fecd8, 0xf70e5939); + h4 = new Word64(0x67332667, 0xffc00b31); + h5 = new Word64(0x8eb44a87, 0x68581511); + h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); + h7 = new Word64(0x47b5481d, 0xbefa4fa4); + } + const paddedLength = Math.ceil((length + 17) / 128) * 128; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 16; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Array(80); + for (i = 0; i < 80; i++) { + w[i] = new Word64(0, 0); + } + let a = new Word64(0, 0), + b = new Word64(0, 0), + c = new Word64(0, 0); + let d = new Word64(0, 0), + e = new Word64(0, 0), + f = new Word64(0, 0); + let g = new Word64(0, 0), + h = new Word64(0, 0); + const t1 = new Word64(0, 0), + t2 = new Word64(0, 0); + const tmp1 = new Word64(0, 0), + tmp2 = new Word64(0, 0); + let tmp3; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; + i += 8; + } + for (j = 16; j < 80; ++j) { + tmp3 = w[j]; + littleSigmaPrime(tmp3, w[j - 2], tmp2); + tmp3.add(w[j - 7]); + littleSigma(tmp1, w[j - 15], tmp2); + tmp3.add(tmp1); + tmp3.add(w[j - 16]); + } + a.assign(h0); + b.assign(h1); + c.assign(h2); + d.assign(h3); + e.assign(h4); + f.assign(h5); + g.assign(h6); + h.assign(h7); + for (j = 0; j < 80; ++j) { + t1.assign(h); + sigmaPrime(tmp1, e, tmp2); + t1.add(tmp1); + ch(tmp1, e, f, g, tmp2); + t1.add(tmp1); + t1.add(k[j]); + t1.add(w[j]); + sigma(t2, a, tmp2); + maj(tmp1, a, b, c, tmp2); + t2.add(tmp1); + tmp3 = h; + h = g; + g = f; + f = e; + d.add(t1); + e = d; + d = c; + c = b; + b = a; + tmp3.assign(t1); + tmp3.add(t2); + a = tmp3; + } + h0.add(a); + h1.add(b); + h2.add(c); + h3.add(d); + h4.add(e); + h5.add(f); + h6.add(g); + h7.add(h); + } + let result; + if (!mode384) { + result = new Uint8Array(64); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + h6.copyTo(result, 48); + h7.copyTo(result, 56); + } else { + result = new Uint8Array(48); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + } + return result; + } + return hash; +}(); +function calculateSHA384(data, offset, length) { + return calculateSHA512(data, offset, length, true); +} +class NullCipher { + decryptBlock(data) { + return data; + } + encrypt(data) { + return data; + } +} +class AESBaseCipher { + constructor() { + this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); + this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); + this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); + this._mixCol = new Uint8Array(256); + for (let i = 0; i < 256; i++) { + this._mixCol[i] = i < 128 ? i << 1 : i << 1 ^ 0x1b; + } + this.buffer = new Uint8Array(16); + this.bufferPosition = 0; + } + _expandKey(cipherKey) { + unreachable("Cannot call `_expandKey` on the base class"); + } + _decrypt(input, key) { + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let j = 0; j < 16; j += 4) { + const s0 = this._mix[state[j]]; + const s1 = this._mix[state[j + 1]]; + const s2 = this._mix[state[j + 2]]; + const s3 = this._mix[state[j + 3]]; + t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; + state[j] = t >>> 24 & 0xff; + state[j + 1] = t >> 16 & 0xff; + state[j + 2] = t >> 8 & 0xff; + state[j + 3] = t & 0xff; + } + } + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + state[j] ^= key[j]; + } + return state; + } + _encrypt(input, key) { + const s = this._s; + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0; j < 16; ++j) { + state[j] ^= key[j]; + } + for (let i = 1; i < this._cyclesOfRepetition; i++) { + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0; j < 16; j += 4) { + const s0 = state[j + 0]; + const s1 = state[j + 1]; + const s2 = state[j + 2]; + const s3 = state[j + 3]; + t = s0 ^ s1 ^ s2 ^ s3; + state[j + 0] ^= t ^ this._mixCol[s0 ^ s1]; + state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; + state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; + state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + } + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + return state; + } + _decryptBlock2(data, finalize) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + let iv = this.iv; + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + const plain = this._decrypt(buffer, this._key); + for (let j = 0; j < 16; ++j) { + plain[j] ^= iv[j]; + } + iv = buffer; + result.push(plain); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + let outputLength = 16 * result.length; + if (finalize) { + const lastBlock = result.at(-1); + let psLen = lastBlock[15]; + if (psLen <= 16) { + for (let i = 15, ii = 16 - psLen; i >= ii; --i) { + if (lastBlock[i] !== psLen) { + psLen = 0; + break; + } + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); + } + } + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + decryptBlock(data, finalize, iv = null) { + const sourceLength = data.length; + const buffer = this.buffer; + let bufferLength = this.bufferPosition; + if (iv) { + this.iv = iv; + } else { + for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { + buffer[bufferLength] = data[i]; + } + if (bufferLength < 16) { + this.bufferLength = bufferLength; + return new Uint8Array(0); + } + this.iv = buffer; + data = data.subarray(16); + } + this.buffer = new Uint8Array(16); + this.bufferLength = 0; + this.decryptBlock = this._decryptBlock2; + return this.decryptBlock(data, finalize); + } + encrypt(data, iv) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + if (!iv) { + iv = new Uint8Array(16); + } + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + for (let j = 0; j < 16; ++j) { + buffer[j] ^= iv[j]; + } + const cipher = this._encrypt(buffer, this._key); + iv = cipher; + result.push(cipher); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + const outputLength = 16 * result.length; + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } +} +class AES128Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 10; + this._keySize = 160; + this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 176; + const s = this._s; + const rcon = this._rcon; + const result = new Uint8Array(b); + result.set(cipherKey); + for (let j = 16, i = 1; j < b; ++i) { + let t1 = result[j - 3]; + let t2 = result[j - 2]; + let t3 = result[j - 1]; + let t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= rcon[i]; + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 16]; + j++; + result[j] = t2 ^= result[j - 16]; + j++; + result[j] = t3 ^= result[j - 16]; + j++; + result[j] = t4 ^= result[j - 16]; + j++; + } + } + return result; + } +} +class AES256Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 14; + this._keySize = 224; + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 240; + const s = this._s; + const result = new Uint8Array(b); + result.set(cipherKey); + let r = 1; + let t1, t2, t3, t4; + for (let j = 32, i = 1; j < b; ++i) { + if (j % 32 === 16) { + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + } else if (j % 32 === 0) { + t1 = result[j - 3]; + t2 = result[j - 2]; + t3 = result[j - 1]; + t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= r; + if ((r <<= 1) >= 256) { + r = (r ^ 0x1b) & 0xff; + } + } + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 32]; + j++; + result[j] = t2 ^= result[j - 32]; + j++; + result[j] = t3 ^= result[j - 32]; + j++; + result[j] = t4 ^= result[j - 32]; + j++; + } + } + return result; + } +} +class PDF17 { + checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + const result = calculateSHA256(hashData, 0, hashData.length); + return isArrayEqual(result, ownerPassword); + } + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = calculateSHA256(hashData, 0, hashData.length); + return isArrayEqual(result, userPassword); + } + getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + const key = calculateSHA256(hashData, 0, hashData.length); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + } + getUserKey(password, userKeySalt, userEncryption) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + const key = calculateSHA256(hashData, 0, hashData.length); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } +} +class PDF20 { + _hash(password, input, userBytes) { + let k = calculateSHA256(input, 0, input.length).subarray(0, 32); + let e = [0]; + let i = 0; + while (i < 64 || e.at(-1) > i - 32) { + const combinedLength = password.length + k.length + userBytes.length, + combinedArray = new Uint8Array(combinedLength); + let writeOffset = 0; + combinedArray.set(password, writeOffset); + writeOffset += password.length; + combinedArray.set(k, writeOffset); + writeOffset += k.length; + combinedArray.set(userBytes, writeOffset); + const k1 = new Uint8Array(combinedLength * 64); + for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) { + k1.set(combinedArray, pos); + } + const cipher = new AES128Cipher(k.subarray(0, 16)); + e = cipher.encrypt(k1, k.subarray(16, 32)); + const remainder = e.slice(0, 16).reduce((a, b) => a + b, 0) % 3; + if (remainder === 0) { + k = calculateSHA256(e, 0, e.length); + } else if (remainder === 1) { + k = calculateSHA384(e, 0, e.length); + } else if (remainder === 2) { + k = calculateSHA512(e, 0, e.length); + } + i++; + } + return k.subarray(0, 32); + } + checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + const result = this._hash(password, hashData, userBytes); + return isArrayEqual(result, ownerPassword); + } + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = this._hash(password, hashData, []); + return isArrayEqual(result, userPassword); + } + getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + const key = this._hash(password, hashData, userBytes); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + } + getUserKey(password, userKeySalt, userEncryption) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + const key = this._hash(password, hashData, []); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } +} +class CipherTransform { + constructor(stringCipherConstructor, streamCipherConstructor) { + this.StringCipherConstructor = stringCipherConstructor; + this.StreamCipherConstructor = streamCipherConstructor; + } + createStream(stream, length) { + const cipher = new this.StreamCipherConstructor(); + return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { + return cipher.decryptBlock(data, finalize); + }); + } + decryptString(s) { + const cipher = new this.StringCipherConstructor(); + let data = stringToBytes(s); + data = cipher.decryptBlock(data, true); + return bytesToString(data); + } + encryptString(s) { + const cipher = new this.StringCipherConstructor(); + if (cipher instanceof AESBaseCipher) { + const strLen = s.length; + const pad = 16 - strLen % 16; + s += String.fromCharCode(pad).repeat(pad); + const iv = new Uint8Array(16); + if (typeof crypto !== "undefined") { + crypto.getRandomValues(iv); + } else { + for (let i = 0; i < 16; i++) { + iv[i] = Math.floor(256 * Math.random()); + } + } + let data = stringToBytes(s); + data = cipher.encrypt(data, iv); + const buf = new Uint8Array(16 + data.length); + buf.set(iv); + buf.set(data, 16); + return bytesToString(buf); + } + let data = stringToBytes(s); + data = cipher.encrypt(data); + return bytesToString(data); + } +} +class CipherTransformFactory { + static #defaultPasswordBytes = new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]); + #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { + if (password) { + const passwordLength = Math.min(127, password.length); + password = password.subarray(0, passwordLength); + } else { + password = []; + } + const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17(); + if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { + return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); + } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { + return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); + } + return null; + } + #prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { + const hashDataSize = 40 + ownerPassword.length + fileId.length; + const hashData = new Uint8Array(hashDataSize); + let i = 0, + j, + n; + if (password) { + n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + } + j = 0; + while (i < 32) { + hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; + } + for (j = 0, n = ownerPassword.length; j < n; ++j) { + hashData[i++] = ownerPassword[j]; + } + hashData[i++] = flags & 0xff; + hashData[i++] = flags >> 8 & 0xff; + hashData[i++] = flags >> 16 & 0xff; + hashData[i++] = flags >>> 24 & 0xff; + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + if (revision >= 4 && !encryptMetadata) { + hashData[i++] = 0xff; + hashData[i++] = 0xff; + hashData[i++] = 0xff; + hashData[i++] = 0xff; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, keyLengthInBytes); + } + } + const encryptionKey = hash.subarray(0, keyLengthInBytes); + let cipher, checkData; + if (revision >= 3) { + for (i = 0; i < 32; ++i) { + hashData[i] = CipherTransformFactory.#defaultPasswordBytes[i]; + } + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); + n = encryptionKey.length; + const derivedKey = new Uint8Array(n); + for (j = 1; j <= 19; ++j) { + for (let k = 0; k < n; ++k) { + derivedKey[k] = encryptionKey[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + checkData = cipher.encryptBlock(checkData); + } + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } else { + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(CipherTransformFactory.#defaultPasswordBytes); + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } + return encryptionKey; + } + #decodeUserPassword(password, ownerPassword, revision, keyLength) { + const hashData = new Uint8Array(32); + let i = 0; + const n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + let j = 0; + while (i < 32) { + hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, hash.length); + } + } + let cipher, userPassword; + if (revision >= 3) { + userPassword = ownerPassword; + const derivedKey = new Uint8Array(keyLengthInBytes); + for (j = 19; j >= 0; j--) { + for (let k = 0; k < keyLengthInBytes; ++k) { + derivedKey[k] = hash[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + userPassword = cipher.encryptBlock(userPassword); + } + } else { + cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); + userPassword = cipher.encryptBlock(ownerPassword); + } + return userPassword; + } + #buildObjectKey(num, gen, encryptionKey, isAes = false) { + const key = new Uint8Array(encryptionKey.length + 9); + const n = encryptionKey.length; + let i; + for (i = 0; i < n; ++i) { + key[i] = encryptionKey[i]; + } + key[i++] = num & 0xff; + key[i++] = num >> 8 & 0xff; + key[i++] = num >> 16 & 0xff; + key[i++] = gen & 0xff; + key[i++] = gen >> 8 & 0xff; + if (isAes) { + key[i++] = 0x73; + key[i++] = 0x41; + key[i++] = 0x6c; + key[i++] = 0x54; + } + const hash = calculateMD5(key, 0, i); + return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); + } + #buildCipherConstructor(cf, name, num, gen, key) { + if (!(name instanceof Name)) { + throw new FormatError("Invalid crypt filter name."); + } + const self = this; + const cryptFilter = cf.get(name.name); + const cfm = cryptFilter?.get("CFM"); + if (!cfm || cfm.name === "None") { + return function () { + return new NullCipher(); + }; + } + if (cfm.name === "V2") { + return function () { + return new ARCFourCipher(self.#buildObjectKey(num, gen, key, false)); + }; + } + if (cfm.name === "AESV2") { + return function () { + return new AES128Cipher(self.#buildObjectKey(num, gen, key, true)); + }; + } + if (cfm.name === "AESV3") { + return function () { + return new AES256Cipher(key); + }; + } + throw new FormatError("Unknown crypto method"); + } + constructor(dict, fileId, password) { + const filter = dict.get("Filter"); + if (!isName(filter, "Standard")) { + throw new FormatError("unknown encryption method"); + } + this.filterName = filter.name; + this.dict = dict; + const algorithm = dict.get("V"); + if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { + throw new FormatError("unsupported encryption algorithm"); + } + this.algorithm = algorithm; + let keyLength = dict.get("Length"); + if (!keyLength) { + if (algorithm <= 3) { + keyLength = 40; + } else { + const cfDict = dict.get("CF"); + const streamCryptoName = dict.get("StmF"); + if (cfDict instanceof Dict && streamCryptoName instanceof Name) { + cfDict.suppressEncryption = true; + const handlerDict = cfDict.get(streamCryptoName.name); + keyLength = handlerDict?.get("Length") || 128; + if (keyLength < 40) { + keyLength <<= 3; + } + } + } + } + if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { + throw new FormatError("invalid key length"); + } + const ownerBytes = stringToBytes(dict.get("O")), + userBytes = stringToBytes(dict.get("U")); + const ownerPassword = ownerBytes.subarray(0, 32); + const userPassword = userBytes.subarray(0, 32); + const flags = dict.get("P"); + const revision = dict.get("R"); + const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false; + this.encryptMetadata = encryptMetadata; + const fileIdBytes = stringToBytes(fileId); + let passwordBytes; + if (password) { + if (revision === 6) { + try { + password = utf8StringToString(password); + } catch { + warn("CipherTransformFactory: Unable to convert UTF8 encoded password."); + } + } + passwordBytes = stringToBytes(password); + } + let encryptionKey; + if (algorithm !== 5) { + encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } else { + const ownerValidationSalt = ownerBytes.subarray(32, 40); + const ownerKeySalt = ownerBytes.subarray(40, 48); + const uBytes = userBytes.subarray(0, 48); + const userValidationSalt = userBytes.subarray(32, 40); + const userKeySalt = userBytes.subarray(40, 48); + const ownerEncryption = stringToBytes(dict.get("OE")); + const userEncryption = stringToBytes(dict.get("UE")); + const perms = stringToBytes(dict.get("Perms")); + encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); + } + if (!encryptionKey && !password) { + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } else if (!encryptionKey && password) { + const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); + encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } + if (!encryptionKey) { + throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD); + } + this.encryptionKey = encryptionKey; + if (algorithm >= 4) { + const cf = dict.get("CF"); + if (cf instanceof Dict) { + cf.suppressEncryption = true; + } + this.cf = cf; + this.stmf = dict.get("StmF") || Name.get("Identity"); + this.strf = dict.get("StrF") || Name.get("Identity"); + this.eff = dict.get("EFF") || this.stmf; + } + } + createCipherTransform(num, gen) { + if (this.algorithm === 4 || this.algorithm === 5) { + return new CipherTransform(this.#buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey), this.#buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey)); + } + const key = this.#buildObjectKey(num, gen, this.encryptionKey, false); + const cipherConstructor = function () { + return new ARCFourCipher(key); + }; + return new CipherTransform(cipherConstructor, cipherConstructor); + } +} + +;// ./src/core/dataset_reader.js + + + +function decodeString(str) { + try { + return stringToUTF8String(str); + } catch (ex) { + warn(`UTF-8 decoding failed: "${ex}".`); + return str; + } +} +class DatasetXMLParser extends SimpleXMLParser { + constructor(options) { + super(options); + this.node = null; + } + onEndElement(name) { + const node = super.onEndElement(name); + if (node && name === "xfa:datasets") { + this.node = node; + throw new Error("Aborting DatasetXMLParser."); + } + } +} +class DatasetReader { + constructor(data) { + if (data.datasets) { + this.node = new SimpleXMLParser({ + hasAttributes: true + }).parseFromString(data.datasets).documentElement; + } else { + const parser = new DatasetXMLParser({ + hasAttributes: true + }); + try { + parser.parseFromString(data["xdp:xdp"]); + } catch {} + this.node = parser.node; + } + } + getValue(path) { + if (!this.node || !path) { + return ""; + } + const node = this.node.searchNode(parseXFAPath(path), 0); + if (!node) { + return ""; + } + const first = node.firstChild; + if (first?.nodeName === "value") { + return node.children.map(child => decodeString(child.textContent)); + } + return decodeString(node.textContent); + } +} + +;// ./src/core/xref.js + + + + + + +class XRef { + #firstXRefStmPos = null; + constructor(stream, pdfManager) { + this.stream = stream; + this.pdfManager = pdfManager; + this.entries = []; + this._xrefStms = new Set(); + this._cacheMap = new Map(); + this._pendingRefs = new RefSet(); + this._newPersistentRefNum = null; + this._newTemporaryRefNum = null; + this._persistentRefsCache = null; + } + getNewPersistentRef(obj) { + if (this._newPersistentRefNum === null) { + this._newPersistentRefNum = this.entries.length || 1; + } + const num = this._newPersistentRefNum++; + this._cacheMap.set(num, obj); + return Ref.get(num, 0); + } + getNewTemporaryRef() { + if (this._newTemporaryRefNum === null) { + this._newTemporaryRefNum = this.entries.length || 1; + if (this._newPersistentRefNum) { + this._persistentRefsCache = new Map(); + for (let i = this._newTemporaryRefNum; i < this._newPersistentRefNum; i++) { + this._persistentRefsCache.set(i, this._cacheMap.get(i)); + this._cacheMap.delete(i); + } + } + } + return Ref.get(this._newTemporaryRefNum++, 0); + } + resetNewTemporaryRef() { + this._newTemporaryRefNum = null; + if (this._persistentRefsCache) { + for (const [num, obj] of this._persistentRefsCache) { + this._cacheMap.set(num, obj); + } + } + this._persistentRefsCache = null; + } + setStartXRef(startXRef) { + this.startXRefQueue = [startXRef]; + } + parse(recoveryMode = false) { + let trailerDict; + if (!recoveryMode) { + trailerDict = this.readXRef(); + } else { + warn("Indexing all PDF objects"); + trailerDict = this.indexObjects(); + } + trailerDict.assignXref(this); + this.trailer = trailerDict; + let encrypt; + try { + encrypt = trailerDict.get("Encrypt"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`); + } + if (encrypt instanceof Dict) { + const ids = trailerDict.get("ID"); + const fileId = ids?.length ? ids[0] : ""; + encrypt.suppressEncryption = true; + this.encrypt = new CipherTransformFactory(encrypt, fileId, this.pdfManager.password); + } + let root; + try { + root = trailerDict.get("Root"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Root" reference: "${ex}".`); + } + if (root instanceof Dict) { + try { + const pages = root.get("Pages"); + if (pages instanceof Dict) { + this.root = root; + return; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`); + } + } + if (!recoveryMode) { + throw new XRefParseException(); + } + throw new InvalidPDFException("Invalid Root reference."); + } + processXRefTable(parser) { + if (!("tableState" in this)) { + this.tableState = { + entryNum: 0, + streamPos: parser.lexer.stream.pos, + parserBuf1: parser.buf1, + parserBuf2: parser.buf2 + }; + } + const obj = this.readXRefTable(parser); + if (!isCmd(obj, "trailer")) { + throw new FormatError("Invalid XRef table: could not find trailer dictionary"); + } + let dict = parser.getObj(); + if (!(dict instanceof Dict) && dict.dict) { + dict = dict.dict; + } + if (!(dict instanceof Dict)) { + throw new FormatError("Invalid XRef table: could not parse trailer dictionary"); + } + delete this.tableState; + return dict; + } + readXRefTable(parser) { + const stream = parser.lexer.stream; + const tableState = this.tableState; + stream.pos = tableState.streamPos; + parser.buf1 = tableState.parserBuf1; + parser.buf2 = tableState.parserBuf2; + let obj; + while (true) { + if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) { + if (isCmd(obj = parser.getObj(), "trailer")) { + break; + } + tableState.firstEntryNum = obj; + tableState.entryCount = parser.getObj(); + } + let first = tableState.firstEntryNum; + const count = tableState.entryCount; + if (!Number.isInteger(first) || !Number.isInteger(count)) { + throw new FormatError("Invalid XRef table: wrong types in subsection header"); + } + for (let i = tableState.entryNum; i < count; i++) { + tableState.streamPos = stream.pos; + tableState.entryNum = i; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + const entry = {}; + entry.offset = parser.getObj(); + entry.gen = parser.getObj(); + const type = parser.getObj(); + if (type instanceof Cmd) { + switch (type.cmd) { + case "f": + entry.free = true; + break; + case "n": + entry.uncompressed = true; + break; + } + } + if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) { + throw new FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`); + } + if (i === 0 && entry.free && first === 1) { + first = 0; + } + if (!this.entries[i + first]) { + this.entries[i + first] = entry; + } + } + tableState.entryNum = 0; + tableState.streamPos = stream.pos; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + delete tableState.firstEntryNum; + delete tableState.entryCount; + } + if (this.entries[0] && !this.entries[0].free) { + throw new FormatError("Invalid XRef table: unexpected first object"); + } + return obj; + } + processXRefStream(stream) { + if (!("streamState" in this)) { + const streamParameters = stream.dict; + const byteWidths = streamParameters.get("W"); + let range = streamParameters.get("Index"); + if (!range) { + range = [0, streamParameters.get("Size")]; + } + this.streamState = { + entryRanges: range, + byteWidths, + entryNum: 0, + streamPos: stream.pos + }; + } + this.readXRefStream(stream); + delete this.streamState; + return stream.dict; + } + readXRefStream(stream) { + const streamState = this.streamState; + stream.pos = streamState.streamPos; + const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = streamState.byteWidths; + const entryRanges = streamState.entryRanges; + while (entryRanges.length > 0) { + const [first, n] = entryRanges; + if (!Number.isInteger(first) || !Number.isInteger(n)) { + throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`); + } + if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) { + throw new FormatError(`Invalid XRef entry fields length: ${first}, ${n}`); + } + for (let i = streamState.entryNum; i < n; ++i) { + streamState.entryNum = i; + streamState.streamPos = stream.pos; + let type = 0, + offset = 0, + generation = 0; + for (let j = 0; j < typeFieldWidth; ++j) { + const typeByte = stream.getByte(); + if (typeByte === -1) { + throw new FormatError("Invalid XRef byteWidths 'type'."); + } + type = type << 8 | typeByte; + } + if (typeFieldWidth === 0) { + type = 1; + } + for (let j = 0; j < offsetFieldWidth; ++j) { + const offsetByte = stream.getByte(); + if (offsetByte === -1) { + throw new FormatError("Invalid XRef byteWidths 'offset'."); + } + offset = offset << 8 | offsetByte; + } + for (let j = 0; j < generationFieldWidth; ++j) { + const generationByte = stream.getByte(); + if (generationByte === -1) { + throw new FormatError("Invalid XRef byteWidths 'generation'."); + } + generation = generation << 8 | generationByte; + } + const entry = {}; + entry.offset = offset; + entry.gen = generation; + switch (type) { + case 0: + entry.free = true; + break; + case 1: + entry.uncompressed = true; + break; + case 2: + break; + default: + throw new FormatError(`Invalid XRef entry type: ${type}`); + } + if (!this.entries[first + i]) { + this.entries[first + i] = entry; + } + } + streamState.entryNum = 0; + streamState.streamPos = stream.pos; + entryRanges.splice(0, 2); + } + } + indexObjects() { + const TAB = 0x9, + LF = 0xa, + CR = 0xd, + SPACE = 0x20; + const PERCENT = 0x25, + LT = 0x3c; + function readToken(data, offset) { + let token = "", + ch = data[offset]; + while (ch !== LF && ch !== CR && ch !== LT) { + if (++offset >= data.length) { + break; + } + token += String.fromCharCode(ch); + ch = data[offset]; + } + return token; + } + function skipUntil(data, offset, what) { + const length = what.length, + dataLength = data.length; + let skipped = 0; + while (offset < dataLength) { + let i = 0; + while (i < length && data[offset + i] === what[i]) { + ++i; + } + if (i >= length) { + break; + } + offset++; + skipped++; + } + return skipped; + } + const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g; + const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g; + const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; + const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); + const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]); + const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); + this.entries.length = 0; + this._cacheMap.clear(); + const stream = this.stream; + stream.pos = 0; + const buffer = stream.getBytes(), + bufferStr = bytesToString(buffer), + length = buffer.length; + let position = stream.start; + const trailers = [], + xrefStms = []; + while (position < length) { + let ch = buffer[position]; + if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { + ++position; + continue; + } + if (ch === PERCENT) { + do { + ++position; + if (position >= length) { + break; + } + ch = buffer[position]; + } while (ch !== LF && ch !== CR); + continue; + } + const token = readToken(buffer, position); + let m; + if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) { + position += skipUntil(buffer, position, trailerBytes); + trailers.push(position); + position += skipUntil(buffer, position, startxrefBytes); + } else if (m = objRegExp.exec(token)) { + const num = m[1] | 0, + gen = m[2] | 0; + const startPos = position + token.length; + let contentLength, + updateEntries = false; + if (!this.entries[num]) { + updateEntries = true; + } else if (this.entries[num].gen === gen) { + try { + const parser = new Parser({ + lexer: new Lexer(stream.makeSubStream(startPos)) + }); + parser.getObj(); + updateEntries = true; + } catch (ex) { + if (ex instanceof ParserEOFException) { + warn(`indexObjects -- checking object (${token}): "${ex}".`); + } else { + updateEntries = true; + } + } + } + if (updateEntries) { + this.entries[num] = { + offset: position - stream.start, + gen, + uncompressed: true + }; + } + gEndobjRegExp.lastIndex = startPos; + const match = gEndobjRegExp.exec(bufferStr); + if (match) { + const endPos = gEndobjRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "endobj") { + warn(`indexObjects: Found "${match[1]}" inside of another "obj", ` + 'caused by missing "endobj" -- trying to recover.'); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + const content = buffer.subarray(position, position + contentLength); + const xrefTagOffset = skipUntil(content, 0, xrefBytes); + if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { + xrefStms.push(position - stream.start); + this._xrefStms.add(position - stream.start); + } + position += contentLength; + } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) { + trailers.push(position); + const startPos = position + token.length; + let contentLength; + gStartxrefRegExp.lastIndex = startPos; + const match = gStartxrefRegExp.exec(bufferStr); + if (match) { + const endPos = gStartxrefRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "startxref") { + warn(`indexObjects: Found "${match[1]}" after "trailer", ` + 'caused by missing "startxref" -- trying to recover.'); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + position += contentLength; + } else { + position += token.length + 1; + } + } + for (const xrefStm of xrefStms) { + this.startXRefQueue.push(xrefStm); + this.readXRef(true); + } + const trailerDicts = []; + let isEncrypted = false; + for (const trailer of trailers) { + stream.pos = trailer; + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true, + recoveryMode: true + }); + const obj = parser.getObj(); + if (!isCmd(obj, "trailer")) { + continue; + } + const dict = parser.getObj(); + if (!(dict instanceof Dict)) { + continue; + } + trailerDicts.push(dict); + if (dict.has("Encrypt")) { + isEncrypted = true; + } + } + let trailerDict, trailerError; + for (const dict of [...trailerDicts, "genFallback", ...trailerDicts]) { + if (dict === "genFallback") { + if (!trailerError) { + break; + } + this._generationFallback = true; + continue; + } + let validPagesDict = false; + try { + const rootDict = dict.get("Root"); + if (!(rootDict instanceof Dict)) { + continue; + } + const pagesDict = rootDict.get("Pages"); + if (!(pagesDict instanceof Dict)) { + continue; + } + const pagesCount = pagesDict.get("Count"); + if (Number.isInteger(pagesCount)) { + validPagesDict = true; + } + } catch (ex) { + trailerError = ex; + continue; + } + if (validPagesDict && (!isEncrypted || dict.has("Encrypt")) && dict.has("ID")) { + return dict; + } + trailerDict = dict; + } + if (trailerDict) { + return trailerDict; + } + if (this.topDict) { + return this.topDict; + } + if (!trailerDicts.length) { + for (const [num, entry] of this.entries.entries()) { + if (!entry) { + continue; + } + const ref = Ref.get(num, entry.gen); + let obj; + try { + obj = this.fetch(ref); + } catch { + continue; + } + if (obj instanceof BaseStream) { + obj = obj.dict; + } + if (obj instanceof Dict && obj.has("Root")) { + return obj; + } + } + } + throw new InvalidPDFException("Invalid PDF structure."); + } + readXRef(recoveryMode = false) { + const stream = this.stream; + const startXRefParsedCache = new Set(); + while (this.startXRefQueue.length) { + try { + const startXRef = this.startXRefQueue[0]; + if (startXRefParsedCache.has(startXRef)) { + warn("readXRef - skipping XRef table since it was already parsed."); + this.startXRefQueue.shift(); + continue; + } + startXRefParsedCache.add(startXRef); + stream.pos = startXRef + stream.start; + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true + }); + let obj = parser.getObj(); + let dict; + if (isCmd(obj, "xref")) { + dict = this.processXRefTable(parser); + if (!this.topDict) { + this.topDict = dict; + } + obj = dict.get("XRefStm"); + if (Number.isInteger(obj) && !this._xrefStms.has(obj)) { + this._xrefStms.add(obj); + this.startXRefQueue.push(obj); + this.#firstXRefStmPos ??= obj; + } + } else if (Number.isInteger(obj)) { + if (!Number.isInteger(parser.getObj()) || !isCmd(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof BaseStream)) { + throw new FormatError("Invalid XRef stream"); + } + dict = this.processXRefStream(obj); + if (!this.topDict) { + this.topDict = dict; + } + if (!dict) { + throw new FormatError("Failed to read XRef stream"); + } + } else { + throw new FormatError("Invalid XRef stream header"); + } + obj = dict.get("Prev"); + if (Number.isInteger(obj)) { + this.startXRefQueue.push(obj); + } else if (obj instanceof Ref) { + this.startXRefQueue.push(obj.num); + } + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + info("(while reading XRef): " + e); + } + this.startXRefQueue.shift(); + } + if (this.topDict) { + return this.topDict; + } + if (recoveryMode) { + return undefined; + } + throw new XRefParseException(); + } + get lastXRefStreamPos() { + return this.#firstXRefStmPos ?? (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null); + } + getEntry(i) { + const xrefEntry = this.entries[i]; + if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { + return xrefEntry; + } + return null; + } + fetchIfRef(obj, suppressEncryption = false) { + if (obj instanceof Ref) { + return this.fetch(obj, suppressEncryption); + } + return obj; + } + fetch(ref, suppressEncryption = false) { + if (!(ref instanceof Ref)) { + throw new Error("ref object is not a reference"); + } + const num = ref.num; + const cacheEntry = this._cacheMap.get(num); + if (cacheEntry !== undefined) { + if (cacheEntry instanceof Dict && !cacheEntry.objId) { + cacheEntry.objId = ref.toString(); + } + return cacheEntry; + } + let xrefEntry = this.getEntry(num); + if (xrefEntry === null) { + this._cacheMap.set(num, xrefEntry); + return xrefEntry; + } + if (this._pendingRefs.has(ref)) { + this._pendingRefs.remove(ref); + warn(`Ignoring circular reference: ${ref}.`); + return CIRCULAR_REF; + } + this._pendingRefs.put(ref); + try { + xrefEntry = xrefEntry.uncompressed ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption) : this.fetchCompressed(ref, xrefEntry, suppressEncryption); + this._pendingRefs.remove(ref); + } catch (ex) { + this._pendingRefs.remove(ref); + throw ex; + } + if (xrefEntry instanceof Dict) { + xrefEntry.objId = ref.toString(); + } else if (xrefEntry instanceof BaseStream) { + xrefEntry.dict.objId = ref.toString(); + } + return xrefEntry; + } + fetchUncompressed(ref, xrefEntry, suppressEncryption = false) { + const gen = ref.gen; + let num = ref.num; + if (xrefEntry.gen !== gen) { + const msg = `Inconsistent generation in XRef: ${ref}`; + if (this._generationFallback && xrefEntry.gen < gen) { + warn(msg); + return this.fetchUncompressed(Ref.get(num, xrefEntry.gen), xrefEntry, suppressEncryption); + } + throw new XRefEntryException(msg); + } + const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); + const parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true + }); + const obj1 = parser.getObj(); + const obj2 = parser.getObj(); + const obj3 = parser.getObj(); + if (obj1 !== num || obj2 !== gen || !(obj3 instanceof Cmd)) { + throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); + } + if (obj3.cmd !== "obj") { + if (obj3.cmd.startsWith("obj")) { + num = parseInt(obj3.cmd.substring(3), 10); + if (!Number.isNaN(num)) { + return num; + } + } + throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); + } + xrefEntry = this.encrypt && !suppressEncryption ? parser.getObj(this.encrypt.createCipherTransform(num, gen)) : parser.getObj(); + if (!(xrefEntry instanceof BaseStream)) { + this._cacheMap.set(num, xrefEntry); + } + return xrefEntry; + } + fetchCompressed(ref, xrefEntry, suppressEncryption = false) { + const tableOffset = xrefEntry.offset; + const stream = this.fetch(Ref.get(tableOffset, 0)); + if (!(stream instanceof BaseStream)) { + throw new FormatError("bad ObjStm stream"); + } + const first = stream.dict.get("First"); + const n = stream.dict.get("N"); + if (!Number.isInteger(first) || !Number.isInteger(n)) { + throw new FormatError("invalid first and n parameters for ObjStm stream"); + } + let parser = new Parser({ + lexer: new Lexer(stream), + xref: this, + allowStreams: true + }); + const nums = new Array(n); + const offsets = new Array(n); + for (let i = 0; i < n; ++i) { + const num = parser.getObj(); + if (!Number.isInteger(num)) { + throw new FormatError(`invalid object number in the ObjStm stream: ${num}`); + } + const offset = parser.getObj(); + if (!Number.isInteger(offset)) { + throw new FormatError(`invalid object offset in the ObjStm stream: ${offset}`); + } + nums[i] = num; + offsets[i] = offset; + } + const start = (stream.start || 0) + first; + const entries = new Array(n); + for (let i = 0; i < n; ++i) { + const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined; + if (length < 0) { + throw new FormatError("Invalid offset in the ObjStm stream."); + } + parser = new Parser({ + lexer: new Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)), + xref: this, + allowStreams: true + }); + const obj = parser.getObj(); + entries[i] = obj; + if (obj instanceof BaseStream) { + continue; + } + const num = nums[i], + entry = this.entries[num]; + if (entry && entry.offset === tableOffset && entry.gen === i) { + this._cacheMap.set(num, obj); + } + } + xrefEntry = entries[xrefEntry.gen]; + if (xrefEntry === undefined) { + throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`); + } + return xrefEntry; + } + async fetchIfRefAsync(obj, suppressEncryption) { + if (obj instanceof Ref) { + return this.fetchAsync(obj, suppressEncryption); + } + return obj; + } + async fetchAsync(ref, suppressEncryption) { + try { + return this.fetch(ref, suppressEncryption); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.pdfManager.requestRange(ex.begin, ex.end); + return this.fetchAsync(ref, suppressEncryption); + } + } + getCatalogObj() { + return this.root; + } +} + +;// ./src/core/document.js + + + + + + + + + + + + + + + + + + + +const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; +class Page { + constructor({ + pdfManager, + xref, + pageIndex, + pageDict, + ref, + globalIdFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + systemFontCache, + nonBlendModesSet, + xfaFactory + }) { + this.pdfManager = pdfManager; + this.pageIndex = pageIndex; + this.pageDict = pageDict; + this.xref = xref; + this.ref = ref; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalImageCache = globalImageCache; + this.systemFontCache = systemFontCache; + this.nonBlendModesSet = nonBlendModesSet; + this.evaluatorOptions = pdfManager.evaluatorOptions; + this.resourcesPromise = null; + this.xfaFactory = xfaFactory; + const idCounters = { + obj: 0 + }; + this._localIdFactory = class extends globalIdFactory { + static createObjId() { + return `p${pageIndex}_${++idCounters.obj}`; + } + static getPageObjId() { + return `p${ref.toString()}`; + } + }; + } + _getInheritableProperty(key, getArray = false) { + const value = getInheritableProperty({ + dict: this.pageDict, + key, + getArray, + stopWhenFound: false + }); + if (!Array.isArray(value)) { + return value; + } + if (value.length === 1 || !(value[0] instanceof Dict)) { + return value[0]; + } + return Dict.merge({ + xref: this.xref, + dictArray: value + }); + } + get content() { + return this.pageDict.getArray("Contents"); + } + get resources() { + const resources = this._getInheritableProperty("Resources"); + return shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty); + } + _getBoundingBox(name) { + if (this.xfaData) { + return this.xfaData.bbox; + } + const box = lookupNormalRect(this._getInheritableProperty(name, true), null); + if (box) { + if (box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return box; + } + warn(`Empty, or invalid, /${name} entry.`); + } + return null; + } + get mediaBox() { + return shadow(this, "mediaBox", this._getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); + } + get cropBox() { + return shadow(this, "cropBox", this._getBoundingBox("CropBox") || this.mediaBox); + } + get userUnit() { + const obj = this.pageDict.get("UserUnit"); + return shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0); + } + get view() { + const { + cropBox, + mediaBox + } = this; + if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) { + const box = Util.intersect(cropBox, mediaBox); + if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return shadow(this, "view", box); + } + warn("Empty /CropBox and /MediaBox intersection."); + } + return shadow(this, "view", mediaBox); + } + get rotate() { + let rotate = this._getInheritableProperty("Rotate") || 0; + if (rotate % 90 !== 0) { + rotate = 0; + } else if (rotate >= 360) { + rotate %= 360; + } else if (rotate < 0) { + rotate = (rotate % 360 + 360) % 360; + } + return shadow(this, "rotate", rotate); + } + _onSubStreamError(reason, objId) { + if (this.evaluatorOptions.ignoreErrors) { + warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); + return; + } + throw reason; + } + getContentStream() { + return this.pdfManager.ensure(this, "content").then(content => { + if (content instanceof BaseStream) { + return content; + } + if (Array.isArray(content)) { + return new StreamsSequenceStream(content, this._onSubStreamError.bind(this)); + } + return new NullStream(); + }); + } + get xfaData() { + return shadow(this, "xfaData", this.xfaFactory ? { + bbox: this.xfaFactory.getBoundingBox(this.pageIndex) + } : null); + } + async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { + const promises = []; + for (const annotation of annotations) { + if (annotation.id) { + const ref = Ref.fromString(annotation.id); + if (!ref) { + warn(`A non-linked annotation cannot be modified: ${annotation.id}`); + continue; + } + if (annotation.deleted) { + deletedAnnotations.put(ref, ref); + if (annotation.popupRef) { + const popupRef = Ref.fromString(annotation.popupRef); + if (popupRef) { + deletedAnnotations.put(popupRef, popupRef); + } + } + continue; + } + existingAnnotations?.put(ref); + annotation.ref = ref; + promises.push(this.xref.fetchAsync(ref).then(obj => { + if (obj instanceof Dict) { + annotation.oldAnnotation = obj.clone(); + } + }, () => { + warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`); + })); + delete annotation.id; + } + } + await Promise.all(promises); + } + async saveNewAnnotations(handler, task, annotations, imagePromises, changes) { + if (this.xfaFactory) { + throw new Error("XFA: Cannot save new annotations."); + } + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + const deletedAnnotations = new RefSetCache(); + const existingAnnotations = new RefSet(); + await this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations); + const pageDict = this.pageDict; + const annotationsArray = this.annotations.filter(a => !(a instanceof Ref && deletedAnnotations.has(a))); + const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, task, annotations, imagePromises, changes); + for (const { + ref + } of newData.annotations) { + if (ref instanceof Ref && !existingAnnotations.has(ref)) { + annotationsArray.push(ref); + } + } + const dict = pageDict.clone(); + dict.set("Annots", annotationsArray); + changes.put(this.ref, { + data: dict + }); + for (const deletedRef of deletedAnnotations) { + changes.put(deletedRef, { + data: null + }); + } + } + save(handler, task, annotationStorage, changes) { + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + return this._parsedAnnotations.then(function (annotations) { + const promises = []; + for (const annotation of annotations) { + promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(function (reason) { + warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return null; + })); + } + return Promise.all(promises); + }); + } + loadResources(keys) { + this.resourcesPromise ||= this.pdfManager.ensure(this, "resources"); + return this.resourcesPromise.then(() => { + const objectLoader = new ObjectLoader(this.resources, keys, this.xref); + return objectLoader.load(); + }); + } + getOperatorList({ + handler, + sink, + task, + intent, + cacheKey, + annotationStorage = null, + modifiedIds = null + }) { + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]); + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + const newAnnotsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null; + const newAnnots = newAnnotsByPage?.get(this.pageIndex); + let newAnnotationsPromise = Promise.resolve(null); + let deletedAnnotations = null; + if (newAnnots) { + const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals"); + let imagePromises; + const missingBitmaps = new Set(); + for (const { + bitmapId, + bitmap + } of newAnnots) { + if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) { + missingBitmaps.add(bitmapId); + } + } + const { + isOffscreenCanvasSupported + } = this.evaluatorOptions; + if (missingBitmaps.size > 0) { + const annotationWithBitmaps = newAnnots.slice(); + for (const [key, annotation] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; + } + if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) { + annotationWithBitmaps.push(annotation); + } + } + imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported); + } else { + imagePromises = AnnotationFactory.generateImages(newAnnots, this.xref, isOffscreenCanvasSupported); + } + deletedAnnotations = new RefSet(); + newAnnotationsPromise = Promise.all([annotationGlobalsPromise, this.#replaceIdByRef(newAnnots, deletedAnnotations, null)]).then(([annotationGlobals]) => { + if (!annotationGlobals) { + return null; + } + return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnots, imagePromises); + }); + } + const pageListPromise = Promise.all([contentStreamPromise, resourcesPromise]).then(([contentStream]) => { + const opList = new OperatorList(intent, sink); + handler.send("StartRenderPage", { + transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet), + pageIndex: this.pageIndex, + cacheKey + }); + return partialEvaluator.getOperatorList({ + stream: contentStream, + task, + resources: this.resources, + operatorList: opList + }).then(function () { + return opList; + }); + }); + return Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]).then(function ([pageOpList, annotations, newAnnotations]) { + if (newAnnotations) { + annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref))); + for (let i = 0, ii = newAnnotations.length; i < ii; i++) { + const newAnnotation = newAnnotations[i]; + if (newAnnotation.refToReplace) { + const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace)); + if (j >= 0) { + annotations.splice(j, 1, newAnnotation); + newAnnotations.splice(i--, 1); + ii--; + } + } + } + annotations = annotations.concat(newAnnotations); + } + if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) { + pageOpList.flush(true); + return { + length: pageOpList.totalLength + }; + } + const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), + isEditing = !!(intent & RenderingIntentFlag.IS_EDITING), + intentAny = !!(intent & RenderingIntentFlag.ANY), + intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & RenderingIntentFlag.PRINT); + const opListPromises = []; + for (const annotation of annotations) { + if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) { + opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) { + warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return { + opList: null, + separateForm: false, + separateCanvas: false + }; + })); + } + } + return Promise.all(opListPromises).then(function (opLists) { + let form = false, + canvas = false; + for (const { + opList, + separateForm, + separateCanvas + } of opLists) { + pageOpList.addOpList(opList); + form ||= separateForm; + canvas ||= separateCanvas; + } + pageOpList.flush(true, { + form, + canvas + }); + return { + length: pageOpList.totalLength + }; + }); + }); + } + async extractTextContent({ + handler, + task, + includeMarkedContent, + disableNormalization, + sink + }) { + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]); + const langPromise = this.pdfManager.ensureCatalog("lang"); + const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]); + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + return partialEvaluator.getTextContent({ + stream: contentStream, + task, + resources: this.resources, + includeMarkedContent, + disableNormalization, + sink, + viewBox: this.view, + lang + }); + } + async getStructTree() { + const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot"); + if (!structTreeRoot) { + return null; + } + await this._parsedAnnotations; + const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); + return this.pdfManager.ensure(structTree, "serializable"); + } + _parseStructTree(structTreeRoot) { + const tree = new StructTreePage(structTreeRoot, this.pageDict); + tree.parse(this.ref); + return tree; + } + async getAnnotationsData(handler, task, intent) { + const annotations = await this._parsedAnnotations; + if (annotations.length === 0) { + return annotations; + } + const annotationsData = [], + textContentPromises = []; + let partialEvaluator; + const intentAny = !!(intent & RenderingIntentFlag.ANY), + intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & RenderingIntentFlag.PRINT); + for (const annotation of annotations) { + const isVisible = intentAny || intentDisplay && annotation.viewable; + if (isVisible || intentPrint && annotation.printable) { + annotationsData.push(annotation.data); + } + if (annotation.hasTextContent && isVisible) { + partialEvaluator ||= new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(function (reason) { + warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`); + })); + } + } + await Promise.all(textContentPromises); + return annotationsData; + } + get annotations() { + const annots = this._getInheritableProperty("Annots"); + return shadow(this, "annotations", Array.isArray(annots) ? annots : []); + } + get _parsedAnnotations() { + const promise = this.pdfManager.ensure(this, "annotations").then(async annots => { + if (annots.length === 0) { + return annots; + } + const [annotationGlobals, fieldObjects] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureDoc("fieldObjects")]); + if (!annotationGlobals) { + return []; + } + const orphanFields = fieldObjects?.orphanFields; + const annotationPromises = []; + for (const annotationRef of annots) { + annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, this.ref).catch(function (reason) { + warn(`_parsedAnnotations: "${reason}".`); + return null; + })); + } + const sortedAnnotations = []; + let popupAnnotations, widgetAnnotations; + for (const annotation of await Promise.all(annotationPromises)) { + if (!annotation) { + continue; + } + if (annotation instanceof WidgetAnnotation) { + (widgetAnnotations ||= []).push(annotation); + continue; + } + if (annotation instanceof PopupAnnotation) { + (popupAnnotations ||= []).push(annotation); + continue; + } + sortedAnnotations.push(annotation); + } + if (widgetAnnotations) { + sortedAnnotations.push(...widgetAnnotations); + } + if (popupAnnotations) { + sortedAnnotations.push(...popupAnnotations); + } + return sortedAnnotations; + }); + return shadow(this, "_parsedAnnotations", promise); + } + get jsActions() { + const actions = collectActions(this.xref, this.pageDict, PageActionEventType); + return shadow(this, "jsActions", actions); + } +} +const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]); +const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]); +const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]); +function find(stream, signature, limit = 1024, backwards = false) { + const signatureLength = signature.length; + const scanBytes = stream.peekBytes(limit); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + return false; + } + if (backwards) { + const signatureEnd = signatureLength - 1; + let pos = scanBytes.length - 1; + while (pos >= signatureEnd) { + let j = 0; + while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos - signatureEnd; + return true; + } + pos--; + } + } else { + let pos = 0; + while (pos <= scanLength) { + let j = 0; + while (j < signatureLength && scanBytes[pos + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos; + return true; + } + pos++; + } + } + return false; +} +class PDFDocument { + constructor(pdfManager, stream) { + if (stream.length <= 0) { + throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes."); + } + this.pdfManager = pdfManager; + this.stream = stream; + this.xref = new XRef(stream, pdfManager); + this._pagePromises = new Map(); + this._version = null; + const idCounters = { + font: 0 + }; + this._globalIdFactory = class { + static getDocId() { + return `g_${pdfManager.docId}`; + } + static createFontId() { + return `f${++idCounters.font}`; + } + static createObjId() { + unreachable("Abstract method `createObjId` called."); + } + static getPageObjId() { + unreachable("Abstract method `getPageObjId` called."); + } + }; + } + parse(recoveryMode) { + this.xref.parse(recoveryMode); + this.catalog = new Catalog(this.pdfManager, this.xref); + } + get linearization() { + let linearization = null; + try { + linearization = Linearization.create(this.stream); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info(err); + } + return shadow(this, "linearization", linearization); + } + get startXRef() { + const stream = this.stream; + let startXRef = 0; + if (this.linearization) { + stream.reset(); + if (find(stream, ENDOBJ_SIGNATURE)) { + stream.skip(6); + let ch = stream.peekByte(); + while (isWhiteSpace(ch)) { + stream.pos++; + ch = stream.peekByte(); + } + startXRef = stream.pos - stream.start; + } + } else { + const step = 1024; + const startXRefLength = STARTXREF_SIGNATURE.length; + let found = false, + pos = stream.end; + while (!found && pos > 0) { + pos -= step - startXRefLength; + if (pos < 0) { + pos = 0; + } + stream.pos = pos; + found = find(stream, STARTXREF_SIGNATURE, step, true); + } + if (found) { + stream.skip(9); + let ch; + do { + ch = stream.getByte(); + } while (isWhiteSpace(ch)); + let str = ""; + while (ch >= 0x20 && ch <= 0x39) { + str += String.fromCharCode(ch); + ch = stream.getByte(); + } + startXRef = parseInt(str, 10); + if (isNaN(startXRef)) { + startXRef = 0; + } + } + } + return shadow(this, "startXRef", startXRef); + } + checkHeader() { + const stream = this.stream; + stream.reset(); + if (!find(stream, PDF_HEADER_SIGNATURE)) { + return; + } + stream.moveStart(); + stream.skip(PDF_HEADER_SIGNATURE.length); + let version = "", + ch; + while ((ch = stream.getByte()) > 0x20 && version.length < 7) { + version += String.fromCharCode(ch); + } + if (PDF_VERSION_REGEXP.test(version)) { + this._version = version; + } else { + warn(`Invalid PDF header version: ${version}`); + } + } + parseStartXRef() { + this.xref.setStartXRef(this.startXRef); + } + get numPages() { + let num = 0; + if (this.catalog.hasActualNumPages) { + num = this.catalog.numPages; + } else if (this.xfaFactory) { + num = this.xfaFactory.getNumPages(); + } else if (this.linearization) { + num = this.linearization.numPages; + } else { + num = this.catalog.numPages; + } + return shadow(this, "numPages", num); + } + _hasOnlyDocumentSignatures(fields, recursionDepth = 0) { + const RECURSION_LIMIT = 10; + if (!Array.isArray(fields)) { + return false; + } + return fields.every(field => { + field = this.xref.fetchIfRef(field); + if (!(field instanceof Dict)) { + return false; + } + if (field.has("Kids")) { + if (++recursionDepth > RECURSION_LIMIT) { + warn("_hasOnlyDocumentSignatures: maximum recursion depth reached"); + return false; + } + return this._hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); + } + const isSignature = isName(field.get("FT"), "Sig"); + const rectangle = field.get("Rect"); + const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0); + return isSignature && isInvisible; + }); + } + get _xfaStreams() { + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return null; + } + const xfa = acroForm.get("XFA"); + const entries = { + "xdp:xdp": "", + template: "", + datasets: "", + config: "", + connectionSet: "", + localeSet: "", + stylesheet: "", + "/xdp:xdp": "" + }; + if (xfa instanceof BaseStream && !xfa.isEmpty) { + entries["xdp:xdp"] = xfa; + return entries; + } + if (!Array.isArray(xfa) || xfa.length === 0) { + return null; + } + for (let i = 0, ii = xfa.length; i < ii; i += 2) { + let name; + if (i === 0) { + name = "xdp:xdp"; + } else if (i === ii - 2) { + name = "/xdp:xdp"; + } else { + name = xfa[i]; + } + if (!entries.hasOwnProperty(name)) { + continue; + } + const data = this.xref.fetchIfRef(xfa[i + 1]); + if (!(data instanceof BaseStream) || data.isEmpty) { + continue; + } + entries[name] = data; + } + return entries; + } + get xfaDatasets() { + const streams = this._xfaStreams; + if (!streams) { + return shadow(this, "xfaDatasets", null); + } + for (const key of ["datasets", "xdp:xdp"]) { + const stream = streams[key]; + if (!stream) { + continue; + } + try { + const str = stringToUTF8String(stream.getString()); + const data = { + [key]: str + }; + return shadow(this, "xfaDatasets", new DatasetReader(data)); + } catch { + warn("XFA - Invalid utf-8 string."); + break; + } + } + return shadow(this, "xfaDatasets", null); + } + get xfaData() { + const streams = this._xfaStreams; + if (!streams) { + return null; + } + const data = Object.create(null); + for (const [key, stream] of Object.entries(streams)) { + if (!stream) { + continue; + } + try { + data[key] = stringToUTF8String(stream.getString()); + } catch { + warn("XFA - Invalid utf-8 string."); + return null; + } + } + return data; + } + get xfaFactory() { + let data; + if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) { + data = this.xfaData; + } + return shadow(this, "xfaFactory", data ? new XFAFactory(data) : null); + } + get isPureXfa() { + return this.xfaFactory ? this.xfaFactory.isValid() : false; + } + get htmlForXfa() { + return this.xfaFactory ? this.xfaFactory.getPages() : null; + } + async loadXfaImages() { + const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages"); + if (!xfaImagesDict) { + return; + } + const keys = xfaImagesDict.getKeys(); + const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref); + await objectLoader.load(); + const xfaImages = new Map(); + for (const key of keys) { + const stream = xfaImagesDict.get(key); + if (stream instanceof BaseStream) { + xfaImages.set(key, stream.getBytes()); + } + } + this.xfaFactory.setImages(xfaImages); + } + async loadXfaFonts(handler, task) { + const acroForm = await this.pdfManager.ensureCatalog("acroForm"); + if (!acroForm) { + return; + } + const resources = await acroForm.getAsync("DR"); + if (!(resources instanceof Dict)) { + return; + } + const objectLoader = new ObjectLoader(resources, ["Font"], this.xref); + await objectLoader.load(); + const fontRes = resources.get("Font"); + if (!(fontRes instanceof Dict)) { + return; + } + const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions); + options.useSystemFonts = false; + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: -1, + idFactory: this._globalIdFactory, + fontCache: this.catalog.fontCache, + builtInCMapCache: this.catalog.builtInCMapCache, + standardFontDataCache: this.catalog.standardFontDataCache, + options + }); + const operatorList = new OperatorList(); + const pdfFonts = []; + const initialState = { + get font() { + return pdfFonts.at(-1); + }, + set font(font) { + pdfFonts.push(font); + }, + clone() { + return this; + } + }; + const promises = []; + for (const [fontName, font] of fontRes) { + const descriptor = font.get("FontDescriptor"); + if (!(descriptor instanceof Dict)) { + continue; + } + let fontFamily = descriptor.get("FontFamily"); + fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1"); + const fontWeight = descriptor.get("FontWeight"); + const italicAngle = -descriptor.get("ItalicAngle"); + const cssFontInfo = { + fontFamily, + fontWeight, + italicAngle + }; + if (!validateCSSFont(cssFontInfo)) { + continue; + } + promises.push(partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, null, cssFontInfo).catch(function (reason) { + warn(`loadXfaFonts: "${reason}".`); + return null; + })); + } + await Promise.all(promises); + const missingFonts = this.xfaFactory.setFonts(pdfFonts); + if (!missingFonts) { + return; + } + options.ignoreErrors = true; + promises.length = 0; + pdfFonts.length = 0; + const reallyMissingFonts = new Set(); + for (const missing of missingFonts) { + if (!getXfaFontName(`${missing}-Regular`)) { + reallyMissingFonts.add(missing); + } + } + if (reallyMissingFonts.size) { + missingFonts.push("PdfJS-Fallback"); + } + for (const missing of missingFonts) { + if (reallyMissingFonts.has(missing)) { + continue; + } + for (const fontInfo of [{ + name: "Regular", + fontWeight: 400, + italicAngle: 0 + }, { + name: "Bold", + fontWeight: 700, + italicAngle: 0 + }, { + name: "Italic", + fontWeight: 400, + italicAngle: 12 + }, { + name: "BoldItalic", + fontWeight: 700, + italicAngle: 12 + }]) { + const name = `${missing}-${fontInfo.name}`; + const dict = getXfaFontDict(name); + promises.push(partialEvaluator.handleSetFont(resources, [Name.get(name), 1], null, operatorList, task, initialState, dict, { + fontFamily: missing, + fontWeight: fontInfo.fontWeight, + italicAngle: fontInfo.italicAngle + }).catch(function (reason) { + warn(`loadXfaFonts: "${reason}".`); + return null; + })); + } + } + await Promise.all(promises); + this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); + } + async serializeXfaData(annotationStorage) { + return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null; + } + get version() { + return this.catalog.version || this._version; + } + get formInfo() { + const formInfo = { + hasFields: false, + hasAcroForm: false, + hasXfa: false, + hasSignatures: false + }; + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return shadow(this, "formInfo", formInfo); + } + try { + const fields = acroForm.get("Fields"); + const hasFields = Array.isArray(fields) && fields.length > 0; + formInfo.hasFields = hasFields; + const xfa = acroForm.get("XFA"); + formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof BaseStream && !xfa.isEmpty; + const sigFlags = acroForm.get("SigFlags"); + const hasSignatures = !!(sigFlags & 0x1); + const hasOnlyDocumentSignatures = hasSignatures && this._hasOnlyDocumentSignatures(fields); + formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; + formInfo.hasSignatures = hasSignatures; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Cannot fetch form information: "${ex}".`); + } + return shadow(this, "formInfo", formInfo); + } + get documentInfo() { + const docInfo = { + PDFFormatVersion: this.version, + Language: this.catalog.lang, + EncryptFilterName: this.xref.encrypt ? this.xref.encrypt.filterName : null, + IsLinearized: !!this.linearization, + IsAcroFormPresent: this.formInfo.hasAcroForm, + IsXFAPresent: this.formInfo.hasXfa, + IsCollectionPresent: !!this.catalog.collection, + IsSignaturesPresent: this.formInfo.hasSignatures + }; + let infoDict; + try { + infoDict = this.xref.trailer.get("Info"); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info("The document information dictionary is invalid."); + } + if (!(infoDict instanceof Dict)) { + return shadow(this, "documentInfo", docInfo); + } + for (const key of infoDict.getKeys()) { + const value = infoDict.get(key); + switch (key) { + case "Title": + case "Author": + case "Subject": + case "Keywords": + case "Creator": + case "Producer": + case "CreationDate": + case "ModDate": + if (typeof value === "string") { + docInfo[key] = stringToPDFString(value); + continue; + } + break; + case "Trapped": + if (value instanceof Name) { + docInfo[key] = value; + continue; + } + break; + default: + let customValue; + switch (typeof value) { + case "string": + customValue = stringToPDFString(value); + break; + case "number": + case "boolean": + customValue = value; + break; + default: + if (value instanceof Name) { + customValue = value; + } + break; + } + if (customValue === undefined) { + warn(`Bad value, for custom key "${key}", in Info: ${value}.`); + continue; + } + if (!docInfo.Custom) { + docInfo.Custom = Object.create(null); + } + docInfo.Custom[key] = customValue; + continue; + } + warn(`Bad value, for key "${key}", in Info: ${value}.`); + } + return shadow(this, "documentInfo", docInfo); + } + get fingerprints() { + const FINGERPRINT_FIRST_BYTES = 1024; + const EMPTY_FINGERPRINT = "\x00".repeat(16); + function validate(data) { + return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT; + } + const id = this.xref.trailer.get("ID"); + let hashOriginal, hashModified; + if (Array.isArray(id) && validate(id[0])) { + hashOriginal = stringToBytes(id[0]); + if (id[1] !== id[0] && validate(id[1])) { + hashModified = stringToBytes(id[1]); + } + } else { + hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); + } + return shadow(this, "fingerprints", [toHexUtil(hashOriginal), hashModified ? toHexUtil(hashModified) : null]); + } + async _getLinearizationPage(pageIndex) { + const { + catalog, + linearization, + xref + } = this; + const ref = Ref.get(linearization.objectNumberFirst, 0); + try { + const obj = await xref.fetchAsync(ref); + if (obj instanceof Dict) { + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) { + if (!catalog.pageKidsCountCache.has(ref)) { + catalog.pageKidsCountCache.put(ref, 1); + } + if (!catalog.pageIndexCache.has(ref)) { + catalog.pageIndexCache.put(ref, 0); + } + return [obj, ref]; + } + } + throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary."); + } catch (reason) { + warn(`_getLinearizationPage: "${reason.message}".`); + return catalog.getPageDict(pageIndex); + } + } + getPage(pageIndex) { + const cachedPromise = this._pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const { + catalog, + linearization, + xfaFactory + } = this; + let promise; + if (xfaFactory) { + promise = Promise.resolve([Dict.empty, null]); + } else if (linearization?.pageFirst === pageIndex) { + promise = this._getLinearizationPage(pageIndex); + } else { + promise = catalog.getPageDict(pageIndex); + } + promise = promise.then(([pageDict, ref]) => { + return new Page({ + pdfManager: this.pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory + }); + }); + this._pagePromises.set(pageIndex, promise); + return promise; + } + async checkFirstPage(recoveryMode = false) { + if (recoveryMode) { + return; + } + try { + await this.getPage(0); + } catch (reason) { + if (reason instanceof XRefEntryException) { + this._pagePromises.delete(0); + await this.cleanup(); + throw new XRefParseException(); + } + } + } + async checkLastPage(recoveryMode = false) { + const { + catalog, + pdfManager + } = this; + catalog.setActualNumPages(); + let numPages; + try { + await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]); + if (this.xfaFactory) { + return; + } else if (this.linearization) { + numPages = this.linearization.numPages; + } else { + numPages = catalog.numPages; + } + if (!Number.isInteger(numPages)) { + throw new FormatError("Page count is not an integer."); + } else if (numPages <= 1) { + return; + } + await this.getPage(numPages - 1); + } catch (reason) { + this._pagePromises.delete(numPages - 1); + await this.cleanup(); + if (reason instanceof XRefEntryException && !recoveryMode) { + throw new XRefParseException(); + } + warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`); + let pagesTree; + try { + pagesTree = await catalog.getAllPageDicts(recoveryMode); + } catch (reasonAll) { + if (reasonAll instanceof XRefEntryException && !recoveryMode) { + throw new XRefParseException(); + } + catalog.setActualNumPages(1); + return; + } + for (const [pageIndex, [pageDict, ref]] of pagesTree) { + let promise; + if (pageDict instanceof Error) { + promise = Promise.reject(pageDict); + promise.catch(() => {}); + } else { + promise = Promise.resolve(new Page({ + pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory: null + })); + } + this._pagePromises.set(pageIndex, promise); + } + catalog.setActualNumPages(pagesTree.size); + } + } + fontFallback(id, handler) { + return this.catalog.fontFallback(id, handler); + } + async cleanup(manuallyTriggered = false) { + return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches(); + } + async #collectFieldObjects(name, parentRef, fieldRef, promises, annotationGlobals, visitedRefs, orphanFields) { + const { + xref + } = this; + if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) { + return; + } + visitedRefs.put(fieldRef); + const field = await xref.fetchAsync(fieldRef); + if (!(field instanceof Dict)) { + return; + } + if (field.has("T")) { + const partName = stringToPDFString(await field.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; + } else { + let obj = field; + while (true) { + obj = obj.getRaw("Parent") || parentRef; + if (obj instanceof Ref) { + if (visitedRefs.has(obj)) { + break; + } + obj = await xref.fetchAsync(obj); + } + if (!(obj instanceof Dict)) { + break; + } + if (obj.has("T")) { + const partName = stringToPDFString(await obj.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; + break; + } + } + } + if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) { + orphanFields.put(fieldRef, parentRef); + } + if (!promises.has(name)) { + promises.set(name, []); + } + promises.get(name).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) { + warn(`#collectFieldObjects: "${reason}".`); + return null; + })); + if (!field.has("Kids")) { + return; + } + const kids = await field.getAsync("Kids"); + if (Array.isArray(kids)) { + for (const kid of kids) { + await this.#collectFieldObjects(name, fieldRef, kid, promises, annotationGlobals, visitedRefs, orphanFields); + } + } + } + get fieldObjects() { + const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => { + if (!formInfo.hasFields) { + return null; + } + const [annotationGlobals, acroForm] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureCatalog("acroForm")]); + if (!annotationGlobals) { + return null; + } + const visitedRefs = new RefSet(); + const allFields = Object.create(null); + const fieldPromises = new Map(); + const orphanFields = new RefSetCache(); + for (const fieldRef of await acroForm.getAsync("Fields")) { + await this.#collectFieldObjects("", null, fieldRef, fieldPromises, annotationGlobals, visitedRefs, orphanFields); + } + const allPromises = []; + for (const [name, promises] of fieldPromises) { + allPromises.push(Promise.all(promises).then(fields => { + fields = fields.filter(field => !!field); + if (fields.length > 0) { + allFields[name] = fields; + } + })); + } + await Promise.all(allPromises); + return { + allFields, + orphanFields + }; + }); + return shadow(this, "fieldObjects", promise); + } + get hasJSActions() { + const promise = this.pdfManager.ensureDoc("_parseHasJSActions"); + return shadow(this, "hasJSActions", promise); + } + async _parseHasJSActions() { + const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]); + if (catalogJsActions) { + return true; + } + if (fieldObjects) { + return Object.values(fieldObjects.allFields).some(fieldObject => fieldObject.some(object => object.actions !== null)); + } + return false; + } + get calculationOrderIds() { + const calculationOrder = this.catalog.acroForm?.get("CO"); + if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { + return shadow(this, "calculationOrderIds", null); + } + const ids = []; + for (const id of calculationOrder) { + if (id instanceof Ref) { + ids.push(id.toString()); + } + } + return shadow(this, "calculationOrderIds", ids.length ? ids : null); + } + get annotationGlobals() { + return shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager)); + } +} + +;// ./src/core/pdf_manager.js + + + + + +function parseDocBaseUrl(url) { + if (url) { + const absoluteUrl = createValidAbsoluteUrl(url); + if (absoluteUrl) { + return absoluteUrl.href; + } + warn(`Invalid absolute docBaseUrl: "${url}".`); + } + return null; +} +class BasePdfManager { + constructor(args) { + this._docBaseUrl = parseDocBaseUrl(args.docBaseUrl); + this._docId = args.docId; + this._password = args.password; + this.enableXfa = args.enableXfa; + args.evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; + args.evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported; + this.evaluatorOptions = Object.freeze(args.evaluatorOptions); + } + get docId() { + return this._docId; + } + get password() { + return this._password; + } + get docBaseUrl() { + return this._docBaseUrl; + } + get catalog() { + return this.pdfDocument.catalog; + } + ensureDoc(prop, args) { + return this.ensure(this.pdfDocument, prop, args); + } + ensureXRef(prop, args) { + return this.ensure(this.pdfDocument.xref, prop, args); + } + ensureCatalog(prop, args) { + return this.ensure(this.pdfDocument.catalog, prop, args); + } + getPage(pageIndex) { + return this.pdfDocument.getPage(pageIndex); + } + fontFallback(id, handler) { + return this.pdfDocument.fontFallback(id, handler); + } + loadXfaFonts(handler, task) { + return this.pdfDocument.loadXfaFonts(handler, task); + } + loadXfaImages() { + return this.pdfDocument.loadXfaImages(); + } + serializeXfaData(annotationStorage) { + return this.pdfDocument.serializeXfaData(annotationStorage); + } + cleanup(manuallyTriggered = false) { + return this.pdfDocument.cleanup(manuallyTriggered); + } + async ensure(obj, prop, args) { + unreachable("Abstract method `ensure` called"); + } + requestRange(begin, end) { + unreachable("Abstract method `requestRange` called"); + } + requestLoadedStream(noFetch = false) { + unreachable("Abstract method `requestLoadedStream` called"); + } + sendProgressiveData(chunk) { + unreachable("Abstract method `sendProgressiveData` called"); + } + updatePassword(password) { + this._password = password; + } + terminate(reason) { + unreachable("Abstract method `terminate` called"); + } +} +class LocalPdfManager extends BasePdfManager { + constructor(args) { + super(args); + const stream = new Stream(args.source); + this.pdfDocument = new PDFDocument(this, stream); + this._loadedStreamPromise = Promise.resolve(stream); + } + async ensure(obj, prop, args) { + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; + } + requestRange(begin, end) { + return Promise.resolve(); + } + requestLoadedStream(noFetch = false) { + return this._loadedStreamPromise; + } + terminate(reason) {} +} +class NetworkPdfManager extends BasePdfManager { + constructor(args) { + super(args); + this.streamManager = new ChunkedStreamManager(args.source, { + msgHandler: args.handler, + length: args.length, + disableAutoFetch: args.disableAutoFetch, + rangeChunkSize: args.rangeChunkSize + }); + this.pdfDocument = new PDFDocument(this, this.streamManager.getStream()); + } + async ensure(obj, prop, args) { + try { + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.requestRange(ex.begin, ex.end); + return this.ensure(obj, prop, args); + } + } + requestRange(begin, end) { + return this.streamManager.requestRange(begin, end); + } + requestLoadedStream(noFetch = false) { + return this.streamManager.requestAllChunks(noFetch); + } + sendProgressiveData(chunk) { + this.streamManager.onReceiveData({ + chunk + }); + } + terminate(reason) { + this.streamManager.abort(reason); + } +} + +;// ./src/core/writer.js + + + + + + + +async function writeObject(ref, obj, buffer, { + encrypt = null +}) { + const transform = encrypt?.createCipherTransform(ref.num, ref.gen); + buffer.push(`${ref.num} ${ref.gen} obj\n`); + if (obj instanceof Dict) { + await writeDict(obj, buffer, transform); + } else if (obj instanceof BaseStream) { + await writeStream(obj, buffer, transform); + } else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { + await writeArray(obj, buffer, transform); + } + buffer.push("\nendobj\n"); +} +async function writeDict(dict, buffer, transform) { + buffer.push("<<"); + for (const key of dict.getKeys()) { + buffer.push(` /${escapePDFName(key)} `); + await writeValue(dict.getRaw(key), buffer, transform); + } + buffer.push(">>"); +} +async function writeStream(stream, buffer, transform) { + let bytes = stream.getBytes(); + const { + dict + } = stream; + const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]); + const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter; + const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode"); + const MIN_LENGTH_FOR_COMPRESSING = 256; + if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode) { + try { + const cs = new CompressionStream("deflate"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + const buf = await new Response(cs.readable).arrayBuffer(); + bytes = new Uint8Array(buf); + let newFilter, newParams; + if (!filter) { + newFilter = Name.get("FlateDecode"); + } else if (!isFilterZeroFlateDecode) { + newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter]; + if (params) { + newParams = Array.isArray(params) ? [null, ...params] : [null, params]; + } + } + if (newFilter) { + dict.set("Filter", newFilter); + } + if (newParams) { + dict.set("DecodeParms", newParams); + } + } catch (ex) { + info(`writeStream - cannot compress data: "${ex}".`); + } + } + let string = bytesToString(bytes); + if (transform) { + string = transform.encryptString(string); + } + dict.set("Length", string.length); + await writeDict(dict, buffer, transform); + buffer.push(" stream\n", string, "\nendstream"); +} +async function writeArray(array, buffer, transform) { + buffer.push("["); + let first = true; + for (const val of array) { + if (!first) { + buffer.push(" "); + } else { + first = false; + } + await writeValue(val, buffer, transform); + } + buffer.push("]"); +} +async function writeValue(value, buffer, transform) { + if (value instanceof Name) { + buffer.push(`/${escapePDFName(value.name)}`); + } else if (value instanceof Ref) { + buffer.push(`${value.num} ${value.gen} R`); + } else if (Array.isArray(value) || ArrayBuffer.isView(value)) { + await writeArray(value, buffer, transform); + } else if (typeof value === "string") { + if (transform) { + value = transform.encryptString(value); + } + buffer.push(`(${escapeString(value)})`); + } else if (typeof value === "number") { + buffer.push(numberToString(value)); + } else if (typeof value === "boolean") { + buffer.push(value.toString()); + } else if (value instanceof Dict) { + await writeDict(value, buffer, transform); + } else if (value instanceof BaseStream) { + await writeStream(value, buffer, transform); + } else if (value === null) { + buffer.push("null"); + } else { + warn(`Unhandled value in writer: ${typeof value}, please file a bug.`); + } +} +function writeInt(number, size, offset, buffer) { + for (let i = size + offset - 1; i > offset - 1; i--) { + buffer[i] = number & 0xff; + number >>= 8; + } + return offset + size; +} +function writeString(string, offset, buffer) { + for (let i = 0, len = string.length; i < len; i++) { + buffer[offset + i] = string.charCodeAt(i) & 0xff; + } +} +function computeMD5(filesize, xrefInfo) { + const time = Math.floor(Date.now() / 1000); + const filename = xrefInfo.filename || ""; + const md5Buffer = [time.toString(), filename, filesize.toString()]; + let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0); + for (const value of Object.values(xrefInfo.info)) { + md5Buffer.push(value); + md5BufferLen += value.length; + } + const array = new Uint8Array(md5BufferLen); + let offset = 0; + for (const str of md5Buffer) { + writeString(str, offset, array); + offset += str.length; + } + return bytesToString(calculateMD5(array)); +} +function writeXFADataForAcroform(str, changes) { + const xml = new SimpleXMLParser({ + hasAttributes: true + }).parseFromString(str); + for (const { + xfa + } of changes) { + if (!xfa) { + continue; + } + const { + path, + value + } = xfa; + if (!path) { + continue; + } + const nodePath = parseXFAPath(path); + let node = xml.documentElement.searchNode(nodePath, 0); + if (!node && nodePath.length > 1) { + node = xml.documentElement.searchNode([nodePath.at(-1)], 0); + } + if (node) { + node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)]; + } else { + warn(`Node not found for path: ${path}`); + } + } + const buffer = []; + xml.documentElement.dump(buffer); + return buffer.join(""); +} +async function updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + changes +}) { + if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { + warn("XFA - Cannot save it"); + } + if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) { + return; + } + const dict = acroForm.clone(); + if (hasXfa && !hasXfaDatasetsEntry) { + const newXfa = acroForm.get("XFA").slice(); + newXfa.splice(2, 0, "datasets"); + newXfa.splice(3, 0, xfaDatasetsRef); + dict.set("XFA", newXfa); + } + if (needAppearances) { + dict.set("NeedAppearances", true); + } + changes.put(acroFormRef, { + data: dict + }); +} +function updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref +}) { + if (xfaData === null) { + const datasets = xref.fetchIfRef(xfaDatasetsRef); + xfaData = writeXFADataForAcroform(datasets.getString(), changes); + } + const xfaDataStream = new StringStream(xfaData); + xfaDataStream.dict = new Dict(xref); + xfaDataStream.dict.set("Type", Name.get("EmbeddedFile")); + changes.put(xfaDatasetsRef, { + data: xfaDataStream + }); +} +async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { + buffer.push("xref\n"); + const indexes = getIndexes(newRefs); + let indexesPosition = 0; + for (const { + ref, + data + } of newRefs) { + if (ref.num === indexes[indexesPosition]) { + buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`); + indexesPosition += 2; + } + if (data !== null) { + buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`); + baseOffset += data.length; + } else { + buffer.push(`0000000000 ${Math.min(ref.gen + 1, 0xffff).toString().padStart(5, "0")} f\r\n`); + } + } + computeIDs(baseOffset, xrefInfo, newXref); + buffer.push("trailer\n"); + await writeDict(newXref, buffer); + buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function getIndexes(newRefs) { + const indexes = []; + for (const { + ref + } of newRefs) { + if (ref.num === indexes.at(-2) + indexes.at(-1)) { + indexes[indexes.length - 1] += 1; + } else { + indexes.push(ref.num, 1); + } + } + return indexes; +} +async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { + const xrefTableData = []; + let maxOffset = 0; + let maxGen = 0; + for (const { + ref, + data + } of newRefs) { + let gen; + maxOffset = Math.max(maxOffset, baseOffset); + if (data !== null) { + gen = Math.min(ref.gen, 0xffff); + xrefTableData.push([1, baseOffset, gen]); + baseOffset += data.length; + } else { + gen = Math.min(ref.gen + 1, 0xffff); + xrefTableData.push([0, 0, gen]); + } + maxGen = Math.max(maxGen, gen); + } + newXref.set("Index", getIndexes(newRefs)); + const offsetSize = getSizeInBytes(maxOffset); + const maxGenSize = getSizeInBytes(maxGen); + const sizes = [1, offsetSize, maxGenSize]; + newXref.set("W", sizes); + computeIDs(baseOffset, xrefInfo, newXref); + const structSize = sizes.reduce((a, x) => a + x, 0); + const data = new Uint8Array(structSize * xrefTableData.length); + const stream = new Stream(data); + stream.dict = newXref; + let offset = 0; + for (const [type, objOffset, gen] of xrefTableData) { + offset = writeInt(type, sizes[0], offset, data); + offset = writeInt(objOffset, sizes[1], offset, data); + offset = writeInt(gen, sizes[2], offset, data); + } + await writeObject(xrefInfo.newRef, stream, buffer, {}); + buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function computeIDs(baseOffset, xrefInfo, newXref) { + if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { + const md5 = computeMD5(baseOffset, xrefInfo); + newXref.set("ID", [xrefInfo.fileIds[0], md5]); + } +} +function getTrailerDict(xrefInfo, changes, useXrefStream) { + const newXref = new Dict(null); + newXref.set("Prev", xrefInfo.startXRef); + const refForXrefTable = xrefInfo.newRef; + if (useXrefStream) { + changes.put(refForXrefTable, { + data: "" + }); + newXref.set("Size", refForXrefTable.num + 1); + newXref.set("Type", Name.get("XRef")); + } else { + newXref.set("Size", refForXrefTable.num); + } + if (xrefInfo.rootRef !== null) { + newXref.set("Root", xrefInfo.rootRef); + } + if (xrefInfo.infoRef !== null) { + newXref.set("Info", xrefInfo.infoRef); + } + if (xrefInfo.encryptRef !== null) { + newXref.set("Encrypt", xrefInfo.encryptRef); + } + return newXref; +} +async function writeChanges(changes, xref, buffer = []) { + const newRefs = []; + for (const [ref, { + data + }] of changes.items()) { + if (data === null || typeof data === "string") { + newRefs.push({ + ref, + data + }); + continue; + } + await writeObject(ref, data, buffer, xref); + newRefs.push({ + ref, + data: buffer.join("") + }); + buffer.length = 0; + } + return newRefs.sort((a, b) => a.ref.num - b.ref.num); +} +async function incrementalUpdate({ + originalData, + xrefInfo, + changes, + xref = null, + hasXfa = false, + xfaDatasetsRef = null, + hasXfaDatasetsEntry = false, + needAppearances, + acroFormRef = null, + acroForm = null, + xfaData = null, + useXrefStream = false +}) { + await updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + changes + }); + if (hasXfa) { + updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref + }); + } + const newXref = getTrailerDict(xrefInfo, changes, useXrefStream); + const buffer = []; + const newRefs = await writeChanges(changes, xref, buffer); + let baseOffset = originalData.length; + const lastByte = originalData.at(-1); + if (lastByte !== 0x0a && lastByte !== 0x0d) { + buffer.push("\n"); + baseOffset += 1; + } + for (const { + data + } of newRefs) { + if (data !== null) { + buffer.push(data); + } + } + await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer)); + const totalLength = buffer.reduce((a, str) => a + str.length, originalData.length); + const array = new Uint8Array(totalLength); + array.set(originalData); + let offset = originalData.length; + for (const str of buffer) { + writeString(str, offset, array); + offset += str.length; + } + return array; +} + +;// ./src/shared/message_handler.js + +const CallbackKind = { + UNKNOWN: 0, + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + UNKNOWN: 0, + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(reason) { + if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (reason.name) { + case "AbortException": + return new AbortException(reason.message); + case "MissingPDFException": + return new MissingPDFException(reason.message); + case "PasswordException": + return new PasswordException(reason.message, reason.code); + case "UnexpectedResponseException": + return new UnexpectedResponseException(reason.message, reason.status); + case "UnknownErrorException": + return new UnknownErrorException(reason.message, reason.details); + default: + return new UnknownErrorException(reason.message, reason.toString()); + } +} +class MessageHandler { + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + Promise.try(action, data.data, streamSink).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/core/worker_stream.js + +class PDFWorkerStream { + constructor(msgHandler) { + this._msgHandler = msgHandler; + this._contentLength = null; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFWorkerStreamReader { + constructor(msgHandler) { + this._msgHandler = msgHandler; + this.onProgress = null; + this._contentLength = null; + this._isRangeSupported = false; + this._isStreamingSupported = false; + const readableStream = this._msgHandler.sendWithStream("GetReader"); + this._reader = readableStream.getReader(); + this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { + this._isStreamingSupported = data.isStreamingSupported; + this._isRangeSupported = data.isRangeSupported; + this._contentLength = data.contentLength; + }); + } + get headersReady() { + return this._headersReady; + } + get contentLength() { + return this._contentLength; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get isRangeSupported() { + return this._isRangeSupported; + } + async read() { + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true + }; + } + return { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} +class PDFWorkerStreamRangeReader { + constructor(begin, end, msgHandler) { + this._msgHandler = msgHandler; + this.onProgress = null; + const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { + begin, + end + }); + this._reader = readableStream.getReader(); + } + get isStreamingSupported() { + return false; + } + async read() { + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true + }; + } + return { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} + +;// ./src/core/worker.js + + + + + + + + + + +class WorkerTask { + constructor(name) { + this.name = name; + this.terminated = false; + this._capability = Promise.withResolvers(); + } + get finished() { + return this._capability.promise; + } + finish() { + this._capability.resolve(); + } + terminate() { + this.terminated = true; + } + ensureNotTerminated() { + if (this.terminated) { + throw new Error("Worker task was terminated"); + } + } +} +class WorkerMessageHandler { + static { + if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) { + this.initializeFromPort(self); + } + } + static setup(handler, port) { + let testMessageProcessed = false; + handler.on("test", data => { + if (testMessageProcessed) { + return; + } + testMessageProcessed = true; + handler.send("test", data instanceof Uint8Array); + }); + handler.on("configure", data => { + setVerbosityLevel(data.verbosity); + }); + handler.on("GetDocRequest", data => this.createDocumentHandler(data, port)); + } + static createDocumentHandler(docParams, port) { + let pdfManager; + let terminated = false; + let cancelXHRs = null; + const WorkerTasks = new Set(); + const verbosity = getVerbosityLevel(); + const { + docId, + apiVersion + } = docParams; + const workerVersion = "4.9.155"; + if (apiVersion !== workerVersion) { + throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); + } + const enumerableProperties = []; + for (const property in []) { + enumerableProperties.push(property); + } + if (enumerableProperties.length) { + throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s."); + } + const workerHandlerName = docId + "_worker"; + let handler = new MessageHandler(workerHandlerName, docId, port); + function ensureNotTerminated() { + if (terminated) { + throw new Error("Worker was terminated"); + } + } + function startWorkerTask(task) { + WorkerTasks.add(task); + } + function finishWorkerTask(task) { + task.finish(); + WorkerTasks.delete(task); + } + async function loadDocument(recoveryMode) { + await pdfManager.ensureDoc("checkHeader"); + await pdfManager.ensureDoc("parseStartXRef"); + await pdfManager.ensureDoc("parse", [recoveryMode]); + await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]); + await pdfManager.ensureDoc("checkLastPage", [recoveryMode]); + const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); + if (isPureXfa) { + const task = new WorkerTask("loadXfaFonts"); + startWorkerTask(task); + await Promise.all([pdfManager.loadXfaFonts(handler, task).catch(reason => {}).then(() => finishWorkerTask(task)), pdfManager.loadXfaImages()]); + } + const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]); + const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null; + return { + numPages, + fingerprints, + htmlForXfa + }; + } + async function getPdfManager({ + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions + }) { + const pdfManagerArgs = { + source: null, + disableAutoFetch, + docBaseUrl, + docId, + enableXfa, + evaluatorOptions, + handler, + length, + password, + rangeChunkSize + }; + if (data) { + pdfManagerArgs.source = data; + return new LocalPdfManager(pdfManagerArgs); + } + const pdfStream = new PDFWorkerStream(handler), + fullRequest = pdfStream.getFullReader(); + const pdfManagerCapability = Promise.withResolvers(); + let newPdfManager, + cachedChunks = [], + loaded = 0; + fullRequest.headersReady.then(function () { + if (!fullRequest.isRangeSupported) { + return; + } + pdfManagerArgs.source = pdfStream; + pdfManagerArgs.length = fullRequest.contentLength; + pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported; + newPdfManager = new NetworkPdfManager(pdfManagerArgs); + for (const chunk of cachedChunks) { + newPdfManager.sendProgressiveData(chunk); + } + cachedChunks = []; + pdfManagerCapability.resolve(newPdfManager); + cancelXHRs = null; + }).catch(function (reason) { + pdfManagerCapability.reject(reason); + cancelXHRs = null; + }); + new Promise(function (resolve, reject) { + const readChunk = function ({ + value, + done + }) { + try { + ensureNotTerminated(); + if (done) { + if (!newPdfManager) { + const pdfFile = arrayBuffersToBytes(cachedChunks); + cachedChunks = []; + if (length && pdfFile.length !== length) { + warn("reported HTTP length is different from actual"); + } + pdfManagerArgs.source = pdfFile; + newPdfManager = new LocalPdfManager(pdfManagerArgs); + pdfManagerCapability.resolve(newPdfManager); + } + cancelXHRs = null; + return; + } + loaded += value.byteLength; + if (!fullRequest.isStreamingSupported) { + handler.send("DocProgress", { + loaded, + total: Math.max(loaded, fullRequest.contentLength || 0) + }); + } + if (newPdfManager) { + newPdfManager.sendProgressiveData(value); + } else { + cachedChunks.push(value); + } + fullRequest.read().then(readChunk, reject); + } catch (e) { + reject(e); + } + }; + fullRequest.read().then(readChunk, reject); + }).catch(function (e) { + pdfManagerCapability.reject(e); + cancelXHRs = null; + }); + cancelXHRs = reason => { + pdfStream.cancelAllRequests(reason); + }; + return pdfManagerCapability.promise; + } + function setupDoc(data) { + function onSuccess(doc) { + ensureNotTerminated(); + handler.send("GetDoc", { + pdfInfo: doc + }); + } + function onFailure(ex) { + ensureNotTerminated(); + if (ex instanceof PasswordException) { + const task = new WorkerTask(`PasswordException: response ${ex.code}`); + startWorkerTask(task); + handler.sendWithPromise("PasswordRequest", ex).then(function ({ + password + }) { + finishWorkerTask(task); + pdfManager.updatePassword(password); + pdfManagerReady(); + }).catch(function () { + finishWorkerTask(task); + handler.send("DocException", ex); + }); + } else if (ex instanceof InvalidPDFException || ex instanceof MissingPDFException || ex instanceof UnexpectedResponseException || ex instanceof UnknownErrorException) { + handler.send("DocException", ex); + } else { + handler.send("DocException", new UnknownErrorException(ex.message, ex.toString())); + } + } + function pdfManagerReady() { + ensureNotTerminated(); + loadDocument(false).then(onSuccess, function (reason) { + ensureNotTerminated(); + if (!(reason instanceof XRefParseException)) { + onFailure(reason); + return; + } + pdfManager.requestLoadedStream().then(function () { + ensureNotTerminated(); + loadDocument(true).then(onSuccess, onFailure); + }); + }); + } + ensureNotTerminated(); + getPdfManager(data).then(function (newPdfManager) { + if (terminated) { + newPdfManager.terminate(new AbortException("Worker was terminated.")); + throw new Error("Worker was terminated"); + } + pdfManager = newPdfManager; + pdfManager.requestLoadedStream(true).then(stream => { + handler.send("DataLoaded", { + length: stream.bytes.byteLength + }); + }); + }).then(pdfManagerReady, onFailure); + } + handler.on("GetPage", function (data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + return Promise.all([pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "view")]).then(function ([rotate, ref, userUnit, view]) { + return { + rotate, + ref, + refStr: ref?.toString() ?? null, + userUnit, + view + }; + }); + }); + }); + handler.on("GetPageIndex", function (data) { + const pageRef = Ref.get(data.num, data.gen); + return pdfManager.ensureCatalog("getPageIndex", [pageRef]); + }); + handler.on("GetDestinations", function (data) { + return pdfManager.ensureCatalog("destinations"); + }); + handler.on("GetDestination", function (data) { + return pdfManager.ensureCatalog("getDestination", [data.id]); + }); + handler.on("GetPageLabels", function (data) { + return pdfManager.ensureCatalog("pageLabels"); + }); + handler.on("GetPageLayout", function (data) { + return pdfManager.ensureCatalog("pageLayout"); + }); + handler.on("GetPageMode", function (data) { + return pdfManager.ensureCatalog("pageMode"); + }); + handler.on("GetViewerPreferences", function (data) { + return pdfManager.ensureCatalog("viewerPreferences"); + }); + handler.on("GetOpenAction", function (data) { + return pdfManager.ensureCatalog("openAction"); + }); + handler.on("GetAttachments", function (data) { + return pdfManager.ensureCatalog("attachments"); + }); + handler.on("GetDocJSActions", function (data) { + return pdfManager.ensureCatalog("jsActions"); + }); + handler.on("GetPageJSActions", function ({ + pageIndex + }) { + return pdfManager.getPage(pageIndex).then(function (page) { + return pdfManager.ensure(page, "jsActions"); + }); + }); + handler.on("GetOutline", function (data) { + return pdfManager.ensureCatalog("documentOutline"); + }); + handler.on("GetOptionalContentConfig", function (data) { + return pdfManager.ensureCatalog("optionalContentConfig"); + }); + handler.on("GetPermissions", function (data) { + return pdfManager.ensureCatalog("permissions"); + }); + handler.on("GetMetadata", function (data) { + return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]); + }); + handler.on("GetMarkInfo", function (data) { + return pdfManager.ensureCatalog("markInfo"); + }); + handler.on("GetData", function (data) { + return pdfManager.requestLoadedStream().then(function (stream) { + return stream.bytes; + }); + }); + handler.on("GetAnnotations", function ({ + pageIndex, + intent + }) { + return pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); + startWorkerTask(task); + return page.getAnnotationsData(handler, task, intent).then(data => { + finishWorkerTask(task); + return data; + }, reason => { + finishWorkerTask(task); + throw reason; + }); + }); + }); + handler.on("GetFieldObjects", function (data) { + return pdfManager.ensureDoc("fieldObjects").then(fieldObjects => fieldObjects?.allFields || null); + }); + handler.on("HasJSActions", function (data) { + return pdfManager.ensureDoc("hasJSActions"); + }); + handler.on("GetCalculationOrderIds", function (data) { + return pdfManager.ensureDoc("calculationOrderIds"); + }); + handler.on("SaveDocument", async function ({ + isPureXfa, + numPages, + annotationStorage, + filename + }) { + const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("structTreeRoot")]; + const changes = new RefSetCache(); + const promises = []; + const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null; + const [stream, acroForm, acroFormRef, startXRef, xref, linearization, _structTreeRoot] = await Promise.all(globalPromises); + const catalogRef = xref.trailer.getRaw("Root") || null; + let structTreeRoot; + if (newAnnotationsByPage) { + if (!_structTreeRoot) { + if (await StructTreeRoot.canCreateStructureTree({ + catalogRef, + pdfManager, + newAnnotationsByPage + })) { + structTreeRoot = null; + } + } else if (await _structTreeRoot.canUpdateStructTree({ + pdfManager, + xref, + newAnnotationsByPage + })) { + structTreeRoot = _structTreeRoot; + } + const imagePromises = AnnotationFactory.generateImages(annotationStorage.values(), xref, pdfManager.evaluatorOptions.isOffscreenCanvasSupported); + const newAnnotationPromises = structTreeRoot === undefined ? promises : []; + for (const [pageIndex, annotations] of newAnnotationsByPage) { + newAnnotationPromises.push(pdfManager.getPage(pageIndex).then(page => { + const task = new WorkerTask(`Save (editor): page ${pageIndex}`); + return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(function () { + finishWorkerTask(task); + }); + })); + } + if (structTreeRoot === null) { + promises.push(Promise.all(newAnnotationPromises).then(async () => { + await StructTreeRoot.createStructureTree({ + newAnnotationsByPage, + xref, + catalogRef, + pdfManager, + changes + }); + })); + } else if (structTreeRoot) { + promises.push(Promise.all(newAnnotationPromises).then(async () => { + await structTreeRoot.updateStructureTree({ + newAnnotationsByPage, + pdfManager, + changes + }); + })); + } + } + if (isPureXfa) { + promises.push(pdfManager.serializeXfaData(annotationStorage)); + } else { + for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { + promises.push(pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`Save: page ${pageIndex}`); + return page.save(handler, task, annotationStorage, changes).finally(function () { + finishWorkerTask(task); + }); + })); + } + } + const refs = await Promise.all(promises); + let xfaData = null; + if (isPureXfa) { + xfaData = refs[0]; + if (!xfaData) { + return stream.bytes; + } + } else if (changes.size === 0) { + return stream.bytes; + } + const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().some(ref => ref.needAppearances); + const xfa = acroForm instanceof Dict && acroForm.get("XFA") || null; + let xfaDatasetsRef = null; + let hasXfaDatasetsEntry = false; + if (Array.isArray(xfa)) { + for (let i = 0, ii = xfa.length; i < ii; i += 2) { + if (xfa[i] === "datasets") { + xfaDatasetsRef = xfa[i + 1]; + hasXfaDatasetsEntry = true; + } + } + if (xfaDatasetsRef === null) { + xfaDatasetsRef = xref.getNewTemporaryRef(); + } + } else if (xfa) { + warn("Unsupported XFA type."); + } + let newXrefInfo = Object.create(null); + if (xref.trailer) { + const infoObj = Object.create(null); + const xrefInfo = xref.trailer.get("Info") || null; + if (xrefInfo instanceof Dict) { + for (const [key, value] of xrefInfo) { + if (typeof value === "string") { + infoObj[key] = stringToPDFString(value); + } + } + } + newXrefInfo = { + rootRef: catalogRef, + encryptRef: xref.trailer.getRaw("Encrypt") || null, + newRef: xref.getNewTemporaryRef(), + infoRef: xref.trailer.getRaw("Info") || null, + info: infoObj, + fileIds: xref.trailer.get("ID") || null, + startXRef: linearization ? startXRef : xref.lastXRefStreamPos ?? startXRef, + filename + }; + } + return incrementalUpdate({ + originalData: stream.bytes, + xrefInfo: newXrefInfo, + changes, + xref, + hasXfa: !!xfa, + xfaDatasetsRef, + hasXfaDatasetsEntry, + needAppearances, + acroFormRef, + acroForm, + xfaData, + useXrefStream: isDict(xref.topDict, "XRef") + }).finally(() => { + xref.resetNewTemporaryRef(); + }); + }); + handler.on("GetOperatorList", function (data, sink) { + const pageIndex = data.pageIndex; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); + startWorkerTask(task); + const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; + page.getOperatorList({ + handler, + sink, + task, + intent: data.intent, + cacheKey: data.cacheKey, + annotationStorage: data.annotationStorage, + modifiedIds: data.modifiedIds + }).then(function (operatorListInfo) { + finishWorkerTask(task); + if (start) { + info(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`); + } + sink.close(); + }, function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }); + }); + }); + handler.on("GetTextContent", function (data, sink) { + const { + pageIndex, + includeMarkedContent, + disableNormalization + } = data; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask("GetTextContent: page " + pageIndex); + startWorkerTask(task); + const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; + page.extractTextContent({ + handler, + task, + sink, + includeMarkedContent, + disableNormalization + }).then(function () { + finishWorkerTask(task); + if (start) { + info(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}ms`); + } + sink.close(); + }, function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }); + }); + }); + handler.on("GetStructTree", function (data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + return pdfManager.ensure(page, "getStructTree"); + }); + }); + handler.on("FontFallback", function (data) { + return pdfManager.fontFallback(data.id, handler); + }); + handler.on("Cleanup", function (data) { + return pdfManager.cleanup(true); + }); + handler.on("Terminate", function (data) { + terminated = true; + const waitOn = []; + if (pdfManager) { + pdfManager.terminate(new AbortException("Worker was terminated.")); + const cleanupPromise = pdfManager.cleanup(); + waitOn.push(cleanupPromise); + pdfManager = null; + } else { + clearGlobalCaches(); + } + cancelXHRs?.(new AbortException("Worker was terminated.")); + for (const task of WorkerTasks) { + waitOn.push(task.finished); + task.terminate(); + } + return Promise.all(waitOn).then(function () { + handler.destroy(); + handler = null; + }); + }); + handler.on("Ready", function (data) { + setupDoc(docParams); + docParams = null; + }); + return workerHandlerName; + } + static initializeFromPort(port) { + const handler = new MessageHandler("worker", "main", port); + this.setup(handler, port); + handler.send("ready", null); + } +} + +;// ./src/pdf.worker.js + +const pdfjsVersion = "4.9.155"; +const pdfjsBuild = "a4eb8407c"; + +var __webpack_exports__WorkerMessageHandler = __webpack_exports__.WorkerMessageHandler; +export { __webpack_exports__WorkerMessageHandler as WorkerMessageHandler }; + +//# sourceMappingURL=pdf.worker.mjs.map \ No newline at end of file diff --git a/run.txt b/run.txt new file mode 100644 index 0000000..754675d --- /dev/null +++ b/run.txt @@ -0,0 +1 @@ +python -m uvicorn app.main:app --reload diff --git a/script.js b/script.js new file mode 100644 index 0000000..e40d52b --- /dev/null +++ b/script.js @@ -0,0 +1,47 @@ +//const c = document.getElementById("pdf_canvas"); +//const pdf_url = "./VO_Mathematik_3.pdf"; +//import * as pdfjsLib from "./pdf.mjs"; +//pdfjsLib.GlobalWorkerOptions.workerSrc = './pdf.worker.mjs'; +//pdfjsLib.getDocument(pdfUrl).promise.then(function(pdfDoc) { +// // Continue with further steps. +//}); +//pdfDoc.getPage(1).then(function(page) { +// // Continue with further steps. +//}); +//const viewport = page.getViewport({ scale: 1 }); +//canvas.width = viewport.width; +//canvas.height = viewport.height; +//const ctx = canvas.getContext('2d'); +//const renderContext = { +// canvasContext: ctx, +// viewport: viewport, +//}; +// +//page.render(renderContext); +//pdfjsLib +// .getDocument(pdfUrl) +// .promise.then(function(pdfDoc) { +// // Handling and rendering logic. +// }) +// .catch(function(error) { +// console.log('Error loading PDF file:', error); +// }); +//var ctx = c.getContext("2d"); +//ctx.moveTo(0, 0); +//ctx.lineTo(10000, 10000); +//ctx.stroke(); +//import pdfjsLib from 'https://cdn.jsdelivr.net/npm/pdfjs-dist@4.9.155/+esm' +const PDFStart = nameRoute => { +} +const startPdf = () => { + PDFStart('./VO_Mathematik_3.pdf') +} +window.addEventListener('load', startPdf); +let loadingTask = pdfjsLib.getDocument(nameRoute), + pdfDoc = null, + canvas = document.querySelector('#cnv'), + ctx = canvas.getContext('2d'), + scale = 1.5, + numPage = 1; +loadingTask.promise.then(pdfDoc_ => { pdfDoc = pdfDoc_; document.querySelector('#npages').innerHTML = pdfDoc.numPages; GeneratePDF(numPage) }); +const GeneratePDF = numPage => { pdfDoc.getPage(numPage).then(page => { let viewport = page.getViewport({ scale: scale }); canvas.height = viewport.height; canvas.width = viewport.width; let renderContext = { canvasContext: ctx, viewport: viewport }page.render(renderContext); })document.querySelector('#npages').innerHTML = numPage; }; diff --git a/style.css b/style.css new file mode 100644 index 0000000..7cb4309 --- /dev/null +++ b/style.css @@ -0,0 +1,74 @@ +html, +body { + height: 100vh; + width: 100vw; +} + +body { + overflow: hidden; + background-color: slategrey; +} + +.right { + height: 100%; + margin: 0; + width: 75vw; + float: right; + background-color: navy; +} + +.left { + background-color: blueviolet; + height: 100%; + float: left; +} + +span { + color: lightgray; + font-family: Arial, Helvetica, sans-serif; +} + +.fullsize { + height: 100%; + margin: 0; +} + +.buttons { + display: flex; + justify-content: space-between; +} + +.main { + height: 100vh; + width: 100vw; + position: absolute; + top: 0; + left: 0; +} + +#cnvdiv { + position: relative; + height: 100%; + width: 100%; + /*display: flex;*/ + /*text-align: center;*/ + /*justify-content: center;*/ +} + +.stack { + position: relative; + height: 100%; + /*text-align: center;*/ + /*float: right;*/ + /*margin-right: 0;*/ + /*margin-left: auto;*/ + /*display: block;*/ +} + +.stack>canvas { + position: absolute; + /*display: block;*/ + /*display: inline;*/ + left: 0; + top: 0; +}

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࿰oka& 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 DvI#{R literal 0 HcmV?d00001 diff --git a/app/files/türschild_ausdrucken.pdf b/app/files/türschild_ausdrucken.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a8534dfd21f92dbe5e89ecb408de5b8bf93f3b8b GIT binary patch literal 49728 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,YcBs4n9eLB{G18L^3m2u`QiCnMS1f04)C9*-Cv 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 literal 0 HcmV?d00001 diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..64381dd --- /dev/null +++ b/app/main.py @@ -0,0 +1,45 @@ +from typing import Annotated +from typing import List, Dict, Tuple +from datetime import date +from fastapi import FastAPI, File, UploadFile, Request, Form +from fastapi.staticfiles import StaticFiles + +app = FastAPI() + +app.mount("/static", StaticFiles(directory="./"), name="static") + + +@app.post("/files/") +async def create_file(file: Annotated[bytes, File()]): + return {"filesize": len(file)} + + +@app.post("/uploadfile/") +async def create_upload_file(file: UploadFile): + content = await file.read() + filename = file.filename if file.filename is not None else "None" + with open("./app/files/" + filename, "wb") as f: + f.write(content) + app.mount("/files", StaticFiles(directory="./app/files/"), name="files") + return {"filename": filename, "path": "/files/" + filename} + + +@app.post("/submit/") +async def get_submittion( + lva: Annotated[str, Form()], + prof: Annotated[str, Form()], + fname: Annotated[str, Form()], + sem: Annotated[str, Form()], + stype: Annotated[str, Form()], + date: Annotated[str, Form()], + rects: Annotated[str, Form()], # List[List[Tuple[float, float, float, float]]], + pagescales: Annotated[str, Form()], # Annotated[List[Dict[str, float]], Form()], +): + print(lva, prof, fname, stype, sem, date, rects, pagescales) + return {"done": "ok"} + + +# async def get_submittion(request: Request): +# reqJson = await request.form() +# print(reqJson) +# return {"done": "ok"} diff --git a/app/main_flask.py_ b/app/main_flask.py_ new file mode 100644 index 0000000..e6fcbaa --- /dev/null +++ b/app/main_flask.py_ @@ -0,0 +1,21 @@ +import flask + +app = flask.Flask(__name__) +app.secret_key = "test" + + +@app.route("/") +def view_index(): + return flask.render_template("../index.html") + + +@app.route("/handle_post", methods=["POST"]) +def handle_post(): + if request.method == "POST": + file = request.args.get("file") + print(file) + return flask.render_template("../index.html") + + +if __name__ == "__main__": + app.run() diff --git a/favicon/apple-touch-icon.png b/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe2cd94d8287d976b5371bd005eaee7ced774dd GIT binary patch literal 7578 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 JvPuaR{C^Z~1XKV3 literal 0 HcmV?d00001 diff --git a/favicon/favicon.ico b/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f378f0b58f393aba4290b5facfc93d029dceed52 GIT binary patch literal 15086 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 GzW)L-Em-9M literal 0 HcmV?d00001 diff --git a/favicon/favicon.svg b/favicon/favicon.svg new file mode 100644 index 0000000..c29a30e --- /dev/null +++ b/favicon/favicon.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/favicon/generated_from.txt b/favicon/generated_from.txt new file mode 100644 index 0000000..befaf99 --- /dev/null +++ b/favicon/generated_from.txt @@ -0,0 +1 @@ +https://realfavicongenerator.net/ diff --git a/favicon/site.webmanifest b/favicon/site.webmanifest new file mode 100644 index 0000000..45841b3 --- /dev/null +++ b/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "Unizeug", + "short_name": "Unizeug", + "icons": [ + { + "src": "/favicon/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/favicon/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/favicon/web-app-manifest-192x192.png b/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..c65cfd0d1c56c48fb4d362213c32bf8961bb3561 GIT binary patch literal 8164 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 Tpc)7cH-ufo=&Dt!ScUx`sP&w# literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..e4e8eac --- /dev/null +++ b/index.html @@ -0,0 +1,77 @@ + + + + + Unizeug uploader + + + + + + + + + + + + +