vendor: 53,456 bytes, lines 1-1943
1/** 2 * @licstart The following is the entire license notice for the 3 * JavaScript code in this page 4 * 5 * Copyright 2024 Mozilla Foundation 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 * @licend The above is the entire license notice for the 20 * JavaScript code in this page 21 */ 22 23/******/ var __webpack_modules__ = ({ 24 25/***/ 9306: 26/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 27 28 29var isCallable = __webpack_require__(4901); 30var tryToString = __webpack_require__(6823); 31 32var $TypeError = TypeError; 33 34// `Assert: IsCallable(argument) is true` 35module.exports = function (argument) { 36 if (isCallable(argument)) return argument; 37 throw new $TypeError(tryToString(argument) + ' is not a function'); 38}; 39 40 41/***/ }), 42 43/***/ 3506: 44/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 45 46 47var isPossiblePrototype = __webpack_require__(3925); 48 49var $String = String; 50var $TypeError = TypeError; 51 52module.exports = function (argument) { 53 if (isPossiblePrototype(argument)) return argument; 54 throw new $TypeError("Can't set " + $String(argument) + ' as a prototype'); 55}; 56 57 58/***/ }), 59 60/***/ 7080: 61/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 62 63 64var has = (__webpack_require__(4402).has); 65 66// Perform ? RequireInternalSlot(M, [[SetData]]) 67module.exports = function (it) { 68 has(it); 69 return it; 70}; 71 72 73/***/ }), 74 75/***/ 679: 76/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 77 78 79var isPrototypeOf = __webpack_require__(1625); 80 81var $TypeError = TypeError; 82 83module.exports = function (it, Prototype) { 84 if (isPrototypeOf(Prototype, it)) return it; 85 throw new $TypeError('Incorrect invocation'); 86}; 87 88 89/***/ }), 90 91/***/ 8551: 92/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 93 94 95var isObject = __webpack_require__(34); 96 97var $String = String; 98var $TypeError = TypeError; 99 100// `Assert: Type(argument) is Object` 101module.exports = function (argument) { 102 if (isObject(argument)) return argument; 103 throw new $TypeError($String(argument) + ' is not an object'); 104}; 105 106 107/***/ }), 108 109/***/ 7811: 110/***/ ((module) => { 111 112 113// eslint-disable-next-line es/no-typed-arrays -- safe 114module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; 115 116 117/***/ }), 118 119/***/ 7394: 120/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 121 122 123var globalThis = __webpack_require__(4576); 124var uncurryThisAccessor = __webpack_require__(6706); 125var classof = __webpack_require__(2195); 126 127var ArrayBuffer = globalThis.ArrayBuffer; 128var TypeError = globalThis.TypeError; 129 130// Includes 131// - Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). 132// - If IsSharedArrayBuffer(O) is true, throw a TypeError exception. 133module.exports = ArrayBuffer && uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) { 134 if (classof(O) !== 'ArrayBuffer') throw new TypeError('ArrayBuffer expected'); 135 return O.byteLength; 136}; 137 138 139/***/ }), 140 141/***/ 3238: 142/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 143 144 145var globalThis = __webpack_require__(4576); 146var uncurryThis = __webpack_require__(7476); 147var arrayBufferByteLength = __webpack_require__(7394); 148 149var ArrayBuffer = globalThis.ArrayBuffer; 150var ArrayBufferPrototype = ArrayBuffer && ArrayBuffer.prototype; 151var slice = ArrayBufferPrototype && uncurryThis(ArrayBufferPrototype.slice); 152 153module.exports = function (O) { 154 if (arrayBufferByteLength(O) !== 0) return false; 155 if (!slice) return false; 156 try { 157 slice(O, 0, 0); 158 return false; 159 } catch (error) { 160 return true; 161 } 162}; 163 164 165/***/ }), 166 167/***/ 5169: 168/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 169 170 171var isDetached = __webpack_require__(3238); 172 173var $TypeError = TypeError; 174 175module.exports = function (it) { 176 if (isDetached(it)) throw new $TypeError('ArrayBuffer is detached'); 177 return it; 178}; 179 180 181/***/ }), 182 183/***/ 5636: 184/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 185 186 187var globalThis = __webpack_require__(4576); 188var uncurryThis = __webpack_require__(9504); 189var uncurryThisAccessor = __webpack_require__(6706); 190var toIndex = __webpack_require__(7696); 191var notDetached = __webpack_require__(5169); 192var arrayBufferByteLength = __webpack_require__(7394); 193var detachTransferable = __webpack_require__(4483); 194var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548); 195 196var structuredClone = globalThis.structuredClone; 197var ArrayBuffer = globalThis.ArrayBuffer; 198var DataView = globalThis.DataView; 199var min = Math.min; 200var ArrayBufferPrototype = ArrayBuffer.prototype; 201var DataViewPrototype = DataView.prototype; 202var slice = uncurryThis(ArrayBufferPrototype.slice); 203var isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get'); 204var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get'); 205var getInt8 = uncurryThis(DataViewPrototype.getInt8); 206var setInt8 = uncurryThis(DataViewPrototype.setInt8); 207 208module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) { 209 var byteLength = arrayBufferByteLength(arrayBuffer); 210 var newByteLength = newLength === undefined ? byteLength : toIndex(newLength); 211 var fixedLength = !isResizable || !isResizable(arrayBuffer); 212 var newBuffer; 213 notDetached(arrayBuffer); 214 if (PROPER_STRUCTURED_CLONE_TRANSFER) { 215 arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] }); 216 if (byteLength === newByteLength && (preserveResizability || fixedLength)) return arrayBuffer; 217 } 218 if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) { 219 newBuffer = slice(arrayBuffer, 0, newByteLength); 220 } else { 221 var options = preserveResizability && !fixedLength && maxByteLength ? { maxByteLength: maxByteLength(arrayBuffer) } : undefined; 222 newBuffer = new ArrayBuffer(newByteLength, options); 223 var a = new DataView(arrayBuffer); 224 var b = new DataView(newBuffer); 225 var copyLength = min(newByteLength, byteLength); 226 for (var i = 0; i < copyLength; i++) setInt8(b, i, getInt8(a, i)); 227 } 228 if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachTransferable(arrayBuffer); 229 return newBuffer; 230}; 231 232 233/***/ }), 234 235/***/ 4644: 236/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 237 238 239var NATIVE_ARRAY_BUFFER = __webpack_require__(7811); 240var DESCRIPTORS = __webpack_require__(3724); 241var globalThis = __webpack_require__(4576); 242var isCallable = __webpack_require__(4901); 243var isObject = __webpack_require__(34); 244var hasOwn = __webpack_require__(9297); 245var classof = __webpack_require__(6955); 246var tryToString = __webpack_require__(6823); 247var createNonEnumerableProperty = __webpack_require__(6699); 248var defineBuiltIn = __webpack_require__(6840); 249var defineBuiltInAccessor = __webpack_require__(2106); 250var isPrototypeOf = __webpack_require__(1625); 251var getPrototypeOf = __webpack_require__(2787); 252var setPrototypeOf = __webpack_require__(2967); 253var wellKnownSymbol = __webpack_require__(8227); 254var uid = __webpack_require__(3392); 255var InternalStateModule = __webpack_require__(1181); 256 257var enforceInternalState = InternalStateModule.enforce; 258var getInternalState = InternalStateModule.get; 259var Int8Array = globalThis.Int8Array; 260var Int8ArrayPrototype = Int8Array && Int8Array.prototype; 261var Uint8ClampedArray = globalThis.Uint8ClampedArray; 262var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; 263var TypedArray = Int8Array && getPrototypeOf(Int8Array); 264var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); 265var ObjectPrototype = Object.prototype; 266var TypeError = globalThis.TypeError; 267 268var TO_STRING_TAG = wellKnownSymbol('toStringTag'); 269var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); 270var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; 271// Fixing native typed arrays in Opera Presto crashes the browser, see #595 272var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera'; 273var TYPED_ARRAY_TAG_REQUIRED = false; 274var NAME, Constructor, Prototype; 275 276var TypedArrayConstructorsList = { 277 Int8Array: 1, 278 Uint8Array: 1, 279 Uint8ClampedArray: 1, 280 Int16Array: 2, 281 Uint16Array: 2, 282 Int32Array: 4, 283 Uint32Array: 4, 284 Float32Array: 4, 285 Float64Array: 8 286}; 287 288var BigIntArrayConstructorsList = { 289 BigInt64Array: 8, 290 BigUint64Array: 8 291}; 292 293var isView = function isView(it) { 294 if (!isObject(it)) return false; 295 var klass = classof(it); 296 return klass === 'DataView' 297 || hasOwn(TypedArrayConstructorsList, klass) 298 || hasOwn(BigIntArrayConstructorsList, klass); 299}; 300 301var getTypedArrayConstructor = function (it) { 302 var proto = getPrototypeOf(it); 303 if (!isObject(proto)) return; 304 var state = getInternalState(proto); 305 return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); 306}; 307 308var isTypedArray = function (it) { 309 if (!isObject(it)) return false; 310 var klass = classof(it); 311 return hasOwn(TypedArrayConstructorsList, klass) 312 || hasOwn(BigIntArrayConstructorsList, klass); 313}; 314 315var aTypedArray = function (it) { 316 if (isTypedArray(it)) return it; 317 throw new TypeError('Target is not a typed array'); 318}; 319 320var aTypedArrayConstructor = function (C) { 321 if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C; 322 throw new TypeError(tryToString(C) + ' is not a typed array constructor'); 323}; 324 325var exportTypedArrayMethod = function (KEY, property, forced, options) { 326 if (!DESCRIPTORS) return; 327 if (forced) for (var ARRAY in TypedArrayConstructorsList) { 328 var TypedArrayConstructor = globalThis[ARRAY]; 329 if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try { 330 delete TypedArrayConstructor.prototype[KEY]; 331 } catch (error) { 332 // old WebKit bug - some methods are non-configurable 333 try { 334 TypedArrayConstructor.prototype[KEY] = property; 335 } catch (error2) { /* empty */ } 336 } 337 } 338 if (!TypedArrayPrototype[KEY] || forced) { 339 defineBuiltIn(TypedArrayPrototype, KEY, forced ? property 340 : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); 341 } 342}; 343 344var exportTypedArrayStaticMethod = function (KEY, property, forced) { 345 var ARRAY, TypedArrayConstructor; 346 if (!DESCRIPTORS) return; 347 if (setPrototypeOf) { 348 if (forced) for (ARRAY in TypedArrayConstructorsList) { 349 TypedArrayConstructor = globalThis[ARRAY]; 350 if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try { 351 delete TypedArrayConstructor[KEY]; 352 } catch (error) { /* empty */ } 353 } 354 if (!TypedArray[KEY] || forced) { 355 // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable 356 try { 357 return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); 358 } catch (error) { /* empty */ } 359 } else return; 360 } 361 for (ARRAY in TypedArrayConstructorsList) { 362 TypedArrayConstructor = globalThis[ARRAY]; 363 if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { 364 defineBuiltIn(TypedArrayConstructor, KEY, property); 365 } 366 } 367}; 368 369for (NAME in TypedArrayConstructorsList) { 370 Constructor = globalThis[NAME]; 371 Prototype = Constructor && Constructor.prototype; 372 if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; 373 else NATIVE_ARRAY_BUFFER_VIEWS = false; 374} 375 376for (NAME in BigIntArrayConstructorsList) { 377 Constructor = globalThis[NAME]; 378 Prototype = Constructor && Constructor.prototype; 379 if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; 380} 381 382// WebKit bug - typed arrays constructors prototype is Object.prototype 383if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { 384 // eslint-disable-next-line no-shadow -- safe 385 TypedArray = function TypedArray() { 386 throw new TypeError('Incorrect invocation'); 387 }; 388 if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { 389 if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray); 390 } 391} 392 393if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { 394 TypedArrayPrototype = TypedArray.prototype; 395 if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { 396 if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype); 397 } 398} 399 400// WebKit bug - one more object in Uint8ClampedArray prototype chain 401if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { 402 setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); 403} 404 405if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { 406 TYPED_ARRAY_TAG_REQUIRED = true; 407 defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, { 408 configurable: true, 409 get: function () { 410 return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; 411 } 412 }); 413 for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) { 414 createNonEnumerableProperty(globalThis[NAME], TYPED_ARRAY_TAG, NAME); 415 } 416} 417 418module.exports = { 419 NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, 420 TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, 421 aTypedArray: aTypedArray, 422 aTypedArrayConstructor: aTypedArrayConstructor, 423 exportTypedArrayMethod: exportTypedArrayMethod, 424 exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, 425 getTypedArrayConstructor: getTypedArrayConstructor, 426 isView: isView, 427 isTypedArray: isTypedArray, 428 TypedArray: TypedArray, 429 TypedArrayPrototype: TypedArrayPrototype 430}; 431 432 433/***/ }), 434 435/***/ 5370: 436/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 437 438 439var lengthOfArrayLike = __webpack_require__(6198); 440 441module.exports = function (Constructor, list, $length) { 442 var index = 0; 443 var length = arguments.length > 2 ? $length : lengthOfArrayLike(list); 444 var result = new Constructor(length); 445 while (length > index) result[index] = list[index++]; 446 return result; 447}; 448 449 450/***/ }), 451 452/***/ 9617: 453/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 454 455 456var toIndexedObject = __webpack_require__(5397); 457var toAbsoluteIndex = __webpack_require__(5610); 458var lengthOfArrayLike = __webpack_require__(6198); 459 460// `Array.prototype.{ indexOf, includes }` methods implementation 461var createMethod = function (IS_INCLUDES) { 462 return function ($this, el, fromIndex) { 463 var O = toIndexedObject($this); 464 var length = lengthOfArrayLike(O); 465 if (length === 0) return !IS_INCLUDES && -1; 466 var index = toAbsoluteIndex(fromIndex, length); 467 var value; 468 // Array#includes uses SameValueZero equality algorithm 469 // eslint-disable-next-line no-self-compare -- NaN check 470 if (IS_INCLUDES && el !== el) while (length > index) { 471 value = O[index++]; 472 // eslint-disable-next-line no-self-compare -- NaN check 473 if (value !== value) return true; 474 // Array#indexOf ignores holes, Array#includes - not 475 } else for (;length > index; index++) { 476 if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; 477 } return !IS_INCLUDES && -1; 478 }; 479}; 480 481module.exports = { 482 // `Array.prototype.includes` method 483 // https://tc39.es/ecma262/#sec-array.prototype.includes 484 includes: createMethod(true), 485 // `Array.prototype.indexOf` method 486 // https://tc39.es/ecma262/#sec-array.prototype.indexof 487 indexOf: createMethod(false) 488}; 489 490 491/***/ }), 492 493/***/ 4527: 494/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 495 496 497var DESCRIPTORS = __webpack_require__(3724); 498var isArray = __webpack_require__(4376); 499 500var $TypeError = TypeError; 501// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 502var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; 503 504// Safari < 13 does not throw an error in this case 505var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { 506 // makes no sense without proper strict mode support 507 if (this !== undefined) return true; 508 try { 509 // eslint-disable-next-line es/no-object-defineproperty -- safe 510 Object.defineProperty([], 'length', { writable: false }).length = 1; 511 } catch (error) { 512 return error instanceof TypeError; 513 } 514}(); 515 516module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { 517 if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { 518 throw new $TypeError('Cannot set read only .length'); 519 } return O.length = length; 520} : function (O, length) { 521 return O.length = length; 522}; 523 524 525/***/ }), 526 527/***/ 7680: 528/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 529 530 531var uncurryThis = __webpack_require__(9504); 532 533module.exports = uncurryThis([].slice); 534 535 536/***/ }), 537 538/***/ 7628: 539/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 540 541 542var lengthOfArrayLike = __webpack_require__(6198); 543 544// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.toReversed 545// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.toReversed 546module.exports = function (O, C) { 547 var len = lengthOfArrayLike(O); 548 var A = new C(len); 549 var k = 0; 550 for (; k < len; k++) A[k] = O[len - k - 1]; 551 return A; 552}; 553 554 555/***/ }), 556 557/***/ 9928: 558/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 559 560 561var lengthOfArrayLike = __webpack_require__(6198); 562var toIntegerOrInfinity = __webpack_require__(1291); 563 564var $RangeError = RangeError; 565 566// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.with 567// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.with 568module.exports = function (O, C, index, value) { 569 var len = lengthOfArrayLike(O); 570 var relativeIndex = toIntegerOrInfinity(index); 571 var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex; 572 if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index'); 573 var A = new C(len); 574 var k = 0; 575 for (; k < len; k++) A[k] = k === actualIndex ? value : O[k]; 576 return A; 577}; 578 579 580/***/ }), 581 582/***/ 6319: 583/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 584 585 586var anObject = __webpack_require__(8551); 587var iteratorClose = __webpack_require__(9539); 588 589// call something on iterator step with safe closing on error 590module.exports = function (iterator, fn, value, ENTRIES) { 591 try { 592 return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); 593 } catch (error) { 594 iteratorClose(iterator, 'throw', error); 595 } 596}; 597 598 599/***/ }), 600 601/***/ 2195: 602/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 603 604 605var uncurryThis = __webpack_require__(9504); 606 607var toString = uncurryThis({}.toString); 608var stringSlice = uncurryThis(''.slice); 609 610module.exports = function (it) { 611 return stringSlice(toString(it), 8, -1); 612}; 613 614 615/***/ }), 616 617/***/ 6955: 618/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 619 620 621var TO_STRING_TAG_SUPPORT = __webpack_require__(2140); 622var isCallable = __webpack_require__(4901); 623var classofRaw = __webpack_require__(2195); 624var wellKnownSymbol = __webpack_require__(8227); 625 626var TO_STRING_TAG = wellKnownSymbol('toStringTag'); 627var $Object = Object; 628 629// ES3 wrong here 630var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; 631 632// fallback for IE11 Script Access Denied error 633var tryGet = function (it, key) { 634 try { 635 return it[key]; 636 } catch (error) { /* empty */ } 637}; 638 639// getting tag from ES6+ `Object.prototype.toString` 640module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { 641 var O, tag, result; 642 return it === undefined ? 'Undefined' : it === null ? 'Null' 643 // @@toStringTag case 644 : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag 645 // builtinTag case 646 : CORRECT_ARGUMENTS ? classofRaw(O) 647 // ES3 arguments fallback 648 : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; 649}; 650 651 652/***/ }), 653 654/***/ 7740: 655/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 656 657 658var hasOwn = __webpack_require__(9297); 659var ownKeys = __webpack_require__(5031); 660var getOwnPropertyDescriptorModule = __webpack_require__(7347); 661var definePropertyModule = __webpack_require__(4913); 662 663module.exports = function (target, source, exceptions) { 664 var keys = ownKeys(source); 665 var defineProperty = definePropertyModule.f; 666 var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; 667 for (var i = 0; i < keys.length; i++) { 668 var key = keys[i]; 669 if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { 670 defineProperty(target, key, getOwnPropertyDescriptor(source, key)); 671 } 672 } 673}; 674 675 676/***/ }), 677 678/***/ 2211: 679/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 680 681 682var fails = __webpack_require__(9039); 683 684module.exports = !fails(function () { 685 function F() { /* empty */ } 686 F.prototype.constructor = null; 687 // eslint-disable-next-line es/no-object-getprototypeof -- required for testing 688 return Object.getPrototypeOf(new F()) !== F.prototype; 689}); 690 691 692/***/ }), 693 694/***/ 2529: 695/***/ ((module) => { 696 697 698// `CreateIterResultObject` abstract operation 699// https://tc39.es/ecma262/#sec-createiterresultobject 700module.exports = function (value, done) { 701 return { value: value, done: done }; 702}; 703 704 705/***/ }), 706 707/***/ 6699: 708/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 709 710 711var DESCRIPTORS = __webpack_require__(3724); 712var definePropertyModule = __webpack_require__(4913); 713var createPropertyDescriptor = __webpack_require__(6980); 714 715module.exports = DESCRIPTORS ? function (object, key, value) { 716 return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); 717} : function (object, key, value) { 718 object[key] = value; 719 return object; 720}; 721 722 723/***/ }), 724 725/***/ 6980: 726/***/ ((module) => { 727 728 729module.exports = function (bitmap, value) { 730 return { 731 enumerable: !(bitmap & 1), 732 configurable: !(bitmap & 2), 733 writable: !(bitmap & 4), 734 value: value 735 }; 736}; 737 738 739/***/ }), 740 741/***/ 4659: 742/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 743 744 745var DESCRIPTORS = __webpack_require__(3724); 746var definePropertyModule = __webpack_require__(4913); 747var createPropertyDescriptor = __webpack_require__(6980); 748 749module.exports = function (object, key, value) { 750 if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value)); 751 else object[key] = value; 752}; 753 754 755/***/ }), 756 757/***/ 2106: 758/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 759 760 761var makeBuiltIn = __webpack_require__(283); 762var defineProperty = __webpack_require__(4913); 763 764module.exports = function (target, name, descriptor) { 765 if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true }); 766 if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true }); 767 return defineProperty.f(target, name, descriptor); 768}; 769 770 771/***/ }), 772 773/***/ 6840: 774/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 775 776 777var isCallable = __webpack_require__(4901); 778var definePropertyModule = __webpack_require__(4913); 779var makeBuiltIn = __webpack_require__(283); 780var defineGlobalProperty = __webpack_require__(9433); 781 782module.exports = function (O, key, value, options) { 783 if (!options) options = {}; 784 var simple = options.enumerable; 785 var name = options.name !== undefined ? options.name : key; 786 if (isCallable(value)) makeBuiltIn(value, name, options); 787 if (options.global) { 788 if (simple) O[key] = value; 789 else defineGlobalProperty(key, value); 790 } else { 791 try { 792 if (!options.unsafe) delete O[key]; 793 else if (O[key]) simple = true; 794 } catch (error) { /* empty */ } 795 if (simple) O[key] = value; 796 else definePropertyModule.f(O, key, { 797 value: value, 798 enumerable: false, 799 configurable: !options.nonConfigurable, 800 writable: !options.nonWritable 801 }); 802 } return O; 803}; 804 805 806/***/ }), 807 808/***/ 6279: 809/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 810 811 812var defineBuiltIn = __webpack_require__(6840); 813 814module.exports = function (target, src, options) { 815 for (var key in src) defineBuiltIn(target, key, src[key], options); 816 return target; 817}; 818 819 820/***/ }), 821 822/***/ 9433: 823/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 824 825 826var globalThis = __webpack_require__(4576); 827 828// eslint-disable-next-line es/no-object-defineproperty -- safe 829var defineProperty = Object.defineProperty; 830 831module.exports = function (key, value) { 832 try { 833 defineProperty(globalThis, key, { value: value, configurable: true, writable: true }); 834 } catch (error) { 835 globalThis[key] = value; 836 } return value; 837}; 838 839 840/***/ }), 841 842/***/ 3724: 843/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 844 845 846var fails = __webpack_require__(9039); 847 848// Detect IE8's incomplete defineProperty implementation 849module.exports = !fails(function () { 850 // eslint-disable-next-line es/no-object-defineproperty -- required for testing 851 return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; 852}); 853 854 855/***/ }), 856 857/***/ 4483: 858/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 859 860 861var globalThis = __webpack_require__(4576); 862var getBuiltInNodeModule = __webpack_require__(9429); 863var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548); 864 865var structuredClone = globalThis.structuredClone; 866var $ArrayBuffer = globalThis.ArrayBuffer; 867var $MessageChannel = globalThis.MessageChannel; 868var detach = false; 869var WorkerThreads, channel, buffer, $detach; 870 871if (PROPER_STRUCTURED_CLONE_TRANSFER) { 872 detach = function (transferable) { 873 structuredClone(transferable, { transfer: [transferable] }); 874 }; 875} else if ($ArrayBuffer) try { 876 if (!$MessageChannel) { 877 WorkerThreads = getBuiltInNodeModule('worker_threads'); 878 if (WorkerThreads) $MessageChannel = WorkerThreads.MessageChannel; 879 } 880 881 if ($MessageChannel) { 882 channel = new $MessageChannel(); 883 buffer = new $ArrayBuffer(2); 884 885 $detach = function (transferable) { 886 channel.port1.postMessage(null, [transferable]); 887 }; 888 889 if (buffer.byteLength === 2) { 890 $detach(buffer); 891 if (buffer.byteLength === 0) detach = $detach; 892 } 893 } 894} catch (error) { /* empty */ } 895 896module.exports = detach; 897 898 899/***/ }), 900 901/***/ 4055: 902/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 903 904 905var globalThis = __webpack_require__(4576); 906var isObject = __webpack_require__(34); 907 908var document = globalThis.document; 909// typeof document.createElement is 'object' in old IE 910var EXISTS = isObject(document) && isObject(document.createElement); 911 912module.exports = function (it) { 913 return EXISTS ? document.createElement(it) : {}; 914}; 915 916 917/***/ }), 918 919/***/ 6837: 920/***/ ((module) => { 921 922 923var $TypeError = TypeError; 924var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 925 926module.exports = function (it) { 927 if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded'); 928 return it; 929}; 930 931 932/***/ }), 933 934/***/ 5002: 935/***/ ((module) => { 936 937 938module.exports = { 939 IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 }, 940 DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 }, 941 HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 }, 942 WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 }, 943 InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 }, 944 NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 }, 945 NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 }, 946 NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 }, 947 NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 }, 948 InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 }, 949 InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 }, 950 SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 }, 951 InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 }, 952 NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 }, 953 InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 }, 954 ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 }, 955 TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 }, 956 SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 }, 957 NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 }, 958 AbortError: { s: 'ABORT_ERR', c: 20, m: 1 }, 959 URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 }, 960 QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 }, 961 TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 }, 962 InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 }, 963 DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 } 964}; 965 966 967/***/ }), 968 969/***/ 8727: 970/***/ ((module) => { 971 972 973// IE8- don't enum bug keys 974module.exports = [ 975 'constructor', 976 'hasOwnProperty', 977 'isPrototypeOf', 978 'propertyIsEnumerable', 979 'toLocaleString', 980 'toString', 981 'valueOf' 982]; 983 984 985/***/ }), 986 987/***/ 6193: 988/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 989 990 991var ENVIRONMENT = __webpack_require__(4215); 992 993module.exports = ENVIRONMENT === 'NODE'; 994 995 996/***/ }), 997 998/***/ 2839: 999/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1000 1001 1002var globalThis = __webpack_require__(4576); 1003 1004var navigator = globalThis.navigator; 1005var userAgent = navigator && navigator.userAgent; 1006 1007module.exports = userAgent ? String(userAgent) : ''; 1008 1009 1010/***/ }), 1011 1012/***/ 9519: 1013/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1014 1015 1016var globalThis = __webpack_require__(4576); 1017var userAgent = __webpack_require__(2839); 1018 1019var process = globalThis.process; 1020var Deno = globalThis.Deno; 1021var versions = process && process.versions || Deno && Deno.version; 1022var v8 = versions && versions.v8; 1023var match, version; 1024 1025if (v8) { 1026 match = v8.split('.'); 1027 // in old Chrome, versions of V8 isn't V8 = Chrome / 10 1028 // but their correct versions are not interesting for us 1029 version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); 1030} 1031 1032// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` 1033// so check `userAgent` even if `.v8` exists, but 0 1034if (!version && userAgent) { 1035 match = userAgent.match(/Edge\/(\d+)/); 1036 if (!match || match[1] >= 74) { 1037 match = userAgent.match(/Chrome\/(\d+)/); 1038 if (match) version = +match[1]; 1039 } 1040} 1041 1042module.exports = version; 1043 1044 1045/***/ }), 1046 1047/***/ 4215: 1048/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1049 1050 1051/* global Bun, Deno -- detection */ 1052var globalThis = __webpack_require__(4576); 1053var userAgent = __webpack_require__(2839); 1054var classof = __webpack_require__(2195); 1055 1056var userAgentStartsWith = function (string) { 1057 return userAgent.slice(0, string.length) === string; 1058}; 1059 1060module.exports = (function () { 1061 if (userAgentStartsWith('Bun/')) return 'BUN'; 1062 if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE'; 1063 if (userAgentStartsWith('Deno/')) return 'DENO'; 1064 if (userAgentStartsWith('Node.js/')) return 'NODE'; 1065 if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN'; 1066 if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO'; 1067 if (classof(globalThis.process) === 'process') return 'NODE'; 1068 if (globalThis.window && globalThis.document) return 'BROWSER'; 1069 return 'REST'; 1070})(); 1071 1072 1073/***/ }), 1074 1075/***/ 8574: 1076/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1077 1078 1079var uncurryThis = __webpack_require__(9504); 1080 1081var $Error = Error; 1082var replace = uncurryThis(''.replace); 1083 1084var TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd'); 1085// eslint-disable-next-line redos/no-vulnerable, sonarjs/slow-regex -- safe 1086var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; 1087var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); 1088 1089module.exports = function (stack, dropEntries) { 1090 if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) { 1091 while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); 1092 } return stack; 1093}; 1094 1095 1096/***/ }), 1097 1098/***/ 6518: 1099/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1100 1101 1102var globalThis = __webpack_require__(4576); 1103var getOwnPropertyDescriptor = (__webpack_require__(7347).f); 1104var createNonEnumerableProperty = __webpack_require__(6699); 1105var defineBuiltIn = __webpack_require__(6840); 1106var defineGlobalProperty = __webpack_require__(9433); 1107var copyConstructorProperties = __webpack_require__(7740); 1108var isForced = __webpack_require__(2796); 1109 1110/* 1111 options.target - name of the target object 1112 options.global - target is the global object 1113 options.stat - export as static methods of target 1114 options.proto - export as prototype methods of target 1115 options.real - real prototype method for the `pure` version 1116 options.forced - export even if the native feature is available 1117 options.bind - bind methods to the target, required for the `pure` version 1118 options.wrap - wrap constructors to preventing global pollution, required for the `pure` version 1119 options.unsafe - use the simple assignment of property instead of delete + defineProperty 1120 options.sham - add a flag to not completely full polyfills 1121 options.enumerable - export as enumerable property 1122 options.dontCallGetSet - prevent calling a getter on target 1123 options.name - the .name of the function if it does not match the key 1124*/ 1125module.exports = function (options, source) { 1126 var TARGET = options.target; 1127 var GLOBAL = options.global; 1128 var STATIC = options.stat; 1129 var FORCED, target, key, targetProperty, sourceProperty, descriptor; 1130 if (GLOBAL) { 1131 target = globalThis; 1132 } else if (STATIC) { 1133 target = globalThis[TARGET] || defineGlobalProperty(TARGET, {}); 1134 } else { 1135 target = globalThis[TARGET] && globalThis[TARGET].prototype; 1136 } 1137 if (target) for (key in source) { 1138 sourceProperty = source[key]; 1139 if (options.dontCallGetSet) { 1140 descriptor = getOwnPropertyDescriptor(target, key); 1141 targetProperty = descriptor && descriptor.value; 1142 } else targetProperty = target[key]; 1143 FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); 1144 // contained in target 1145 if (!FORCED && targetProperty !== undefined) { 1146 if (typeof sourceProperty == typeof targetProperty) continue; 1147 copyConstructorProperties(sourceProperty, targetProperty); 1148 } 1149 // add a flag to not completely full polyfills 1150 if (options.sham || (targetProperty && targetProperty.sham)) { 1151 createNonEnumerableProperty(sourceProperty, 'sham', true); 1152 } 1153 defineBuiltIn(target, key, sourceProperty, options); 1154 } 1155}; 1156 1157 1158/***/ }), 1159 1160/***/ 9039: 1161/***/ ((module) => { 1162 1163 1164module.exports = function (exec) { 1165 try { 1166 return !!exec(); 1167 } catch (error) { 1168 return true; 1169 } 1170}; 1171 1172 1173/***/ }), 1174 1175/***/ 8745: 1176/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1177 1178 1179var NATIVE_BIND = __webpack_require__(616); 1180 1181var FunctionPrototype = Function.prototype; 1182var apply = FunctionPrototype.apply; 1183var call = FunctionPrototype.call; 1184 1185// eslint-disable-next-line es/no-reflect -- safe 1186module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () { 1187 return call.apply(apply, arguments); 1188}); 1189 1190 1191/***/ }), 1192 1193/***/ 6080: 1194/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1195 1196 1197var uncurryThis = __webpack_require__(7476); 1198var aCallable = __webpack_require__(9306); 1199var NATIVE_BIND = __webpack_require__(616); 1200 1201var bind = uncurryThis(uncurryThis.bind); 1202 1203// optional / simple context binding 1204module.exports = function (fn, that) { 1205 aCallable(fn); 1206 return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { 1207 return fn.apply(that, arguments); 1208 }; 1209}; 1210 1211 1212/***/ }), 1213 1214/***/ 616: 1215/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1216 1217 1218var fails = __webpack_require__(9039); 1219 1220module.exports = !fails(function () { 1221 // eslint-disable-next-line es/no-function-prototype-bind -- safe 1222 var test = (function () { /* empty */ }).bind(); 1223 // eslint-disable-next-line no-prototype-builtins -- safe 1224 return typeof test != 'function' || test.hasOwnProperty('prototype'); 1225}); 1226 1227 1228/***/ }), 1229 1230/***/ 9565: 1231/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1232 1233 1234var NATIVE_BIND = __webpack_require__(616); 1235 1236var call = Function.prototype.call; 1237 1238module.exports = NATIVE_BIND ? call.bind(call) : function () { 1239 return call.apply(call, arguments); 1240}; 1241 1242 1243/***/ }), 1244 1245/***/ 350: 1246/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1247 1248 1249var DESCRIPTORS = __webpack_require__(3724); 1250var hasOwn = __webpack_require__(9297); 1251 1252var FunctionPrototype = Function.prototype; 1253// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 1254var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; 1255 1256var EXISTS = hasOwn(FunctionPrototype, 'name'); 1257// additional protection from minified / mangled / dropped function names 1258var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; 1259var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); 1260 1261module.exports = { 1262 EXISTS: EXISTS, 1263 PROPER: PROPER, 1264 CONFIGURABLE: CONFIGURABLE 1265}; 1266 1267 1268/***/ }), 1269 1270/***/ 6706: 1271/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1272 1273 1274var uncurryThis = __webpack_require__(9504); 1275var aCallable = __webpack_require__(9306); 1276 1277module.exports = function (object, key, method) { 1278 try { 1279 // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 1280 return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); 1281 } catch (error) { /* empty */ } 1282}; 1283 1284 1285/***/ }), 1286 1287/***/ 7476: 1288/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1289 1290 1291var classofRaw = __webpack_require__(2195); 1292var uncurryThis = __webpack_require__(9504); 1293 1294module.exports = function (fn) { 1295 // Nashorn bug: 1296 // https://github.com/zloirock/core-js/issues/1128 1297 // https://github.com/zloirock/core-js/issues/1130 1298 if (classofRaw(fn) === 'Function') return uncurryThis(fn); 1299}; 1300 1301 1302/***/ }), 1303 1304/***/ 9504: 1305/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1306 1307 1308var NATIVE_BIND = __webpack_require__(616); 1309 1310var FunctionPrototype = Function.prototype; 1311var call = FunctionPrototype.call; 1312var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); 1313 1314module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { 1315 return function () { 1316 return call.apply(fn, arguments); 1317 }; 1318}; 1319 1320 1321/***/ }), 1322 1323/***/ 9429: 1324/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1325 1326 1327var globalThis = __webpack_require__(4576); 1328var IS_NODE = __webpack_require__(6193); 1329 1330module.exports = function (name) { 1331 if (IS_NODE) { 1332 try { 1333 return globalThis.process.getBuiltinModule(name); 1334 } catch (error) { /* empty */ } 1335 try { 1336 // eslint-disable-next-line no-new-func -- safe 1337 return Function('return require("' + name + '")')(); 1338 } catch (error) { /* empty */ } 1339 } 1340}; 1341 1342 1343/***/ }), 1344 1345/***/ 7751: 1346/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1347 1348 1349var globalThis = __webpack_require__(4576); 1350var isCallable = __webpack_require__(4901); 1351 1352var aFunction = function (argument) { 1353 return isCallable(argument) ? argument : undefined; 1354}; 1355 1356module.exports = function (namespace, method) { 1357 return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method]; 1358}; 1359 1360 1361/***/ }), 1362 1363/***/ 1767: 1364/***/ ((module) => { 1365 1366 1367// `GetIteratorDirect(obj)` abstract operation 1368// https://tc39.es/proposal-iterator-helpers/#sec-getiteratordirect 1369module.exports = function (obj) { 1370 return { 1371 iterator: obj, 1372 next: obj.next, 1373 done: false 1374 }; 1375}; 1376 1377 1378/***/ }), 1379 1380/***/ 851: 1381/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1382 1383 1384var classof = __webpack_require__(6955); 1385var getMethod = __webpack_require__(5966); 1386var isNullOrUndefined = __webpack_require__(4117); 1387var Iterators = __webpack_require__(6269); 1388var wellKnownSymbol = __webpack_require__(8227); 1389 1390var ITERATOR = wellKnownSymbol('iterator'); 1391 1392module.exports = function (it) { 1393 if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR) 1394 || getMethod(it, '@@iterator') 1395 || Iterators[classof(it)]; 1396}; 1397 1398 1399/***/ }), 1400 1401/***/ 81: 1402/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1403 1404 1405var call = __webpack_require__(9565); 1406var aCallable = __webpack_require__(9306); 1407var anObject = __webpack_require__(8551); 1408var tryToString = __webpack_require__(6823); 1409var getIteratorMethod = __webpack_require__(851); 1410 1411var $TypeError = TypeError; 1412 1413module.exports = function (argument, usingIterator) { 1414 var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; 1415 if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); 1416 throw new $TypeError(tryToString(argument) + ' is not iterable'); 1417}; 1418 1419 1420/***/ }), 1421 1422/***/ 5966: 1423/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1424 1425 1426var aCallable = __webpack_require__(9306); 1427var isNullOrUndefined = __webpack_require__(4117); 1428 1429// `GetMethod` abstract operation 1430// https://tc39.es/ecma262/#sec-getmethod 1431module.exports = function (V, P) { 1432 var func = V[P]; 1433 return isNullOrUndefined(func) ? undefined : aCallable(func); 1434}; 1435 1436 1437/***/ }), 1438 1439/***/ 3789: 1440/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1441 1442 1443var aCallable = __webpack_require__(9306); 1444var anObject = __webpack_require__(8551); 1445var call = __webpack_require__(9565); 1446var toIntegerOrInfinity = __webpack_require__(1291); 1447var getIteratorDirect = __webpack_require__(1767); 1448 1449var INVALID_SIZE = 'Invalid size'; 1450var $RangeError = RangeError; 1451var $TypeError = TypeError; 1452var max = Math.max; 1453 1454var SetRecord = function (set, intSize) { 1455 this.set = set; 1456 this.size = max(intSize, 0); 1457 this.has = aCallable(set.has); 1458 this.keys = aCallable(set.keys); 1459}; 1460 1461SetRecord.prototype = { 1462 getIterator: function () { 1463 return getIteratorDirect(anObject(call(this.keys, this.set))); 1464 }, 1465 includes: function (it) { 1466 return call(this.has, this.set, it); 1467 } 1468}; 1469 1470// `GetSetRecord` abstract operation 1471// https://tc39.es/proposal-set-methods/#sec-getsetrecord 1472module.exports = function (obj) { 1473 anObject(obj); 1474 var numSize = +obj.size; 1475 // NOTE: If size is undefined, then numSize will be NaN 1476 // eslint-disable-next-line no-self-compare -- NaN check 1477 if (numSize !== numSize) throw new $TypeError(INVALID_SIZE); 1478 var intSize = toIntegerOrInfinity(numSize); 1479 if (intSize < 0) throw new $RangeError(INVALID_SIZE); 1480 return new SetRecord(obj, intSize); 1481}; 1482 1483 1484/***/ }), 1485 1486/***/ 4576: 1487/***/ (function(module) { 1488 1489 1490var check = function (it) { 1491 return it && it.Math === Math && it; 1492}; 1493 1494// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 1495module.exports = 1496 // eslint-disable-next-line es/no-global-this -- safe 1497 check(typeof globalThis == 'object' && globalThis) || 1498 check(typeof window == 'object' && window) || 1499 // eslint-disable-next-line no-restricted-globals -- safe 1500 check(typeof self == 'object' && self) || 1501 check(typeof global == 'object' && global) || 1502 check(typeof this == 'object' && this) || 1503 // eslint-disable-next-line no-new-func -- fallback 1504 (function () { return this; })() || Function('return this')(); 1505 1506 1507/***/ }), 1508 1509/***/ 9297: 1510/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1511 1512 1513var uncurryThis = __webpack_require__(9504); 1514var toObject = __webpack_require__(8981); 1515 1516var hasOwnProperty = uncurryThis({}.hasOwnProperty); 1517 1518// `HasOwnProperty` abstract operation 1519// https://tc39.es/ecma262/#sec-hasownproperty 1520// eslint-disable-next-line es/no-object-hasown -- safe 1521module.exports = Object.hasOwn || function hasOwn(it, key) { 1522 return hasOwnProperty(toObject(it), key); 1523}; 1524 1525 1526/***/ }), 1527 1528/***/ 421: 1529/***/ ((module) => { 1530 1531 1532module.exports = {}; 1533 1534 1535/***/ }), 1536 1537/***/ 397: 1538/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1539 1540 1541var getBuiltIn = __webpack_require__(7751); 1542 1543module.exports = getBuiltIn('document', 'documentElement'); 1544 1545 1546/***/ }), 1547 1548/***/ 5917: 1549/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1550 1551 1552var DESCRIPTORS = __webpack_require__(3724); 1553var fails = __webpack_require__(9039); 1554var createElement = __webpack_require__(4055); 1555 1556// Thanks to IE8 for its funny defineProperty 1557module.exports = !DESCRIPTORS && !fails(function () { 1558 // eslint-disable-next-line es/no-object-defineproperty -- required for testing 1559 return Object.defineProperty(createElement('div'), 'a', { 1560 get: function () { return 7; } 1561 }).a !== 7; 1562}); 1563 1564 1565/***/ }), 1566 1567/***/ 7055: 1568/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1569 1570 1571var uncurryThis = __webpack_require__(9504); 1572var fails = __webpack_require__(9039); 1573var classof = __webpack_require__(2195); 1574 1575var $Object = Object; 1576var split = uncurryThis(''.split); 1577 1578// fallback for non-array-like ES3 and non-enumerable old V8 strings 1579module.exports = fails(function () { 1580 // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 1581 // eslint-disable-next-line no-prototype-builtins -- safe 1582 return !$Object('z').propertyIsEnumerable(0); 1583}) ? function (it) { 1584 return classof(it) === 'String' ? split(it, '') : $Object(it); 1585} : $Object; 1586 1587 1588/***/ }), 1589 1590/***/ 3167: 1591/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1592 1593 1594var isCallable = __webpack_require__(4901); 1595var isObject = __webpack_require__(34); 1596var setPrototypeOf = __webpack_require__(2967); 1597 1598// makes subclassing work correct for wrapped built-ins 1599module.exports = function ($this, dummy, Wrapper) { 1600 var NewTarget, NewTargetPrototype; 1601 if ( 1602 // it can work only with native `setPrototypeOf` 1603 setPrototypeOf && 1604 // we haven't completely correct pre-ES6 way for getting `new.target`, so use this 1605 isCallable(NewTarget = dummy.constructor) && 1606 NewTarget !== Wrapper && 1607 isObject(NewTargetPrototype = NewTarget.prototype) && 1608 NewTargetPrototype !== Wrapper.prototype 1609 ) setPrototypeOf($this, NewTargetPrototype); 1610 return $this; 1611}; 1612 1613 1614/***/ }), 1615 1616/***/ 3706: 1617/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1618 1619 1620var uncurryThis = __webpack_require__(9504); 1621var isCallable = __webpack_require__(4901); 1622var store = __webpack_require__(7629); 1623 1624var functionToString = uncurryThis(Function.toString); 1625 1626// this helper broken in `[email protected]`, so we can't use `shared` helper 1627if (!isCallable(store.inspectSource)) { 1628 store.inspectSource = function (it) { 1629 return functionToString(it); 1630 }; 1631} 1632 1633module.exports = store.inspectSource; 1634 1635 1636/***/ }), 1637 1638/***/ 1181: 1639/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1640 1641 1642var NATIVE_WEAK_MAP = __webpack_require__(8622); 1643var globalThis = __webpack_require__(4576); 1644var isObject = __webpack_require__(34); 1645var createNonEnumerableProperty = __webpack_require__(6699); 1646var hasOwn = __webpack_require__(9297); 1647var shared = __webpack_require__(7629); 1648var sharedKey = __webpack_require__(6119); 1649var hiddenKeys = __webpack_require__(421); 1650 1651var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; 1652var TypeError = globalThis.TypeError; 1653var WeakMap = globalThis.WeakMap; 1654var set, get, has; 1655 1656var enforce = function (it) { 1657 return has(it) ? get(it) : set(it, {}); 1658}; 1659 1660var getterFor = function (TYPE) { 1661 return function (it) { 1662 var state; 1663 if (!isObject(it) || (state = get(it)).type !== TYPE) { 1664 throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); 1665 } return state; 1666 }; 1667}; 1668 1669if (NATIVE_WEAK_MAP || shared.state) { 1670 var store = shared.state || (shared.state = new WeakMap()); 1671 /* eslint-disable no-self-assign -- prototype methods protection */ 1672 store.get = store.get; 1673 store.has = store.has; 1674 store.set = store.set; 1675 /* eslint-enable no-self-assign -- prototype methods protection */ 1676 set = function (it, metadata) { 1677 if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); 1678 metadata.facade = it; 1679 store.set(it, metadata); 1680 return metadata; 1681 }; 1682 get = function (it) { 1683 return store.get(it) || {}; 1684 }; 1685 has = function (it) { 1686 return store.has(it); 1687 }; 1688} else { 1689 var STATE = sharedKey('state'); 1690 hiddenKeys[STATE] = true; 1691 set = function (it, metadata) { 1692 if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); 1693 metadata.facade = it; 1694 createNonEnumerableProperty(it, STATE, metadata); 1695 return metadata; 1696 }; 1697 get = function (it) { 1698 return hasOwn(it, STATE) ? it[STATE] : {}; 1699 }; 1700 has = function (it) { 1701 return hasOwn(it, STATE); 1702 }; 1703} 1704 1705module.exports = { 1706 set: set, 1707 get: get, 1708 has: has, 1709 enforce: enforce, 1710 getterFor: getterFor 1711}; 1712 1713 1714/***/ }), 1715 1716/***/ 4209: 1717/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1718 1719 1720var wellKnownSymbol = __webpack_require__(8227); 1721var Iterators = __webpack_require__(6269); 1722 1723var ITERATOR = wellKnownSymbol('iterator'); 1724var ArrayPrototype = Array.prototype; 1725 1726// check on default Array iterator 1727module.exports = function (it) { 1728 return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); 1729}; 1730 1731 1732/***/ }), 1733 1734/***/ 4376: 1735/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1736 1737 1738var classof = __webpack_require__(2195); 1739 1740// `IsArray` abstract operation 1741// https://tc39.es/ecma262/#sec-isarray 1742// eslint-disable-next-line es/no-array-isarray -- safe 1743module.exports = Array.isArray || function isArray(argument) { 1744 return classof(argument) === 'Array'; 1745}; 1746 1747 1748/***/ }), 1749 1750/***/ 1108: 1751/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1752 1753 1754var classof = __webpack_require__(6955); 1755 1756module.exports = function (it) { 1757 var klass = classof(it); 1758 return klass === 'BigInt64Array' || klass === 'BigUint64Array'; 1759}; 1760 1761 1762/***/ }), 1763 1764/***/ 4901: 1765/***/ ((module) => { 1766 1767 1768// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot 1769var documentAll = typeof document == 'object' && document.all; 1770 1771// `IsCallable` abstract operation 1772// https://tc39.es/ecma262/#sec-iscallable 1773// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing 1774module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { 1775 return typeof argument == 'function' || argument === documentAll; 1776} : function (argument) { 1777 return typeof argument == 'function'; 1778}; 1779 1780 1781/***/ }), 1782 1783/***/ 2796: 1784/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1785 1786 1787var fails = __webpack_require__(9039); 1788var isCallable = __webpack_require__(4901); 1789 1790var replacement = /#|\.prototype\./; 1791 1792var isForced = function (feature, detection) { 1793 var value = data[normalize(feature)]; 1794 return value === POLYFILL ? true 1795 : value === NATIVE ? false 1796 : isCallable(detection) ? fails(detection) 1797 : !!detection; 1798}; 1799 1800var normalize = isForced.normalize = function (string) { 1801 return String(string).replace(replacement, '.').toLowerCase(); 1802}; 1803 1804var data = isForced.data = {}; 1805var NATIVE = isForced.NATIVE = 'N'; 1806var POLYFILL = isForced.POLYFILL = 'P'; 1807 1808module.exports = isForced; 1809 1810 1811/***/ }), 1812 1813/***/ 4117: 1814/***/ ((module) => { 1815 1816 1817// we can't use just `it == null` since of `document.all` special case 1818// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec 1819module.exports = function (it) { 1820 return it === null || it === undefined; 1821}; 1822 1823 1824/***/ }), 1825 1826/***/ 34: 1827/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1828 1829 1830var isCallable = __webpack_require__(4901); 1831 1832module.exports = function (it) { 1833 return typeof it == 'object' ? it !== null : isCallable(it); 1834}; 1835 1836 1837/***/ }), 1838 1839/***/ 3925: 1840/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1841 1842 1843var isObject = __webpack_require__(34); 1844 1845module.exports = function (argument) { 1846 return isObject(argument) || argument === null; 1847}; 1848 1849 1850/***/ }), 1851 1852/***/ 6395: 1853/***/ ((module) => { 1854 1855 1856module.exports = false; 1857 1858 1859/***/ }), 1860 1861/***/ 757: 1862/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1863 1864 1865var getBuiltIn = __webpack_require__(7751); 1866var isCallable = __webpack_require__(4901); 1867var isPrototypeOf = __webpack_require__(1625); 1868var USE_SYMBOL_AS_UID = __webpack_require__(7040); 1869 1870var $Object = Object; 1871 1872module.exports = USE_SYMBOL_AS_UID ? function (it) { 1873 return typeof it == 'symbol'; 1874} : function (it) { 1875 var $Symbol = getBuiltIn('Symbol'); 1876 return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); 1877}; 1878 1879 1880/***/ }), 1881 1882/***/ 507: 1883/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1884 1885 1886var call = __webpack_require__(9565); 1887 1888module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) { 1889 var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator; 1890 var next = record.next; 1891 var step, result; 1892 while (!(step = call(next, iterator)).done) { 1893 result = fn(step.value); 1894 if (result !== undefined) return result; 1895 } 1896}; 1897 1898 1899/***/ }), 1900 1901/***/ 2652: 1902/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1903 1904 1905var bind = __webpack_require__(6080); 1906var call = __webpack_require__(9565); 1907var anObject = __webpack_require__(8551); 1908var tryToString = __webpack_require__(6823); 1909var isArrayIteratorMethod = __webpack_require__(4209); 1910var lengthOfArrayLike = __webpack_require__(6198); 1911var isPrototypeOf = __webpack_require__(1625); 1912var getIterator = __webpack_require__(81); 1913var getIteratorMethod = __webpack_require__(851); 1914var iteratorClose = __webpack_require__(9539); 1915 1916var $TypeError = TypeError; 1917 1918var Result = function (stopped, result) { 1919 this.stopped = stopped; 1920 this.result = result; 1921}; 1922 1923var ResultPrototype = Result.prototype; 1924 1925module.exports = function (iterable, unboundFunction, options) { 1926 var that = options && options.that; 1927 var AS_ENTRIES = !!(options && options.AS_ENTRIES); 1928 var IS_RECORD = !!(options && options.IS_RECORD); 1929 var IS_ITERATOR = !!(options && options.IS_ITERATOR); 1930 var INTERRUPTED = !!(options && options.INTERRUPTED); 1931 var fn = bind(unboundFunction, that); 1932 var iterator, iterFn, index, length, result, next, step; 1933 1934 var stop = function (condition) { 1935 if (iterator) iteratorClose(iterator, 'normal', condition); 1936 return new Result(true, condition); 1937 }; 1938 1939 var callFn = function (value) { 1940 if (AS_ENTRIES) { 1941 anObject(value); 1942 return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); 1943 }
vendor: 8,546 bytes, lines 1943-2227
1943 return INTERRUPTED ? fn(value, stop) : fn(value); 1944 }; 1945 1946 if (IS_RECORD) { 1947 iterator = iterable.iterator; 1948 } else if (IS_ITERATOR) { 1949 iterator = iterable; 1950 } else { 1951 iterFn = getIteratorMethod(iterable); 1952 if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable'); 1953 // optimisation for array iterators 1954 if (isArrayIteratorMethod(iterFn)) { 1955 for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { 1956 result = callFn(iterable[index]); 1957 if (result && isPrototypeOf(ResultPrototype, result)) return result; 1958 } return new Result(false); 1959 } 1960 iterator = getIterator(iterable, iterFn); 1961 } 1962 1963 next = IS_RECORD ? iterable.next : iterator.next; 1964 while (!(step = call(next, iterator)).done) { 1965 try { 1966 result = callFn(step.value); 1967 } catch (error) { 1968 iteratorClose(iterator, 'throw', error); 1969 } 1970 if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; 1971 } return new Result(false); 1972}; 1973 1974 1975/***/ }), 1976 1977/***/ 9539: 1978/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1979 1980 1981var call = __webpack_require__(9565); 1982var anObject = __webpack_require__(8551); 1983var getMethod = __webpack_require__(5966); 1984 1985module.exports = function (iterator, kind, value) { 1986 var innerResult, innerError; 1987 anObject(iterator); 1988 try { 1989 innerResult = getMethod(iterator, 'return'); 1990 if (!innerResult) { 1991 if (kind === 'throw') throw value; 1992 return value; 1993 } 1994 innerResult = call(innerResult, iterator); 1995 } catch (error) { 1996 innerError = true; 1997 innerResult = error; 1998 } 1999 if (kind === 'throw') throw value; 2000 if (innerError) throw innerResult; 2001 anObject(innerResult); 2002 return value; 2003}; 2004 2005 2006/***/ }), 2007 2008/***/ 9462: 2009/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2010 2011 2012var call = __webpack_require__(9565); 2013var create = __webpack_require__(2360); 2014var createNonEnumerableProperty = __webpack_require__(6699); 2015var defineBuiltIns = __webpack_require__(6279); 2016var wellKnownSymbol = __webpack_require__(8227); 2017var InternalStateModule = __webpack_require__(1181); 2018var getMethod = __webpack_require__(5966); 2019var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype); 2020var createIterResultObject = __webpack_require__(2529); 2021var iteratorClose = __webpack_require__(9539); 2022 2023var TO_STRING_TAG = wellKnownSymbol('toStringTag'); 2024var ITERATOR_HELPER = 'IteratorHelper'; 2025var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; 2026var setInternalState = InternalStateModule.set; 2027 2028var createIteratorProxyPrototype = function (IS_ITERATOR) { 2029 var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); 2030 2031 return defineBuiltIns(create(IteratorPrototype), { 2032 next: function next() { 2033 var state = getInternalState(this); 2034 // for simplification: 2035 // for `%WrapForValidIteratorPrototype%.next` our `nextHandler` returns `IterResultObject` 2036 // for `%IteratorHelperPrototype%.next` - just a value 2037 if (IS_ITERATOR) return state.nextHandler(); 2038 try { 2039 var result = state.done ? undefined : state.nextHandler(); 2040 return createIterResultObject(result, state.done); 2041 } catch (error) { 2042 state.done = true; 2043 throw error; 2044 } 2045 }, 2046 'return': function () { 2047 var state = getInternalState(this); 2048 var iterator = state.iterator; 2049 state.done = true; 2050 if (IS_ITERATOR) { 2051 var returnMethod = getMethod(iterator, 'return'); 2052 return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); 2053 } 2054 if (state.inner) try { 2055 iteratorClose(state.inner.iterator, 'normal'); 2056 } catch (error) { 2057 return iteratorClose(iterator, 'throw', error); 2058 } 2059 if (iterator) iteratorClose(iterator, 'normal'); 2060 return createIterResultObject(undefined, true); 2061 } 2062 }); 2063}; 2064 2065var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); 2066var IteratorHelperPrototype = createIteratorProxyPrototype(false); 2067 2068createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); 2069 2070module.exports = function (nextHandler, IS_ITERATOR) { 2071 var IteratorProxy = function Iterator(record, state) { 2072 if (state) { 2073 state.iterator = record.iterator; 2074 state.next = record.next; 2075 } else state = record; 2076 state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; 2077 state.nextHandler = nextHandler; 2078 state.counter = 0; 2079 state.done = false; 2080 setInternalState(this, state); 2081 }; 2082 2083 IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; 2084 2085 return IteratorProxy; 2086}; 2087 2088 2089/***/ }), 2090 2091/***/ 713: 2092/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2093 2094 2095var call = __webpack_require__(9565); 2096var aCallable = __webpack_require__(9306); 2097var anObject = __webpack_require__(8551); 2098var getIteratorDirect = __webpack_require__(1767); 2099var createIteratorProxy = __webpack_require__(9462); 2100var callWithSafeIterationClosing = __webpack_require__(6319); 2101 2102var IteratorProxy = createIteratorProxy(function () { 2103 var iterator = this.iterator; 2104 var result = anObject(call(this.next, iterator)); 2105 var done = this.done = !!result.done; 2106 if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); 2107}); 2108 2109// `Iterator.prototype.map` method 2110// https://github.com/tc39/proposal-iterator-helpers 2111module.exports = function map(mapper) { 2112 anObject(this); 2113 aCallable(mapper); 2114 return new IteratorProxy(getIteratorDirect(this), { 2115 mapper: mapper 2116 }); 2117}; 2118 2119 2120/***/ }), 2121 2122/***/ 7657: 2123/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2124 2125 2126var fails = __webpack_require__(9039); 2127var isCallable = __webpack_require__(4901); 2128var isObject = __webpack_require__(34); 2129var create = __webpack_require__(2360); 2130var getPrototypeOf = __webpack_require__(2787); 2131var defineBuiltIn = __webpack_require__(6840); 2132var wellKnownSymbol = __webpack_require__(8227); 2133var IS_PURE = __webpack_require__(6395); 2134 2135var ITERATOR = wellKnownSymbol('iterator'); 2136var BUGGY_SAFARI_ITERATORS = false; 2137 2138// `%IteratorPrototype%` object 2139// https://tc39.es/ecma262/#sec-%iteratorprototype%-object 2140var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; 2141 2142/* eslint-disable es/no-array-prototype-keys -- safe */ 2143if ([].keys) { 2144 arrayIterator = [].keys(); 2145 // Safari 8 has buggy iterators w/o `next` 2146 if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; 2147 else { 2148 PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); 2149 if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; 2150 } 2151} 2152 2153var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { 2154 var test = {}; 2155 // FF44- legacy iterators case 2156 return IteratorPrototype[ITERATOR].call(test) !== test; 2157}); 2158 2159if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; 2160else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); 2161 2162// `%IteratorPrototype%[@@iterator]()` method 2163// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator 2164if (!isCallable(IteratorPrototype[ITERATOR])) { 2165 defineBuiltIn(IteratorPrototype, ITERATOR, function () { 2166 return this; 2167 }); 2168} 2169 2170module.exports = { 2171 IteratorPrototype: IteratorPrototype, 2172 BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS 2173}; 2174 2175 2176/***/ }), 2177 2178/***/ 6269: 2179/***/ ((module) => { 2180 2181 2182module.exports = {}; 2183 2184 2185/***/ }), 2186 2187/***/ 6198: 2188/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2189 2190 2191var toLength = __webpack_require__(8014); 2192 2193// `LengthOfArrayLike` abstract operation 2194// https://tc39.es/ecma262/#sec-lengthofarraylike 2195module.exports = function (obj) { 2196 return toLength(obj.length); 2197}; 2198 2199 2200/***/ }), 2201 2202/***/ 283: 2203/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2204 2205 2206var uncurryThis = __webpack_require__(9504); 2207var fails = __webpack_require__(9039); 2208var isCallable = __webpack_require__(4901); 2209var hasOwn = __webpack_require__(9297); 2210var DESCRIPTORS = __webpack_require__(3724); 2211var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(350).CONFIGURABLE); 2212var inspectSource = __webpack_require__(3706); 2213var InternalStateModule = __webpack_require__(1181); 2214 2215var enforceInternalState = InternalStateModule.enforce; 2216var getInternalState = InternalStateModule.get; 2217var $String = String; 2218// eslint-disable-next-line es/no-object-defineproperty -- safe 2219var defineProperty = Object.defineProperty; 2220var stringSlice = uncurryThis(''.slice); 2221var replace = uncurryThis(''.replace); 2222var join = uncurryThis([].join); 2223 2224var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { 2225 return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; 2226}); 2227
vendor: 4,088 bytes, lines 2228-2359
2228var TEMPLATE = String(String).split('String'); 2229 2230var makeBuiltIn = module.exports = function (value, name, options) { 2231 if (stringSlice($String(name), 0, 7) === 'Symbol(') { 2232 name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; 2233 } 2234 if (options && options.getter) name = 'get ' + name; 2235 if (options && options.setter) name = 'set ' + name; 2236 if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { 2237 if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); 2238 else value.name = name; 2239 } 2240 if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { 2241 defineProperty(value, 'length', { value: options.arity }); 2242 } 2243 try { 2244 if (options && hasOwn(options, 'constructor') && options.constructor) { 2245 if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); 2246 // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable 2247 } else if (value.prototype) value.prototype = undefined; 2248 } catch (error) { /* empty */ } 2249 var state = enforceInternalState(value); 2250 if (!hasOwn(state, 'source')) { 2251 state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); 2252 } return value; 2253}; 2254 2255// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative 2256// eslint-disable-next-line no-extend-native -- required 2257Function.prototype.toString = makeBuiltIn(function toString() { 2258 return isCallable(this) && getInternalState(this).source || inspectSource(this); 2259}, 'toString'); 2260 2261 2262/***/ }), 2263 2264/***/ 741: 2265/***/ ((module) => { 2266 2267 2268var ceil = Math.ceil; 2269var floor = Math.floor; 2270 2271// `Math.trunc` method 2272// https://tc39.es/ecma262/#sec-math.trunc 2273// eslint-disable-next-line es/no-math-trunc -- safe 2274module.exports = Math.trunc || function trunc(x) { 2275 var n = +x; 2276 return (n > 0 ? floor : ceil)(n); 2277}; 2278 2279 2280/***/ }), 2281 2282/***/ 6043: 2283/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2284 2285 2286var aCallable = __webpack_require__(9306); 2287 2288var $TypeError = TypeError; 2289 2290var PromiseCapability = function (C) { 2291 var resolve, reject; 2292 this.promise = new C(function ($$resolve, $$reject) { 2293 if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor'); 2294 resolve = $$resolve; 2295 reject = $$reject; 2296 }); 2297 this.resolve = aCallable(resolve); 2298 this.reject = aCallable(reject); 2299}; 2300 2301// `NewPromiseCapability` abstract operation 2302// https://tc39.es/ecma262/#sec-newpromisecapability 2303module.exports.f = function (C) { 2304 return new PromiseCapability(C); 2305}; 2306 2307 2308/***/ }), 2309 2310/***/ 2603: 2311/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2312 2313 2314var toString = __webpack_require__(655); 2315 2316module.exports = function (argument, $default) { 2317 return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); 2318}; 2319 2320 2321/***/ }), 2322 2323/***/ 2360: 2324/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2325 2326 2327/* global ActiveXObject -- old IE, WSH */ 2328var anObject = __webpack_require__(8551); 2329var definePropertiesModule = __webpack_require__(6801); 2330var enumBugKeys = __webpack_require__(8727); 2331var hiddenKeys = __webpack_require__(421); 2332var html = __webpack_require__(397); 2333var documentCreateElement = __webpack_require__(4055); 2334var sharedKey = __webpack_require__(6119); 2335 2336var GT = '>'; 2337var LT = '<'; 2338var PROTOTYPE = 'prototype'; 2339var SCRIPT = 'script'; 2340var IE_PROTO = sharedKey('IE_PROTO'); 2341 2342var EmptyConstructor = function () { /* empty */ }; 2343 2344var scriptTag = function (content) { 2345 return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; 2346}; 2347 2348// Create object with fake `null` prototype: use ActiveX Object with cleared prototype 2349var NullProtoObjectViaActiveX = function (activeXDocument) { 2350 activeXDocument.write(scriptTag('')); 2351 activeXDocument.close(); 2352 var temp = activeXDocument.parentWindow.Object; 2353 // eslint-disable-next-line no-useless-assignment -- avoid memory leak 2354 activeXDocument = null; 2355 return temp; 2356}; 2357 2358// Create object with fake `null` prototype: use iframe Object with cleared prototype 2359var NullProtoObjectViaIFrame = function () {
vendor: 6,261 bytes, lines 2360-2543
2360 // Thrash, waste and sodomy: IE GC bug 2361 var iframe = documentCreateElement('iframe'); 2362 var JS = 'java' + SCRIPT + ':'; 2363 var iframeDocument; 2364 iframe.style.display = 'none'; 2365 html.appendChild(iframe); 2366 // https://github.com/zloirock/core-js/issues/475 2367 iframe.src = String(JS); 2368 iframeDocument = iframe.contentWindow.document; 2369 iframeDocument.open(); 2370 iframeDocument.write(scriptTag('document.F=Object')); 2371 iframeDocument.close(); 2372 return iframeDocument.F; 2373}; 2374 2375// Check for document.domain and active x support 2376// No need to use active x approach when document.domain is not set 2377// see https://github.com/es-shims/es5-shim/issues/150 2378// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 2379// avoid IE GC bug 2380var activeXDocument; 2381var NullProtoObject = function () { 2382 try { 2383 activeXDocument = new ActiveXObject('htmlfile'); 2384 } catch (error) { /* ignore */ } 2385 NullProtoObject = typeof document != 'undefined' 2386 ? document.domain && activeXDocument 2387 ? NullProtoObjectViaActiveX(activeXDocument) // old IE 2388 : NullProtoObjectViaIFrame() 2389 : NullProtoObjectViaActiveX(activeXDocument); // WSH 2390 var length = enumBugKeys.length; 2391 while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; 2392 return NullProtoObject(); 2393}; 2394 2395hiddenKeys[IE_PROTO] = true; 2396 2397// `Object.create` method 2398// https://tc39.es/ecma262/#sec-object.create 2399// eslint-disable-next-line es/no-object-create -- safe 2400module.exports = Object.create || function create(O, Properties) { 2401 var result; 2402 if (O !== null) { 2403 EmptyConstructor[PROTOTYPE] = anObject(O); 2404 result = new EmptyConstructor(); 2405 EmptyConstructor[PROTOTYPE] = null; 2406 // add "__proto__" for Object.getPrototypeOf polyfill 2407 result[IE_PROTO] = O; 2408 } else result = NullProtoObject(); 2409 return Properties === undefined ? result : definePropertiesModule.f(result, Properties); 2410}; 2411 2412 2413/***/ }), 2414 2415/***/ 6801: 2416/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 2417 2418 2419var DESCRIPTORS = __webpack_require__(3724); 2420var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686); 2421var definePropertyModule = __webpack_require__(4913); 2422var anObject = __webpack_require__(8551); 2423var toIndexedObject = __webpack_require__(5397); 2424var objectKeys = __webpack_require__(1072); 2425 2426// `Object.defineProperties` method 2427// https://tc39.es/ecma262/#sec-object.defineproperties 2428// eslint-disable-next-line es/no-object-defineproperties -- safe 2429exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { 2430 anObject(O); 2431 var props = toIndexedObject(Properties); 2432 var keys = objectKeys(Properties); 2433 var length = keys.length; 2434 var index = 0; 2435 var key; 2436 while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); 2437 return O; 2438}; 2439 2440 2441/***/ }), 2442 2443/***/ 4913: 2444/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 2445 2446 2447var DESCRIPTORS = __webpack_require__(3724); 2448var IE8_DOM_DEFINE = __webpack_require__(5917); 2449var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686); 2450var anObject = __webpack_require__(8551); 2451var toPropertyKey = __webpack_require__(6969); 2452 2453var $TypeError = TypeError; 2454// eslint-disable-next-line es/no-object-defineproperty -- safe 2455var $defineProperty = Object.defineProperty; 2456// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 2457var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; 2458var ENUMERABLE = 'enumerable'; 2459var CONFIGURABLE = 'configurable'; 2460var WRITABLE = 'writable'; 2461 2462// `Object.defineProperty` method 2463// https://tc39.es/ecma262/#sec-object.defineproperty 2464exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { 2465 anObject(O); 2466 P = toPropertyKey(P); 2467 anObject(Attributes); 2468 if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { 2469 var current = $getOwnPropertyDescriptor(O, P); 2470 if (current && current[WRITABLE]) { 2471 O[P] = Attributes.value; 2472 Attributes = { 2473 configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], 2474 enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], 2475 writable: false 2476 }; 2477 } 2478 } return $defineProperty(O, P, Attributes); 2479} : $defineProperty : function defineProperty(O, P, Attributes) { 2480 anObject(O); 2481 P = toPropertyKey(P); 2482 anObject(Attributes); 2483 if (IE8_DOM_DEFINE) try { 2484 return $defineProperty(O, P, Attributes); 2485 } catch (error) { /* empty */ } 2486 if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); 2487 if ('value' in Attributes) O[P] = Attributes.value; 2488 return O; 2489}; 2490 2491 2492/***/ }), 2493 2494/***/ 7347: 2495/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 2496 2497 2498var DESCRIPTORS = __webpack_require__(3724); 2499var call = __webpack_require__(9565); 2500var propertyIsEnumerableModule = __webpack_require__(8773); 2501var createPropertyDescriptor = __webpack_require__(6980); 2502var toIndexedObject = __webpack_require__(5397); 2503var toPropertyKey = __webpack_require__(6969); 2504var hasOwn = __webpack_require__(9297); 2505var IE8_DOM_DEFINE = __webpack_require__(5917); 2506 2507// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 2508var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; 2509 2510// `Object.getOwnPropertyDescriptor` method 2511// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor 2512exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { 2513 O = toIndexedObject(O); 2514 P = toPropertyKey(P); 2515 if (IE8_DOM_DEFINE) try { 2516 return $getOwnPropertyDescriptor(O, P); 2517 } catch (error) { /* empty */ } 2518 if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); 2519}; 2520 2521 2522/***/ }), 2523 2524/***/ 8480: 2525/***/ ((__unused_webpack_module, exports, __webpack_require__) => { 2526 2527 2528var internalObjectKeys = __webpack_require__(1828); 2529var enumBugKeys = __webpack_require__(8727); 2530 2531var hiddenKeys = enumBugKeys.concat('length', 'prototype'); 2532 2533// `Object.getOwnPropertyNames` method 2534// https://tc39.es/ecma262/#sec-object.getownpropertynames 2535// eslint-disable-next-line es/no-object-getownpropertynames -- safe 2536exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { 2537 return internalObjectKeys(O, hiddenKeys); 2538}; 2539 2540 2541/***/ }), 2542 2543/***/ 3717:
vendor: 5,343 bytes, lines 2544-2727
2544/***/ ((__unused_webpack_module, exports) => { 2545 2546 2547// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe 2548exports.f = Object.getOwnPropertySymbols; 2549 2550 2551/***/ }), 2552 2553/***/ 2787: 2554/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2555 2556 2557var hasOwn = __webpack_require__(9297); 2558var isCallable = __webpack_require__(4901); 2559var toObject = __webpack_require__(8981); 2560var sharedKey = __webpack_require__(6119); 2561var CORRECT_PROTOTYPE_GETTER = __webpack_require__(2211); 2562 2563var IE_PROTO = sharedKey('IE_PROTO'); 2564var $Object = Object; 2565var ObjectPrototype = $Object.prototype; 2566 2567// `Object.getPrototypeOf` method 2568// https://tc39.es/ecma262/#sec-object.getprototypeof 2569// eslint-disable-next-line es/no-object-getprototypeof -- safe 2570module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { 2571 var object = toObject(O); 2572 if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; 2573 var constructor = object.constructor; 2574 if (isCallable(constructor) && object instanceof constructor) { 2575 return constructor.prototype; 2576 } return object instanceof $Object ? ObjectPrototype : null; 2577}; 2578 2579 2580/***/ }), 2581 2582/***/ 1625: 2583/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2584 2585 2586var uncurryThis = __webpack_require__(9504); 2587 2588module.exports = uncurryThis({}.isPrototypeOf); 2589 2590 2591/***/ }), 2592 2593/***/ 1828: 2594/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2595 2596 2597var uncurryThis = __webpack_require__(9504); 2598var hasOwn = __webpack_require__(9297); 2599var toIndexedObject = __webpack_require__(5397); 2600var indexOf = (__webpack_require__(9617).indexOf); 2601var hiddenKeys = __webpack_require__(421); 2602 2603var push = uncurryThis([].push); 2604 2605module.exports = function (object, names) { 2606 var O = toIndexedObject(object); 2607 var i = 0; 2608 var result = []; 2609 var key; 2610 for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); 2611 // Don't enum bug & hidden keys 2612 while (names.length > i) if (hasOwn(O, key = names[i++])) { 2613 ~indexOf(result, key) || push(result, key); 2614 } 2615 return result; 2616}; 2617 2618 2619/***/ }), 2620 2621/***/ 1072: 2622/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2623 2624 2625var internalObjectKeys = __webpack_require__(1828); 2626var enumBugKeys = __webpack_require__(8727); 2627 2628// `Object.keys` method 2629// https://tc39.es/ecma262/#sec-object.keys 2630// eslint-disable-next-line es/no-object-keys -- safe 2631module.exports = Object.keys || function keys(O) { 2632 return internalObjectKeys(O, enumBugKeys); 2633}; 2634 2635 2636/***/ }), 2637 2638/***/ 8773: 2639/***/ ((__unused_webpack_module, exports) => { 2640 2641 2642var $propertyIsEnumerable = {}.propertyIsEnumerable; 2643// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 2644var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; 2645 2646// Nashorn ~ JDK8 bug 2647var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); 2648 2649// `Object.prototype.propertyIsEnumerable` method implementation 2650// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable 2651exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { 2652 var descriptor = getOwnPropertyDescriptor(this, V); 2653 return !!descriptor && descriptor.enumerable; 2654} : $propertyIsEnumerable; 2655 2656 2657/***/ }), 2658 2659/***/ 2967: 2660/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2661 2662 2663/* eslint-disable no-proto -- safe */ 2664var uncurryThisAccessor = __webpack_require__(6706); 2665var isObject = __webpack_require__(34); 2666var requireObjectCoercible = __webpack_require__(7750); 2667var aPossiblePrototype = __webpack_require__(3506); 2668 2669// `Object.setPrototypeOf` method 2670// https://tc39.es/ecma262/#sec-object.setprototypeof 2671// Works with __proto__ only. Old v8 can't work with null proto objects. 2672// eslint-disable-next-line es/no-object-setprototypeof -- safe 2673module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { 2674 var CORRECT_SETTER = false; 2675 var test = {}; 2676 var setter; 2677 try { 2678 setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); 2679 setter(test, []); 2680 CORRECT_SETTER = test instanceof Array; 2681 } catch (error) { /* empty */ } 2682 return function setPrototypeOf(O, proto) { 2683 requireObjectCoercible(O); 2684 aPossiblePrototype(proto); 2685 if (!isObject(O)) return O; 2686 if (CORRECT_SETTER) setter(O, proto); 2687 else O.__proto__ = proto; 2688 return O; 2689 }; 2690}() : undefined); 2691 2692 2693/***/ }), 2694 2695/***/ 4270: 2696/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2697 2698 2699var call = __webpack_require__(9565); 2700var isCallable = __webpack_require__(4901); 2701var isObject = __webpack_require__(34); 2702 2703var $TypeError = TypeError; 2704 2705// `OrdinaryToPrimitive` abstract operation 2706// https://tc39.es/ecma262/#sec-ordinarytoprimitive 2707module.exports = function (input, pref) { 2708 var fn, val; 2709 if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; 2710 if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; 2711 if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; 2712 throw new $TypeError("Can't convert object to primitive value"); 2713}; 2714 2715 2716/***/ }), 2717 2718/***/ 5031: 2719/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2720 2721 2722var getBuiltIn = __webpack_require__(7751); 2723var uncurryThis = __webpack_require__(9504); 2724var getOwnPropertyNamesModule = __webpack_require__(8480); 2725var getOwnPropertySymbolsModule = __webpack_require__(3717); 2726var anObject = __webpack_require__(8551); 2727
vendor: 24,154 bytes, lines 2728-3682
2728var concat = uncurryThis([].concat); 2729 2730// all object keys, includes non-enumerable and symbols 2731module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { 2732 var keys = getOwnPropertyNamesModule.f(anObject(it)); 2733 var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; 2734 return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; 2735}; 2736 2737 2738/***/ }), 2739 2740/***/ 1103: 2741/***/ ((module) => { 2742 2743 2744module.exports = function (exec) { 2745 try { 2746 return { error: false, value: exec() }; 2747 } catch (error) { 2748 return { error: true, value: error }; 2749 } 2750}; 2751 2752 2753/***/ }), 2754 2755/***/ 7979: 2756/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2757 2758 2759var anObject = __webpack_require__(8551); 2760 2761// `RegExp.prototype.flags` getter implementation 2762// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags 2763module.exports = function () { 2764 var that = anObject(this); 2765 var result = ''; 2766 if (that.hasIndices) result += 'd'; 2767 if (that.global) result += 'g'; 2768 if (that.ignoreCase) result += 'i'; 2769 if (that.multiline) result += 'm'; 2770 if (that.dotAll) result += 's'; 2771 if (that.unicode) result += 'u'; 2772 if (that.unicodeSets) result += 'v'; 2773 if (that.sticky) result += 'y'; 2774 return result; 2775}; 2776 2777 2778/***/ }), 2779 2780/***/ 7750: 2781/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2782 2783 2784var isNullOrUndefined = __webpack_require__(4117); 2785 2786var $TypeError = TypeError; 2787 2788// `RequireObjectCoercible` abstract operation 2789// https://tc39.es/ecma262/#sec-requireobjectcoercible 2790module.exports = function (it) { 2791 if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); 2792 return it; 2793}; 2794 2795 2796/***/ }), 2797 2798/***/ 9286: 2799/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2800 2801 2802var SetHelpers = __webpack_require__(4402); 2803var iterate = __webpack_require__(8469); 2804 2805var Set = SetHelpers.Set; 2806var add = SetHelpers.add; 2807 2808module.exports = function (set) { 2809 var result = new Set(); 2810 iterate(set, function (it) { 2811 add(result, it); 2812 }); 2813 return result; 2814}; 2815 2816 2817/***/ }), 2818 2819/***/ 3440: 2820/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2821 2822 2823var aSet = __webpack_require__(7080); 2824var SetHelpers = __webpack_require__(4402); 2825var clone = __webpack_require__(9286); 2826var size = __webpack_require__(5170); 2827var getSetRecord = __webpack_require__(3789); 2828var iterateSet = __webpack_require__(8469); 2829var iterateSimple = __webpack_require__(507); 2830 2831var has = SetHelpers.has; 2832var remove = SetHelpers.remove; 2833 2834// `Set.prototype.difference` method 2835// https://github.com/tc39/proposal-set-methods 2836module.exports = function difference(other) { 2837 var O = aSet(this); 2838 var otherRec = getSetRecord(other); 2839 var result = clone(O); 2840 if (size(O) <= otherRec.size) iterateSet(O, function (e) { 2841 if (otherRec.includes(e)) remove(result, e); 2842 }); 2843 else iterateSimple(otherRec.getIterator(), function (e) { 2844 if (has(O, e)) remove(result, e); 2845 }); 2846 return result; 2847}; 2848 2849 2850/***/ }), 2851 2852/***/ 4402: 2853/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2854 2855 2856var uncurryThis = __webpack_require__(9504); 2857 2858// eslint-disable-next-line es/no-set -- safe 2859var SetPrototype = Set.prototype; 2860 2861module.exports = { 2862 // eslint-disable-next-line es/no-set -- safe 2863 Set: Set, 2864 add: uncurryThis(SetPrototype.add), 2865 has: uncurryThis(SetPrototype.has), 2866 remove: uncurryThis(SetPrototype['delete']), 2867 proto: SetPrototype 2868}; 2869 2870 2871/***/ }), 2872 2873/***/ 8750: 2874/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2875 2876 2877var aSet = __webpack_require__(7080); 2878var SetHelpers = __webpack_require__(4402); 2879var size = __webpack_require__(5170); 2880var getSetRecord = __webpack_require__(3789); 2881var iterateSet = __webpack_require__(8469); 2882var iterateSimple = __webpack_require__(507); 2883 2884var Set = SetHelpers.Set; 2885var add = SetHelpers.add; 2886var has = SetHelpers.has; 2887 2888// `Set.prototype.intersection` method 2889// https://github.com/tc39/proposal-set-methods 2890module.exports = function intersection(other) { 2891 var O = aSet(this); 2892 var otherRec = getSetRecord(other); 2893 var result = new Set(); 2894 2895 if (size(O) > otherRec.size) { 2896 iterateSimple(otherRec.getIterator(), function (e) { 2897 if (has(O, e)) add(result, e); 2898 }); 2899 } else { 2900 iterateSet(O, function (e) { 2901 if (otherRec.includes(e)) add(result, e); 2902 }); 2903 } 2904 2905 return result; 2906}; 2907 2908 2909/***/ }), 2910 2911/***/ 4449: 2912/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2913 2914 2915var aSet = __webpack_require__(7080); 2916var has = (__webpack_require__(4402).has); 2917var size = __webpack_require__(5170); 2918var getSetRecord = __webpack_require__(3789); 2919var iterateSet = __webpack_require__(8469); 2920var iterateSimple = __webpack_require__(507); 2921var iteratorClose = __webpack_require__(9539); 2922 2923// `Set.prototype.isDisjointFrom` method 2924// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom 2925module.exports = function isDisjointFrom(other) { 2926 var O = aSet(this); 2927 var otherRec = getSetRecord(other); 2928 if (size(O) <= otherRec.size) return iterateSet(O, function (e) { 2929 if (otherRec.includes(e)) return false; 2930 }, true) !== false; 2931 var iterator = otherRec.getIterator(); 2932 return iterateSimple(iterator, function (e) { 2933 if (has(O, e)) return iteratorClose(iterator, 'normal', false); 2934 }) !== false; 2935}; 2936 2937 2938/***/ }), 2939 2940/***/ 3838: 2941/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2942 2943 2944var aSet = __webpack_require__(7080); 2945var size = __webpack_require__(5170); 2946var iterate = __webpack_require__(8469); 2947var getSetRecord = __webpack_require__(3789); 2948 2949// `Set.prototype.isSubsetOf` method 2950// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf 2951module.exports = function isSubsetOf(other) { 2952 var O = aSet(this); 2953 var otherRec = getSetRecord(other); 2954 if (size(O) > otherRec.size) return false; 2955 return iterate(O, function (e) { 2956 if (!otherRec.includes(e)) return false; 2957 }, true) !== false; 2958}; 2959 2960 2961/***/ }), 2962 2963/***/ 8527: 2964/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2965 2966 2967var aSet = __webpack_require__(7080); 2968var has = (__webpack_require__(4402).has); 2969var size = __webpack_require__(5170); 2970var getSetRecord = __webpack_require__(3789); 2971var iterateSimple = __webpack_require__(507); 2972var iteratorClose = __webpack_require__(9539); 2973 2974// `Set.prototype.isSupersetOf` method 2975// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf 2976module.exports = function isSupersetOf(other) { 2977 var O = aSet(this); 2978 var otherRec = getSetRecord(other); 2979 if (size(O) < otherRec.size) return false; 2980 var iterator = otherRec.getIterator(); 2981 return iterateSimple(iterator, function (e) { 2982 if (!has(O, e)) return iteratorClose(iterator, 'normal', false); 2983 }) !== false; 2984}; 2985 2986 2987/***/ }), 2988 2989/***/ 8469: 2990/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 2991 2992 2993var uncurryThis = __webpack_require__(9504); 2994var iterateSimple = __webpack_require__(507); 2995var SetHelpers = __webpack_require__(4402); 2996 2997var Set = SetHelpers.Set; 2998var SetPrototype = SetHelpers.proto; 2999var forEach = uncurryThis(SetPrototype.forEach); 3000var keys = uncurryThis(SetPrototype.keys); 3001var next = keys(new Set()).next; 3002 3003module.exports = function (set, fn, interruptible) { 3004 return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn); 3005}; 3006 3007 3008/***/ }), 3009 3010/***/ 4916: 3011/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3012 3013 3014var getBuiltIn = __webpack_require__(7751); 3015 3016var createSetLike = function (size) { 3017 return { 3018 size: size, 3019 has: function () { 3020 return false; 3021 }, 3022 keys: function () { 3023 return { 3024 next: function () { 3025 return { done: true }; 3026 } 3027 }; 3028 } 3029 }; 3030}; 3031 3032module.exports = function (name) { 3033 var Set = getBuiltIn('Set'); 3034 try { 3035 new Set()[name](createSetLike(0)); 3036 try { 3037 // late spec change, early WebKit ~ Safari 17.0 beta implementation does not pass it 3038 // https://github.com/tc39/proposal-set-methods/pull/88 3039 new Set()[name](createSetLike(-1)); 3040 return false; 3041 } catch (error2) { 3042 return true; 3043 } 3044 } catch (error) { 3045 return false; 3046 } 3047}; 3048 3049 3050/***/ }), 3051 3052/***/ 5170: 3053/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3054 3055 3056var uncurryThisAccessor = __webpack_require__(6706); 3057var SetHelpers = __webpack_require__(4402); 3058 3059module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) { 3060 return set.size; 3061}; 3062 3063 3064/***/ }), 3065 3066/***/ 3650: 3067/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3068 3069 3070var aSet = __webpack_require__(7080); 3071var SetHelpers = __webpack_require__(4402); 3072var clone = __webpack_require__(9286); 3073var getSetRecord = __webpack_require__(3789); 3074var iterateSimple = __webpack_require__(507); 3075 3076var add = SetHelpers.add; 3077var has = SetHelpers.has; 3078var remove = SetHelpers.remove; 3079 3080// `Set.prototype.symmetricDifference` method 3081// https://github.com/tc39/proposal-set-methods 3082module.exports = function symmetricDifference(other) { 3083 var O = aSet(this); 3084 var keysIter = getSetRecord(other).getIterator(); 3085 var result = clone(O); 3086 iterateSimple(keysIter, function (e) { 3087 if (has(O, e)) remove(result, e); 3088 else add(result, e); 3089 }); 3090 return result; 3091}; 3092 3093 3094/***/ }), 3095 3096/***/ 4204: 3097/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3098 3099 3100var aSet = __webpack_require__(7080); 3101var add = (__webpack_require__(4402).add); 3102var clone = __webpack_require__(9286); 3103var getSetRecord = __webpack_require__(3789); 3104var iterateSimple = __webpack_require__(507); 3105 3106// `Set.prototype.union` method 3107// https://github.com/tc39/proposal-set-methods 3108module.exports = function union(other) { 3109 var O = aSet(this); 3110 var keysIter = getSetRecord(other).getIterator(); 3111 var result = clone(O); 3112 iterateSimple(keysIter, function (it) { 3113 add(result, it); 3114 }); 3115 return result; 3116}; 3117 3118 3119/***/ }), 3120 3121/***/ 6119: 3122/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3123 3124 3125var shared = __webpack_require__(5745); 3126var uid = __webpack_require__(3392); 3127 3128var keys = shared('keys'); 3129 3130module.exports = function (key) { 3131 return keys[key] || (keys[key] = uid(key)); 3132}; 3133 3134 3135/***/ }), 3136 3137/***/ 7629: 3138/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3139 3140 3141var IS_PURE = __webpack_require__(6395); 3142var globalThis = __webpack_require__(4576); 3143var defineGlobalProperty = __webpack_require__(9433); 3144 3145var SHARED = '__core-js_shared__'; 3146var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); 3147 3148(store.versions || (store.versions = [])).push({ 3149 version: '3.39.0', 3150 mode: IS_PURE ? 'pure' : 'global', 3151 copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)', 3152 license: 'https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE', 3153 source: 'https://github.com/zloirock/core-js' 3154}); 3155 3156 3157/***/ }), 3158 3159/***/ 5745: 3160/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3161 3162 3163var store = __webpack_require__(7629); 3164 3165module.exports = function (key, value) { 3166 return store[key] || (store[key] = value || {}); 3167}; 3168 3169 3170/***/ }), 3171 3172/***/ 1548: 3173/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3174 3175 3176var globalThis = __webpack_require__(4576); 3177var fails = __webpack_require__(9039); 3178var V8 = __webpack_require__(9519); 3179var ENVIRONMENT = __webpack_require__(4215); 3180 3181var structuredClone = globalThis.structuredClone; 3182 3183module.exports = !!structuredClone && !fails(function () { 3184 // prevent V8 ArrayBufferDetaching protector cell invalidation and performance degradation 3185 // https://github.com/zloirock/core-js/issues/679 3186 if ((ENVIRONMENT === 'DENO' && V8 > 92) || (ENVIRONMENT === 'NODE' && V8 > 94) || (ENVIRONMENT === 'BROWSER' && V8 > 97)) return false; 3187 var buffer = new ArrayBuffer(8); 3188 var clone = structuredClone(buffer, { transfer: [buffer] }); 3189 return buffer.byteLength !== 0 || clone.byteLength !== 8; 3190}); 3191 3192 3193/***/ }), 3194 3195/***/ 4495: 3196/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3197 3198 3199/* eslint-disable es/no-symbol -- required for testing */ 3200var V8_VERSION = __webpack_require__(9519); 3201var fails = __webpack_require__(9039); 3202var globalThis = __webpack_require__(4576); 3203 3204var $String = globalThis.String; 3205 3206// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing 3207module.exports = !!Object.getOwnPropertySymbols && !fails(function () { 3208 var symbol = Symbol('symbol detection'); 3209 // Chrome 38 Symbol has incorrect toString conversion 3210 // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances 3211 // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, 3212 // of course, fail. 3213 return !$String(symbol) || !(Object(symbol) instanceof Symbol) || 3214 // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances 3215 !Symbol.sham && V8_VERSION && V8_VERSION < 41; 3216}); 3217 3218 3219/***/ }), 3220 3221/***/ 5610: 3222/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3223 3224 3225var toIntegerOrInfinity = __webpack_require__(1291); 3226 3227var max = Math.max; 3228var min = Math.min; 3229 3230// Helper for a popular repeating case of the spec: 3231// Let integer be ? ToInteger(index). 3232// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). 3233module.exports = function (index, length) { 3234 var integer = toIntegerOrInfinity(index); 3235 return integer < 0 ? max(integer + length, 0) : min(integer, length); 3236}; 3237 3238 3239/***/ }), 3240 3241/***/ 5854: 3242/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3243 3244 3245var toPrimitive = __webpack_require__(2777); 3246 3247var $TypeError = TypeError; 3248 3249// `ToBigInt` abstract operation 3250// https://tc39.es/ecma262/#sec-tobigint 3251module.exports = function (argument) { 3252 var prim = toPrimitive(argument, 'number'); 3253 if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint"); 3254 // eslint-disable-next-line es/no-bigint -- safe 3255 return BigInt(prim); 3256}; 3257 3258 3259/***/ }), 3260 3261/***/ 7696: 3262/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3263 3264 3265var toIntegerOrInfinity = __webpack_require__(1291); 3266var toLength = __webpack_require__(8014); 3267 3268var $RangeError = RangeError; 3269 3270// `ToIndex` abstract operation 3271// https://tc39.es/ecma262/#sec-toindex 3272module.exports = function (it) { 3273 if (it === undefined) return 0; 3274 var number = toIntegerOrInfinity(it); 3275 var length = toLength(number); 3276 if (number !== length) throw new $RangeError('Wrong length or index'); 3277 return length; 3278}; 3279 3280 3281/***/ }), 3282 3283/***/ 5397: 3284/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3285 3286 3287// toObject with fallback for non-array-like ES3 strings 3288var IndexedObject = __webpack_require__(7055); 3289var requireObjectCoercible = __webpack_require__(7750); 3290 3291module.exports = function (it) { 3292 return IndexedObject(requireObjectCoercible(it)); 3293}; 3294 3295 3296/***/ }), 3297 3298/***/ 1291: 3299/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3300 3301 3302var trunc = __webpack_require__(741); 3303 3304// `ToIntegerOrInfinity` abstract operation 3305// https://tc39.es/ecma262/#sec-tointegerorinfinity 3306module.exports = function (argument) { 3307 var number = +argument; 3308 // eslint-disable-next-line no-self-compare -- NaN check 3309 return number !== number || number === 0 ? 0 : trunc(number); 3310}; 3311 3312 3313/***/ }), 3314 3315/***/ 8014: 3316/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3317 3318 3319var toIntegerOrInfinity = __webpack_require__(1291); 3320 3321var min = Math.min; 3322 3323// `ToLength` abstract operation 3324// https://tc39.es/ecma262/#sec-tolength 3325module.exports = function (argument) { 3326 var len = toIntegerOrInfinity(argument); 3327 return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 3328}; 3329 3330 3331/***/ }), 3332 3333/***/ 8981: 3334/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3335 3336 3337var requireObjectCoercible = __webpack_require__(7750); 3338 3339var $Object = Object; 3340 3341// `ToObject` abstract operation 3342// https://tc39.es/ecma262/#sec-toobject 3343module.exports = function (argument) { 3344 return $Object(requireObjectCoercible(argument)); 3345}; 3346 3347 3348/***/ }), 3349 3350/***/ 2777: 3351/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3352 3353 3354var call = __webpack_require__(9565); 3355var isObject = __webpack_require__(34); 3356var isSymbol = __webpack_require__(757); 3357var getMethod = __webpack_require__(5966); 3358var ordinaryToPrimitive = __webpack_require__(4270); 3359var wellKnownSymbol = __webpack_require__(8227); 3360 3361var $TypeError = TypeError; 3362var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); 3363 3364// `ToPrimitive` abstract operation 3365// https://tc39.es/ecma262/#sec-toprimitive 3366module.exports = function (input, pref) { 3367 if (!isObject(input) || isSymbol(input)) return input; 3368 var exoticToPrim = getMethod(input, TO_PRIMITIVE); 3369 var result; 3370 if (exoticToPrim) { 3371 if (pref === undefined) pref = 'default'; 3372 result = call(exoticToPrim, input, pref); 3373 if (!isObject(result) || isSymbol(result)) return result; 3374 throw new $TypeError("Can't convert object to primitive value"); 3375 } 3376 if (pref === undefined) pref = 'number'; 3377 return ordinaryToPrimitive(input, pref); 3378}; 3379 3380 3381/***/ }), 3382 3383/***/ 6969: 3384/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3385 3386 3387var toPrimitive = __webpack_require__(2777); 3388var isSymbol = __webpack_require__(757); 3389 3390// `ToPropertyKey` abstract operation 3391// https://tc39.es/ecma262/#sec-topropertykey 3392module.exports = function (argument) { 3393 var key = toPrimitive(argument, 'string'); 3394 return isSymbol(key) ? key : key + ''; 3395}; 3396 3397 3398/***/ }), 3399 3400/***/ 2140: 3401/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3402 3403 3404var wellKnownSymbol = __webpack_require__(8227); 3405 3406var TO_STRING_TAG = wellKnownSymbol('toStringTag'); 3407var test = {}; 3408 3409test[TO_STRING_TAG] = 'z'; 3410 3411module.exports = String(test) === '[object z]'; 3412 3413 3414/***/ }), 3415 3416/***/ 655: 3417/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3418 3419 3420var classof = __webpack_require__(6955); 3421 3422var $String = String; 3423 3424module.exports = function (argument) { 3425 if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); 3426 return $String(argument); 3427}; 3428 3429 3430/***/ }), 3431 3432/***/ 6823: 3433/***/ ((module) => { 3434 3435 3436var $String = String; 3437 3438module.exports = function (argument) { 3439 try { 3440 return $String(argument); 3441 } catch (error) { 3442 return 'Object'; 3443 } 3444}; 3445 3446 3447/***/ }), 3448 3449/***/ 3392: 3450/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3451 3452 3453var uncurryThis = __webpack_require__(9504); 3454 3455var id = 0; 3456var postfix = Math.random(); 3457var toString = uncurryThis(1.0.toString); 3458 3459module.exports = function (key) { 3460 return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); 3461}; 3462 3463 3464/***/ }), 3465 3466/***/ 7040: 3467/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3468 3469 3470/* eslint-disable es/no-symbol -- required for testing */ 3471var NATIVE_SYMBOL = __webpack_require__(4495); 3472 3473module.exports = NATIVE_SYMBOL && 3474 !Symbol.sham && 3475 typeof Symbol.iterator == 'symbol'; 3476 3477 3478/***/ }), 3479 3480/***/ 8686: 3481/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3482 3483 3484var DESCRIPTORS = __webpack_require__(3724); 3485var fails = __webpack_require__(9039); 3486 3487// V8 ~ Chrome 36- 3488// https://bugs.chromium.org/p/v8/issues/detail?id=3334 3489module.exports = DESCRIPTORS && fails(function () { 3490 // eslint-disable-next-line es/no-object-defineproperty -- required for testing 3491 return Object.defineProperty(function () { /* empty */ }, 'prototype', { 3492 value: 42, 3493 writable: false 3494 }).prototype !== 42; 3495}); 3496 3497 3498/***/ }), 3499 3500/***/ 2812: 3501/***/ ((module) => { 3502 3503 3504var $TypeError = TypeError; 3505 3506module.exports = function (passed, required) { 3507 if (passed < required) throw new $TypeError('Not enough arguments'); 3508 return passed; 3509}; 3510 3511 3512/***/ }), 3513 3514/***/ 8622: 3515/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3516 3517 3518var globalThis = __webpack_require__(4576); 3519var isCallable = __webpack_require__(4901); 3520 3521var WeakMap = globalThis.WeakMap; 3522 3523module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); 3524 3525 3526/***/ }), 3527 3528/***/ 8227: 3529/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 3530 3531 3532var globalThis = __webpack_require__(4576); 3533var shared = __webpack_require__(5745); 3534var hasOwn = __webpack_require__(9297); 3535var uid = __webpack_require__(3392); 3536var NATIVE_SYMBOL = __webpack_require__(4495); 3537var USE_SYMBOL_AS_UID = __webpack_require__(7040); 3538 3539var Symbol = globalThis.Symbol; 3540var WellKnownSymbolsStore = shared('wks'); 3541var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; 3542 3543module.exports = function (name) { 3544 if (!hasOwn(WellKnownSymbolsStore, name)) { 3545 WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) 3546 ? Symbol[name] 3547 : createWellKnownSymbol('Symbol.' + name); 3548 } return WellKnownSymbolsStore[name]; 3549}; 3550 3551 3552/***/ }), 3553 3554/***/ 6573: 3555/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3556 3557 3558var DESCRIPTORS = __webpack_require__(3724); 3559var defineBuiltInAccessor = __webpack_require__(2106); 3560var isDetached = __webpack_require__(3238); 3561 3562var ArrayBufferPrototype = ArrayBuffer.prototype; 3563 3564// `ArrayBuffer.prototype.detached` getter 3565// https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.detached 3566if (DESCRIPTORS && !('detached' in ArrayBufferPrototype)) { 3567 defineBuiltInAccessor(ArrayBufferPrototype, 'detached', { 3568 configurable: true, 3569 get: function detached() { 3570 return isDetached(this); 3571 } 3572 }); 3573} 3574 3575 3576/***/ }), 3577 3578/***/ 7936: 3579/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3580 3581 3582var $ = __webpack_require__(6518); 3583var $transfer = __webpack_require__(5636); 3584 3585// `ArrayBuffer.prototype.transferToFixedLength` method 3586// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfertofixedlength 3587if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { 3588 transferToFixedLength: function transferToFixedLength() { 3589 return $transfer(this, arguments.length ? arguments[0] : undefined, false); 3590 } 3591}); 3592 3593 3594/***/ }), 3595 3596/***/ 8100: 3597/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3598 3599 3600var $ = __webpack_require__(6518); 3601var $transfer = __webpack_require__(5636); 3602 3603// `ArrayBuffer.prototype.transfer` method 3604// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfer 3605if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { 3606 transfer: function transfer() { 3607 return $transfer(this, arguments.length ? arguments[0] : undefined, true); 3608 } 3609}); 3610 3611 3612/***/ }), 3613 3614/***/ 4114: 3615/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3616 3617 3618var $ = __webpack_require__(6518); 3619var toObject = __webpack_require__(8981); 3620var lengthOfArrayLike = __webpack_require__(6198); 3621var setArrayLength = __webpack_require__(4527); 3622var doesNotExceedSafeInteger = __webpack_require__(6837); 3623var fails = __webpack_require__(9039); 3624 3625var INCORRECT_TO_LENGTH = fails(function () { 3626 return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; 3627}); 3628 3629// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError 3630// https://bugs.chromium.org/p/v8/issues/detail?id=12681 3631var properErrorOnNonWritableLength = function () { 3632 try { 3633 // eslint-disable-next-line es/no-object-defineproperty -- safe 3634 Object.defineProperty([], 'length', { writable: false }).push(); 3635 } catch (error) { 3636 return error instanceof TypeError; 3637 } 3638}; 3639 3640var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); 3641 3642// `Array.prototype.push` method 3643// https://tc39.es/ecma262/#sec-array.prototype.push 3644$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { 3645 // eslint-disable-next-line no-unused-vars -- required for `.length` 3646 push: function push(item) { 3647 var O = toObject(this); 3648 var len = lengthOfArrayLike(O); 3649 var argCount = arguments.length; 3650 doesNotExceedSafeInteger(len + argCount); 3651 for (var i = 0; i < argCount; i++) { 3652 O[len] = arguments[i]; 3653 len++; 3654 } 3655 setArrayLength(O, len); 3656 return len; 3657 } 3658}); 3659 3660 3661/***/ }), 3662 3663/***/ 8111: 3664/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3665 3666 3667var $ = __webpack_require__(6518); 3668var globalThis = __webpack_require__(4576); 3669var anInstance = __webpack_require__(679); 3670var anObject = __webpack_require__(8551); 3671var isCallable = __webpack_require__(4901); 3672var getPrototypeOf = __webpack_require__(2787); 3673var defineBuiltInAccessor = __webpack_require__(2106); 3674var createProperty = __webpack_require__(4659); 3675var fails = __webpack_require__(9039); 3676var hasOwn = __webpack_require__(9297); 3677var wellKnownSymbol = __webpack_require__(8227); 3678var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype); 3679var DESCRIPTORS = __webpack_require__(3724); 3680var IS_PURE = __webpack_require__(6395); 3681 3682var CONSTRUCTOR = 'constructor';
vendor: 4,231 bytes, lines 3683-3821
3683var ITERATOR = 'Iterator'; 3684var TO_STRING_TAG = wellKnownSymbol('toStringTag'); 3685 3686var $TypeError = TypeError; 3687var NativeIterator = globalThis[ITERATOR]; 3688 3689// FF56- have non-standard global helper `Iterator` 3690var FORCED = IS_PURE 3691 || !isCallable(NativeIterator) 3692 || NativeIterator.prototype !== IteratorPrototype 3693 // FF44- non-standard `Iterator` passes previous tests 3694 || !fails(function () { NativeIterator({}); }); 3695 3696var IteratorConstructor = function Iterator() { 3697 anInstance(this, IteratorPrototype); 3698 if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); 3699}; 3700 3701var defineIteratorPrototypeAccessor = function (key, value) { 3702 if (DESCRIPTORS) { 3703 defineBuiltInAccessor(IteratorPrototype, key, { 3704 configurable: true, 3705 get: function () { 3706 return value; 3707 }, 3708 set: function (replacement) { 3709 anObject(this); 3710 if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); 3711 if (hasOwn(this, key)) this[key] = replacement; 3712 else createProperty(this, key, replacement); 3713 } 3714 }); 3715 } else IteratorPrototype[key] = value; 3716}; 3717 3718if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); 3719 3720if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { 3721 defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); 3722} 3723 3724IteratorConstructor.prototype = IteratorPrototype; 3725 3726// `Iterator` constructor 3727// https://tc39.es/ecma262/#sec-iterator 3728$({ global: true, constructor: true, forced: FORCED }, { 3729 Iterator: IteratorConstructor 3730}); 3731 3732 3733/***/ }), 3734 3735/***/ 1148: 3736/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3737 3738 3739var $ = __webpack_require__(6518); 3740var iterate = __webpack_require__(2652); 3741var aCallable = __webpack_require__(9306); 3742var anObject = __webpack_require__(8551); 3743var getIteratorDirect = __webpack_require__(1767); 3744 3745// `Iterator.prototype.every` method 3746// https://tc39.es/ecma262/#sec-iterator.prototype.every 3747$({ target: 'Iterator', proto: true, real: true }, { 3748 every: function every(predicate) { 3749 anObject(this); 3750 aCallable(predicate); 3751 var record = getIteratorDirect(this); 3752 var counter = 0; 3753 return !iterate(record, function (value, stop) { 3754 if (!predicate(value, counter++)) return stop(); 3755 }, { IS_RECORD: true, INTERRUPTED: true }).stopped; 3756 } 3757}); 3758 3759 3760/***/ }), 3761 3762/***/ 2489: 3763/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3764 3765 3766var $ = __webpack_require__(6518); 3767var call = __webpack_require__(9565); 3768var aCallable = __webpack_require__(9306); 3769var anObject = __webpack_require__(8551); 3770var getIteratorDirect = __webpack_require__(1767); 3771var createIteratorProxy = __webpack_require__(9462); 3772var callWithSafeIterationClosing = __webpack_require__(6319); 3773var IS_PURE = __webpack_require__(6395); 3774 3775var IteratorProxy = createIteratorProxy(function () { 3776 var iterator = this.iterator; 3777 var predicate = this.predicate; 3778 var next = this.next; 3779 var result, done, value; 3780 while (true) { 3781 result = anObject(call(next, iterator)); 3782 done = this.done = !!result.done; 3783 if (done) return; 3784 value = result.value; 3785 if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value; 3786 } 3787}); 3788 3789// `Iterator.prototype.filter` method 3790// https://tc39.es/ecma262/#sec-iterator.prototype.filter 3791$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { 3792 filter: function filter(predicate) { 3793 anObject(this); 3794 aCallable(predicate); 3795 return new IteratorProxy(getIteratorDirect(this), { 3796 predicate: predicate 3797 }); 3798 } 3799}); 3800 3801 3802/***/ }), 3803 3804/***/ 116: 3805/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3806 3807 3808var $ = __webpack_require__(6518); 3809var iterate = __webpack_require__(2652); 3810var aCallable = __webpack_require__(9306); 3811var anObject = __webpack_require__(8551); 3812var getIteratorDirect = __webpack_require__(1767); 3813 3814// `Iterator.prototype.find` method 3815// https://tc39.es/ecma262/#sec-iterator.prototype.find 3816$({ target: 'Iterator', proto: true, real: true }, { 3817 find: function find(predicate) { 3818 anObject(this); 3819 aCallable(predicate); 3820 var record = getIteratorDirect(this); 3821 var counter = 0;
vendor: 4,219 bytes, lines 3822-3979
3822 return iterate(record, function (value, stop) { 3823 if (predicate(value, counter++)) return stop(value); 3824 }, { IS_RECORD: true, INTERRUPTED: true }).result; 3825 } 3826}); 3827 3828 3829/***/ }), 3830 3831/***/ 7588: 3832/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3833 3834 3835var $ = __webpack_require__(6518); 3836var iterate = __webpack_require__(2652); 3837var aCallable = __webpack_require__(9306); 3838var anObject = __webpack_require__(8551); 3839var getIteratorDirect = __webpack_require__(1767); 3840 3841// `Iterator.prototype.forEach` method 3842// https://tc39.es/ecma262/#sec-iterator.prototype.foreach 3843$({ target: 'Iterator', proto: true, real: true }, { 3844 forEach: function forEach(fn) { 3845 anObject(this); 3846 aCallable(fn); 3847 var record = getIteratorDirect(this); 3848 var counter = 0; 3849 iterate(record, function (value) { 3850 fn(value, counter++); 3851 }, { IS_RECORD: true }); 3852 } 3853}); 3854 3855 3856/***/ }), 3857 3858/***/ 1701: 3859/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3860 3861 3862var $ = __webpack_require__(6518); 3863var map = __webpack_require__(713); 3864var IS_PURE = __webpack_require__(6395); 3865 3866// `Iterator.prototype.map` method 3867// https://tc39.es/ecma262/#sec-iterator.prototype.map 3868$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { 3869 map: map 3870}); 3871 3872 3873/***/ }), 3874 3875/***/ 8237: 3876/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3877 3878 3879var $ = __webpack_require__(6518); 3880var iterate = __webpack_require__(2652); 3881var aCallable = __webpack_require__(9306); 3882var anObject = __webpack_require__(8551); 3883var getIteratorDirect = __webpack_require__(1767); 3884 3885var $TypeError = TypeError; 3886 3887// `Iterator.prototype.reduce` method 3888// https://tc39.es/ecma262/#sec-iterator.prototype.reduce 3889$({ target: 'Iterator', proto: true, real: true }, { 3890 reduce: function reduce(reducer /* , initialValue */) { 3891 anObject(this); 3892 aCallable(reducer); 3893 var record = getIteratorDirect(this); 3894 var noInitial = arguments.length < 2; 3895 var accumulator = noInitial ? undefined : arguments[1]; 3896 var counter = 0; 3897 iterate(record, function (value) { 3898 if (noInitial) { 3899 noInitial = false; 3900 accumulator = value; 3901 } else { 3902 accumulator = reducer(accumulator, value, counter); 3903 } 3904 counter++; 3905 }, { IS_RECORD: true }); 3906 if (noInitial) throw new $TypeError('Reduce of empty iterator with no initial value'); 3907 return accumulator; 3908 } 3909}); 3910 3911 3912/***/ }), 3913 3914/***/ 3579: 3915/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3916 3917 3918var $ = __webpack_require__(6518); 3919var iterate = __webpack_require__(2652); 3920var aCallable = __webpack_require__(9306); 3921var anObject = __webpack_require__(8551); 3922var getIteratorDirect = __webpack_require__(1767); 3923 3924// `Iterator.prototype.some` method 3925// https://tc39.es/ecma262/#sec-iterator.prototype.some 3926$({ target: 'Iterator', proto: true, real: true }, { 3927 some: function some(predicate) { 3928 anObject(this); 3929 aCallable(predicate); 3930 var record = getIteratorDirect(this); 3931 var counter = 0; 3932 return iterate(record, function (value, stop) { 3933 if (predicate(value, counter++)) return stop(); 3934 }, { IS_RECORD: true, INTERRUPTED: true }).stopped; 3935 } 3936}); 3937 3938 3939/***/ }), 3940 3941/***/ 1806: 3942/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3943 3944 3945var $ = __webpack_require__(6518); 3946var anObject = __webpack_require__(8551); 3947var iterate = __webpack_require__(2652); 3948var getIteratorDirect = __webpack_require__(1767); 3949 3950var push = [].push; 3951 3952// `Iterator.prototype.toArray` method 3953// https://tc39.es/ecma262/#sec-iterator.prototype.toarray 3954$({ target: 'Iterator', proto: true, real: true }, { 3955 toArray: function toArray() { 3956 var result = []; 3957 iterate(getIteratorDirect(anObject(this)), push, { that: result, IS_RECORD: true }); 3958 return result; 3959 } 3960}); 3961 3962 3963/***/ }), 3964 3965/***/ 1689: 3966/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 3967 3968 3969var $ = __webpack_require__(6518); 3970var globalThis = __webpack_require__(4576); 3971var apply = __webpack_require__(8745); 3972var slice = __webpack_require__(7680); 3973var newPromiseCapabilityModule = __webpack_require__(6043); 3974var aCallable = __webpack_require__(9306); 3975var perform = __webpack_require__(1103); 3976 3977var Promise = globalThis.Promise; 3978 3979var ACCEPT_ARGUMENTS = false;
3980// Avoiding the use of polyfills of the previous iteration of this proposal 3981// that does not accept arguments of the callback 3982var FORCED = !Promise || !Promise['try'] || perform(function () { 3983 Promise['try'](function (argument) { 3984 ACCEPT_ARGUMENTS = argument === 8; 3985 }, 8); 3986}).error || !ACCEPT_ARGUMENTS; 3987 3988// `Promise.try` method 3989// https://tc39.es/ecma262/#sec-promise.try 3990$({ target: 'Promise', stat: true, forced: FORCED }, { 3991 'try': function (callbackfn /* , ...args */) { 3992 var args = arguments.length > 1 ? slice(arguments, 1) : []; 3993 var promiseCapability = newPromiseCapabilityModule.f(this); 3994 var result = perform(function () { 3995 return apply(aCallable(callbackfn), undefined, args); 3996 }); 3997 (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value); 3998 return promiseCapability.promise; 3999 } 4000}); 4001 4002 4003/***/ }), 4004 4005/***/ 4628: 4006/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4007 4008 4009var $ = __webpack_require__(6518); 4010var newPromiseCapabilityModule = __webpack_require__(6043); 4011 4012// `Promise.withResolvers` method 4013// https://tc39.es/ecma262/#sec-promise.withResolvers 4014$({ target: 'Promise', stat: true }, { 4015 withResolvers: function withResolvers() { 4016 var promiseCapability = newPromiseCapabilityModule.f(this); 4017 return { 4018 promise: promiseCapability.promise, 4019 resolve: promiseCapability.resolve, 4020 reject: promiseCapability.reject 4021 }; 4022 } 4023}); 4024 4025 4026/***/ }), 4027 4028/***/ 9479: 4029/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4030 4031 4032var globalThis = __webpack_require__(4576); 4033var DESCRIPTORS = __webpack_require__(3724); 4034var defineBuiltInAccessor = __webpack_require__(2106); 4035var regExpFlags = __webpack_require__(7979); 4036var fails = __webpack_require__(9039); 4037 4038// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError 4039var RegExp = globalThis.RegExp; 4040var RegExpPrototype = RegExp.prototype; 4041 4042var FORCED = DESCRIPTORS && fails(function () { 4043 var INDICES_SUPPORT = true; 4044 try { 4045 RegExp('.', 'd'); 4046 } catch (error) { 4047 INDICES_SUPPORT = false; 4048 } 4049 4050 var O = {}; 4051 // modern V8 bug 4052 var calls = ''; 4053 var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy'; 4054 4055 var addGetter = function (key, chr) { 4056 // eslint-disable-next-line es/no-object-defineproperty -- safe 4057 Object.defineProperty(O, key, { get: function () { 4058 calls += chr; 4059 return true; 4060 } }); 4061 }; 4062 4063 var pairs = { 4064 dotAll: 's', 4065 global: 'g', 4066 ignoreCase: 'i', 4067 multiline: 'm', 4068 sticky: 'y' 4069 }; 4070 4071 if (INDICES_SUPPORT) pairs.hasIndices = 'd'; 4072 4073 for (var key in pairs) addGetter(key, pairs[key]); 4074 4075 // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 4076 var result = Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call(O); 4077 4078 return result !== expected || calls !== expected; 4079}); 4080 4081// `RegExp.prototype.flags` getter 4082// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags 4083if (FORCED) defineBuiltInAccessor(RegExpPrototype, 'flags', { 4084 configurable: true, 4085 get: regExpFlags 4086}); 4087 4088 4089/***/ }), 4090 4091/***/ 7642: 4092/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4093 4094 4095var $ = __webpack_require__(6518); 4096var difference = __webpack_require__(3440); 4097var setMethodAcceptSetLike = __webpack_require__(4916); 4098 4099// `Set.prototype.difference` method 4100// https://tc39.es/ecma262/#sec-set.prototype.difference 4101$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('difference') }, { 4102 difference: difference 4103}); 4104 4105 4106/***/ }), 4107 4108/***/ 8004: 4109/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4110 4111 4112var $ = __webpack_require__(6518); 4113var fails = __webpack_require__(9039); 4114var intersection = __webpack_require__(8750); 4115var setMethodAcceptSetLike = __webpack_require__(4916); 4116 4117var INCORRECT = !setMethodAcceptSetLike('intersection') || fails(function () { 4118 // eslint-disable-next-line es/no-array-from, es/no-set -- testing 4119 return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2'; 4120}); 4121 4122// `Set.prototype.intersection` method 4123// https://tc39.es/ecma262/#sec-set.prototype.intersection 4124$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { 4125 intersection: intersection 4126}); 4127 4128 4129/***/ }), 4130 4131/***/ 3853: 4132/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4133 4134 4135var $ = __webpack_require__(6518); 4136var isDisjointFrom = __webpack_require__(4449); 4137var setMethodAcceptSetLike = __webpack_require__(4916); 4138 4139// `Set.prototype.isDisjointFrom` method 4140// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom 4141$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isDisjointFrom') }, { 4142 isDisjointFrom: isDisjointFrom 4143}); 4144 4145 4146/***/ }), 4147 4148/***/ 5876: 4149/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4150 4151 4152var $ = __webpack_require__(6518); 4153var isSubsetOf = __webpack_require__(3838); 4154var setMethodAcceptSetLike = __webpack_require__(4916); 4155 4156// `Set.prototype.isSubsetOf` method 4157// https://tc39.es/ecma262/#sec-set.prototype.issubsetof 4158$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSubsetOf') }, { 4159 isSubsetOf: isSubsetOf 4160}); 4161 4162 4163/***/ }), 4164 4165/***/ 2475: 4166/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4167 4168 4169var $ = __webpack_require__(6518); 4170var isSupersetOf = __webpack_require__(8527); 4171var setMethodAcceptSetLike = __webpack_require__(4916); 4172 4173// `Set.prototype.isSupersetOf` method 4174// https://tc39.es/ecma262/#sec-set.prototype.issupersetof 4175$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSupersetOf') }, { 4176 isSupersetOf: isSupersetOf 4177}); 4178 4179 4180/***/ }), 4181 4182/***/ 5024: 4183/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4184 4185 4186var $ = __webpack_require__(6518); 4187var symmetricDifference = __webpack_require__(3650); 4188var setMethodAcceptSetLike = __webpack_require__(4916); 4189 4190// `Set.prototype.symmetricDifference` method 4191// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference 4192$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('symmetricDifference') }, { 4193 symmetricDifference: symmetricDifference 4194}); 4195 4196 4197/***/ }), 4198 4199/***/ 1698: 4200/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4201 4202 4203var $ = __webpack_require__(6518); 4204var union = __webpack_require__(4204); 4205var setMethodAcceptSetLike = __webpack_require__(4916); 4206 4207// `Set.prototype.union` method 4208// https://tc39.es/ecma262/#sec-set.prototype.union 4209$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('union') }, { 4210 union: union 4211}); 4212 4213 4214/***/ }), 4215 4216/***/ 7467: 4217/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4218 4219 4220var arrayToReversed = __webpack_require__(7628); 4221var ArrayBufferViewCore = __webpack_require__(4644); 4222 4223var aTypedArray = ArrayBufferViewCore.aTypedArray; 4224var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; 4225var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; 4226 4227// `%TypedArray%.prototype.toReversed` method 4228// https://tc39.es/ecma262/#sec-%typedarray%.prototype.toreversed 4229exportTypedArrayMethod('toReversed', function toReversed() { 4230 return arrayToReversed(aTypedArray(this), getTypedArrayConstructor(this)); 4231}); 4232 4233 4234/***/ }), 4235 4236/***/ 4732: 4237/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4238 4239 4240var ArrayBufferViewCore = __webpack_require__(4644); 4241var uncurryThis = __webpack_require__(9504); 4242var aCallable = __webpack_require__(9306); 4243var arrayFromConstructorAndList = __webpack_require__(5370); 4244 4245var aTypedArray = ArrayBufferViewCore.aTypedArray; 4246var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; 4247var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; 4248var sort = uncurryThis(ArrayBufferViewCore.TypedArrayPrototype.sort); 4249 4250// `%TypedArray%.prototype.toSorted` method 4251// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tosorted 4252exportTypedArrayMethod('toSorted', function toSorted(compareFn) { 4253 if (compareFn !== undefined) aCallable(compareFn); 4254 var O = aTypedArray(this); 4255 var A = arrayFromConstructorAndList(getTypedArrayConstructor(O), O); 4256 return sort(A, compareFn); 4257}); 4258 4259 4260/***/ }), 4261 4262/***/ 9577: 4263/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4264 4265 4266var arrayWith = __webpack_require__(9928); 4267var ArrayBufferViewCore = __webpack_require__(4644); 4268var isBigIntArray = __webpack_require__(1108); 4269var toIntegerOrInfinity = __webpack_require__(1291); 4270var toBigInt = __webpack_require__(5854); 4271 4272var aTypedArray = ArrayBufferViewCore.aTypedArray; 4273var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; 4274var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; 4275 4276var PROPER_ORDER = !!function () { 4277 try { 4278 // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing
vendor: 17,013 bytes, lines 4279-4789
4279 new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } }); 4280 } catch (error) { 4281 // some early implementations, like WebKit, does not follow the final semantic 4282 // https://github.com/tc39/proposal-change-array-by-copy/pull/86 4283 return error === 8; 4284 } 4285}(); 4286 4287// `%TypedArray%.prototype.with` method 4288// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with 4289exportTypedArrayMethod('with', { 'with': function (index, value) { 4290 var O = aTypedArray(this); 4291 var relativeIndex = toIntegerOrInfinity(index); 4292 var actualValue = isBigIntArray(O) ? toBigInt(value) : +value; 4293 return arrayWith(O, getTypedArrayConstructor(O), relativeIndex, actualValue); 4294} }['with'], !PROPER_ORDER); 4295 4296 4297/***/ }), 4298 4299/***/ 8992: 4300/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4301 4302 4303// TODO: Remove from `core-js@4` 4304__webpack_require__(8111); 4305 4306 4307/***/ }), 4308 4309/***/ 3215: 4310/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4311 4312 4313// TODO: Remove from `core-js@4` 4314__webpack_require__(1148); 4315 4316 4317/***/ }), 4318 4319/***/ 4520: 4320/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4321 4322 4323// TODO: Remove from `core-js@4` 4324__webpack_require__(2489); 4325 4326 4327/***/ }), 4328 4329/***/ 2577: 4330/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4331 4332 4333// TODO: Remove from `core-js@4` 4334__webpack_require__(116); 4335 4336 4337/***/ }), 4338 4339/***/ 3949: 4340/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4341 4342 4343// TODO: Remove from `core-js@4` 4344__webpack_require__(7588); 4345 4346 4347/***/ }), 4348 4349/***/ 1454: 4350/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4351 4352 4353// TODO: Remove from `core-js@4` 4354__webpack_require__(1701); 4355 4356 4357/***/ }), 4358 4359/***/ 8872: 4360/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4361 4362 4363// TODO: Remove from `core-js@4` 4364__webpack_require__(8237); 4365 4366 4367/***/ }), 4368 4369/***/ 7550: 4370/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4371 4372 4373// TODO: Remove from `core-js@4` 4374__webpack_require__(3579); 4375 4376 4377/***/ }), 4378 4379/***/ 1795: 4380/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4381 4382 4383// TODO: Remove from `core-js@4` 4384__webpack_require__(1806); 4385 4386 4387/***/ }), 4388 4389/***/ 5247: 4390/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4391 4392 4393// TODO: Remove from `core-js@4` 4394__webpack_require__(1689); 4395 4396 4397/***/ }), 4398 4399/***/ 4979: 4400/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4401 4402 4403var $ = __webpack_require__(6518); 4404var globalThis = __webpack_require__(4576); 4405var getBuiltIn = __webpack_require__(7751); 4406var createPropertyDescriptor = __webpack_require__(6980); 4407var defineProperty = (__webpack_require__(4913).f); 4408var hasOwn = __webpack_require__(9297); 4409var anInstance = __webpack_require__(679); 4410var inheritIfRequired = __webpack_require__(3167); 4411var normalizeStringArgument = __webpack_require__(2603); 4412var DOMExceptionConstants = __webpack_require__(5002); 4413var clearErrorStack = __webpack_require__(8574); 4414var DESCRIPTORS = __webpack_require__(3724); 4415var IS_PURE = __webpack_require__(6395); 4416 4417var DOM_EXCEPTION = 'DOMException'; 4418var Error = getBuiltIn('Error'); 4419var NativeDOMException = getBuiltIn(DOM_EXCEPTION); 4420 4421var $DOMException = function DOMException() { 4422 anInstance(this, DOMExceptionPrototype); 4423 var argumentsLength = arguments.length; 4424 var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]); 4425 var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error'); 4426 var that = new NativeDOMException(message, name); 4427 var error = new Error(message); 4428 error.name = DOM_EXCEPTION; 4429 defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1))); 4430 inheritIfRequired(that, this, $DOMException); 4431 return that; 4432}; 4433 4434var DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype; 4435 4436var ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION); 4437var DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2); 4438 4439// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 4440var descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(globalThis, DOM_EXCEPTION); 4441 4442// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it 4443// https://github.com/Jarred-Sumner/bun/issues/399 4444var BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable); 4445 4446var FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK; 4447 4448// `DOMException` constructor patch for `.stack` where it's required 4449// https://webidl.spec.whatwg.org/#es-DOMException-specialness 4450$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic 4451 DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException 4452}); 4453 4454var PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION); 4455var PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype; 4456 4457if (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) { 4458 if (!IS_PURE) { 4459 defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException)); 4460 } 4461 4462 for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) { 4463 var constant = DOMExceptionConstants[key]; 4464 var constantName = constant.s; 4465 if (!hasOwn(PolyfilledDOMException, constantName)) { 4466 defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c)); 4467 } 4468 } 4469} 4470 4471 4472/***/ }), 4473 4474/***/ 3611: 4475/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4476 4477 4478var $ = __webpack_require__(6518); 4479var globalThis = __webpack_require__(4576); 4480var defineBuiltInAccessor = __webpack_require__(2106); 4481var DESCRIPTORS = __webpack_require__(3724); 4482 4483var $TypeError = TypeError; 4484// eslint-disable-next-line es/no-object-defineproperty -- safe 4485var defineProperty = Object.defineProperty; 4486var INCORRECT_VALUE = globalThis.self !== globalThis; 4487 4488// `self` getter 4489// https://html.spec.whatwg.org/multipage/window-object.html#dom-self 4490try { 4491 if (DESCRIPTORS) { 4492 // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe 4493 var descriptor = Object.getOwnPropertyDescriptor(globalThis, 'self'); 4494 // some engines have `self`, but with incorrect descriptor 4495 // https://github.com/denoland/deno/issues/15765 4496 if (INCORRECT_VALUE || !descriptor || !descriptor.get || !descriptor.enumerable) { 4497 defineBuiltInAccessor(globalThis, 'self', { 4498 get: function self() { 4499 return globalThis; 4500 }, 4501 set: function self(value) { 4502 if (this !== globalThis) throw new $TypeError('Illegal invocation'); 4503 defineProperty(globalThis, 'self', { 4504 value: value, 4505 writable: true, 4506 configurable: true, 4507 enumerable: true 4508 }); 4509 }, 4510 configurable: true, 4511 enumerable: true 4512 }); 4513 } 4514 } else $({ global: true, simple: true, forced: INCORRECT_VALUE }, { 4515 self: globalThis 4516 }); 4517} catch (error) { /* empty */ } 4518 4519 4520/***/ }), 4521 4522/***/ 4603: 4523/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4524 4525 4526var defineBuiltIn = __webpack_require__(6840); 4527var uncurryThis = __webpack_require__(9504); 4528var toString = __webpack_require__(655); 4529var validateArgumentsLength = __webpack_require__(2812); 4530 4531var $URLSearchParams = URLSearchParams; 4532var URLSearchParamsPrototype = $URLSearchParams.prototype; 4533var append = uncurryThis(URLSearchParamsPrototype.append); 4534var $delete = uncurryThis(URLSearchParamsPrototype['delete']); 4535var forEach = uncurryThis(URLSearchParamsPrototype.forEach); 4536var push = uncurryThis([].push); 4537var params = new $URLSearchParams('a=1&a=2&b=3'); 4538 4539params['delete']('a', 1); 4540// `undefined` case is a Chromium 117 bug 4541// https://bugs.chromium.org/p/v8/issues/detail?id=14222 4542params['delete']('b', undefined); 4543 4544if (params + '' !== 'a=2') { 4545 defineBuiltIn(URLSearchParamsPrototype, 'delete', function (name /* , value */) { 4546 var length = arguments.length; 4547 var $value = length < 2 ? undefined : arguments[1]; 4548 if (length && $value === undefined) return $delete(this, name); 4549 var entries = []; 4550 forEach(this, function (v, k) { // also validates `this` 4551 push(entries, { key: k, value: v }); 4552 }); 4553 validateArgumentsLength(length, 1); 4554 var key = toString(name); 4555 var value = toString($value); 4556 var index = 0; 4557 var dindex = 0; 4558 var found = false; 4559 var entriesLength = entries.length; 4560 var entry; 4561 while (index < entriesLength) { 4562 entry = entries[index++]; 4563 if (found || entry.key === key) { 4564 found = true; 4565 $delete(this, entry.key); 4566 } else dindex++; 4567 } 4568 while (dindex < entriesLength) { 4569 entry = entries[dindex++]; 4570 if (!(entry.key === key && entry.value === value)) append(this, entry.key, entry.value); 4571 } 4572 }, { enumerable: true, unsafe: true }); 4573} 4574 4575 4576/***/ }), 4577 4578/***/ 7566: 4579/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4580 4581 4582var defineBuiltIn = __webpack_require__(6840); 4583var uncurryThis = __webpack_require__(9504); 4584var toString = __webpack_require__(655); 4585var validateArgumentsLength = __webpack_require__(2812); 4586 4587var $URLSearchParams = URLSearchParams; 4588var URLSearchParamsPrototype = $URLSearchParams.prototype; 4589var getAll = uncurryThis(URLSearchParamsPrototype.getAll); 4590var $has = uncurryThis(URLSearchParamsPrototype.has); 4591var params = new $URLSearchParams('a=1'); 4592 4593// `undefined` case is a Chromium 117 bug 4594// https://bugs.chromium.org/p/v8/issues/detail?id=14222 4595if (params.has('a', 2) || !params.has('a', undefined)) { 4596 defineBuiltIn(URLSearchParamsPrototype, 'has', function has(name /* , value */) { 4597 var length = arguments.length; 4598 var $value = length < 2 ? undefined : arguments[1]; 4599 if (length && $value === undefined) return $has(this, name); 4600 var values = getAll(this, name); // also validates `this` 4601 validateArgumentsLength(length, 1); 4602 var value = toString($value); 4603 var index = 0; 4604 while (index < values.length) { 4605 if (values[index++] === value) return true; 4606 } return false; 4607 }, { enumerable: true, unsafe: true }); 4608} 4609 4610 4611/***/ }), 4612 4613/***/ 8721: 4614/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 4615 4616 4617var DESCRIPTORS = __webpack_require__(3724); 4618var uncurryThis = __webpack_require__(9504); 4619var defineBuiltInAccessor = __webpack_require__(2106); 4620 4621var URLSearchParamsPrototype = URLSearchParams.prototype; 4622var forEach = uncurryThis(URLSearchParamsPrototype.forEach); 4623 4624// `URLSearchParams.prototype.size` getter 4625// https://github.com/whatwg/url/pull/734 4626if (DESCRIPTORS && !('size' in URLSearchParamsPrototype)) { 4627 defineBuiltInAccessor(URLSearchParamsPrototype, 'size', { 4628 get: function size() { 4629 var count = 0; 4630 forEach(this, function () { count++; }); 4631 return count; 4632 }, 4633 configurable: true, 4634 enumerable: true 4635 }); 4636} 4637 4638 4639/***/ }) 4640 4641/******/ }); 4642/************************************************************************/ 4643/******/ // The module cache 4644/******/ var __webpack_module_cache__ = {}; 4645/******/ 4646/******/ // The require function 4647/******/ function __webpack_require__(moduleId) { 4648/******/ // Check if module is in cache 4649/******/ var cachedModule = __webpack_module_cache__[moduleId]; 4650/******/ if (cachedModule !== undefined) { 4651/******/ return cachedModule.exports; 4652/******/ } 4653/******/ // Create a new module (and put it into the cache) 4654/******/ var module = __webpack_module_cache__[moduleId] = { 4655/******/ // no module.id needed 4656/******/ // no module.loaded needed 4657/******/ exports: {} 4658/******/ }; 4659/******/ 4660/******/ // Execute the module function 4661/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); 4662/******/ 4663/******/ // Return the exports of the module 4664/******/ return module.exports; 4665/******/ } 4666/******/ 4667/************************************************************************/ 4668/******/ /* webpack/runtime/define property getters */ 4669/******/ (() => { 4670/******/ // define getter functions for harmony exports 4671/******/ __webpack_require__.d = (exports, definition) => { 4672/******/ for(var key in definition) { 4673/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 4674/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 4675/******/ } 4676/******/ } 4677/******/ }; 4678/******/ })(); 4679/******/ 4680/******/ /* webpack/runtime/hasOwnProperty shorthand */ 4681/******/ (() => { 4682/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) 4683/******/ })(); 4684/******/ 4685/************************************************************************/ 4686var __webpack_exports__ = globalThis.pdfjsWorker = {}; 4687 4688// EXPORTS 4689__webpack_require__.d(__webpack_exports__, { 4690 WorkerMessageHandler: () => (/* reexport */ WorkerMessageHandler) 4691}); 4692 4693// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js 4694var es_array_push = __webpack_require__(4114); 4695// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.detached.js 4696var es_array_buffer_detached = __webpack_require__(6573); 4697// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer.js 4698var es_array_buffer_transfer = __webpack_require__(8100); 4699// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer-to-fixed-length.js 4700var es_array_buffer_transfer_to_fixed_length = __webpack_require__(7936); 4701// EXTERNAL MODULE: ./node_modules/core-js/modules/es.promise.with-resolvers.js 4702var es_promise_with_resolvers = __webpack_require__(4628); 4703// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js 4704var es_set_difference_v2 = __webpack_require__(7642); 4705// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js 4706var es_set_intersection_v2 = __webpack_require__(8004); 4707// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js 4708var es_set_is_disjoint_from_v2 = __webpack_require__(3853); 4709// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js 4710var es_set_is_subset_of_v2 = __webpack_require__(5876); 4711// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js 4712var es_set_is_superset_of_v2 = __webpack_require__(2475); 4713// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js 4714var es_set_symmetric_difference_v2 = __webpack_require__(5024); 4715// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.union.v2.js 4716var es_set_union_v2 = __webpack_require__(1698); 4717// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-reversed.js 4718var es_typed_array_to_reversed = __webpack_require__(7467); 4719// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-sorted.js 4720var es_typed_array_to_sorted = __webpack_require__(4732); 4721// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js 4722var es_typed_array_with = __webpack_require__(9577); 4723// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js 4724var esnext_iterator_constructor = __webpack_require__(8992); 4725// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.map.js 4726var esnext_iterator_map = __webpack_require__(1454); 4727// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.some.js 4728var esnext_iterator_some = __webpack_require__(7550); 4729// EXTERNAL MODULE: ./node_modules/core-js/modules/web.self.js 4730var web_self = __webpack_require__(3611); 4731// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.promise.try.js 4732var esnext_promise_try = __webpack_require__(5247); 4733// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js 4734var web_dom_exception_stack = __webpack_require__(4979); 4735// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.delete.js 4736var web_url_search_params_delete = __webpack_require__(4603); 4737// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.has.js 4738var web_url_search_params_has = __webpack_require__(7566); 4739// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.size.js 4740var web_url_search_params_size = __webpack_require__(8721); 4741;// ./src/shared/util.js 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); 4755const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; 4756const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; 4757const MAX_IMAGE_SIZE_TO_CACHE = 10e6; 4758const LINE_FACTOR = 1.35; 4759const LINE_DESCENT_FACTOR = 0.35; 4760const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; 4761const RenderingIntentFlag = { 4762 ANY: 0x01, 4763 DISPLAY: 0x02, 4764 PRINT: 0x04, 4765 SAVE: 0x08, 4766 ANNOTATIONS_FORMS: 0x10, 4767 ANNOTATIONS_STORAGE: 0x20, 4768 ANNOTATIONS_DISABLE: 0x40, 4769 IS_EDITING: 0x80, 4770 OPLIST: 0x100 4771}; 4772const AnnotationMode = { 4773 DISABLE: 0, 4774 ENABLE: 1, 4775 ENABLE_FORMS: 2, 4776 ENABLE_STORAGE: 3 4777}; 4778const AnnotationEditorPrefix = "pdfjs_internal_editor_"; 4779const AnnotationEditorType = { 4780 DISABLE: -1, 4781 NONE: 0, 4782 FREETEXT: 3, 4783 HIGHLIGHT: 9, 4784 STAMP: 13, 4785 INK: 15 4786}; 4787const AnnotationEditorParamsType = { 4788 RESIZE: 1, 4789 CREATE: 2,
vendor: 5,098 bytes, lines 4790-5066
4790 FREETEXT_SIZE: 11, 4791 FREETEXT_COLOR: 12, 4792 FREETEXT_OPACITY: 13, 4793 INK_COLOR: 21, 4794 INK_THICKNESS: 22, 4795 INK_OPACITY: 23, 4796 HIGHLIGHT_COLOR: 31, 4797 HIGHLIGHT_DEFAULT_COLOR: 32, 4798 HIGHLIGHT_THICKNESS: 33, 4799 HIGHLIGHT_FREE: 34, 4800 HIGHLIGHT_SHOW_ALL: 35, 4801 DRAW_STEP: 41 4802}; 4803const PermissionFlag = { 4804 PRINT: 0x04, 4805 MODIFY_CONTENTS: 0x08, 4806 COPY: 0x10, 4807 MODIFY_ANNOTATIONS: 0x20, 4808 FILL_INTERACTIVE_FORMS: 0x100, 4809 COPY_FOR_ACCESSIBILITY: 0x200, 4810 ASSEMBLE: 0x400, 4811 PRINT_HIGH_QUALITY: 0x800 4812}; 4813const TextRenderingMode = { 4814 FILL: 0, 4815 STROKE: 1, 4816 FILL_STROKE: 2, 4817 INVISIBLE: 3, 4818 FILL_ADD_TO_PATH: 4, 4819 STROKE_ADD_TO_PATH: 5, 4820 FILL_STROKE_ADD_TO_PATH: 6, 4821 ADD_TO_PATH: 7, 4822 FILL_STROKE_MASK: 3, 4823 ADD_TO_PATH_FLAG: 4 4824}; 4825const ImageKind = { 4826 GRAYSCALE_1BPP: 1, 4827 RGB_24BPP: 2, 4828 RGBA_32BPP: 3 4829}; 4830const AnnotationType = { 4831 TEXT: 1, 4832 LINK: 2, 4833 FREETEXT: 3, 4834 LINE: 4, 4835 SQUARE: 5, 4836 CIRCLE: 6, 4837 POLYGON: 7, 4838 POLYLINE: 8, 4839 HIGHLIGHT: 9, 4840 UNDERLINE: 10, 4841 SQUIGGLY: 11, 4842 STRIKEOUT: 12, 4843 STAMP: 13, 4844 CARET: 14, 4845 INK: 15, 4846 POPUP: 16, 4847 FILEATTACHMENT: 17, 4848 SOUND: 18, 4849 MOVIE: 19, 4850 WIDGET: 20, 4851 SCREEN: 21, 4852 PRINTERMARK: 22, 4853 TRAPNET: 23, 4854 WATERMARK: 24, 4855 THREED: 25, 4856 REDACT: 26 4857}; 4858const AnnotationReplyType = { 4859 GROUP: "Group", 4860 REPLY: "R" 4861}; 4862const AnnotationFlag = { 4863 INVISIBLE: 0x01, 4864 HIDDEN: 0x02, 4865 PRINT: 0x04, 4866 NOZOOM: 0x08, 4867 NOROTATE: 0x10, 4868 NOVIEW: 0x20, 4869 READONLY: 0x40, 4870 LOCKED: 0x80, 4871 TOGGLENOVIEW: 0x100, 4872 LOCKEDCONTENTS: 0x200 4873}; 4874const AnnotationFieldFlag = { 4875 READONLY: 0x0000001, 4876 REQUIRED: 0x0000002, 4877 NOEXPORT: 0x0000004, 4878 MULTILINE: 0x0001000, 4879 PASSWORD: 0x0002000, 4880 NOTOGGLETOOFF: 0x0004000, 4881 RADIO: 0x0008000, 4882 PUSHBUTTON: 0x0010000, 4883 COMBO: 0x0020000, 4884 EDIT: 0x0040000, 4885 SORT: 0x0080000, 4886 FILESELECT: 0x0100000, 4887 MULTISELECT: 0x0200000, 4888 DONOTSPELLCHECK: 0x0400000, 4889 DONOTSCROLL: 0x0800000, 4890 COMB: 0x1000000, 4891 RICHTEXT: 0x2000000, 4892 RADIOSINUNISON: 0x2000000, 4893 COMMITONSELCHANGE: 0x4000000 4894}; 4895const AnnotationBorderStyleType = { 4896 SOLID: 1, 4897 DASHED: 2, 4898 BEVELED: 3, 4899 INSET: 4, 4900 UNDERLINE: 5 4901}; 4902const AnnotationActionEventType = { 4903 E: "Mouse Enter", 4904 X: "Mouse Exit", 4905 D: "Mouse Down", 4906 U: "Mouse Up", 4907 Fo: "Focus", 4908 Bl: "Blur", 4909 PO: "PageOpen", 4910 PC: "PageClose", 4911 PV: "PageVisible", 4912 PI: "PageInvisible", 4913 K: "Keystroke", 4914 F: "Format", 4915 V: "Validate", 4916 C: "Calculate" 4917}; 4918const DocumentActionEventType = { 4919 WC: "WillClose", 4920 WS: "WillSave", 4921 DS: "DidSave", 4922 WP: "WillPrint", 4923 DP: "DidPrint" 4924}; 4925const PageActionEventType = { 4926 O: "PageOpen", 4927 C: "PageClose" 4928}; 4929const VerbosityLevel = { 4930 ERRORS: 0, 4931 WARNINGS: 1, 4932 INFOS: 5 4933}; 4934const OPS = { 4935 dependency: 1, 4936 setLineWidth: 2, 4937 setLineCap: 3, 4938 setLineJoin: 4, 4939 setMiterLimit: 5, 4940 setDash: 6, 4941 setRenderingIntent: 7, 4942 setFlatness: 8, 4943 setGState: 9, 4944 save: 10, 4945 restore: 11, 4946 transform: 12, 4947 moveTo: 13, 4948 lineTo: 14, 4949 curveTo: 15, 4950 curveTo2: 16, 4951 curveTo3: 17, 4952 closePath: 18, 4953 rectangle: 19, 4954 stroke: 20, 4955 closeStroke: 21, 4956 fill: 22, 4957 eoFill: 23, 4958 fillStroke: 24, 4959 eoFillStroke: 25, 4960 closeFillStroke: 26, 4961 closeEOFillStroke: 27, 4962 endPath: 28, 4963 clip: 29, 4964 eoClip: 30, 4965 beginText: 31, 4966 endText: 32, 4967 setCharSpacing: 33, 4968 setWordSpacing: 34, 4969 setHScale: 35, 4970 setLeading: 36, 4971 setFont: 37, 4972 setTextRenderingMode: 38, 4973 setTextRise: 39, 4974 moveText: 40, 4975 setLeadingMoveText: 41, 4976 setTextMatrix: 42, 4977 nextLine: 43, 4978 showText: 44, 4979 showSpacedText: 45, 4980 nextLineShowText: 46, 4981 nextLineSetSpacingShowText: 47, 4982 setCharWidth: 48, 4983 setCharWidthAndBounds: 49, 4984 setStrokeColorSpace: 50, 4985 setFillColorSpace: 51, 4986 setStrokeColor: 52, 4987 setStrokeColorN: 53, 4988 setFillColor: 54, 4989 setFillColorN: 55, 4990 setStrokeGray: 56, 4991 setFillGray: 57, 4992 setStrokeRGBColor: 58, 4993 setFillRGBColor: 59, 4994 setStrokeCMYKColor: 60, 4995 setFillCMYKColor: 61, 4996 shadingFill: 62, 4997 beginInlineImage: 63, 4998 beginImageData: 64, 4999 endInlineImage: 65, 5000 paintXObject: 66, 5001 markPoint: 67, 5002 markPointProps: 68, 5003 beginMarkedContent: 69, 5004 beginMarkedContentProps: 70, 5005 endMarkedContent: 71, 5006 beginCompat: 72, 5007 endCompat: 73, 5008 paintFormXObjectBegin: 74, 5009 paintFormXObjectEnd: 75, 5010 beginGroup: 76, 5011 endGroup: 77, 5012 beginAnnotation: 80, 5013 endAnnotation: 81, 5014 paintImageMaskXObject: 83, 5015 paintImageMaskXObjectGroup: 84, 5016 paintImageXObject: 85, 5017 paintInlineImageXObject: 86, 5018 paintInlineImageXObjectGroup: 87, 5019 paintImageXObjectRepeat: 88, 5020 paintImageMaskXObjectRepeat: 89, 5021 paintSolidColorImageMask: 90, 5022 constructPath: 91, 5023 setStrokeTransparent: 92, 5024 setFillTransparent: 93 5025}; 5026const PasswordResponses = { 5027 NEED_PASSWORD: 1, 5028 INCORRECT_PASSWORD: 2 5029}; 5030let verbosity = VerbosityLevel.WARNINGS; 5031function setVerbosityLevel(level) { 5032 if (Number.isInteger(level)) { 5033 verbosity = level; 5034 } 5035} 5036function getVerbosityLevel() { 5037 return verbosity; 5038} 5039function info(msg) { 5040 if (verbosity >= VerbosityLevel.INFOS) { 5041 console.log(`Info: ${msg}`); 5042 } 5043} 5044function warn(msg) { 5045 if (verbosity >= VerbosityLevel.WARNINGS) { 5046 console.log(`Warning: ${msg}`); 5047 } 5048} 5049function unreachable(msg) { 5050 throw new Error(msg); 5051} 5052function assert(cond, msg) { 5053 if (!cond) { 5054 unreachable(msg); 5055 } 5056} 5057function _isValidProtocol(url) { 5058 switch (url?.protocol) { 5059 case "http:": 5060 case "https:": 5061 case "ftp:": 5062 case "mailto:": 5063 case "tel:": 5064 return true; 5065 default: 5066 return false;
5067 } 5068} 5069function createValidAbsoluteUrl(url, baseUrl = null, options = null) { 5070 if (!url) { 5071 return null; 5072 } 5073 try { 5074 if (options && typeof url === "string") { 5075 if (options.addDefaultProtocol && url.startsWith("www.")) { 5076 const dots = url.match(/\./g); 5077 if (dots?.length >= 2) { 5078 url = `http://${url}`; 5079 } 5080 } 5081 if (options.tryConvertEncoding) { 5082 try { 5083 url = stringToUTF8String(url); 5084 } catch {} 5085 } 5086 } 5087 const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); 5088 if (_isValidProtocol(absoluteUrl)) { 5089 return absoluteUrl; 5090 } 5091 } catch {} 5092 return null; 5093} 5094function shadow(obj, prop, value, nonSerializable = false) { 5095 Object.defineProperty(obj, prop, { 5096 value, 5097 enumerable: !nonSerializable, 5098 configurable: true, 5099 writable: false 5100 }); 5101 return value; 5102} 5103const BaseException = function BaseExceptionClosure() { 5104 function BaseException(message, name) { 5105 this.message = message; 5106 this.name = name; 5107 } 5108 BaseException.prototype = new Error(); 5109 BaseException.constructor = BaseException; 5110 return BaseException; 5111}(); 5112class PasswordException extends BaseException { 5113 constructor(msg, code) { 5114 super(msg, "PasswordException"); 5115 this.code = code; 5116 } 5117} 5118class UnknownErrorException extends BaseException { 5119 constructor(msg, details) { 5120 super(msg, "UnknownErrorException"); 5121 this.details = details; 5122 } 5123} 5124class InvalidPDFException extends BaseException { 5125 constructor(msg) { 5126 super(msg, "InvalidPDFException"); 5127 } 5128} 5129class MissingPDFException extends BaseException { 5130 constructor(msg) { 5131 super(msg, "MissingPDFException"); 5132 } 5133} 5134class UnexpectedResponseException extends BaseException { 5135 constructor(msg, status) { 5136 super(msg, "UnexpectedResponseException"); 5137 this.status = status; 5138 } 5139} 5140class FormatError extends BaseException { 5141 constructor(msg) { 5142 super(msg, "FormatError"); 5143 } 5144} 5145class AbortException extends BaseException { 5146 constructor(msg) { 5147 super(msg, "AbortException"); 5148 } 5149} 5150function bytesToString(bytes) { 5151 if (typeof bytes !== "object" || bytes?.length === undefined) { 5152 unreachable("Invalid argument for bytesToString"); 5153 } 5154 const length = bytes.length; 5155 const MAX_ARGUMENT_COUNT = 8192; 5156 if (length < MAX_ARGUMENT_COUNT) { 5157 return String.fromCharCode.apply(null, bytes); 5158 } 5159 const strBuf = []; 5160 for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { 5161 const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); 5162 const chunk = bytes.subarray(i, chunkEnd); 5163 strBuf.push(String.fromCharCode.apply(null, chunk)); 5164 } 5165 return strBuf.join(""); 5166} 5167function stringToBytes(str) { 5168 if (typeof str !== "string") { 5169 unreachable("Invalid argument for stringToBytes"); 5170 } 5171 const length = str.length; 5172 const bytes = new Uint8Array(length); 5173 for (let i = 0; i < length; ++i) { 5174 bytes[i] = str.charCodeAt(i) & 0xff; 5175 } 5176 return bytes; 5177} 5178function string32(value) { 5179 return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); 5180} 5181function objectSize(obj) { 5182 return Object.keys(obj).length; 5183} 5184function objectFromMap(map) { 5185 const obj = Object.create(null); 5186 for (const [key, value] of map) { 5187 obj[key] = value; 5188 } 5189 return obj; 5190} 5191function isLittleEndian() { 5192 const buffer8 = new Uint8Array(4); 5193 buffer8[0] = 1; 5194 const view32 = new Uint32Array(buffer8.buffer, 0, 1); 5195 return view32[0] === 1; 5196} 5197function isEvalSupported() { 5198 try { 5199 new Function(""); 5200 return true; 5201 } catch { 5202 return false; 5203 } 5204} 5205class FeatureTest { 5206 static get isLittleEndian() { 5207 return shadow(this, "isLittleEndian", isLittleEndian()); 5208 } 5209 static get isEvalSupported() { 5210 return shadow(this, "isEvalSupported", isEvalSupported()); 5211 } 5212 static get isOffscreenCanvasSupported() { 5213 return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); 5214 } 5215 static get isImageDecoderSupported() { 5216 return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); 5217 } 5218 static get platform() { 5219 if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { 5220 return shadow(this, "platform", { 5221 isMac: navigator.platform.includes("Mac"), 5222 isWindows: navigator.platform.includes("Win"), 5223 isFirefox: typeof navigator?.userAgent === "string" && navigator.userAgent.includes("Firefox") 5224 }); 5225 } 5226 return shadow(this, "platform", {
5227 isMac: false, 5228 isWindows: false, 5229 isFirefox: false 5230 }); 5231 } 5232 static get isCSSRoundSupported() { 5233 return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); 5234 } 5235} 5236const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); 5237class Util { 5238 static makeHexColor(r, g, b) { 5239 return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; 5240 } 5241 static scaleMinMax(transform, minMax) { 5242 let temp; 5243 if (transform[0]) { 5244 if (transform[0] < 0) { 5245 temp = minMax[0]; 5246 minMax[0] = minMax[2]; 5247 minMax[2] = temp; 5248 } 5249 minMax[0] *= transform[0]; 5250 minMax[2] *= transform[0]; 5251 if (transform[3] < 0) { 5252 temp = minMax[1]; 5253 minMax[1] = minMax[3]; 5254 minMax[3] = temp; 5255 } 5256 minMax[1] *= transform[3]; 5257 minMax[3] *= transform[3]; 5258 } else { 5259 temp = minMax[0]; 5260 minMax[0] = minMax[1]; 5261 minMax[1] = temp; 5262 temp = minMax[2]; 5263 minMax[2] = minMax[3]; 5264 minMax[3] = temp; 5265 if (transform[1] < 0) { 5266 temp = minMax[1]; 5267 minMax[1] = minMax[3]; 5268 minMax[3] = temp; 5269 } 5270 minMax[1] *= transform[1]; 5271 minMax[3] *= transform[1]; 5272 if (transform[2] < 0) { 5273 temp = minMax[0]; 5274 minMax[0] = minMax[2]; 5275 minMax[2] = temp; 5276 } 5277 minMax[0] *= transform[2]; 5278 minMax[2] *= transform[2]; 5279 } 5280 minMax[0] += transform[4]; 5281 minMax[1] += transform[5]; 5282 minMax[2] += transform[4]; 5283 minMax[3] += transform[5]; 5284 } 5285 static transform(m1, m2) { 5286 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]]; 5287 } 5288 static applyTransform(p, m) { 5289 const xt = p[0] * m[0] + p[1] * m[2] + m[4]; 5290 const yt = p[0] * m[1] + p[1] * m[3] + m[5]; 5291 return [xt, yt]; 5292 } 5293 static applyInverseTransform(p, m) { 5294 const d = m[0] * m[3] - m[1] * m[2]; 5295 const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; 5296 const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; 5297 return [xt, yt]; 5298 } 5299 static getAxialAlignedBoundingBox(r, m) { 5300 const p1 = this.applyTransform(r, m); 5301 const p2 = this.applyTransform(r.slice(2, 4), m); 5302 const p3 = this.applyTransform([r[0], r[3]], m); 5303 const p4 = this.applyTransform([r[2], r[1]], m); 5304 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])]; 5305 } 5306 static inverseTransform(m) { 5307 const d = m[0] * m[3] - m[1] * m[2]; 5308 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]; 5309 } 5310 static singularValueDecompose2dScale(m) { 5311 const transpose = [m[0], m[2], m[1], m[3]]; 5312 const a = m[0] * transpose[0] + m[1] * transpose[2]; 5313 const b = m[0] * transpose[1] + m[1] * transpose[3]; 5314 const c = m[2] * transpose[0] + m[3] * transpose[2]; 5315 const d = m[2] * transpose[1] + m[3] * transpose[3]; 5316 const first = (a + d) / 2; 5317 const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; 5318 const sx = first + second || 1; 5319 const sy = first - second || 1; 5320 return [Math.sqrt(sx), Math.sqrt(sy)]; 5321 } 5322 static normalizeRect(rect) { 5323 const r = rect.slice(0); 5324 if (rect[0] > rect[2]) { 5325 r[0] = rect[2]; 5326 r[2] = rect[0]; 5327 } 5328 if (rect[1] > rect[3]) { 5329 r[1] = rect[3]; 5330 r[3] = rect[1]; 5331 } 5332 return r; 5333 } 5334 static intersect(rect1, rect2) { 5335 const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); 5336 const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); 5337 if (xLow > xHigh) { 5338 return null; 5339 } 5340 const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); 5341 const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); 5342 if (yLow > yHigh) { 5343 return null; 5344 } 5345 return [xLow, yLow, xHigh, yHigh]; 5346 } 5347 static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { 5348 if (t <= 0 || t >= 1) { 5349 return; 5350 } 5351 const mt = 1 - t; 5352 const tt = t * t; 5353 const ttt = tt * t; 5354 const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; 5355 const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; 5356 minMax[0] = Math.min(minMax[0], x); 5357 minMax[1] = Math.min(minMax[1], y); 5358 minMax[2] = Math.max(minMax[2], x); 5359 minMax[3] = Math.max(minMax[3], y); 5360 } 5361 static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { 5362 if (Math.abs(a) < 1e-12) { 5363 if (Math.abs(b) >= 1e-12) { 5364 this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); 5365 } 5366 return; 5367 } 5368 const delta = b ** 2 - 4 * c * a; 5369 if (delta < 0) { 5370 return; 5371 } 5372 const sqrtDelta = Math.sqrt(delta); 5373 const a2 = 2 * a; 5374 this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); 5375 this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); 5376 } 5377 static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { 5378 if (minMax) { 5379 minMax[0] = Math.min(minMax[0], x0, x3); 5380 minMax[1] = Math.min(minMax[1], y0, y3); 5381 minMax[2] = Math.max(minMax[2], x0, x3); 5382 minMax[3] = Math.max(minMax[3], y0, y3); 5383 } else { 5384 minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; 5385 } 5386 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); 5387 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); 5388 return minMax; 5389 } 5390} 5391const 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]; 5392function stringToPDFString(str) { 5393 if (str[0] >= "\xEF") { 5394 let encoding; 5395 if (str[0] === "\xFE" && str[1] === "\xFF") { 5396 encoding = "utf-16be"; 5397 if (str.length % 2 === 1) { 5398 str = str.slice(0, -1); 5399 } 5400 } else if (str[0] === "\xFF" && str[1] === "\xFE") { 5401 encoding = "utf-16le"; 5402 if (str.length % 2 === 1) { 5403 str = str.slice(0, -1); 5404 } 5405 } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { 5406 encoding = "utf-8"; 5407 } 5408 if (encoding) { 5409 try { 5410 const decoder = new TextDecoder(encoding, { 5411 fatal: true 5412 }); 5413 const buffer = stringToBytes(str); 5414 const decoded = decoder.decode(buffer); 5415 if (!decoded.includes("\x1b")) { 5416 return decoded; 5417 } 5418 return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); 5419 } catch (ex) { 5420 warn(`stringToPDFString: "${ex}".`); 5421 } 5422 } 5423 } 5424 const strBuf = []; 5425 for (let i = 0, ii = str.length; i < ii; i++) {
vendor: 43,008 bytes, lines 5426-7082
5426 const charCode = str.charCodeAt(i); 5427 if (charCode === 0x1b) { 5428 while (++i < ii && str.charCodeAt(i) !== 0x1b) {} 5429 continue; 5430 } 5431 const code = PDFStringTranslateTable[charCode]; 5432 strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); 5433 } 5434 return strBuf.join(""); 5435} 5436function stringToUTF8String(str) { 5437 return decodeURIComponent(escape(str)); 5438} 5439function utf8StringToString(str) { 5440 return unescape(encodeURIComponent(str)); 5441} 5442function isArrayEqual(arr1, arr2) { 5443 if (arr1.length !== arr2.length) { 5444 return false; 5445 } 5446 for (let i = 0, ii = arr1.length; i < ii; i++) { 5447 if (arr1[i] !== arr2[i]) { 5448 return false; 5449 } 5450 } 5451 return true; 5452} 5453function getModificationDate(date = new Date()) { 5454 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")]; 5455 return buffer.join(""); 5456} 5457let NormalizeRegex = null; 5458let NormalizationMap = null; 5459function normalizeUnicode(str) { 5460 if (!NormalizeRegex) { 5461 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; 5462 NormalizationMap = new Map([["ſt", "ſt"]]); 5463 } 5464 return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); 5465} 5466function getUuid() { 5467 if (typeof crypto.randomUUID === "function") { 5468 return crypto.randomUUID(); 5469 } 5470 const buf = new Uint8Array(32); 5471 crypto.getRandomValues(buf); 5472 return bytesToString(buf); 5473} 5474const AnnotationPrefix = "pdfjs_internal_id_"; 5475function toHexUtil(arr) { 5476 if (Uint8Array.prototype.toHex) { 5477 return arr.toHex(); 5478 } 5479 return Array.from(arr, num => hexNumbers[num]).join(""); 5480} 5481function toBase64Util(arr) { 5482 if (Uint8Array.prototype.toBase64) { 5483 return arr.toBase64(); 5484 } 5485 return btoa(bytesToString(arr)); 5486} 5487function fromBase64Util(str) { 5488 if (Uint8Array.fromBase64) { 5489 return Uint8Array.fromBase64(str); 5490 } 5491 return stringToBytes(atob(str)); 5492} 5493 5494// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.every.js 5495var esnext_iterator_every = __webpack_require__(3215); 5496;// ./src/core/primitives.js 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506const CIRCULAR_REF = Symbol("CIRCULAR_REF"); 5507const EOF = Symbol("EOF"); 5508let CmdCache = Object.create(null); 5509let NameCache = Object.create(null); 5510let RefCache = Object.create(null); 5511function clearPrimitiveCaches() { 5512 CmdCache = Object.create(null); 5513 NameCache = Object.create(null); 5514 RefCache = Object.create(null); 5515} 5516class Name { 5517 constructor(name) { 5518 this.name = name; 5519 } 5520 static get(name) { 5521 return NameCache[name] ||= new Name(name); 5522 } 5523} 5524class Cmd { 5525 constructor(cmd) { 5526 this.cmd = cmd; 5527 } 5528 static get(cmd) { 5529 return CmdCache[cmd] ||= new Cmd(cmd); 5530 } 5531} 5532const nonSerializable = function nonSerializableClosure() { 5533 return nonSerializable; 5534}; 5535class Dict { 5536 constructor(xref = null) { 5537 this._map = new Map(); 5538 this.xref = xref; 5539 this.objId = null; 5540 this.suppressEncryption = false; 5541 this.__nonSerializable__ = nonSerializable; 5542 } 5543 assignXref(newXref) { 5544 this.xref = newXref; 5545 } 5546 get size() { 5547 return this._map.size; 5548 } 5549 get(key1, key2, key3) { 5550 let value = this._map.get(key1); 5551 if (value === undefined && key2 !== undefined) { 5552 value = this._map.get(key2); 5553 if (value === undefined && key3 !== undefined) { 5554 value = this._map.get(key3); 5555 } 5556 } 5557 if (value instanceof Ref && this.xref) { 5558 return this.xref.fetch(value, this.suppressEncryption); 5559 } 5560 return value; 5561 } 5562 async getAsync(key1, key2, key3) { 5563 let value = this._map.get(key1); 5564 if (value === undefined && key2 !== undefined) { 5565 value = this._map.get(key2); 5566 if (value === undefined && key3 !== undefined) { 5567 value = this._map.get(key3); 5568 } 5569 } 5570 if (value instanceof Ref && this.xref) { 5571 return this.xref.fetchAsync(value, this.suppressEncryption); 5572 } 5573 return value; 5574 } 5575 getArray(key1, key2, key3) { 5576 let value = this._map.get(key1); 5577 if (value === undefined && key2 !== undefined) { 5578 value = this._map.get(key2); 5579 if (value === undefined && key3 !== undefined) { 5580 value = this._map.get(key3); 5581 } 5582 } 5583 if (value instanceof Ref && this.xref) { 5584 value = this.xref.fetch(value, this.suppressEncryption); 5585 } 5586 if (Array.isArray(value)) { 5587 value = value.slice(); 5588 for (let i = 0, ii = value.length; i < ii; i++) { 5589 if (value[i] instanceof Ref && this.xref) { 5590 value[i] = this.xref.fetch(value[i], this.suppressEncryption); 5591 } 5592 } 5593 } 5594 return value; 5595 } 5596 getRaw(key) { 5597 return this._map.get(key); 5598 } 5599 getKeys() { 5600 return [...this._map.keys()]; 5601 } 5602 getRawValues() { 5603 return [...this._map.values()]; 5604 } 5605 set(key, value) { 5606 this._map.set(key, value); 5607 } 5608 has(key) { 5609 return this._map.has(key); 5610 } 5611 *[Symbol.iterator]() { 5612 for (const [key, value] of this._map) { 5613 yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value]; 5614 } 5615 } 5616 static get empty() { 5617 const emptyDict = new Dict(null); 5618 emptyDict.set = (key, value) => { 5619 unreachable("Should not call `set` on the empty dictionary."); 5620 }; 5621 return shadow(this, "empty", emptyDict); 5622 } 5623 static merge({ 5624 xref, 5625 dictArray, 5626 mergeSubDicts = false 5627 }) { 5628 const mergedDict = new Dict(xref), 5629 properties = new Map(); 5630 for (const dict of dictArray) { 5631 if (!(dict instanceof Dict)) { 5632 continue; 5633 } 5634 for (const [key, value] of dict._map) { 5635 let property = properties.get(key); 5636 if (property === undefined) { 5637 property = []; 5638 properties.set(key, property); 5639 } else if (!mergeSubDicts || !(value instanceof Dict)) { 5640 continue; 5641 } 5642 property.push(value); 5643 } 5644 } 5645 for (const [name, values] of properties) { 5646 if (values.length === 1 || !(values[0] instanceof Dict)) { 5647 mergedDict._map.set(name, values[0]); 5648 continue; 5649 } 5650 const subDict = new Dict(xref); 5651 for (const dict of values) { 5652 for (const [key, value] of dict._map) { 5653 if (!subDict._map.has(key)) { 5654 subDict._map.set(key, value); 5655 } 5656 } 5657 } 5658 if (subDict.size > 0) { 5659 mergedDict._map.set(name, subDict); 5660 } 5661 } 5662 properties.clear(); 5663 return mergedDict.size > 0 ? mergedDict : Dict.empty; 5664 } 5665 clone() { 5666 const dict = new Dict(this.xref); 5667 for (const key of this.getKeys()) { 5668 dict.set(key, this.getRaw(key)); 5669 } 5670 return dict; 5671 } 5672 delete(key) { 5673 delete this._map[key]; 5674 } 5675} 5676class Ref { 5677 constructor(num, gen) { 5678 this.num = num; 5679 this.gen = gen; 5680 } 5681 toString() { 5682 if (this.gen === 0) { 5683 return `${this.num}R`; 5684 } 5685 return `${this.num}R${this.gen}`; 5686 } 5687 static fromString(str) { 5688 const ref = RefCache[str]; 5689 if (ref) { 5690 return ref; 5691 } 5692 const m = /^(\d+)R(\d*)$/.exec(str); 5693 if (!m || m[1] === "0") { 5694 return null; 5695 } 5696 return RefCache[str] = new Ref(parseInt(m[1]), !m[2] ? 0 : parseInt(m[2])); 5697 } 5698 static get(num, gen) { 5699 const key = gen === 0 ? `${num}R` : `${num}R${gen}`; 5700 return RefCache[key] ||= new Ref(num, gen); 5701 } 5702} 5703class RefSet { 5704 constructor(parent = null) { 5705 this._set = new Set(parent?._set); 5706 } 5707 has(ref) { 5708 return this._set.has(ref.toString()); 5709 } 5710 put(ref) { 5711 this._set.add(ref.toString()); 5712 } 5713 remove(ref) { 5714 this._set.delete(ref.toString()); 5715 } 5716 [Symbol.iterator]() { 5717 return this._set.values(); 5718 } 5719 clear() { 5720 this._set.clear(); 5721 } 5722} 5723class RefSetCache { 5724 constructor() { 5725 this._map = new Map(); 5726 } 5727 get size() { 5728 return this._map.size; 5729 } 5730 get(ref) { 5731 return this._map.get(ref.toString()); 5732 } 5733 has(ref) { 5734 return this._map.has(ref.toString()); 5735 } 5736 put(ref, obj) { 5737 this._map.set(ref.toString(), obj); 5738 } 5739 putAlias(ref, aliasRef) { 5740 this._map.set(ref.toString(), this.get(aliasRef)); 5741 } 5742 [Symbol.iterator]() { 5743 return this._map.values(); 5744 } 5745 clear() { 5746 this._map.clear(); 5747 } 5748 *values() { 5749 yield* this._map.values(); 5750 } 5751 *items() { 5752 for (const [ref, value] of this._map) { 5753 yield [Ref.fromString(ref), value]; 5754 } 5755 } 5756} 5757function isName(v, name) { 5758 return v instanceof Name && (name === undefined || v.name === name); 5759} 5760function isCmd(v, cmd) { 5761 return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); 5762} 5763function isDict(v, type) { 5764 return v instanceof Dict && (type === undefined || isName(v.get("Type"), type)); 5765} 5766function isRefsEqual(v1, v2) { 5767 return v1.num === v2.num && v1.gen === v2.gen; 5768} 5769 5770;// ./src/core/base_stream.js 5771 5772class BaseStream { 5773 get length() { 5774 unreachable("Abstract getter `length` accessed"); 5775 } 5776 get isEmpty() { 5777 unreachable("Abstract getter `isEmpty` accessed"); 5778 } 5779 get isDataLoaded() { 5780 return shadow(this, "isDataLoaded", true); 5781 } 5782 getByte() { 5783 unreachable("Abstract method `getByte` called"); 5784 } 5785 getBytes(length) { 5786 unreachable("Abstract method `getBytes` called"); 5787 } 5788 async getImageData(length, decoderOptions) { 5789 return this.getBytes(length, decoderOptions); 5790 } 5791 async asyncGetBytes() { 5792 unreachable("Abstract method `asyncGetBytes` called"); 5793 } 5794 get isAsync() { 5795 return false; 5796 } 5797 get canAsyncDecodeImageFromBuffer() { 5798 return false; 5799 } 5800 async getTransferableImage() { 5801 return null; 5802 } 5803 peekByte() { 5804 const peekedByte = this.getByte(); 5805 if (peekedByte !== -1) { 5806 this.pos--; 5807 } 5808 return peekedByte; 5809 } 5810 peekBytes(length) { 5811 const bytes = this.getBytes(length); 5812 this.pos -= bytes.length; 5813 return bytes; 5814 } 5815 getUint16() { 5816 const b0 = this.getByte(); 5817 const b1 = this.getByte(); 5818 if (b0 === -1 || b1 === -1) { 5819 return -1; 5820 } 5821 return (b0 << 8) + b1; 5822 } 5823 getInt32() { 5824 const b0 = this.getByte(); 5825 const b1 = this.getByte(); 5826 const b2 = this.getByte(); 5827 const b3 = this.getByte(); 5828 return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; 5829 } 5830 getByteRange(begin, end) { 5831 unreachable("Abstract method `getByteRange` called"); 5832 } 5833 getString(length) { 5834 return bytesToString(this.getBytes(length)); 5835 } 5836 skip(n) { 5837 this.pos += n || 1; 5838 } 5839 reset() { 5840 unreachable("Abstract method `reset` called"); 5841 } 5842 moveStart() { 5843 unreachable("Abstract method `moveStart` called"); 5844 } 5845 makeSubStream(start, length, dict = null) { 5846 unreachable("Abstract method `makeSubStream` called"); 5847 } 5848 getBaseStreams() { 5849 return null; 5850 } 5851} 5852 5853;// ./src/core/core_utils.js 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; 5875const MAX_INT_32 = 2 ** 31 - 1; 5876const MIN_INT_32 = -(2 ** 31); 5877function getLookupTableFactory(initializer) { 5878 let lookup; 5879 return function () { 5880 if (initializer) { 5881 lookup = Object.create(null); 5882 initializer(lookup); 5883 initializer = null; 5884 } 5885 return lookup; 5886 }; 5887} 5888class MissingDataException extends BaseException { 5889 constructor(begin, end) { 5890 super(`Missing data [${begin}, ${end})`, "MissingDataException"); 5891 this.begin = begin; 5892 this.end = end; 5893 } 5894} 5895class ParserEOFException extends BaseException { 5896 constructor(msg) { 5897 super(msg, "ParserEOFException"); 5898 } 5899} 5900class XRefEntryException extends BaseException { 5901 constructor(msg) { 5902 super(msg, "XRefEntryException"); 5903 } 5904} 5905class XRefParseException extends BaseException { 5906 constructor(msg) { 5907 super(msg, "XRefParseException"); 5908 } 5909} 5910function arrayBuffersToBytes(arr) { 5911 const length = arr.length; 5912 if (length === 0) { 5913 return new Uint8Array(0); 5914 } 5915 if (length === 1) { 5916 return new Uint8Array(arr[0]); 5917 } 5918 let dataLength = 0; 5919 for (let i = 0; i < length; i++) { 5920 dataLength += arr[i].byteLength; 5921 } 5922 const data = new Uint8Array(dataLength); 5923 let pos = 0; 5924 for (let i = 0; i < length; i++) { 5925 const item = new Uint8Array(arr[i]); 5926 data.set(item, pos); 5927 pos += item.byteLength; 5928 } 5929 return data; 5930} 5931function getInheritableProperty({ 5932 dict, 5933 key, 5934 getArray = false, 5935 stopWhenFound = true 5936}) { 5937 let values; 5938 const visited = new RefSet(); 5939 while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) { 5940 if (dict.objId) { 5941 visited.put(dict.objId); 5942 } 5943 const value = getArray ? dict.getArray(key) : dict.get(key); 5944 if (value !== undefined) { 5945 if (stopWhenFound) { 5946 return value; 5947 } 5948 (values ||= []).push(value); 5949 } 5950 dict = dict.get("Parent"); 5951 } 5952 return values; 5953} 5954function getParentToUpdate(dict, ref, xref) { 5955 const visited = new RefSet(); 5956 const firstDict = dict; 5957 const result = { 5958 dict: null, 5959 ref: null 5960 }; 5961 while (dict instanceof Dict && !visited.has(ref)) { 5962 visited.put(ref); 5963 if (dict.has("T")) { 5964 break; 5965 } 5966 ref = dict.getRaw("Parent"); 5967 if (!(ref instanceof Ref)) { 5968 return result; 5969 } 5970 dict = xref.fetch(ref); 5971 } 5972 if (dict instanceof Dict && dict !== firstDict) { 5973 result.dict = dict; 5974 result.ref = ref; 5975 } 5976 return result; 5977} 5978const 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"]; 5979function toRomanNumerals(number, lowerCase = false) { 5980 assert(Number.isInteger(number) && number > 0, "The number should be a positive integer."); 5981 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]; 5982 return lowerCase ? roman.toLowerCase() : roman; 5983} 5984function log2(x) { 5985 return x > 0 ? Math.ceil(Math.log2(x)) : 0; 5986} 5987function readInt8(data, offset) { 5988 return data[offset] << 24 >> 24; 5989} 5990function readUint16(data, offset) { 5991 return data[offset] << 8 | data[offset + 1]; 5992} 5993function readUint32(data, offset) { 5994 return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; 5995} 5996function isWhiteSpace(ch) { 5997 return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; 5998} 5999function isBooleanArray(arr, len) { 6000 return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean"); 6001} 6002function isNumberArray(arr, len) { 6003 if (Array.isArray(arr)) { 6004 return (len === null || arr.length === len) && arr.every(x => typeof x === "number"); 6005 } 6006 return ArrayBuffer.isView(arr) && (arr.length === 0 || typeof arr[0] === "number") && (len === null || arr.length === len); 6007} 6008function lookupMatrix(arr, fallback) { 6009 return isNumberArray(arr, 6) ? arr : fallback; 6010} 6011function lookupRect(arr, fallback) { 6012 return isNumberArray(arr, 4) ? arr : fallback; 6013} 6014function lookupNormalRect(arr, fallback) { 6015 return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback; 6016} 6017function parseXFAPath(path) { 6018 const positionPattern = /(.+)\[(\d+)\]$/; 6019 return path.split(".").map(component => { 6020 const m = component.match(positionPattern); 6021 if (m) { 6022 return { 6023 name: m[1], 6024 pos: parseInt(m[2], 10) 6025 }; 6026 } 6027 return { 6028 name: component, 6029 pos: 0 6030 }; 6031 }); 6032} 6033function escapePDFName(str) { 6034 const buffer = []; 6035 let start = 0; 6036 for (let i = 0, ii = str.length; i < ii; i++) { 6037 const char = str.charCodeAt(i); 6038 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) { 6039 if (start < i) { 6040 buffer.push(str.substring(start, i)); 6041 } 6042 buffer.push(`#${char.toString(16)}`); 6043 start = i + 1; 6044 } 6045 } 6046 if (buffer.length === 0) { 6047 return str; 6048 } 6049 if (start < str.length) { 6050 buffer.push(str.substring(start, str.length)); 6051 } 6052 return buffer.join(""); 6053} 6054function escapeString(str) { 6055 return str.replaceAll(/([()\\\n\r])/g, match => { 6056 if (match === "\n") { 6057 return "\\n"; 6058 } else if (match === "\r") { 6059 return "\\r"; 6060 } 6061 return `\\${match}`; 6062 }); 6063} 6064function _collectJS(entry, xref, list, parents) { 6065 if (!entry) { 6066 return; 6067 } 6068 let parent = null; 6069 if (entry instanceof Ref) { 6070 if (parents.has(entry)) { 6071 return; 6072 } 6073 parent = entry; 6074 parents.put(parent); 6075 entry = xref.fetch(entry); 6076 } 6077 if (Array.isArray(entry)) { 6078 for (const element of entry) { 6079 _collectJS(element, xref, list, parents); 6080 } 6081 } else if (entry instanceof Dict) { 6082 if (isName(entry.get("S"), "JavaScript")) { 6083 const js = entry.get("JS"); 6084 let code; 6085 if (js instanceof BaseStream) { 6086 code = js.getString(); 6087 } else if (typeof js === "string") { 6088 code = js; 6089 } 6090 code &&= stringToPDFString(code).replaceAll("\x00", ""); 6091 if (code) { 6092 list.push(code); 6093 } 6094 } 6095 _collectJS(entry.getRaw("Next"), xref, list, parents); 6096 } 6097 if (parent) { 6098 parents.remove(parent); 6099 } 6100} 6101function collectActions(xref, dict, eventType) { 6102 const actions = Object.create(null); 6103 const additionalActionsDicts = getInheritableProperty({ 6104 dict, 6105 key: "AA", 6106 stopWhenFound: false 6107 }); 6108 if (additionalActionsDicts) { 6109 for (let i = additionalActionsDicts.length - 1; i >= 0; i--) { 6110 const additionalActions = additionalActionsDicts[i]; 6111 if (!(additionalActions instanceof Dict)) { 6112 continue; 6113 } 6114 for (const key of additionalActions.getKeys()) { 6115 const action = eventType[key]; 6116 if (!action) { 6117 continue; 6118 } 6119 const actionDict = additionalActions.getRaw(key); 6120 const parents = new RefSet(); 6121 const list = []; 6122 _collectJS(actionDict, xref, list, parents); 6123 if (list.length > 0) { 6124 actions[action] = list; 6125 } 6126 } 6127 } 6128 } 6129 if (dict.has("A")) { 6130 const actionDict = dict.get("A"); 6131 const parents = new RefSet(); 6132 const list = []; 6133 _collectJS(actionDict, xref, list, parents); 6134 if (list.length > 0) { 6135 actions.Action = list; 6136 } 6137 } 6138 return objectSize(actions) > 0 ? actions : null; 6139} 6140const XMLEntities = { 6141 0x3c: "<", 6142 0x3e: ">", 6143 0x26: "&", 6144 0x22: """, 6145 0x27: "'" 6146}; 6147function* codePointIter(str) { 6148 for (let i = 0, ii = str.length; i < ii; i++) { 6149 const char = str.codePointAt(i); 6150 if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { 6151 i++; 6152 } 6153 yield char; 6154 } 6155} 6156function encodeToXmlString(str) { 6157 const buffer = []; 6158 let start = 0; 6159 for (let i = 0, ii = str.length; i < ii; i++) { 6160 const char = str.codePointAt(i); 6161 if (0x20 <= char && char <= 0x7e) { 6162 const entity = XMLEntities[char]; 6163 if (entity) { 6164 if (start < i) { 6165 buffer.push(str.substring(start, i)); 6166 } 6167 buffer.push(entity); 6168 start = i + 1; 6169 } 6170 } else { 6171 if (start < i) { 6172 buffer.push(str.substring(start, i)); 6173 } 6174 buffer.push(`&#x${char.toString(16).toUpperCase()};`); 6175 if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { 6176 i++; 6177 } 6178 start = i + 1; 6179 } 6180 } 6181 if (buffer.length === 0) { 6182 return str; 6183 } 6184 if (start < str.length) { 6185 buffer.push(str.substring(start, str.length)); 6186 } 6187 return buffer.join(""); 6188} 6189function validateFontName(fontFamily, mustWarn = false) { 6190 const m = /^("|').*("|')$/.exec(fontFamily); 6191 if (m && m[1] === m[2]) { 6192 const re = new RegExp(`[^\\\\]${m[1]}`); 6193 if (re.test(fontFamily.slice(1, -1))) { 6194 if (mustWarn) { 6195 warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`); 6196 } 6197 return false; 6198 } 6199 } else { 6200 for (const ident of fontFamily.split(/[ \t]+/)) { 6201 if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { 6202 if (mustWarn) { 6203 warn(`FontFamily contains invalid <custom-ident>: ${fontFamily}.`); 6204 } 6205 return false; 6206 } 6207 } 6208 } 6209 return true; 6210} 6211function validateCSSFont(cssFontInfo) { 6212 const DEFAULT_CSS_FONT_OBLIQUE = "14"; 6213 const DEFAULT_CSS_FONT_WEIGHT = "400"; 6214 const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "normal", "bold", "bolder", "lighter"]); 6215 const { 6216 fontFamily, 6217 fontWeight, 6218 italicAngle 6219 } = cssFontInfo; 6220 if (!validateFontName(fontFamily, true)) { 6221 return false; 6222 } 6223 const weight = fontWeight ? fontWeight.toString() : ""; 6224 cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT; 6225 const angle = parseFloat(italicAngle); 6226 cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : italicAngle.toString(); 6227 return true; 6228} 6229function recoverJsURL(str) { 6230 const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; 6231 const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); 6232 const jsUrl = regex.exec(str); 6233 if (jsUrl?.[2]) { 6234 return { 6235 url: jsUrl[2], 6236 newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true" 6237 }; 6238 } 6239 return null; 6240} 6241function numberToString(value) { 6242 if (Number.isInteger(value)) { 6243 return value.toString(); 6244 } 6245 const roundedValue = Math.round(value * 100); 6246 if (roundedValue % 100 === 0) { 6247 return (roundedValue / 100).toString(); 6248 } 6249 if (roundedValue % 10 === 0) { 6250 return value.toFixed(1); 6251 } 6252 return value.toFixed(2); 6253} 6254function getNewAnnotationsMap(annotationStorage) { 6255 if (!annotationStorage) { 6256 return null; 6257 } 6258 const newAnnotationsByPage = new Map(); 6259 for (const [key, value] of annotationStorage) { 6260 if (!key.startsWith(AnnotationEditorPrefix)) { 6261 continue; 6262 } 6263 let annotations = newAnnotationsByPage.get(value.pageIndex); 6264 if (!annotations) { 6265 annotations = []; 6266 newAnnotationsByPage.set(value.pageIndex, annotations); 6267 } 6268 annotations.push(value); 6269 } 6270 return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; 6271} 6272function stringToAsciiOrUTF16BE(str) { 6273 return isAscii(str) ? str : stringToUTF16String(str, true); 6274} 6275function isAscii(str) { 6276 return /^[\x00-\x7F]*$/.test(str); 6277} 6278function stringToUTF16HexString(str) { 6279 const buf = []; 6280 for (let i = 0, ii = str.length; i < ii; i++) { 6281 const char = str.charCodeAt(i); 6282 buf.push(hexNumbers[char >> 8 & 0xff], hexNumbers[char & 0xff]); 6283 } 6284 return buf.join(""); 6285} 6286function stringToUTF16String(str, bigEndian = false) { 6287 const buf = []; 6288 if (bigEndian) { 6289 buf.push("\xFE\xFF"); 6290 } 6291 for (let i = 0, ii = str.length; i < ii; i++) { 6292 const char = str.charCodeAt(i); 6293 buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff)); 6294 } 6295 return buf.join(""); 6296} 6297function getRotationMatrix(rotation, width, height) { 6298 switch (rotation) { 6299 case 90: 6300 return [0, 1, -1, 0, width, 0]; 6301 case 180: 6302 return [-1, 0, 0, -1, width, height]; 6303 case 270: 6304 return [0, -1, 1, 0, 0, height]; 6305 default: 6306 throw new Error("Invalid rotation"); 6307 } 6308} 6309function getSizeInBytes(x) { 6310 return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8); 6311} 6312 6313;// ./src/core/stream.js 6314 6315 6316 6317 6318 6319 6320 6321 6322class Stream extends BaseStream { 6323 constructor(arrayBuffer, start, length, dict) { 6324 super(); 6325 this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); 6326 this.start = start || 0; 6327 this.pos = this.start; 6328 this.end = start + length || this.bytes.length; 6329 this.dict = dict; 6330 } 6331 get length() { 6332 return this.end - this.start; 6333 } 6334 get isEmpty() { 6335 return this.length === 0; 6336 } 6337 getByte() { 6338 if (this.pos >= this.end) { 6339 return -1; 6340 } 6341 return this.bytes[this.pos++]; 6342 } 6343 getBytes(length) { 6344 const bytes = this.bytes; 6345 const pos = this.pos; 6346 const strEnd = this.end; 6347 if (!length) { 6348 return bytes.subarray(pos, strEnd); 6349 } 6350 let end = pos + length; 6351 if (end > strEnd) { 6352 end = strEnd; 6353 } 6354 this.pos = end; 6355 return bytes.subarray(pos, end); 6356 } 6357 getByteRange(begin, end) { 6358 if (begin < 0) { 6359 begin = 0; 6360 } 6361 if (end > this.end) { 6362 end = this.end; 6363 } 6364 return this.bytes.subarray(begin, end); 6365 } 6366 reset() { 6367 this.pos = this.start; 6368 } 6369 moveStart() { 6370 this.start = this.pos; 6371 } 6372 makeSubStream(start, length, dict = null) { 6373 return new Stream(this.bytes.buffer, start, length, dict); 6374 } 6375} 6376class StringStream extends Stream { 6377 constructor(str) { 6378 super(stringToBytes(str)); 6379 } 6380} 6381class NullStream extends Stream { 6382 constructor() { 6383 super(new Uint8Array(0)); 6384 } 6385} 6386 6387;// ./src/core/chunked_stream.js 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406class ChunkedStream extends Stream { 6407 constructor(length, chunkSize, manager) { 6408 super(new Uint8Array(length), 0, length, null); 6409 this.chunkSize = chunkSize; 6410 this._loadedChunks = new Set(); 6411 this.numChunks = Math.ceil(length / chunkSize); 6412 this.manager = manager; 6413 this.progressiveDataLength = 0; 6414 this.lastSuccessfulEnsureByteChunk = -1; 6415 } 6416 getMissingChunks() { 6417 const chunks = []; 6418 for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { 6419 if (!this._loadedChunks.has(chunk)) { 6420 chunks.push(chunk); 6421 } 6422 } 6423 return chunks; 6424 } 6425 get numChunksLoaded() { 6426 return this._loadedChunks.size; 6427 } 6428 get isDataLoaded() { 6429 return this.numChunksLoaded === this.numChunks; 6430 } 6431 onReceiveData(begin, chunk) { 6432 const chunkSize = this.chunkSize; 6433 if (begin % chunkSize !== 0) { 6434 throw new Error(`Bad begin offset: ${begin}`); 6435 } 6436 const end = begin + chunk.byteLength; 6437 if (end % chunkSize !== 0 && end !== this.bytes.length) { 6438 throw new Error(`Bad end offset: ${end}`); 6439 } 6440 this.bytes.set(new Uint8Array(chunk), begin); 6441 const beginChunk = Math.floor(begin / chunkSize); 6442 const endChunk = Math.floor((end - 1) / chunkSize) + 1; 6443 for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { 6444 this._loadedChunks.add(curChunk); 6445 } 6446 } 6447 onReceiveProgressiveData(data) { 6448 let position = this.progressiveDataLength; 6449 const beginChunk = Math.floor(position / this.chunkSize); 6450 this.bytes.set(new Uint8Array(data), position); 6451 position += data.byteLength; 6452 this.progressiveDataLength = position; 6453 const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); 6454 for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { 6455 this._loadedChunks.add(curChunk); 6456 } 6457 } 6458 ensureByte(pos) { 6459 if (pos < this.progressiveDataLength) { 6460 return; 6461 } 6462 const chunk = Math.floor(pos / this.chunkSize); 6463 if (chunk > this.numChunks) { 6464 return; 6465 } 6466 if (chunk === this.lastSuccessfulEnsureByteChunk) { 6467 return; 6468 } 6469 if (!this._loadedChunks.has(chunk)) { 6470 throw new MissingDataException(pos, pos + 1); 6471 } 6472 this.lastSuccessfulEnsureByteChunk = chunk; 6473 } 6474 ensureRange(begin, end) { 6475 if (begin >= end) { 6476 return; 6477 } 6478 if (end <= this.progressiveDataLength) { 6479 return; 6480 } 6481 const beginChunk = Math.floor(begin / this.chunkSize); 6482 if (beginChunk > this.numChunks) { 6483 return; 6484 } 6485 const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks); 6486 for (let chunk = beginChunk; chunk < endChunk; ++chunk) { 6487 if (!this._loadedChunks.has(chunk)) { 6488 throw new MissingDataException(begin, end); 6489 } 6490 } 6491 } 6492 nextEmptyChunk(beginChunk) { 6493 const numChunks = this.numChunks; 6494 for (let i = 0; i < numChunks; ++i) { 6495 const chunk = (beginChunk + i) % numChunks; 6496 if (!this._loadedChunks.has(chunk)) { 6497 return chunk; 6498 } 6499 } 6500 return null; 6501 } 6502 hasChunk(chunk) { 6503 return this._loadedChunks.has(chunk); 6504 } 6505 getByte() { 6506 const pos = this.pos; 6507 if (pos >= this.end) { 6508 return -1; 6509 } 6510 if (pos >= this.progressiveDataLength) { 6511 this.ensureByte(pos); 6512 } 6513 return this.bytes[this.pos++]; 6514 } 6515 getBytes(length) { 6516 const bytes = this.bytes; 6517 const pos = this.pos; 6518 const strEnd = this.end; 6519 if (!length) { 6520 if (strEnd > this.progressiveDataLength) { 6521 this.ensureRange(pos, strEnd); 6522 } 6523 return bytes.subarray(pos, strEnd); 6524 } 6525 let end = pos + length; 6526 if (end > strEnd) { 6527 end = strEnd; 6528 } 6529 if (end > this.progressiveDataLength) { 6530 this.ensureRange(pos, end); 6531 } 6532 this.pos = end; 6533 return bytes.subarray(pos, end); 6534 } 6535 getByteRange(begin, end) { 6536 if (begin < 0) { 6537 begin = 0; 6538 } 6539 if (end > this.end) { 6540 end = this.end; 6541 } 6542 if (end > this.progressiveDataLength) { 6543 this.ensureRange(begin, end); 6544 } 6545 return this.bytes.subarray(begin, end); 6546 } 6547 makeSubStream(start, length, dict = null) { 6548 if (length) { 6549 if (start + length > this.progressiveDataLength) { 6550 this.ensureRange(start, start + length); 6551 } 6552 } else if (start >= this.progressiveDataLength) { 6553 this.ensureByte(start); 6554 } 6555 function ChunkedStreamSubstream() {} 6556 ChunkedStreamSubstream.prototype = Object.create(this); 6557 ChunkedStreamSubstream.prototype.getMissingChunks = function () { 6558 const chunkSize = this.chunkSize; 6559 const beginChunk = Math.floor(this.start / chunkSize); 6560 const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; 6561 const missingChunks = []; 6562 for (let chunk = beginChunk; chunk < endChunk; ++chunk) { 6563 if (!this._loadedChunks.has(chunk)) { 6564 missingChunks.push(chunk); 6565 } 6566 } 6567 return missingChunks; 6568 }; 6569 Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { 6570 get() { 6571 if (this.numChunksLoaded === this.numChunks) { 6572 return true; 6573 } 6574 return this.getMissingChunks().length === 0; 6575 }, 6576 configurable: true 6577 }); 6578 const subStream = new ChunkedStreamSubstream(); 6579 subStream.pos = subStream.start = start; 6580 subStream.end = start + length || this.end; 6581 subStream.dict = dict; 6582 return subStream; 6583 } 6584 getBaseStreams() { 6585 return [this]; 6586 } 6587} 6588class ChunkedStreamManager { 6589 constructor(pdfNetworkStream, args) { 6590 this.length = args.length; 6591 this.chunkSize = args.rangeChunkSize; 6592 this.stream = new ChunkedStream(this.length, this.chunkSize, this); 6593 this.pdfNetworkStream = pdfNetworkStream; 6594 this.disableAutoFetch = args.disableAutoFetch; 6595 this.msgHandler = args.msgHandler; 6596 this.currRequestId = 0; 6597 this._chunksNeededByRequest = new Map(); 6598 this._requestsByChunk = new Map(); 6599 this._promisesByRequest = new Map(); 6600 this.progressiveDataLength = 0; 6601 this.aborted = false; 6602 this._loadedStreamCapability = Promise.withResolvers(); 6603 } 6604 sendRequest(begin, end) { 6605 const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); 6606 if (!rangeReader.isStreamingSupported) { 6607 rangeReader.onProgress = this.onProgress.bind(this); 6608 } 6609 let chunks = [], 6610 loaded = 0; 6611 return new Promise((resolve, reject) => { 6612 const readChunk = ({ 6613 value, 6614 done 6615 }) => { 6616 try { 6617 if (done) { 6618 const chunkData = arrayBuffersToBytes(chunks); 6619 chunks = null; 6620 resolve(chunkData); 6621 return; 6622 } 6623 loaded += value.byteLength; 6624 if (rangeReader.isStreamingSupported) { 6625 this.onProgress({ 6626 loaded 6627 }); 6628 } 6629 chunks.push(value); 6630 rangeReader.read().then(readChunk, reject); 6631 } catch (e) { 6632 reject(e); 6633 } 6634 }; 6635 rangeReader.read().then(readChunk, reject); 6636 }).then(data => { 6637 if (this.aborted) { 6638 return; 6639 } 6640 this.onReceiveData({ 6641 chunk: data, 6642 begin 6643 }); 6644 }); 6645 } 6646 requestAllChunks(noFetch = false) { 6647 if (!noFetch) { 6648 const missingChunks = this.stream.getMissingChunks(); 6649 this._requestChunks(missingChunks); 6650 } 6651 return this._loadedStreamCapability.promise; 6652 } 6653 _requestChunks(chunks) { 6654 const requestId = this.currRequestId++; 6655 const chunksNeeded = new Set(); 6656 this._chunksNeededByRequest.set(requestId, chunksNeeded); 6657 for (const chunk of chunks) { 6658 if (!this.stream.hasChunk(chunk)) { 6659 chunksNeeded.add(chunk); 6660 } 6661 } 6662 if (chunksNeeded.size === 0) { 6663 return Promise.resolve(); 6664 } 6665 const capability = Promise.withResolvers(); 6666 this._promisesByRequest.set(requestId, capability); 6667 const chunksToRequest = []; 6668 for (const chunk of chunksNeeded) { 6669 let requestIds = this._requestsByChunk.get(chunk); 6670 if (!requestIds) { 6671 requestIds = []; 6672 this._requestsByChunk.set(chunk, requestIds); 6673 chunksToRequest.push(chunk); 6674 } 6675 requestIds.push(requestId); 6676 } 6677 if (chunksToRequest.length > 0) { 6678 const groupedChunksToRequest = this.groupChunks(chunksToRequest); 6679 for (const groupedChunk of groupedChunksToRequest) { 6680 const begin = groupedChunk.beginChunk * this.chunkSize; 6681 const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); 6682 this.sendRequest(begin, end).catch(capability.reject); 6683 } 6684 } 6685 return capability.promise.catch(reason => { 6686 if (this.aborted) { 6687 return; 6688 } 6689 throw reason; 6690 }); 6691 } 6692 getStream() { 6693 return this.stream; 6694 } 6695 requestRange(begin, end) { 6696 end = Math.min(end, this.length); 6697 const beginChunk = this.getBeginChunk(begin); 6698 const endChunk = this.getEndChunk(end); 6699 const chunks = []; 6700 for (let chunk = beginChunk; chunk < endChunk; ++chunk) { 6701 chunks.push(chunk); 6702 } 6703 return this._requestChunks(chunks); 6704 } 6705 requestRanges(ranges = []) { 6706 const chunksToRequest = []; 6707 for (const range of ranges) { 6708 const beginChunk = this.getBeginChunk(range.begin); 6709 const endChunk = this.getEndChunk(range.end); 6710 for (let chunk = beginChunk; chunk < endChunk; ++chunk) { 6711 if (!chunksToRequest.includes(chunk)) { 6712 chunksToRequest.push(chunk); 6713 } 6714 } 6715 } 6716 chunksToRequest.sort(function (a, b) { 6717 return a - b; 6718 }); 6719 return this._requestChunks(chunksToRequest); 6720 } 6721 groupChunks(chunks) { 6722 const groupedChunks = []; 6723 let beginChunk = -1; 6724 let prevChunk = -1; 6725 for (let i = 0, ii = chunks.length; i < ii; ++i) { 6726 const chunk = chunks[i]; 6727 if (beginChunk < 0) { 6728 beginChunk = chunk; 6729 } 6730 if (prevChunk >= 0 && prevChunk + 1 !== chunk) { 6731 groupedChunks.push({ 6732 beginChunk, 6733 endChunk: prevChunk + 1 6734 }); 6735 beginChunk = chunk; 6736 } 6737 if (i + 1 === chunks.length) { 6738 groupedChunks.push({ 6739 beginChunk, 6740 endChunk: chunk + 1 6741 }); 6742 } 6743 prevChunk = chunk; 6744 } 6745 return groupedChunks; 6746 } 6747 onProgress(args) { 6748 this.msgHandler.send("DocProgress", { 6749 loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, 6750 total: this.length 6751 }); 6752 } 6753 onReceiveData(args) { 6754 const chunk = args.chunk; 6755 const isProgressive = args.begin === undefined; 6756 const begin = isProgressive ? this.progressiveDataLength : args.begin; 6757 const end = begin + chunk.byteLength; 6758 const beginChunk = Math.floor(begin / this.chunkSize); 6759 const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); 6760 if (isProgressive) { 6761 this.stream.onReceiveProgressiveData(chunk); 6762 this.progressiveDataLength = end; 6763 } else { 6764 this.stream.onReceiveData(begin, chunk); 6765 } 6766 if (this.stream.isDataLoaded) { 6767 this._loadedStreamCapability.resolve(this.stream); 6768 } 6769 const loadedRequests = []; 6770 for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { 6771 const requestIds = this._requestsByChunk.get(curChunk); 6772 if (!requestIds) { 6773 continue; 6774 } 6775 this._requestsByChunk.delete(curChunk); 6776 for (const requestId of requestIds) { 6777 const chunksNeeded = this._chunksNeededByRequest.get(requestId); 6778 if (chunksNeeded.has(curChunk)) { 6779 chunksNeeded.delete(curChunk); 6780 } 6781 if (chunksNeeded.size > 0) { 6782 continue; 6783 } 6784 loadedRequests.push(requestId); 6785 } 6786 } 6787 if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { 6788 let nextEmptyChunk; 6789 if (this.stream.numChunksLoaded === 1) { 6790 const lastChunk = this.stream.numChunks - 1; 6791 if (!this.stream.hasChunk(lastChunk)) { 6792 nextEmptyChunk = lastChunk; 6793 } 6794 } else { 6795 nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); 6796 } 6797 if (Number.isInteger(nextEmptyChunk)) { 6798 this._requestChunks([nextEmptyChunk]); 6799 } 6800 } 6801 for (const requestId of loadedRequests) { 6802 const capability = this._promisesByRequest.get(requestId); 6803 this._promisesByRequest.delete(requestId); 6804 capability.resolve(); 6805 } 6806 this.msgHandler.send("DocProgress", { 6807 loaded: this.stream.numChunksLoaded * this.chunkSize, 6808 total: this.length 6809 }); 6810 } 6811 onError(err) { 6812 this._loadedStreamCapability.reject(err); 6813 } 6814 getBeginChunk(begin) { 6815 return Math.floor(begin / this.chunkSize); 6816 } 6817 getEndChunk(end) { 6818 return Math.floor((end - 1) / this.chunkSize) + 1; 6819 } 6820 abort(reason) { 6821 this.aborted = true; 6822 this.pdfNetworkStream?.cancelAllRequests(reason); 6823 for (const capability of this._promisesByRequest.values()) { 6824 capability.reject(reason); 6825 } 6826 } 6827} 6828 6829// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js 6830var esnext_iterator_filter = __webpack_require__(4520); 6831// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.flags.js 6832var es_regexp_flags = __webpack_require__(9479); 6833// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.find.js 6834var esnext_iterator_find = __webpack_require__(2577); 6835// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.reduce.js 6836var esnext_iterator_reduce = __webpack_require__(8872); 6837;// ./src/core/colorspace.js 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) { 6849 const COMPONENTS = 3; 6850 alpha01 = alpha01 !== 1 ? 0 : alpha01; 6851 const xRatio = w1 / w2; 6852 const yRatio = h1 / h2; 6853 let newIndex = 0, 6854 oldIndex; 6855 const xScaled = new Uint16Array(w2); 6856 const w1Scanline = w1 * COMPONENTS; 6857 for (let i = 0; i < w2; i++) { 6858 xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; 6859 } 6860 for (let i = 0; i < h2; i++) { 6861 const py = Math.floor(i * yRatio) * w1Scanline; 6862 for (let j = 0; j < w2; j++) { 6863 oldIndex = py + xScaled[j]; 6864 dest[newIndex++] = src[oldIndex++]; 6865 dest[newIndex++] = src[oldIndex++]; 6866 dest[newIndex++] = src[oldIndex++]; 6867 newIndex += alpha01; 6868 } 6869 } 6870} 6871function resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) { 6872 const xRatio = w1 / w2; 6873 const yRatio = h1 / h2; 6874 let newIndex = 0; 6875 const xScaled = new Uint16Array(w2); 6876 if (alpha01 === 1) { 6877 for (let i = 0; i < w2; i++) { 6878 xScaled[i] = Math.floor(i * xRatio); 6879 } 6880 const src32 = new Uint32Array(src.buffer); 6881 const dest32 = new Uint32Array(dest.buffer); 6882 const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; 6883 for (let i = 0; i < h2; i++) { 6884 const buf = src32.subarray(Math.floor(i * yRatio) * w1); 6885 for (let j = 0; j < w2; j++) { 6886 dest32[newIndex++] |= buf[xScaled[j]] & rgbMask; 6887 } 6888 } 6889 } else { 6890 const COMPONENTS = 4; 6891 const w1Scanline = w1 * COMPONENTS; 6892 for (let i = 0; i < w2; i++) { 6893 xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; 6894 } 6895 for (let i = 0; i < h2; i++) { 6896 const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline); 6897 for (let j = 0; j < w2; j++) { 6898 const oldIndex = xScaled[j]; 6899 dest[newIndex++] = buf[oldIndex]; 6900 dest[newIndex++] = buf[oldIndex + 1]; 6901 dest[newIndex++] = buf[oldIndex + 2]; 6902 } 6903 } 6904 } 6905} 6906function copyRgbaImage(src, dest, alpha01) { 6907 if (alpha01 === 1) { 6908 const src32 = new Uint32Array(src.buffer); 6909 const dest32 = new Uint32Array(dest.buffer); 6910 const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; 6911 for (let i = 0, ii = src32.length; i < ii; i++) { 6912 dest32[i] |= src32[i] & rgbMask; 6913 } 6914 } else { 6915 let j = 0; 6916 for (let i = 0, ii = src.length; i < ii; i += 4) { 6917 dest[j++] = src[i]; 6918 dest[j++] = src[i + 1]; 6919 dest[j++] = src[i + 2]; 6920 } 6921 } 6922} 6923class ColorSpace { 6924 constructor(name, numComps) { 6925 this.name = name; 6926 this.numComps = numComps; 6927 } 6928 getRgb(src, srcOffset) { 6929 const rgb = new Uint8ClampedArray(3); 6930 this.getRgbItem(src, srcOffset, rgb, 0); 6931 return rgb; 6932 } 6933 getRgbItem(src, srcOffset, dest, destOffset) { 6934 unreachable("Should not call ColorSpace.getRgbItem"); 6935 } 6936 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 6937 unreachable("Should not call ColorSpace.getRgbBuffer"); 6938 } 6939 getOutputLength(inputLength, alpha01) { 6940 unreachable("Should not call ColorSpace.getOutputLength"); 6941 } 6942 isPassthrough(bits) { 6943 return false; 6944 } 6945 isDefaultDecode(decodeMap, bpc) { 6946 return ColorSpace.isDefaultDecode(decodeMap, this.numComps); 6947 } 6948 fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { 6949 const count = originalWidth * originalHeight; 6950 let rgbBuf = null; 6951 const numComponentColors = 1 << bpc; 6952 const needsResizing = originalHeight !== height || originalWidth !== width; 6953 if (this.isPassthrough(bpc)) { 6954 rgbBuf = comps; 6955 } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") { 6956 const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); 6957 for (let i = 0; i < numComponentColors; i++) { 6958 allColors[i] = i; 6959 } 6960 const colorMap = new Uint8ClampedArray(numComponentColors * 3); 6961 this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0); 6962 if (!needsResizing) { 6963 let destPos = 0; 6964 for (let i = 0; i < count; ++i) { 6965 const key = comps[i] * 3; 6966 dest[destPos++] = colorMap[key]; 6967 dest[destPos++] = colorMap[key + 1]; 6968 dest[destPos++] = colorMap[key + 2]; 6969 destPos += alpha01; 6970 } 6971 } else { 6972 rgbBuf = new Uint8Array(count * 3); 6973 let rgbPos = 0; 6974 for (let i = 0; i < count; ++i) { 6975 const key = comps[i] * 3; 6976 rgbBuf[rgbPos++] = colorMap[key]; 6977 rgbBuf[rgbPos++] = colorMap[key + 1]; 6978 rgbBuf[rgbPos++] = colorMap[key + 2]; 6979 } 6980 } 6981 } else if (!needsResizing) { 6982 this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01); 6983 } else { 6984 rgbBuf = new Uint8ClampedArray(count * 3); 6985 this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0); 6986 } 6987 if (rgbBuf) { 6988 if (needsResizing) { 6989 resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01); 6990 } else { 6991 let destPos = 0, 6992 rgbPos = 0; 6993 for (let i = 0, ii = width * actualHeight; i < ii; i++) { 6994 dest[destPos++] = rgbBuf[rgbPos++]; 6995 dest[destPos++] = rgbBuf[rgbPos++]; 6996 dest[destPos++] = rgbBuf[rgbPos++]; 6997 destPos += alpha01; 6998 } 6999 } 7000 } 7001 } 7002 get usesZeroToOneRange() { 7003 return shadow(this, "usesZeroToOneRange", true); 7004 } 7005 static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) { 7006 if (!localColorSpaceCache) { 7007 throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.'); 7008 } 7009 if (!parsedColorSpace) { 7010 throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.'); 7011 } 7012 let csName, csRef; 7013 if (cacheKey instanceof Ref) { 7014 csRef = cacheKey; 7015 cacheKey = xref.fetch(cacheKey); 7016 } 7017 if (cacheKey instanceof Name) { 7018 csName = cacheKey.name; 7019 } 7020 if (csName || csRef) { 7021 localColorSpaceCache.set(csName, csRef, parsedColorSpace); 7022 } 7023 } 7024 static getCached(cacheKey, xref, localColorSpaceCache) { 7025 if (!localColorSpaceCache) { 7026 throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.'); 7027 } 7028 if (cacheKey instanceof Ref) { 7029 const localColorSpace = localColorSpaceCache.getByRef(cacheKey); 7030 if (localColorSpace) { 7031 return localColorSpace; 7032 } 7033 try { 7034 cacheKey = xref.fetch(cacheKey); 7035 } catch (ex) { 7036 if (ex instanceof MissingDataException) { 7037 throw ex; 7038 } 7039 } 7040 } 7041 if (cacheKey instanceof Name) { 7042 const localColorSpace = localColorSpaceCache.getByName(cacheKey.name); 7043 if (localColorSpace) { 7044 return localColorSpace; 7045 } 7046 } 7047 return null; 7048 } 7049 static async parseAsync({ 7050 cs, 7051 xref, 7052 resources = null, 7053 pdfFunctionFactory, 7054 localColorSpaceCache 7055 }) { 7056 const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); 7057 this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); 7058 return parsedColorSpace; 7059 } 7060 static parse({ 7061 cs, 7062 xref, 7063 resources = null, 7064 pdfFunctionFactory, 7065 localColorSpaceCache 7066 }) { 7067 const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache); 7068 if (cachedColorSpace) { 7069 return cachedColorSpace; 7070 } 7071 const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); 7072 this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); 7073 return parsedColorSpace; 7074 } 7075 static _parse(cs, xref, resources = null, pdfFunctionFactory) { 7076 cs = xref.fetchIfRef(cs); 7077 if (cs instanceof Name) { 7078 switch (cs.name) { 7079 case "G": 7080 case "DeviceGray": 7081 return this.singletons.gray; 7082 case "RGB":
7083 case "DeviceRGB": 7084 return this.singletons.rgb; 7085 case "DeviceRGBA": 7086 return this.singletons.rgba; 7087 case "CMYK": 7088 case "DeviceCMYK": 7089 return this.singletons.cmyk; 7090 case "Pattern": 7091 return new PatternCS(null); 7092 default: 7093 if (resources instanceof Dict) { 7094 const colorSpaces = resources.get("ColorSpace"); 7095 if (colorSpaces instanceof Dict) { 7096 const resourcesCS = colorSpaces.get(cs.name); 7097 if (resourcesCS) { 7098 if (resourcesCS instanceof Name) { 7099 return this._parse(resourcesCS, xref, resources, pdfFunctionFactory); 7100 } 7101 cs = resourcesCS; 7102 break; 7103 } 7104 } 7105 } 7106 warn(`Unrecognized ColorSpace: ${cs.name}`); 7107 return this.singletons.gray; 7108 } 7109 } 7110 if (Array.isArray(cs)) { 7111 const mode = xref.fetchIfRef(cs[0]).name; 7112 let params, numComps, baseCS, whitePoint, blackPoint, gamma; 7113 switch (mode) { 7114 case "G": 7115 case "DeviceGray": 7116 return this.singletons.gray; 7117 case "RGB": 7118 case "DeviceRGB": 7119 return this.singletons.rgb; 7120 case "CMYK": 7121 case "DeviceCMYK": 7122 return this.singletons.cmyk; 7123 case "CalGray": 7124 params = xref.fetchIfRef(cs[1]); 7125 whitePoint = params.getArray("WhitePoint"); 7126 blackPoint = params.getArray("BlackPoint"); 7127 gamma = params.get("Gamma"); 7128 return new CalGrayCS(whitePoint, blackPoint, gamma); 7129 case "CalRGB": 7130 params = xref.fetchIfRef(cs[1]); 7131 whitePoint = params.getArray("WhitePoint"); 7132 blackPoint = params.getArray("BlackPoint"); 7133 gamma = params.getArray("Gamma"); 7134 const matrix = params.getArray("Matrix"); 7135 return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); 7136 case "ICCBased": 7137 const stream = xref.fetchIfRef(cs[1]); 7138 const dict = stream.dict; 7139 numComps = dict.get("N"); 7140 const alt = dict.get("Alternate"); 7141 if (alt) { 7142 const altCS = this._parse(alt, xref, resources, pdfFunctionFactory); 7143 if (altCS.numComps === numComps) { 7144 return altCS; 7145 } 7146 warn("ICCBased color space: Ignoring incorrect /Alternate entry."); 7147 } 7148 if (numComps === 1) { 7149 return this.singletons.gray; 7150 } else if (numComps === 3) { 7151 return this.singletons.rgb; 7152 } else if (numComps === 4) { 7153 return this.singletons.cmyk; 7154 } 7155 break; 7156 case "Pattern": 7157 baseCS = cs[1] || null; 7158 if (baseCS) { 7159 baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory); 7160 } 7161 return new PatternCS(baseCS); 7162 case "I": 7163 case "Indexed": 7164 baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory); 7165 const hiVal = Math.max(0, Math.min(xref.fetchIfRef(cs[2]), 255)); 7166 const lookup = xref.fetchIfRef(cs[3]); 7167 return new IndexedCS(baseCS, hiVal, lookup); 7168 case "Separation": 7169 case "DeviceN": 7170 const name = xref.fetchIfRef(cs[1]); 7171 numComps = Array.isArray(name) ? name.length : 1; 7172 baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory); 7173 const tintFn = pdfFunctionFactory.create(cs[3]); 7174 return new AlternateCS(numComps, baseCS, tintFn); 7175 case "Lab": 7176 params = xref.fetchIfRef(cs[1]); 7177 whitePoint = params.getArray("WhitePoint"); 7178 blackPoint = params.getArray("BlackPoint"); 7179 const range = params.getArray("Range"); 7180 return new LabCS(whitePoint, blackPoint, range); 7181 default: 7182 warn(`Unimplemented ColorSpace object: ${mode}`); 7183 return this.singletons.gray; 7184 } 7185 } 7186 warn(`Unrecognized ColorSpace object: ${cs}`); 7187 return this.singletons.gray; 7188 } 7189 static isDefaultDecode(decode, numComps) { 7190 if (!Array.isArray(decode)) { 7191 return true; 7192 } 7193 if (numComps * 2 !== decode.length) { 7194 warn("The decode map is not the correct length"); 7195 return true; 7196 } 7197 for (let i = 0, ii = decode.length; i < ii; i += 2) { 7198 if (decode[i] !== 0 || decode[i + 1] !== 1) { 7199 return false; 7200 } 7201 } 7202 return true; 7203 } 7204 static get singletons() { 7205 return shadow(this, "singletons", { 7206 get gray() { 7207 return shadow(this, "gray", new DeviceGrayCS()); 7208 }, 7209 get rgb() { 7210 return shadow(this, "rgb", new DeviceRgbCS()); 7211 }, 7212 get rgba() { 7213 return shadow(this, "rgba", new DeviceRgbaCS()); 7214 }, 7215 get cmyk() { 7216 return shadow(this, "cmyk", new DeviceCmykCS()); 7217 } 7218 }); 7219 } 7220} 7221class AlternateCS extends ColorSpace { 7222 constructor(numComps, base, tintFn) { 7223 super("Alternate", numComps); 7224 this.base = base; 7225 this.tintFn = tintFn; 7226 this.tmpBuf = new Float32Array(base.numComps); 7227 }
vendor: 31,362 bytes, lines 7228-8269
7228 getRgbItem(src, srcOffset, dest, destOffset) { 7229 const tmpBuf = this.tmpBuf; 7230 this.tintFn(src, srcOffset, tmpBuf, 0); 7231 this.base.getRgbItem(tmpBuf, 0, dest, destOffset); 7232 } 7233 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7234 const tintFn = this.tintFn; 7235 const base = this.base; 7236 const scale = 1 / ((1 << bits) - 1); 7237 const baseNumComps = base.numComps; 7238 const usesZeroToOneRange = base.usesZeroToOneRange; 7239 const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0; 7240 let pos = isPassthrough ? destOffset : 0; 7241 const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count); 7242 const numComps = this.numComps; 7243 const scaled = new Float32Array(numComps); 7244 const tinted = new Float32Array(baseNumComps); 7245 let i, j; 7246 for (i = 0; i < count; i++) { 7247 for (j = 0; j < numComps; j++) { 7248 scaled[j] = src[srcOffset++] * scale; 7249 } 7250 tintFn(scaled, 0, tinted, 0); 7251 if (usesZeroToOneRange) { 7252 for (j = 0; j < baseNumComps; j++) { 7253 baseBuf[pos++] = tinted[j] * 255; 7254 } 7255 } else { 7256 base.getRgbItem(tinted, 0, baseBuf, pos); 7257 pos += baseNumComps; 7258 } 7259 } 7260 if (!isPassthrough) { 7261 base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); 7262 } 7263 } 7264 getOutputLength(inputLength, alpha01) { 7265 return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01); 7266 } 7267} 7268class PatternCS extends ColorSpace { 7269 constructor(baseCS) { 7270 super("Pattern", null); 7271 this.base = baseCS; 7272 } 7273 isDefaultDecode(decodeMap, bpc) { 7274 unreachable("Should not call PatternCS.isDefaultDecode"); 7275 } 7276} 7277class IndexedCS extends ColorSpace { 7278 constructor(base, highVal, lookup) { 7279 super("Indexed", 1); 7280 this.base = base; 7281 const length = base.numComps * (highVal + 1); 7282 this.lookup = new Uint8Array(length); 7283 if (lookup instanceof BaseStream) { 7284 const bytes = lookup.getBytes(length); 7285 this.lookup.set(bytes); 7286 } else if (typeof lookup === "string") { 7287 for (let i = 0; i < length; ++i) { 7288 this.lookup[i] = lookup.charCodeAt(i) & 0xff; 7289 } 7290 } else { 7291 throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`); 7292 } 7293 } 7294 getRgbItem(src, srcOffset, dest, destOffset) { 7295 const numComps = this.base.numComps; 7296 const start = src[srcOffset] * numComps; 7297 this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0); 7298 } 7299 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7300 const base = this.base; 7301 const numComps = base.numComps; 7302 const outputDelta = base.getOutputLength(numComps, alpha01); 7303 const lookup = this.lookup; 7304 for (let i = 0; i < count; ++i) { 7305 const lookupPos = src[srcOffset++] * numComps; 7306 base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); 7307 destOffset += outputDelta; 7308 } 7309 } 7310 getOutputLength(inputLength, alpha01) { 7311 return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); 7312 } 7313 isDefaultDecode(decodeMap, bpc) { 7314 if (!Array.isArray(decodeMap)) { 7315 return true; 7316 } 7317 if (decodeMap.length !== 2) { 7318 warn("Decode map length is not correct"); 7319 return true; 7320 } 7321 if (!Number.isInteger(bpc) || bpc < 1) { 7322 warn("Bits per component is not correct"); 7323 return true; 7324 } 7325 return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1; 7326 } 7327} 7328class DeviceGrayCS extends ColorSpace { 7329 constructor() { 7330 super("DeviceGray", 1); 7331 } 7332 getRgbItem(src, srcOffset, dest, destOffset) { 7333 const c = src[srcOffset] * 255; 7334 dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; 7335 } 7336 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7337 const scale = 255 / ((1 << bits) - 1); 7338 let j = srcOffset, 7339 q = destOffset; 7340 for (let i = 0; i < count; ++i) { 7341 const c = scale * src[j++]; 7342 dest[q++] = c; 7343 dest[q++] = c; 7344 dest[q++] = c; 7345 q += alpha01; 7346 } 7347 } 7348 getOutputLength(inputLength, alpha01) { 7349 return inputLength * (3 + alpha01); 7350 } 7351} 7352class DeviceRgbCS extends ColorSpace { 7353 constructor() { 7354 super("DeviceRGB", 3); 7355 } 7356 getRgbItem(src, srcOffset, dest, destOffset) { 7357 dest[destOffset] = src[srcOffset] * 255; 7358 dest[destOffset + 1] = src[srcOffset + 1] * 255; 7359 dest[destOffset + 2] = src[srcOffset + 2] * 255; 7360 } 7361 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7362 if (bits === 8 && alpha01 === 0) { 7363 dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); 7364 return; 7365 } 7366 const scale = 255 / ((1 << bits) - 1); 7367 let j = srcOffset, 7368 q = destOffset; 7369 for (let i = 0; i < count; ++i) { 7370 dest[q++] = scale * src[j++]; 7371 dest[q++] = scale * src[j++]; 7372 dest[q++] = scale * src[j++]; 7373 q += alpha01; 7374 } 7375 } 7376 getOutputLength(inputLength, alpha01) { 7377 return inputLength * (3 + alpha01) / 3 | 0; 7378 } 7379 isPassthrough(bits) { 7380 return bits === 8; 7381 } 7382} 7383class DeviceRgbaCS extends ColorSpace { 7384 constructor() { 7385 super("DeviceRGBA", 4); 7386 } 7387 getOutputLength(inputLength, _alpha01) { 7388 return inputLength * 4; 7389 } 7390 isPassthrough(bits) { 7391 return bits === 8; 7392 } 7393 fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { 7394 if (originalHeight !== height || originalWidth !== width) { 7395 resizeRgbaImage(comps, dest, originalWidth, originalHeight, width, height, alpha01); 7396 } else { 7397 copyRgbaImage(comps, dest, alpha01); 7398 } 7399 } 7400} 7401class DeviceCmykCS extends ColorSpace { 7402 constructor() { 7403 super("DeviceCMYK", 4); 7404 } 7405 #toRgb(src, srcOffset, srcScale, dest, destOffset) { 7406 const c = src[srcOffset] * srcScale; 7407 const m = src[srcOffset + 1] * srcScale; 7408 const y = src[srcOffset + 2] * srcScale; 7409 const k = src[srcOffset + 3] * srcScale; 7410 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); 7411 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); 7412 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); 7413 } 7414 getRgbItem(src, srcOffset, dest, destOffset) { 7415 this.#toRgb(src, srcOffset, 1, dest, destOffset); 7416 } 7417 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7418 const scale = 1 / ((1 << bits) - 1); 7419 for (let i = 0; i < count; i++) { 7420 this.#toRgb(src, srcOffset, scale, dest, destOffset); 7421 srcOffset += 4; 7422 destOffset += 3 + alpha01; 7423 } 7424 } 7425 getOutputLength(inputLength, alpha01) { 7426 return inputLength / 4 * (3 + alpha01) | 0; 7427 } 7428} 7429class CalGrayCS extends ColorSpace { 7430 constructor(whitePoint, blackPoint, gamma) { 7431 super("CalGray", 1); 7432 if (!whitePoint) { 7433 throw new FormatError("WhitePoint missing - required for color space CalGray"); 7434 } 7435 [this.XW, this.YW, this.ZW] = whitePoint; 7436 [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; 7437 this.G = gamma || 1; 7438 if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { 7439 throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); 7440 } 7441 if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { 7442 info(`Invalid BlackPoint for ${this.name}, falling back to default.`); 7443 this.XB = this.YB = this.ZB = 0; 7444 } 7445 if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { 7446 warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`); 7447 } 7448 if (this.G < 1) { 7449 info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`); 7450 this.G = 1; 7451 } 7452 } 7453 #toRgb(src, srcOffset, dest, destOffset, scale) { 7454 const A = src[srcOffset] * scale; 7455 const AG = A ** this.G; 7456 const L = this.YW * AG; 7457 const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0); 7458 dest[destOffset] = val; 7459 dest[destOffset + 1] = val; 7460 dest[destOffset + 2] = val; 7461 } 7462 getRgbItem(src, srcOffset, dest, destOffset) { 7463 this.#toRgb(src, srcOffset, dest, destOffset, 1); 7464 } 7465 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7466 const scale = 1 / ((1 << bits) - 1); 7467 for (let i = 0; i < count; ++i) { 7468 this.#toRgb(src, srcOffset, dest, destOffset, scale); 7469 srcOffset += 1; 7470 destOffset += 3 + alpha01; 7471 } 7472 } 7473 getOutputLength(inputLength, alpha01) { 7474 return inputLength * (3 + alpha01); 7475 } 7476} 7477class CalRGBCS extends ColorSpace { 7478 static #BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]); 7479 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]); 7480 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]); 7481 static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); 7482 static #tempNormalizeMatrix = new Float32Array(3); 7483 static #tempConvertMatrix1 = new Float32Array(3); 7484 static #tempConvertMatrix2 = new Float32Array(3); 7485 static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0; 7486 constructor(whitePoint, blackPoint, gamma, matrix) { 7487 super("CalRGB", 3); 7488 if (!whitePoint) { 7489 throw new FormatError("WhitePoint missing - required for color space CalRGB"); 7490 } 7491 const [XW, YW, ZW] = this.whitePoint = whitePoint; 7492 const [XB, YB, ZB] = this.blackPoint = blackPoint || new Float32Array(3); 7493 [this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]); 7494 [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]); 7495 if (XW < 0 || ZW < 0 || YW !== 1) { 7496 throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); 7497 } 7498 if (XB < 0 || YB < 0 || ZB < 0) { 7499 info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default."); 7500 this.blackPoint = new Float32Array(3); 7501 } 7502 if (this.GR < 0 || this.GG < 0 || this.GB < 0) { 7503 info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`); 7504 this.GR = this.GG = this.GB = 1; 7505 } 7506 } 7507 #matrixProduct(a, b, result) { 7508 result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; 7509 result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; 7510 result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; 7511 } 7512 #toFlat(sourceWhitePoint, LMS, result) { 7513 result[0] = LMS[0] * 1 / sourceWhitePoint[0]; 7514 result[1] = LMS[1] * 1 / sourceWhitePoint[1]; 7515 result[2] = LMS[2] * 1 / sourceWhitePoint[2]; 7516 } 7517 #toD65(sourceWhitePoint, LMS, result) { 7518 const D65X = 0.95047; 7519 const D65Y = 1; 7520 const D65Z = 1.08883; 7521 result[0] = LMS[0] * D65X / sourceWhitePoint[0]; 7522 result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; 7523 result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; 7524 } 7525 #sRGBTransferFunction(color) { 7526 if (color <= 0.0031308) { 7527 return this.#adjustToRange(0, 1, 12.92 * color); 7528 } 7529 if (color >= 0.99554525) { 7530 return 1; 7531 } 7532 return this.#adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055); 7533 } 7534 #adjustToRange(min, max, value) { 7535 return Math.max(min, Math.min(max, value)); 7536 } 7537 #decodeL(L) { 7538 if (L < 0) { 7539 return -this.#decodeL(-L); 7540 } 7541 if (L > 8.0) { 7542 return ((L + 16) / 116) ** 3; 7543 } 7544 return L * CalRGBCS.#DECODE_L_CONSTANT; 7545 } 7546 #compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { 7547 if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) { 7548 result[0] = XYZ_Flat[0]; 7549 result[1] = XYZ_Flat[1]; 7550 result[2] = XYZ_Flat[2]; 7551 return; 7552 } 7553 const zeroDecodeL = this.#decodeL(0); 7554 const X_DST = zeroDecodeL; 7555 const X_SRC = this.#decodeL(sourceBlackPoint[0]); 7556 const Y_DST = zeroDecodeL; 7557 const Y_SRC = this.#decodeL(sourceBlackPoint[1]); 7558 const Z_DST = zeroDecodeL; 7559 const Z_SRC = this.#decodeL(sourceBlackPoint[2]); 7560 const X_Scale = (1 - X_DST) / (1 - X_SRC); 7561 const X_Offset = 1 - X_Scale; 7562 const Y_Scale = (1 - Y_DST) / (1 - Y_SRC); 7563 const Y_Offset = 1 - Y_Scale; 7564 const Z_Scale = (1 - Z_DST) / (1 - Z_SRC); 7565 const Z_Offset = 1 - Z_Scale; 7566 result[0] = XYZ_Flat[0] * X_Scale + X_Offset; 7567 result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; 7568 result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; 7569 } 7570 #normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { 7571 if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { 7572 result[0] = XYZ_In[0]; 7573 result[1] = XYZ_In[1]; 7574 result[2] = XYZ_In[2]; 7575 return; 7576 } 7577 const LMS = result; 7578 this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); 7579 const LMS_Flat = CalRGBCS.#tempNormalizeMatrix; 7580 this.#toFlat(sourceWhitePoint, LMS, LMS_Flat); 7581 this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); 7582 } 7583 #normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { 7584 const LMS = result; 7585 this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); 7586 const LMS_D65 = CalRGBCS.#tempNormalizeMatrix; 7587 this.#toD65(sourceWhitePoint, LMS, LMS_D65); 7588 this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); 7589 } 7590 #toRgb(src, srcOffset, dest, destOffset, scale) { 7591 const A = this.#adjustToRange(0, 1, src[srcOffset] * scale); 7592 const B = this.#adjustToRange(0, 1, src[srcOffset + 1] * scale); 7593 const C = this.#adjustToRange(0, 1, src[srcOffset + 2] * scale); 7594 const AGR = A === 1 ? 1 : A ** this.GR; 7595 const BGG = B === 1 ? 1 : B ** this.GG; 7596 const CGB = C === 1 ? 1 : C ** this.GB; 7597 const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB; 7598 const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB; 7599 const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB; 7600 const XYZ = CalRGBCS.#tempConvertMatrix1; 7601 XYZ[0] = X; 7602 XYZ[1] = Y; 7603 XYZ[2] = Z; 7604 const XYZ_Flat = CalRGBCS.#tempConvertMatrix2; 7605 this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat); 7606 const XYZ_Black = CalRGBCS.#tempConvertMatrix1; 7607 this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black); 7608 const XYZ_D65 = CalRGBCS.#tempConvertMatrix2; 7609 this.#normalizeWhitePointToD65(CalRGBCS.#FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); 7610 const SRGB = CalRGBCS.#tempConvertMatrix1; 7611 this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); 7612 dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255; 7613 dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255; 7614 dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255; 7615 } 7616 getRgbItem(src, srcOffset, dest, destOffset) { 7617 this.#toRgb(src, srcOffset, dest, destOffset, 1); 7618 } 7619 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7620 const scale = 1 / ((1 << bits) - 1); 7621 for (let i = 0; i < count; ++i) { 7622 this.#toRgb(src, srcOffset, dest, destOffset, scale); 7623 srcOffset += 3; 7624 destOffset += 3 + alpha01; 7625 } 7626 } 7627 getOutputLength(inputLength, alpha01) { 7628 return inputLength * (3 + alpha01) / 3 | 0; 7629 } 7630} 7631class LabCS extends ColorSpace { 7632 constructor(whitePoint, blackPoint, range) { 7633 super("Lab", 3); 7634 if (!whitePoint) { 7635 throw new FormatError("WhitePoint missing - required for color space Lab"); 7636 } 7637 [this.XW, this.YW, this.ZW] = whitePoint; 7638 [this.amin, this.amax, this.bmin, this.bmax] = range || [-100, 100, -100, 100]; 7639 [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; 7640 if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { 7641 throw new FormatError("Invalid WhitePoint components, no fallback available"); 7642 } 7643 if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { 7644 info("Invalid BlackPoint, falling back to default"); 7645 this.XB = this.YB = this.ZB = 0; 7646 } 7647 if (this.amin > this.amax || this.bmin > this.bmax) { 7648 info("Invalid Range, falling back to defaults"); 7649 this.amin = -100; 7650 this.amax = 100; 7651 this.bmin = -100; 7652 this.bmax = 100; 7653 } 7654 } 7655 #fn_g(x) { 7656 return x >= 6 / 29 ? x ** 3 : 108 / 841 * (x - 4 / 29); 7657 } 7658 #decode(value, high1, low2, high2) { 7659 return low2 + value * (high2 - low2) / high1; 7660 } 7661 #toRgb(src, srcOffset, maxVal, dest, destOffset) { 7662 let Ls = src[srcOffset]; 7663 let as = src[srcOffset + 1]; 7664 let bs = src[srcOffset + 2]; 7665 if (maxVal !== false) { 7666 Ls = this.#decode(Ls, maxVal, 0, 100); 7667 as = this.#decode(as, maxVal, this.amin, this.amax); 7668 bs = this.#decode(bs, maxVal, this.bmin, this.bmax); 7669 } 7670 if (as > this.amax) { 7671 as = this.amax; 7672 } else if (as < this.amin) { 7673 as = this.amin; 7674 } 7675 if (bs > this.bmax) { 7676 bs = this.bmax; 7677 } else if (bs < this.bmin) { 7678 bs = this.bmin; 7679 } 7680 const M = (Ls + 16) / 116; 7681 const L = M + as / 500; 7682 const N = M - bs / 200; 7683 const X = this.XW * this.#fn_g(L); 7684 const Y = this.YW * this.#fn_g(M); 7685 const Z = this.ZW * this.#fn_g(N); 7686 let r, g, b; 7687 if (this.ZW < 1) { 7688 r = X * 3.1339 + Y * -1.617 + Z * -0.4906; 7689 g = X * -0.9785 + Y * 1.916 + Z * 0.0333; 7690 b = X * 0.072 + Y * -0.229 + Z * 1.4057; 7691 } else { 7692 r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; 7693 g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; 7694 b = X * 0.0557 + Y * -0.204 + Z * 1.057; 7695 } 7696 dest[destOffset] = Math.sqrt(r) * 255; 7697 dest[destOffset + 1] = Math.sqrt(g) * 255; 7698 dest[destOffset + 2] = Math.sqrt(b) * 255; 7699 } 7700 getRgbItem(src, srcOffset, dest, destOffset) { 7701 this.#toRgb(src, srcOffset, false, dest, destOffset); 7702 } 7703 getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { 7704 const maxVal = (1 << bits) - 1; 7705 for (let i = 0; i < count; i++) { 7706 this.#toRgb(src, srcOffset, maxVal, dest, destOffset); 7707 srcOffset += 3; 7708 destOffset += 3 + alpha01; 7709 } 7710 } 7711 getOutputLength(inputLength, alpha01) { 7712 return inputLength * (3 + alpha01) / 3 | 0; 7713 } 7714 isDefaultDecode(decodeMap, bpc) { 7715 return true; 7716 } 7717 get usesZeroToOneRange() { 7718 return shadow(this, "usesZeroToOneRange", false); 7719 } 7720} 7721 7722// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.for-each.js 7723var esnext_iterator_for_each = __webpack_require__(3949); 7724;// ./src/core/binary_cmap.js 7725 7726 7727 7728 7729 7730 7731 7732function hexToInt(a, size) { 7733 let n = 0; 7734 for (let i = 0; i <= size; i++) { 7735 n = n << 8 | a[i]; 7736 } 7737 return n >>> 0; 7738} 7739function hexToStr(a, size) { 7740 if (size === 1) { 7741 return String.fromCharCode(a[0], a[1]); 7742 } 7743 if (size === 3) { 7744 return String.fromCharCode(a[0], a[1], a[2], a[3]); 7745 } 7746 return String.fromCharCode(...a.subarray(0, size + 1)); 7747} 7748function addHex(a, b, size) { 7749 let c = 0; 7750 for (let i = size; i >= 0; i--) { 7751 c += a[i] + b[i]; 7752 a[i] = c & 255; 7753 c >>= 8; 7754 } 7755} 7756function incHex(a, size) { 7757 let c = 1; 7758 for (let i = size; i >= 0 && c > 0; i--) { 7759 c += a[i]; 7760 a[i] = c & 255; 7761 c >>= 8; 7762 } 7763} 7764const MAX_NUM_SIZE = 16; 7765const MAX_ENCODED_NUM_SIZE = 19; 7766class BinaryCMapStream { 7767 constructor(data) { 7768 this.buffer = data; 7769 this.pos = 0; 7770 this.end = data.length; 7771 this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); 7772 } 7773 readByte() { 7774 if (this.pos >= this.end) { 7775 return -1; 7776 } 7777 return this.buffer[this.pos++]; 7778 } 7779 readNumber() { 7780 let n = 0; 7781 let last; 7782 do { 7783 const b = this.readByte(); 7784 if (b < 0) { 7785 throw new FormatError("unexpected EOF in bcmap"); 7786 } 7787 last = !(b & 0x80); 7788 n = n << 7 | b & 0x7f; 7789 } while (!last); 7790 return n; 7791 } 7792 readSigned() { 7793 const n = this.readNumber(); 7794 return n & 1 ? ~(n >>> 1) : n >>> 1; 7795 } 7796 readHex(num, size) { 7797 num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); 7798 this.pos += size + 1; 7799 } 7800 readHexNumber(num, size) { 7801 let last; 7802 const stack = this.tmpBuf; 7803 let sp = 0; 7804 do { 7805 const b = this.readByte(); 7806 if (b < 0) { 7807 throw new FormatError("unexpected EOF in bcmap"); 7808 } 7809 last = !(b & 0x80); 7810 stack[sp++] = b & 0x7f; 7811 } while (!last); 7812 let i = size, 7813 buffer = 0, 7814 bufferSize = 0; 7815 while (i >= 0) { 7816 while (bufferSize < 8 && stack.length > 0) { 7817 buffer |= stack[--sp] << bufferSize; 7818 bufferSize += 7; 7819 } 7820 num[i] = buffer & 255; 7821 i--; 7822 buffer >>= 8; 7823 bufferSize -= 8; 7824 } 7825 } 7826 readHexSigned(num, size) { 7827 this.readHexNumber(num, size); 7828 const sign = num[size] & 1 ? 255 : 0; 7829 let c = 0; 7830 for (let i = 0; i <= size; i++) { 7831 c = (c & 1) << 8 | num[i]; 7832 num[i] = c >> 1 ^ sign; 7833 } 7834 } 7835 readString() { 7836 const len = this.readNumber(), 7837 buf = new Array(len); 7838 for (let i = 0; i < len; i++) { 7839 buf[i] = this.readNumber(); 7840 } 7841 return String.fromCharCode(...buf); 7842 } 7843} 7844class BinaryCMapReader { 7845 async process(data, cMap, extend) { 7846 const stream = new BinaryCMapStream(data); 7847 const header = stream.readByte(); 7848 cMap.vertical = !!(header & 1); 7849 let useCMap = null; 7850 const start = new Uint8Array(MAX_NUM_SIZE); 7851 const end = new Uint8Array(MAX_NUM_SIZE); 7852 const char = new Uint8Array(MAX_NUM_SIZE); 7853 const charCode = new Uint8Array(MAX_NUM_SIZE); 7854 const tmp = new Uint8Array(MAX_NUM_SIZE); 7855 let code; 7856 let b; 7857 while ((b = stream.readByte()) >= 0) { 7858 const type = b >> 5; 7859 if (type === 7) { 7860 switch (b & 0x1f) { 7861 case 0: 7862 stream.readString(); 7863 break; 7864 case 1: 7865 useCMap = stream.readString(); 7866 break; 7867 } 7868 continue; 7869 } 7870 const sequence = !!(b & 0x10); 7871 const dataSize = b & 15; 7872 if (dataSize + 1 > MAX_NUM_SIZE) { 7873 throw new Error("BinaryCMapReader.process: Invalid dataSize."); 7874 } 7875 const ucs2DataSize = 1; 7876 const subitemsCount = stream.readNumber(); 7877 switch (type) { 7878 case 0: 7879 stream.readHex(start, dataSize); 7880 stream.readHexNumber(end, dataSize); 7881 addHex(end, start, dataSize); 7882 cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); 7883 for (let i = 1; i < subitemsCount; i++) { 7884 incHex(end, dataSize); 7885 stream.readHexNumber(start, dataSize); 7886 addHex(start, end, dataSize); 7887 stream.readHexNumber(end, dataSize); 7888 addHex(end, start, dataSize); 7889 cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); 7890 } 7891 break; 7892 case 1: 7893 stream.readHex(start, dataSize); 7894 stream.readHexNumber(end, dataSize); 7895 addHex(end, start, dataSize); 7896 stream.readNumber(); 7897 for (let i = 1; i < subitemsCount; i++) { 7898 incHex(end, dataSize); 7899 stream.readHexNumber(start, dataSize); 7900 addHex(start, end, dataSize); 7901 stream.readHexNumber(end, dataSize); 7902 addHex(end, start, dataSize); 7903 stream.readNumber(); 7904 } 7905 break; 7906 case 2: 7907 stream.readHex(char, dataSize); 7908 code = stream.readNumber(); 7909 cMap.mapOne(hexToInt(char, dataSize), code); 7910 for (let i = 1; i < subitemsCount; i++) { 7911 incHex(char, dataSize); 7912 if (!sequence) { 7913 stream.readHexNumber(tmp, dataSize); 7914 addHex(char, tmp, dataSize); 7915 } 7916 code = stream.readSigned() + (code + 1); 7917 cMap.mapOne(hexToInt(char, dataSize), code); 7918 } 7919 break; 7920 case 3: 7921 stream.readHex(start, dataSize); 7922 stream.readHexNumber(end, dataSize); 7923 addHex(end, start, dataSize); 7924 code = stream.readNumber(); 7925 cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); 7926 for (let i = 1; i < subitemsCount; i++) { 7927 incHex(end, dataSize); 7928 if (!sequence) { 7929 stream.readHexNumber(start, dataSize); 7930 addHex(start, end, dataSize); 7931 } else { 7932 start.set(end); 7933 } 7934 stream.readHexNumber(end, dataSize); 7935 addHex(end, start, dataSize); 7936 code = stream.readNumber(); 7937 cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); 7938 } 7939 break; 7940 case 4: 7941 stream.readHex(char, ucs2DataSize); 7942 stream.readHex(charCode, dataSize); 7943 cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); 7944 for (let i = 1; i < subitemsCount; i++) { 7945 incHex(char, ucs2DataSize); 7946 if (!sequence) { 7947 stream.readHexNumber(tmp, ucs2DataSize); 7948 addHex(char, tmp, ucs2DataSize); 7949 } 7950 incHex(charCode, dataSize); 7951 stream.readHexSigned(tmp, dataSize); 7952 addHex(charCode, tmp, dataSize); 7953 cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); 7954 } 7955 break; 7956 case 5: 7957 stream.readHex(start, ucs2DataSize); 7958 stream.readHexNumber(end, ucs2DataSize); 7959 addHex(end, start, ucs2DataSize); 7960 stream.readHex(charCode, dataSize); 7961 cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); 7962 for (let i = 1; i < subitemsCount; i++) { 7963 incHex(end, ucs2DataSize); 7964 if (!sequence) { 7965 stream.readHexNumber(start, ucs2DataSize); 7966 addHex(start, end, ucs2DataSize); 7967 } else { 7968 start.set(end); 7969 } 7970 stream.readHexNumber(end, ucs2DataSize); 7971 addHex(end, start, ucs2DataSize); 7972 stream.readHex(charCode, dataSize); 7973 cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); 7974 } 7975 break; 7976 default: 7977 throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); 7978 } 7979 } 7980 if (useCMap) { 7981 return extend(useCMap); 7982 } 7983 return cMap; 7984 } 7985} 7986 7987;// ./src/core/decode_stream.js 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999const emptyBuffer = new Uint8Array(0); 8000class DecodeStream extends BaseStream { 8001 constructor(maybeMinBufferLength) { 8002 super(); 8003 this._rawMinBufferLength = maybeMinBufferLength || 0; 8004 this.pos = 0; 8005 this.bufferLength = 0; 8006 this.eof = false; 8007 this.buffer = emptyBuffer; 8008 this.minBufferLength = 512; 8009 if (maybeMinBufferLength) { 8010 while (this.minBufferLength < maybeMinBufferLength) { 8011 this.minBufferLength *= 2; 8012 } 8013 } 8014 } 8015 get isEmpty() { 8016 while (!this.eof && this.bufferLength === 0) { 8017 this.readBlock(); 8018 } 8019 return this.bufferLength === 0; 8020 } 8021 ensureBuffer(requested) { 8022 const buffer = this.buffer; 8023 if (requested <= buffer.byteLength) { 8024 return buffer; 8025 } 8026 let size = this.minBufferLength; 8027 while (size < requested) { 8028 size *= 2; 8029 } 8030 const buffer2 = new Uint8Array(size); 8031 buffer2.set(buffer); 8032 return this.buffer = buffer2; 8033 } 8034 getByte() { 8035 const pos = this.pos; 8036 while (this.bufferLength <= pos) { 8037 if (this.eof) { 8038 return -1; 8039 } 8040 this.readBlock(); 8041 } 8042 return this.buffer[this.pos++]; 8043 } 8044 getBytes(length, decoderOptions = null) { 8045 const pos = this.pos; 8046 let end; 8047 if (length) { 8048 this.ensureBuffer(pos + length); 8049 end = pos + length; 8050 while (!this.eof && this.bufferLength < end) { 8051 this.readBlock(decoderOptions); 8052 } 8053 const bufEnd = this.bufferLength; 8054 if (end > bufEnd) { 8055 end = bufEnd; 8056 } 8057 } else { 8058 while (!this.eof) { 8059 this.readBlock(decoderOptions); 8060 } 8061 end = this.bufferLength; 8062 } 8063 this.pos = end; 8064 return this.buffer.subarray(pos, end); 8065 } 8066 async getImageData(length, decoderOptions = null) { 8067 if (!this.canAsyncDecodeImageFromBuffer) { 8068 return this.getBytes(length, decoderOptions); 8069 } 8070 const data = await this.stream.asyncGetBytes(); 8071 return this.decodeImage(data, decoderOptions); 8072 } 8073 reset() { 8074 this.pos = 0; 8075 } 8076 makeSubStream(start, length, dict = null) { 8077 if (length === undefined) { 8078 while (!this.eof) { 8079 this.readBlock(); 8080 } 8081 } else { 8082 const end = start + length; 8083 while (this.bufferLength <= end && !this.eof) { 8084 this.readBlock(); 8085 } 8086 } 8087 return new Stream(this.buffer, start, length, dict); 8088 } 8089 getBaseStreams() { 8090 return this.str ? this.str.getBaseStreams() : null; 8091 } 8092} 8093class StreamsSequenceStream extends DecodeStream { 8094 constructor(streams, onError = null) { 8095 streams = streams.filter(s => s instanceof BaseStream); 8096 let maybeLength = 0; 8097 for (const stream of streams) { 8098 maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length; 8099 } 8100 super(maybeLength); 8101 this.streams = streams; 8102 this._onError = onError; 8103 } 8104 readBlock() { 8105 const streams = this.streams; 8106 if (streams.length === 0) { 8107 this.eof = true; 8108 return; 8109 } 8110 const stream = streams.shift(); 8111 let chunk; 8112 try { 8113 chunk = stream.getBytes(); 8114 } catch (reason) { 8115 if (this._onError) { 8116 this._onError(reason, stream.dict?.objId); 8117 return; 8118 } 8119 throw reason; 8120 } 8121 const bufferLength = this.bufferLength; 8122 const newLength = bufferLength + chunk.length; 8123 const buffer = this.ensureBuffer(newLength); 8124 buffer.set(chunk, bufferLength); 8125 this.bufferLength = newLength; 8126 } 8127 getBaseStreams() { 8128 const baseStreamsBuf = []; 8129 for (const stream of this.streams) { 8130 const baseStreams = stream.getBaseStreams(); 8131 if (baseStreams) { 8132 baseStreamsBuf.push(...baseStreams); 8133 } 8134 } 8135 return baseStreamsBuf.length > 0 ? baseStreamsBuf : null; 8136 } 8137} 8138 8139;// ./src/core/ascii_85_stream.js 8140 8141 8142 8143 8144 8145 8146 8147 8148class Ascii85Stream extends DecodeStream { 8149 constructor(str, maybeLength) { 8150 if (maybeLength) { 8151 maybeLength *= 0.8; 8152 } 8153 super(maybeLength); 8154 this.str = str; 8155 this.dict = str.dict; 8156 this.input = new Uint8Array(5); 8157 } 8158 readBlock() { 8159 const TILDA_CHAR = 0x7e; 8160 const Z_LOWER_CHAR = 0x7a; 8161 const EOF = -1; 8162 const str = this.str; 8163 let c = str.getByte(); 8164 while (isWhiteSpace(c)) { 8165 c = str.getByte(); 8166 } 8167 if (c === EOF || c === TILDA_CHAR) { 8168 this.eof = true; 8169 return; 8170 } 8171 const bufferLength = this.bufferLength; 8172 let buffer, i; 8173 if (c === Z_LOWER_CHAR) { 8174 buffer = this.ensureBuffer(bufferLength + 4); 8175 for (i = 0; i < 4; ++i) { 8176 buffer[bufferLength + i] = 0; 8177 } 8178 this.bufferLength += 4; 8179 } else { 8180 const input = this.input; 8181 input[0] = c; 8182 for (i = 1; i < 5; ++i) { 8183 c = str.getByte(); 8184 while (isWhiteSpace(c)) { 8185 c = str.getByte(); 8186 } 8187 input[i] = c; 8188 if (c === EOF || c === TILDA_CHAR) { 8189 break; 8190 } 8191 } 8192 buffer = this.ensureBuffer(bufferLength + i - 1); 8193 this.bufferLength += i - 1; 8194 if (i < 5) { 8195 for (; i < 5; ++i) { 8196 input[i] = 0x21 + 84; 8197 } 8198 this.eof = true; 8199 } 8200 let t = 0; 8201 for (i = 0; i < 5; ++i) { 8202 t = t * 85 + (input[i] - 0x21); 8203 } 8204 for (i = 3; i >= 0; --i) { 8205 buffer[bufferLength + i] = t & 0xff; 8206 t >>= 8; 8207 } 8208 } 8209 } 8210} 8211 8212;// ./src/core/ascii_hex_stream.js 8213 8214class AsciiHexStream extends DecodeStream { 8215 constructor(str, maybeLength) { 8216 if (maybeLength) { 8217 maybeLength *= 0.5; 8218 } 8219 super(maybeLength); 8220 this.str = str; 8221 this.dict = str.dict; 8222 this.firstDigit = -1; 8223 } 8224 readBlock() { 8225 const UPSTREAM_BLOCK_SIZE = 8000; 8226 const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); 8227 if (!bytes.length) { 8228 this.eof = true; 8229 return; 8230 } 8231 const maxDecodeLength = bytes.length + 1 >> 1; 8232 const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); 8233 let bufferLength = this.bufferLength; 8234 let firstDigit = this.firstDigit; 8235 for (const ch of bytes) { 8236 let digit; 8237 if (ch >= 0x30 && ch <= 0x39) { 8238 digit = ch & 0x0f; 8239 } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { 8240 digit = (ch & 0x0f) + 9; 8241 } else if (ch === 0x3e) { 8242 this.eof = true; 8243 break; 8244 } else { 8245 continue; 8246 } 8247 if (firstDigit < 0) { 8248 firstDigit = digit; 8249 } else { 8250 buffer[bufferLength++] = firstDigit << 4 | digit; 8251 firstDigit = -1; 8252 } 8253 } 8254 if (firstDigit >= 0 && this.eof) { 8255 buffer[bufferLength++] = firstDigit << 4; 8256 firstDigit = -1; 8257 } 8258 this.firstDigit = firstDigit; 8259 this.bufferLength = bufferLength; 8260 } 8261} 8262 8263;// ./src/core/ccitt.js 8264 8265 8266 8267 8268 8269
vendor: 11,245 bytes, lines 8270-8288
8270 8271const ccittEOL = -2; 8272const ccittEOF = -1; 8273const twoDimPass = 0; 8274const twoDimHoriz = 1; 8275const twoDimVert0 = 2; 8276const twoDimVertR1 = 3; 8277const twoDimVertL1 = 4; 8278const twoDimVertR2 = 5; 8279const twoDimVertL2 = 6; 8280const twoDimVertR3 = 7; 8281const twoDimVertL3 = 8; 8282const 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]]; 8283const 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]]; 8284const 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]]; 8285const 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]]; 8286const 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]]; 8287const 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]]; 8288class CCITTFaxDecoder {
vendor: 13,332 bytes, lines 8289-8825
8289 constructor(source, options = {}) { 8290 if (typeof source?.next !== "function") { 8291 throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); 8292 } 8293 this.source = source; 8294 this.eof = false; 8295 this.encoding = options.K || 0; 8296 this.eoline = options.EndOfLine || false; 8297 this.byteAlign = options.EncodedByteAlign || false; 8298 this.columns = options.Columns || 1728; 8299 this.rows = options.Rows || 0; 8300 this.eoblock = options.EndOfBlock ?? true; 8301 this.black = options.BlackIs1 || false; 8302 this.codingLine = new Uint32Array(this.columns + 1); 8303 this.refLine = new Uint32Array(this.columns + 2); 8304 this.codingLine[0] = this.columns; 8305 this.codingPos = 0; 8306 this.row = 0; 8307 this.nextLine2D = this.encoding < 0; 8308 this.inputBits = 0; 8309 this.inputBuf = 0; 8310 this.outputBits = 0; 8311 this.rowsDone = false; 8312 let code1; 8313 while ((code1 = this._lookBits(12)) === 0) { 8314 this._eatBits(1); 8315 } 8316 if (code1 === 1) { 8317 this._eatBits(12); 8318 } 8319 if (this.encoding > 0) { 8320 this.nextLine2D = !this._lookBits(1); 8321 this._eatBits(1); 8322 } 8323 } 8324 readNextChar() { 8325 if (this.eof) { 8326 return -1; 8327 } 8328 const refLine = this.refLine; 8329 const codingLine = this.codingLine; 8330 const columns = this.columns; 8331 let refPos, blackPixels, bits, i; 8332 if (this.outputBits === 0) { 8333 if (this.rowsDone) { 8334 this.eof = true; 8335 } 8336 if (this.eof) { 8337 return -1; 8338 } 8339 this.err = false; 8340 let code1, code2, code3; 8341 if (this.nextLine2D) { 8342 for (i = 0; codingLine[i] < columns; ++i) { 8343 refLine[i] = codingLine[i]; 8344 } 8345 refLine[i++] = columns; 8346 refLine[i] = columns; 8347 codingLine[0] = 0; 8348 this.codingPos = 0; 8349 refPos = 0; 8350 blackPixels = 0; 8351 while (codingLine[this.codingPos] < columns) { 8352 code1 = this._getTwoDimCode(); 8353 switch (code1) { 8354 case twoDimPass: 8355 this._addPixels(refLine[refPos + 1], blackPixels); 8356 if (refLine[refPos + 1] < columns) { 8357 refPos += 2; 8358 } 8359 break; 8360 case twoDimHoriz: 8361 code1 = code2 = 0; 8362 if (blackPixels) { 8363 do { 8364 code1 += code3 = this._getBlackCode(); 8365 } while (code3 >= 64); 8366 do { 8367 code2 += code3 = this._getWhiteCode(); 8368 } while (code3 >= 64); 8369 } else { 8370 do { 8371 code1 += code3 = this._getWhiteCode(); 8372 } while (code3 >= 64); 8373 do { 8374 code2 += code3 = this._getBlackCode(); 8375 } while (code3 >= 64); 8376 } 8377 this._addPixels(codingLine[this.codingPos] + code1, blackPixels); 8378 if (codingLine[this.codingPos] < columns) { 8379 this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); 8380 } 8381 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8382 refPos += 2; 8383 } 8384 break; 8385 case twoDimVertR3: 8386 this._addPixels(refLine[refPos] + 3, blackPixels); 8387 blackPixels ^= 1; 8388 if (codingLine[this.codingPos] < columns) { 8389 ++refPos; 8390 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8391 refPos += 2; 8392 } 8393 } 8394 break; 8395 case twoDimVertR2: 8396 this._addPixels(refLine[refPos] + 2, blackPixels); 8397 blackPixels ^= 1; 8398 if (codingLine[this.codingPos] < columns) { 8399 ++refPos; 8400 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8401 refPos += 2; 8402 } 8403 } 8404 break; 8405 case twoDimVertR1: 8406 this._addPixels(refLine[refPos] + 1, blackPixels); 8407 blackPixels ^= 1; 8408 if (codingLine[this.codingPos] < columns) { 8409 ++refPos; 8410 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8411 refPos += 2; 8412 } 8413 } 8414 break; 8415 case twoDimVert0: 8416 this._addPixels(refLine[refPos], blackPixels); 8417 blackPixels ^= 1; 8418 if (codingLine[this.codingPos] < columns) { 8419 ++refPos; 8420 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8421 refPos += 2; 8422 } 8423 } 8424 break; 8425 case twoDimVertL3: 8426 this._addPixelsNeg(refLine[refPos] - 3, blackPixels); 8427 blackPixels ^= 1; 8428 if (codingLine[this.codingPos] < columns) { 8429 if (refPos > 0) { 8430 --refPos; 8431 } else { 8432 ++refPos; 8433 } 8434 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8435 refPos += 2; 8436 } 8437 } 8438 break; 8439 case twoDimVertL2: 8440 this._addPixelsNeg(refLine[refPos] - 2, blackPixels); 8441 blackPixels ^= 1; 8442 if (codingLine[this.codingPos] < columns) { 8443 if (refPos > 0) { 8444 --refPos; 8445 } else { 8446 ++refPos; 8447 } 8448 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8449 refPos += 2; 8450 } 8451 } 8452 break; 8453 case twoDimVertL1: 8454 this._addPixelsNeg(refLine[refPos] - 1, blackPixels); 8455 blackPixels ^= 1; 8456 if (codingLine[this.codingPos] < columns) { 8457 if (refPos > 0) { 8458 --refPos; 8459 } else { 8460 ++refPos; 8461 } 8462 while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { 8463 refPos += 2; 8464 } 8465 } 8466 break; 8467 case ccittEOF: 8468 this._addPixels(columns, 0); 8469 this.eof = true; 8470 break; 8471 default: 8472 info("bad 2d code"); 8473 this._addPixels(columns, 0); 8474 this.err = true; 8475 } 8476 } 8477 } else { 8478 codingLine[0] = 0; 8479 this.codingPos = 0; 8480 blackPixels = 0; 8481 while (codingLine[this.codingPos] < columns) { 8482 code1 = 0; 8483 if (blackPixels) { 8484 do { 8485 code1 += code3 = this._getBlackCode(); 8486 } while (code3 >= 64); 8487 } else { 8488 do { 8489 code1 += code3 = this._getWhiteCode(); 8490 } while (code3 >= 64); 8491 } 8492 this._addPixels(codingLine[this.codingPos] + code1, blackPixels); 8493 blackPixels ^= 1; 8494 } 8495 } 8496 let gotEOL = false; 8497 if (this.byteAlign) { 8498 this.inputBits &= ~7; 8499 } 8500 if (!this.eoblock && this.row === this.rows - 1) { 8501 this.rowsDone = true; 8502 } else { 8503 code1 = this._lookBits(12); 8504 if (this.eoline) { 8505 while (code1 !== ccittEOF && code1 !== 1) { 8506 this._eatBits(1); 8507 code1 = this._lookBits(12); 8508 } 8509 } else { 8510 while (code1 === 0) { 8511 this._eatBits(1); 8512 code1 = this._lookBits(12); 8513 } 8514 } 8515 if (code1 === 1) { 8516 this._eatBits(12); 8517 gotEOL = true; 8518 } else if (code1 === ccittEOF) { 8519 this.eof = true; 8520 } 8521 } 8522 if (!this.eof && this.encoding > 0 && !this.rowsDone) { 8523 this.nextLine2D = !this._lookBits(1); 8524 this._eatBits(1); 8525 } 8526 if (this.eoblock && gotEOL && this.byteAlign) { 8527 code1 = this._lookBits(12); 8528 if (code1 === 1) { 8529 this._eatBits(12); 8530 if (this.encoding > 0) { 8531 this._lookBits(1); 8532 this._eatBits(1); 8533 } 8534 if (this.encoding >= 0) { 8535 for (i = 0; i < 4; ++i) { 8536 code1 = this._lookBits(12); 8537 if (code1 !== 1) { 8538 info("bad rtc code: " + code1); 8539 } 8540 this._eatBits(12); 8541 if (this.encoding > 0) { 8542 this._lookBits(1); 8543 this._eatBits(1); 8544 } 8545 } 8546 } 8547 this.eof = true; 8548 } 8549 } else if (this.err && this.eoline) { 8550 while (true) { 8551 code1 = this._lookBits(13); 8552 if (code1 === ccittEOF) { 8553 this.eof = true; 8554 return -1; 8555 } 8556 if (code1 >> 1 === 1) { 8557 break; 8558 } 8559 this._eatBits(1); 8560 } 8561 this._eatBits(12); 8562 if (this.encoding > 0) { 8563 this._eatBits(1); 8564 this.nextLine2D = !(code1 & 1); 8565 } 8566 } 8567 this.outputBits = codingLine[0] > 0 ? codingLine[this.codingPos = 0] : codingLine[this.codingPos = 1]; 8568 this.row++; 8569 } 8570 let c; 8571 if (this.outputBits >= 8) { 8572 c = this.codingPos & 1 ? 0 : 0xff; 8573 this.outputBits -= 8; 8574 if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { 8575 this.codingPos++; 8576 this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; 8577 } 8578 } else { 8579 bits = 8; 8580 c = 0; 8581 do { 8582 if (typeof this.outputBits !== "number") { 8583 throw new FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.'); 8584 } 8585 if (this.outputBits > bits) { 8586 c <<= bits; 8587 if (!(this.codingPos & 1)) { 8588 c |= 0xff >> 8 - bits; 8589 } 8590 this.outputBits -= bits; 8591 bits = 0; 8592 } else { 8593 c <<= this.outputBits; 8594 if (!(this.codingPos & 1)) { 8595 c |= 0xff >> 8 - this.outputBits; 8596 } 8597 bits -= this.outputBits; 8598 this.outputBits = 0; 8599 if (codingLine[this.codingPos] < columns) { 8600 this.codingPos++; 8601 this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; 8602 } else if (bits > 0) { 8603 c <<= bits; 8604 bits = 0; 8605 } 8606 } 8607 } while (bits); 8608 } 8609 if (this.black) { 8610 c ^= 0xff; 8611 } 8612 return c; 8613 } 8614 _addPixels(a1, blackPixels) { 8615 const codingLine = this.codingLine; 8616 let codingPos = this.codingPos; 8617 if (a1 > codingLine[codingPos]) { 8618 if (a1 > this.columns) { 8619 info("row is wrong length"); 8620 this.err = true; 8621 a1 = this.columns; 8622 } 8623 if (codingPos & 1 ^ blackPixels) { 8624 ++codingPos; 8625 } 8626 codingLine[codingPos] = a1; 8627 } 8628 this.codingPos = codingPos; 8629 } 8630 _addPixelsNeg(a1, blackPixels) { 8631 const codingLine = this.codingLine; 8632 let codingPos = this.codingPos; 8633 if (a1 > codingLine[codingPos]) { 8634 if (a1 > this.columns) { 8635 info("row is wrong length"); 8636 this.err = true; 8637 a1 = this.columns; 8638 } 8639 if (codingPos & 1 ^ blackPixels) { 8640 ++codingPos; 8641 } 8642 codingLine[codingPos] = a1; 8643 } else if (a1 < codingLine[codingPos]) { 8644 if (a1 < 0) { 8645 info("invalid code"); 8646 this.err = true; 8647 a1 = 0; 8648 } 8649 while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { 8650 --codingPos; 8651 } 8652 codingLine[codingPos] = a1; 8653 } 8654 this.codingPos = codingPos; 8655 } 8656 _findTableCode(start, end, table, limit) { 8657 const limitValue = limit || 0; 8658 for (let i = start; i <= end; ++i) { 8659 let code = this._lookBits(i); 8660 if (code === ccittEOF) { 8661 return [true, 1, false]; 8662 } 8663 if (i < end) { 8664 code <<= end - i; 8665 } 8666 if (!limitValue || code >= limitValue) { 8667 const p = table[code - limitValue]; 8668 if (p[0] === i) { 8669 this._eatBits(i); 8670 return [true, p[1], true]; 8671 } 8672 } 8673 } 8674 return [false, 0, false]; 8675 } 8676 _getTwoDimCode() { 8677 let code = 0; 8678 let p; 8679 if (this.eoblock) { 8680 code = this._lookBits(7); 8681 p = twoDimTable[code]; 8682 if (p?.[0] > 0) { 8683 this._eatBits(p[0]); 8684 return p[1]; 8685 } 8686 } else { 8687 const result = this._findTableCode(1, 7, twoDimTable); 8688 if (result[0] && result[2]) { 8689 return result[1]; 8690 } 8691 } 8692 info("Bad two dim code"); 8693 return ccittEOF; 8694 } 8695 _getWhiteCode() { 8696 let code = 0; 8697 let p; 8698 if (this.eoblock) { 8699 code = this._lookBits(12); 8700 if (code === ccittEOF) { 8701 return 1; 8702 } 8703 p = code >> 5 === 0 ? whiteTable1[code] : whiteTable2[code >> 3]; 8704 if (p[0] > 0) { 8705 this._eatBits(p[0]); 8706 return p[1]; 8707 } 8708 } else { 8709 let result = this._findTableCode(1, 9, whiteTable2); 8710 if (result[0]) { 8711 return result[1]; 8712 } 8713 result = this._findTableCode(11, 12, whiteTable1); 8714 if (result[0]) { 8715 return result[1]; 8716 } 8717 } 8718 info("bad white code"); 8719 this._eatBits(1); 8720 return 1; 8721 } 8722 _getBlackCode() { 8723 let code, p; 8724 if (this.eoblock) { 8725 code = this._lookBits(13); 8726 if (code === ccittEOF) { 8727 return 1; 8728 } 8729 if (code >> 7 === 0) { 8730 p = blackTable1[code]; 8731 } else if (code >> 9 === 0 && code >> 7 !== 0) { 8732 p = blackTable2[(code >> 1) - 64]; 8733 } else { 8734 p = blackTable3[code >> 7]; 8735 } 8736 if (p[0] > 0) { 8737 this._eatBits(p[0]); 8738 return p[1]; 8739 } 8740 } else { 8741 let result = this._findTableCode(2, 6, blackTable3); 8742 if (result[0]) { 8743 return result[1]; 8744 } 8745 result = this._findTableCode(7, 12, blackTable2, 64); 8746 if (result[0]) { 8747 return result[1]; 8748 } 8749 result = this._findTableCode(10, 13, blackTable1); 8750 if (result[0]) { 8751 return result[1]; 8752 } 8753 } 8754 info("bad black code"); 8755 this._eatBits(1); 8756 return 1; 8757 } 8758 _lookBits(n) { 8759 let c; 8760 while (this.inputBits < n) { 8761 if ((c = this.source.next()) === -1) { 8762 if (this.inputBits === 0) { 8763 return ccittEOF; 8764 } 8765 return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n; 8766 } 8767 this.inputBuf = this.inputBuf << 8 | c; 8768 this.inputBits += 8; 8769 } 8770 return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n; 8771 } 8772 _eatBits(n) { 8773 if ((this.inputBits -= n) < 0) { 8774 this.inputBits = 0; 8775 } 8776 } 8777} 8778 8779;// ./src/core/ccitt_stream.js 8780 8781 8782 8783class CCITTFaxStream extends DecodeStream { 8784 constructor(str, maybeLength, params) { 8785 super(maybeLength); 8786 this.str = str; 8787 this.dict = str.dict; 8788 if (!(params instanceof Dict)) { 8789 params = Dict.empty; 8790 } 8791 const source = { 8792 next() { 8793 return str.getByte(); 8794 } 8795 }; 8796 this.ccittFaxDecoder = new CCITTFaxDecoder(source, { 8797 K: params.get("K"), 8798 EndOfLine: params.get("EndOfLine"), 8799 EncodedByteAlign: params.get("EncodedByteAlign"), 8800 Columns: params.get("Columns"), 8801 Rows: params.get("Rows"), 8802 EndOfBlock: params.get("EndOfBlock"), 8803 BlackIs1: params.get("BlackIs1") 8804 }); 8805 } 8806 readBlock() { 8807 while (!this.eof) { 8808 const c = this.ccittFaxDecoder.readNextChar(); 8809 if (c === -1) { 8810 this.eof = true; 8811 return; 8812 } 8813 this.ensureBuffer(this.bufferLength + 1); 8814 this.buffer[this.bufferLength++] = c; 8815 } 8816 } 8817} 8818 8819;// ./src/core/flate_stream.js 8820 8821 8822 8823 8824 8825
vendor: 5,768 bytes, lines 8826-8835
8826 8827 8828 8829 8830const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); 8831const 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]); 8832const 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]); 8833const 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]; 8834const 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]; 8835class FlateStream extends DecodeStream {
vendor: 22,988 bytes, lines 8836-9923
8836 constructor(str, maybeLength) { 8837 super(maybeLength); 8838 this.str = str; 8839 this.dict = str.dict; 8840 const cmf = str.getByte(); 8841 const flg = str.getByte(); 8842 if (cmf === -1 || flg === -1) { 8843 throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); 8844 } 8845 if ((cmf & 0x0f) !== 0x08) { 8846 throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`); 8847 } 8848 if (((cmf << 8) + flg) % 31 !== 0) { 8849 throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); 8850 } 8851 if (flg & 0x20) { 8852 throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); 8853 } 8854 this.codeSize = 0; 8855 this.codeBuf = 0; 8856 } 8857 async getImageData(length, _decoderOptions) { 8858 const data = await this.asyncGetBytes(); 8859 return data?.subarray(0, length) || this.getBytes(length); 8860 } 8861 async asyncGetBytes() { 8862 this.str.reset(); 8863 const bytes = this.str.getBytes(); 8864 try { 8865 const { 8866 readable, 8867 writable 8868 } = new DecompressionStream("deflate"); 8869 const writer = writable.getWriter(); 8870 await writer.ready; 8871 writer.write(bytes).then(async () => { 8872 await writer.ready; 8873 await writer.close(); 8874 }).catch(() => {}); 8875 const chunks = []; 8876 let totalLength = 0; 8877 for await (const chunk of readable) { 8878 chunks.push(chunk); 8879 totalLength += chunk.byteLength; 8880 } 8881 const data = new Uint8Array(totalLength); 8882 let offset = 0; 8883 for (const chunk of chunks) { 8884 data.set(chunk, offset); 8885 offset += chunk.byteLength; 8886 } 8887 return data; 8888 } catch { 8889 this.str = new Stream(bytes, 2, bytes.length, this.str.dict); 8890 this.reset(); 8891 return null; 8892 } 8893 } 8894 get isAsync() { 8895 return true; 8896 } 8897 getBits(bits) { 8898 const str = this.str; 8899 let codeSize = this.codeSize; 8900 let codeBuf = this.codeBuf; 8901 let b; 8902 while (codeSize < bits) { 8903 if ((b = str.getByte()) === -1) { 8904 throw new FormatError("Bad encoding in flate stream"); 8905 } 8906 codeBuf |= b << codeSize; 8907 codeSize += 8; 8908 } 8909 b = codeBuf & (1 << bits) - 1; 8910 this.codeBuf = codeBuf >> bits; 8911 this.codeSize = codeSize -= bits; 8912 return b; 8913 } 8914 getCode(table) { 8915 const str = this.str; 8916 const codes = table[0]; 8917 const maxLen = table[1]; 8918 let codeSize = this.codeSize; 8919 let codeBuf = this.codeBuf; 8920 let b; 8921 while (codeSize < maxLen) { 8922 if ((b = str.getByte()) === -1) { 8923 break; 8924 } 8925 codeBuf |= b << codeSize; 8926 codeSize += 8; 8927 } 8928 const code = codes[codeBuf & (1 << maxLen) - 1]; 8929 const codeLen = code >> 16; 8930 const codeVal = code & 0xffff; 8931 if (codeLen < 1 || codeSize < codeLen) { 8932 throw new FormatError("Bad encoding in flate stream"); 8933 } 8934 this.codeBuf = codeBuf >> codeLen; 8935 this.codeSize = codeSize - codeLen; 8936 return codeVal; 8937 } 8938 generateHuffmanTable(lengths) { 8939 const n = lengths.length; 8940 let maxLen = 0; 8941 let i; 8942 for (i = 0; i < n; ++i) { 8943 if (lengths[i] > maxLen) { 8944 maxLen = lengths[i]; 8945 } 8946 } 8947 const size = 1 << maxLen; 8948 const codes = new Int32Array(size); 8949 for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { 8950 for (let val = 0; val < n; ++val) { 8951 if (lengths[val] === len) { 8952 let code2 = 0; 8953 let t = code; 8954 for (i = 0; i < len; ++i) { 8955 code2 = code2 << 1 | t & 1; 8956 t >>= 1; 8957 } 8958 for (i = code2; i < size; i += skip) { 8959 codes[i] = len << 16 | val; 8960 } 8961 ++code; 8962 } 8963 } 8964 } 8965 return [codes, maxLen]; 8966 } 8967 #endsStreamOnError(err) { 8968 info(err); 8969 this.eof = true; 8970 } 8971 readBlock() { 8972 let buffer, hdr, len; 8973 const str = this.str; 8974 try { 8975 hdr = this.getBits(3); 8976 } catch (ex) { 8977 this.#endsStreamOnError(ex.message); 8978 return; 8979 } 8980 if (hdr & 1) { 8981 this.eof = true; 8982 } 8983 hdr >>= 1; 8984 if (hdr === 0) { 8985 let b; 8986 if ((b = str.getByte()) === -1) { 8987 this.#endsStreamOnError("Bad block header in flate stream"); 8988 return; 8989 } 8990 let blockLen = b; 8991 if ((b = str.getByte()) === -1) { 8992 this.#endsStreamOnError("Bad block header in flate stream"); 8993 return; 8994 } 8995 blockLen |= b << 8; 8996 if ((b = str.getByte()) === -1) { 8997 this.#endsStreamOnError("Bad block header in flate stream"); 8998 return; 8999 } 9000 let check = b; 9001 if ((b = str.getByte()) === -1) { 9002 this.#endsStreamOnError("Bad block header in flate stream"); 9003 return; 9004 } 9005 check |= b << 8; 9006 if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { 9007 throw new FormatError("Bad uncompressed block length in flate stream"); 9008 } 9009 this.codeBuf = 0; 9010 this.codeSize = 0; 9011 const bufferLength = this.bufferLength, 9012 end = bufferLength + blockLen; 9013 buffer = this.ensureBuffer(end); 9014 this.bufferLength = end; 9015 if (blockLen === 0) { 9016 if (str.peekByte() === -1) { 9017 this.eof = true; 9018 } 9019 } else { 9020 const block = str.getBytes(blockLen); 9021 buffer.set(block, bufferLength); 9022 if (block.length < blockLen) { 9023 this.eof = true; 9024 } 9025 } 9026 return; 9027 } 9028 let litCodeTable; 9029 let distCodeTable; 9030 if (hdr === 1) { 9031 litCodeTable = fixedLitCodeTab; 9032 distCodeTable = fixedDistCodeTab; 9033 } else if (hdr === 2) { 9034 const numLitCodes = this.getBits(5) + 257; 9035 const numDistCodes = this.getBits(5) + 1; 9036 const numCodeLenCodes = this.getBits(4) + 4; 9037 const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); 9038 let i; 9039 for (i = 0; i < numCodeLenCodes; ++i) { 9040 codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); 9041 } 9042 const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); 9043 len = 0; 9044 i = 0; 9045 const codes = numLitCodes + numDistCodes; 9046 const codeLengths = new Uint8Array(codes); 9047 let bitsLength, bitsOffset, what; 9048 while (i < codes) { 9049 const code = this.getCode(codeLenCodeTab); 9050 if (code === 16) { 9051 bitsLength = 2; 9052 bitsOffset = 3; 9053 what = len; 9054 } else if (code === 17) { 9055 bitsLength = 3; 9056 bitsOffset = 3; 9057 what = len = 0; 9058 } else if (code === 18) { 9059 bitsLength = 7; 9060 bitsOffset = 11; 9061 what = len = 0; 9062 } else { 9063 codeLengths[i++] = len = code; 9064 continue; 9065 } 9066 let repeatLength = this.getBits(bitsLength) + bitsOffset; 9067 while (repeatLength-- > 0) { 9068 codeLengths[i++] = what; 9069 } 9070 } 9071 litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); 9072 distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); 9073 } else { 9074 throw new FormatError("Unknown block type in flate stream"); 9075 } 9076 buffer = this.buffer; 9077 let limit = buffer ? buffer.length : 0; 9078 let pos = this.bufferLength; 9079 while (true) { 9080 let code1 = this.getCode(litCodeTable); 9081 if (code1 < 256) { 9082 if (pos + 1 >= limit) { 9083 buffer = this.ensureBuffer(pos + 1); 9084 limit = buffer.length; 9085 } 9086 buffer[pos++] = code1; 9087 continue; 9088 } 9089 if (code1 === 256) { 9090 this.bufferLength = pos; 9091 return; 9092 } 9093 code1 -= 257; 9094 code1 = lengthDecode[code1]; 9095 let code2 = code1 >> 16; 9096 if (code2 > 0) { 9097 code2 = this.getBits(code2); 9098 } 9099 len = (code1 & 0xffff) + code2; 9100 code1 = this.getCode(distCodeTable); 9101 code1 = distDecode[code1]; 9102 code2 = code1 >> 16; 9103 if (code2 > 0) { 9104 code2 = this.getBits(code2); 9105 } 9106 const dist = (code1 & 0xffff) + code2; 9107 if (pos + len >= limit) { 9108 buffer = this.ensureBuffer(pos + len); 9109 limit = buffer.length; 9110 } 9111 for (let k = 0; k < len; ++k, ++pos) { 9112 buffer[pos] = buffer[pos - dist]; 9113 } 9114 } 9115 } 9116} 9117 9118;// ./src/core/arithmetic_decoder.js 9119const QeTable = [{ 9120 qe: 0x5601, 9121 nmps: 1, 9122 nlps: 1, 9123 switchFlag: 1 9124}, { 9125 qe: 0x3401, 9126 nmps: 2, 9127 nlps: 6, 9128 switchFlag: 0 9129}, { 9130 qe: 0x1801, 9131 nmps: 3, 9132 nlps: 9, 9133 switchFlag: 0 9134}, { 9135 qe: 0x0ac1, 9136 nmps: 4, 9137 nlps: 12, 9138 switchFlag: 0 9139}, { 9140 qe: 0x0521, 9141 nmps: 5, 9142 nlps: 29, 9143 switchFlag: 0 9144}, { 9145 qe: 0x0221, 9146 nmps: 38, 9147 nlps: 33, 9148 switchFlag: 0 9149}, { 9150 qe: 0x5601, 9151 nmps: 7, 9152 nlps: 6, 9153 switchFlag: 1 9154}, { 9155 qe: 0x5401, 9156 nmps: 8, 9157 nlps: 14, 9158 switchFlag: 0 9159}, { 9160 qe: 0x4801, 9161 nmps: 9, 9162 nlps: 14, 9163 switchFlag: 0 9164}, { 9165 qe: 0x3801, 9166 nmps: 10, 9167 nlps: 14, 9168 switchFlag: 0 9169}, { 9170 qe: 0x3001, 9171 nmps: 11, 9172 nlps: 17, 9173 switchFlag: 0 9174}, { 9175 qe: 0x2401, 9176 nmps: 12, 9177 nlps: 18, 9178 switchFlag: 0 9179}, { 9180 qe: 0x1c01, 9181 nmps: 13, 9182 nlps: 20, 9183 switchFlag: 0 9184}, { 9185 qe: 0x1601, 9186 nmps: 29, 9187 nlps: 21, 9188 switchFlag: 0 9189}, { 9190 qe: 0x5601, 9191 nmps: 15, 9192 nlps: 14, 9193 switchFlag: 1 9194}, { 9195 qe: 0x5401, 9196 nmps: 16, 9197 nlps: 14, 9198 switchFlag: 0 9199}, { 9200 qe: 0x5101, 9201 nmps: 17, 9202 nlps: 15, 9203 switchFlag: 0 9204}, { 9205 qe: 0x4801, 9206 nmps: 18, 9207 nlps: 16, 9208 switchFlag: 0 9209}, { 9210 qe: 0x3801, 9211 nmps: 19, 9212 nlps: 17, 9213 switchFlag: 0 9214}, { 9215 qe: 0x3401, 9216 nmps: 20, 9217 nlps: 18, 9218 switchFlag: 0 9219}, { 9220 qe: 0x3001, 9221 nmps: 21, 9222 nlps: 19, 9223 switchFlag: 0 9224}, { 9225 qe: 0x2801, 9226 nmps: 22, 9227 nlps: 19, 9228 switchFlag: 0 9229}, { 9230 qe: 0x2401, 9231 nmps: 23, 9232 nlps: 20, 9233 switchFlag: 0 9234}, { 9235 qe: 0x2201, 9236 nmps: 24, 9237 nlps: 21, 9238 switchFlag: 0 9239}, { 9240 qe: 0x1c01, 9241 nmps: 25, 9242 nlps: 22, 9243 switchFlag: 0 9244}, { 9245 qe: 0x1801, 9246 nmps: 26, 9247 nlps: 23, 9248 switchFlag: 0 9249}, { 9250 qe: 0x1601, 9251 nmps: 27, 9252 nlps: 24, 9253 switchFlag: 0 9254}, { 9255 qe: 0x1401, 9256 nmps: 28, 9257 nlps: 25, 9258 switchFlag: 0 9259}, { 9260 qe: 0x1201, 9261 nmps: 29, 9262 nlps: 26, 9263 switchFlag: 0 9264}, { 9265 qe: 0x1101, 9266 nmps: 30, 9267 nlps: 27, 9268 switchFlag: 0 9269}, { 9270 qe: 0x0ac1, 9271 nmps: 31, 9272 nlps: 28, 9273 switchFlag: 0 9274}, { 9275 qe: 0x09c1, 9276 nmps: 32, 9277 nlps: 29, 9278 switchFlag: 0 9279}, { 9280 qe: 0x08a1, 9281 nmps: 33, 9282 nlps: 30, 9283 switchFlag: 0 9284}, { 9285 qe: 0x0521, 9286 nmps: 34, 9287 nlps: 31, 9288 switchFlag: 0 9289}, { 9290 qe: 0x0441, 9291 nmps: 35, 9292 nlps: 32, 9293 switchFlag: 0 9294}, { 9295 qe: 0x02a1, 9296 nmps: 36, 9297 nlps: 33, 9298 switchFlag: 0 9299}, { 9300 qe: 0x0221, 9301 nmps: 37, 9302 nlps: 34, 9303 switchFlag: 0 9304}, { 9305 qe: 0x0141, 9306 nmps: 38, 9307 nlps: 35, 9308 switchFlag: 0 9309}, { 9310 qe: 0x0111, 9311 nmps: 39, 9312 nlps: 36, 9313 switchFlag: 0 9314}, { 9315 qe: 0x0085, 9316 nmps: 40, 9317 nlps: 37, 9318 switchFlag: 0 9319}, { 9320 qe: 0x0049, 9321 nmps: 41, 9322 nlps: 38, 9323 switchFlag: 0 9324}, { 9325 qe: 0x0025, 9326 nmps: 42, 9327 nlps: 39, 9328 switchFlag: 0 9329}, { 9330 qe: 0x0015, 9331 nmps: 43, 9332 nlps: 40, 9333 switchFlag: 0 9334}, { 9335 qe: 0x0009, 9336 nmps: 44, 9337 nlps: 41, 9338 switchFlag: 0 9339}, { 9340 qe: 0x0005, 9341 nmps: 45, 9342 nlps: 42, 9343 switchFlag: 0 9344}, { 9345 qe: 0x0001, 9346 nmps: 45, 9347 nlps: 43, 9348 switchFlag: 0 9349}, { 9350 qe: 0x5601, 9351 nmps: 46, 9352 nlps: 46, 9353 switchFlag: 0 9354}]; 9355class ArithmeticDecoder { 9356 constructor(data, start, end) { 9357 this.data = data; 9358 this.bp = start; 9359 this.dataEnd = end; 9360 this.chigh = data[start]; 9361 this.clow = 0; 9362 this.byteIn(); 9363 this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f; 9364 this.clow = this.clow << 7 & 0xffff; 9365 this.ct -= 7; 9366 this.a = 0x8000; 9367 } 9368 byteIn() { 9369 const data = this.data; 9370 let bp = this.bp; 9371 if (data[bp] === 0xff) { 9372 if (data[bp + 1] > 0x8f) { 9373 this.clow += 0xff00; 9374 this.ct = 8; 9375 } else { 9376 bp++; 9377 this.clow += data[bp] << 9; 9378 this.ct = 7; 9379 this.bp = bp; 9380 } 9381 } else { 9382 bp++; 9383 this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00; 9384 this.ct = 8; 9385 this.bp = bp; 9386 } 9387 if (this.clow > 0xffff) { 9388 this.chigh += this.clow >> 16; 9389 this.clow &= 0xffff; 9390 } 9391 } 9392 readBit(contexts, pos) { 9393 let cx_index = contexts[pos] >> 1, 9394 cx_mps = contexts[pos] & 1; 9395 const qeTableIcx = QeTable[cx_index]; 9396 const qeIcx = qeTableIcx.qe; 9397 let d; 9398 let a = this.a - qeIcx; 9399 if (this.chigh < qeIcx) { 9400 if (a < qeIcx) { 9401 a = qeIcx; 9402 d = cx_mps; 9403 cx_index = qeTableIcx.nmps; 9404 } else { 9405 a = qeIcx; 9406 d = 1 ^ cx_mps; 9407 if (qeTableIcx.switchFlag === 1) { 9408 cx_mps = d; 9409 } 9410 cx_index = qeTableIcx.nlps; 9411 } 9412 } else { 9413 this.chigh -= qeIcx; 9414 if ((a & 0x8000) !== 0) { 9415 this.a = a; 9416 return cx_mps; 9417 } 9418 if (a < qeIcx) { 9419 d = 1 ^ cx_mps; 9420 if (qeTableIcx.switchFlag === 1) { 9421 cx_mps = d; 9422 } 9423 cx_index = qeTableIcx.nlps; 9424 } else { 9425 d = cx_mps; 9426 cx_index = qeTableIcx.nmps; 9427 } 9428 } 9429 do { 9430 if (this.ct === 0) { 9431 this.byteIn(); 9432 } 9433 a <<= 1; 9434 this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1; 9435 this.clow = this.clow << 1 & 0xffff; 9436 this.ct--; 9437 } while ((a & 0x8000) === 0); 9438 this.a = a; 9439 contexts[pos] = cx_index << 1 | cx_mps; 9440 return d; 9441 } 9442} 9443 9444;// ./src/core/jbig2.js 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456class Jbig2Error extends BaseException { 9457 constructor(msg) { 9458 super(msg, "Jbig2Error"); 9459 } 9460} 9461class ContextCache { 9462 getContexts(id) { 9463 if (id in this) { 9464 return this[id]; 9465 } 9466 return this[id] = new Int8Array(1 << 16); 9467 } 9468} 9469class DecodingContext { 9470 constructor(data, start, end) { 9471 this.data = data; 9472 this.start = start; 9473 this.end = end; 9474 } 9475 get decoder() { 9476 const decoder = new ArithmeticDecoder(this.data, this.start, this.end); 9477 return shadow(this, "decoder", decoder); 9478 } 9479 get contextCache() { 9480 const cache = new ContextCache(); 9481 return shadow(this, "contextCache", cache); 9482 } 9483} 9484function decodeInteger(contextCache, procedure, decoder) { 9485 const contexts = contextCache.getContexts(procedure); 9486 let prev = 1; 9487 function readBits(length) { 9488 let v = 0; 9489 for (let i = 0; i < length; i++) { 9490 const bit = decoder.readBit(contexts, prev); 9491 prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; 9492 v = v << 1 | bit; 9493 } 9494 return v >>> 0; 9495 } 9496 const sign = readBits(1); 9497 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); 9498 let signedValue; 9499 if (sign === 0) { 9500 signedValue = value; 9501 } else if (value > 0) { 9502 signedValue = -value; 9503 } 9504 if (signedValue >= MIN_INT_32 && signedValue <= MAX_INT_32) { 9505 return signedValue; 9506 } 9507 return null; 9508} 9509function decodeIAID(contextCache, decoder, codeLength) { 9510 const contexts = contextCache.getContexts("IAID"); 9511 let prev = 1; 9512 for (let i = 0; i < codeLength; i++) { 9513 const bit = decoder.readBit(contexts, prev); 9514 prev = prev << 1 | bit; 9515 } 9516 if (codeLength < 31) { 9517 return prev & (1 << codeLength) - 1; 9518 } 9519 return prev & 0x7fffffff; 9520} 9521const 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"]; 9522const CodingTemplates = [[{ 9523 x: -1, 9524 y: -2 9525}, { 9526 x: 0, 9527 y: -2 9528}, { 9529 x: 1, 9530 y: -2 9531}, { 9532 x: -2, 9533 y: -1 9534}, { 9535 x: -1, 9536 y: -1 9537}, { 9538 x: 0, 9539 y: -1 9540}, { 9541 x: 1, 9542 y: -1 9543}, { 9544 x: 2, 9545 y: -1 9546}, { 9547 x: -4, 9548 y: 0 9549}, { 9550 x: -3, 9551 y: 0 9552}, { 9553 x: -2, 9554 y: 0 9555}, { 9556 x: -1, 9557 y: 0 9558}], [{ 9559 x: -1, 9560 y: -2 9561}, { 9562 x: 0, 9563 y: -2 9564}, { 9565 x: 1, 9566 y: -2 9567}, { 9568 x: 2, 9569 y: -2 9570}, { 9571 x: -2, 9572 y: -1 9573}, { 9574 x: -1, 9575 y: -1 9576}, { 9577 x: 0, 9578 y: -1 9579}, { 9580 x: 1, 9581 y: -1 9582}, { 9583 x: 2, 9584 y: -1 9585}, { 9586 x: -3, 9587 y: 0 9588}, { 9589 x: -2, 9590 y: 0 9591}, { 9592 x: -1, 9593 y: 0 9594}], [{ 9595 x: -1, 9596 y: -2 9597}, { 9598 x: 0, 9599 y: -2 9600}, { 9601 x: 1, 9602 y: -2 9603}, { 9604 x: -2, 9605 y: -1 9606}, { 9607 x: -1, 9608 y: -1 9609}, { 9610 x: 0, 9611 y: -1 9612}, { 9613 x: 1, 9614 y: -1 9615}, { 9616 x: -2, 9617 y: 0 9618}, { 9619 x: -1, 9620 y: 0 9621}], [{ 9622 x: -3, 9623 y: -1 9624}, { 9625 x: -2, 9626 y: -1 9627}, { 9628 x: -1, 9629 y: -1 9630}, { 9631 x: 0, 9632 y: -1 9633}, { 9634 x: 1, 9635 y: -1 9636}, { 9637 x: -4, 9638 y: 0 9639}, { 9640 x: -3, 9641 y: 0 9642}, { 9643 x: -2, 9644 y: 0 9645}, { 9646 x: -1, 9647 y: 0 9648}]]; 9649const RefinementTemplates = [{ 9650 coding: [{ 9651 x: 0, 9652 y: -1 9653 }, { 9654 x: 1, 9655 y: -1 9656 }, { 9657 x: -1, 9658 y: 0 9659 }], 9660 reference: [{ 9661 x: 0, 9662 y: -1 9663 }, { 9664 x: 1, 9665 y: -1 9666 }, { 9667 x: -1, 9668 y: 0 9669 }, { 9670 x: 0, 9671 y: 0 9672 }, { 9673 x: 1, 9674 y: 0 9675 }, { 9676 x: -1, 9677 y: 1 9678 }, { 9679 x: 0, 9680 y: 1 9681 }, { 9682 x: 1, 9683 y: 1 9684 }] 9685}, { 9686 coding: [{ 9687 x: -1, 9688 y: -1 9689 }, { 9690 x: 0, 9691 y: -1 9692 }, { 9693 x: 1, 9694 y: -1 9695 }, { 9696 x: -1, 9697 y: 0 9698 }], 9699 reference: [{ 9700 x: 0, 9701 y: -1 9702 }, { 9703 x: -1, 9704 y: 0 9705 }, { 9706 x: 0, 9707 y: 0 9708 }, { 9709 x: 1, 9710 y: 0 9711 }, { 9712 x: 0, 9713 y: 1 9714 }, { 9715 x: 1, 9716 y: 1 9717 }] 9718}]; 9719const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195]; 9720const RefinementReusedContexts = [0x0020, 0x0008]; 9721function decodeBitmapTemplate0(width, height, decodingContext) { 9722 const decoder = decodingContext.decoder; 9723 const contexts = decodingContext.contextCache.getContexts("GB"); 9724 const bitmap = []; 9725 let contextLabel, i, j, pixel, row, row1, row2; 9726 const OLD_PIXEL_MASK = 0x7bf7; 9727 for (i = 0; i < height; i++) { 9728 row = bitmap[i] = new Uint8Array(width); 9729 row1 = i < 1 ? row : bitmap[i - 1]; 9730 row2 = i < 2 ? row : bitmap[i - 2]; 9731 contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; 9732 for (j = 0; j < width; j++) { 9733 row[j] = pixel = decoder.readBit(contexts, contextLabel); 9734 contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; 9735 } 9736 } 9737 return bitmap; 9738} 9739function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { 9740 if (mmr) { 9741 const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); 9742 return decodeMMRBitmap(input, width, height, false); 9743 } 9744 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) { 9745 return decodeBitmapTemplate0(width, height, decodingContext); 9746 } 9747 const useskip = !!skip; 9748 const template = CodingTemplates[templateIndex].concat(at); 9749 template.sort(function (a, b) { 9750 return a.y - b.y || a.x - b.x; 9751 }); 9752 const templateLength = template.length; 9753 const templateX = new Int8Array(templateLength); 9754 const templateY = new Int8Array(templateLength); 9755 const changingTemplateEntries = []; 9756 let reuseMask = 0, 9757 minX = 0, 9758 maxX = 0, 9759 minY = 0; 9760 let c, k; 9761 for (k = 0; k < templateLength; k++) { 9762 templateX[k] = template[k].x; 9763 templateY[k] = template[k].y; 9764 minX = Math.min(minX, template[k].x); 9765 maxX = Math.max(maxX, template[k].x); 9766 minY = Math.min(minY, template[k].y); 9767 if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { 9768 reuseMask |= 1 << templateLength - 1 - k; 9769 } else { 9770 changingTemplateEntries.push(k); 9771 } 9772 } 9773 const changingEntriesLength = changingTemplateEntries.length; 9774 const changingTemplateX = new Int8Array(changingEntriesLength); 9775 const changingTemplateY = new Int8Array(changingEntriesLength); 9776 const changingTemplateBit = new Uint16Array(changingEntriesLength); 9777 for (c = 0; c < changingEntriesLength; c++) { 9778 k = changingTemplateEntries[c]; 9779 changingTemplateX[c] = template[k].x; 9780 changingTemplateY[c] = template[k].y; 9781 changingTemplateBit[c] = 1 << templateLength - 1 - k; 9782 } 9783 const sbb_left = -minX; 9784 const sbb_top = -minY; 9785 const sbb_right = width - maxX; 9786 const pseudoPixelContext = ReusedContexts[templateIndex]; 9787 let row = new Uint8Array(width); 9788 const bitmap = []; 9789 const decoder = decodingContext.decoder; 9790 const contexts = decodingContext.contextCache.getContexts("GB"); 9791 let ltp = 0, 9792 j, 9793 i0, 9794 j0, 9795 contextLabel = 0, 9796 bit, 9797 shift; 9798 for (let i = 0; i < height; i++) { 9799 if (prediction) { 9800 const sltp = decoder.readBit(contexts, pseudoPixelContext); 9801 ltp ^= sltp; 9802 if (ltp) { 9803 bitmap.push(row); 9804 continue; 9805 } 9806 } 9807 row = new Uint8Array(row); 9808 bitmap.push(row); 9809 for (j = 0; j < width; j++) { 9810 if (useskip && skip[i][j]) { 9811 row[j] = 0; 9812 continue; 9813 } 9814 if (j >= sbb_left && j < sbb_right && i >= sbb_top) { 9815 contextLabel = contextLabel << 1 & reuseMask; 9816 for (k = 0; k < changingEntriesLength; k++) { 9817 i0 = i + changingTemplateY[k]; 9818 j0 = j + changingTemplateX[k]; 9819 bit = bitmap[i0][j0]; 9820 if (bit) { 9821 bit = changingTemplateBit[k]; 9822 contextLabel |= bit; 9823 } 9824 } 9825 } else { 9826 contextLabel = 0; 9827 shift = templateLength - 1; 9828 for (k = 0; k < templateLength; k++, shift--) { 9829 j0 = j + templateX[k]; 9830 if (j0 >= 0 && j0 < width) { 9831 i0 = i + templateY[k]; 9832 if (i0 >= 0) { 9833 bit = bitmap[i0][j0]; 9834 if (bit) { 9835 contextLabel |= bit << shift; 9836 } 9837 } 9838 } 9839 } 9840 } 9841 const pixel = decoder.readBit(contexts, contextLabel); 9842 row[j] = pixel; 9843 } 9844 } 9845 return bitmap; 9846} 9847function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { 9848 let codingTemplate = RefinementTemplates[templateIndex].coding; 9849 if (templateIndex === 0) { 9850 codingTemplate = codingTemplate.concat([at[0]]); 9851 } 9852 const codingTemplateLength = codingTemplate.length; 9853 const codingTemplateX = new Int32Array(codingTemplateLength); 9854 const codingTemplateY = new Int32Array(codingTemplateLength); 9855 let k; 9856 for (k = 0; k < codingTemplateLength; k++) { 9857 codingTemplateX[k] = codingTemplate[k].x; 9858 codingTemplateY[k] = codingTemplate[k].y; 9859 } 9860 let referenceTemplate = RefinementTemplates[templateIndex].reference; 9861 if (templateIndex === 0) { 9862 referenceTemplate = referenceTemplate.concat([at[1]]); 9863 } 9864 const referenceTemplateLength = referenceTemplate.length; 9865 const referenceTemplateX = new Int32Array(referenceTemplateLength); 9866 const referenceTemplateY = new Int32Array(referenceTemplateLength); 9867 for (k = 0; k < referenceTemplateLength; k++) { 9868 referenceTemplateX[k] = referenceTemplate[k].x; 9869 referenceTemplateY[k] = referenceTemplate[k].y; 9870 } 9871 const referenceWidth = referenceBitmap[0].length; 9872 const referenceHeight = referenceBitmap.length; 9873 const pseudoPixelContext = RefinementReusedContexts[templateIndex]; 9874 const bitmap = []; 9875 const decoder = decodingContext.decoder; 9876 const contexts = decodingContext.contextCache.getContexts("GR"); 9877 let ltp = 0; 9878 for (let i = 0; i < height; i++) { 9879 if (prediction) { 9880 const sltp = decoder.readBit(contexts, pseudoPixelContext); 9881 ltp ^= sltp; 9882 if (ltp) { 9883 throw new Jbig2Error("prediction is not supported"); 9884 } 9885 } 9886 const row = new Uint8Array(width); 9887 bitmap.push(row); 9888 for (let j = 0; j < width; j++) { 9889 let i0, j0; 9890 let contextLabel = 0; 9891 for (k = 0; k < codingTemplateLength; k++) { 9892 i0 = i + codingTemplateY[k]; 9893 j0 = j + codingTemplateX[k]; 9894 if (i0 < 0 || j0 < 0 || j0 >= width) { 9895 contextLabel <<= 1; 9896 } else { 9897 contextLabel = contextLabel << 1 | bitmap[i0][j0]; 9898 } 9899 } 9900 for (k = 0; k < referenceTemplateLength; k++) { 9901 i0 = i + referenceTemplateY[k] - offsetY; 9902 j0 = j + referenceTemplateX[k] - offsetX; 9903 if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { 9904 contextLabel <<= 1; 9905 } else { 9906 contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; 9907 } 9908 } 9909 const pixel = decoder.readBit(contexts, contextLabel); 9910 row[j] = pixel; 9911 } 9912 } 9913 return bitmap; 9914} 9915function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) { 9916 if (huffman && refinement) { 9917 throw new Jbig2Error("symbol refinement with Huffman is not supported"); 9918 } 9919 const newSymbols = []; 9920 let currentHeight = 0; 9921 let symbolCodeLength = log2(symbols.length + numberOfNewSymbols); 9922 const decoder = decodingContext.decoder; 9923 const contextCache = decodingContext.contextCache;
vendor: 5,404 bytes, lines 9924-10059
9924 let tableB1, symbolWidths; 9925 if (huffman) { 9926 tableB1 = getStandardTable(1); 9927 symbolWidths = []; 9928 symbolCodeLength = Math.max(symbolCodeLength, 1); 9929 } 9930 while (newSymbols.length < numberOfNewSymbols) { 9931 const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, "IADH", decoder); 9932 currentHeight += deltaHeight; 9933 let currentWidth = 0, 9934 totalWidth = 0; 9935 const firstSymbol = huffman ? symbolWidths.length : 0; 9936 while (true) { 9937 const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, "IADW", decoder); 9938 if (deltaWidth === null) { 9939 break; 9940 } 9941 currentWidth += deltaWidth; 9942 totalWidth += currentWidth; 9943 let bitmap; 9944 if (refinement) { 9945 const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); 9946 if (numberOfInstances > 1) { 9947 bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput); 9948 } else { 9949 const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); 9950 const rdx = decodeInteger(contextCache, "IARDX", decoder); 9951 const rdy = decodeInteger(contextCache, "IARDY", decoder); 9952 const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; 9953 bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); 9954 } 9955 newSymbols.push(bitmap); 9956 } else if (huffman) { 9957 symbolWidths.push(currentWidth); 9958 } else { 9959 bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); 9960 newSymbols.push(bitmap); 9961 } 9962 } 9963 if (huffman && !refinement) { 9964 const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput); 9965 huffmanInput.byteAlign(); 9966 let collectiveBitmap; 9967 if (bitmapSize === 0) { 9968 collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight); 9969 } else { 9970 const originalEnd = huffmanInput.end; 9971 const bitmapEnd = huffmanInput.position + bitmapSize; 9972 huffmanInput.end = bitmapEnd; 9973 collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false); 9974 huffmanInput.end = originalEnd; 9975 huffmanInput.position = bitmapEnd; 9976 } 9977 const numberOfSymbolsDecoded = symbolWidths.length; 9978 if (firstSymbol === numberOfSymbolsDecoded - 1) { 9979 newSymbols.push(collectiveBitmap); 9980 } else { 9981 let i, 9982 y, 9983 xMin = 0, 9984 xMax, 9985 bitmapWidth, 9986 symbolBitmap; 9987 for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) { 9988 bitmapWidth = symbolWidths[i]; 9989 xMax = xMin + bitmapWidth; 9990 symbolBitmap = []; 9991 for (y = 0; y < currentHeight; y++) { 9992 symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); 9993 } 9994 newSymbols.push(symbolBitmap); 9995 xMin = xMax; 9996 } 9997 } 9998 } 9999 } 10000 const exportedSymbols = [], 10001 flags = []; 10002 let currentFlag = false, 10003 i, 10004 ii; 10005 const totalSymbolsLength = symbols.length + numberOfNewSymbols; 10006 while (flags.length < totalSymbolsLength) { 10007 let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder); 10008 while (runLength--) { 10009 flags.push(currentFlag); 10010 } 10011 currentFlag = !currentFlag; 10012 } 10013 for (i = 0, ii = symbols.length; i < ii; i++) { 10014 if (flags[i]) { 10015 exportedSymbols.push(symbols[i]); 10016 } 10017 } 10018 for (let j = 0; j < numberOfNewSymbols; i++, j++) { 10019 if (flags[i]) { 10020 exportedSymbols.push(newSymbols[j]); 10021 } 10022 } 10023 return exportedSymbols; 10024} 10025function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) { 10026 if (huffman && refinement) { 10027 throw new Jbig2Error("refinement with Huffman is not supported"); 10028 } 10029 const bitmap = []; 10030 let i, row; 10031 for (i = 0; i < height; i++) { 10032 row = new Uint8Array(width); 10033 if (defaultPixelValue) { 10034 for (let j = 0; j < width; j++) { 10035 row[j] = defaultPixelValue; 10036 } 10037 } 10038 bitmap.push(row); 10039 } 10040 const decoder = decodingContext.decoder; 10041 const contextCache = decodingContext.contextCache; 10042 let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, "IADT", decoder); 10043 let firstS = 0; 10044 i = 0; 10045 while (i < numberOfSymbolInstances) { 10046 const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, "IADT", decoder); 10047 stripT += deltaT; 10048 const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, "IAFS", decoder); 10049 firstS += deltaFirstS; 10050 let currentS = firstS; 10051 do { 10052 let currentT = 0; 10053 if (stripSize > 1) { 10054 currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", decoder); 10055 } 10056 const t = stripSize * stripT + currentT; 10057 const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength); 10058 const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, "IARI", decoder)); 10059 let symbolBitmap = inputSymbols[symbolId];
vendor: 52,301 bytes, lines 10060-11753
10060 let symbolWidth = symbolBitmap[0].length; 10061 let symbolHeight = symbolBitmap.length; 10062 if (applyRefinement) { 10063 const rdw = decodeInteger(contextCache, "IARDW", decoder); 10064 const rdh = decodeInteger(contextCache, "IARDH", decoder); 10065 const rdx = decodeInteger(contextCache, "IARDX", decoder); 10066 const rdy = decodeInteger(contextCache, "IARDY", decoder); 10067 symbolWidth += rdw; 10068 symbolHeight += rdh; 10069 symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); 10070 } 10071 let increment = 0; 10072 if (!transposed) { 10073 if (referenceCorner > 1) { 10074 currentS += symbolWidth - 1; 10075 } else { 10076 increment = symbolWidth - 1; 10077 } 10078 } else if (!(referenceCorner & 1)) { 10079 currentS += symbolHeight - 1; 10080 } else { 10081 increment = symbolHeight - 1; 10082 } 10083 const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1); 10084 const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0); 10085 let s2, t2, symbolRow; 10086 if (transposed) { 10087 for (s2 = 0; s2 < symbolHeight; s2++) { 10088 row = bitmap[offsetS + s2]; 10089 if (!row) { 10090 continue; 10091 } 10092 symbolRow = symbolBitmap[s2]; 10093 const maxWidth = Math.min(width - offsetT, symbolWidth); 10094 switch (combinationOperator) { 10095 case 0: 10096 for (t2 = 0; t2 < maxWidth; t2++) { 10097 row[offsetT + t2] |= symbolRow[t2]; 10098 } 10099 break; 10100 case 2: 10101 for (t2 = 0; t2 < maxWidth; t2++) { 10102 row[offsetT + t2] ^= symbolRow[t2]; 10103 } 10104 break; 10105 default: 10106 throw new Jbig2Error(`operator ${combinationOperator} is not supported`); 10107 } 10108 } 10109 } else { 10110 for (t2 = 0; t2 < symbolHeight; t2++) { 10111 row = bitmap[offsetT + t2]; 10112 if (!row) { 10113 continue; 10114 } 10115 symbolRow = symbolBitmap[t2]; 10116 switch (combinationOperator) { 10117 case 0: 10118 for (s2 = 0; s2 < symbolWidth; s2++) { 10119 row[offsetS + s2] |= symbolRow[s2]; 10120 } 10121 break; 10122 case 2: 10123 for (s2 = 0; s2 < symbolWidth; s2++) { 10124 row[offsetS + s2] ^= symbolRow[s2]; 10125 } 10126 break; 10127 default: 10128 throw new Jbig2Error(`operator ${combinationOperator} is not supported`); 10129 } 10130 } 10131 } 10132 i++; 10133 const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, "IADS", decoder); 10134 if (deltaS === null) { 10135 break; 10136 } 10137 currentS += increment + deltaS + dsOffset; 10138 } while (true); 10139 } 10140 return bitmap; 10141} 10142function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) { 10143 const at = []; 10144 if (!mmr) { 10145 at.push({ 10146 x: -patternWidth, 10147 y: 0 10148 }); 10149 if (template === 0) { 10150 at.push({ 10151 x: -3, 10152 y: -1 10153 }, { 10154 x: 2, 10155 y: -2 10156 }, { 10157 x: -2, 10158 y: -2 10159 }); 10160 } 10161 } 10162 const collectiveWidth = (maxPatternIndex + 1) * patternWidth; 10163 const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext); 10164 const patterns = []; 10165 for (let i = 0; i <= maxPatternIndex; i++) { 10166 const patternBitmap = []; 10167 const xMin = patternWidth * i; 10168 const xMax = xMin + patternWidth; 10169 for (let y = 0; y < patternHeight; y++) { 10170 patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); 10171 } 10172 patterns.push(patternBitmap); 10173 } 10174 return patterns; 10175} 10176function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) { 10177 const skip = null; 10178 if (enableSkip) { 10179 throw new Jbig2Error("skip is not supported"); 10180 } 10181 if (combinationOperator !== 0) { 10182 throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`); 10183 } 10184 const regionBitmap = []; 10185 let i, j, row; 10186 for (i = 0; i < regionHeight; i++) { 10187 row = new Uint8Array(regionWidth); 10188 if (defaultPixelValue) { 10189 for (j = 0; j < regionWidth; j++) { 10190 row[j] = defaultPixelValue; 10191 } 10192 } 10193 regionBitmap.push(row); 10194 } 10195 const numberOfPatterns = patterns.length; 10196 const pattern0 = patterns[0]; 10197 const patternWidth = pattern0[0].length, 10198 patternHeight = pattern0.length; 10199 const bitsPerValue = log2(numberOfPatterns); 10200 const at = []; 10201 if (!mmr) { 10202 at.push({ 10203 x: template <= 1 ? 3 : 2, 10204 y: -1 10205 }); 10206 if (template === 0) { 10207 at.push({ 10208 x: -3, 10209 y: -1 10210 }, { 10211 x: 2, 10212 y: -2 10213 }, { 10214 x: -2, 10215 y: -2 10216 }); 10217 } 10218 } 10219 const grayScaleBitPlanes = []; 10220 let mmrInput, bitmap; 10221 if (mmr) { 10222 mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); 10223 } 10224 for (i = bitsPerValue - 1; i >= 0; i--) { 10225 if (mmr) { 10226 bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true); 10227 } else { 10228 bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext); 10229 } 10230 grayScaleBitPlanes[i] = bitmap; 10231 } 10232 let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow; 10233 for (mg = 0; mg < gridHeight; mg++) { 10234 for (ng = 0; ng < gridWidth; ng++) { 10235 bit = 0; 10236 patternIndex = 0; 10237 for (j = bitsPerValue - 1; j >= 0; j--) { 10238 bit ^= grayScaleBitPlanes[j][mg][ng]; 10239 patternIndex |= bit << j; 10240 } 10241 patternBitmap = patterns[patternIndex]; 10242 x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8; 10243 y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8; 10244 if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) { 10245 for (i = 0; i < patternHeight; i++) { 10246 regionRow = regionBitmap[y + i]; 10247 patternRow = patternBitmap[i]; 10248 for (j = 0; j < patternWidth; j++) { 10249 regionRow[x + j] |= patternRow[j]; 10250 } 10251 } 10252 } else { 10253 let regionX, regionY; 10254 for (i = 0; i < patternHeight; i++) { 10255 regionY = y + i; 10256 if (regionY < 0 || regionY >= regionHeight) { 10257 continue; 10258 } 10259 regionRow = regionBitmap[regionY]; 10260 patternRow = patternBitmap[i]; 10261 for (j = 0; j < patternWidth; j++) { 10262 regionX = x + j; 10263 if (regionX >= 0 && regionX < regionWidth) { 10264 regionRow[regionX] |= patternRow[j]; 10265 } 10266 } 10267 } 10268 } 10269 } 10270 } 10271 return regionBitmap; 10272} 10273function readSegmentHeader(data, start) { 10274 const segmentHeader = {}; 10275 segmentHeader.number = readUint32(data, start); 10276 const flags = data[start + 4]; 10277 const segmentType = flags & 0x3f; 10278 if (!SegmentTypes[segmentType]) { 10279 throw new Jbig2Error("invalid segment type: " + segmentType); 10280 } 10281 segmentHeader.type = segmentType; 10282 segmentHeader.typeName = SegmentTypes[segmentType]; 10283 segmentHeader.deferredNonRetain = !!(flags & 0x80); 10284 const pageAssociationFieldSize = !!(flags & 0x40); 10285 const referredFlags = data[start + 5]; 10286 let referredToCount = referredFlags >> 5 & 7; 10287 const retainBits = [referredFlags & 31]; 10288 let position = start + 6; 10289 if (referredFlags === 7) { 10290 referredToCount = readUint32(data, position - 1) & 0x1fffffff; 10291 position += 3; 10292 let bytes = referredToCount + 7 >> 3; 10293 retainBits[0] = data[position++]; 10294 while (--bytes > 0) { 10295 retainBits.push(data[position++]); 10296 } 10297 } else if (referredFlags === 5 || referredFlags === 6) { 10298 throw new Jbig2Error("invalid referred-to flags"); 10299 } 10300 segmentHeader.retainBits = retainBits; 10301 let referredToSegmentNumberSize = 4; 10302 if (segmentHeader.number <= 256) { 10303 referredToSegmentNumberSize = 1; 10304 } else if (segmentHeader.number <= 65536) { 10305 referredToSegmentNumberSize = 2; 10306 } 10307 const referredTo = []; 10308 let i, ii; 10309 for (i = 0; i < referredToCount; i++) { 10310 let number; 10311 if (referredToSegmentNumberSize === 1) { 10312 number = data[position]; 10313 } else if (referredToSegmentNumberSize === 2) { 10314 number = readUint16(data, position); 10315 } else { 10316 number = readUint32(data, position); 10317 } 10318 referredTo.push(number); 10319 position += referredToSegmentNumberSize; 10320 } 10321 segmentHeader.referredTo = referredTo; 10322 if (!pageAssociationFieldSize) { 10323 segmentHeader.pageAssociation = data[position++]; 10324 } else { 10325 segmentHeader.pageAssociation = readUint32(data, position); 10326 position += 4; 10327 } 10328 segmentHeader.length = readUint32(data, position); 10329 position += 4; 10330 if (segmentHeader.length === 0xffffffff) { 10331 if (segmentType === 38) { 10332 const genericRegionInfo = readRegionSegmentInformation(data, position); 10333 const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; 10334 const genericRegionMmr = !!(genericRegionSegmentFlags & 1); 10335 const searchPatternLength = 6; 10336 const searchPattern = new Uint8Array(searchPatternLength); 10337 if (!genericRegionMmr) { 10338 searchPattern[0] = 0xff; 10339 searchPattern[1] = 0xac; 10340 } 10341 searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff; 10342 searchPattern[3] = genericRegionInfo.height >> 16 & 0xff; 10343 searchPattern[4] = genericRegionInfo.height >> 8 & 0xff; 10344 searchPattern[5] = genericRegionInfo.height & 0xff; 10345 for (i = position, ii = data.length; i < ii; i++) { 10346 let j = 0; 10347 while (j < searchPatternLength && searchPattern[j] === data[i + j]) { 10348 j++; 10349 } 10350 if (j === searchPatternLength) { 10351 segmentHeader.length = i + searchPatternLength; 10352 break; 10353 } 10354 } 10355 if (segmentHeader.length === 0xffffffff) { 10356 throw new Jbig2Error("segment end was not found"); 10357 } 10358 } else { 10359 throw new Jbig2Error("invalid unknown segment length"); 10360 } 10361 } 10362 segmentHeader.headerEnd = position; 10363 return segmentHeader; 10364} 10365function readSegments(header, data, start, end) { 10366 const segments = []; 10367 let position = start; 10368 while (position < end) { 10369 const segmentHeader = readSegmentHeader(data, position); 10370 position = segmentHeader.headerEnd; 10371 const segment = { 10372 header: segmentHeader, 10373 data 10374 }; 10375 if (!header.randomAccess) { 10376 segment.start = position; 10377 position += segmentHeader.length; 10378 segment.end = position; 10379 } 10380 segments.push(segment); 10381 if (segmentHeader.type === 51) { 10382 break; 10383 } 10384 } 10385 if (header.randomAccess) { 10386 for (let i = 0, ii = segments.length; i < ii; i++) { 10387 segments[i].start = position; 10388 position += segments[i].header.length; 10389 segments[i].end = position; 10390 } 10391 } 10392 return segments; 10393} 10394function readRegionSegmentInformation(data, start) { 10395 return { 10396 width: readUint32(data, start), 10397 height: readUint32(data, start + 4), 10398 x: readUint32(data, start + 8), 10399 y: readUint32(data, start + 12), 10400 combinationOperator: data[start + 16] & 7 10401 }; 10402} 10403const RegionSegmentInformationFieldLength = 17; 10404function processSegment(segment, visitor) { 10405 const header = segment.header; 10406 const data = segment.data, 10407 end = segment.end; 10408 let position = segment.start; 10409 let args, at, i, atLength; 10410 switch (header.type) { 10411 case 0: 10412 const dictionary = {}; 10413 const dictionaryFlags = readUint16(data, position); 10414 dictionary.huffman = !!(dictionaryFlags & 1); 10415 dictionary.refinement = !!(dictionaryFlags & 2); 10416 dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; 10417 dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; 10418 dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; 10419 dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; 10420 dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); 10421 dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); 10422 dictionary.template = dictionaryFlags >> 10 & 3; 10423 dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; 10424 position += 2; 10425 if (!dictionary.huffman) { 10426 atLength = dictionary.template === 0 ? 4 : 1; 10427 at = []; 10428 for (i = 0; i < atLength; i++) { 10429 at.push({ 10430 x: readInt8(data, position), 10431 y: readInt8(data, position + 1) 10432 }); 10433 position += 2; 10434 } 10435 dictionary.at = at; 10436 } 10437 if (dictionary.refinement && !dictionary.refinementTemplate) { 10438 at = []; 10439 for (i = 0; i < 2; i++) { 10440 at.push({ 10441 x: readInt8(data, position), 10442 y: readInt8(data, position + 1) 10443 }); 10444 position += 2; 10445 } 10446 dictionary.refinementAt = at; 10447 } 10448 dictionary.numberOfExportedSymbols = readUint32(data, position); 10449 position += 4; 10450 dictionary.numberOfNewSymbols = readUint32(data, position); 10451 position += 4; 10452 args = [dictionary, header.number, header.referredTo, data, position, end]; 10453 break; 10454 case 6: 10455 case 7: 10456 const textRegion = {}; 10457 textRegion.info = readRegionSegmentInformation(data, position); 10458 position += RegionSegmentInformationFieldLength; 10459 const textRegionSegmentFlags = readUint16(data, position); 10460 position += 2; 10461 textRegion.huffman = !!(textRegionSegmentFlags & 1); 10462 textRegion.refinement = !!(textRegionSegmentFlags & 2); 10463 textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3; 10464 textRegion.stripSize = 1 << textRegion.logStripSize; 10465 textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; 10466 textRegion.transposed = !!(textRegionSegmentFlags & 64); 10467 textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; 10468 textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; 10469 textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; 10470 textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; 10471 if (textRegion.huffman) { 10472 const textRegionHuffmanFlags = readUint16(data, position); 10473 position += 2; 10474 textRegion.huffmanFS = textRegionHuffmanFlags & 3; 10475 textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; 10476 textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; 10477 textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; 10478 textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; 10479 textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; 10480 textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; 10481 textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000); 10482 } 10483 if (textRegion.refinement && !textRegion.refinementTemplate) { 10484 at = []; 10485 for (i = 0; i < 2; i++) { 10486 at.push({ 10487 x: readInt8(data, position), 10488 y: readInt8(data, position + 1) 10489 }); 10490 position += 2; 10491 } 10492 textRegion.refinementAt = at; 10493 } 10494 textRegion.numberOfSymbolInstances = readUint32(data, position); 10495 position += 4; 10496 args = [textRegion, header.referredTo, data, position, end]; 10497 break; 10498 case 16: 10499 const patternDictionary = {}; 10500 const patternDictionaryFlags = data[position++]; 10501 patternDictionary.mmr = !!(patternDictionaryFlags & 1); 10502 patternDictionary.template = patternDictionaryFlags >> 1 & 3; 10503 patternDictionary.patternWidth = data[position++]; 10504 patternDictionary.patternHeight = data[position++]; 10505 patternDictionary.maxPatternIndex = readUint32(data, position); 10506 position += 4; 10507 args = [patternDictionary, header.number, data, position, end]; 10508 break; 10509 case 22: 10510 case 23: 10511 const halftoneRegion = {}; 10512 halftoneRegion.info = readRegionSegmentInformation(data, position); 10513 position += RegionSegmentInformationFieldLength; 10514 const halftoneRegionFlags = data[position++]; 10515 halftoneRegion.mmr = !!(halftoneRegionFlags & 1); 10516 halftoneRegion.template = halftoneRegionFlags >> 1 & 3; 10517 halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8); 10518 halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7; 10519 halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1; 10520 halftoneRegion.gridWidth = readUint32(data, position); 10521 position += 4; 10522 halftoneRegion.gridHeight = readUint32(data, position); 10523 position += 4; 10524 halftoneRegion.gridOffsetX = readUint32(data, position) & 0xffffffff; 10525 position += 4; 10526 halftoneRegion.gridOffsetY = readUint32(data, position) & 0xffffffff; 10527 position += 4; 10528 halftoneRegion.gridVectorX = readUint16(data, position); 10529 position += 2; 10530 halftoneRegion.gridVectorY = readUint16(data, position); 10531 position += 2; 10532 args = [halftoneRegion, header.referredTo, data, position, end]; 10533 break; 10534 case 38: 10535 case 39: 10536 const genericRegion = {}; 10537 genericRegion.info = readRegionSegmentInformation(data, position); 10538 position += RegionSegmentInformationFieldLength; 10539 const genericRegionSegmentFlags = data[position++]; 10540 genericRegion.mmr = !!(genericRegionSegmentFlags & 1); 10541 genericRegion.template = genericRegionSegmentFlags >> 1 & 3; 10542 genericRegion.prediction = !!(genericRegionSegmentFlags & 8); 10543 if (!genericRegion.mmr) { 10544 atLength = genericRegion.template === 0 ? 4 : 1; 10545 at = []; 10546 for (i = 0; i < atLength; i++) { 10547 at.push({ 10548 x: readInt8(data, position), 10549 y: readInt8(data, position + 1) 10550 }); 10551 position += 2; 10552 } 10553 genericRegion.at = at; 10554 } 10555 args = [genericRegion, data, position, end]; 10556 break; 10557 case 48: 10558 const pageInfo = { 10559 width: readUint32(data, position), 10560 height: readUint32(data, position + 4), 10561 resolutionX: readUint32(data, position + 8), 10562 resolutionY: readUint32(data, position + 12) 10563 }; 10564 if (pageInfo.height === 0xffffffff) { 10565 delete pageInfo.height; 10566 } 10567 const pageSegmentFlags = data[position + 16]; 10568 readUint16(data, position + 17); 10569 pageInfo.lossless = !!(pageSegmentFlags & 1); 10570 pageInfo.refinement = !!(pageSegmentFlags & 2); 10571 pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; 10572 pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; 10573 pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); 10574 pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); 10575 args = [pageInfo]; 10576 break; 10577 case 49: 10578 break; 10579 case 50: 10580 break; 10581 case 51: 10582 break; 10583 case 53: 10584 args = [header.number, data, position, end]; 10585 break; 10586 case 62: 10587 break; 10588 default: 10589 throw new Jbig2Error(`segment type ${header.typeName}(${header.type}) is not implemented`); 10590 } 10591 const callbackName = "on" + header.typeName; 10592 if (callbackName in visitor) { 10593 visitor[callbackName].apply(visitor, args); 10594 } 10595} 10596function processSegments(segments, visitor) { 10597 for (let i = 0, ii = segments.length; i < ii; i++) { 10598 processSegment(segments[i], visitor); 10599 } 10600} 10601function parseJbig2Chunks(chunks) { 10602 const visitor = new SimpleSegmentVisitor(); 10603 for (let i = 0, ii = chunks.length; i < ii; i++) { 10604 const chunk = chunks[i]; 10605 const segments = readSegments({}, chunk.data, chunk.start, chunk.end); 10606 processSegments(segments, visitor); 10607 } 10608 return visitor.buffer; 10609} 10610function parseJbig2(data) { 10611 throw new Error("Not implemented: parseJbig2"); 10612} 10613class SimpleSegmentVisitor { 10614 onPageInformation(info) { 10615 this.currentPageInfo = info; 10616 const rowSize = info.width + 7 >> 3; 10617 const buffer = new Uint8ClampedArray(rowSize * info.height); 10618 if (info.defaultPixelValue) { 10619 buffer.fill(0xff); 10620 } 10621 this.buffer = buffer; 10622 } 10623 drawBitmap(regionInfo, bitmap) { 10624 const pageInfo = this.currentPageInfo; 10625 const width = regionInfo.width, 10626 height = regionInfo.height; 10627 const rowSize = pageInfo.width + 7 >> 3; 10628 const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; 10629 const buffer = this.buffer; 10630 const mask0 = 128 >> (regionInfo.x & 7); 10631 let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); 10632 let i, j, mask, offset; 10633 switch (combinationOperator) { 10634 case 0: 10635 for (i = 0; i < height; i++) { 10636 mask = mask0; 10637 offset = offset0; 10638 for (j = 0; j < width; j++) { 10639 if (bitmap[i][j]) { 10640 buffer[offset] |= mask; 10641 } 10642 mask >>= 1; 10643 if (!mask) { 10644 mask = 128; 10645 offset++; 10646 } 10647 } 10648 offset0 += rowSize; 10649 } 10650 break; 10651 case 2: 10652 for (i = 0; i < height; i++) { 10653 mask = mask0; 10654 offset = offset0; 10655 for (j = 0; j < width; j++) { 10656 if (bitmap[i][j]) { 10657 buffer[offset] ^= mask; 10658 } 10659 mask >>= 1; 10660 if (!mask) { 10661 mask = 128; 10662 offset++; 10663 } 10664 } 10665 offset0 += rowSize; 10666 } 10667 break; 10668 default: 10669 throw new Jbig2Error(`operator ${combinationOperator} is not supported`); 10670 } 10671 } 10672 onImmediateGenericRegion(region, data, start, end) { 10673 const regionInfo = region.info; 10674 const decodingContext = new DecodingContext(data, start, end); 10675 const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); 10676 this.drawBitmap(regionInfo, bitmap); 10677 } 10678 onImmediateLosslessGenericRegion() { 10679 this.onImmediateGenericRegion(...arguments); 10680 } 10681 onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { 10682 let huffmanTables, huffmanInput; 10683 if (dictionary.huffman) { 10684 huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables); 10685 huffmanInput = new Reader(data, start, end); 10686 } 10687 let symbols = this.symbols; 10688 if (!symbols) { 10689 this.symbols = symbols = {}; 10690 } 10691 const inputSymbols = []; 10692 for (const referredSegment of referredSegments) { 10693 const referredSymbols = symbols[referredSegment]; 10694 if (referredSymbols) { 10695 inputSymbols.push(...referredSymbols); 10696 } 10697 } 10698 const decodingContext = new DecodingContext(data, start, end); 10699 symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput); 10700 } 10701 onImmediateTextRegion(region, referredSegments, data, start, end) { 10702 const regionInfo = region.info; 10703 let huffmanTables, huffmanInput; 10704 const symbols = this.symbols; 10705 const inputSymbols = []; 10706 for (const referredSegment of referredSegments) { 10707 const referredSymbols = symbols[referredSegment]; 10708 if (referredSymbols) { 10709 inputSymbols.push(...referredSymbols); 10710 } 10711 } 10712 const symbolCodeLength = log2(inputSymbols.length); 10713 if (region.huffman) { 10714 huffmanInput = new Reader(data, start, end); 10715 huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput); 10716 } 10717 const decodingContext = new DecodingContext(data, start, end); 10718 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); 10719 this.drawBitmap(regionInfo, bitmap); 10720 } 10721 onImmediateLosslessTextRegion() { 10722 this.onImmediateTextRegion(...arguments); 10723 } 10724 onPatternDictionary(dictionary, currentSegment, data, start, end) { 10725 let patterns = this.patterns; 10726 if (!patterns) { 10727 this.patterns = patterns = {}; 10728 } 10729 const decodingContext = new DecodingContext(data, start, end); 10730 patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext); 10731 } 10732 onImmediateHalftoneRegion(region, referredSegments, data, start, end) { 10733 const patterns = this.patterns[referredSegments[0]]; 10734 const regionInfo = region.info; 10735 const decodingContext = new DecodingContext(data, start, end); 10736 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); 10737 this.drawBitmap(regionInfo, bitmap); 10738 } 10739 onImmediateLosslessHalftoneRegion() { 10740 this.onImmediateHalftoneRegion(...arguments); 10741 } 10742 onTables(currentSegment, data, start, end) { 10743 let customTables = this.customTables; 10744 if (!customTables) { 10745 this.customTables = customTables = {}; 10746 } 10747 customTables[currentSegment] = decodeTablesSegment(data, start, end); 10748 } 10749} 10750class HuffmanLine { 10751 constructor(lineData) { 10752 if (lineData.length === 2) { 10753 this.isOOB = true; 10754 this.rangeLow = 0; 10755 this.prefixLength = lineData[0]; 10756 this.rangeLength = 0; 10757 this.prefixCode = lineData[1]; 10758 this.isLowerRange = false; 10759 } else { 10760 this.isOOB = false; 10761 this.rangeLow = lineData[0]; 10762 this.prefixLength = lineData[1]; 10763 this.rangeLength = lineData[2]; 10764 this.prefixCode = lineData[3]; 10765 this.isLowerRange = lineData[4] === "lower"; 10766 } 10767 } 10768} 10769class HuffmanTreeNode { 10770 constructor(line) { 10771 this.children = []; 10772 if (line) { 10773 this.isLeaf = true; 10774 this.rangeLength = line.rangeLength; 10775 this.rangeLow = line.rangeLow; 10776 this.isLowerRange = line.isLowerRange; 10777 this.isOOB = line.isOOB; 10778 } else { 10779 this.isLeaf = false; 10780 } 10781 } 10782 buildTree(line, shift) { 10783 const bit = line.prefixCode >> shift & 1; 10784 if (shift <= 0) { 10785 this.children[bit] = new HuffmanTreeNode(line); 10786 } else { 10787 let node = this.children[bit]; 10788 if (!node) { 10789 this.children[bit] = node = new HuffmanTreeNode(null); 10790 } 10791 node.buildTree(line, shift - 1); 10792 } 10793 } 10794 decodeNode(reader) { 10795 if (this.isLeaf) { 10796 if (this.isOOB) { 10797 return null; 10798 } 10799 const htOffset = reader.readBits(this.rangeLength); 10800 return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset); 10801 } 10802 const node = this.children[reader.readBit()]; 10803 if (!node) { 10804 throw new Jbig2Error("invalid Huffman data"); 10805 } 10806 return node.decodeNode(reader); 10807 } 10808} 10809class HuffmanTable { 10810 constructor(lines, prefixCodesDone) { 10811 if (!prefixCodesDone) { 10812 this.assignPrefixCodes(lines); 10813 } 10814 this.rootNode = new HuffmanTreeNode(null); 10815 for (let i = 0, ii = lines.length; i < ii; i++) { 10816 const line = lines[i]; 10817 if (line.prefixLength > 0) { 10818 this.rootNode.buildTree(line, line.prefixLength - 1); 10819 } 10820 } 10821 } 10822 decode(reader) { 10823 return this.rootNode.decodeNode(reader); 10824 } 10825 assignPrefixCodes(lines) { 10826 const linesLength = lines.length; 10827 let prefixLengthMax = 0; 10828 for (let i = 0; i < linesLength; i++) { 10829 prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength); 10830 } 10831 const histogram = new Uint32Array(prefixLengthMax + 1); 10832 for (let i = 0; i < linesLength; i++) { 10833 histogram[lines[i].prefixLength]++; 10834 } 10835 let currentLength = 1, 10836 firstCode = 0, 10837 currentCode, 10838 currentTemp, 10839 line; 10840 histogram[0] = 0; 10841 while (currentLength <= prefixLengthMax) { 10842 firstCode = firstCode + histogram[currentLength - 1] << 1; 10843 currentCode = firstCode; 10844 currentTemp = 0; 10845 while (currentTemp < linesLength) { 10846 line = lines[currentTemp]; 10847 if (line.prefixLength === currentLength) { 10848 line.prefixCode = currentCode; 10849 currentCode++; 10850 } 10851 currentTemp++; 10852 } 10853 currentLength++; 10854 } 10855 } 10856} 10857function decodeTablesSegment(data, start, end) { 10858 const flags = data[start]; 10859 const lowestValue = readUint32(data, start + 1) & 0xffffffff; 10860 const highestValue = readUint32(data, start + 5) & 0xffffffff; 10861 const reader = new Reader(data, start + 9, end); 10862 const prefixSizeBits = (flags >> 1 & 7) + 1; 10863 const rangeSizeBits = (flags >> 4 & 7) + 1; 10864 const lines = []; 10865 let prefixLength, 10866 rangeLength, 10867 currentRangeLow = lowestValue; 10868 do { 10869 prefixLength = reader.readBits(prefixSizeBits); 10870 rangeLength = reader.readBits(rangeSizeBits); 10871 lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0])); 10872 currentRangeLow += 1 << rangeLength; 10873 } while (currentRangeLow < highestValue); 10874 prefixLength = reader.readBits(prefixSizeBits); 10875 lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"])); 10876 prefixLength = reader.readBits(prefixSizeBits); 10877 lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0])); 10878 if (flags & 1) { 10879 prefixLength = reader.readBits(prefixSizeBits); 10880 lines.push(new HuffmanLine([prefixLength, 0])); 10881 } 10882 return new HuffmanTable(lines, false); 10883} 10884const standardTablesCache = {}; 10885function getStandardTable(number) { 10886 let table = standardTablesCache[number]; 10887 if (table) { 10888 return table; 10889 } 10890 let lines; 10891 switch (number) { 10892 case 1: 10893 lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]]; 10894 break; 10895 case 2: 10896 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]]; 10897 break; 10898 case 3: 10899 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]]; 10900 break; 10901 case 4: 10902 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]]; 10903 break; 10904 case 5: 10905 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]]; 10906 break; 10907 case 6: 10908 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]]; 10909 break; 10910 case 7: 10911 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]]; 10912 break; 10913 case 8: 10914 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]]; 10915 break; 10916 case 9: 10917 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]]; 10918 break; 10919 case 10: 10920 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]]; 10921 break; 10922 case 11: 10923 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]]; 10924 break; 10925 case 12: 10926 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]]; 10927 break; 10928 case 13: 10929 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]]; 10930 break; 10931 case 14: 10932 lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]]; 10933 break; 10934 case 15: 10935 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]]; 10936 break; 10937 default: 10938 throw new Jbig2Error(`standard table B.${number} does not exist`); 10939 } 10940 for (let i = 0, ii = lines.length; i < ii; i++) { 10941 lines[i] = new HuffmanLine(lines[i]); 10942 } 10943 table = new HuffmanTable(lines, true); 10944 standardTablesCache[number] = table; 10945 return table; 10946} 10947class Reader { 10948 constructor(data, start, end) { 10949 this.data = data; 10950 this.start = start; 10951 this.end = end; 10952 this.position = start; 10953 this.shift = -1; 10954 this.currentByte = 0; 10955 } 10956 readBit() { 10957 if (this.shift < 0) { 10958 if (this.position >= this.end) { 10959 throw new Jbig2Error("end of data while reading bit"); 10960 } 10961 this.currentByte = this.data[this.position++]; 10962 this.shift = 7; 10963 } 10964 const bit = this.currentByte >> this.shift & 1; 10965 this.shift--; 10966 return bit; 10967 } 10968 readBits(numBits) { 10969 let result = 0, 10970 i; 10971 for (i = numBits - 1; i >= 0; i--) { 10972 result |= this.readBit() << i; 10973 } 10974 return result; 10975 } 10976 byteAlign() { 10977 this.shift = -1; 10978 } 10979 next() { 10980 if (this.position >= this.end) { 10981 return -1; 10982 } 10983 return this.data[this.position++]; 10984 } 10985} 10986function getCustomHuffmanTable(index, referredTo, customTables) { 10987 let currentIndex = 0; 10988 for (let i = 0, ii = referredTo.length; i < ii; i++) { 10989 const table = customTables[referredTo[i]]; 10990 if (table) { 10991 if (index === currentIndex) { 10992 return table; 10993 } 10994 currentIndex++; 10995 } 10996 } 10997 throw new Jbig2Error("can't find custom Huffman table"); 10998} 10999function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) { 11000 const codes = []; 11001 for (let i = 0; i <= 34; i++) { 11002 const codeLength = reader.readBits(4); 11003 codes.push(new HuffmanLine([i, codeLength, 0, 0])); 11004 } 11005 const runCodesTable = new HuffmanTable(codes, false); 11006 codes.length = 0; 11007 for (let i = 0; i < numberOfSymbols;) { 11008 const codeLength = runCodesTable.decode(reader); 11009 if (codeLength >= 32) { 11010 let repeatedLength, numberOfRepeats, j; 11011 switch (codeLength) { 11012 case 32: 11013 if (i === 0) { 11014 throw new Jbig2Error("no previous value in symbol ID table"); 11015 } 11016 numberOfRepeats = reader.readBits(2) + 3; 11017 repeatedLength = codes[i - 1].prefixLength; 11018 break; 11019 case 33: 11020 numberOfRepeats = reader.readBits(3) + 3; 11021 repeatedLength = 0; 11022 break; 11023 case 34: 11024 numberOfRepeats = reader.readBits(7) + 11; 11025 repeatedLength = 0; 11026 break; 11027 default: 11028 throw new Jbig2Error("invalid code length in symbol ID table"); 11029 } 11030 for (j = 0; j < numberOfRepeats; j++) { 11031 codes.push(new HuffmanLine([i, repeatedLength, 0, 0])); 11032 i++; 11033 } 11034 } else { 11035 codes.push(new HuffmanLine([i, codeLength, 0, 0])); 11036 i++; 11037 } 11038 } 11039 reader.byteAlign(); 11040 const symbolIDTable = new HuffmanTable(codes, false); 11041 let customIndex = 0, 11042 tableFirstS, 11043 tableDeltaS, 11044 tableDeltaT; 11045 switch (textRegion.huffmanFS) { 11046 case 0: 11047 case 1: 11048 tableFirstS = getStandardTable(textRegion.huffmanFS + 6); 11049 break; 11050 case 3: 11051 tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables); 11052 customIndex++; 11053 break; 11054 default: 11055 throw new Jbig2Error("invalid Huffman FS selector"); 11056 } 11057 switch (textRegion.huffmanDS) { 11058 case 0: 11059 case 1: 11060 case 2: 11061 tableDeltaS = getStandardTable(textRegion.huffmanDS + 8); 11062 break; 11063 case 3: 11064 tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables); 11065 customIndex++; 11066 break; 11067 default: 11068 throw new Jbig2Error("invalid Huffman DS selector"); 11069 } 11070 switch (textRegion.huffmanDT) { 11071 case 0: 11072 case 1: 11073 case 2: 11074 tableDeltaT = getStandardTable(textRegion.huffmanDT + 11); 11075 break; 11076 case 3: 11077 tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables); 11078 customIndex++; 11079 break; 11080 default: 11081 throw new Jbig2Error("invalid Huffman DT selector"); 11082 } 11083 if (textRegion.refinement) { 11084 throw new Jbig2Error("refinement with Huffman is not supported"); 11085 } 11086 return { 11087 symbolIDTable, 11088 tableFirstS, 11089 tableDeltaS, 11090 tableDeltaT 11091 }; 11092} 11093function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) { 11094 let customIndex = 0, 11095 tableDeltaHeight, 11096 tableDeltaWidth; 11097 switch (dictionary.huffmanDHSelector) { 11098 case 0: 11099 case 1: 11100 tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4); 11101 break; 11102 case 3: 11103 tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables); 11104 customIndex++; 11105 break; 11106 default: 11107 throw new Jbig2Error("invalid Huffman DH selector"); 11108 } 11109 switch (dictionary.huffmanDWSelector) { 11110 case 0: 11111 case 1: 11112 tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2); 11113 break; 11114 case 3: 11115 tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables); 11116 customIndex++; 11117 break; 11118 default: 11119 throw new Jbig2Error("invalid Huffman DW selector"); 11120 } 11121 let tableBitmapSize, tableAggregateInstances; 11122 if (dictionary.bitmapSizeSelector) { 11123 tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables); 11124 customIndex++; 11125 } else { 11126 tableBitmapSize = getStandardTable(1); 11127 } 11128 if (dictionary.aggregationInstancesSelector) { 11129 tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables); 11130 } else { 11131 tableAggregateInstances = getStandardTable(1); 11132 } 11133 return { 11134 tableDeltaHeight, 11135 tableDeltaWidth, 11136 tableBitmapSize, 11137 tableAggregateInstances 11138 }; 11139} 11140function readUncompressedBitmap(reader, width, height) { 11141 const bitmap = []; 11142 for (let y = 0; y < height; y++) { 11143 const row = new Uint8Array(width); 11144 bitmap.push(row); 11145 for (let x = 0; x < width; x++) { 11146 row[x] = reader.readBit(); 11147 } 11148 reader.byteAlign(); 11149 } 11150 return bitmap; 11151} 11152function decodeMMRBitmap(input, width, height, endOfBlock) { 11153 const params = { 11154 K: -1, 11155 Columns: width, 11156 Rows: height, 11157 BlackIs1: true, 11158 EndOfBlock: endOfBlock 11159 }; 11160 const decoder = new CCITTFaxDecoder(input, params); 11161 const bitmap = []; 11162 let currentByte, 11163 eof = false; 11164 for (let y = 0; y < height; y++) { 11165 const row = new Uint8Array(width); 11166 bitmap.push(row); 11167 let shift = -1; 11168 for (let x = 0; x < width; x++) { 11169 if (shift < 0) { 11170 currentByte = decoder.readNextChar(); 11171 if (currentByte === -1) { 11172 currentByte = 0; 11173 eof = true; 11174 } 11175 shift = 7; 11176 } 11177 row[x] = currentByte >> shift & 1; 11178 shift--; 11179 } 11180 } 11181 if (endOfBlock && !eof) { 11182 const lookForEOFLimit = 5; 11183 for (let i = 0; i < lookForEOFLimit; i++) { 11184 if (decoder.readNextChar() === -1) { 11185 break; 11186 } 11187 } 11188 } 11189 return bitmap; 11190} 11191class Jbig2Image { 11192 parseChunks(chunks) { 11193 return parseJbig2Chunks(chunks); 11194 } 11195 parse(data) { 11196 throw new Error("Not implemented: Jbig2Image.parse"); 11197 } 11198} 11199 11200;// ./src/core/jbig2_stream.js 11201 11202 11203 11204 11205 11206 11207class Jbig2Stream extends DecodeStream { 11208 constructor(stream, maybeLength, params) { 11209 super(maybeLength); 11210 this.stream = stream; 11211 this.dict = stream.dict; 11212 this.maybeLength = maybeLength; 11213 this.params = params; 11214 } 11215 get bytes() { 11216 return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); 11217 } 11218 ensureBuffer(requested) {} 11219 readBlock() { 11220 this.decodeImage(); 11221 } 11222 decodeImage(bytes) { 11223 if (this.eof) { 11224 return this.buffer; 11225 } 11226 bytes ||= this.bytes; 11227 const jbig2Image = new Jbig2Image(); 11228 const chunks = []; 11229 if (this.params instanceof Dict) { 11230 const globalsStream = this.params.get("JBIG2Globals"); 11231 if (globalsStream instanceof BaseStream) { 11232 const globals = globalsStream.getBytes(); 11233 chunks.push({ 11234 data: globals, 11235 start: 0, 11236 end: globals.length 11237 }); 11238 } 11239 } 11240 chunks.push({ 11241 data: bytes, 11242 start: 0, 11243 end: bytes.length 11244 }); 11245 const data = jbig2Image.parseChunks(chunks); 11246 const dataLength = data.length; 11247 for (let i = 0; i < dataLength; i++) { 11248 data[i] ^= 0xff; 11249 } 11250 this.buffer = data; 11251 this.bufferLength = dataLength; 11252 this.eof = true; 11253 return this.buffer; 11254 } 11255 get canAsyncDecodeImageFromBuffer() { 11256 return this.stream.isAsync; 11257 } 11258} 11259 11260;// ./src/shared/image_utils.js 11261 11262 11263 11264 11265 11266 11267 11268function convertToRGBA(params) { 11269 switch (params.kind) { 11270 case ImageKind.GRAYSCALE_1BPP: 11271 return convertBlackAndWhiteToRGBA(params); 11272 case ImageKind.RGB_24BPP: 11273 return convertRGBToRGBA(params); 11274 } 11275 return null; 11276} 11277function convertBlackAndWhiteToRGBA({ 11278 src, 11279 srcPos = 0, 11280 dest, 11281 width, 11282 height, 11283 nonBlackColor = 0xffffffff, 11284 inverseDecode = false 11285}) { 11286 const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; 11287 const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; 11288 const widthInSource = width >> 3; 11289 const widthRemainder = width & 7; 11290 const srcLength = src.length; 11291 dest = new Uint32Array(dest.buffer); 11292 let destPos = 0; 11293 for (let i = 0; i < height; i++) { 11294 for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { 11295 const elem = srcPos < srcLength ? src[srcPos] : 255; 11296 dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; 11297 dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; 11298 dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; 11299 dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; 11300 dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; 11301 dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; 11302 dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; 11303 dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; 11304 } 11305 if (widthRemainder === 0) { 11306 continue; 11307 } 11308 const elem = srcPos < srcLength ? src[srcPos++] : 255; 11309 for (let j = 0; j < widthRemainder; j++) { 11310 dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; 11311 } 11312 } 11313 return { 11314 srcPos, 11315 destPos 11316 }; 11317} 11318function convertRGBToRGBA({ 11319 src, 11320 srcPos = 0, 11321 dest, 11322 destPos = 0, 11323 width, 11324 height 11325}) { 11326 let i = 0; 11327 const len = width * height * 3; 11328 const len32 = len >> 2; 11329 const src32 = new Uint32Array(src.buffer, srcPos, len32); 11330 if (FeatureTest.isLittleEndian) { 11331 for (; i < len32 - 2; i += 3, destPos += 4) { 11332 const s1 = src32[i]; 11333 const s2 = src32[i + 1]; 11334 const s3 = src32[i + 2]; 11335 dest[destPos] = s1 | 0xff000000; 11336 dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; 11337 dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; 11338 dest[destPos + 3] = s3 >>> 8 | 0xff000000; 11339 } 11340 for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { 11341 dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; 11342 } 11343 } else { 11344 for (; i < len32 - 2; i += 3, destPos += 4) { 11345 const s1 = src32[i]; 11346 const s2 = src32[i + 1]; 11347 const s3 = src32[i + 2]; 11348 dest[destPos] = s1 | 0xff; 11349 dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; 11350 dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; 11351 dest[destPos + 3] = s3 << 8 | 0xff; 11352 } 11353 for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { 11354 dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; 11355 } 11356 } 11357 return { 11358 srcPos: srcPos + len, 11359 destPos 11360 }; 11361} 11362function grayToRGBA(src, dest) { 11363 if (FeatureTest.isLittleEndian) { 11364 for (let i = 0, ii = src.length; i < ii; i++) { 11365 dest[i] = src[i] * 0x10101 | 0xff000000; 11366 } 11367 } else { 11368 for (let i = 0, ii = src.length; i < ii; i++) { 11369 dest[i] = src[i] * 0x1010100 | 0x000000ff; 11370 } 11371 } 11372} 11373 11374;// ./src/core/jpg.js 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385class JpegError extends BaseException { 11386 constructor(msg) { 11387 super(msg, "JpegError"); 11388 } 11389} 11390class DNLMarkerError extends BaseException { 11391 constructor(message, scanLines) { 11392 super(message, "DNLMarkerError"); 11393 this.scanLines = scanLines; 11394 } 11395} 11396class EOIMarkerError extends BaseException { 11397 constructor(msg) { 11398 super(msg, "EOIMarkerError"); 11399 } 11400} 11401const 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]); 11402const dctCos1 = 4017; 11403const dctSin1 = 799; 11404const dctCos3 = 3406; 11405const dctSin3 = 2276; 11406const dctCos6 = 1567; 11407const dctSin6 = 3784; 11408const dctSqrt2 = 5793; 11409const dctSqrt1d2 = 2896; 11410function buildHuffmanTable(codeLengths, values) { 11411 let k = 0, 11412 i, 11413 j, 11414 length = 16; 11415 while (length > 0 && !codeLengths[length - 1]) { 11416 length--; 11417 } 11418 const code = [{ 11419 children: [], 11420 index: 0 11421 }]; 11422 let p = code[0], 11423 q; 11424 for (i = 0; i < length; i++) { 11425 for (j = 0; j < codeLengths[i]; j++) { 11426 p = code.pop(); 11427 p.children[p.index] = values[k]; 11428 while (p.index > 0) { 11429 p = code.pop(); 11430 } 11431 p.index++; 11432 code.push(p); 11433 while (code.length <= i) { 11434 code.push(q = { 11435 children: [], 11436 index: 0 11437 }); 11438 p.children[p.index] = q.children; 11439 p = q; 11440 } 11441 k++; 11442 } 11443 if (i + 1 < length) { 11444 code.push(q = { 11445 children: [], 11446 index: 0 11447 }); 11448 p.children[p.index] = q.children; 11449 p = q; 11450 } 11451 } 11452 return code[0].children; 11453} 11454function getBlockBufferOffset(component, row, col) { 11455 return 64 * ((component.blocksPerLine + 1) * row + col); 11456} 11457function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) { 11458 const mcusPerLine = frame.mcusPerLine; 11459 const progressive = frame.progressive; 11460 const startOffset = offset; 11461 let bitsData = 0, 11462 bitsCount = 0; 11463 function readBit() { 11464 if (bitsCount > 0) { 11465 bitsCount--; 11466 return bitsData >> bitsCount & 1; 11467 } 11468 bitsData = data[offset++]; 11469 if (bitsData === 0xff) { 11470 const nextByte = data[offset++]; 11471 if (nextByte) { 11472 if (nextByte === 0xdc && parseDNLMarker) { 11473 offset += 2; 11474 const scanLines = readUint16(data, offset); 11475 offset += 2; 11476 if (scanLines > 0 && scanLines !== frame.scanLines) { 11477 throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines); 11478 } 11479 } else if (nextByte === 0xd9) { 11480 if (parseDNLMarker) { 11481 const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); 11482 if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) { 11483 throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines); 11484 } 11485 } 11486 throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data"); 11487 } 11488 throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`); 11489 } 11490 } 11491 bitsCount = 7; 11492 return bitsData >>> 7; 11493 } 11494 function decodeHuffman(tree) { 11495 let node = tree; 11496 while (true) { 11497 node = node[readBit()]; 11498 switch (typeof node) { 11499 case "number": 11500 return node; 11501 case "object": 11502 continue; 11503 } 11504 throw new JpegError("invalid huffman sequence"); 11505 } 11506 } 11507 function receive(length) { 11508 let n = 0; 11509 while (length > 0) { 11510 n = n << 1 | readBit(); 11511 length--; 11512 } 11513 return n; 11514 } 11515 function receiveAndExtend(length) { 11516 if (length === 1) { 11517 return readBit() === 1 ? 1 : -1; 11518 } 11519 const n = receive(length); 11520 if (n >= 1 << length - 1) { 11521 return n; 11522 } 11523 return n + (-1 << length) + 1; 11524 } 11525 function decodeBaseline(component, blockOffset) { 11526 const t = decodeHuffman(component.huffmanTableDC); 11527 const diff = t === 0 ? 0 : receiveAndExtend(t); 11528 component.blockData[blockOffset] = component.pred += diff; 11529 let k = 1; 11530 while (k < 64) { 11531 const rs = decodeHuffman(component.huffmanTableAC); 11532 const s = rs & 15, 11533 r = rs >> 4; 11534 if (s === 0) { 11535 if (r < 15) { 11536 break; 11537 } 11538 k += 16; 11539 continue; 11540 } 11541 k += r; 11542 const z = dctZigZag[k]; 11543 component.blockData[blockOffset + z] = receiveAndExtend(s); 11544 k++; 11545 } 11546 } 11547 function decodeDCFirst(component, blockOffset) { 11548 const t = decodeHuffman(component.huffmanTableDC); 11549 const diff = t === 0 ? 0 : receiveAndExtend(t) << successive; 11550 component.blockData[blockOffset] = component.pred += diff; 11551 } 11552 function decodeDCSuccessive(component, blockOffset) { 11553 component.blockData[blockOffset] |= readBit() << successive; 11554 } 11555 let eobrun = 0; 11556 function decodeACFirst(component, blockOffset) { 11557 if (eobrun > 0) { 11558 eobrun--; 11559 return; 11560 } 11561 let k = spectralStart; 11562 const e = spectralEnd; 11563 while (k <= e) { 11564 const rs = decodeHuffman(component.huffmanTableAC); 11565 const s = rs & 15, 11566 r = rs >> 4; 11567 if (s === 0) { 11568 if (r < 15) { 11569 eobrun = receive(r) + (1 << r) - 1; 11570 break; 11571 } 11572 k += 16; 11573 continue; 11574 } 11575 k += r; 11576 const z = dctZigZag[k]; 11577 component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive); 11578 k++; 11579 } 11580 } 11581 let successiveACState = 0, 11582 successiveACNextValue; 11583 function decodeACSuccessive(component, blockOffset) { 11584 let k = spectralStart; 11585 const e = spectralEnd; 11586 let r = 0; 11587 let s; 11588 let rs; 11589 while (k <= e) { 11590 const offsetZ = blockOffset + dctZigZag[k]; 11591 const sign = component.blockData[offsetZ] < 0 ? -1 : 1; 11592 switch (successiveACState) { 11593 case 0: 11594 rs = decodeHuffman(component.huffmanTableAC); 11595 s = rs & 15; 11596 r = rs >> 4; 11597 if (s === 0) { 11598 if (r < 15) { 11599 eobrun = receive(r) + (1 << r); 11600 successiveACState = 4; 11601 } else { 11602 r = 16; 11603 successiveACState = 1; 11604 } 11605 } else { 11606 if (s !== 1) { 11607 throw new JpegError("invalid ACn encoding"); 11608 } 11609 successiveACNextValue = receiveAndExtend(s); 11610 successiveACState = r ? 2 : 3; 11611 } 11612 continue; 11613 case 1: 11614 case 2: 11615 if (component.blockData[offsetZ]) { 11616 component.blockData[offsetZ] += sign * (readBit() << successive); 11617 } else { 11618 r--; 11619 if (r === 0) { 11620 successiveACState = successiveACState === 2 ? 3 : 0; 11621 } 11622 } 11623 break; 11624 case 3: 11625 if (component.blockData[offsetZ]) { 11626 component.blockData[offsetZ] += sign * (readBit() << successive); 11627 } else { 11628 component.blockData[offsetZ] = successiveACNextValue << successive; 11629 successiveACState = 0; 11630 } 11631 break; 11632 case 4: 11633 if (component.blockData[offsetZ]) { 11634 component.blockData[offsetZ] += sign * (readBit() << successive); 11635 } 11636 break; 11637 } 11638 k++; 11639 } 11640 if (successiveACState === 4) { 11641 eobrun--; 11642 if (eobrun === 0) { 11643 successiveACState = 0; 11644 } 11645 } 11646 } 11647 let blockRow = 0; 11648 function decodeMcu(component, decode, mcu, row, col) { 11649 const mcuRow = mcu / mcusPerLine | 0; 11650 const mcuCol = mcu % mcusPerLine; 11651 blockRow = mcuRow * component.v + row; 11652 const blockCol = mcuCol * component.h + col; 11653 const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); 11654 decode(component, blockOffset); 11655 } 11656 function decodeBlock(component, decode, mcu) { 11657 blockRow = mcu / component.blocksPerLine | 0; 11658 const blockCol = mcu % component.blocksPerLine; 11659 const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); 11660 decode(component, blockOffset); 11661 } 11662 const componentsLength = components.length; 11663 let component, i, j, k, n; 11664 let decodeFn; 11665 if (progressive) { 11666 if (spectralStart === 0) { 11667 decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; 11668 } else { 11669 decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; 11670 } 11671 } else { 11672 decodeFn = decodeBaseline; 11673 } 11674 let mcu = 0, 11675 fileMarker; 11676 const mcuExpected = componentsLength === 1 ? components[0].blocksPerLine * components[0].blocksPerColumn : mcusPerLine * frame.mcusPerColumn; 11677 let h, v; 11678 while (mcu <= mcuExpected) { 11679 const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected; 11680 if (mcuToRead > 0) { 11681 for (i = 0; i < componentsLength; i++) { 11682 components[i].pred = 0; 11683 } 11684 eobrun = 0; 11685 if (componentsLength === 1) { 11686 component = components[0]; 11687 for (n = 0; n < mcuToRead; n++) { 11688 decodeBlock(component, decodeFn, mcu); 11689 mcu++; 11690 } 11691 } else { 11692 for (n = 0; n < mcuToRead; n++) { 11693 for (i = 0; i < componentsLength; i++) { 11694 component = components[i]; 11695 h = component.h; 11696 v = component.v; 11697 for (j = 0; j < v; j++) { 11698 for (k = 0; k < h; k++) { 11699 decodeMcu(component, decodeFn, mcu, j, k); 11700 } 11701 } 11702 } 11703 mcu++; 11704 } 11705 } 11706 } 11707 bitsCount = 0; 11708 fileMarker = findNextFileMarker(data, offset); 11709 if (!fileMarker) { 11710 break; 11711 } 11712 if (fileMarker.invalid) { 11713 const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive"; 11714 warn(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`); 11715 offset = fileMarker.offset; 11716 } 11717 if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) { 11718 offset += 2; 11719 } else { 11720 break; 11721 } 11722 } 11723 return offset - startOffset; 11724} 11725function quantizeAndInverse(component, blockBufferOffset, p) { 11726 const qt = component.quantizationTable, 11727 blockData = component.blockData; 11728 let v0, v1, v2, v3, v4, v5, v6, v7; 11729 let p0, p1, p2, p3, p4, p5, p6, p7; 11730 let t; 11731 if (!qt) { 11732 throw new JpegError("missing required Quantization Table."); 11733 } 11734 for (let row = 0; row < 64; row += 8) { 11735 p0 = blockData[blockBufferOffset + row]; 11736 p1 = blockData[blockBufferOffset + row + 1]; 11737 p2 = blockData[blockBufferOffset + row + 2]; 11738 p3 = blockData[blockBufferOffset + row + 3]; 11739 p4 = blockData[blockBufferOffset + row + 4]; 11740 p5 = blockData[blockBufferOffset + row + 5]; 11741 p6 = blockData[blockBufferOffset + row + 6]; 11742 p7 = blockData[blockBufferOffset + row + 7]; 11743 p0 *= qt[row]; 11744 if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { 11745 t = dctSqrt2 * p0 + 512 >> 10; 11746 p[row] = t; 11747 p[row + 1] = t; 11748 p[row + 2] = t; 11749 p[row + 3] = t; 11750 p[row + 4] = t; 11751 p[row + 5] = t; 11752 p[row + 6] = t; 11753 p[row + 7] = t;
vendor: 2,429 bytes, lines 11754-11848
11754 continue; 11755 } 11756 p1 *= qt[row + 1]; 11757 p2 *= qt[row + 2]; 11758 p3 *= qt[row + 3]; 11759 p4 *= qt[row + 4]; 11760 p5 *= qt[row + 5]; 11761 p6 *= qt[row + 6]; 11762 p7 *= qt[row + 7]; 11763 v0 = dctSqrt2 * p0 + 128 >> 8; 11764 v1 = dctSqrt2 * p4 + 128 >> 8; 11765 v2 = p2; 11766 v3 = p6; 11767 v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8; 11768 v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8; 11769 v5 = p3 << 4; 11770 v6 = p5 << 4; 11771 v0 = v0 + v1 + 1 >> 1; 11772 v1 = v0 - v1; 11773 t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; 11774 v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; 11775 v3 = t; 11776 v4 = v4 + v6 + 1 >> 1; 11777 v6 = v4 - v6; 11778 v7 = v7 + v5 + 1 >> 1; 11779 v5 = v7 - v5; 11780 v0 = v0 + v3 + 1 >> 1; 11781 v3 = v0 - v3; 11782 v1 = v1 + v2 + 1 >> 1; 11783 v2 = v1 - v2; 11784 t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; 11785 v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; 11786 v7 = t; 11787 t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; 11788 v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; 11789 v6 = t; 11790 p[row] = v0 + v7; 11791 p[row + 7] = v0 - v7; 11792 p[row + 1] = v1 + v6; 11793 p[row + 6] = v1 - v6; 11794 p[row + 2] = v2 + v5; 11795 p[row + 5] = v2 - v5; 11796 p[row + 3] = v3 + v4; 11797 p[row + 4] = v3 - v4; 11798 } 11799 for (let col = 0; col < 8; ++col) { 11800 p0 = p[col]; 11801 p1 = p[col + 8]; 11802 p2 = p[col + 16]; 11803 p3 = p[col + 24]; 11804 p4 = p[col + 32]; 11805 p5 = p[col + 40]; 11806 p6 = p[col + 48]; 11807 p7 = p[col + 56]; 11808 if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { 11809 t = dctSqrt2 * p0 + 8192 >> 14; 11810 if (t < -2040) { 11811 t = 0; 11812 } else if (t >= 2024) { 11813 t = 255; 11814 } else { 11815 t = t + 2056 >> 4; 11816 } 11817 blockData[blockBufferOffset + col] = t; 11818 blockData[blockBufferOffset + col + 8] = t; 11819 blockData[blockBufferOffset + col + 16] = t; 11820 blockData[blockBufferOffset + col + 24] = t; 11821 blockData[blockBufferOffset + col + 32] = t; 11822 blockData[blockBufferOffset + col + 40] = t; 11823 blockData[blockBufferOffset + col + 48] = t; 11824 blockData[blockBufferOffset + col + 56] = t; 11825 continue; 11826 } 11827 v0 = dctSqrt2 * p0 + 2048 >> 12; 11828 v1 = dctSqrt2 * p4 + 2048 >> 12; 11829 v2 = p2; 11830 v3 = p6; 11831 v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12; 11832 v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12; 11833 v5 = p3; 11834 v6 = p5; 11835 v0 = (v0 + v1 + 1 >> 1) + 4112; 11836 v1 = v0 - v1; 11837 t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; 11838 v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; 11839 v3 = t; 11840 v4 = v4 + v6 + 1 >> 1; 11841 v6 = v4 - v6; 11842 v7 = v7 + v5 + 1 >> 1; 11843 v5 = v7 - v5; 11844 v0 = v0 + v3 + 1 >> 1; 11845 v3 = v0 - v3; 11846 v1 = v1 + v2 + 1 >> 1; 11847 v2 = v1 - v2; 11848 t = v4 * dctSin3 + v7 * dctCos3 + 2048 >>
vendor: 13,813 bytes, lines 11848-12321
11848 12; 11849 v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; 11850 v7 = t; 11851 t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; 11852 v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; 11853 v6 = t; 11854 p0 = v0 + v7; 11855 p7 = v0 - v7; 11856 p1 = v1 + v6; 11857 p6 = v1 - v6; 11858 p2 = v2 + v5; 11859 p5 = v2 - v5; 11860 p3 = v3 + v4; 11861 p4 = v3 - v4; 11862 if (p0 < 16) { 11863 p0 = 0; 11864 } else if (p0 >= 4080) { 11865 p0 = 255; 11866 } else { 11867 p0 >>= 4; 11868 } 11869 if (p1 < 16) { 11870 p1 = 0; 11871 } else if (p1 >= 4080) { 11872 p1 = 255; 11873 } else { 11874 p1 >>= 4; 11875 } 11876 if (p2 < 16) { 11877 p2 = 0; 11878 } else if (p2 >= 4080) { 11879 p2 = 255; 11880 } else { 11881 p2 >>= 4; 11882 } 11883 if (p3 < 16) { 11884 p3 = 0; 11885 } else if (p3 >= 4080) { 11886 p3 = 255; 11887 } else { 11888 p3 >>= 4; 11889 } 11890 if (p4 < 16) { 11891 p4 = 0; 11892 } else if (p4 >= 4080) { 11893 p4 = 255; 11894 } else { 11895 p4 >>= 4; 11896 } 11897 if (p5 < 16) { 11898 p5 = 0; 11899 } else if (p5 >= 4080) { 11900 p5 = 255; 11901 } else { 11902 p5 >>= 4; 11903 } 11904 if (p6 < 16) { 11905 p6 = 0; 11906 } else if (p6 >= 4080) { 11907 p6 = 255; 11908 } else { 11909 p6 >>= 4; 11910 } 11911 if (p7 < 16) { 11912 p7 = 0; 11913 } else if (p7 >= 4080) { 11914 p7 = 255; 11915 } else { 11916 p7 >>= 4; 11917 } 11918 blockData[blockBufferOffset + col] = p0; 11919 blockData[blockBufferOffset + col + 8] = p1; 11920 blockData[blockBufferOffset + col + 16] = p2; 11921 blockData[blockBufferOffset + col + 24] = p3; 11922 blockData[blockBufferOffset + col + 32] = p4; 11923 blockData[blockBufferOffset + col + 40] = p5; 11924 blockData[blockBufferOffset + col + 48] = p6; 11925 blockData[blockBufferOffset + col + 56] = p7; 11926 } 11927} 11928function buildComponentData(frame, component) { 11929 const blocksPerLine = component.blocksPerLine; 11930 const blocksPerColumn = component.blocksPerColumn; 11931 const computationBuffer = new Int16Array(64); 11932 for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) { 11933 for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) { 11934 const offset = getBlockBufferOffset(component, blockRow, blockCol); 11935 quantizeAndInverse(component, offset, computationBuffer); 11936 } 11937 } 11938 return component.blockData; 11939} 11940function findNextFileMarker(data, currentPos, startPos = currentPos) { 11941 const maxPos = data.length - 1; 11942 let newPos = startPos < currentPos ? startPos : currentPos; 11943 if (currentPos >= maxPos) { 11944 return null; 11945 } 11946 const currentMarker = readUint16(data, currentPos); 11947 if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { 11948 return { 11949 invalid: null, 11950 marker: currentMarker, 11951 offset: currentPos 11952 }; 11953 } 11954 let newMarker = readUint16(data, newPos); 11955 while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { 11956 if (++newPos >= maxPos) { 11957 return null; 11958 } 11959 newMarker = readUint16(data, newPos); 11960 } 11961 return { 11962 invalid: currentMarker.toString(16), 11963 marker: newMarker, 11964 offset: newPos 11965 }; 11966} 11967function prepareComponents(frame) { 11968 const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); 11969 const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); 11970 for (const component of frame.components) { 11971 const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); 11972 const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); 11973 const blocksPerLineForMcu = mcusPerLine * component.h; 11974 const blocksPerColumnForMcu = mcusPerColumn * component.v; 11975 const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); 11976 component.blockData = new Int16Array(blocksBufferSize); 11977 component.blocksPerLine = blocksPerLine; 11978 component.blocksPerColumn = blocksPerColumn; 11979 } 11980 frame.mcusPerLine = mcusPerLine; 11981 frame.mcusPerColumn = mcusPerColumn; 11982} 11983function readDataBlock(data, offset) { 11984 const length = readUint16(data, offset); 11985 offset += 2; 11986 let endOffset = offset + length - 2; 11987 const fileMarker = findNextFileMarker(data, endOffset, offset); 11988 if (fileMarker?.invalid) { 11989 warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); 11990 endOffset = fileMarker.offset; 11991 } 11992 const array = data.subarray(offset, endOffset); 11993 offset += array.length; 11994 return { 11995 appData: array, 11996 newOffset: offset 11997 }; 11998} 11999function skipData(data, offset) { 12000 const length = readUint16(data, offset); 12001 offset += 2; 12002 const endOffset = offset + length - 2; 12003 const fileMarker = findNextFileMarker(data, endOffset, offset); 12004 if (fileMarker?.invalid) { 12005 return fileMarker.offset; 12006 } 12007 return endOffset; 12008} 12009class JpegImage { 12010 constructor({ 12011 decodeTransform = null, 12012 colorTransform = -1 12013 } = {}) { 12014 this._decodeTransform = decodeTransform; 12015 this._colorTransform = colorTransform; 12016 } 12017 static canUseImageDecoder(data, colorTransform = -1) { 12018 let offset = 0; 12019 let numComponents = null; 12020 let fileMarker = readUint16(data, offset); 12021 offset += 2; 12022 if (fileMarker !== 0xffd8) { 12023 throw new JpegError("SOI not found"); 12024 } 12025 fileMarker = readUint16(data, offset); 12026 offset += 2; 12027 markerLoop: while (fileMarker !== 0xffd9) { 12028 switch (fileMarker) { 12029 case 0xffc0: 12030 case 0xffc1: 12031 case 0xffc2: 12032 numComponents = data[offset + (2 + 1 + 2 + 2)]; 12033 break markerLoop; 12034 case 0xffff: 12035 if (data[offset] !== 0xff) { 12036 offset--; 12037 } 12038 break; 12039 } 12040 offset = skipData(data, offset); 12041 fileMarker = readUint16(data, offset); 12042 offset += 2; 12043 } 12044 if (numComponents === 4) { 12045 return false; 12046 } 12047 if (numComponents === 3 && colorTransform === 0) { 12048 return false; 12049 } 12050 return true; 12051 } 12052 parse(data, { 12053 dnlScanLines = null 12054 } = {}) { 12055 let offset = 0; 12056 let jfif = null; 12057 let adobe = null; 12058 let frame, resetInterval; 12059 let numSOSMarkers = 0; 12060 const quantizationTables = []; 12061 const huffmanTablesAC = [], 12062 huffmanTablesDC = []; 12063 let fileMarker = readUint16(data, offset); 12064 offset += 2; 12065 if (fileMarker !== 0xffd8) { 12066 throw new JpegError("SOI not found"); 12067 } 12068 fileMarker = readUint16(data, offset); 12069 offset += 2; 12070 markerLoop: while (fileMarker !== 0xffd9) { 12071 let i, j, l; 12072 switch (fileMarker) { 12073 case 0xffe0: 12074 case 0xffe1: 12075 case 0xffe2: 12076 case 0xffe3: 12077 case 0xffe4: 12078 case 0xffe5: 12079 case 0xffe6: 12080 case 0xffe7: 12081 case 0xffe8: 12082 case 0xffe9: 12083 case 0xffea: 12084 case 0xffeb: 12085 case 0xffec: 12086 case 0xffed: 12087 case 0xffee: 12088 case 0xffef: 12089 case 0xfffe: 12090 const { 12091 appData, 12092 newOffset 12093 } = readDataBlock(data, offset); 12094 offset = newOffset; 12095 if (fileMarker === 0xffe0) { 12096 if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { 12097 jfif = { 12098 version: { 12099 major: appData[5], 12100 minor: appData[6] 12101 }, 12102 densityUnits: appData[7], 12103 xDensity: appData[8] << 8 | appData[9], 12104 yDensity: appData[10] << 8 | appData[11], 12105 thumbWidth: appData[12], 12106 thumbHeight: appData[13], 12107 thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) 12108 }; 12109 } 12110 } 12111 if (fileMarker === 0xffee) { 12112 if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) { 12113 adobe = { 12114 version: appData[5] << 8 | appData[6], 12115 flags0: appData[7] << 8 | appData[8], 12116 flags1: appData[9] << 8 | appData[10], 12117 transformCode: appData[11] 12118 }; 12119 } 12120 } 12121 break; 12122 case 0xffdb: 12123 const quantizationTablesLength = readUint16(data, offset); 12124 offset += 2; 12125 const quantizationTablesEnd = quantizationTablesLength + offset - 2; 12126 let z; 12127 while (offset < quantizationTablesEnd) { 12128 const quantizationTableSpec = data[offset++]; 12129 const tableData = new Uint16Array(64); 12130 if (quantizationTableSpec >> 4 === 0) { 12131 for (j = 0; j < 64; j++) { 12132 z = dctZigZag[j]; 12133 tableData[z] = data[offset++]; 12134 } 12135 } else if (quantizationTableSpec >> 4 === 1) { 12136 for (j = 0; j < 64; j++) { 12137 z = dctZigZag[j]; 12138 tableData[z] = readUint16(data, offset); 12139 offset += 2; 12140 } 12141 } else { 12142 throw new JpegError("DQT - invalid table spec"); 12143 } 12144 quantizationTables[quantizationTableSpec & 15] = tableData; 12145 } 12146 break; 12147 case 0xffc0: 12148 case 0xffc1: 12149 case 0xffc2: 12150 if (frame) { 12151 throw new JpegError("Only single frame JPEGs supported"); 12152 } 12153 offset += 2; 12154 frame = {}; 12155 frame.extended = fileMarker === 0xffc1; 12156 frame.progressive = fileMarker === 0xffc2; 12157 frame.precision = data[offset++]; 12158 const sofScanLines = readUint16(data, offset); 12159 offset += 2; 12160 frame.scanLines = dnlScanLines || sofScanLines; 12161 frame.samplesPerLine = readUint16(data, offset); 12162 offset += 2; 12163 frame.components = []; 12164 frame.componentIds = {}; 12165 const componentsCount = data[offset++]; 12166 let maxH = 0, 12167 maxV = 0; 12168 for (i = 0; i < componentsCount; i++) { 12169 const componentId = data[offset]; 12170 const h = data[offset + 1] >> 4; 12171 const v = data[offset + 1] & 15; 12172 if (maxH < h) { 12173 maxH = h; 12174 } 12175 if (maxV < v) { 12176 maxV = v; 12177 } 12178 const qId = data[offset + 2]; 12179 l = frame.components.push({ 12180 h, 12181 v, 12182 quantizationId: qId, 12183 quantizationTable: null 12184 }); 12185 frame.componentIds[componentId] = l - 1; 12186 offset += 3; 12187 } 12188 frame.maxH = maxH; 12189 frame.maxV = maxV; 12190 prepareComponents(frame); 12191 break; 12192 case 0xffc4: 12193 const huffmanLength = readUint16(data, offset); 12194 offset += 2; 12195 for (i = 2; i < huffmanLength;) { 12196 const huffmanTableSpec = data[offset++]; 12197 const codeLengths = new Uint8Array(16); 12198 let codeLengthSum = 0; 12199 for (j = 0; j < 16; j++, offset++) { 12200 codeLengthSum += codeLengths[j] = data[offset]; 12201 } 12202 const huffmanValues = new Uint8Array(codeLengthSum); 12203 for (j = 0; j < codeLengthSum; j++, offset++) { 12204 huffmanValues[j] = data[offset]; 12205 } 12206 i += 17 + codeLengthSum; 12207 (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); 12208 } 12209 break; 12210 case 0xffdd: 12211 offset += 2; 12212 resetInterval = readUint16(data, offset); 12213 offset += 2; 12214 break; 12215 case 0xffda: 12216 const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines; 12217 offset += 2; 12218 const selectorsCount = data[offset++], 12219 components = []; 12220 for (i = 0; i < selectorsCount; i++) { 12221 const index = data[offset++]; 12222 const componentIndex = frame.componentIds[index]; 12223 const component = frame.components[componentIndex]; 12224 component.index = index; 12225 const tableSpec = data[offset++]; 12226 component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; 12227 component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; 12228 components.push(component); 12229 } 12230 const spectralStart = data[offset++], 12231 spectralEnd = data[offset++], 12232 successiveApproximation = data[offset++]; 12233 try { 12234 const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker); 12235 offset += processed; 12236 } catch (ex) { 12237 if (ex instanceof DNLMarkerError) { 12238 warn(`${ex.message} -- attempting to re-parse the JPEG image.`); 12239 return this.parse(data, { 12240 dnlScanLines: ex.scanLines 12241 }); 12242 } else if (ex instanceof EOIMarkerError) { 12243 warn(`${ex.message} -- ignoring the rest of the image data.`); 12244 break markerLoop; 12245 } 12246 throw ex; 12247 } 12248 break; 12249 case 0xffdc: 12250 offset += 4; 12251 break; 12252 case 0xffff: 12253 if (data[offset] !== 0xff) { 12254 offset--; 12255 } 12256 break; 12257 default: 12258 const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3); 12259 if (nextFileMarker?.invalid) { 12260 warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid); 12261 offset = nextFileMarker.offset; 12262 break; 12263 } 12264 if (!nextFileMarker || offset >= data.length - 1) { 12265 warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9)."); 12266 break markerLoop; 12267 } 12268 throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16)); 12269 } 12270 fileMarker = readUint16(data, offset); 12271 offset += 2; 12272 } 12273 if (!frame) { 12274 throw new JpegError("JpegImage.parse - no frame data found."); 12275 } 12276 this.width = frame.samplesPerLine; 12277 this.height = frame.scanLines; 12278 this.jfif = jfif; 12279 this.adobe = adobe; 12280 this.components = []; 12281 for (const component of frame.components) { 12282 const quantizationTable = quantizationTables[component.quantizationId]; 12283 if (quantizationTable) { 12284 component.quantizationTable = quantizationTable; 12285 } 12286 this.components.push({ 12287 index: component.index, 12288 output: buildComponentData(frame, component), 12289 scaleX: component.h / frame.maxH, 12290 scaleY: component.v / frame.maxV, 12291 blocksPerLine: component.blocksPerLine, 12292 blocksPerColumn: component.blocksPerColumn 12293 }); 12294 } 12295 this.numComponents = this.components.length; 12296 return undefined; 12297 } 12298 _getLinearizedBlockData(width, height, isSourcePDF = false) { 12299 const scaleX = this.width / width, 12300 scaleY = this.height / height; 12301 let component, componentScaleX, componentScaleY, blocksPerScanline; 12302 let x, y, i, j, k; 12303 let index; 12304 let offset = 0; 12305 let output; 12306 const numComponents = this.components.length; 12307 const dataLength = width * height * numComponents; 12308 const data = new Uint8ClampedArray(dataLength); 12309 const xScaleBlockOffset = new Uint32Array(width); 12310 const mask3LSB = 0xfffffff8; 12311 let lastComponentScaleX; 12312 for (i = 0; i < numComponents; i++) { 12313 component = this.components[i]; 12314 componentScaleX = component.scaleX * scaleX; 12315 componentScaleY = component.scaleY * scaleY; 12316 offset = i; 12317 output = component.output; 12318 blocksPerScanline = component.blocksPerLine + 1 << 3; 12319 if (componentScaleX !== lastComponentScaleX) { 12320 for (x = 0; x < width; x++) { 12321 j = 0 | x * componentScaleX;
vendor: 5,873 bytes, lines 12322-12437
12322 xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7; 12323 } 12324 lastComponentScaleX = componentScaleX; 12325 } 12326 for (y = 0; y < height; y++) { 12327 j = 0 | y * componentScaleY; 12328 index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; 12329 for (x = 0; x < width; x++) { 12330 data[offset] = output[index + xScaleBlockOffset[x]]; 12331 offset += numComponents; 12332 } 12333 } 12334 } 12335 let transform = this._decodeTransform; 12336 if (!isSourcePDF && numComponents === 4 && !transform) { 12337 transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]); 12338 } 12339 if (transform) { 12340 for (i = 0; i < dataLength;) { 12341 for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { 12342 data[i] = (data[i] * transform[k] >> 8) + transform[k + 1]; 12343 } 12344 } 12345 } 12346 return data; 12347 } 12348 get _isColorConversionNeeded() { 12349 if (this.adobe) { 12350 return !!this.adobe.transformCode; 12351 } 12352 if (this.numComponents === 3) { 12353 if (this._colorTransform === 0) { 12354 return false; 12355 } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) { 12356 return false; 12357 } 12358 return true; 12359 } 12360 if (this._colorTransform === 1) { 12361 return true; 12362 } 12363 return false; 12364 } 12365 _convertYccToRgb(data) { 12366 let Y, Cb, Cr; 12367 for (let i = 0, length = data.length; i < length; i += 3) { 12368 Y = data[i]; 12369 Cb = data[i + 1]; 12370 Cr = data[i + 2]; 12371 data[i] = Y - 179.456 + 1.402 * Cr; 12372 data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; 12373 data[i + 2] = Y - 226.816 + 1.772 * Cb; 12374 } 12375 return data; 12376 } 12377 _convertYccToRgba(data, out) { 12378 for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) { 12379 const Y = data[i]; 12380 const Cb = data[i + 1]; 12381 const Cr = data[i + 2]; 12382 out[j] = Y - 179.456 + 1.402 * Cr; 12383 out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; 12384 out[j + 2] = Y - 226.816 + 1.772 * Cb; 12385 out[j + 3] = 255; 12386 } 12387 return out; 12388 } 12389 _convertYcckToRgb(data) { 12390 let Y, Cb, Cr, k; 12391 let offset = 0; 12392 for (let i = 0, length = data.length; i < length; i += 4) { 12393 Y = data[i]; 12394 Cb = data[i + 1]; 12395 Cr = data[i + 2]; 12396 k = data[i + 3]; 12397 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); 12398 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); 12399 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); 12400 } 12401 return data.subarray(0, offset); 12402 } 12403 _convertYcckToRgba(data) { 12404 for (let i = 0, length = data.length; i < length; i += 4) { 12405 const Y = data[i]; 12406 const Cb = data[i + 1]; 12407 const Cr = data[i + 2]; 12408 const k = data[i + 3]; 12409 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); 12410 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); 12411 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); 12412 data[i + 3] = 255; 12413 } 12414 return data; 12415 } 12416 _convertYcckToCmyk(data) { 12417 let Y, Cb, Cr; 12418 for (let i = 0, length = data.length; i < length; i += 4) { 12419 Y = data[i]; 12420 Cb = data[i + 1]; 12421 Cr = data[i + 2]; 12422 data[i] = 434.456 - Y - 1.402 * Cr; 12423 data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr; 12424 data[i + 2] = 481.816 - Y - 1.772 * Cb; 12425 } 12426 return data; 12427 } 12428 _convertCmykToRgb(data) { 12429 let c, m, y, k; 12430 let offset = 0; 12431 for (let i = 0, length = data.length; i < length; i += 4) { 12432 c = data[i]; 12433 m = data[i + 1]; 12434 y = data[i + 2]; 12435 k = data[i + 3]; 12436 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); 12437 data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.0001056
124377359618683593 * 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); 12438 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); 12439 } 12440 return data.subarray(0, offset); 12441 } 12442 _convertCmykToRgba(data) { 12443 for (let i = 0, length = data.length; i < length; i += 4) { 12444 const c = data[i]; 12445 const m = data[i + 1]; 12446 const y = data[i + 2]; 12447 const k = data[i + 3]; 12448 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); 12449 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); 12450 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); 12451 data[i + 3] = 255; 12452 } 12453 return data; 12454 } 12455 getData({ 12456 width, 12457 height, 12458 forceRGBA = false, 12459 forceRGB = false, 12460 isSourcePDF = false 12461 }) { 12462 if (this.numComponents > 4) { 12463 throw new JpegError("Unsupported color mode"); 12464 } 12465 const data = this._getLinearizedBlockData(width, height, isSourcePDF); 12466 if (this.numComponents === 1 && (forceRGBA || forceRGB)) { 12467 const len = data.length * (forceRGBA ? 4 : 3); 12468 const rgbaData = new Uint8ClampedArray(len); 12469 let offset = 0; 12470 if (forceRGBA) { 12471 grayToRGBA(data, new Uint32Array(rgbaData.buffer)); 12472 } else { 12473 for (const grayColor of data) { 12474 rgbaData[offset++] = grayColor; 12475 rgbaData[offset++] = grayColor; 12476 rgbaData[offset++] = grayColor; 12477 } 12478 } 12479 return rgbaData; 12480 } else if (this.numComponents === 3 && this._isColorConversionNeeded) { 12481 if (forceRGBA) { 12482 const rgbaData = new Uint8ClampedArray(data.length / 3 * 4); 12483 return this._convertYccToRgba(data, rgbaData); 12484 } 12485 return this._convertYccToRgb(data); 12486 } else if (this.numComponents === 4) { 12487 if (this._isColorConversionNeeded) { 12488 if (forceRGBA) { 12489 return this._convertYcckToRgba(data); 12490 } 12491 if (forceRGB) { 12492 return this._convertYcckToRgb(data); 12493 } 12494 return this._convertYcckToCmyk(data); 12495 } else if (forceRGBA) { 12496 return this._convertCmykToRgba(data); 12497 } else if (forceRGB) { 12498 return this._convertCmykToRgb(data); 12499 } 12500 } 12501 return data; 12502 } 12503} 12504 12505;// ./src/core/jpeg_stream.js 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516class JpegStream extends DecodeStream { 12517 static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; 12518 constructor(stream, maybeLength, params) { 12519 super(maybeLength); 12520 this.stream = stream; 12521 this.dict = stream.dict; 12522 this.maybeLength = maybeLength; 12523 this.params = params; 12524 } 12525 static get canUseImageDecoder() { 12526 return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupp
12526orted("image/jpeg") : Promise.resolve(false)); 12527 } 12528 static setOptions({ 12529 isImageDecoderSupported = false 12530 }) { 12531 this.#isImageDecoderSupported = isImageDecoderSupported; 12532 } 12533 get bytes() { 12534 return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); 12535 } 12536 ensureBuffer(requested) {} 12537 readBlock() { 12538 this.decodeImage(); 12539 } 12540 get jpegOptions() { 12541 const jpegOptions = { 12542 decodeTransform: undefined, 12543 colorTransform: undefined 12544 }; 12545 const decodeArr = this.dict.getArray("D", "Decode"); 12546 if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) { 12547 const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8; 12548 const decodeArrLength = decodeArr.length; 12549 const transform = new Int32Array(decodeArrLength); 12550 let transformNeeded = false; 12551 const maxValue = (1 << bitsPerComponent) - 1; 12552 for (let i = 0; i < decodeArrLength; i += 2) { 12553 transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0; 12554 transform[i + 1] = decodeArr[i] * maxValue | 0; 12555 if (transform[i] !== 256 || transform[i + 1] !== 0) { 12556 transformNeeded = true; 12557 } 12558 } 12559 if (transformNeeded) { 12560 jpegOptions.decodeTransform = transform; 12561 } 12562 } 12563 if (this.params instanceof Dict) { 12564 const colorTransform = this.params.get("ColorTransform"); 12565 if (Number.isInteger(colorTransform)) { 12566 jpegOptions.colorTransform = colorTransform; 12567 } 12568 } 12569 return shadow(this, "jpegOptions", jpegOptions); 12570 } 12571 #skipUselessBytes(data) { 12572 for (let i = 0, ii = data.length - 1; i < ii; i++) { 12573 if (data[i] === 0xff && data[i + 1] === 0xd8) { 12574 if (i > 0) { 12575 data = data.subarray(i); 12576 } 12577 break; 12578 } 12579 } 12580 return data; 12581 } 12582 decodeImage(bytes) { 12583 if (this.eof) { 12584 return this.buffer; 12585 } 12586 bytes = this.#skipUselessBytes(bytes || this.bytes); 12587 const jpegImage = new JpegImage(this.jpegOptions); 12588 jpegImage.parse(bytes); 12589 const data = jpegImage.getData({ 12590 width: this.drawWidth, 12591 height: this.drawHeight, 12592 forceRGBA: this.forceRGBA, 12593 forceRGB: this.forceRGB, 12594 isSourcePDF: true 12595 }); 12596 this.buffer = data; 12597 this.bufferLength = data.length; 12598 this.eof = true; 12599 return this.buffer; 12600 } 12601 get canAsyncDecodeImageFromBuffer() { 12602 return this.stream.isAsync; 12603 } 12604 async getTransferableImage() { 12605 if (!(await JpegStream.canUseImageDecoder)) { 12606 return null; 12607 } 12608 const jpegOptions = this.jpegOptions; 12609 if (jpegOptions.decodeTransform) { 12610 return null; 12611 } 12612 let decoder; 12613 try { 12614 const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes; 12615 if (!bytes) { 12616 return null; 12617 } 12618 const data = this.#skipUselessBytes(bytes); 12619 if (!JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform)) { 12620 return null; 12621 } 12622 decoder = new ImageDecoder({ 12623 data, 12624 type: "image/jpeg", 12625 preferAnimation: false 12626 }); 12627 return (await decoder.decode()).image; 12628 } catch (reason) { 12629 warn(`getTransferableImage - failed: "${reason}".`); 12630 return null; 12631 } finally { 12632 decoder?.close(); 12633 } 12634 } 12635} 12636 12637;// ./external/openjpeg/openjpeg.js 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649var OpenJPEG = (() => { 12650 var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; 12651 return function (moduleArg = {}) { 12652 var moduleRtn; 12653 var Module = moduleArg; 12654 var readyPromiseResolve, readyPromiseReject; 12655 var readyPromise = new Promise((resolve, reject) => { 12656 readyPromiseResolve = resolve; 12657 readyPromiseReject = reject; 12658 }); 12659 var ENVIRONMENT_IS_WEB = true; 12660 var ENVIRONMENT_IS_WORKER = false; 12661 Module.decode = function (bytes, { 12662 numComponents = 4, 12663 isIndexedColormap = false, 12664 smaskInData = false 12665 }) { 12666 const size = bytes.length; 12667 const ptr = Module._malloc(size); 12668 Module.HEAPU8.set(bytes, ptr); 12669 const ret = Module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData); 12670 Module._free(ptr); 12671 if (ret) { 12672 const { 12673 errorMessages 12674 } = Module; 12675 if (errorMessages) { 12676 delete Module.errorMessages; 12677 return errorMessages; 12678 } 12679 return "Unknown error"; 12680 } 12681 const { 12682 imageData 12683 } = Module; 12684 Module.imageData = null; 12685 return imageData; 12686 }; 12687 var moduleOverrides = Object.assign({}, Module); 12688 var arguments_ = []; 12689 var thisProgram = "./this.program"; 12690 var quit_ = (status, toThrow) => { 12691 throw toThrow; 12692 }; 12693 var scriptDirectory = ""; 12694 var readAsync, readBinary; 12695 if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { 12696 if (ENVIRONMENT_IS_WORKER) { 12697 scriptDirectory = self.location.href; 12698 } else if (typeof document != "undefined" && document.currentScript) { 12699 scriptDirectory = document.currentScript.src; 12700 } 12701 if (_scriptName) { 12702 scriptDirectory = _scriptName; 12703 } 12704 if (scriptDirectory.startsWith("blob:")) { 12705 scriptDirectory = ""; 12706 } else { 12707 scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); 12708 } 12709 readAsync = url => fetch(url, { 12710 credentials: "same-origin" 12711 }).then(response => { 12712 if (response.ok) { 12713 return response.arrayBuffer(); 12714 } 12715 return Promise.reject(new Error(response.status + " : " + response.url)); 12716 }); 12717 } else {} 12718 var out = Module["print"] || console.log.bind(console); 12719 var err = Module["printErr"] || console.error.bind(console); 12720 Object.assign(Module, moduleOverrides); 12721 moduleOverrides = null; 12722 if (Module["arguments"]) arguments_ = Module["arguments"]; 12723 if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; 12724 var wasmBinary = Module["wasmBinary"]; 12725 function intArrayFromBase64(s) { 12726 var decoded = atob(s); 12727 var bytes = new Uint8Array(decoded.length); 12728 for (var i = 0; i < decoded.length; ++i) { 12729 bytes[i] = decoded.charCodeAt(i); 12730 } 12731 return bytes; 12732 } 12733 function tryParseAsDataURI(filename) { 12734 if (!isDataURI(filename)) { 12735 return; 12736 } 12737 return intArrayFromBase64(filename.slice(dataURIPrefix.length)); 12738 } 12739 var wasmMemory; 12740 var ABORT = false;
vendor: 6,468 bytes, lines 12741-12824
12741 var EXITSTATUS; 12742 var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; 12743 function updateMemoryViews() { 12744 var b = wasmMemory.buffer; 12745 Module["HEAP8"] = HEAP8 = new Int8Array(b); 12746 Module["HEAP16"] = HEAP16 = new Int16Array(b); 12747 Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); 12748 Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); 12749 Module["HEAP32"] = HEAP32 = new Int32Array(b); 12750 Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); 12751 Module["HEAPF32"] = HEAPF32 = new Float32Array(b); 12752 Module["HEAPF64"] = HEAPF64 = new Float64Array(b); 12753 } 12754 var __ATPRERUN__ = []; 12755 var __ATINIT__ = []; 12756 var __ATPOSTRUN__ = []; 12757 var runtimeInitialized = false; 12758 function preRun() { 12759 if (Module["preRun"]) { 12760 if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; 12761 while (Module["preRun"].length) { 12762 addOnPreRun(Module["preRun"].shift()); 12763 } 12764 } 12765 callRuntimeCallbacks(__ATPRERUN__); 12766 } 12767 function initRuntime() { 12768 runtimeInitialized = true; 12769 callRuntimeCallbacks(__ATINIT__); 12770 } 12771 function postRun() { 12772 if (Module["postRun"]) { 12773 if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; 12774 while (Module["postRun"].length) { 12775 addOnPostRun(Module["postRun"].shift()); 12776 } 12777 } 12778 callRuntimeCallbacks(__ATPOSTRUN__); 12779 } 12780 function addOnPreRun(cb) { 12781 __ATPRERUN__.unshift(cb); 12782 } 12783 function addOnInit(cb) { 12784 __ATINIT__.unshift(cb); 12785 } 12786 function addOnPostRun(cb) { 12787 __ATPOSTRUN__.unshift(cb); 12788 } 12789 var runDependencies = 0; 12790 var runDependencyWatcher = null; 12791 var dependenciesFulfilled = null; 12792 function addRunDependency(id) { 12793 runDependencies++; 12794 Module["monitorRunDependencies"]?.(runDependencies); 12795 } 12796 function removeRunDependency(id) { 12797 runDependencies--; 12798 Module["monitorRunDependencies"]?.(runDependencies); 12799 if (runDependencies == 0) { 12800 if (runDependencyWatcher !== null) { 12801 clearInterval(runDependencyWatcher); 12802 runDependencyWatcher = null; 12803 } 12804 if (dependenciesFulfilled) { 12805 var callback = dependenciesFulfilled; 12806 dependenciesFulfilled = null; 12807 callback(); 12808 } 12809 } 12810 } 12811 function abort(what) { 12812 Module["onAbort"]?.(what); 12813 what = "Aborted(" + what + ")"; 12814 err(what); 12815 ABORT = true; 12816 what += ". Build with -sASSERTIONS for more info."; 12817 var e = new WebAssembly.RuntimeError(what); 12818 readyPromiseReject(e); 12819 throw e; 12820 } 12821 var dataURIPrefix = "data:application/octet-stream;base64,"; 12822 var isDataURI = filename => filename.startsWith(dataURIPrefix); 12823 function findWasmBinary() { 12824 var f = "data:application/octet-stream;base64,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A3FFBEACQCAAQQNxRQRAIAAhAgwBCyACRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAkEDcUUNASACIANJDQALCyADQXxxIQQCQCADQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgA0EEayIEIABJBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECkiAARAIABBACABEBkaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECkL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASAC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QRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0HUzQFBGTYCAEF/DwsgACABOgAAQQELfgIBfwF+IAC9IgNCNIinQf8PcSICQf8PRwR8IAJFBEAgASAARAAAAAAAAAAAYQR/QQAFIABEAAAAAAAA8EOiIAEQcCEAIAEoAgBBQGoLNgIAIAAPCyABIAJB/gdrNgIAIANC/////////4eAf4NCgICAgICAgPA/hL8FIAALC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgtJAQF/AkBBAUEsEBciAQRAIAFBADYCEAJAIABBAEwEQCABQQFBCBAXIgA2AiQgAEUNAQwDCyABQQA2AgwLIAEQFAtBACEBCyABC64UAhJ/An4jAEFAaiIIJAAgCCABNgI8IAhBJ2ohFyAIQShqIRICQAJAAkACQANAQQAhBwNAIAEhDSAHIA5B/////wdzSg0CIAcgDmohDgJAAkACQAJAIAEiBy0AACIMBEADQAJAAkAgDEH/AXEiAUUEQ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CBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEEBYaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACC6YFAgZ+BH8gASABKAIAQQdqQXhxIgFBEGo2AgAgACABKQMAIQIgASkDCCEHIwBBIGsiCCQAIAdC////////P4MhBAJ+IAdCMIhC//8BgyIDpyIKQYH4AGtB/Q9NBEAgBEIEhiACQjyIhCEDIApBgPgAa60hBAJAIAJC//////////8PgyICQoGAgICAgICACFoEQCADQgF8IQMMAQsgAkKAgICAgICAgAhSDQAgA0IBgyADfCEDC0IAIAMgA0L/////////B1YiABshAiAArSAEfAwBCwJAIAIgBIRQDQAgA0L//wFSDQAgBEIEhiACQjyIhEKAgICAgICABIQhAkL/DwwBCyAKQf6HAUsEQEIAIQJC/w8MAQtBgPgAQYH4ACADUCIBGyIAIAprIglB8ABKBEBCACECQgAMAQsgAiEDIAQgBEKAgICAgIDAAIQgARsiBSEGAkBBgAEgCWsiAUHAAHEEQCACIAFBQGqthiEGQgAhAwwBCyABRQ0AIAYgAa0iBIYgA0HAACABa62IhCEGIAMgBIYhAwsgCCADNwMQIAggBjcDGAJAIAlBwABxBEAgBSAJQUBqrYghAkIAIQUMAQsgCUUNACAFQcAAIAlrrYYgAiAJrSIDiIQhAiAFIAOIIQULIAggAjcDACAIIAU3AwggCCkDCEIEhiAIKQMAIgNCPIiEIQICQCAAIApHIAgpAxAgCCkDGIRCAFJxrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILIAJCgICAgICAgAiFIAIgAkL/////////B1YiABshAiAArQshAyAIQSBqJAAgB0KAgICAgICAgIB/gyADQjSGhCAChL85AwAL9BcDEn8BfAN+IwBBsARrIgwkACAMQQA2AiwCQCABvSIZQgBTBEBBASEQQboIIRQgAZoiAb0hGQwBCyAEQYAQcQRAQQEhEEG9CCEUDAELQcAIQbsIIARBAXEiEBshFCAQRSEXCwJAIBlCgICAgICAgPj/AINCgICAgICAgPj/AFE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gT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEgLSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoAGluZgBGYWlsZWQgdG8gZGVjb2RlIHRoZSBpbWFnZQBJbnZhbGlkIGFjY2VzcyB0byBwaS0+aW5jbHVkZQAvdG1wL29wZW5qcGVnL3NyYy9iaW4vY29tbW9uL2NvbG9yLmMAQUxMX0NQVVMAT1BKX05VTV9USFJFQURTAE5BTgBPSlBfRE9fTk9UX0RJU1BMQVlfVElMRV9JTkRFWF9JRl9UTE0ASU5GAHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPiBVSU5UX01BWCAtIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBAAkJCSBwcmVjY2ludHNpemUgKHcsaCk9AAkJCSBzdGVwc2l6ZXMgKG0sZSk9AFNPVCBtYXJrZXIgZm9yIHRpbGUgJXUgZGVjbGFyZXMgbW9yZSB0aWxlLXBhcnRzIHRoYW4gZm91bmQgaW4gVExNIG1hcmtlci4AKG51bGwpACglZCwlZCkgACVzfQoACQkgfQoAW0RFVl0gRHVtcCBhbiBpbWFnZV9jb21wX2hlYWRlciBzdHJ1Y3QgewoAW0RFVl0gRHVtcCBhbiBpbWFnZV9oZWFkZXIgc3RydWN0IHsKAEltYWdlIGluZm8gewoACSBkZWZhdWx0IHRpbGUgewoAJXMJIGNvbXBvbmVudCAlZCB7CgAJCSBjb21wICVkIHsKAAkgVGlsZSBpbmRleDogewoACSBNYXJrZXIgbGlzdDogewoAQ29kZXN0cmVhbSBpbmRleCBmcm9tIG1haW4gaGVhZGVyOiB7CgBDb2Rlc3RyZWFtIGluZm8gZnJvbSBtYWluIGhlYWRlcjogewoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3gKAEZvdW5kIGEgbWlzcGxhY2VkICclYyVjJWMlYycgYm94IG91dHNpZGUganAyaCBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IGZpcnN0IGJveCBtdXN0IGJlIEpQRUcgMjAwMCBzaWduYXR1cmUgYm94CgBNYWxmb3JtZWQgSlAyIGZpbGUgZm9ybWF0OiBzZWNvbmQgYm94IG11c3QgYmUgZmlsZSB0eXBlIGJveAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGJveAoATm90IGVub3VnaCBtZW1vcnkgd2l0aCBGVFlQIEJveAoAQSBtYXJrZXIgSUQgd2FzIGV4cGVjdGVkICgweGZmLS0pIGluc3RlYWQgb2YgJS44eAoACQkgbWN0PSV4CgAJCQkgY2Jsa3N0eT0lI3gKAAkJCSBjc3R5PSUjeAoACQkgcHJnPSUjeAoASW50ZWdlciBvdmVyZmxvdwoACSB0ZHg9JXUsIHRkeT0ldQoACSB0dz0ldSwgdGg9JXUKAAkgdHgwPSV1LCB0eTA9JXUKAEludmFsaWQgY29tcG9uZW50IGluZGV4OiAldQoAU3RyZWFtIHRvbyBzaG9ydAoATWFya2VyIGhhbmRsZXIgZnVuY3Rpb24gZmFpbGVkIHRvIHJlYWQgdGhlIG1hcmtlciBzZWdtZW50CgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY3VycmVudCBwcmVjaW5jdCBjb2RlYmxvY2sgZWxlbWVudAoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNRY2Qgb3IgU1FjYyBlbGVtZW50CgBBIEJQQ0MgaGVhZGVyIGJveCBpcyBhdmFpbGFibGUgYWx0aG91Z2ggQlBDIGdpdmVuIGJ5IHRoZSBJSERSIGJveCAoJWQpIGluZGljYXRlIGNvbXBvbmVudHMgYml0IGRlcHR
12824oIGlzIGNvbnN0YW50CgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGlsbGVnYWwgdGlsZSBvZmZzZXQKAEludmFsaWQgcHJlY2luY3QKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBiYW5kIHByZWNpbnRzCgBGYWlsZWQgdG8gZGVjb2RlIGFsbCB1c2VkIGNvbXBvbmVudHMKAFNpemUgb2YgY29kZSBibG9jayBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0cwoAU2l6ZSBvZiB0aWxlIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgTUNUIG1hcmtlcnMKAENvcnJ1cHRlZCBQUE0gbWFya2VycwoATm90IGVub3VnaCBtZW1vcnkgZm9yIHRpbGUgcmVzb2x1dGlvbnMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBjb2xsZWN0aW9ucwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAwIHBhbGV0dGUgY29sdW1ucwoAV2UgZG8gbm90IHN1cHBvcnQgUk9JIGluIGRlY29kaW5nIEhUIGNvZGVibG9ja3MKAENhbm5vdCBoYW5kbGUgYm94IG9mIHVuZGVmaW5lZCBzaXplcwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGhvdXQgc2FtZSBudW1iZXIgb2YgaW5kaXhlcwoASW52YWxpZCB0aWxlYy0+d2luX3h4eCB2YWx1ZXMKAENhbm5vdCBoYW5kbGUgYm94IG9mIGxlc3MgdGhhbiA4IGJ5dGVzCgBDYW5ub3QgaGFuZGxlIFhMIGJveCBvZiBsZXNzIHRoYW4gMTYgYnl0ZXMKAENvbXBvbmVudCBpbmRleCAldSB1c2VkIHNldmVyYWwgdGltZXMKAEludmFsaWQgUENMUiBib3guIFJlcG9ydHMgJWQgZW50cmllcwoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlIG5vZGVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbWN0IGRhdGEgd2l0aGluIG11bHRpcGxlIE1DVCByZWNvcmRzCgBDYW5ub3QgZGVjb2RlIHRpbGUsIG1lbW9yeSBlcnJvcgoAb3BqX2oya19hcHBseV9uYl90aWxlX3BhcnRz
12824X2NvcnJlY3Rpb24gZXJyb3IKAFByb2JsZW0gd2l0aCBza2lwcGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAUHJvYmxlbSB3aXRoIHJlYWRpbmcgSlBFRzIwMDAgYm94LCBzdHJlYW0gZXJyb3IKAFVua25vd24gbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGwgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyCgBFcnJvciByZWFkaW5nIFBQVCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBTT1QgbWFya2VyCgBEaWQgbm90IGdldCBleHBlY3RlZCBTT1QgbWFya2VyCgBFcnJvciByZWFkaW5nIFBMVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBTT1AgbWFya2VyCgBFeHBlY3RlZCBTT1AgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DTyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUkdOIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQUE0gbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExNIG1hcmtlcgoARXhwZWN0ZWQgRVBIIG1hcmtlcgoATm90IGVub3VnaCBzcGFjZSBmb3IgcmVxdWlyZWQgRVBIIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDUkcgbWFya2VyCgBVbmtub3duIHByb2dyZXNzaW9uIG9yZGVyIGluIENPRCBtYXJrZXIKAFVua25vd24gU2NvZCB2YWx1ZSBpbiBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIENPRCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNEIG1hcmtlcgoAQ3Jyb3IgcmVhZGluZyBDQkQgbWFya2VyCgBFcnJvciByZWFkaW5nIFBPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlcgoARXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DQyBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgTUNDIG1hcmtlcgoAcmVxdWlyZWQgU0laIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAHJlcXVpcmVkIENPRCBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBRQ0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGZpbGUgaGVhZGVyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIGhlYWRlcgoARXJyb3Igd2l0aCBKUCBTaWduYXR1cmUgOiBiYWQgbWFnaWMgbnVtYmVyCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50IG51bWJlciBvZiB0aWxlLXBhcnQgKCVkKSwgZ2l2aW5nIHVwCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBwcmV2aW91cyBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0IChoZWFkZXIpICglZCksIGdpdmluZyB1cAoAdGlsZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgcmVzb2x1dGlvbgoATWFya2VyIGlzIG5vdCBjb21wbGlhbnQgd2l0aCBpdHMgcG9zaXRpb24KAFByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgY2Jsa3cvY2Jsa2ggY29tYmluYXRpb24KAEludmFsaWQgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybWF0aW9uCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgb3RoZXIgdGhhbiBhcnJheSBkZWNvcnJlbGF0aW9uCgBUb28gbGFyZ2UgdmFsdWUgZm9yIE5wcG0KAE5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBOcHBtCgBiYWQgcGxhY2VkIGpwZWcgY29kZXN0cmVhbQoACSBNYWluIGhlYWRlciBzdGFydCBwb3NpdGlvbj0lbGxpCgkgTWFpbiBoZWFkZXIgZW5kIHBvc2l0aW9uPSVsbGkKAE1hcmtlciBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGgKAFRpbGUgcGFydCBsZW5ndGggc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgZGF0YSBzcGFubmluZwoAV3JvbmcgZmxhZwoARXJyb3Igd2l0aCBGVFlQIHNpZ25hdHVyZSBCb3ggc2l6ZQoARXJyb3Igd2l0aCBKUCBzaWduYXR1cmUgQm94IHNpemUKAEludmFsaWQgcHJlY2luY3Qgc2l6ZQoASW5jb25zaXN0ZW50IG1hcmtlciBzaXplCgBJbnZhbGlkIG1hcmtlciBzaXplCgBFcnJvciB3aXRoIFNJWiBtYXJrZXIgc2l6ZQoATm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZQoARmFpbGVkIHRvIGRlY29kZSB0aGUgY29kZXN0cmVhbSBpbiB0aGUgSlAyIGZpbGUKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRoIGluZGl4IHNodWZmbGUKAENhbm5vdCBhbGxvY2F0ZSBUaWVyIDEgaGFuZGxlCgBObyBkZWNvZGVkIGFyZWEgcGFyYW1ldGVycywgc2V0IHRoZSBkZWNvZGVkIGFyZWEgdG8gdGhlIHdob2xlIGltYWdlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlaW5pdGlhbGl6ZSB0aGUgdGFnIHRyZWUKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudCwgSW52YWxpZCB0cmFuc2Zvcm1hdGlvbiBmb3VuZAoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LiBVbnN1cHBvcnRlZCBNaXhlZCBIVCBjb2RlLWJsb2NrIHN0eWxlIGZvdW5kCgBUaWxlIFkgY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAFRpbGUgWCBjb29yZGluYXRlcyBhcmUgbm90IHN1cHBvcnRlZAoASW1hZ2UgY29vcmRpbmF0ZXMgYWJvdmUgSU5UX01BWCBhcmUgbm90IHN1cHBvcnRlZAoASlBFRzIwMDAgSGVhZGVyIGJveCBub3QgcmVhZCB5ZXQsICclYyVjJWMlYycgYm94IHdpbGwgYmUgaWdub3JlZAoAb3BqX2oya19tZXJnZV9wcHQoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAoAb3BqX2oya19idWlsZF90cF9pbmRleF9mcm9tX3RsbSgpOiB0aWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWQKAElnbm9yaW5nIGloZHIgYm94LiBGaXJzdCBpaGRyIGJveCBhbHJlYWR5IHJlYWQKAFpwcHQgJXUgYWxyZWFkeSByZWFkCgBacHBtICV1IGFscmVhZHkgcmVhZAoAUFRFUk0gY2hlY2sgZmFpbHVy
12824ZTogJWQgc3ludGhlc2l6ZWQgMHhGRiBtYXJrZXJzIHJlYWQKAAkJCSBjYmxrdz0yXiVkCgAJCQkgY2Jsa2g9Ml4lZAoACQkJIHFudHN0eT0lZAoAJXMgZHg9JWQsIGR5PSVkCgAJCQkgcm9pc2hpZnQ9JWQKAAkJCSBudW1nYml0cz0lZAoACQkgbnVtbGF5ZXJzPSVkCgAlcyBudW1jb21wcz0lZAoAb3BqX2pwMl9hcHBseV9jZGVmOiBhY249JWQsIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGNuPSVkLCBudW1jb21wcz0lZAoACQkJIG51bXJlc29sdXRpb25zPSVkCgAJCSB0eXBlPSUjeCwgcG9zPSVsbGksIGxlbj0lZAoAJXMgc2duZD0lZAoACQkJIHFtZmJpZD0lZAoAJXMgcHJlYz0lZAoACQkgbmIgb2YgdGlsZS1wYXJ0IGluIHRpbGUgWyVkXT0lZAoAJXMgeDE9JWQsIHkxPSVkCgAlcyB4MD0lZCwgeTA9JWQKAEZhaWxlZCB0byBkZWNvZGUgdGlsZSAlZC8lZAoAU2V0dGluZyBkZWNvZGluZyBhcmVhIHRvICVkLCVkLCVkLCVkCgBGYWlsZWQgdG8gZGVjb2RlIGNvbXBvbmVudCAlZAoASW52YWxpZCB2YWx1ZSBmb3IgbnVtcmVzb2x1dGlvbnMgOiAlZCwgbWF4IHZhbHVlIGlzIHNldCBpbiBvcGVuanBlZy5oIGF0ICVkCgBJbnZhbGlkIGNvbXBvbmVudCBudW1iZXI6ICVkLCByZWdhcmRpbmcgdGhlIG51bWJlciBvZiBjb21wb25lbnRzICVkCgBUb28gbWFueSBQT0NzICVkCgBvcGpfajJrX3JlYWRfdGxtKCk6IGludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU290IGxlbmd0aCBpcyBsZXNzIHRoYW4gbWFya2VyIHNpemUgKyBtYXJrZXIgSUQKAFN0cmVhbSBkb2VzIG5vdCBlbmQgd2l0aCBFT0MKAENhbm5vdCBoYW5kbGUgYm94IHNpemVzIGhpZ2hlciB0aGFuIDJeMzIKAG9wal9waV9uZXh0X2xyY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JsY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X2NwcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3BjcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JwY2woKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal90MV9kZWNvZGVfY2JsaygpOiB1bnN1cHBvcnRlZCBicG5vX3BsdXNfb25lID0gJWQgPj0gMzEKAEZhaWxlZCB0byBkZWNvZGUgdGlsZSAxLzEKAEluc3VmZmljaWVudCBkYXRhIGZvciBDTUFQIGJveC4KAE5lZWQgdG8gcmVhZCBhIFBDTFIgYm94IGJlZm9yZSB0aGUgQ01BUCBib3guCgBJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ0RFRiBib3guCgBOdW1iZXIgb2YgY2hhbm5lbCBkZXNjcmlwdGlvbiBpcyBlcXVhbCB0byB6ZXJvIGluIENERUYgYm94LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IG5vICdpaGRyJyBib3guCgBOb24gY29uZm9ybWFudCBjb2Rlc3RyZWFtIFRQc290PT1UTnNvdC4KAFN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94OiBib3ggbGVuZ3RoIGlzIGluY29uc2lzdGVudC4KAEJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAUmVzb2x1dGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gaW4gdGhlIGNvbXBvbmVudC4KAENvbXBvbmVudCBtYXBwaW5nIHNlZW1zIHdyb25nLiBUcnlpbmcgdG8gY29ycmVjdC4KAG9wal9qMmtfYnVpbGRfdHBfaW5kZXhfZnJvbV90bG0oKTogdGlsZSAlZCBoYXMgbm8gcmVnaXN0ZXJlZCB0aWxlLXBhcnQgaW4gVExNIG1hcmtlciBzZWdtZW50cy4KAG9wal9qMmtfcmVhZF90bG0oKTogdG9vIG1hbnkgVExNIG1hcmtlcnMuCgBvcGpfajJrX3JlYWRfdGxtKCk6IGNhbm5vdCBhbGxvY2F0ZSBtX3RpbGVfcGFydF9pbmZvcy4KAEluY29tcGxldGUgY2hhbm5lbCBkZWZpbml0aW9ucy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEludmFsaWQgY29kZWJsb2NrIGxlbmd0aCB2YWx1ZXMuCgBXZSBkbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMyBjb2RpbmcgcGFzc2VzIGluIGFuIEhUIGNvZGVibG9jazsgVGhpcyBjb2RlYmxvY2tzIGhhcyAlZCBwYXNzZXMuCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBUaGVyZSBhcmUgJWQgemVybyBiaXRwbGFuZXMgaW4gJWQgYml0cGxhbmVzLgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9uIHN0YWdlcy4KAFVua25vd24gbWFya2VyIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBnZW5lcmF0ZWQgZXJyb3IuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3Nld
12824HVwX2RlY29kZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3JlYWRfaGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBhIGRlY29tcHJlc3NvciBoYW5kbGVyLgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyLgoAVGlsZXMgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLiBTa2lwIHRoZSBNQ1Qgc3RlcC4KAE51bWJlciBvZiBjb21wb25lbnRzICglZCkgaXMgaW5jb25zaXN0ZW50IHdpdGggYSBNQ1QuIFNraXAgdGhlIE1DVCBzdGVwLgoASlAyIGJveCB3aGljaCBhcmUgYWZ0ZXIgdGhlIGNvZGVzdHJlYW0gd2lsbCBub3QgYmUgcmVhZCBieSB0aGlzIGZ1bmN0aW9uLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gV2hlbiB0aGUgbnVtYmVyIG9mIHplcm8gcGxhbmVzIGJpdHBsYW5lcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGJpdHBsYW5lcywgb25seSB0aGUgY2xlYW51cCBwYXNzIG1ha2VzIHNlbnNlLCBidXQgd2UgaGF2ZSAlZCBwYXNzZXMgaW4gdGhpcyBjb2RlYmxvY2suIFRoZXJlZm9yZSwgb25seSB0aGUgY2xlYW51cCBwYXNzIHdpbGwgYmUgZGVjb2RlZC4gVGhpcyBtZXNzYWdlIHdpbGwgbm90IGJlIGRpc3BsYXllZCBhZ2Fpbi4KAEltYWdlIGhhcyBsZXNzIGNvbXBvbmVudHMgdGhhbiBjb2Rlc3RyZWFtLgoATmVlZCB0byBkZWNvZGUgdGhlIG1haW4gaGVhZGVyIGJlZm9yZSBiZWdpbiB0byBkZWNvZGUgdGhlIHJlbWFpbmluZyBjb2Rlc3RyZWFtLgoAUHNvdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgZXF1YWwgdG8gemVybywgd2UgYXNzdW1pbmcgaXQgaXMgdGhlIGxhc3QgdGlsZS1wYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLgoAQSBtYWxmb3JtZWQgY29kZWJsb2NrIHRoYXQgaGFzIG1vcmUgdGhhbiBvbmUgY29kaW5nIHBhc3MsIGJ1dCB6ZXJvIGxlbmd0aCBmb3IgMm5kIGFuZCBwb3RlbnRpYWxseSB0aGUgM3JkIHBhc3MgaW4gYW4gSFQgY29kZWJsb2NrLgoACQkJIHRpbGUtcGFydFslZF06IHN0YXJfcG9zPSVsbGksIGVuZF9oZWFkZXI9JWxsaSwgZW5kX3Bvcz0lbGxpLgoAVGlsZSAldSBoYXMgVFBzb3QgPT0gMCBhbmQgVE5zb3QgPT0gMCwgYnV0IG5vIG90aGVyIHRpbGUtcGFydHMgd2VyZSBmb3VuZC4gRU9DIGlzIGFsc28gbWlzc2luZy4KAENvbXBvbmVudCAlZCBkb2Vzbid0IGhhdmUgYSBtYXBwaW5nLgoAb3BqX2oya19yZWFkX3RsbSgpOiBUTE0gbWFya2VyIG5vdCBvZiBleHBlY3RlZCBzaXplLgoAQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS4KAFRoZSBzaWduYXR1cmUgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSAgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSBmdHlwIGJveCBtdXN0IGJlIHRoZSBzZWNvbmQgYm94IGluIHRoZSBmaWxlLgoARmFpbGVkIHRvIGRlY29kZS4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEluY29ycmVjdCBNRUwgc2VnbWVudCBzZXF1ZW5jZS4KAENvbXBvbmVudCAlZCBpcyBtYXBwZWQgdHdpY2UuCgBvcGpfajJrX3JlYWRfdGxtKCk6IFNUID0gMyBpcyBpbnZhbGlkLgoAT25seSBvbmUgQ01BUCBib3ggaXMgYWxsb3dlZC4KAFdlIG5lZWQgYW4gaW1hZ2UgcHJldmlvdXNseSBjcmVhdGVkLgoASUhEUiBib3hfbWlzc2luZy4gUmVxdWlyZWQuCgBKUDJIIGJveCBtaXNzaW5nLiBSZXF1aXJlZC4KAE5vdCBzdXJlIGhvdyB0aGF0IGhhcHBlbmVkLgoATWFpbiBoZWFkZXIgaGFzIGJlZW4gY29ycmVjdGx5IGRlY29kZWQuCgBUaWxlICVkLyVkIGhhcyBiZWVuIGRlY29kZWQuCgBIZWFkZXIgb2YgdGlsZSAlZCAvICVkIGhhcyBiZWVuIHJlYWQuCgBFbXB0eSBTT1QgbWFya2VyIGRldGVjdGVkOiBQc290PSVkLgoARGlyZWN0IHVzZSBhdCAjJWQgaG93ZXZlciBwY29sPSVkLgoASW1wbGVtZW50YXRpb24gbGltaXRhdGlvbjogZm9yIHBhbGV0dGUgbWFwcGluZywgcGNvbFslZF0gc2hvdWxkIGJlIGVxdWFsIHRvICVkLCBidXQgaXMgZXF1YWwgdG8gJWQuCgBJbnZhbGlkIGNvbXBvbmVudC9wYWxldHRlIGluZGV4IGZvciBkaXJlY3QgbWFwcGluZyAlZC4KAEludmFsaWQgdmFsdWUgZm9yIGNtYXBbJWRdLm10eXAgPSAlZC4KAFBzb3QgdmFsdWUgaXMgbm90IGNvcnJlY3QgcmVnYXJkcyB0byB0aGUgSlBFRzIwMDAgbm9ybTogJWQuCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBWTEMgY29kZSBwcm9kdWNlcyBzaWduaWZpY2FudCBzYW1wbGVzIG91dHNpZGUgdGhlIGNvZGVibG9jayBhcmVhLgoAVW5leHBlY3RlZCBPT00uCgAzMiBiaXRzIGFyZSBub3QgZW5vdWdoIHRvIGRlY29kZSB0aGlzIGNvZGVibG9jaywgc2luY2UgdGhlIG51bWJlciBvZiBiaXRwbGFuZSwgJWQsIGlzIGxhcmdlciB0aGFuIDMwLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgc2hvdWxkIGJlID4gMC4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgc2hvdWxkIGJlID4gMC4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgc2hvdWxkIGJlID49IDAuCgBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgc2hvdWxkIGJlID49IDAuCgBFcnJvciByZWFkaW5nIFBQVCBtYXJrZXI6IHBhY2tldCBoZWFkZXIgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZm91bmQgaW4gdGhlIG1haW4gaGVhZGVyIChQUE0gbWFya2VyKS4KAFN0YXJ0IHRvIHJlYWQgajJrIG1haW4gaGVhZGVyICglbGxkKS4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuCgBMZWZ0IH
12824Bvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlPc2l6PSVkKS4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWE9zaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAFNpemUgeCBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS53PSVkKS4KAFNpemUgeSBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS5oPSVkKS4KAFRpbGUgcmVhZCwgZGVjb2RlZCBhbmQgdXBkYXRlZCBpcyBub3QgdGhlIGRlc2lyZWQgb25lICglZCB2cyAlZCkuCgBJbnZhbGlkIGNvbXBvbmVudCBpbmRleCAlZCAoPj0gJWQpLgoAb3BqX3JlYWRfaGVhZGVyKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgb3BqX3NldF9kZWNvZGVkX2NvbXBvbmVudHMoKS4KAE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbWFnZS0+Y29tcHNbJWRdLmRhdGEgPT0gTlVMTCBpbiBvcGpfanAyX2FwcGx5X3BjbHIoKS4KAGludmFsaWQgYm94IHNpemUgJWQgKCV4KQoARmFpbCB0byByZWFkIHRoZSBjdXJyZW50IG1hcmtlciBzZWdtZW50ICglI3gpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IElIRFIgdygldSkgaCgldSkgdnMuIFNJWiB3KCV1KSBoKCV1KQoARXJyb3IgcmVhZGluZyBDT0MgbWFya2VyIChiYWQgbnVtYmVyIG9mIGNvbXBvbmVudHMpCgBJb
12824nZhbGlkIG51bWJlciBvZiB0aWxlcyA6ICV1IHggJXUgKG1heGltdW0gZml4ZWQgYnkganBlZzIwMDAgbm9ybSBpcyA2NTUzNSB0aWxlcykKAEludmFsaWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgKGloZHIpCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgaW1hZ2UgaGVhZGVyIChpaGRyKQoAV3JvbmcgdmFsdWVzIGZvcjogdyglZCkgaCglZCkgbnVtY29tcHMoJWQpIChpaGRyKQoASW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IGR4PSV1IGR5PSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgYWNjb3JkaW5nIHRvIHRoZSBKUEVHMjAwMCBub3JtKQoAQmFkIGltYWdlIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBCYWQgQlBDQyBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogbmVnYXRpdmUgb3IgemVybyBpbWFnZSBzaXplICglbGxkIHggJWxsZCkKAHNraXA6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSB3aXRoIG1heCAoJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpCgByZWFkOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoARGVzcGl0ZSBKUDIgQlBDIT0yNTUsIHByZWNpc2lvbiBhbmQvb3Igc2duZCB2YWx1ZXMgZm9yIGNvbXBbJWRdIGlzIGRpZmZlcmVudCB0aGFuIGNvbXBbMF06CiAgICAgICAgWzBdIHByZWMoJWQpIHNnbmQoJWQpIFslZF0gcHJlYyglZCkgc2duZCglZCkKAGJhZCBjb21wb25lbnQgbnVtYmVyIGluIFJHTiAoJWQgd2hlbiB0aGVyZSBhcmUgb25seSAlZCkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogbnVtYmVyIG9mIGNvbXBvbmVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCAlZCB2cyAlZCkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaW52YWxpZCB0aWxlIHNpemUgKHRkeDogJWQsIHRkeTogJWQpCgBCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZTogJWQpCgBCYWQgQ09MUiBoZWFkZXIgYm94IChDSUVMYWIsIGJhZCBzaXplOiAlZCkKAFBURVJNIGNoZWNrIGZhaWx1cmU6ICVkIHJlbWFpbmluZyBieXRlcyBpbiBjb2RlIGJsb2NrICglZCB1c2VkIC8gJWQpCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBPbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgbm90IG1ldDogMiA8PSBTY3VwIDw9IG1pbihMY3VwLCA0MDc5KQoASW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IHByZWM9JXUgKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDM4IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybS4gT3BlbkpwZWcgb25seSBzdXBwb3J0cyB1cCB0byAzMSkKAEludmFsaWQgYml0IG51bWJlciAlZCBpbiBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKCkKAFN0cmVhbSBlcnJvciEKAEVycm9yIG9uIHdyaXRpbmcgc3RyZWFtIQoAU3RyZWFtIHJlYWNoZWQgaXRzIGVuZCAhCgBFeHBlY3RlZCBhIFNPQyBtYXJrZXIgCgBJbnZhbGlkIGJveCBzaXplICVkIGZvciBib3ggJyVjJWMlYyVjJy4gTmVlZCAlZCBieXRlcywgJWQgYnl0ZXMgcmVtYWluaW5nIAoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gRGVjb2RpbmcgdGhpcyBjb2RlYmxvY2sgaXMgc3RvcHBlZC4gVV9xIGlzIGxhcmdlciB0aGFuIHplcm8gYml0cGxhbmVzICsgMSAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVf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AAQAAAGBSAAAAUwAAATgAAAAAAABwUgAA8FIAAAE4AAABAAAAgFIAAABTAAABMAAAAAAAAJBSAABQUwAAATAAAAEAAACgUgAAYFMAAAEkAAAAAAAAsFIAAHBTAAABJAAAAQAAAMBSAACAUwAAARwAAAAAAADQUgAAsFMAAAEcAAABAAAA4FIAAMBTAAABFgAAAAAAANBUAADQUwAAARYAAAEAAADgVAAA4FMAAAFWAAAAAAAAEFMAAABTAAABVgAAAQAAACBTAADwUgAAAVQAAAAAAAAwUwAA8FIAAAFUAAABAAAAQFMAAABTAAABUQAAAAAAAFBTAAAQUwAAAVEAAAEAAABgUwAAIFMAAAFIAAAAAAAAcFMAADBTAAABSAAAAQAAAIBTAABAUwAAATgAAAAAAACQUwAAUFMAAAE4AAABAAAAoFMAAGBTAAABNAAAAAAAALBTAABwUwAAATQAAAEAAADAUwAAgFMAAAEwAAAAAAAA0FMAAJBTAAABMAAAAQAAAOBTAACgUwAAASgAAAAAAADwUwAAkFMAAAEoAAABAAAAAFQAAKBTAAABJAAAAAAAABBUAACwUwAAASQAAAEAAAAgVAAAwFMAAAEiAAAAAAAAMFQAANBTAAABIgAAAQAAAEBUAADgUwAAARwAAAAAAABQVAAA8FMAAAEcAAABAAAAYFQAAABUAAABGAAAAAAAAHBUAAAQVAAAARgAAAEAAACAVAAAIFQAAAEWAAAAAAAAkFQAADBUAAAB
12824FgAAAQAAAKBUAABAVAAAARQAAAAAAACwVAAAUFQAAAEUAAABAAAAwFQAAGBUAAABEgAAAAAAANBUAABwVAAAARIAAAEAAADgVAAAgFQAAAERAAAAAAAA8FQAAJBUAAABEQAAAQAAAABVAACgVAAAwQoAAAAAAAAQVQAAsFQAAMEKAAABAAAAIFUAAMBUAADBCQAAAAAAADBVAADQVAAAwQkAAAEAAABAVQAA4FQAAKEIAAAAAAAAUFUAAPBUAAChCAAAAQAAAGBVAAAAVQAAIQUAAAAAAABwVQAAEFUAACEFAAABAAAAgFUAACBVAABBBAAAAAAAAJBVAAAwVQAAQQQAAAEAAACgVQAAQFUAAKECAAAAAAAAsFUAAFBVAAChAgAAAQAAAMBVAABgVQAAIQIAAAAAAADQVQAAcFUAACECAAABAAAA4FUAAIBVAABBAQAAAAAAAPBVAACQVQAAQQEAAAEAAAAAVgAAoFUAABEBAAAAAAAAEFYAALBVAAARAQAAAQAAACBWAADAVQAAhQAAAAAAAAAwVgAA0FUAAIUAAAABAAAAQFYAAOBVAABJAAAAAAAAAFBWAADwVQAASQAAAAEAAABgVgAAAFYAACUAAAAAAAAAcFYAABBWAAAlAAAAAQAAAIBWAAAgVgAAFQAAAAAAAACQVgAAMFYAABUAAAABAAAAoFYAAEBWAAAJAAAAAAAAALBWAABQVgAACQAAAAEAAADAVgAAYFYAAAUAAAAAAAAA0FYAAHBWAAAFAAAAAQAAAOBWAACAVgAAAQAAAAAAAADQVgAAkFYAAAEAAAABAAAA4FYAAKBWAAABVgAAAAAAAPBWAADwVgAAAVYAAAEAAAAAVwAAAFcAAAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAEFBgECBgYDAwcHAwMHBwABBQYBAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwECBgYCAgYGAwMHBwMDBwcBAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcFBggIBgYICAcHCAgHBwgIBQYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAECBgYCAgYGAwMHBwMDBwcBAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcCAgYGAgIGBgMDBwcDAwcHAgIGBgICBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgAAQMDAQIDAwUGBwcGBgcHAAEDAwECAwMFBgcHBgYHBwUGBwcGBgcHCAgICAgICAgFBgcHBgYHBwgICAgICAgIAQIDAwICAwMGBgcHBgYHBwECAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAQIDAwICAwMGBgcHBgYHBwECAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAICAwMCAgMDBgYHBwYGBwcCAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAADAQQDBgQHAQQCBQQHBQcAAwEEAwYEBwEEAgUEBwUHAQQCBQQHBQcCBQIFBQcFBwEEAgUEBwUHAgUCBQUHBQcDBgQHBggHCAQHBQcHCAcIAwYEBwYIBwgEBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIAQQCBQQHBQcCBQIFBQcFBwEEAgUEBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgDBgQHBggHCAQHBQcHCAcIAwYEBwYIBwgEBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBggHCAgICAgHCAcICAgICAYIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgICQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQkJCgoJCQoKDAwNCwwMDQsJCQoKCQkKCgwMCw0MDAsNDAwNDQwMCwsMCQ0KCQwKCwwMCwsMDA0NDAkLCgkMCg0KCgoKCgoKCg0LDQsNCw0LCgoJCQoKCQkNCwwMDQsMDA0NDQ0LCwsLDQoNCgoLCgsNDQwMCwsMDA0KDAkKCwkMCgoJCQoKCQkLDQwMCw0MDAoKCgoKCgoKCw0LDQsNCw0LCwwMDQ0MDAsKDAkKDQkMCwsLCw0NDQ0LCgsKCg0KDQBBmcABCzcBAAEAAQABAAABAQAAAQEAAQABAAEAAQAAAAABAQEBAAAAAAABAAEAAAAAAQEBAQAAAAEAAQEBAEHZwAELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZnBAQsHAQABAAEAAQBBqcEBC5UCAQABAAEAAQAAAAABAQEBAAAAAAABAAEAAAAAAQEBAQAAAAAAAQABAQEAAAEBAAAAAQABAAEAAQEBAQEBAQEBAAEAAQABAAEAAAAAAQEBAQABAAABAQABAAAAAAEBAQEAAQABAQEBAQIAAAAEAAAABAAAAAgAAACQ/wAADAAAABkAAABS/wAAFAAAABoAAABT/wAAFAAAABsAAABe/wAAFAAAABwAAABc/wAAFAAAAB0AAABd/wAAFAAAAB4AAABf/wAAFAAAAB8AAABR/wAAAgAAACAAAABV/wAABAAAACEAAABX/wAABAAAACIAAABY/wAAEAAAACMAAABg/wAABAAAACQAAABh/wAAEAAAACUAAACR/wBByMMBC2Vj/wAABAAAACYAAABk/wAAFAAAACcAAAB0/wAAFAAAACgAAAB4/wAABAAAACkAAABQ/wAABAAAACoAAABZ/wAABAAAACsAAAB1/wAAFAAAACwAAAB3/wAAFAAAAC0AAAAAAAAAFABBwMQBCzUuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAACAgUGo3AAAAcHl0ZjgAAABoMnBqOQBBgMUBCzJyZGhpOgAAAHJsb2M7AAAAY2NwYjwAAABybGNwPQAAAHBhbWM+AAAAZmVkYz8AAABAZgBBwMUBC0EZAAsAGRkZAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABkACgoZGRkDCgcAAQAJCxgAAAkGCwAACwAGGQAAABkZGQBBkcYBCyEOAAAAAAAAAAAZAAsNGRkZAA0AAAIACQ4AAAAJAA4AAA4AQcvGAQsBDABB18YBCxUTAAAAABMAAAAACQwAAAAAAAwAAAwAQYXHAQsBEABBkccBCxUPAAAABA8AAAAACRAAAAAAABAAABAAQb/HAQsBEgBBy8cBCx4RAAAAABEAAAAACRIAAAAAABIAABIAABoAAAAaGhoAQYLIAQsOGgAAABoaGgAAAAAAAAkAQbPIAQsBFABBv8gBCxUXAAAAABcAAAAACRQAAAAAAB
12824QAABQAQe3IAQsBFgBB+cgBC2QVAAAAABUAAAAACRYAAAAAABYAABYAADAxMjM0NTY3ODlBQkNERUYAAAAAcAAAAHAAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABwAAAAcAAAAHEAAABwAAAAcAAAAHAAAABwAEGAygELHXEAAABxAAAAcAAAAHAAAAAAAAAAcAAAAAAAAABxAEGoywELCVBwAQAAAAAABQBBvMsBCwFrAEHUywELCmwAAABtAAAAuGsAQezLAQsBAgBB/MsBCwj//////////wBBwMwBCwEFAEHMzAELAW4AQeTMAQsObAAAAG8AAADIawAAAAQAQfzMAQsBAQBBjM0BCwX/////Cg=="; 12825 return f; 12826 } 12827 var wasmBinaryFile; 12828 function getBinarySync(file) { 12829 if (file == wasmBinaryFile && wasmBinary) { 12830 return new Uint8Array(wasmBinary); 12831 } 12832 var binary = tryParseAsDataURI(file); 12833 if (binary) { 12834 return binary; 12835 } 12836 if (readBinary) { 12837 return readBinary(file); 12838 } 12839 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)'; 12840 } 12841 function instantiateSync(file, info) { 12842 var module; 12843 var binary = getBinarySync(file); 12844 module = new WebAssembly.Module(binary); 12845 var instance = new WebAssembly.Instance(module, info); 12846 return [instance, module]; 12847 } 12848 function getWasmImports() { 12849 return { 12850 a: wasmImports 12851 }; 12852 } 12853 function createWasm() { 12854 function receiveInstance(instance, module) { 12855 wasmExports = instance.exports; 12856 wasmMemory = wasmExports["t"]; 12857 updateMemoryViews(); 12858 addOnInit(wasmExports["u"]); 12859 removeRunDependency("wasm-instantiate"); 12860 return wasmExports; 12861 } 12862 addRunDependency("wasm-instantiate"); 12863 var info = getWasmImports(); 12864 if (Module["instantiateWasm"]) { 12865 try { 12866 return Module["instantiateWasm"](info, receiveInstance); 12867 } catch (e) { 12868 err(`Module.instantiateWasm callback failed with error: ${e}`); 12869 readyPromiseReject(e); 12870 } 12871 } 12872 wasmBinaryFile ??= findWasmBinary(); 12873 var result = instantiateSync(wasmBinaryFile, info); 12874 return receiveInstance(result[0]); 12875 } 12876 class ExitStatus { 12877 name = "ExitStatus"; 12878 constructor(status) { 12879 this.message = `Program terminated with exit(${status})`; 12880 this.status = status; 12881 } 12882 } 12883 var callRuntimeCallbacks = callbacks => { 12884 while (callbacks.length > 0) { 12885 callbacks.shift()(Module); 12886 } 12887 }; 12888 var noExitRuntime = Module["noExitRuntime"] || true; 12889 var __abort_js = () => abort(""); 12890 var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); 12891 var runtimeKeepaliveCounter = 0; 12892 var __emscripten_runtime_keepalive_clear = () => { 12893 noExitRuntime = false; 12894 runtimeKeepaliveCounter = 0; 12895 }; 12896 var timers = {}; 12897 var handleException = e => { 12898 if (e instanceof ExitStatus || e == "unwind") { 12899 return EXITSTATUS; 12900 } 12901 quit_(1, e); 12902 }; 12903 var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; 12904 var _proc_exit = code => { 12905 EXITSTATUS = code; 12906 if (!keepRuntimeAlive()) { 12907 Module["onExit"]?.(code); 12908 ABORT = true; 12909 } 12910 quit_(code, new ExitStatus(code)); 12911 }; 12912 var exitJS = (status, implicit) => { 12913 EXITSTATUS = status; 12914 _proc_exit(status); 12915 }; 12916 var _exit = exitJS; 12917 var maybeExit = () => { 12918 if (!keepRuntimeAlive()) { 12919 try { 12920 _exit(EXITSTATUS); 12921 } catch (e) { 12922 handleException(e); 12923 } 12924 } 12925 }; 12926 var callUserCallback = func => { 12927 if (ABORT) { 12928 return; 12929 } 12930 try { 12931 func(); 12932 maybeExit(); 12933 } catch (e) { 12934 handleException(e); 12935 } 12936 }; 12937 var _emscripten_get_now = () => performance.now(); 12938 var __setitimer_js = (which, timeout_ms) => { 12939 if (timers[which]) { 12940 clearTimeout(timers[which].id); 12941 delete timers[which]; 12942 } 12943 if (!timeout_ms) return 0; 12944 var id = setTimeout(() => { 12945 delete timers[which]; 12946 callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); 12947 }, timeout_ms); 12948 timers[which] = { 12949 id, 12950 timeout_ms 12951 }; 12952 return 0; 12953 }; 12954 function _copy_pixels_1(compG_ptr, nb_pixels) { 12955 compG_ptr >>= 2; 12956 const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels); 12957 const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); 12958 imageData.set(compG); 12959 } 12960 function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { 12961 compR_ptr >>= 2;
12962 compG_ptr >>= 2; 12963 compB_ptr >>= 2; 12964 const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 3); 12965 const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); 12966 const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); 12967 const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); 12968 for (let i = 0; i < nb_pixels; i++) { 12969 imageData[3 * i] = compR[i]; 12970 imageData[3 * i + 1] = compG[i]; 12971 imageData[3 * i + 2] = compB[i]; 12972 } 12973 } 12974 function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) { 12975 compR_ptr >>= 2; 12976 compG_ptr >>= 2; 12977 compB_ptr >>= 2; 12978 compA_ptr >>= 2; 12979 const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); 12980 const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); 12981 const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); 12982 const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); 12983 const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); 12984 for (let i = 0; i < nb_pixels; i++) { 12985 imageData[4 * i] = compR[i]; 12986 imageData[4 * i + 1] = compG[i]; 12987 imageData[4 * i + 2] = compB[i]; 12988 imageData[4 * i + 3] = compA[i]; 12989 } 12990 } 12991 var getHeapMax = () => 2147483648; 12992 var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; 12993 var growMemory = size => { 12994 var b = wasmMemory.buffer; 12995 var pages = (size - b.byteLength + 65535) / 65536 | 0; 12996 try { 12997 wasmMemory.grow(pages); 12998 updateMemoryViews(); 12999 return 1; 13000 } catch (e) {} 13001 }; 13002 var _emscripten_resize_heap = requestedSize => { 13003 var oldSize = HEAPU8.length; 13004 requestedSize >>>= 0; 13005 var maxHeapSize = getHeapMax(); 13006 if (requestedSize > maxHeapSize) { 13007 return false; 13008 } 13009 for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { 13010 var overGrownHeapSize = oldSize * (1 + .2 / cutDown); 13011 overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); 13012 var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); 13013 var replacement = growMemory(newSize); 13014 if (replacement) { 13015 return true; 13016 } 13017 } 13018 return false; 13019 }; 13020 var ENV = {}; 13021 var getExecutableName = () => thisProgram || "./this.program"; 13022 var getEnvStrings = () => { 13023 if (!getEnvStrings.strings) { 13024 var lang = (typeof navigator == "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8"; 13025 var env = { 13026 USER: "web_user", 13027 LOGNAME: "web_user", 13028 PATH: "/", 13029 PWD: "/", 13030 HOME: "/home/web_user", 13031 LANG: lang, 13032 _: getExecutableName() 13033 }; 13034 for (var x in ENV) { 13035 if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x]; 13036 } 13037 var strings = []; 13038 for (var x in env) { 13039 strings.push(`${x}=${env[x]}`); 13040 } 13041 getEnvStrings.strings = strings; 13042 } 13043 return getEnvStrings.strings; 13044 }; 13045 var stringToAscii = (str, buffer) => { 13046 for (var i = 0; i < str.length; ++i) { 13047 HEAP8[buffer++] = str.charCodeAt(i); 13048 } 13049 HEAP8[buffer] = 0; 13050 }; 13051 var _environ_get = (__environ, environ_buf) => { 13052 var bufSize = 0;
13053 getEnvStrings().forEach((string, i) => { 13054 var ptr = environ_buf + bufSize; 13055 HEAPU32[__environ + i * 4 >> 2] = ptr; 13056 stringToAscii(string, ptr); 13057 bufSize += string.length + 1; 13058 }); 13059 return 0; 13060 }; 13061 var _environ_sizes_get = (penviron_count, penviron_buf_size) => { 13062 var strings = getEnvStrings(); 13063 HEAPU32[penviron_count >> 2] = strings.length; 13064 var bufSize = 0; 13065 strings.forEach(string => bufSize += string.length + 1); 13066 HEAPU32[penviron_buf_size >> 2] = bufSize; 13067 return 0; 13068 }; 13069 var _fd_close = fd => 52; 13070 var convertI32PairToI53Checked = (lo, hi) => hi + 2097152 >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN; 13071 function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { 13072 var offset = convertI32PairToI53Checked(offset_low, offset_high); 13073 return 70; 13074 } 13075 var printCharBuffers = [null, [], []]; 13076 var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder() : undefined; 13077 var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => { 13078 var endIdx = idx + maxBytesToRead; 13079 var endPtr = idx; 13080 while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; 13081 if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { 13082 return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); 13083 } 13084 var str = ""; 13085 while (idx < endPtr) { 13086 var u0 = heapOrArray[idx++]; 13087 if (!(u0 & 128)) { 13088 str += String.fromCharCode(u0); 13089 continue; 13090 } 13091 var u1 = heapOrArray[idx++] & 63; 13092 if ((u0 & 224) == 192) { 13093 str += String.fromCharCode((u0 & 31) << 6 | u1); 13094 continue; 13095 } 13096 var u2 = heapOrArray[idx++] & 63; 13097 if ((u0 & 240) == 224) { 13098 u0 = (u0 & 15) << 12 | u1 << 6 | u2; 13099 } else { 13100 u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; 13101 } 13102 if (u0 < 65536) { 13103 str += String.fromCharCode(u0); 13104 } else { 13105 var ch = u0 - 65536; 13106 str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); 13107 } 13108 } 13109 return str; 13110 }; 13111 var printChar = (stream, curr) => { 13112 var buffer = printCharBuffers[stream]; 13113 if (curr === 0 || curr === 10) { 13114 (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); 13115 buffer.length = 0; 13116 } else { 13117 buffer.push(curr); 13118 } 13119 }; 13120 var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; 13121 var _fd_write = (fd, iov, iovcnt, pnum) => { 13122 var num = 0; 13123 for (var i = 0; i < iovcnt; i++) { 13124 var ptr = HEAPU32[iov >> 2]; 13125 var len = HEAPU32[iov + 4 >> 2]; 13126 iov += 8; 13127 for (var j = 0; j < len; j++) { 13128 printChar(fd, HEAPU8[ptr + j]); 13129 } 13130 num += len; 13131 } 13132 HEAPU32[pnum >> 2] = num; 13133 return 0; 13134 }; 13135 function _gray_to_rgba(compG_ptr, nb_pixels) { 13136 compG_ptr >>= 2; 13137 const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); 13138 const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); 13139 for (let i = 0; i < nb_pixels; i++) { 13140 imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; 13141 imageData[4 * i + 3] = 255; 13142 } 13143 } 13144 function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) { 13145 compG_ptr >>= 2; 13146 compA_ptr >>= 2; 13147 const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); 13148 const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); 13149 const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); 13150 for (let i = 0; i < nb_pixels; i++) { 13151 imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; 13152 imageData[4 * i + 3] = compA[i]; 13153 } 13154 } 13155 function _jsPrintWarning(message_ptr) { 13156 const message = UTF8ToString(message_ptr); 13157 (Module.warn || console.warn)(`OpenJPEG: ${message}`); 13158 } 13159 function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { 13160 compR_ptr >>= 2; 13161 compG_ptr >>= 2; 13162 compB_ptr >>= 2; 13163 const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); 13164 const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); 13165 const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); 13166 const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); 13167 for (let i = 0; i < nb_pixels; i++) { 13168 imageData[4 * i] = compR[i]; 13169 imageData[4 * i + 1] = compG[i]; 13170 imageData[4 * i + 2] = compB[i]; 13171 imageData[4 * i + 3] = 255; 13172 } 13173 } 13174 function _storeErrorMessage(message_ptr) { 13175 const message = UTF8ToString(message_ptr); 13176 if (!Module.errorMessages) { 13177 Module.errorMessages = message; 13178 } else { 13179 Module.errorMessages += "\n" + message; 13180 } 13181 } 13182 var wasmImports = { 13183 m: __abort_js, 13184 c: __emscripten_memcpy_js, 13185 l: __emscripten_runtime_keepalive_clear, 13186 n: __setitimer_js, 13187 g: _copy_pixels_1, 13188 f: _copy_pixels_3, 13189 e: _copy_pixels_4, 13190 o: _emscripten_resize_heap, 13191 p: _environ_get, 13192 q: _environ_sizes_get, 13193 r: _fd_close, 13194 j: _fd_seek, 13195 b: _fd_write, 13196 s: _gray_to_rgba, 13197 i: _graya_to_rgba, 13198 d: _jsPrintWarning, 13199 k: _proc_exit, 13200 h: _rgb_to_rgba, 13201 a: _storeErrorMessage 13202 }; 13203 var wasmExports = createWasm(); 13204 var ___wasm_call_ctors = wasmExports["u"]; 13205 var _malloc = Module["_malloc"] = wasmExports["v"]; 13206 var _free = Module["_free"] = wasmExports["w"]; 13207 var _jp2_decode = Module["_jp2_decode"] = wasmExports["y"]; 13208 var __emscripten_timeout = wasmExports["z"]; 13209 var calledRun; 13210 dependenciesFulfilled = function runCaller() { 13211 if (!calledRun) run();
13212 if (!calledRun) dependenciesFulfilled = runCaller; 13213 }; 13214 function run() { 13215 if (runDependencies > 0) { 13216 return; 13217 } 13218 preRun(); 13219 if (runDependencies > 0) { 13220 return; 13221 } 13222 function doRun() { 13223 if (calledRun) return; 13224 calledRun = true; 13225 Module["calledRun"] = true; 13226 if (ABORT) return; 13227 initRuntime(); 13228 readyPromiseResolve(Module); 13229 Module["onRuntimeInitialized"]?.(); 13230 postRun(); 13231 } 13232 if (Module["setStatus"]) { 13233 Module["setStatus"]("Running..."); 13234 setTimeout(() => { 13235 setTimeout(() => Module["setStatus"](""), 1); 13236 doRun(); 13237 }, 1); 13238 } else { 13239 doRun(); 13240 } 13241 } 13242 if (Module["preInit"]) { 13243 if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; 13244 while (Module["preInit"].length > 0) { 13245 Module["preInit"].pop()(); 13246 } 13247 } 13248 run(); 13249 moduleRtn = Module; 13250 return moduleRtn; 13251 }; 13252})(); 13253/* harmony default export */ const openjpeg = (OpenJPEG); 13254;// ./src/core/jpx.js 13255 13256 13257 13258 13259 13260 13261class JpxError extends BaseException { 13262 constructor(msg) { 13263 super(msg, "JpxError"); 13264 } 13265} 13266class JpxImage { 13267 static #module = null; 13268 static decode(data, decoderOptions) { 13269 decoderOptions ||= {}; 13270 this.#module ||= openjpeg({ 13271 warn: warn 13272 }); 13273 const imageData = this.#module.decode(data, decoderOptions); 13274 if (typeof imageData === "string") { 13275 throw new JpxError(imageData); 13276 } 13277 return imageData; 13278 } 13279 static cleanup() { 13280 this.#module = null; 13281 } 13282 static parseImageProperties(stream) { 13283 let newByte = stream.getByte(); 13284 while (newByte >= 0) { 13285 const oldByte = newByte; 13286 newByte = stream.getByte(); 13287 const code = oldByte << 8 | newByte; 13288 if (code === 0xff51) { 13289 stream.skip(4); 13290 const Xsiz = stream.getInt32() >>> 0; 13291 const Ysiz = stream.getInt32() >>> 0; 13292 const XOsiz = stream.getInt32() >>> 0; 13293 const YOsiz = stream.getInt32() >>> 0; 13294 stream.skip(16); 13295 const Csiz = stream.getUint16(); 13296 return { 13297 width: Xsiz - XOsiz, 13298 height: Ysiz - YOsiz, 13299 bitsPerComponent: 8, 13300 componentsCount: Csiz 13301 }; 13302 } 13303 } 13304 throw new JpxError("No size marker found in JPX stream"); 13305 } 13306} 13307 13308;// ./src/core/jpx_stream.js 13309 13310 13311 13312class JpxStream extends DecodeStream { 13313 constructor(stream, maybeLength, params) { 13314 super(maybeLength); 13315 this.stream = stream; 13316 this.dict = stream.dict; 13317 this.maybeLength = maybeLength; 13318 this.params = params; 13319 } 13320 get bytes() { 13321 return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); 13322 } 13323 ensureBuffer(requested) {} 13324 readBlock(decoderOptions) { 13325 this.decodeImage(null, decoderOptions); 13326 } 13327 decodeImage(bytes, decoderOptions) { 13328 if (this.eof) { 13329 return this.buffer; 13330 } 13331 bytes ||= this.bytes; 13332 this.buffer = JpxImage.decode(bytes, decoderOptions); 13333 this.bufferLength = this.buffer.length; 13334 this.eof = true; 13335 return this.buffer; 13336 } 13337 get canAsyncDecodeImageFromBuffer() { 13338 return this.stream.isAsync; 13339 } 13340} 13341 13342;// ./src/core/lzw_stream.js 13343 13344 13345 13346 13347 13348 13349 13350class LZWStream extends DecodeStream { 13351 constructor(str, maybeLength, earlyChange) { 13352 super(maybeLength); 13353 this.str = str; 13354 this.dict = str.dict; 13355 this.cachedData = 0; 13356 this.bitsCached = 0; 13357 const maxLzwDictionarySize = 4096; 13358 const lzwState = { 13359 earlyChange, 13360 codeLength: 9, 13361 nextCode: 258, 13362 dictionaryValues: new Uint8Array(maxLzwDictionarySize), 13363 dictionaryLengths: new Uint16Array(maxLzwDictionarySize), 13364 dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), 13365 currentSequence: new Uint8Array(maxLzwDictionarySize), 13366 currentSequenceLength: 0 13367 }; 13368 for (let i = 0; i < 256; ++i) { 13369 lzwState.dictionaryValues[i] = i; 13370 lzwState.dictionaryLengths[i] = 1; 13371 } 13372 this.lzwState = lzwState; 13373 } 13374 readBits(n) { 13375 let bitsCached = this.bitsCached; 13376 let cachedData = this.cachedData; 13377 while (bitsCached < n) { 13378 const c = this.str.getByte(); 13379 if (c === -1) { 13380 this.eof = true; 13381 return null; 13382 } 13383 cachedData = cachedData << 8 | c; 13384 bitsCached += 8; 13385 } 13386 this.bitsCached = bitsCached -= n; 13387 this.cachedData = cachedData; 13388 this.lastCode = null; 13389 return cachedData >>> bitsCached & (1 << n) - 1; 13390 } 13391 readBlock() { 13392 const blockSize = 512, 13393 decodedSizeDelta = blockSize; 13394 let estimatedDecodedSize = blockSize * 2; 13395 let i, j, q; 13396 const lzwState = this.lzwState; 13397 if (!lzwState) { 13398 return; 13399 } 13400 const earlyChange = lzwState.earlyChange; 13401 let nextCode = lzwState.nextCode; 13402 const dictionaryValues = lzwState.dictionaryValues; 13403 const dictionaryLengths = lzwState.dictionaryLengths; 13404 const dictionaryPrevCodes = lzwState.dictionaryPrevCodes; 13405 let codeLength = lzwState.codeLength; 13406 let prevCode = lzwState.prevCode;
vendor: 4,124 bytes, lines 13407-13542
13407 const currentSequence = lzwState.currentSequence; 13408 let currentSequenceLength = lzwState.currentSequenceLength; 13409 let decodedLength = 0; 13410 let currentBufferLength = this.bufferLength; 13411 let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); 13412 for (i = 0; i < blockSize; i++) { 13413 const code = this.readBits(codeLength); 13414 const hasPrev = currentSequenceLength > 0; 13415 if (code < 256) { 13416 currentSequence[0] = code; 13417 currentSequenceLength = 1; 13418 } else if (code >= 258) { 13419 if (code < nextCode) { 13420 currentSequenceLength = dictionaryLengths[code]; 13421 for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { 13422 currentSequence[j] = dictionaryValues[q]; 13423 q = dictionaryPrevCodes[q]; 13424 } 13425 } else { 13426 currentSequence[currentSequenceLength++] = currentSequence[0]; 13427 } 13428 } else if (code === 256) { 13429 codeLength = 9; 13430 nextCode = 258; 13431 currentSequenceLength = 0; 13432 continue; 13433 } else { 13434 this.eof = true; 13435 delete this.lzwState; 13436 break; 13437 } 13438 if (hasPrev) { 13439 dictionaryPrevCodes[nextCode] = prevCode; 13440 dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; 13441 dictionaryValues[nextCode] = currentSequence[0]; 13442 nextCode++; 13443 codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; 13444 } 13445 prevCode = code; 13446 decodedLength += currentSequenceLength; 13447 if (estimatedDecodedSize < decodedLength) { 13448 do { 13449 estimatedDecodedSize += decodedSizeDelta; 13450 } while (estimatedDecodedSize < decodedLength); 13451 buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); 13452 } 13453 for (j = 0; j < currentSequenceLength; j++) { 13454 buffer[currentBufferLength++] = currentSequence[j]; 13455 } 13456 } 13457 lzwState.nextCode = nextCode; 13458 lzwState.codeLength = codeLength; 13459 lzwState.prevCode = prevCode; 13460 lzwState.currentSequenceLength = currentSequenceLength; 13461 this.bufferLength = currentBufferLength; 13462 } 13463} 13464 13465;// ./src/core/predictor_stream.js 13466 13467 13468 13469 13470 13471 13472 13473 13474 13475class PredictorStream extends DecodeStream { 13476 constructor(str, maybeLength, params) { 13477 super(maybeLength); 13478 if (!(params instanceof Dict)) { 13479 return str; 13480 } 13481 const predictor = this.predictor = params.get("Predictor") || 1; 13482 if (predictor <= 1) { 13483 return str; 13484 } 13485 if (predictor !== 2 && (predictor < 10 || predictor > 15)) { 13486 throw new FormatError(`Unsupported predictor: ${predictor}`); 13487 } 13488 this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng; 13489 this.str = str; 13490 this.dict = str.dict; 13491 const colors = this.colors = params.get("Colors") || 1; 13492 const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8; 13493 const columns = this.columns = params.get("Columns") || 1; 13494 this.pixBytes = colors * bits + 7 >> 3; 13495 this.rowBytes = columns * colors * bits + 7 >> 3; 13496 return this; 13497 } 13498 readBlockTiff() { 13499 const rowBytes = this.rowBytes; 13500 const bufferLength = this.bufferLength; 13501 const buffer = this.ensureBuffer(bufferLength + rowBytes); 13502 const bits = this.bits; 13503 const colors = this.colors; 13504 const rawBytes = this.str.getBytes(rowBytes); 13505 this.eof = !rawBytes.length; 13506 if (this.eof) { 13507 return; 13508 } 13509 let inbuf = 0, 13510 outbuf = 0; 13511 let inbits = 0, 13512 outbits = 0; 13513 let pos = bufferLength; 13514 let i; 13515 if (bits === 1 && colors === 1) { 13516 for (i = 0; i < rowBytes; ++i) { 13517 let c = rawBytes[i] ^ inbuf; 13518 c ^= c >> 1; 13519 c ^= c >> 2; 13520 c ^= c >> 4; 13521 inbuf = (c & 1) << 7; 13522 buffer[pos++] = c; 13523 } 13524 } else if (bits === 8) { 13525 for (i = 0; i < colors; ++i) { 13526 buffer[pos++] = rawBytes[i]; 13527 } 13528 for (; i < rowBytes; ++i) { 13529 buffer[pos] = buffer[pos - colors] + rawBytes[i]; 13530 pos++; 13531 } 13532 } else if (bits === 16) { 13533 const bytesPerPixel = colors * 2; 13534 for (i = 0; i < bytesPerPixel; ++i) { 13535 buffer[pos++] = rawBytes[i]; 13536 } 13537 for (; i < rowBytes; i += 2) { 13538 const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff); 13539 buffer[pos++] = sum >> 8 & 0xff; 13540 buffer[pos++] = sum & 0xff; 13541 } 13542 } else {
vendor: 4,167 bytes, lines 13543-13739
13543 const compArray = new Uint8Array(colors + 1); 13544 const bitMask = (1 << bits) - 1; 13545 let j = 0, 13546 k = bufferLength; 13547 const columns = this.columns; 13548 for (i = 0; i < columns; ++i) { 13549 for (let kk = 0; kk < colors; ++kk) { 13550 if (inbits < bits) { 13551 inbuf = inbuf << 8 | rawBytes[j++] & 0xff; 13552 inbits += 8; 13553 } 13554 compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask; 13555 inbits -= bits; 13556 outbuf = outbuf << bits | compArray[kk]; 13557 outbits += bits; 13558 if (outbits >= 8) { 13559 buffer[k++] = outbuf >> outbits - 8 & 0xff; 13560 outbits -= 8; 13561 } 13562 } 13563 } 13564 if (outbits > 0) { 13565 buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1); 13566 } 13567 } 13568 this.bufferLength += rowBytes; 13569 } 13570 readBlockPng() { 13571 const rowBytes = this.rowBytes; 13572 const pixBytes = this.pixBytes; 13573 const predictor = this.str.getByte(); 13574 const rawBytes = this.str.getBytes(rowBytes); 13575 this.eof = !rawBytes.length; 13576 if (this.eof) { 13577 return; 13578 } 13579 const bufferLength = this.bufferLength; 13580 const buffer = this.ensureBuffer(bufferLength + rowBytes); 13581 let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); 13582 if (prevRow.length === 0) { 13583 prevRow = new Uint8Array(rowBytes); 13584 } 13585 let i, 13586 j = bufferLength, 13587 up, 13588 c; 13589 switch (predictor) { 13590 case 0: 13591 for (i = 0; i < rowBytes; ++i) { 13592 buffer[j++] = rawBytes[i]; 13593 } 13594 break; 13595 case 1: 13596 for (i = 0; i < pixBytes; ++i) { 13597 buffer[j++] = rawBytes[i]; 13598 } 13599 for (; i < rowBytes; ++i) { 13600 buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff; 13601 j++; 13602 } 13603 break; 13604 case 2: 13605 for (i = 0; i < rowBytes; ++i) { 13606 buffer[j++] = prevRow[i] + rawBytes[i] & 0xff; 13607 } 13608 break; 13609 case 3: 13610 for (i = 0; i < pixBytes; ++i) { 13611 buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; 13612 } 13613 for (; i < rowBytes; ++i) { 13614 buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff; 13615 j++; 13616 } 13617 break; 13618 case 4: 13619 for (i = 0; i < pixBytes; ++i) { 13620 up = prevRow[i]; 13621 c = rawBytes[i]; 13622 buffer[j++] = up + c; 13623 } 13624 for (; i < rowBytes; ++i) { 13625 up = prevRow[i]; 13626 const upLeft = prevRow[i - pixBytes]; 13627 const left = buffer[j - pixBytes]; 13628 const p = left + up - upLeft; 13629 let pa = p - left; 13630 if (pa < 0) { 13631 pa = -pa; 13632 } 13633 let pb = p - up; 13634 if (pb < 0) { 13635 pb = -pb; 13636 } 13637 let pc = p - upLeft; 13638 if (pc < 0) { 13639 pc = -pc; 13640 } 13641 c = rawBytes[i]; 13642 if (pa <= pb && pa <= pc) { 13643 buffer[j++] = left + c; 13644 } else if (pb <= pc) { 13645 buffer[j++] = up + c; 13646 } else { 13647 buffer[j++] = upLeft + c; 13648 } 13649 } 13650 break; 13651 default: 13652 throw new FormatError(`Unsupported predictor: ${predictor}`); 13653 } 13654 this.bufferLength += rowBytes; 13655 } 13656} 13657 13658;// ./src/core/run_length_stream.js 13659 13660class RunLengthStream extends DecodeStream { 13661 constructor(str, maybeLength) { 13662 super(maybeLength); 13663 this.str = str; 13664 this.dict = str.dict; 13665 } 13666 readBlock() { 13667 const repeatHeader = this.str.getBytes(2); 13668 if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { 13669 this.eof = true; 13670 return; 13671 } 13672 let buffer; 13673 let bufferLength = this.bufferLength; 13674 let n = repeatHeader[0]; 13675 if (n < 128) { 13676 buffer = this.ensureBuffer(bufferLength + n + 1); 13677 buffer[bufferLength++] = repeatHeader[1]; 13678 if (n > 0) { 13679 const source = this.str.getBytes(n); 13680 buffer.set(source, bufferLength); 13681 bufferLength += n; 13682 } 13683 } else { 13684 n = 257 - n; 13685 const b = repeatHeader[1]; 13686 buffer = this.ensureBuffer(bufferLength + n + 1); 13687 for (let i = 0; i < n; i++) { 13688 buffer[bufferLength++] = b; 13689 } 13690 } 13691 this.bufferLength = bufferLength; 13692 } 13693} 13694 13695;// ./src/core/parser.js 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719const MAX_LENGTH_TO_CACHE = 1000; 13720function getInlineImageCacheKey(bytes) { 13721 const strBuf = [], 13722 ii = bytes.length; 13723 let i = 0; 13724 while (i < ii - 1) { 13725 strBuf.push(bytes[i++] << 8 | bytes[i++]); 13726 } 13727 if (i < ii) { 13728 strBuf.push(bytes[i]); 13729 } 13730 return ii + "_" + String.fromCharCode.apply(null, strBuf); 13731} 13732class Parser { 13733 constructor({ 13734 lexer, 13735 xref, 13736 allowStreams = false, 13737 recoveryMode = false 13738 }) { 13739 this.lexer = lexer;
vendor: 22,317 bytes, lines 13740-14605
13740 this.xref = xref; 13741 this.allowStreams = allowStreams; 13742 this.recoveryMode = recoveryMode; 13743 this.imageCache = Object.create(null); 13744 this._imageId = 0; 13745 this.refill(); 13746 } 13747 refill() { 13748 this.buf1 = this.lexer.getObj(); 13749 this.buf2 = this.lexer.getObj(); 13750 } 13751 shift() { 13752 if (this.buf2 instanceof Cmd && this.buf2.cmd === "ID") { 13753 this.buf1 = this.buf2; 13754 this.buf2 = null; 13755 } else { 13756 this.buf1 = this.buf2; 13757 this.buf2 = this.lexer.getObj(); 13758 } 13759 } 13760 tryShift() { 13761 try { 13762 this.shift(); 13763 return true; 13764 } catch (e) { 13765 if (e instanceof MissingDataException) { 13766 throw e; 13767 } 13768 return false; 13769 } 13770 } 13771 getObj(cipherTransform = null) { 13772 const buf1 = this.buf1; 13773 this.shift(); 13774 if (buf1 instanceof Cmd) { 13775 switch (buf1.cmd) { 13776 case "BI": 13777 return this.makeInlineImage(cipherTransform); 13778 case "[": 13779 const array = []; 13780 while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) { 13781 array.push(this.getObj(cipherTransform)); 13782 } 13783 if (this.buf1 === EOF) { 13784 if (this.recoveryMode) { 13785 return array; 13786 } 13787 throw new ParserEOFException("End of file inside array."); 13788 } 13789 this.shift(); 13790 return array; 13791 case "<<": 13792 const dict = new Dict(this.xref); 13793 while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) { 13794 if (!(this.buf1 instanceof Name)) { 13795 info("Malformed dictionary: key must be a name object"); 13796 this.shift(); 13797 continue; 13798 } 13799 const key = this.buf1.name; 13800 this.shift(); 13801 if (this.buf1 === EOF) { 13802 break; 13803 } 13804 dict.set(key, this.getObj(cipherTransform)); 13805 } 13806 if (this.buf1 === EOF) { 13807 if (this.recoveryMode) { 13808 return dict; 13809 } 13810 throw new ParserEOFException("End of file inside dictionary."); 13811 } 13812 if (isCmd(this.buf2, "stream")) { 13813 return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict; 13814 } 13815 this.shift(); 13816 return dict; 13817 default: 13818 return buf1; 13819 } 13820 } 13821 if (Number.isInteger(buf1)) { 13822 if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) { 13823 const ref = Ref.get(buf1, this.buf1); 13824 this.shift(); 13825 this.shift(); 13826 return ref; 13827 } 13828 return buf1; 13829 } 13830 if (typeof buf1 === "string") { 13831 if (cipherTransform) { 13832 return cipherTransform.decryptString(buf1); 13833 } 13834 return buf1; 13835 } 13836 return buf1; 13837 } 13838 findDefaultInlineStreamEnd(stream) { 13839 const E = 0x45, 13840 I = 0x49, 13841 SPACE = 0x20, 13842 LF = 0xa, 13843 CR = 0xd, 13844 NUL = 0x0; 13845 const { 13846 knownCommands 13847 } = this.lexer, 13848 startPos = stream.pos, 13849 n = 15; 13850 let state = 0, 13851 ch, 13852 maybeEIPos; 13853 while ((ch = stream.getByte()) !== -1) { 13854 if (state === 0) { 13855 state = ch === E ? 1 : 0; 13856 } else if (state === 1) { 13857 state = ch === I ? 2 : 0; 13858 } else { 13859 if (ch === SPACE || ch === LF || ch === CR) { 13860 maybeEIPos = stream.pos; 13861 const followingBytes = stream.peekBytes(n); 13862 const ii = followingBytes.length; 13863 if (ii === 0) { 13864 break; 13865 } 13866 for (let i = 0; i < ii; i++) { 13867 ch = followingBytes[i]; 13868 if (ch === NUL && followingBytes[i + 1] !== NUL) { 13869 continue; 13870 } 13871 if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) { 13872 state = 0; 13873 break; 13874 } 13875 } 13876 if (state !== 2) { 13877 continue; 13878 } 13879 if (!knownCommands) { 13880 warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined."); 13881 continue; 13882 } 13883 const tmpLexer = new Lexer(new Stream(followingBytes.slice()), knownCommands); 13884 tmpLexer._hexStringWarn = () => {}; 13885 let numArgs = 0; 13886 while (true) { 13887 const nextObj = tmpLexer.getObj(); 13888 if (nextObj === EOF) { 13889 state = 0; 13890 break; 13891 } 13892 if (nextObj instanceof Cmd) { 13893 const knownCommand = knownCommands[nextObj.cmd]; 13894 if (!knownCommand) { 13895 state = 0; 13896 break; 13897 } else if (knownCommand.variableArgs ? numArgs <= knownCommand.numArgs : numArgs === knownCommand.numArgs) { 13898 break; 13899 } 13900 numArgs = 0; 13901 continue; 13902 } 13903 numArgs++; 13904 } 13905 if (state === 2) { 13906 break; 13907 } 13908 } else { 13909 state = 0; 13910 } 13911 } 13912 } 13913 if (ch === -1) { 13914 warn("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker"); 13915 if (maybeEIPos) { 13916 warn('... trying to recover by using the last "EI" occurrence.'); 13917 stream.skip(-(stream.pos - maybeEIPos)); 13918 } 13919 } 13920 let endOffset = 4; 13921 stream.skip(-endOffset); 13922 ch = stream.peekByte(); 13923 stream.skip(endOffset); 13924 if (!isWhiteSpace(ch)) { 13925 endOffset--; 13926 } 13927 return stream.pos - endOffset - startPos; 13928 } 13929 findDCTDecodeInlineStreamEnd(stream) { 13930 const startPos = stream.pos; 13931 let foundEOI = false, 13932 b, 13933 markerLength; 13934 while ((b = stream.getByte()) !== -1) { 13935 if (b !== 0xff) { 13936 continue; 13937 } 13938 switch (stream.getByte()) { 13939 case 0x00: 13940 break; 13941 case 0xff: 13942 stream.skip(-1); 13943 break; 13944 case 0xd9: 13945 foundEOI = true; 13946 break; 13947 case 0xc0: 13948 case 0xc1: 13949 case 0xc2: 13950 case 0xc3: 13951 case 0xc5: 13952 case 0xc6: 13953 case 0xc7: 13954 case 0xc9: 13955 case 0xca: 13956 case 0xcb: 13957 case 0xcd: 13958 case 0xce: 13959 case 0xcf: 13960 case 0xc4: 13961 case 0xcc: 13962 case 0xda: 13963 case 0xdb: 13964 case 0xdc: 13965 case 0xdd: 13966 case 0xde: 13967 case 0xdf: 13968 case 0xe0: 13969 case 0xe1: 13970 case 0xe2: 13971 case 0xe3: 13972 case 0xe4: 13973 case 0xe5: 13974 case 0xe6: 13975 case 0xe7: 13976 case 0xe8: 13977 case 0xe9: 13978 case 0xea: 13979 case 0xeb: 13980 case 0xec: 13981 case 0xed: 13982 case 0xee: 13983 case 0xef: 13984 case 0xfe: 13985 markerLength = stream.getUint16(); 13986 if (markerLength > 2) { 13987 stream.skip(markerLength - 2); 13988 } else { 13989 stream.skip(-2); 13990 } 13991 break; 13992 } 13993 if (foundEOI) { 13994 break; 13995 } 13996 } 13997 const length = stream.pos - startPos; 13998 if (b === -1) { 13999 warn("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ instead."); 14000 stream.skip(-length); 14001 return this.findDefaultInlineStreamEnd(stream); 14002 } 14003 this.inlineStreamSkipEI(stream); 14004 return length; 14005 } 14006 findASCII85DecodeInlineStreamEnd(stream) { 14007 const TILDE = 0x7e, 14008 GT = 0x3e; 14009 const startPos = stream.pos; 14010 let ch; 14011 while ((ch = stream.getByte()) !== -1) { 14012 if (ch === TILDE) { 14013 const tildePos = stream.pos; 14014 ch = stream.peekByte(); 14015 while (isWhiteSpace(ch)) { 14016 stream.skip(); 14017 ch = stream.peekByte(); 14018 } 14019 if (ch === GT) { 14020 stream.skip(); 14021 break; 14022 } 14023 if (stream.pos > tildePos) { 14024 const maybeEI = stream.peekBytes(2); 14025 if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) { 14026 break; 14027 } 14028 } 14029 } 14030 } 14031 const length = stream.pos - startPos; 14032 if (ch === -1) { 14033 warn("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead."); 14034 stream.skip(-length); 14035 return this.findDefaultInlineStreamEnd(stream); 14036 } 14037 this.inlineStreamSkipEI(stream); 14038 return length; 14039 } 14040 findASCIIHexDecodeInlineStreamEnd(stream) { 14041 const GT = 0x3e; 14042 const startPos = stream.pos; 14043 let ch; 14044 while ((ch = stream.getByte()) !== -1) { 14045 if (ch === GT) { 14046 break; 14047 } 14048 } 14049 const length = stream.pos - startPos; 14050 if (ch === -1) { 14051 warn("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ instead."); 14052 stream.skip(-length); 14053 return this.findDefaultInlineStreamEnd(stream); 14054 } 14055 this.inlineStreamSkipEI(stream); 14056 return length; 14057 } 14058 inlineStreamSkipEI(stream) { 14059 const E = 0x45, 14060 I = 0x49; 14061 let state = 0, 14062 ch; 14063 while ((ch = stream.getByte()) !== -1) { 14064 if (state === 0) { 14065 state = ch === E ? 1 : 0; 14066 } else if (state === 1) { 14067 state = ch === I ? 2 : 0; 14068 } else if (state === 2) { 14069 break; 14070 } 14071 } 14072 } 14073 makeInlineImage(cipherTransform) { 14074 const lexer = this.lexer; 14075 const stream = lexer.stream; 14076 const dictMap = Object.create(null); 14077 let dictLength; 14078 while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) { 14079 if (!(this.buf1 instanceof Name)) { 14080 throw new FormatError("Dictionary key must be a name object"); 14081 } 14082 const key = this.buf1.name; 14083 this.shift(); 14084 if (this.buf1 === EOF) { 14085 break; 14086 } 14087 dictMap[key] = this.getObj(cipherTransform); 14088 } 14089 if (lexer.beginInlineImagePos !== -1) { 14090 dictLength = stream.pos - lexer.beginInlineImagePos; 14091 } 14092 const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter); 14093 let filterName; 14094 if (filter instanceof Name) { 14095 filterName = filter.name; 14096 } else if (Array.isArray(filter)) { 14097 const filterZero = this.xref.fetchIfRef(filter[0]); 14098 if (filterZero instanceof Name) { 14099 filterName = filterZero.name; 14100 } 14101 } 14102 const startPos = stream.pos; 14103 let length; 14104 switch (filterName) { 14105 case "DCT": 14106 case "DCTDecode": 14107 length = this.findDCTDecodeInlineStreamEnd(stream); 14108 break; 14109 case "A85": 14110 case "ASCII85Decode": 14111 length = this.findASCII85DecodeInlineStreamEnd(stream); 14112 break; 14113 case "AHx": 14114 case "ASCIIHexDecode": 14115 length = this.findASCIIHexDecodeInlineStreamEnd(stream); 14116 break; 14117 default: 14118 length = this.findDefaultInlineStreamEnd(stream); 14119 } 14120 let cacheKey; 14121 if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) { 14122 const initialStreamPos = stream.pos; 14123 stream.pos = lexer.beginInlineImagePos; 14124 cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length)); 14125 stream.pos = initialStreamPos; 14126 const cacheEntry = this.imageCache[cacheKey]; 14127 if (cacheEntry !== undefined) { 14128 this.buf2 = Cmd.get("EI"); 14129 this.shift(); 14130 cacheEntry.reset(); 14131 return cacheEntry; 14132 } 14133 } 14134 const dict = new Dict(this.xref); 14135 for (const key in dictMap) { 14136 dict.set(key, dictMap[key]); 14137 } 14138 let imageStream = stream.makeSubStream(startPos, length, dict); 14139 if (cipherTransform) { 14140 imageStream = cipherTransform.createStream(imageStream, length); 14141 } 14142 imageStream = this.filter(imageStream, dict, length); 14143 imageStream.dict = dict; 14144 if (cacheKey !== undefined) { 14145 imageStream.cacheKey = `inline_img_${++this._imageId}`; 14146 this.imageCache[cacheKey] = imageStream; 14147 } 14148 this.buf2 = Cmd.get("EI"); 14149 this.shift(); 14150 return imageStream; 14151 } 14152 #findStreamLength(startPos) { 14153 const { 14154 stream 14155 } = this.lexer; 14156 stream.pos = startPos; 14157 const SCAN_BLOCK_LENGTH = 2048; 14158 const signatureLength = "endstream".length; 14159 const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]); 14160 const endLength = END_SIGNATURE.length; 14161 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])]; 14162 const normalLength = signatureLength - endLength; 14163 while (stream.pos < stream.end) { 14164 const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); 14165 const scanLength = scanBytes.length - signatureLength; 14166 if (scanLength <= 0) { 14167 break; 14168 } 14169 let pos = 0; 14170 while (pos < scanLength) { 14171 let j = 0; 14172 while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) { 14173 j++; 14174 } 14175 if (j >= endLength) { 14176 let found = false; 14177 for (const part of PARTIAL_SIGNATURE) { 14178 const partLen = part.length; 14179 let k = 0; 14180 while (k < partLen && scanBytes[pos + j + k] === part[k]) { 14181 k++; 14182 } 14183 if (k >= normalLength) { 14184 found = true; 14185 break; 14186 } 14187 if (k >= partLen) { 14188 const lastByte = scanBytes[pos + j + k]; 14189 if (isWhiteSpace(lastByte)) { 14190 info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command."); 14191 found = true; 14192 } 14193 break; 14194 } 14195 } 14196 if (found) { 14197 stream.pos += pos; 14198 return stream.pos - startPos; 14199 } 14200 } 14201 pos++; 14202 } 14203 stream.pos += scanLength; 14204 } 14205 return -1; 14206 } 14207 makeStream(dict, cipherTransform) { 14208 const lexer = this.lexer; 14209 let stream = lexer.stream; 14210 lexer.skipToNextLine(); 14211 const startPos = stream.pos - 1; 14212 let length = dict.get("Length"); 14213 if (!Number.isInteger(length)) { 14214 info(`Bad length "${length && length.toString()}" in stream.`); 14215 length = 0; 14216 } 14217 stream.pos = startPos + length; 14218 lexer.nextChar(); 14219 if (this.tryShift() && isCmd(this.buf2, "endstream")) { 14220 this.shift(); 14221 } else { 14222 length = this.#findStreamLength(startPos); 14223 if (length < 0) { 14224 throw new FormatError("Missing endstream command."); 14225 } 14226 lexer.nextChar(); 14227 this.shift(); 14228 this.shift(); 14229 } 14230 this.shift(); 14231 stream = stream.makeSubStream(startPos, length, dict); 14232 if (cipherTransform) { 14233 stream = cipherTransform.createStream(stream, length); 14234 } 14235 stream = this.filter(stream, dict, length); 14236 stream.dict = dict; 14237 return stream; 14238 } 14239 filter(stream, dict, length) { 14240 let filter = dict.get("F", "Filter"); 14241 let params = dict.get("DP", "DecodeParms"); 14242 if (filter instanceof Name) { 14243 if (Array.isArray(params)) { 14244 warn("/DecodeParms should not be an Array, when /Filter is a Name."); 14245 } 14246 return this.makeFilter(stream, filter.name, length, params); 14247 } 14248 let maybeLength = length; 14249 if (Array.isArray(filter)) { 14250 const filterArray = filter; 14251 const paramsArray = params; 14252 for (let i = 0, ii = filterArray.length; i < ii; ++i) { 14253 filter = this.xref.fetchIfRef(filterArray[i]); 14254 if (!(filter instanceof Name)) { 14255 throw new FormatError(`Bad filter name "${filter}"`); 14256 } 14257 params = null; 14258 if (Array.isArray(paramsArray) && i in paramsArray) { 14259 params = this.xref.fetchIfRef(paramsArray[i]); 14260 } 14261 stream = this.makeFilter(stream, filter.name, maybeLength, params); 14262 maybeLength = null; 14263 } 14264 } 14265 return stream; 14266 } 14267 makeFilter(stream, name, maybeLength, params) { 14268 if (maybeLength === 0) { 14269 warn(`Empty "${name}" stream.`); 14270 return new NullStream(); 14271 } 14272 try { 14273 switch (name) { 14274 case "Fl": 14275 case "FlateDecode": 14276 if (params) { 14277 return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params); 14278 } 14279 return new FlateStream(stream, maybeLength); 14280 case "LZW": 14281 case "LZWDecode": 14282 let earlyChange = 1; 14283 if (params) { 14284 if (params.has("EarlyChange")) { 14285 earlyChange = params.get("EarlyChange"); 14286 } 14287 return new PredictorStream(new LZWStream(stream, maybeLength, earlyChange), maybeLength, params); 14288 } 14289 return new LZWStream(stream, maybeLength, earlyChange); 14290 case "DCT": 14291 case "DCTDecode": 14292 return new JpegStream(stream, maybeLength, params); 14293 case "JPX": 14294 case "JPXDecode": 14295 return new JpxStream(stream, maybeLength, params); 14296 case "A85": 14297 case "ASCII85Decode": 14298 return new Ascii85Stream(stream, maybeLength); 14299 case "AHx": 14300 case "ASCIIHexDecode": 14301 return new AsciiHexStream(stream, maybeLength); 14302 case "CCF": 14303 case "CCITTFaxDecode": 14304 return new CCITTFaxStream(stream, maybeLength, params); 14305 case "RL": 14306 case "RunLengthDecode": 14307 return new RunLengthStream(stream, maybeLength); 14308 case "JBIG2Decode": 14309 return new Jbig2Stream(stream, maybeLength, params); 14310 } 14311 warn(`Filter "${name}" is not supported.`); 14312 return stream; 14313 } catch (ex) { 14314 if (ex instanceof MissingDataException) { 14315 throw ex; 14316 } 14317 warn(`Invalid stream: "${ex}"`); 14318 return new NullStream(); 14319 } 14320 } 14321} 14322const 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]; 14323function toHexDigit(ch) { 14324 if (ch >= 0x30 && ch <= 0x39) { 14325 return ch & 0x0f; 14326 } 14327 if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { 14328 return (ch & 0x0f) + 9; 14329 } 14330 return -1; 14331} 14332class Lexer { 14333 constructor(stream, knownCommands = null) { 14334 this.stream = stream; 14335 this.nextChar(); 14336 this.strBuf = []; 14337 this.knownCommands = knownCommands; 14338 this._hexStringNumWarn = 0; 14339 this.beginInlineImagePos = -1; 14340 } 14341 nextChar() { 14342 return this.currentChar = this.stream.getByte(); 14343 } 14344 peekChar() { 14345 return this.stream.peekByte(); 14346 } 14347 getNumber() { 14348 let ch = this.currentChar; 14349 let eNotation = false; 14350 let divideBy = 0; 14351 let sign = 1; 14352 if (ch === 0x2d) { 14353 sign = -1; 14354 ch = this.nextChar(); 14355 if (ch === 0x2d) { 14356 ch = this.nextChar(); 14357 } 14358 } else if (ch === 0x2b) { 14359 ch = this.nextChar(); 14360 } 14361 if (ch === 0x0a || ch === 0x0d) { 14362 do { 14363 ch = this.nextChar(); 14364 } while (ch === 0x0a || ch === 0x0d); 14365 } 14366 if (ch === 0x2e) { 14367 divideBy = 10; 14368 ch = this.nextChar(); 14369 } 14370 if (ch < 0x30 || ch > 0x39) { 14371 const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`; 14372 if (isWhiteSpace(ch) || ch === -1) { 14373 info(`Lexer.getNumber - "${msg}".`); 14374 return 0; 14375 } 14376 throw new FormatError(msg); 14377 } 14378 let baseValue = ch - 0x30; 14379 let powerValue = 0; 14380 let powerValueSign = 1; 14381 while ((ch = this.nextChar()) >= 0) { 14382 if (ch >= 0x30 && ch <= 0x39) { 14383 const currentDigit = ch - 0x30; 14384 if (eNotation) { 14385 powerValue = powerValue * 10 + currentDigit; 14386 } else { 14387 if (divideBy !== 0) { 14388 divideBy *= 10; 14389 } 14390 baseValue = baseValue * 10 + currentDigit; 14391 } 14392 } else if (ch === 0x2e) { 14393 if (divideBy === 0) { 14394 divideBy = 1; 14395 } else { 14396 break; 14397 } 14398 } else if (ch === 0x2d) { 14399 warn("Badly formatted number: minus sign in the middle"); 14400 } else if (ch === 0x45 || ch === 0x65) { 14401 ch = this.peekChar(); 14402 if (ch === 0x2b || ch === 0x2d) { 14403 powerValueSign = ch === 0x2d ? -1 : 1; 14404 this.nextChar(); 14405 } else if (ch < 0x30 || ch > 0x39) { 14406 break; 14407 } 14408 eNotation = true; 14409 } else { 14410 break; 14411 } 14412 } 14413 if (divideBy !== 0) { 14414 baseValue /= divideBy; 14415 } 14416 if (eNotation) { 14417 baseValue *= 10 ** (powerValueSign * powerValue); 14418 } 14419 return sign * baseValue; 14420 } 14421 getString() { 14422 let numParen = 1; 14423 let done = false; 14424 const strBuf = this.strBuf; 14425 strBuf.length = 0; 14426 let ch = this.nextChar(); 14427 while (true) { 14428 let charBuffered = false; 14429 switch (ch | 0) { 14430 case -1: 14431 warn("Unterminated string"); 14432 done = true; 14433 break; 14434 case 0x28: 14435 ++numParen; 14436 strBuf.push("("); 14437 break; 14438 case 0x29: 14439 if (--numParen === 0) { 14440 this.nextChar(); 14441 done = true; 14442 } else { 14443 strBuf.push(")"); 14444 } 14445 break; 14446 case 0x5c: 14447 ch = this.nextChar(); 14448 switch (ch) { 14449 case -1: 14450 warn("Unterminated string"); 14451 done = true; 14452 break; 14453 case 0x6e: 14454 strBuf.push("\n"); 14455 break; 14456 case 0x72: 14457 strBuf.push("\r"); 14458 break; 14459 case 0x74: 14460 strBuf.push("\t"); 14461 break; 14462 case 0x62: 14463 strBuf.push("\b"); 14464 break; 14465 case 0x66: 14466 strBuf.push("\f"); 14467 break; 14468 case 0x5c: 14469 case 0x28: 14470 case 0x29: 14471 strBuf.push(String.fromCharCode(ch)); 14472 break; 14473 case 0x30: 14474 case 0x31: 14475 case 0x32: 14476 case 0x33: 14477 case 0x34: 14478 case 0x35: 14479 case 0x36: 14480 case 0x37: 14481 let x = ch & 0x0f; 14482 ch = this.nextChar(); 14483 charBuffered = true; 14484 if (ch >= 0x30 && ch <= 0x37) { 14485 x = (x << 3) + (ch & 0x0f); 14486 ch = this.nextChar(); 14487 if (ch >= 0x30 && ch <= 0x37) { 14488 charBuffered = false; 14489 x = (x << 3) + (ch & 0x0f); 14490 } 14491 } 14492 strBuf.push(String.fromCharCode(x)); 14493 break; 14494 case 0x0d: 14495 if (this.peekChar() === 0x0a) { 14496 this.nextChar(); 14497 } 14498 break; 14499 case 0x0a: 14500 break; 14501 default: 14502 strBuf.push(String.fromCharCode(ch)); 14503 break; 14504 } 14505 break; 14506 default: 14507 strBuf.push(String.fromCharCode(ch)); 14508 break; 14509 } 14510 if (done) { 14511 break; 14512 } 14513 if (!charBuffered) { 14514 ch = this.nextChar(); 14515 } 14516 } 14517 return strBuf.join(""); 14518 } 14519 getName() { 14520 let ch, previousCh; 14521 const strBuf = this.strBuf; 14522 strBuf.length = 0; 14523 while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { 14524 if (ch === 0x23) { 14525 ch = this.nextChar(); 14526 if (specialChars[ch]) { 14527 warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number."); 14528 strBuf.push("#"); 14529 break; 14530 } 14531 const x = toHexDigit(ch); 14532 if (x !== -1) { 14533 previousCh = ch; 14534 ch = this.nextChar(); 14535 const x2 = toHexDigit(ch); 14536 if (x2 === -1) { 14537 warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number."); 14538 strBuf.push("#", String.fromCharCode(previousCh)); 14539 if (specialChars[ch]) { 14540 break; 14541 } 14542 strBuf.push(String.fromCharCode(ch)); 14543 continue; 14544 } 14545 strBuf.push(String.fromCharCode(x << 4 | x2)); 14546 } else { 14547 strBuf.push("#", String.fromCharCode(ch)); 14548 } 14549 } else { 14550 strBuf.push(String.fromCharCode(ch)); 14551 } 14552 } 14553 if (strBuf.length > 127) { 14554 warn(`Name token is longer than allowed by the spec: ${strBuf.length}`); 14555 } 14556 return Name.get(strBuf.join("")); 14557 } 14558 _hexStringWarn(ch) { 14559 const MAX_HEX_STRING_NUM_WARN = 5; 14560 if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { 14561 warn("getHexString - ignoring additional invalid characters."); 14562 return; 14563 } 14564 if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { 14565 return; 14566 } 14567 warn(`getHexString - ignoring invalid character: ${ch}`); 14568 } 14569 getHexString() { 14570 const strBuf = this.strBuf; 14571 strBuf.length = 0; 14572 let ch = this.currentChar; 14573 let firstDigit = -1, 14574 digit = -1; 14575 this._hexStringNumWarn = 0; 14576 while (true) { 14577 if (ch < 0) { 14578 warn("Unterminated hex string"); 14579 break; 14580 } else if (ch === 0x3e) { 14581 this.nextChar(); 14582 break; 14583 } else if (specialChars[ch] === 1) { 14584 ch = this.nextChar(); 14585 continue; 14586 } else { 14587 digit = toHexDigit(ch); 14588 if (digit === -1) { 14589 this._hexStringWarn(ch); 14590 } else if (firstDigit === -1) { 14591 firstDigit = digit; 14592 } else { 14593 strBuf.push(String.fromCharCode(firstDigit << 4 | digit)); 14594 firstDigit = -1; 14595 } 14596 ch = this.nextChar(); 14597 } 14598 } 14599 if (firstDigit !== -1) { 14600 strBuf.push(String.fromCharCode(firstDigit << 4)); 14601 } 14602 return strBuf.join(""); 14603 } 14604 getObj() { 14605 let comment = false;
vendor: 13,956 bytes, lines 14606-15096
14606 let ch = this.currentChar; 14607 while (true) { 14608 if (ch < 0) { 14609 return EOF; 14610 } 14611 if (comment) { 14612 if (ch === 0x0a || ch === 0x0d) { 14613 comment = false; 14614 } 14615 } else if (ch === 0x25) { 14616 comment = true; 14617 } else if (specialChars[ch] !== 1) { 14618 break; 14619 } 14620 ch = this.nextChar(); 14621 } 14622 switch (ch | 0) { 14623 case 0x30: 14624 case 0x31: 14625 case 0x32: 14626 case 0x33: 14627 case 0x34: 14628 case 0x35: 14629 case 0x36: 14630 case 0x37: 14631 case 0x38: 14632 case 0x39: 14633 case 0x2b: 14634 case 0x2d: 14635 case 0x2e: 14636 return this.getNumber(); 14637 case 0x28: 14638 return this.getString(); 14639 case 0x2f: 14640 return this.getName(); 14641 case 0x5b: 14642 this.nextChar(); 14643 return Cmd.get("["); 14644 case 0x5d: 14645 this.nextChar(); 14646 return Cmd.get("]"); 14647 case 0x3c: 14648 ch = this.nextChar(); 14649 if (ch === 0x3c) { 14650 this.nextChar(); 14651 return Cmd.get("<<"); 14652 } 14653 return this.getHexString(); 14654 case 0x3e: 14655 ch = this.nextChar(); 14656 if (ch === 0x3e) { 14657 this.nextChar(); 14658 return Cmd.get(">>"); 14659 } 14660 return Cmd.get(">"); 14661 case 0x7b: 14662 this.nextChar(); 14663 return Cmd.get("{"); 14664 case 0x7d: 14665 this.nextChar(); 14666 return Cmd.get("}"); 14667 case 0x29: 14668 this.nextChar(); 14669 throw new FormatError(`Illegal character: ${ch}`); 14670 } 14671 let str = String.fromCharCode(ch); 14672 if (ch < 0x20 || ch > 0x7f) { 14673 const nextCh = this.peekChar(); 14674 if (nextCh >= 0x20 && nextCh <= 0x7f) { 14675 this.nextChar(); 14676 return Cmd.get(str); 14677 } 14678 } 14679 const knownCommands = this.knownCommands; 14680 let knownCommandFound = knownCommands?.[str] !== undefined; 14681 while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { 14682 const possibleCommand = str + String.fromCharCode(ch); 14683 if (knownCommandFound && knownCommands[possibleCommand] === undefined) { 14684 break; 14685 } 14686 if (str.length === 128) { 14687 throw new FormatError(`Command token too long: ${str.length}`); 14688 } 14689 str = possibleCommand; 14690 knownCommandFound = knownCommands?.[str] !== undefined; 14691 } 14692 if (str === "true") { 14693 return true; 14694 } 14695 if (str === "false") { 14696 return false; 14697 } 14698 if (str === "null") { 14699 return null; 14700 } 14701 if (str === "BI") { 14702 this.beginInlineImagePos = this.stream.pos; 14703 } 14704 return Cmd.get(str); 14705 } 14706 skipToNextLine() { 14707 let ch = this.currentChar; 14708 while (ch >= 0) { 14709 if (ch === 0x0d) { 14710 ch = this.nextChar(); 14711 if (ch === 0x0a) { 14712 this.nextChar(); 14713 } 14714 break; 14715 } else if (ch === 0x0a) { 14716 this.nextChar(); 14717 break; 14718 } 14719 ch = this.nextChar(); 14720 } 14721 } 14722} 14723class Linearization { 14724 static create(stream) { 14725 function getInt(linDict, name, allowZeroValue = false) { 14726 const obj = linDict.get(name); 14727 if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { 14728 return obj; 14729 } 14730 throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid."); 14731 } 14732 function getHints(linDict) { 14733 const hints = linDict.get("H"); 14734 let hintsLength; 14735 if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { 14736 for (let index = 0; index < hintsLength; index++) { 14737 const hint = hints[index]; 14738 if (!(Number.isInteger(hint) && hint > 0)) { 14739 throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`); 14740 } 14741 } 14742 return hints; 14743 } 14744 throw new Error("Hint array in the linearization dictionary is invalid."); 14745 } 14746 const parser = new Parser({ 14747 lexer: new Lexer(stream), 14748 xref: null 14749 }); 14750 const obj1 = parser.getObj(); 14751 const obj2 = parser.getObj(); 14752 const obj3 = parser.getObj(); 14753 const linDict = parser.getObj(); 14754 let obj, length; 14755 if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { 14756 return null; 14757 } else if ((length = getInt(linDict, "L")) !== stream.length) { 14758 throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); 14759 } 14760 return { 14761 length, 14762 hints: getHints(linDict), 14763 objectNumberFirst: getInt(linDict, "O"), 14764 endFirst: getInt(linDict, "E"), 14765 numPages: getInt(linDict, "N"), 14766 mainXRefEntriesOffset: getInt(linDict, "T"), 14767 pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 14768 }; 14769 } 14770} 14771 14772;// ./src/core/cmap.js 14773 14774 14775 14776 14777 14778 14779 14780 14781 14782 14783const 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"]; 14784const MAX_MAP_RANGE = 2 ** 24 - 1; 14785class CMap { 14786 constructor(builtInCMap = false) { 14787 this.codespaceRanges = [[], [], [], []]; 14788 this.numCodespaceRanges = 0; 14789 this._map = []; 14790 this.name = ""; 14791 this.vertical = false; 14792 this.useCMap = null; 14793 this.builtInCMap = builtInCMap; 14794 } 14795 addCodespaceRange(n, low, high) { 14796 this.codespaceRanges[n - 1].push(low, high); 14797 this.numCodespaceRanges++; 14798 } 14799 mapCidRange(low, high, dstLow) { 14800 if (high - low > MAX_MAP_RANGE) { 14801 throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); 14802 } 14803 while (low <= high) { 14804 this._map[low++] = dstLow++; 14805 } 14806 } 14807 mapBfRange(low, high, dstLow) { 14808 if (high - low > MAX_MAP_RANGE) { 14809 throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); 14810 } 14811 const lastByte = dstLow.length - 1; 14812 while (low <= high) { 14813 this._map[low++] = dstLow; 14814 const nextCharCode = dstLow.charCodeAt(lastByte) + 1; 14815 if (nextCharCode > 0xff) { 14816 dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00"; 14817 continue; 14818 } 14819 dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); 14820 } 14821 } 14822 mapBfRangeToArray(low, high, array) { 14823 if (high - low > MAX_MAP_RANGE) { 14824 throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); 14825 } 14826 const ii = array.length; 14827 let i = 0; 14828 while (low <= high && i < ii) { 14829 this._map[low] = array[i++]; 14830 ++low; 14831 } 14832 } 14833 mapOne(src, dst) { 14834 this._map[src] = dst; 14835 } 14836 lookup(code) { 14837 return this._map[code]; 14838 } 14839 contains(code) { 14840 return this._map[code] !== undefined; 14841 } 14842 forEach(callback) { 14843 const map = this._map; 14844 const length = map.length; 14845 if (length <= 0x10000) { 14846 for (let i = 0; i < length; i++) { 14847 if (map[i] !== undefined) { 14848 callback(i, map[i]); 14849 } 14850 } 14851 } else { 14852 for (const i in map) { 14853 callback(i, map[i]); 14854 } 14855 } 14856 } 14857 charCodeOf(value) { 14858 const map = this._map; 14859 if (map.length <= 0x10000) { 14860 return map.indexOf(value); 14861 } 14862 for (const charCode in map) { 14863 if (map[charCode] === value) { 14864 return charCode | 0; 14865 } 14866 } 14867 return -1; 14868 } 14869 getMap() { 14870 return this._map; 14871 } 14872 readCharCode(str, offset, out) { 14873 let c = 0; 14874 const codespaceRanges = this.codespaceRanges; 14875 for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { 14876 c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; 14877 const codespaceRange = codespaceRanges[n]; 14878 for (let k = 0, kk = codespaceRange.length; k < kk;) { 14879 const low = codespaceRange[k++]; 14880 const high = codespaceRange[k++]; 14881 if (c >= low && c <= high) { 14882 out.charcode = c; 14883 out.length = n + 1; 14884 return; 14885 } 14886 } 14887 } 14888 out.charcode = 0; 14889 out.length = 1; 14890 } 14891 getCharCodeLength(charCode) { 14892 const codespaceRanges = this.codespaceRanges; 14893 for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { 14894 const codespaceRange = codespaceRanges[n]; 14895 for (let k = 0, kk = codespaceRange.length; k < kk;) { 14896 const low = codespaceRange[k++]; 14897 const high = codespaceRange[k++]; 14898 if (charCode >= low && charCode <= high) { 14899 return n + 1; 14900 } 14901 } 14902 } 14903 return 1; 14904 } 14905 get length() { 14906 return this._map.length; 14907 } 14908 get isIdentityCMap() { 14909 if (!(this.name === "Identity-H" || this.name === "Identity-V")) { 14910 return false; 14911 } 14912 if (this._map.length !== 0x10000) { 14913 return false; 14914 } 14915 for (let i = 0; i < 0x10000; i++) { 14916 if (this._map[i] !== i) { 14917 return false; 14918 } 14919 } 14920 return true; 14921 } 14922} 14923class IdentityCMap extends CMap { 14924 constructor(vertical, n) { 14925 super(); 14926 this.vertical = vertical; 14927 this.addCodespaceRange(n, 0, 0xffff); 14928 } 14929 mapCidRange(low, high, dstLow) { 14930 unreachable("should not call mapCidRange"); 14931 } 14932 mapBfRange(low, high, dstLow) { 14933 unreachable("should not call mapBfRange"); 14934 } 14935 mapBfRangeToArray(low, high, array) { 14936 unreachable("should not call mapBfRangeToArray"); 14937 } 14938 mapOne(src, dst) { 14939 unreachable("should not call mapCidOne"); 14940 } 14941 lookup(code) { 14942 return Number.isInteger(code) && code <= 0xffff ? code : undefined; 14943 } 14944 contains(code) { 14945 return Number.isInteger(code) && code <= 0xffff; 14946 } 14947 forEach(callback) { 14948 for (let i = 0; i <= 0xffff; i++) { 14949 callback(i, i); 14950 } 14951 } 14952 charCodeOf(value) { 14953 return Number.isInteger(value) && value <= 0xffff ? value : -1; 14954 } 14955 getMap() { 14956 const map = new Array(0x10000); 14957 for (let i = 0; i <= 0xffff; i++) { 14958 map[i] = i; 14959 } 14960 return map; 14961 } 14962 get length() { 14963 return 0x10000; 14964 } 14965 get isIdentityCMap() { 14966 unreachable("should not access .isIdentityCMap"); 14967 } 14968} 14969function strToInt(str) { 14970 let a = 0; 14971 for (let i = 0; i < str.length; i++) { 14972 a = a << 8 | str.charCodeAt(i); 14973 } 14974 return a >>> 0; 14975} 14976function expectString(obj) { 14977 if (typeof obj !== "string") { 14978 throw new FormatError("Malformed CMap: expected string."); 14979 } 14980} 14981function expectInt(obj) { 14982 if (!Number.isInteger(obj)) { 14983 throw new FormatError("Malformed CMap: expected int."); 14984 } 14985} 14986function parseBfChar(cMap, lexer) { 14987 while (true) { 14988 let obj = lexer.getObj(); 14989 if (obj === EOF) { 14990 break; 14991 } 14992 if (isCmd(obj, "endbfchar")) { 14993 return; 14994 } 14995 expectString(obj); 14996 const src = strToInt(obj); 14997 obj = lexer.getObj(); 14998 expectString(obj); 14999 const dst = obj; 15000 cMap.mapOne(src, dst); 15001 } 15002} 15003function parseBfRange(cMap, lexer) { 15004 while (true) { 15005 let obj = lexer.getObj(); 15006 if (obj === EOF) { 15007 break; 15008 } 15009 if (isCmd(obj, "endbfrange")) { 15010 return; 15011 } 15012 expectString(obj); 15013 const low = strToInt(obj); 15014 obj = lexer.getObj(); 15015 expectString(obj); 15016 const high = strToInt(obj); 15017 obj = lexer.getObj(); 15018 if (Number.isInteger(obj) || typeof obj === "string") { 15019 const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; 15020 cMap.mapBfRange(low, high, dstLow); 15021 } else if (isCmd(obj, "[")) { 15022 obj = lexer.getObj(); 15023 const array = []; 15024 while (!isCmd(obj, "]") && obj !== EOF) { 15025 array.push(obj); 15026 obj = lexer.getObj(); 15027 } 15028 cMap.mapBfRangeToArray(low, high, array); 15029 } else { 15030 break; 15031 } 15032 } 15033 throw new FormatError("Invalid bf range."); 15034} 15035function parseCidChar(cMap, lexer) { 15036 while (true) { 15037 let obj = lexer.getObj(); 15038 if (obj === EOF) { 15039 break; 15040 } 15041 if (isCmd(obj, "endcidchar")) { 15042 return; 15043 } 15044 expectString(obj); 15045 const src = strToInt(obj); 15046 obj = lexer.getObj(); 15047 expectInt(obj); 15048 const dst = obj; 15049 cMap.mapOne(src, dst); 15050 } 15051} 15052function parseCidRange(cMap, lexer) { 15053 while (true) { 15054 let obj = lexer.getObj(); 15055 if (obj === EOF) { 15056 break; 15057 } 15058 if (isCmd(obj, "endcidrange")) { 15059 return; 15060 } 15061 expectString(obj); 15062 const low = strToInt(obj); 15063 obj = lexer.getObj(); 15064 expectString(obj); 15065 const high = strToInt(obj); 15066 obj = lexer.getObj(); 15067 expectInt(obj); 15068 const dstLow = obj; 15069 cMap.mapCidRange(low, high, dstLow); 15070 } 15071} 15072function parseCodespaceRange(cMap, lexer) { 15073 while (true) { 15074 let obj = lexer.getObj(); 15075 if (obj === EOF) { 15076 break; 15077 } 15078 if (isCmd(obj, "endcodespacerange")) { 15079 return; 15080 } 15081 if (typeof obj !== "string") { 15082 break; 15083 } 15084 const low = strToInt(obj); 15085 obj = lexer.getObj(); 15086 if (typeof obj !== "string") { 15087 break; 15088 } 15089 const high = strToInt(obj); 15090 cMap.addCodespaceRange(obj.length, low, high); 15091 } 15092 throw new FormatError("Invalid codespace range."); 15093} 15094function parseWMode(cMap, lexer) { 15095 const obj = lexer.getObj(); 15096 if (Number.isInteger(obj)) {
vendor: 4,375 bytes, lines 15097-15223
15097 cMap.vertical = !!obj; 15098 } 15099} 15100function parseCMapName(cMap, lexer) { 15101 const obj = lexer.getObj(); 15102 if (obj instanceof Name) { 15103 cMap.name = obj.name; 15104 } 15105} 15106async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { 15107 let previous, embeddedUseCMap; 15108 objLoop: while (true) { 15109 try { 15110 const obj = lexer.getObj(); 15111 if (obj === EOF) { 15112 break; 15113 } else if (obj instanceof Name) { 15114 if (obj.name === "WMode") { 15115 parseWMode(cMap, lexer); 15116 } else if (obj.name === "CMapName") { 15117 parseCMapName(cMap, lexer); 15118 } 15119 previous = obj; 15120 } else if (obj instanceof Cmd) { 15121 switch (obj.cmd) { 15122 case "endcmap": 15123 break objLoop; 15124 case "usecmap": 15125 if (previous instanceof Name) { 15126 embeddedUseCMap = previous.name; 15127 } 15128 break; 15129 case "begincodespacerange": 15130 parseCodespaceRange(cMap, lexer); 15131 break; 15132 case "beginbfchar": 15133 parseBfChar(cMap, lexer); 15134 break; 15135 case "begincidchar": 15136 parseCidChar(cMap, lexer); 15137 break; 15138 case "beginbfrange": 15139 parseBfRange(cMap, lexer); 15140 break; 15141 case "begincidrange": 15142 parseCidRange(cMap, lexer); 15143 break; 15144 } 15145 } 15146 } catch (ex) { 15147 if (ex instanceof MissingDataException) { 15148 throw ex; 15149 } 15150 warn("Invalid cMap data: " + ex); 15151 continue; 15152 } 15153 } 15154 if (!useCMap && embeddedUseCMap) { 15155 useCMap = embeddedUseCMap; 15156 } 15157 if (useCMap) { 15158 return extendCMap(cMap, fetchBuiltInCMap, useCMap); 15159 } 15160 return cMap; 15161} 15162async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { 15163 cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); 15164 if (cMap.numCodespaceRanges === 0) { 15165 const useCodespaceRanges = cMap.useCMap.codespaceRanges; 15166 for (let i = 0; i < useCodespaceRanges.length; i++) { 15167 cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); 15168 } 15169 cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; 15170 } 15171 cMap.useCMap.forEach(function (key, value) { 15172 if (!cMap.contains(key)) { 15173 cMap.mapOne(key, value); 15174 } 15175 }); 15176 return cMap; 15177} 15178async function createBuiltInCMap(name, fetchBuiltInCMap) { 15179 if (name === "Identity-H") { 15180 return new IdentityCMap(false, 2); 15181 } else if (name === "Identity-V") { 15182 return new IdentityCMap(true, 2); 15183 } 15184 if (!BUILT_IN_CMAPS.includes(name)) { 15185 throw new Error("Unknown CMap name: " + name); 15186 } 15187 if (!fetchBuiltInCMap) { 15188 throw new Error("Built-in CMap parameters are not provided."); 15189 } 15190 const { 15191 cMapData, 15192 isCompressed 15193 } = await fetchBuiltInCMap(name); 15194 const cMap = new CMap(true); 15195 if (isCompressed) { 15196 return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap)); 15197 } 15198 const lexer = new Lexer(new Stream(cMapData)); 15199 return parseCMap(cMap, lexer, fetchBuiltInCMap, null); 15200} 15201class CMapFactory { 15202 static async create({ 15203 encoding, 15204 fetchBuiltInCMap, 15205 useCMap 15206 }) { 15207 if (encoding instanceof Name) { 15208 return createBuiltInCMap(encoding.name, fetchBuiltInCMap); 15209 } else if (encoding instanceof BaseStream) { 15210 const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap); 15211 if (parsedCMap.isIdentityCMap) { 15212 return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); 15213 } 15214 return parsedCMap; 15215 } 15216 throw new Error("Encoding required."); 15217 } 15218} 15219 15220// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.to-array.js 15221var esnext_iterator_to_array = __webpack_require__(1795); 15222;// ./src/core/charsets.js 15223const 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", "periodce
15223ntered", "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"]; 15224const 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"]; 15225const 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"];
vendor: 16,452 bytes, lines 15225-15235
15225 15226 15227;// ./src/core/encodings.js 15228const 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"]; 15229const 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", "", "", "", ""]; 15230const 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"]; 15231const 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", "", "", "", ""]; 15232const 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"]; 15233const 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", ""]; 15234const 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", ""]; 15235function getEncoding(encodingName) {
15236 switch (encodingName) { 15237 case "WinAnsiEncoding": 15238 return WinAnsiEncoding; 15239 case "StandardEncoding": 15240 return StandardEncoding; 15241 case "MacRomanEncoding": 15242 return MacRomanEncoding; 15243 case "SymbolSetEncoding": 15244 return SymbolSetEncoding; 15245 case "ZapfDingbatsEncoding": 15246 return ZapfDingbatsEncoding; 15247 case "ExpertEncoding": 15248 return ExpertEncoding; 15249 case "MacExpertEncoding": 15250 return MacExpertEncoding; 15251 default: 15252 return null; 15253 } 15254} 15255 15256;// ./src/core/cff_parser.js 15257 15258 15259 15260 15261 15262 15263 15264 15265 15266 15267const MAX_SUBR_NESTING = 10; 15268const 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", "periodce
vendor: 36,833 bytes, lines 15268-16469
15268ntered", "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"]; 15269const NUM_STANDARD_CFF_STRINGS = 391; 15270const CharstringValidationData = [null, { 15271 id: "hstem", 15272 min: 2, 15273 stackClearing: true, 15274 stem: true 15275}, null, { 15276 id: "vstem", 15277 min: 2, 15278 stackClearing: true, 15279 stem: true 15280}, { 15281 id: "vmoveto", 15282 min: 1, 15283 stackClearing: true 15284}, { 15285 id: "rlineto", 15286 min: 2, 15287 resetStack: true 15288}, { 15289 id: "hlineto", 15290 min: 1, 15291 resetStack: true 15292}, { 15293 id: "vlineto", 15294 min: 1, 15295 resetStack: true 15296}, { 15297 id: "rrcurveto", 15298 min: 6, 15299 resetStack: true 15300}, null, { 15301 id: "callsubr", 15302 min: 1, 15303 undefStack: true 15304}, { 15305 id: "return", 15306 min: 0, 15307 undefStack: true 15308}, null, null, { 15309 id: "endchar", 15310 min: 0, 15311 stackClearing: true 15312}, null, null, null, { 15313 id: "hstemhm", 15314 min: 2, 15315 stackClearing: true, 15316 stem: true 15317}, { 15318 id: "hintmask", 15319 min: 0, 15320 stackClearing: true 15321}, { 15322 id: "cntrmask", 15323 min: 0, 15324 stackClearing: true 15325}, { 15326 id: "rmoveto", 15327 min: 2, 15328 stackClearing: true 15329}, { 15330 id: "hmoveto", 15331 min: 1, 15332 stackClearing: true 15333}, { 15334 id: "vstemhm", 15335 min: 2, 15336 stackClearing: true, 15337 stem: true 15338}, { 15339 id: "rcurveline", 15340 min: 8, 15341 resetStack: true 15342}, { 15343 id: "rlinecurve", 15344 min: 8, 15345 resetStack: true 15346}, { 15347 id: "vvcurveto", 15348 min: 4, 15349 resetStack: true 15350}, { 15351 id: "hhcurveto", 15352 min: 4, 15353 resetStack: true 15354}, null, { 15355 id: "callgsubr", 15356 min: 1, 15357 undefStack: true 15358}, { 15359 id: "vhcurveto", 15360 min: 4, 15361 resetStack: true 15362}, { 15363 id: "hvcurveto", 15364 min: 4, 15365 resetStack: true 15366}]; 15367const CharstringValidationData12 = [null, null, null, { 15368 id: "and", 15369 min: 2, 15370 stackDelta: -1 15371}, { 15372 id: "or", 15373 min: 2, 15374 stackDelta: -1 15375}, { 15376 id: "not", 15377 min: 1, 15378 stackDelta: 0 15379}, null, null, null, { 15380 id: "abs", 15381 min: 1, 15382 stackDelta: 0 15383}, { 15384 id: "add", 15385 min: 2, 15386 stackDelta: -1, 15387 stackFn(stack, index) { 15388 stack[index - 2] = stack[index - 2] + stack[index - 1]; 15389 } 15390}, { 15391 id: "sub", 15392 min: 2, 15393 stackDelta: -1, 15394 stackFn(stack, index) { 15395 stack[index - 2] = stack[index - 2] - stack[index - 1]; 15396 } 15397}, { 15398 id: "div", 15399 min: 2, 15400 stackDelta: -1, 15401 stackFn(stack, index) { 15402 stack[index - 2] = stack[index - 2] / stack[index - 1]; 15403 } 15404}, null, { 15405 id: "neg", 15406 min: 1, 15407 stackDelta: 0, 15408 stackFn(stack, index) { 15409 stack[index - 1] = -stack[index - 1]; 15410 } 15411}, { 15412 id: "eq", 15413 min: 2, 15414 stackDelta: -1 15415}, null, null, { 15416 id: "drop", 15417 min: 1, 15418 stackDelta: -1 15419}, null, { 15420 id: "put", 15421 min: 2, 15422 stackDelta: -2 15423}, { 15424 id: "get", 15425 min: 1, 15426 stackDelta: 0 15427}, { 15428 id: "ifelse", 15429 min: 4, 15430 stackDelta: -3 15431}, { 15432 id: "random", 15433 min: 0, 15434 stackDelta: 1 15435}, { 15436 id: "mul", 15437 min: 2, 15438 stackDelta: -1, 15439 stackFn(stack, index) { 15440 stack[index - 2] = stack[index - 2] * stack[index - 1]; 15441 } 15442}, null, { 15443 id: "sqrt", 15444 min: 1, 15445 stackDelta: 0 15446}, { 15447 id: "dup", 15448 min: 1, 15449 stackDelta: 1 15450}, { 15451 id: "exch", 15452 min: 2, 15453 stackDelta: 0 15454}, { 15455 id: "index", 15456 min: 2, 15457 stackDelta: 0 15458}, { 15459 id: "roll", 15460 min: 3, 15461 stackDelta: -2 15462}, null, null, null, { 15463 id: "hflex", 15464 min: 7, 15465 resetStack: true 15466}, { 15467 id: "flex", 15468 min: 13, 15469 resetStack: true 15470}, { 15471 id: "hflex1", 15472 min: 9, 15473 resetStack: true 15474}, { 15475 id: "flex1", 15476 min: 11, 15477 resetStack: true 15478}]; 15479class CFFParser { 15480 constructor(file, properties, seacAnalysisEnabled) { 15481 this.bytes = file.getBytes(); 15482 this.properties = properties; 15483 this.seacAnalysisEnabled = !!seacAnalysisEnabled; 15484 } 15485 parse() { 15486 const properties = this.properties; 15487 const cff = new CFF(); 15488 this.cff = cff; 15489 const header = this.parseHeader(); 15490 const nameIndex = this.parseIndex(header.endPos); 15491 const topDictIndex = this.parseIndex(nameIndex.endPos); 15492 const stringIndex = this.parseIndex(topDictIndex.endPos); 15493 const globalSubrIndex = this.parseIndex(stringIndex.endPos); 15494 const topDictParsed = this.parseDict(topDictIndex.obj.get(0)); 15495 const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); 15496 cff.header = header.obj; 15497 cff.names = this.parseNameIndex(nameIndex.obj); 15498 cff.strings = this.parseStringIndex(stringIndex.obj); 15499 cff.topDict = topDict; 15500 cff.globalSubrIndex = globalSubrIndex.obj; 15501 this.parsePrivateDict(cff.topDict); 15502 cff.isCIDFont = topDict.hasName("ROS"); 15503 const charStringOffset = topDict.getByName("CharStrings"); 15504 const charStringIndex = this.parseIndex(charStringOffset).obj; 15505 const fontMatrix = topDict.getByName("FontMatrix"); 15506 if (fontMatrix) { 15507 properties.fontMatrix = fontMatrix; 15508 } 15509 const fontBBox = topDict.getByName("FontBBox"); 15510 if (fontBBox) { 15511 properties.ascent = Math.max(fontBBox[3], fontBBox[1]); 15512 properties.descent = Math.min(fontBBox[1], fontBBox[3]); 15513 properties.ascentScaled = true; 15514 } 15515 let charset, encoding; 15516 if (cff.isCIDFont) { 15517 const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; 15518 for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) { 15519 const dictRaw = fdArrayIndex.get(i); 15520 const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); 15521 this.parsePrivateDict(fontDict); 15522 cff.fdArray.push(fontDict); 15523 } 15524 encoding = null; 15525 charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); 15526 cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); 15527 } else { 15528 charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); 15529 encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); 15530 } 15531 cff.charset = charset; 15532 cff.encoding = encoding; 15533 const charStringsAndSeacs = this.parseCharStrings({ 15534 charStrings: charStringIndex, 15535 localSubrIndex: topDict.privateDict.subrsIndex, 15536 globalSubrIndex: globalSubrIndex.obj, 15537 fdSelect: cff.fdSelect, 15538 fdArray: cff.fdArray, 15539 privateDict: topDict.privateDict 15540 }); 15541 cff.charStrings = charStringsAndSeacs.charStrings; 15542 cff.seacs = charStringsAndSeacs.seacs; 15543 cff.widths = charStringsAndSeacs.widths; 15544 return cff; 15545 } 15546 parseHeader() { 15547 let bytes = this.bytes; 15548 const bytesLength = bytes.length; 15549 let offset = 0; 15550 while (offset < bytesLength && bytes[offset] !== 1) { 15551 ++offset; 15552 } 15553 if (offset >= bytesLength) { 15554 throw new FormatError("Invalid CFF header"); 15555 } 15556 if (offset !== 0) { 15557 info("cff data is shifted"); 15558 bytes = bytes.subarray(offset); 15559 this.bytes = bytes; 15560 } 15561 const major = bytes[0]; 15562 const minor = bytes[1]; 15563 const hdrSize = bytes[2]; 15564 const offSize = bytes[3]; 15565 const header = new CFFHeader(major, minor, hdrSize, offSize); 15566 return { 15567 obj: header, 15568 endPos: hdrSize 15569 }; 15570 } 15571 parseDict(dict) { 15572 let pos = 0; 15573 function parseOperand() { 15574 let value = dict[pos++]; 15575 if (value === 30) { 15576 return parseFloatOperand(); 15577 } else if (value === 28) { 15578 value = dict[pos++]; 15579 value = (value << 24 | dict[pos++] << 16) >> 16; 15580 return value; 15581 } else if (value === 29) { 15582 value = dict[pos++]; 15583 value = value << 8 | dict[pos++]; 15584 value = value << 8 | dict[pos++]; 15585 value = value << 8 | dict[pos++]; 15586 return value; 15587 } else if (value >= 32 && value <= 246) { 15588 return value - 139; 15589 } else if (value >= 247 && value <= 250) { 15590 return (value - 247) * 256 + dict[pos++] + 108; 15591 } else if (value >= 251 && value <= 254) { 15592 return -((value - 251) * 256) - dict[pos++] - 108; 15593 } 15594 warn('CFFParser_parseDict: "' + value + '" is a reserved command.'); 15595 return NaN; 15596 } 15597 function parseFloatOperand() { 15598 let str = ""; 15599 const eof = 15; 15600 const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"]; 15601 const length = dict.length; 15602 while (pos < length) { 15603 const b = dict[pos++]; 15604 const b1 = b >> 4; 15605 const b2 = b & 15; 15606 if (b1 === eof) { 15607 break; 15608 } 15609 str += lookup[b1]; 15610 if (b2 === eof) { 15611 break; 15612 } 15613 str += lookup[b2]; 15614 } 15615 return parseFloat(str); 15616 } 15617 let operands = []; 15618 const entries = []; 15619 pos = 0; 15620 const end = dict.length; 15621 while (pos < end) { 15622 let b = dict[pos]; 15623 if (b <= 21) { 15624 if (b === 12) { 15625 b = b << 8 | dict[++pos]; 15626 } 15627 entries.push([b, operands]); 15628 operands = []; 15629 ++pos; 15630 } else { 15631 operands.push(parseOperand()); 15632 } 15633 } 15634 return entries; 15635 } 15636 parseIndex(pos) { 15637 const cffIndex = new CFFIndex(); 15638 const bytes = this.bytes; 15639 const count = bytes[pos++] << 8 | bytes[pos++]; 15640 const offsets = []; 15641 let end = pos; 15642 let i, ii; 15643 if (count !== 0) { 15644 const offsetSize = bytes[pos++]; 15645 const startPos = pos + (count + 1) * offsetSize - 1; 15646 for (i = 0, ii = count + 1; i < ii; ++i) { 15647 let offset = 0; 15648 for (let j = 0; j < offsetSize; ++j) { 15649 offset <<= 8; 15650 offset += bytes[pos++]; 15651 } 15652 offsets.push(startPos + offset); 15653 } 15654 end = offsets[count]; 15655 } 15656 for (i = 0, ii = offsets.length - 1; i < ii; ++i) { 15657 const offsetStart = offsets[i]; 15658 const offsetEnd = offsets[i + 1]; 15659 cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); 15660 } 15661 return { 15662 obj: cffIndex, 15663 endPos: end 15664 }; 15665 } 15666 parseNameIndex(index) { 15667 const names = []; 15668 for (let i = 0, ii = index.count; i < ii; ++i) { 15669 const name = index.get(i); 15670 names.push(bytesToString(name)); 15671 } 15672 return names; 15673 } 15674 parseStringIndex(index) { 15675 const strings = new CFFStrings(); 15676 for (let i = 0, ii = index.count; i < ii; ++i) { 15677 const data = index.get(i); 15678 strings.add(bytesToString(data)); 15679 } 15680 return strings; 15681 } 15682 createDict(Type, dict, strings) { 15683 const cffDict = new Type(strings); 15684 for (const [key, value] of dict) { 15685 cffDict.setByKey(key, value); 15686 } 15687 return cffDict; 15688 } 15689 parseCharString(state, data, localSubrIndex, globalSubrIndex) { 15690 if (!data || state.callDepth > MAX_SUBR_NESTING) { 15691 return false; 15692 } 15693 let stackSize = state.stackSize; 15694 const stack = state.stack; 15695 let length = data.length; 15696 for (let j = 0; j < length;) { 15697 const value = data[j++]; 15698 let validationCommand = null; 15699 if (value === 12) { 15700 const q = data[j++]; 15701 if (q === 0) { 15702 data[j - 2] = 139; 15703 data[j - 1] = 22; 15704 stackSize = 0; 15705 } else { 15706 validationCommand = CharstringValidationData12[q]; 15707 } 15708 } else if (value === 28) { 15709 stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16; 15710 j += 2; 15711 stackSize++; 15712 } else if (value === 14) { 15713 if (stackSize >= 4) { 15714 stackSize -= 4; 15715 if (this.seacAnalysisEnabled) { 15716 state.seac = stack.slice(stackSize, stackSize + 4); 15717 return false; 15718 } 15719 } 15720 validationCommand = CharstringValidationData[value]; 15721 } else if (value >= 32 && value <= 246) { 15722 stack[stackSize] = value - 139; 15723 stackSize++; 15724 } else if (value >= 247 && value <= 254) { 15725 stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; 15726 j++; 15727 stackSize++; 15728 } else if (value === 255) { 15729 stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536; 15730 j += 4; 15731 stackSize++; 15732 } else if (value === 19 || value === 20) { 15733 state.hints += stackSize >> 1; 15734 if (state.hints === 0) { 15735 data.copyWithin(j - 1, j, -1); 15736 j -= 1; 15737 length -= 1; 15738 continue; 15739 } 15740 j += state.hints + 7 >> 3; 15741 stackSize %= 2; 15742 validationCommand = CharstringValidationData[value]; 15743 } else if (value === 10 || value === 29) { 15744 const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex; 15745 if (!subrsIndex) { 15746 validationCommand = CharstringValidationData[value]; 15747 warn("Missing subrsIndex for " + validationCommand.id); 15748 return false; 15749 } 15750 let bias = 32768; 15751 if (subrsIndex.count < 1240) { 15752 bias = 107; 15753 } else if (subrsIndex.count < 33900) { 15754 bias = 1131; 15755 } 15756 const subrNumber = stack[--stackSize] + bias; 15757 if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) { 15758 validationCommand = CharstringValidationData[value]; 15759 warn("Out of bounds subrIndex for " + validationCommand.id); 15760 return false; 15761 } 15762 state.stackSize = stackSize; 15763 state.callDepth++; 15764 const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); 15765 if (!valid) { 15766 return false; 15767 } 15768 state.callDepth--; 15769 stackSize = state.stackSize; 15770 continue; 15771 } else if (value === 11) { 15772 state.stackSize = stackSize; 15773 return true; 15774 } else if (value === 0 && j === data.length) { 15775 data[j - 1] = 14; 15776 validationCommand = CharstringValidationData[14]; 15777 } else if (value === 9) { 15778 data.copyWithin(j - 1, j, -1); 15779 j -= 1; 15780 length -= 1; 15781 continue; 15782 } else { 15783 validationCommand = CharstringValidationData[value]; 15784 } 15785 if (validationCommand) { 15786 if (validationCommand.stem) { 15787 state.hints += stackSize >> 1; 15788 if (value === 3 || value === 23) { 15789 state.hasVStems = true; 15790 } else if (state.hasVStems && (value === 1 || value === 18)) { 15791 warn("CFF stem hints are in wrong order"); 15792 data[j - 1] = value === 1 ? 3 : 23; 15793 } 15794 } 15795 if ("min" in validationCommand) { 15796 if (!state.undefStack && stackSize < validationCommand.min) { 15797 warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min); 15798 if (stackSize === 0) { 15799 data[j - 1] = 14; 15800 return true; 15801 } 15802 return false; 15803 } 15804 } 15805 if (state.firstStackClearing && validationCommand.stackClearing) { 15806 state.firstStackClearing = false; 15807 stackSize -= validationCommand.min; 15808 if (stackSize >= 2 && validationCommand.stem) { 15809 stackSize %= 2; 15810 } else if (stackSize > 1) { 15811 warn("Found too many parameters for stack-clearing command"); 15812 } 15813 if (stackSize > 0) { 15814 state.width = stack[stackSize - 1]; 15815 } 15816 } 15817 if ("stackDelta" in validationCommand) { 15818 if ("stackFn" in validationCommand) { 15819 validationCommand.stackFn(stack, stackSize); 15820 } 15821 stackSize += validationCommand.stackDelta; 15822 } else if (validationCommand.stackClearing) { 15823 stackSize = 0; 15824 } else if (validationCommand.resetStack) { 15825 stackSize = 0; 15826 state.undefStack = false; 15827 } else if (validationCommand.undefStack) { 15828 stackSize = 0; 15829 state.undefStack = true; 15830 state.firstStackClearing = false; 15831 } 15832 } 15833 } 15834 if (length < data.length) { 15835 data.fill(14, length); 15836 } 15837 state.stackSize = stackSize; 15838 return true; 15839 } 15840 parseCharStrings({ 15841 charStrings, 15842 localSubrIndex, 15843 globalSubrIndex, 15844 fdSelect, 15845 fdArray, 15846 privateDict 15847 }) { 15848 const seacs = []; 15849 const widths = []; 15850 const count = charStrings.count; 15851 for (let i = 0; i < count; i++) { 15852 const charstring = charStrings.get(i); 15853 const state = { 15854 callDepth: 0, 15855 stackSize: 0, 15856 stack: [], 15857 undefStack: true, 15858 hints: 0, 15859 firstStackClearing: true, 15860 seac: null, 15861 width: null, 15862 hasVStems: false 15863 }; 15864 let valid = true; 15865 let localSubrToUse = null; 15866 let privateDictToUse = privateDict; 15867 if (fdSelect && fdArray.length) { 15868 const fdIndex = fdSelect.getFDIndex(i); 15869 if (fdIndex === -1) { 15870 warn("Glyph index is not in fd select."); 15871 valid = false; 15872 } 15873 if (fdIndex >= fdArray.length) { 15874 warn("Invalid fd index for glyph index."); 15875 valid = false; 15876 } 15877 if (valid) { 15878 privateDictToUse = fdArray[fdIndex].privateDict; 15879 localSubrToUse = privateDictToUse.subrsIndex; 15880 } 15881 } else if (localSubrIndex) { 15882 localSubrToUse = localSubrIndex; 15883 } 15884 if (valid) { 15885 valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); 15886 } 15887 if (state.width !== null) { 15888 const nominalWidth = privateDictToUse.getByName("nominalWidthX"); 15889 widths[i] = nominalWidth + state.width; 15890 } else { 15891 const defaultWidth = privateDictToUse.getByName("defaultWidthX"); 15892 widths[i] = defaultWidth; 15893 } 15894 if (state.seac !== null) { 15895 seacs[i] = state.seac; 15896 } 15897 if (!valid) { 15898 charStrings.set(i, new Uint8Array([14])); 15899 } 15900 } 15901 return { 15902 charStrings, 15903 seacs, 15904 widths 15905 }; 15906 } 15907 emptyPrivateDictionary(parentDict) { 15908 const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); 15909 parentDict.setByKey(18, [0, 0]); 15910 parentDict.privateDict = privateDict; 15911 } 15912 parsePrivateDict(parentDict) { 15913 if (!parentDict.hasName("Private")) { 15914 this.emptyPrivateDictionary(parentDict); 15915 return; 15916 } 15917 const privateOffset = parentDict.getByName("Private"); 15918 if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { 15919 parentDict.removeByName("Private"); 15920 return; 15921 } 15922 const size = privateOffset[0]; 15923 const offset = privateOffset[1]; 15924 if (size === 0 || offset >= this.bytes.length) { 15925 this.emptyPrivateDictionary(parentDict); 15926 return; 15927 } 15928 const privateDictEnd = offset + size; 15929 const dictData = this.bytes.subarray(offset, privateDictEnd); 15930 const dict = this.parseDict(dictData); 15931 const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); 15932 parentDict.privateDict = privateDict; 15933 if (privateDict.getByName("ExpansionFactor") === 0) { 15934 privateDict.setByName("ExpansionFactor", 0.06); 15935 } 15936 if (!privateDict.getByName("Subrs")) { 15937 return; 15938 } 15939 const subrsOffset = privateDict.getByName("Subrs"); 15940 const relativeOffset = offset + subrsOffset; 15941 if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { 15942 this.emptyPrivateDictionary(parentDict); 15943 return; 15944 } 15945 const subrsIndex = this.parseIndex(relativeOffset); 15946 privateDict.subrsIndex = subrsIndex.obj; 15947 } 15948 parseCharsets(pos, length, strings, cid) { 15949 if (pos === 0) { 15950 return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); 15951 } else if (pos === 1) { 15952 return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); 15953 } else if (pos === 2) { 15954 return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); 15955 } 15956 const bytes = this.bytes; 15957 const start = pos; 15958 const format = bytes[pos++]; 15959 const charset = [cid ? 0 : ".notdef"]; 15960 let id, count, i; 15961 length -= 1; 15962 switch (format) { 15963 case 0: 15964 for (i = 0; i < length; i++) { 15965 id = bytes[pos++] << 8 | bytes[pos++]; 15966 charset.push(cid ? id : strings.get(id)); 15967 } 15968 break; 15969 case 1: 15970 while (charset.length <= length) { 15971 id = bytes[pos++] << 8 | bytes[pos++]; 15972 count = bytes[pos++]; 15973 for (i = 0; i <= count; i++) { 15974 charset.push(cid ? id++ : strings.get(id++)); 15975 } 15976 } 15977 break; 15978 case 2: 15979 while (charset.length <= length) { 15980 id = bytes[pos++] << 8 | bytes[pos++]; 15981 count = bytes[pos++] << 8 | bytes[pos++]; 15982 for (i = 0; i <= count; i++) { 15983 charset.push(cid ? id++ : strings.get(id++)); 15984 } 15985 } 15986 break; 15987 default: 15988 throw new FormatError("Unknown charset format"); 15989 } 15990 const end = pos; 15991 const raw = bytes.subarray(start, end); 15992 return new CFFCharset(false, format, charset, raw); 15993 } 15994 parseEncoding(pos, properties, strings, charset) { 15995 const encoding = Object.create(null); 15996 const bytes = this.bytes; 15997 let predefined = false; 15998 let format, i, ii; 15999 let raw = null; 16000 function readSupplement() { 16001 const supplementsCount = bytes[pos++]; 16002 for (i = 0; i < supplementsCount; i++) { 16003 const code = bytes[pos++]; 16004 const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); 16005 encoding[code] = charset.indexOf(strings.get(sid)); 16006 } 16007 } 16008 if (pos === 0 || pos === 1) { 16009 predefined = true; 16010 format = pos; 16011 const baseEncoding = pos ? ExpertEncoding : StandardEncoding; 16012 for (i = 0, ii = charset.length; i < ii; i++) { 16013 const index = baseEncoding.indexOf(charset[i]); 16014 if (index !== -1) { 16015 encoding[index] = i; 16016 } 16017 } 16018 } else { 16019 const dataStart = pos; 16020 format = bytes[pos++]; 16021 switch (format & 0x7f) { 16022 case 0: 16023 const glyphsCount = bytes[pos++]; 16024 for (i = 1; i <= glyphsCount; i++) { 16025 encoding[bytes[pos++]] = i; 16026 } 16027 break; 16028 case 1: 16029 const rangesCount = bytes[pos++]; 16030 let gid = 1; 16031 for (i = 0; i < rangesCount; i++) { 16032 const start = bytes[pos++]; 16033 const left = bytes[pos++]; 16034 for (let j = start; j <= start + left; j++) { 16035 encoding[j] = gid++; 16036 } 16037 } 16038 break; 16039 default: 16040 throw new FormatError(`Unknown encoding format: ${format} in CFF`); 16041 } 16042 const dataEnd = pos; 16043 if (format & 0x80) { 16044 bytes[dataStart] &= 0x7f; 16045 readSupplement(); 16046 } 16047 raw = bytes.subarray(dataStart, dataEnd); 16048 } 16049 format &= 0x7f; 16050 return new CFFEncoding(predefined, format, encoding, raw); 16051 } 16052 parseFDSelect(pos, length) { 16053 const bytes = this.bytes; 16054 const format = bytes[pos++]; 16055 const fdSelect = []; 16056 let i; 16057 switch (format) { 16058 case 0: 16059 for (i = 0; i < length; ++i) { 16060 const id = bytes[pos++]; 16061 fdSelect.push(id); 16062 } 16063 break; 16064 case 3: 16065 const rangesCount = bytes[pos++] << 8 | bytes[pos++]; 16066 for (i = 0; i < rangesCount; ++i) { 16067 let first = bytes[pos++] << 8 | bytes[pos++]; 16068 if (i === 0 && first !== 0) { 16069 warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover."); 16070 first = 0; 16071 } 16072 const fdIndex = bytes[pos++]; 16073 const next = bytes[pos] << 8 | bytes[pos + 1]; 16074 for (let j = first; j < next; ++j) { 16075 fdSelect.push(fdIndex); 16076 } 16077 } 16078 pos += 2; 16079 break; 16080 default: 16081 throw new FormatError(`parseFDSelect: Unknown format "${format}".`); 16082 } 16083 if (fdSelect.length !== length) { 16084 throw new FormatError("parseFDSelect: Invalid font data."); 16085 } 16086 return new CFFFDSelect(format, fdSelect); 16087 } 16088} 16089class CFF { 16090 constructor() { 16091 this.header = null; 16092 this.names = []; 16093 this.topDict = null; 16094 this.strings = new CFFStrings(); 16095 this.globalSubrIndex = null; 16096 this.encoding = null; 16097 this.charset = null; 16098 this.charStrings = null; 16099 this.fdArray = []; 16100 this.fdSelect = null; 16101 this.isCIDFont = false; 16102 } 16103 duplicateFirstGlyph() { 16104 if (this.charStrings.count >= 65535) { 16105 warn("Not enough space in charstrings to duplicate first glyph."); 16106 return; 16107 } 16108 const glyphZero = this.charStrings.get(0); 16109 this.charStrings.add(glyphZero); 16110 if (this.isCIDFont) { 16111 this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); 16112 } 16113 } 16114 hasGlyphId(id) { 16115 if (id < 0 || id >= this.charStrings.count) { 16116 return false; 16117 } 16118 const glyph = this.charStrings.get(id); 16119 return glyph.length > 0; 16120 } 16121} 16122class CFFHeader { 16123 constructor(major, minor, hdrSize, offSize) { 16124 this.major = major; 16125 this.minor = minor; 16126 this.hdrSize = hdrSize; 16127 this.offSize = offSize; 16128 } 16129} 16130class CFFStrings { 16131 constructor() { 16132 this.strings = []; 16133 } 16134 get(index) { 16135 if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { 16136 return CFFStandardStrings[index]; 16137 } 16138 if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { 16139 return this.strings[index - NUM_STANDARD_CFF_STRINGS]; 16140 } 16141 return CFFStandardStrings[0]; 16142 } 16143 getSID(str) { 16144 let index = CFFStandardStrings.indexOf(str); 16145 if (index !== -1) { 16146 return index; 16147 } 16148 index = this.strings.indexOf(str); 16149 if (index !== -1) { 16150 return index + NUM_STANDARD_CFF_STRINGS; 16151 } 16152 return -1; 16153 } 16154 add(value) { 16155 this.strings.push(value); 16156 } 16157 get count() { 16158 return this.strings.length; 16159 } 16160} 16161class CFFIndex { 16162 constructor() { 16163 this.objects = []; 16164 this.length = 0; 16165 } 16166 add(data) { 16167 this.length += data.length; 16168 this.objects.push(data); 16169 } 16170 set(index, data) { 16171 this.length += data.length - this.objects[index].length; 16172 this.objects[index] = data; 16173 } 16174 get(index) { 16175 return this.objects[index]; 16176 } 16177 get count() { 16178 return this.objects.length; 16179 } 16180} 16181class CFFDict { 16182 constructor(tables, strings) { 16183 this.keyToNameMap = tables.keyToNameMap; 16184 this.nameToKeyMap = tables.nameToKeyMap; 16185 this.defaults = tables.defaults; 16186 this.types = tables.types; 16187 this.opcodes = tables.opcodes; 16188 this.order = tables.order; 16189 this.strings = strings; 16190 this.values = Object.create(null); 16191 } 16192 setByKey(key, value) { 16193 if (!(key in this.keyToNameMap)) { 16194 return false; 16195 } 16196 if (value.length === 0) { 16197 return true; 16198 } 16199 for (const val of value) { 16200 if (isNaN(val)) { 16201 warn(`Invalid CFFDict value: "${value}" for key "${key}".`); 16202 return true; 16203 } 16204 } 16205 const type = this.types[key]; 16206 if (type === "num" || type === "sid" || type === "offset") { 16207 value = value[0]; 16208 } 16209 this.values[key] = value; 16210 return true; 16211 } 16212 setByName(name, value) { 16213 if (!(name in this.nameToKeyMap)) { 16214 throw new FormatError(`Invalid dictionary name "${name}"`); 16215 } 16216 this.values[this.nameToKeyMap[name]] = value; 16217 } 16218 hasName(name) { 16219 return this.nameToKeyMap[name] in this.values; 16220 } 16221 getByName(name) { 16222 if (!(name in this.nameToKeyMap)) { 16223 throw new FormatError(`Invalid dictionary name ${name}"`); 16224 } 16225 const key = this.nameToKeyMap[name]; 16226 if (!(key in this.values)) { 16227 return this.defaults[key]; 16228 } 16229 return this.values[key]; 16230 } 16231 removeByName(name) { 16232 delete this.values[this.nameToKeyMap[name]]; 16233 } 16234 static createTables(layout) { 16235 const tables = { 16236 keyToNameMap: {}, 16237 nameToKeyMap: {}, 16238 defaults: {}, 16239 types: {}, 16240 opcodes: {}, 16241 order: [] 16242 }; 16243 for (const entry of layout) { 16244 const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; 16245 tables.keyToNameMap[key] = entry[1]; 16246 tables.nameToKeyMap[entry[1]] = key; 16247 tables.types[key] = entry[2]; 16248 tables.defaults[key] = entry[3]; 16249 tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]]; 16250 tables.order.push(key); 16251 } 16252 return tables; 16253 } 16254} 16255const 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]]; 16256class CFFTopDict extends CFFDict { 16257 static get tables() { 16258 return shadow(this, "tables", this.createTables(CFFTopDictLayout)); 16259 } 16260 constructor(strings) { 16261 super(CFFTopDict.tables, strings); 16262 this.privateDict = null; 16263 } 16264} 16265const 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]]; 16266class CFFPrivateDict extends CFFDict { 16267 static get tables() { 16268 return shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); 16269 } 16270 constructor(strings) { 16271 super(CFFPrivateDict.tables, strings); 16272 this.subrsIndex = null; 16273 } 16274} 16275const CFFCharsetPredefinedTypes = { 16276 ISO_ADOBE: 0, 16277 EXPERT: 1, 16278 EXPERT_SUBSET: 2 16279}; 16280class CFFCharset { 16281 constructor(predefined, format, charset, raw) { 16282 this.predefined = predefined; 16283 this.format = format; 16284 this.charset = charset; 16285 this.raw = raw; 16286 } 16287} 16288class CFFEncoding { 16289 constructor(predefined, format, encoding, raw) { 16290 this.predefined = predefined; 16291 this.format = format; 16292 this.encoding = encoding; 16293 this.raw = raw; 16294 } 16295} 16296class CFFFDSelect { 16297 constructor(format, fdSelect) { 16298 this.format = format; 16299 this.fdSelect = fdSelect; 16300 } 16301 getFDIndex(glyphIndex) { 16302 if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { 16303 return -1; 16304 } 16305 return this.fdSelect[glyphIndex]; 16306 } 16307} 16308class CFFOffsetTracker { 16309 constructor() { 16310 this.offsets = Object.create(null); 16311 } 16312 isTracking(key) { 16313 return key in this.offsets; 16314 } 16315 track(key, location) { 16316 if (key in this.offsets) { 16317 throw new FormatError(`Already tracking location of ${key}`); 16318 } 16319 this.offsets[key] = location; 16320 } 16321 offset(value) { 16322 for (const key in this.offsets) { 16323 this.offsets[key] += value; 16324 } 16325 } 16326 setEntryLocation(key, values, output) { 16327 if (!(key in this.offsets)) { 16328 throw new FormatError(`Not tracking location of ${key}`); 16329 } 16330 const data = output.data; 16331 const dataOffset = this.offsets[key]; 16332 const size = 5; 16333 for (let i = 0, ii = values.length; i < ii; ++i) { 16334 const offset0 = i * size + dataOffset; 16335 const offset1 = offset0 + 1; 16336 const offset2 = offset0 + 2; 16337 const offset3 = offset0 + 3; 16338 const offset4 = offset0 + 4; 16339 if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { 16340 throw new FormatError("writing to an offset that is not empty"); 16341 } 16342 const value = values[i]; 16343 data[offset0] = 0x1d; 16344 data[offset1] = value >> 24 & 0xff; 16345 data[offset2] = value >> 16 & 0xff; 16346 data[offset3] = value >> 8 & 0xff; 16347 data[offset4] = value & 0xff; 16348 } 16349 } 16350} 16351class CFFCompiler { 16352 constructor(cff) { 16353 this.cff = cff; 16354 } 16355 compile() { 16356 const cff = this.cff; 16357 const output = { 16358 data: [], 16359 length: 0, 16360 add(data) { 16361 try { 16362 this.data.push(...data); 16363 } catch { 16364 this.data = this.data.concat(data); 16365 } 16366 this.length = this.data.length; 16367 } 16368 }; 16369 const header = this.compileHeader(cff.header); 16370 output.add(header); 16371 const nameIndex = this.compileNameIndex(cff.names); 16372 output.add(nameIndex); 16373 if (cff.isCIDFont) { 16374 if (cff.topDict.hasName("FontMatrix")) { 16375 const base = cff.topDict.getByName("FontMatrix"); 16376 cff.topDict.removeByName("FontMatrix"); 16377 for (const subDict of cff.fdArray) { 16378 let matrix = base.slice(0); 16379 if (subDict.hasName("FontMatrix")) { 16380 matrix = Util.transform(matrix, subDict.getByName("FontMatrix")); 16381 } 16382 subDict.setByName("FontMatrix", matrix); 16383 } 16384 } 16385 } 16386 const xuid = cff.topDict.getByName("XUID"); 16387 if (xuid?.length > 16) { 16388 cff.topDict.removeByName("XUID"); 16389 } 16390 cff.topDict.setByName("charset", 0); 16391 let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); 16392 output.add(compiled.output); 16393 const topDictTracker = compiled.trackers[0]; 16394 const stringIndex = this.compileStringIndex(cff.strings.strings); 16395 output.add(stringIndex); 16396 const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); 16397 output.add(globalSubrIndex); 16398 if (cff.encoding && cff.topDict.hasName("Encoding")) { 16399 if (cff.encoding.predefined) { 16400 topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output); 16401 } else { 16402 const encoding = this.compileEncoding(cff.encoding); 16403 topDictTracker.setEntryLocation("Encoding", [output.length], output); 16404 output.add(encoding); 16405 } 16406 } 16407 const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); 16408 topDictTracker.setEntryLocation("charset", [output.length], output); 16409 output.add(charset); 16410 const charStrings = this.compileCharStrings(cff.charStrings); 16411 topDictTracker.setEntryLocation("CharStrings", [output.length], output); 16412 output.add(charStrings); 16413 if (cff.isCIDFont) { 16414 topDictTracker.setEntryLocation("FDSelect", [output.length], output); 16415 const fdSelect = this.compileFDSelect(cff.fdSelect); 16416 output.add(fdSelect); 16417 compiled = this.compileTopDicts(cff.fdArray, output.length, true); 16418 topDictTracker.setEntryLocation("FDArray", [output.length], output); 16419 output.add(compiled.output); 16420 const fontDictTrackers = compiled.trackers; 16421 this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); 16422 } 16423 this.compilePrivateDicts([cff.topDict], [topDictTracker], output); 16424 output.add([0]); 16425 return output.data; 16426 } 16427 encodeNumber(value) { 16428 if (Number.isInteger(value)) { 16429 return this.encodeInteger(value); 16430 } 16431 return this.encodeFloat(value); 16432 } 16433 static get EncodeFloatRegExp() { 16434 return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); 16435 } 16436 encodeFloat(num) { 16437 let value = num.toString(); 16438 const m = CFFCompiler.EncodeFloatRegExp.exec(value); 16439 if (m) { 16440 const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); 16441 value = (Math.round(num * epsilon) / epsilon).toString(); 16442 } 16443 let nibbles = ""; 16444 let i, ii; 16445 for (i = 0, ii = value.length; i < ii; ++i) { 16446 const a = value[i]; 16447 if (a === "e") { 16448 nibbles += value[++i] === "-" ? "c" : "b"; 16449 } else if (a === ".") { 16450 nibbles += "a"; 16451 } else if (a === "-") { 16452 nibbles += "e"; 16453 } else { 16454 nibbles += a; 16455 } 16456 } 16457 nibbles += nibbles.length & 1 ? "f" : "ff"; 16458 const out = [30]; 16459 for (i = 0, ii = nibbles.length; i < ii; i += 2) { 16460 out.push(parseInt(nibbles.substring(i, i + 2), 16)); 16461 } 16462 return out; 16463 } 16464 encodeInteger(value) { 16465 let code; 16466 if (value >= -107 && value <= 107) { 16467 code = [value + 139]; 16468 } else if (value >= 108 && value <= 1131) { 16469 value -= 108;
vendor: 4,838 bytes, lines 16470-16621
16470 code = [(value >> 8) + 247, value & 0xff]; 16471 } else if (value >= -1131 && value <= -108) { 16472 value = -value - 108; 16473 code = [(value >> 8) + 251, value & 0xff]; 16474 } else if (value >= -32768 && value <= 32767) { 16475 code = [0x1c, value >> 8 & 0xff, value & 0xff]; 16476 } else { 16477 code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]; 16478 } 16479 return code; 16480 } 16481 compileHeader(header) { 16482 return [header.major, header.minor, 4, header.offSize]; 16483 } 16484 compileNameIndex(names) { 16485 const nameIndex = new CFFIndex(); 16486 for (const name of names) { 16487 const length = Math.min(name.length, 127); 16488 let sanitizedName = new Array(length); 16489 for (let j = 0; j < length; j++) { 16490 let char = name[j]; 16491 if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") { 16492 char = "_"; 16493 } 16494 sanitizedName[j] = char; 16495 } 16496 sanitizedName = sanitizedName.join(""); 16497 if (sanitizedName === "") { 16498 sanitizedName = "Bad_Font_Name"; 16499 } 16500 nameIndex.add(stringToBytes(sanitizedName)); 16501 } 16502 return this.compileIndex(nameIndex); 16503 } 16504 compileTopDicts(dicts, length, removeCidKeys) { 16505 const fontDictTrackers = []; 16506 let fdArrayIndex = new CFFIndex(); 16507 for (const fontDict of dicts) { 16508 if (removeCidKeys) { 16509 fontDict.removeByName("CIDFontVersion"); 16510 fontDict.removeByName("CIDFontRevision"); 16511 fontDict.removeByName("CIDFontType"); 16512 fontDict.removeByName("CIDCount"); 16513 fontDict.removeByName("UIDBase"); 16514 } 16515 const fontDictTracker = new CFFOffsetTracker(); 16516 const fontDictData = this.compileDict(fontDict, fontDictTracker); 16517 fontDictTrackers.push(fontDictTracker); 16518 fdArrayIndex.add(fontDictData); 16519 fontDictTracker.offset(length); 16520 } 16521 fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); 16522 return { 16523 trackers: fontDictTrackers, 16524 output: fdArrayIndex 16525 }; 16526 } 16527 compilePrivateDicts(dicts, trackers, output) { 16528 for (let i = 0, ii = dicts.length; i < ii; ++i) { 16529 const fontDict = dicts[i]; 16530 const privateDict = fontDict.privateDict; 16531 if (!privateDict || !fontDict.hasName("Private")) { 16532 throw new FormatError("There must be a private dictionary."); 16533 } 16534 const privateDictTracker = new CFFOffsetTracker(); 16535 const privateDictData = this.compileDict(privateDict, privateDictTracker); 16536 let outputLength = output.length; 16537 privateDictTracker.offset(outputLength); 16538 if (!privateDictData.length) { 16539 outputLength = 0; 16540 } 16541 trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output); 16542 output.add(privateDictData); 16543 if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { 16544 const subrs = this.compileIndex(privateDict.subrsIndex); 16545 privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); 16546 output.add(subrs); 16547 } 16548 } 16549 } 16550 compileDict(dict, offsetTracker) { 16551 const out = []; 16552 for (const key of dict.order) { 16553 if (!(key in dict.values)) { 16554 continue; 16555 } 16556 let values = dict.values[key]; 16557 let types = dict.types[key]; 16558 if (!Array.isArray(types)) { 16559 types = [types]; 16560 } 16561 if (!Array.isArray(values)) { 16562 values = [values]; 16563 } 16564 if (values.length === 0) { 16565 continue; 16566 } 16567 for (let j = 0, jj = types.length; j < jj; ++j) { 16568 const type = types[j]; 16569 const value = values[j]; 16570 switch (type) { 16571 case "num": 16572 case "sid": 16573 out.push(...this.encodeNumber(value)); 16574 break; 16575 case "offset": 16576 const name = dict.keyToNameMap[key]; 16577 if (!offsetTracker.isTracking(name)) { 16578 offsetTracker.track(name, out.length); 16579 } 16580 out.push(0x1d, 0, 0, 0, 0); 16581 break; 16582 case "array": 16583 case "delta": 16584 out.push(...this.encodeNumber(value)); 16585 for (let k = 1, kk = values.length; k < kk; ++k) { 16586 out.push(...this.encodeNumber(values[k])); 16587 } 16588 break; 16589 default: 16590 throw new FormatError(`Unknown data type of ${type}`); 16591 } 16592 } 16593 out.push(...dict.opcodes[key]); 16594 } 16595 return out; 16596 } 16597 compileStringIndex(strings) { 16598 const stringIndex = new CFFIndex(); 16599 for (const string of strings) { 16600 stringIndex.add(stringToBytes(string)); 16601 } 16602 return this.compileIndex(stringIndex); 16603 } 16604 compileCharStrings(charStrings) { 16605 const charStringsIndex = new CFFIndex(); 16606 for (let i = 0; i < charStrings.count; i++) { 16607 const glyph = charStrings.get(i); 16608 if (glyph.length === 0) { 16609 charStringsIndex.add(new Uint8Array([0x8b, 0x0e])); 16610 continue; 16611 } 16612 charStringsIndex.add(glyph); 16613 } 16614 return this.compileIndex(charStringsIndex); 16615 } 16616 compileCharset(charset, numGlyphs, strings, isCIDFont) { 16617 let out; 16618 const numGlyphsLessNotDef = numGlyphs - 1; 16619 if (isCIDFont) { 16620 out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]); 16621 } else {
vendor: 4,947 bytes, lines 16622-16815
16622 const length = 1 + numGlyphsLessNotDef * 2; 16623 out = new Uint8Array(length); 16624 out[0] = 0; 16625 let charsetIndex = 0; 16626 const numCharsets = charset.charset.length; 16627 let warned = false; 16628 for (let i = 1; i < out.length; i += 2) { 16629 let sid = 0; 16630 if (charsetIndex < numCharsets) { 16631 const name = charset.charset[charsetIndex++]; 16632 sid = strings.getSID(name); 16633 if (sid === -1) { 16634 sid = 0; 16635 if (!warned) { 16636 warned = true; 16637 warn(`Couldn't find ${name} in CFF strings`); 16638 } 16639 } 16640 } 16641 out[i] = sid >> 8 & 0xff; 16642 out[i + 1] = sid & 0xff; 16643 } 16644 } 16645 return this.compileTypedArray(out); 16646 } 16647 compileEncoding(encoding) { 16648 return this.compileTypedArray(encoding.raw); 16649 } 16650 compileFDSelect(fdSelect) { 16651 const format = fdSelect.format; 16652 let out, i; 16653 switch (format) { 16654 case 0: 16655 out = new Uint8Array(1 + fdSelect.fdSelect.length); 16656 out[0] = format; 16657 for (i = 0; i < fdSelect.fdSelect.length; i++) { 16658 out[i + 1] = fdSelect.fdSelect[i]; 16659 } 16660 break; 16661 case 3: 16662 const start = 0; 16663 let lastFD = fdSelect.fdSelect[0]; 16664 const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; 16665 for (i = 1; i < fdSelect.fdSelect.length; i++) { 16666 const currentFD = fdSelect.fdSelect[i]; 16667 if (currentFD !== lastFD) { 16668 ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); 16669 lastFD = currentFD; 16670 } 16671 } 16672 const numRanges = (ranges.length - 3) / 3; 16673 ranges[1] = numRanges >> 8 & 0xff; 16674 ranges[2] = numRanges & 0xff; 16675 ranges.push(i >> 8 & 0xff, i & 0xff); 16676 out = new Uint8Array(ranges); 16677 break; 16678 } 16679 return this.compileTypedArray(out); 16680 } 16681 compileTypedArray(data) { 16682 return Array.from(data); 16683 } 16684 compileIndex(index, trackers = []) { 16685 const objects = index.objects; 16686 const count = objects.length; 16687 if (count === 0) { 16688 return [0, 0]; 16689 } 16690 const data = [count >> 8 & 0xff, count & 0xff]; 16691 let lastOffset = 1, 16692 i; 16693 for (i = 0; i < count; ++i) { 16694 lastOffset += objects[i].length; 16695 } 16696 let offsetSize; 16697 if (lastOffset < 0x100) { 16698 offsetSize = 1; 16699 } else if (lastOffset < 0x10000) { 16700 offsetSize = 2; 16701 } else if (lastOffset < 0x1000000) { 16702 offsetSize = 3; 16703 } else { 16704 offsetSize = 4; 16705 } 16706 data.push(offsetSize); 16707 let relativeOffset = 1; 16708 for (i = 0; i < count + 1; i++) { 16709 if (offsetSize === 1) { 16710 data.push(relativeOffset & 0xff); 16711 } else if (offsetSize === 2) { 16712 data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff); 16713 } else if (offsetSize === 3) { 16714 data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); 16715 } else { 16716 data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); 16717 } 16718 if (objects[i]) { 16719 relativeOffset += objects[i].length; 16720 } 16721 } 16722 for (i = 0; i < count; i++) { 16723 if (trackers[i]) { 16724 trackers[i].offset(data.length); 16725 } 16726 data.push(...objects[i]); 16727 } 16728 return data; 16729 } 16730} 16731 16732;// ./src/core/glyphlist.js 16733 16734const getGlyphsUnicode = getLookupTableFactory(function (t) { 16735 t.A = 0x0041; 16736 t.AE = 0x00c6; 16737 t.AEacute = 0x01fc; 16738 t.AEmacron = 0x01e2; 16739 t.AEsmall = 0xf7e6; 16740 t.Aacute = 0x00c1; 16741 t.Aacutesmall = 0xf7e1; 16742 t.Abreve = 0x0102; 16743 t.Abreveacute = 0x1eae; 16744 t.Abrevecyrillic = 0x04d0; 16745 t.Abrevedotbelow = 0x1eb6; 16746 t.Abrevegrave = 0x1eb0; 16747 t.Abrevehookabove = 0x1eb2; 16748 t.Abrevetilde = 0x1eb4; 16749 t.Acaron = 0x01cd; 16750 t.Acircle = 0x24b6; 16751 t.Acircumflex = 0x00c2; 16752 t.Acircumflexacute = 0x1ea4; 16753 t.Acircumflexdotbelow = 0x1eac; 16754 t.Acircumflexgrave = 0x1ea6; 16755 t.Acircumflexhookabove = 0x1ea8; 16756 t.Acircumflexsmall = 0xf7e2; 16757 t.Acircumflextilde = 0x1eaa; 16758 t.Acute = 0xf6c9; 16759 t.Acutesmall = 0xf7b4; 16760 t.Acyrillic = 0x0410; 16761 t.Adblgrave = 0x0200; 16762 t.Adieresis = 0x00c4; 16763 t.Adieresiscyrillic = 0x04d2; 16764 t.Adieresismacron = 0x01de; 16765 t.Adieresissmall = 0xf7e4; 16766 t.Adotbelow = 0x1ea0; 16767 t.Adotmacron = 0x01e0; 16768 t.Agrave = 0x00c0; 16769 t.Agravesmall = 0xf7e0; 16770 t.Ahookabove = 0x1ea2; 16771 t.Aiecyrillic = 0x04d4; 16772 t.Ainvertedbreve = 0x0202; 16773 t.Alpha = 0x0391; 16774 t.Alphatonos = 0x0386; 16775 t.Amacron = 0x0100; 16776 t.Amonospace = 0xff21; 16777 t.Aogonek = 0x0104; 16778 t.Aring = 0x00c5; 16779 t.Aringacute = 0x01fa; 16780 t.Aringbelow = 0x1e00; 16781 t.Aringsmall = 0xf7e5; 16782 t.Asmall = 0xf761; 16783 t.Atilde = 0x00c3; 16784 t.Atildesmall = 0xf7e3; 16785 t.Aybarmenian = 0x0531; 16786 t.B = 0x0042; 16787 t.Bcircle = 0x24b7; 16788 t.Bdotaccent = 0x1e02; 16789 t.Bdotbelow = 0x1e04; 16790 t.Becyrillic = 0x0411; 16791 t.Benarmenian = 0x0532; 16792 t.Beta = 0x0392; 16793 t.Bhook = 0x0181; 16794 t.Blinebelow = 0x1e06; 16795 t.Bmonospace = 0xff22; 16796 t.Brevesmall = 0xf6f4; 16797 t.Bsmall = 0xf762; 16798 t.Btopbar = 0x0182; 16799 t.C = 0x0043; 16800 t.Caarmenian = 0x053e; 16801 t.Cacute = 0x0106; 16802 t.Caron = 0xf6ca; 16803 t.Caronsmall = 0xf6f5; 16804 t.Ccaron = 0x010c; 16805 t.Ccedilla = 0x00c7; 16806 t.Ccedillaacute = 0x1e08; 16807 t.Ccedillasmall = 0xf7e7; 16808 t.Ccircle = 0x24b8; 16809 t.Ccircumflex = 0x0108; 16810 t.Cdot = 0x010a; 16811 t.Cdotaccent = 0x010a; 16812 t.Cedillasmall = 0xf7b8; 16813 t.Chaarmenian = 0x0549; 16814 t.Cheabkhasiancyrillic = 0x04bc; 16815 t.Checyrillic = 0x0427;
16816 t.Chedescenderabkhasiancyrillic = 0x04be; 16817 t.Chedescendercyrillic = 0x04b6; 16818 t.Chedieresiscyrillic = 0x04f4; 16819 t.Cheharmenian = 0x0543; 16820 t.Chekhakassiancyrillic = 0x04cb; 16821 t.Cheverticalstrokecyrillic = 0x04b8; 16822 t.Chi = 0x03a7; 16823 t.Chook = 0x0187; 16824 t.Circumflexsmall = 0xf6f6; 16825 t.Cmonospace = 0xff23; 16826 t.Coarmenian = 0x0551; 16827 t.Csmall = 0xf763; 16828 t.D = 0x0044; 16829 t.DZ = 0x01f1; 16830 t.DZcaron = 0x01c4; 16831 t.Daarmenian = 0x0534; 16832 t.Dafrican = 0x0189; 16833 t.Dcaron = 0x010e; 16834 t.Dcedilla = 0x1e10; 16835 t.Dcircle = 0x24b9; 16836 t.Dcircumflexbelow = 0x1e12; 16837 t.Dcroat = 0x0110; 16838 t.Ddotaccent = 0x1e0a; 16839 t.Ddotbelow = 0x1e0c; 16840 t.Decyrillic = 0x0414; 16841 t.Deicoptic = 0x03ee; 16842 t.Delta = 0x2206; 16843 t.Deltagreek = 0x0394; 16844 t.Dhook = 0x018a; 16845 t.Dieresis = 0xf6cb; 16846 t.DieresisAcute = 0xf6cc; 16847 t.DieresisGrave = 0xf6cd; 16848 t.Dieresissmall = 0xf7a8; 16849 t.Digammagreek = 0x03dc; 16850 t.Djecyrillic = 0x0402; 16851 t.Dlinebelow = 0x1e0e; 16852 t.Dmonospace = 0xff24; 16853 t.Dotaccentsmall = 0xf6f7; 16854 t.Dslash = 0x0110; 16855 t.Dsmall = 0xf764; 16856 t.Dtopbar = 0x018b; 16857 t.Dz = 0x01f2; 16858 t.Dzcaron = 0x01c5; 16859 t.Dzeabkhasiancyrillic = 0x04e0; 16860 t.Dzecyrillic = 0x0405; 16861 t.Dzhecyrillic = 0x040f; 16862 t.E = 0x0045; 16863 t.Eacute = 0x00c9; 16864 t.Eacutesmall = 0xf7e9; 16865 t.Ebreve = 0x0114; 16866 t.Ecaron = 0x011a; 16867 t.Ecedillabreve = 0x1e1c; 16868 t.Echarmenian = 0x0535; 16869 t.Ecircle = 0x24ba; 16870 t.Ecircumflex = 0x00ca; 16871 t.Ecircumflexacute = 0x1ebe; 16872 t.Ecircumflexbelow = 0x1e18; 16873 t.Ecircumflexdotbelow = 0x1ec6; 16874 t.Ecircumflexgrave = 0x1ec0; 16875 t.Ecircumflexhookabove = 0x1ec2; 16876 t.Ecircumflexsmall = 0xf7ea; 16877 t.Ecircumflextilde = 0x1ec4; 16878 t.Ecyrillic = 0x0404; 16879 t.Edblgrave = 0x0204; 16880 t.Edieresis = 0x00cb; 16881 t.Edieresissmall = 0xf7eb; 16882 t.Edot = 0x0116; 16883 t.Edotaccent = 0x0116; 16884 t.Edotbelow = 0x1eb8; 16885 t.Efcyrillic = 0x0424; 16886 t.Egrave = 0x00c8; 16887 t.Egravesmall = 0xf7e8; 16888 t.Eharmenian = 0x0537; 16889 t.Ehookabove = 0x1eba; 16890 t.Eightroman = 0x2167; 16891 t.Einvertedbreve = 0x0206; 16892 t.Eiotifiedcyrillic = 0x0464; 16893 t.Elcyrillic = 0x041b; 16894 t.Elevenroman = 0x216a; 16895 t.Emacron = 0x0112; 16896 t.Emacronacute = 0x1e16; 16897 t.Emacrongrave = 0x1e14; 16898 t.Emcyrillic = 0x041c; 16899 t.Emonospace = 0xff25; 16900 t.Encyrillic = 0x041d; 16901 t.Endescendercyrillic = 0x04a2; 16902 t.Eng = 0x014a; 16903 t.Enghecyrillic = 0x04a4; 16904 t.Enhookcyrillic = 0x04c7; 16905 t.Eogonek = 0x0118; 16906 t.Eopen = 0x0190; 16907 t.Epsilon = 0x0395; 16908 t.Epsilontonos = 0x0388; 16909 t.Ercyrillic = 0x0420; 16910 t.Ereversed = 0x018e; 16911 t.Ereversedcyrillic = 0x042d; 16912 t.Escyrillic = 0x0421; 16913 t.Esdescendercyrillic = 0x04aa; 16914 t.Esh = 0x01a9; 16915 t.Esmall = 0xf765; 16916 t.Eta = 0x0397; 16917 t.Etarmenian = 0x0538; 16918 t.Etatonos = 0x0389; 16919 t.Eth = 0x00d0; 16920 t.Ethsmall = 0xf7f0; 16921 t.Etilde = 0x1ebc; 16922 t.Etildebelow = 0x1e1a; 16923 t.Euro = 0x20ac; 16924 t.Ezh = 0x01b7; 16925 t.Ezhcaron = 0x01ee; 16926 t.Ezhreversed = 0x01b8; 16927 t.F = 0x0046; 16928 t.Fcircle = 0x24bb; 16929 t.Fdotaccent = 0x1e1e; 16930 t.Feharmenian = 0x0556; 16931 t.Feicoptic = 0x03e4; 16932 t.Fhook = 0x0191; 16933 t.Fitacyrillic = 0x0472; 16934 t.Fiveroman = 0x2164; 16935 t.Fmonospace = 0xff26; 16936 t.Fourroman = 0x2163; 16937 t.Fsmall = 0xf766; 16938 t.G = 0x0047; 16939 t.GBsquare = 0x3387; 16940 t.Gacute = 0x01f4; 16941 t.Gamma = 0x0393; 16942 t.Gammaafrican = 0x0194; 16943 t.Gangiacoptic = 0x03ea; 16944 t.Gbreve = 0x011e; 16945 t.Gcaron = 0x01e6; 16946 t.Gcedilla = 0x0122; 16947 t.Gcircle = 0x24bc; 16948 t.Gcircumflex = 0x011c; 16949 t.Gcommaaccent = 0x0122; 16950 t.Gdot = 0x0120; 16951 t.Gdotaccent = 0x0120; 16952 t.Gecyrillic = 0x0413; 16953 t.Ghadarmenian = 0x0542; 16954 t.Ghemiddlehookcyrillic = 0x0494; 16955 t.Ghestrokecyrillic = 0x0492; 16956 t.Gheupturncyrillic = 0x0490; 16957 t.Ghook = 0x0193; 16958 t.Gimarmenian = 0x0533; 16959 t.Gjecyrillic = 0x0403; 16960 t.Gmacron = 0x1e20; 16961 t.Gmonospace = 0xff27; 16962 t.Grave = 0xf6ce; 16963 t.Gravesmall = 0xf760; 16964 t.Gsmall = 0xf767; 16965 t.Gsmallhook = 0x029b; 16966 t.Gstroke = 0x01e4; 16967 t.H = 0x0048; 16968 t.H18533 = 0x25cf; 16969 t.H18543 = 0x25aa; 16970 t.H18551 = 0x25ab; 16971 t.H22073 = 0x25a1; 16972 t.HPsquare = 0x33cb; 16973 t.Haabkhasiancyrillic = 0x04a8; 16974 t.Hadescendercyrillic = 0x04b2; 16975 t.Hardsigncyrillic = 0x042a; 16976 t.Hbar = 0x0126; 16977 t.Hbrevebelow = 0x1e2a; 16978 t.Hcedilla = 0x1e28; 16979 t.Hcircle = 0x24bd; 16980 t.Hcircumflex = 0x0124; 16981 t.Hdieresis = 0x1e26; 16982 t.Hdotaccent = 0x1e22; 16983 t.Hdotbelow = 0x1e24; 16984 t.Hmonospace = 0xff28; 16985 t.Hoarmenian = 0x0540; 16986 t.Horicoptic = 0x03e8; 16987 t.Hsmall = 0xf768; 16988 t.Hungarumlaut = 0xf6cf; 16989 t.Hungarumlautsmall = 0xf6f8;
16990 t.Hzsquare = 0x3390; 16991 t.I = 0x0049; 16992 t.IAcyrillic = 0x042f; 16993 t.IJ = 0x0132; 16994 t.IUcyrillic = 0x042e; 16995 t.Iacute = 0x00cd; 16996 t.Iacutesmall = 0xf7ed; 16997 t.Ibreve = 0x012c; 16998 t.Icaron = 0x01cf; 16999 t.Icircle = 0x24be; 17000 t.Icircumflex = 0x00ce; 17001 t.Icircumflexsmall = 0xf7ee; 17002 t.Icyrillic = 0x0406; 17003 t.Idblgrave = 0x0208; 17004 t.Idieresis = 0x00cf; 17005 t.Idieresisacute = 0x1e2e; 17006 t.Idieresiscyrillic = 0x04e4; 17007 t.Idieresissmall = 0xf7ef; 17008 t.Idot = 0x0130; 17009 t.Idotaccent = 0x0130; 17010 t.Idotbelow = 0x1eca; 17011 t.Iebrevecyrillic = 0x04d6; 17012 t.Iecyrillic = 0x0415; 17013 t.Ifraktur = 0x2111; 17014 t.Igrave = 0x00cc; 17015 t.Igravesmall = 0xf7ec; 17016 t.Ihookabove = 0x1ec8; 17017 t.Iicyrillic = 0x0418; 17018 t.Iinvertedbreve = 0x020a; 17019 t.Iishortcyrillic = 0x0419; 17020 t.Imacron = 0x012a; 17021 t.Imacroncyrillic = 0x04e2; 17022 t.Imonospace = 0xff29; 17023 t.Iniarmenian = 0x053b; 17024 t.Iocyrillic = 0x0401; 17025 t.Iogonek = 0x012e; 17026 t.Iota = 0x0399; 17027 t.Iotaafrican = 0x0196; 17028 t.Iotadieresis = 0x03aa; 17029 t.Iotatonos = 0x038a; 17030 t.Ismall = 0xf769; 17031 t.Istroke = 0x0197; 17032 t.Itilde = 0x0128; 17033 t.Itildebelow = 0x1e2c; 17034 t.Izhitsacyrillic = 0x0474; 17035 t.Izhitsadblgravecyrillic = 0x0476; 17036 t.J = 0x004a; 17037 t.Jaarmenian = 0x0541; 17038 t.Jcircle = 0x24bf; 17039 t.Jcircumflex = 0x0134; 17040 t.Jecyrillic = 0x0408; 17041 t.Jheharmenian = 0x054b; 17042 t.Jmonospace = 0xff2a; 17043 t.Jsmall = 0xf76a; 17044 t.K = 0x004b; 17045 t.KBsquare = 0x3385; 17046 t.KKsquare = 0x33cd; 17047 t.Kabashkircyrillic = 0x04a0; 17048 t.Kacute = 0x1e30; 17049 t.Kacyrillic = 0x041a; 17050 t.Kadescendercyrillic = 0x049a; 17051 t.Kahookcyrillic = 0x04c3; 17052 t.Kappa = 0x039a; 17053 t.Kastrokecyrillic = 0x049e; 17054 t.Kaverticalstrokecyrillic = 0x049c; 17055 t.Kcaron = 0x01e8; 17056 t.Kcedilla = 0x0136; 17057 t.Kcircle = 0x24c0; 17058 t.Kcommaaccent = 0x0136; 17059 t.Kdotbelow = 0x1e32; 17060 t.Keharmenian = 0x0554; 17061 t.Kenarmenian = 0x053f; 17062 t.Khacyrillic = 0x0425; 17063 t.Kheicoptic = 0x03e6; 17064 t.Khook = 0x0198; 17065 t.Kjecyrillic = 0x040c; 17066 t.Klinebelow = 0x1e34; 17067 t.Kmonospace = 0xff2b; 17068 t.Koppacyrillic = 0x0480; 17069 t.Koppagreek = 0x03de; 17070 t.Ksicyrillic = 0x046e; 17071 t.Ksmall = 0xf76b; 17072 t.L = 0x004c; 17073 t.LJ = 0x01c7; 17074 t.LL = 0xf6bf; 17075 t.Lacute = 0x0139; 17076 t.Lambda = 0x039b; 17077 t.Lcaron = 0x013d; 17078 t.Lcedilla = 0x013b; 17079 t.Lcircle = 0x24c1; 17080 t.Lcircumflexbelow = 0x1e3c; 17081 t.Lcommaaccent = 0x013b; 17082 t.Ldot = 0x013f; 17083 t.Ldotaccent = 0x013f; 17084 t.Ldotbelow = 0x1e36; 17085 t.Ldotbelowmacron = 0x1e38; 17086 t.Liwnarmenian = 0x053c; 17087 t.Lj = 0x01c8; 17088 t.Ljecyrillic = 0x0409; 17089 t.Llinebelow = 0x1e3a; 17090 t.Lmonospace = 0xff2c; 17091 t.Lslash = 0x0141; 17092 t.Lslashsmall = 0xf6f9; 17093 t.Lsmall = 0xf76c; 17094 t.M = 0x004d; 17095 t.MBsquare = 0x3386; 17096 t.Macron = 0xf6d0; 17097 t.Macronsmall = 0xf7af; 17098 t.Macute = 0x1e3e; 17099 t.Mcircle = 0x24c2; 17100 t.Mdotaccent = 0x1e40; 17101 t.Mdotbelow = 0x1e42; 17102 t.Menarmenian = 0x0544; 17103 t.Mmonospace = 0xff2d; 17104 t.Msmall = 0xf76d; 17105 t.Mturned = 0x019c; 17106 t.Mu = 0x039c; 17107 t.N = 0x004e; 17108 t.NJ = 0x01ca; 17109 t.Nacute = 0x0143; 17110 t.Ncaron = 0x0147; 17111 t.Ncedilla = 0x0145; 17112 t.Ncircle = 0x24c3; 17113 t.Ncircumflexbelow = 0x1e4a; 17114 t.Ncommaaccent = 0x0145; 17115 t.Ndotaccent = 0x1e44; 17116 t.Ndotbelow = 0x1e46; 17117 t.Nhookleft = 0x019d; 17118 t.Nineroman = 0x2168; 17119 t.Nj = 0x01cb; 17120 t.Njecyrillic = 0x040a; 17121 t.Nlinebelow = 0x1e48; 17122 t.Nmonospace = 0xff2e; 17123 t.Nowarmenian = 0x0546; 17124 t.Nsmall = 0xf76e; 17125 t.Ntilde = 0x00d1; 17126 t.Ntildesmall = 0xf7f1; 17127 t.Nu = 0x039d; 17128 t.O = 0x004f; 17129 t.OE = 0x0152; 17130 t.OEsmall = 0xf6fa; 17131 t.Oacute = 0x00d3; 17132 t.Oacutesmall = 0xf7f3; 17133 t.Obarredcyrillic = 0x04e8; 17134 t.Obarreddieresiscyrillic = 0x04ea; 17135 t.Obreve = 0x014e; 17136 t.Ocaron = 0x01d1; 17137 t.Ocenteredtilde = 0x019f; 17138 t.Ocircle = 0x24c4; 17139 t.Ocircumflex = 0x00d4; 17140 t.Ocircumflexacute = 0x1ed0; 17141 t.Ocircumflexdotbelow = 0x1ed8; 17142 t.Ocircumflexgrave = 0x1ed2; 17143 t.Ocircumflexhookabove = 0x1ed4; 17144 t.Ocircumflexsmall = 0xf7f4; 17145 t.Ocircumflextilde = 0x1ed6; 17146 t.Ocyrillic = 0x041e; 17147 t.Odblacute = 0x0150; 17148 t.Odblgrave = 0x020c; 17149 t.Odieresis = 0x00d6; 17150 t.Odieresiscyrillic = 0x04e6; 17151 t.Odieresissmall = 0xf7f6; 17152 t.Odotbelow = 0x1ecc; 17153 t.Ogoneksmall = 0xf6fb; 17154 t.Ograve = 0x00d2; 17155 t.Ogravesmall = 0xf7f2; 17156 t.Oharmenian = 0x0555; 17157 t.Ohm = 0x2126; 17158 t.Ohookabove = 0x1ece; 17159 t.Ohorn = 0x01a0; 17160 t.Ohornacute = 0x1eda; 17161 t.Ohorndotbelow = 0x1ee2; 17162 t.Ohorngrave = 0x1edc; 17163 t.Ohornhookabove = 0x1ede; 17164 t.Ohorntilde = 0x1ee0; 17165 t.Ohungarumlaut = 0x0150; 17166 t.Oi = 0x01a2; 17167 t.Oinvertedbreve = 0x020e; 17168 t.Omacron = 0x014c; 17169 t.Omacronacute = 0x1e52; 17170 t.Omacrongrave = 0x1e50; 17171 t.Omega = 0x2126; 17172 t.Omegacyrillic = 0x0460; 17173 t.Omegagreek = 0x03a9; 17174 t.Omegaroundcyrillic = 0x047a; 17175 t.Omegatitlocyrillic = 0x047c; 17176 t.Omegatonos = 0x038f; 17177 t.Omicron = 0x039f; 17178 t.Omicrontonos = 0x038c; 17179 t.Omonospace = 0xff2f; 17180 t.Oneroman = 0x2160; 17181 t.Oogonek = 0x01ea; 17182 t.Oogonekmacron = 0x01ec; 17183 t.Oopen = 0x0186; 17184 t.Oslash = 0x00d8; 17185 t.Oslashacute = 0x01fe; 17186 t.Oslashsmall = 0xf7f8; 17187 t.Osmall = 0xf76f; 17188 t.Ostrokeacute = 0x01fe; 17189 t.Otcyrillic = 0x047e; 17190 t.Otilde = 0x00d5; 17191 t.Otildeacute = 0x1e4c; 17192 t.Otildedieresis = 0x1e4e; 17193 t.Otildesmall = 0xf7f5; 17194 t.P = 0x0050; 17195 t.Pacute = 0x1e54; 17196 t.Pcircle = 0x24c5; 17197 t.Pdotaccent = 0x1e56; 17198 t.Pecyrillic = 0x041f; 17199 t.Peharmenian = 0x054a; 17200 t.Pemiddlehookcyrillic = 0x04a6; 17201 t.Phi = 0x03a6; 17202 t.Phook = 0x01a4; 17203 t.Pi = 0x03a0; 17204 t.Piwrarmenian = 0x0553; 17205 t.Pmonospace = 0xff30; 17206 t.Psi = 0x03a8; 17207 t.Psicyrillic = 0x0470; 17208 t.Psmall = 0xf770; 17209 t.Q = 0x0051; 17210 t.Qcircle = 0x24c6; 17211 t.Qmonospace = 0xff31; 17212 t.Qsmall = 0xf771; 17213 t.R = 0x0052; 17214 t.Raarmenian = 0x054c; 17215 t.Racute = 0x0154; 17216 t.Rcaron = 0x0158; 17217 t.Rcedilla = 0x0156; 17218 t.Rcircle = 0x24c7; 17219 t.Rcommaaccent = 0x0156; 17220 t.Rdblgrave = 0x0210; 17221 t.Rdotaccent = 0x1e58; 17222 t.Rdotbelow = 0x1e5a; 17223 t.Rdotbelowmacron = 0x1e5c; 17224 t.Reharmenian = 0x0550; 17225 t.Rfraktur = 0x211c; 17226 t.Rho = 0x03a1; 17227 t.Ringsmall = 0xf6fc; 17228 t.Rinvertedbreve = 0x0212; 17229 t.Rlinebelow = 0x1e5e; 17230 t.Rmonospace = 0xff32; 17231 t.Rsmall = 0xf772; 17232 t.Rsmallinverted = 0x0281; 17233 t.Rsmallinvertedsuperior = 0x02b6; 17234 t.S = 0x0053; 17235 t.SF010000 = 0x250c; 17236 t.SF020000 = 0x2514; 17237 t.SF030000 = 0x2510; 17238 t.SF040000 = 0x2518; 17239 t.SF050000 = 0x253c; 17240 t.SF060000 = 0x252c; 17241 t.SF070000 = 0x2534; 17242 t.SF080000 = 0x251c; 17243 t.SF090000 = 0x2524; 17244 t.SF100000 = 0x2500; 17245 t.SF110000 = 0x2502; 17246 t.SF190000 = 0x2561; 17247 t.SF200000 = 0x2562; 17248 t.SF210000 = 0x2556; 17249 t.SF220000 = 0x2555; 17250 t.SF230000 = 0x2563; 17251 t.SF240000 = 0x2551; 17252 t.SF250000 = 0x2557; 17253 t.SF260000 = 0x255d; 17254 t.SF270000 = 0x255c; 17255 t.SF280000 = 0x255b; 17256 t.SF360000 = 0x255e; 17257 t.SF370000 = 0x255f; 17258 t.SF380000 = 0x255a; 17259 t.SF390000 = 0x2554; 17260 t.SF400000 = 0x2569; 17261 t.SF410000 = 0x2566; 17262 t.SF420000 = 0x2560; 17263 t.SF430000 = 0x2550; 17264 t.SF440000 = 0x256c; 17265 t.SF450000 = 0x2567; 17266 t.SF460000 = 0x2568; 17267 t.SF470000 = 0x2564; 17268 t.SF480000 = 0x2565; 17269 t.SF490000 = 0x2559; 17270 t.SF500000 = 0x2558; 17271 t.SF510000 = 0x2552; 17272 t.SF520000 = 0x2553; 17273 t.SF530000 = 0x256b; 17274 t.SF540000 = 0x256a; 17275 t.Sacute = 0x015a; 17276 t.Sacutedotaccent = 0x1e64; 17277 t.Sampigreek = 0x03e0; 17278 t.Scaron = 0x0160; 17279 t.Scarondotaccent = 0x1e66; 17280 t.Scaronsmall = 0xf6fd; 17281 t.Scedilla = 0x015e; 17282 t.Schwa = 0x018f; 17283 t.Schwacyrillic = 0x04d8; 17284 t.Schwadieresiscyrillic = 0x04da; 17285 t.Scircle = 0x24c8; 17286 t.Scircumflex = 0x015c; 17287 t.Scommaaccent = 0x0218; 17288 t.Sdotaccent = 0x1e60; 17289 t.Sdotbelow = 0x1e62; 17290 t.Sdotbelowdotaccent = 0x1e68; 17291 t.Seharmenian = 0x054d;
17292 t.Sevenroman = 0x2166; 17293 t.Shaarmenian = 0x0547; 17294 t.Shacyrillic = 0x0428; 17295 t.Shchacyrillic = 0x0429; 17296 t.Sheicoptic = 0x03e2; 17297 t.Shhacyrillic = 0x04ba; 17298 t.Shimacoptic = 0x03ec; 17299 t.Sigma = 0x03a3; 17300 t.Sixroman = 0x2165; 17301 t.Smonospace = 0xff33; 17302 t.Softsigncyrillic = 0x042c; 17303 t.Ssmall = 0xf773; 17304 t.Stigmagreek = 0x03da; 17305 t.T = 0x0054; 17306 t.Tau = 0x03a4; 17307 t.Tbar = 0x0166; 17308 t.Tcaron = 0x0164; 17309 t.Tcedilla = 0x0162; 17310 t.Tcircle = 0x24c9; 17311 t.Tcircumflexbelow = 0x1e70; 17312 t.Tcommaaccent = 0x0162; 17313 t.Tdotaccent = 0x1e6a; 17314 t.Tdotbelow = 0x1e6c; 17315 t.Tecyrillic = 0x0422; 17316 t.Tedescendercyrillic = 0x04ac; 17317 t.Tenroman = 0x2169; 17318 t.Tetsecyrillic = 0x04b4; 17319 t.Theta = 0x0398; 17320 t.Thook = 0x01ac; 17321 t.Thorn = 0x00de; 17322 t.Thornsmall = 0xf7fe; 17323 t.Threeroman = 0x2162; 17324 t.Tildesmall = 0xf6fe; 17325 t.Tiwnarmenian = 0x054f; 17326 t.Tlinebelow = 0x1e6e; 17327 t.Tmonospace = 0xff34; 17328 t.Toarmenian = 0x0539; 17329 t.Tonefive = 0x01bc; 17330 t.Tonesix = 0x0184; 17331 t.Tonetwo = 0x01a7; 17332 t.Tretroflexhook = 0x01ae; 17333 t.Tsecyrillic = 0x0426; 17334 t.Tshecyrillic = 0x040b; 17335 t.Tsmall = 0xf774; 17336 t.Twelveroman = 0x216b; 17337 t.Tworoman = 0x2161; 17338 t.U = 0x0055; 17339 t.Uacute = 0x00da; 17340 t.Uacutesmall = 0xf7fa; 17341 t.Ubreve = 0x016c; 17342 t.Ucaron = 0x01d3; 17343 t.Ucircle = 0x24ca; 17344 t.Ucircumflex = 0x00db; 17345 t.Ucircumflexbelow = 0x1e76; 17346 t.Ucircumflexsmall = 0xf7fb; 17347 t.Ucyrillic = 0x0423; 17348 t.Udblacute = 0x0170; 17349 t.Udblgrave = 0x0214; 17350 t.Udieresis = 0x00dc; 17351 t.Udieresisacute = 0x01d7; 17352 t.Udieresisbelow = 0x1e72; 17353 t.Udieresiscaron = 0x01d9; 17354 t.Udieresiscyrillic = 0x04f0; 17355 t.Udieresisgrave = 0x01db; 17356 t.Udieresismacron = 0x01d5; 17357 t.Udieresissmall = 0xf7fc; 17358 t.Udotbelow = 0x1ee4; 17359 t.Ugrave = 0x00d9; 17360 t.Ugravesmall = 0xf7f9; 17361 t.Uhookabove = 0x1ee6; 17362 t.Uhorn = 0x01af; 17363 t.Uhornacute = 0x1ee8; 17364 t.Uhorndotbelow = 0x1ef0; 17365 t.Uhorngrave = 0x1eea; 17366 t.Uhornhookabove = 0x1eec; 17367 t.Uhorntilde = 0x1eee; 17368 t.Uhungarumlaut = 0x0170; 17369 t.Uhungarumlautcyrillic = 0x04f2; 17370 t.Uinvertedbreve = 0x0216; 17371 t.Ukcyrillic = 0x0478; 17372 t.Umacron = 0x016a; 17373 t.Umacroncyrillic = 0x04ee; 17374 t.Umacrondieresis = 0x1e7a; 17375 t.Umonospace = 0xff35; 17376 t.Uogonek = 0x0172; 17377 t.Upsilon = 0x03a5; 17378 t.Upsilon1 = 0x03d2; 17379 t.Upsilonacutehooksymbolgreek = 0x03d3; 17380 t.Upsilonafrican = 0x01b1; 17381 t.Upsilondieresis = 0x03ab; 17382 t.Upsilondieresishooksymbolgreek = 0x03d4; 17383 t.Upsilonhooksymbol = 0x03d2; 17384 t.Upsilontonos = 0x038e; 17385 t.Uring = 0x016e; 17386 t.Ushortcyrillic = 0x040e; 17387 t.Usmall = 0xf775; 17388 t.Ustraightcyrillic = 0x04ae; 17389 t.Ustraightstrokecyrillic = 0x04b0; 17390 t.Utilde = 0x0168; 17391 t.Utildeacute = 0x1e78; 17392 t.Utildebelow = 0x1e74; 17393 t.V = 0x0056; 17394 t.Vcircle = 0x24cb; 17395 t.Vdotbelow = 0x1e7e; 17396 t.Vecyrillic = 0x0412; 17397 t.Vewarmenian = 0x054e; 17398 t.Vhook = 0x01b2; 17399 t.Vmonospace = 0xff36; 17400 t.Voarmenian = 0x0548; 17401 t.Vsmall = 0xf776; 17402 t.Vtilde = 0x1e7c; 17403 t.W = 0x0057; 17404 t.Wacute = 0x1e82; 17405 t.Wcircle = 0x24cc; 17406 t.Wcircumflex = 0x0174; 17407 t.Wdieresis = 0x1e84; 17408 t.Wdotaccent = 0x1e86; 17409 t.Wdotbelow = 0x1e88; 17410 t.Wgrave = 0x1e80; 17411 t.Wmonospace = 0xff37; 17412 t.Wsmall = 0xf777; 17413 t.X = 0x0058; 17414 t.Xcircle = 0x24cd; 17415 t.Xdieresis = 0x1e8c; 17416 t.Xdotaccent = 0x1e8a; 17417 t.Xeharmenian = 0x053d; 17418 t.Xi = 0x039e; 17419 t.Xmonospace = 0xff38; 17420 t.Xsmall = 0xf778; 17421 t.Y = 0x0059; 17422 t.Yacute = 0x00dd; 17423 t.Yacutesmall = 0xf7fd; 17424 t.Yatcyrillic = 0x0462; 17425 t.Ycircle = 0x24ce; 17426 t.Ycircumflex = 0x0176; 17427 t.Ydieresis = 0x0178; 17428 t.Ydieresissmall = 0xf7ff; 17429 t.Ydotaccent = 0x1e8e; 17430 t.Ydotbelow = 0x1ef4; 17431 t.Yericyrillic = 0x042b; 17432 t.Yerudieresiscyrillic = 0x04f8; 17433 t.Ygrave = 0x1ef2; 17434 t.Yhook = 0x01b3; 17435 t.Yhookabove = 0x1ef6; 17436 t.Yiarmenian = 0x0545; 17437 t.Yicyrillic = 0x0407; 17438 t.Yiwnarmenian = 0x0552; 17439 t.Ymonospace = 0xff39; 17440 t.Ysmall = 0xf779; 17441 t.Ytilde = 0x1ef8; 17442 t.Yusbigcyrillic = 0x046a; 17443 t.Yusbigiotifiedcyrillic = 0x046c; 17444 t.Yuslittlecyrillic = 0x0466; 17445 t.Yuslittleiotifiedcyrillic = 0x0468; 17446 t.Z = 0x005a; 17447 t.Zaarmenian = 0x0536; 17448 t.Zacute = 0x0179; 17449 t.Zcaron = 0x017d; 17450 t.Zcaronsmall = 0xf6ff; 17451 t.Zcircle = 0x24cf; 17452 t.Zcircumflex = 0x1e90; 17453 t.Zdot = 0x017b; 17454 t.Zdotaccent = 0x017b; 17455 t.Zdotbelow = 0x1e92; 17456 t.Zecyrillic = 0x0417; 17457 t.Zedescendercyrillic = 0x0498; 17458 t.Zedieresiscyrillic = 0x04de; 17459 t.Zeta = 0x0396; 17460 t.Zhearmenian = 0x053a; 17461 t.Zhebrevecyrillic = 0x04c1; 17462 t.Zhecyrillic = 0x0416; 17463 t.Zhedescendercyrillic = 0x0496; 17464 t.Zhedieresiscyrillic = 0x04dc; 17465 t.Zlinebelow = 0x1e94; 17466 t.Zmonospace = 0xff3a; 17467 t.Zsmall = 0xf77a; 17468 t.Zstroke = 0x01b5; 17469 t.a = 0x0061; 17470 t.aabengali = 0x0986; 17471 t.aacute = 0x00e1; 17472 t.aadeva = 0x0906; 17473 t.aagujarati = 0x0a86; 17474 t.aagurmukhi = 0x0a06; 17475 t.aamatragurmukhi = 0x0a3e; 17476 t.aarusquare = 0x3303; 17477 t.aavowelsignbengali = 0x09be; 17478 t.aavowelsigndeva = 0x093e; 17479 t.aavowelsigngujarati = 0x0abe; 17480 t.abbreviationmarkarmenian = 0x055f; 17481 t.abbreviationsigndeva = 0x0970; 17482 t.abengali = 0x0985; 17483 t.abopomofo = 0x311a; 17484 t.abreve = 0x0103; 17485 t.abreveacute = 0x1eaf; 17486 t.abrevecyrillic = 0x04d1; 17487 t.abrevedotbelow = 0x1eb7; 17488 t.abrevegrave = 0x1eb1; 17489 t.abrevehookabove = 0x1eb3; 17490 t.abrevetilde = 0x1eb5; 17491 t.acaron = 0x01ce; 17492 t.acircle = 0x24d0; 17493 t.acircumflex = 0x00e2; 17494 t.acircumflexacute = 0x1ea5; 17495 t.acircumflexdotbelow = 0x1ead; 17496 t.acircumflexgrave = 0x1ea7; 17497 t.acircumflexhookabove = 0x1ea9; 17498 t.acircumflextilde = 0x1eab; 17499 t.acute = 0x00b4; 17500 t.acutebelowcmb = 0x0317; 17501 t.acutecmb = 0x0301; 17502 t.acutecomb = 0x0301; 17503 t.acutedeva = 0x0954; 17504 t.acutelowmod = 0x02cf; 17505 t.acutetonecmb = 0x0341; 17506 t.acyrillic = 0x0430; 17507 t.adblgrave = 0x0201; 17508 t.addakgurmukhi = 0x0a71; 17509 t.adeva = 0x0905; 17510 t.adieresis = 0x00e4; 17511 t.adieresiscyrillic = 0x04d3; 17512 t.adieresismacron = 0x01df; 17513 t.adotbelow = 0x1ea1; 17514 t.adotmacron = 0x01e1; 17515 t.ae = 0x00e6; 17516 t.aeacute = 0x01fd; 17517 t.aekorean = 0x3150; 17518 t.aemacron = 0x01e3; 17519 t.afii00208 = 0x2015; 17520 t.afii08941 = 0x20a4; 17521 t.afii10017 = 0x0410; 17522 t.afii10018 = 0x0411; 17523 t.afii10019 = 0x0412; 17524 t.afii10020 = 0x0413;
17525 t.afii10021 = 0x0414; 17526 t.afii10022 = 0x0415; 17527 t.afii10023 = 0x0401; 17528 t.afii10024 = 0x0416; 17529 t.afii10025 = 0x0417; 17530 t.afii10026 = 0x0418; 17531 t.afii10027 = 0x0419; 17532 t.afii10028 = 0x041a; 17533 t.afii10029 = 0x041b; 17534 t.afii10030 = 0x041c; 17535 t.afii10031 = 0x041d; 17536 t.afii10032 = 0x041e; 17537 t.afii10033 = 0x041f; 17538 t.afii10034 = 0x0420; 17539 t.afii10035 = 0x0421; 17540 t.afii10036 = 0x0422; 17541 t.afii10037 = 0x0423; 17542 t.afii10038 = 0x0424; 17543 t.afii10039 = 0x0425; 17544 t.afii10040 = 0x0426; 17545 t.afii10041 = 0x0427; 17546 t.afii10042 = 0x0428; 17547 t.afii10043 = 0x0429; 17548 t.afii10044 = 0x042a; 17549 t.afii10045 = 0x042b; 17550 t.afii10046 = 0x042c; 17551 t.afii10047 = 0x042d; 17552 t.afii10048 = 0x042e; 17553 t.afii10049 = 0x042f; 17554 t.afii10050 = 0x0490; 17555 t.afii10051 = 0x0402; 17556 t.afii10052 = 0x0403; 17557 t.afii10053 = 0x0404; 17558 t.afii10054 = 0x0405; 17559 t.afii10055 = 0x0406; 17560 t.afii10056 = 0x0407; 17561 t.afii10057 = 0x0408; 17562 t.afii10058 = 0x0409; 17563 t.afii10059 = 0x040a; 17564 t.afii10060 = 0x040b; 17565 t.afii10061 = 0x040c; 17566 t.afii10062 = 0x040e; 17567 t.afii10063 = 0xf6c4; 17568 t.afii10064 = 0xf6c5; 17569 t.afii10065 = 0x0430; 17570 t.afii10066 = 0x0431; 17571 t.afii10067 = 0x0432; 17572 t.afii10068 = 0x0433; 17573 t.afii10069 = 0x0434; 17574 t.afii10070 = 0x0435; 17575 t.afii10071 = 0x0451; 17576 t.afii10072 = 0x0436; 17577 t.afii10073 = 0x0437; 17578 t.afii10074 = 0x0438; 17579 t.afii10075 = 0x0439; 17580 t.afii10076 = 0x043a; 17581 t.afii10077 = 0x043b; 17582 t.afii10078 = 0x043c; 17583 t.afii10079 = 0x043d; 17584 t.afii10080 = 0x043e; 17585 t.afii10081 = 0x043f; 17586 t.afii10082 = 0x0440; 17587 t.afii10083 = 0x0441; 17588 t.afii10084 = 0x0442; 17589 t.afii10085 = 0x0443; 17590 t.afii10086 = 0x0444; 17591 t.afii10087 = 0x0445; 17592 t.afii10088 = 0x0446; 17593 t.afii10089 = 0x0447; 17594 t.afii10090 = 0x0448; 17595 t.afii10091 = 0x0449; 17596 t.afii10092 = 0x044a; 17597 t.afii10093 = 0x044b; 17598 t.afii10094 = 0x044c; 17599 t.afii10095 = 0x044d; 17600 t.afii10096 = 0x044e; 17601 t.afii10097 = 0x044f; 17602 t.afii10098 = 0x0491; 17603 t.afii10099 = 0x0452; 17604 t.afii10100 = 0x0453; 17605 t.afii10101 = 0x0454; 17606 t.afii10102 = 0x0455; 17607 t.afii10103 = 0x0456; 17608 t.afii10104 = 0x0457; 17609 t.afii10105 = 0x0458; 17610 t.afii10106 = 0x0459;
17611 t.afii10107 = 0x045a; 17612 t.afii10108 = 0x045b; 17613 t.afii10109 = 0x045c; 17614 t.afii10110 = 0x045e; 17615 t.afii10145 = 0x040f; 17616 t.afii10146 = 0x0462; 17617 t.afii10147 = 0x0472; 17618 t.afii10148 = 0x0474; 17619 t.afii10192 = 0xf6c6; 17620 t.afii10193 = 0x045f; 17621 t.afii10194 = 0x0463; 17622 t.afii10195 = 0x0473; 17623 t.afii10196 = 0x0475; 17624 t.afii10831 = 0xf6c7; 17625 t.afii10832 = 0xf6c8; 17626 t.afii10846 = 0x04d9; 17627 t.afii299 = 0x200e; 17628 t.afii300 = 0x200f; 17629 t.afii301 = 0x200d; 17630 t.afii57381 = 0x066a; 17631 t.afii57388 = 0x060c; 17632 t.afii57392 = 0x0660; 17633 t.afii57393 = 0x0661; 17634 t.afii57394 = 0x0662; 17635 t.afii57395 = 0x0663; 17636 t.afii57396 = 0x0664; 17637 t.afii57397 = 0x0665; 17638 t.afii57398 = 0x0666; 17639 t.afii57399 = 0x0667; 17640 t.afii57400 = 0x0668; 17641 t.afii57401 = 0x0669; 17642 t.afii57403 = 0x061b; 17643 t.afii57407 = 0x061f; 17644 t.afii57409 = 0x0621; 17645 t.afii57410 = 0x0622; 17646 t.afii57411 = 0x0623; 17647 t.afii57412 = 0x0624; 17648 t.afii57413 = 0x0625; 17649 t.afii57414 = 0x0626; 17650 t.afii57415 = 0x0627; 17651 t.afii57416 = 0x0628; 17652 t.afii57417 = 0x0629; 17653 t.afii57418 = 0x062a; 17654 t.afii57419 = 0x062b; 17655 t.afii57420 = 0x062c; 17656 t.afii57421 = 0x062d; 17657 t.afii57422 = 0x062e; 17658 t.afii57423 = 0x062f; 17659 t.afii57424 = 0x0630; 17660 t.afii57425 = 0x0631; 17661 t.afii57426 = 0x0632; 17662 t.afii57427 = 0x0633; 17663 t.afii57428 = 0x0634; 17664 t.afii57429 = 0x0635; 17665 t.afii57430 = 0x0636; 17666 t.afii57431 = 0x0637; 17667 t.afii57432 = 0x0638; 17668 t.afii57433 = 0x0639; 17669 t.afii57434 = 0x063a; 17670 t.afii57440 = 0x0640; 17671 t.afii57441 = 0x0641; 17672 t.afii57442 = 0x0642; 17673 t.afii57443 = 0x0643; 17674 t.afii57444 = 0x0644; 17675 t.afii57445 = 0x0645; 17676 t.afii57446 = 0x0646; 17677 t.afii57448 = 0x0648; 17678 t.afii57449 = 0x0649; 17679 t.afii57450 = 0x064a; 17680 t.afii57451 = 0x064b; 17681 t.afii57452 = 0x064c; 17682 t.afii57453 = 0x064d; 17683 t.afii57454 = 0x064e; 17684 t.afii57455 = 0x064f; 17685 t.afii57456 = 0x0650; 17686 t.afii57457 = 0x0651; 17687 t.afii57458 = 0x0652; 17688 t.afii57470 = 0x0647; 17689 t.afii57505 = 0x06a4; 17690 t.afii57506 = 0x067e; 17691 t.afii57507 = 0x0686; 17692 t.afii57508 = 0x0698; 17693 t.afii57509 = 0x06af; 17694 t.afii57511 = 0x0679; 17695 t.afii57512 = 0x0688; 17696 t.afii57513 = 0x0691; 17697 t.afii57514 = 0x06ba; 17698 t.afii57519 = 0x06d2; 17699 t.afii57534 = 0x06d5; 17700 t.afii57636 = 0x20aa; 17701 t.afii57645 = 0x05be; 17702 t.afii57658 = 0x05c3; 17703 t.afii57664 = 0x05d0; 17704 t.afii57665 = 0x05d1; 17705 t.afii57666 = 0x05d2; 17706 t.afii57667 = 0x05d3; 17707 t.afii57668 = 0x05d4; 17708 t.afii57669 = 0x05d5; 17709 t.afii57670 = 0x05d6; 17710 t.afii57671 = 0x05d7; 17711 t.afii57672 = 0x05d8; 17712 t.afii57673 = 0x05d9; 17713 t.afii57674 = 0x05da; 17714 t.afii57675 = 0x05db; 17715 t.afii57676 = 0x05dc; 17716 t.afii57677 = 0x05dd; 17717 t.afii57678 = 0x05de; 17718 t.afii57679 = 0x05df; 17719 t.afii57680 = 0x05e0; 17720 t.afii57681 = 0x05e1; 17721 t.afii57682 = 0x05e2; 17722 t.afii57683 = 0x05e3; 17723 t.afii57684 = 0x05e4; 17724 t.afii57685 = 0x05e5; 17725 t.afii57686 = 0x05e6; 17726 t.afii57687 = 0x05e7; 17727 t.afii57688 = 0x05e8; 17728 t.afii57689 = 0x05e9; 17729 t.afii57690 = 0x05ea; 17730 t.afii57694 = 0xfb2a; 17731 t.afii57695 = 0xfb2b; 17732 t.afii57700 = 0xfb4b; 17733 t.afii57705 = 0xfb1f; 17734 t.afii57716 = 0x05f0; 17735 t.afii57717 = 0x05f1; 17736 t.afii57718 = 0x05f2; 17737 t.afii57723 = 0xfb35; 17738 t.afii57793 = 0x05b4; 17739 t.afii57794 = 0x05b5; 17740 t.afii57795 = 0x05b6; 17741 t.afii57796 = 0x05bb; 17742 t.afii57797 = 0x05b8; 17743 t.afii57798 = 0x05b7; 17744 t.afii57799 = 0x05b0; 17745 t.afii57800 = 0x05b2; 17746 t.afii57801 = 0x05b1; 17747 t.afii57802 = 0x05b3; 17748 t.afii57803 = 0x05c2; 17749 t.afii57804 = 0x05c1; 17750 t.afii57806 = 0x05b9; 17751 t.afii57807 = 0x05bc; 17752 t.afii57839 = 0x05bd; 17753 t.afii57841 = 0x05bf; 17754 t.afii57842 = 0x05c0; 17755 t.afii57929 = 0x02bc; 17756 t.afii61248 = 0x2105; 17757 t.afii61289 = 0x2113; 17758 t.afii61352 = 0x2116; 17759 t.afii61573 = 0x202c; 17760 t.afii61574 = 0x202d; 17761 t.afii61575 = 0x202e; 17762 t.afii61664 = 0x200c; 17763 t.afii63167 = 0x066d; 17764 t.afii64937 = 0x02bd; 17765 t.agrave = 0x00e0; 17766 t.agujarati = 0x0a85; 17767 t.agurmukhi = 0x0a05; 17768 t.ahiragana = 0x3042; 17769 t.ahookabove = 0x1ea3; 17770 t.aibengali = 0x0990; 17771 t.aibopomofo = 0x311e; 17772 t.aideva = 0x0910; 17773 t.aiecyrillic = 0x04d5; 17774 t.aigujarati = 0x0a90; 17775 t.aigurmukhi = 0x0a10; 17776 t.aimatragurmukhi = 0x0a48; 17777 t.ainarabic = 0x0639; 17778 t.ainfinalarabic = 0xfeca; 17779 t.aininitialarabic = 0xfecb; 17780 t.ainmedialarabic = 0xfecc; 17781 t.ainvertedbreve = 0x0203; 17782 t.aivowelsignbengali = 0x09c8; 17783 t.aivowelsigndeva = 0x0948; 17784 t.aivowelsigngujarati = 0x0ac8; 17785 t.akatakana = 0x30a2; 17786 t.akatakanahalfwidth = 0xff71; 17787 t.akorean = 0x314f; 17788 t.alef = 0x05d0; 17789 t.alefarabic = 0x0627; 17790 t.alefdageshhebrew = 0xfb30; 17791 t.aleffinalarabic = 0xfe8e; 17792 t.alefhamzaabovearabic = 0x0623; 17793 t.alefhamzaabovefinalarabic = 0xfe84; 17794 t.alefhamzabelowarabic = 0x0625; 17795 t.alefhamzabelowfinalarabic = 0xfe88; 17796 t.alefhebrew = 0x05d0; 17797 t.aleflamedhebrew = 0xfb4f; 17798 t.alefmaddaabovearabic = 0x0622; 17799 t.alefmaddaabovefinalarabic = 0xfe82; 17800 t.alefmaksuraarabic = 0x0649; 17801 t.alefmaksurafinalarabic = 0xfef0; 17802 t.alefmaksurainitialarabic = 0xfef3; 17803 t.alefmaksuramedialarabic = 0xfef4;
17804 t.alefpatahhebrew = 0xfb2e; 17805 t.alefqamatshebrew = 0xfb2f; 17806 t.aleph = 0x2135; 17807 t.allequal = 0x224c; 17808 t.alpha = 0x03b1; 17809 t.alphatonos = 0x03ac; 17810 t.amacron = 0x0101; 17811 t.amonospace = 0xff41; 17812 t.ampersand = 0x0026; 17813 t.ampersandmonospace = 0xff06; 17814 t.ampersandsmall = 0xf726; 17815 t.amsquare = 0x33c2; 17816 t.anbopomofo = 0x3122; 17817 t.angbopomofo = 0x3124; 17818 t.angbracketleft = 0x3008; 17819 t.angbracketright = 0x3009; 17820 t.angkhankhuthai = 0x0e5a; 17821 t.angle = 0x2220; 17822 t.anglebracketleft = 0x3008; 17823 t.anglebracketleftvertical = 0xfe3f; 17824 t.anglebracketright = 0x3009; 17825 t.anglebracketrightvertical = 0xfe40; 17826 t.angleleft = 0x2329; 17827 t.angleright = 0x232a; 17828 t.angstrom = 0x212b; 17829 t.anoteleia = 0x0387; 17830 t.anudattadeva = 0x0952; 17831 t.anusvarabengali = 0x0982; 17832 t.anusvaradeva = 0x0902; 17833 t.anusvaragujarati = 0x0a82; 17834 t.aogonek = 0x0105; 17835 t.apaatosquare = 0x3300; 17836 t.aparen = 0x249c; 17837 t.apostrophearmenian = 0x055a; 17838 t.apostrophemod = 0x02bc; 17839 t.apple = 0xf8ff; 17840 t.approaches = 0x2250; 17841 t.approxequal = 0x2248; 17842 t.approxequalorimage = 0x2252; 17843 t.approximatelyequal = 0x2245; 17844 t.araeaekorean = 0x318e; 17845 t.araeakorean = 0x318d; 17846 t.arc = 0x2312; 17847 t.arighthalfring = 0x1e9a; 17848 t.aring = 0x00e5; 17849 t.aringacute = 0x01fb; 17850 t.aringbelow = 0x1e01; 17851 t.arrowboth = 0x2194; 17852 t.arrowdashdown = 0x21e3; 17853 t.arrowdashleft = 0x21e0; 17854 t.arrowdashright = 0x21e2; 17855 t.arrowdashup = 0x21e1; 17856 t.arrowdblboth = 0x21d4; 17857 t.arrowdbldown = 0x21d3; 17858 t.arrowdblleft = 0x21d0; 17859 t.arrowdblright = 0x21d2; 17860 t.arrowdblup = 0x21d1; 17861 t.arrowdown = 0x2193; 17862 t.arrowdownleft = 0x2199; 17863 t.arrowdownright = 0x2198; 17864 t.arrowdownwhite = 0x21e9; 17865 t.arrowheaddownmod = 0x02c5; 17866 t.arrowheadleftmod = 0x02c2; 17867 t.arrowheadrightmod = 0x02c3; 17868 t.arrowheadupmod = 0x02c4; 17869 t.arrowhorizex = 0xf8e7; 17870 t.arrowleft = 0x2190; 17871 t.arrowleftdbl = 0x21d0; 17872 t.arrowleftdblstroke = 0x21cd; 17873 t.arrowleftoverright = 0x21c6; 17874 t.arrowleftwhite = 0x21e6; 17875 t.arrowright = 0x2192; 17876 t.arrowrightdblstroke = 0x21cf; 17877 t.arrowrightheavy = 0x279e; 17878 t.arrowrightoverleft = 0x21c4; 17879 t.arrowrightwhite = 0x21e8; 17880 t.arrowtableft = 0x21e4; 17881 t.arrowtabright = 0x21e5; 17882 t.arrowup = 0x2191; 17883 t.arrowupdn = 0x2195; 17884 t.arrowupdnbse = 0x21a8; 17885 t.arrowupdownbase = 0x21a8; 17886 t.arrowupleft = 0x2196; 17887 t.arrowupleftofdown = 0x21c5; 17888 t.arrowupright = 0x2197; 17889 t.arrowupwhite = 0x21e7; 17890 t.arrowvertex = 0xf8e6; 17891 t.asciicircum = 0x005e; 17892 t.asciicircummonospace = 0xff3e; 17893 t.asciitilde = 0x007e; 17894 t.asciitildemonospace = 0xff5e; 17895 t.ascript = 0x0251; 17896 t.ascriptturned = 0x0252; 17897 t.asmallhiragana = 0x3041; 17898 t.asmallkatakana = 0x30a1; 17899 t.asmallkatakanahalfwidth = 0xff67; 17900 t.asterisk = 0x002a; 17901 t.asteriskaltonearabic = 0x066d; 17902 t.asteriskarabic = 0x066d; 17903 t.asteriskmath = 0x2217; 17904 t.asteriskmonospace = 0xff0a; 17905 t.asterisksmall = 0xfe61; 17906 t.asterism = 0x2042; 17907 t.asuperior = 0xf6e9; 17908 t.asymptoticallyequal = 0x2243; 17909 t.at = 0x0040; 17910 t.atilde = 0x00e3; 17911 t.atmonospace = 0xff20; 17912 t.atsmall = 0xfe6b; 17913 t.aturned = 0x0250; 17914 t.aubengali = 0x0994; 17915 t.aubopomofo = 0x3120; 17916 t.audeva = 0x0914; 17917 t.augujarati = 0x0a94; 17918 t.augurmukhi = 0x0a14; 17919 t.aulengthmarkbengali = 0x09d7; 17920 t.aumatragurmukhi = 0x0a4c; 17921 t.auvowelsignbengali = 0x09cc; 17922 t.auvowelsigndeva = 0x094c; 17923 t.auvowelsigngujarati = 0x0acc; 17924 t.avagrahadeva = 0x093d; 17925 t.aybarmenian = 0x0561; 17926 t.ayin = 0x05e2; 17927 t.ayinaltonehebrew = 0xfb20; 17928 t.ayinhebrew = 0x05e2; 17929 t.b = 0x0062; 17930 t.babengali = 0x09ac; 17931 t.backslash = 0x005c; 17932 t.backslashmonospace = 0xff3c; 17933 t.badeva = 0x092c; 17934 t.bagujarati = 0x0aac; 17935 t.bagurmukhi = 0x0a2c; 17936 t.bahiragana = 0x3070; 17937 t.bahtthai = 0x0e3f; 17938 t.bakatakana = 0x30d0; 17939 t.bar = 0x007c; 17940 t.barmonospace = 0xff5c; 17941 t.bbopomofo = 0x3105; 17942 t.bcircle = 0x24d1; 17943 t.bdotaccent = 0x1e03; 17944 t.bdotbelow = 0x1e05; 17945 t.beamedsixteenthnotes = 0x266c; 17946 t.because = 0x2235; 17947 t.becyrillic = 0x0431; 17948 t.beharabic = 0x0628; 17949 t.behfinalarabic = 0xfe90; 17950 t.behinitialarabic = 0xfe91; 17951 t.behiragana = 0x3079; 17952 t.behmedialarabic = 0xfe92; 17953 t.behmeeminitialarabic = 0xfc9f; 17954 t.behmeemisolatedarabic = 0xfc08; 17955 t.behnoonfinalarabic = 0xfc6d; 17956 t.bekatakana = 0x30d9; 17957 t.benarmenian = 0x0562; 17958 t.bet = 0x05d1; 17959 t.beta = 0x03b2; 17960 t.betasymbolgreek = 0x03d0; 17961 t.betdagesh = 0xfb31; 17962 t.betdageshhebrew = 0xfb31; 17963 t.bethebrew = 0x05d1; 17964 t.betrafehebrew = 0xfb4c; 17965 t.bhabengali = 0x09ad; 17966 t.bhadeva = 0x092d; 17967 t.bhagujarati = 0x0aad; 17968 t.bhagurmukhi = 0x0a2d; 17969 t.bhook = 0x0253; 17970 t.bihiragana = 0x3073; 17971 t.bikatakana = 0x30d3; 17972 t.bilabialclick = 0x0298; 17973 t.bindigurmukhi = 0x0a02; 17974 t.birusquare = 0x3331; 17975 t.blackcircle = 0x25cf; 17976 t.blackdiamond = 0x25c6; 17977 t.blackdownpointingtriangle = 0x25bc; 17978 t.blackleftpointingpointer = 0x25c4; 17979 t.blackleftpointingtriangle = 0x25c0; 17980 t.blacklenticularbracketleft = 0x3010; 17981 t.blacklenticularbracketleftvertical = 0xfe3b; 17982 t.blacklenticularbracketright = 0x3011; 17983 t.blacklenticularbracketrightvertical = 0xfe3c; 17984 t.blacklowerlefttriangle = 0x25e3; 17985 t.blacklowerrighttriangle = 0x25e2; 17986 t.blackrectangle = 0x25ac; 17987 t.blackrightpointingpointer = 0x25ba; 17988 t.blackrightpointingtriangle = 0x25b6; 17989 t.blacksmallsquare = 0x25aa; 17990 t.blacksmilingface = 0x263b; 17991 t.blacksquare = 0x25a0; 17992 t.blackstar = 0x2605; 17993 t.blackupperlefttriangle = 0x25e4; 17994 t.blackupperrighttriangle = 0x25e5;
17995 t.blackuppointingsmalltriangle = 0x25b4; 17996 t.blackuppointingtriangle = 0x25b2; 17997 t.blank = 0x2423; 17998 t.blinebelow = 0x1e07; 17999 t.block = 0x2588; 18000 t.bmonospace = 0xff42; 18001 t.bobaimaithai = 0x0e1a; 18002 t.bohiragana = 0x307c; 18003 t.bokatakana = 0x30dc; 18004 t.bparen = 0x249d; 18005 t.bqsquare = 0x33c3; 18006 t.braceex = 0xf8f4; 18007 t.braceleft = 0x007b; 18008 t.braceleftbt = 0xf8f3; 18009 t.braceleftmid = 0xf8f2; 18010 t.braceleftmonospace = 0xff5b; 18011 t.braceleftsmall = 0xfe5b; 18012 t.bracelefttp = 0xf8f1; 18013 t.braceleftvertical = 0xfe37; 18014 t.braceright = 0x007d; 18015 t.bracerightbt = 0xf8fe; 18016 t.bracerightmid = 0xf8fd; 18017 t.bracerightmonospace = 0xff5d; 18018 t.bracerightsmall = 0xfe5c; 18019 t.bracerighttp = 0xf8fc; 18020 t.bracerightvertical = 0xfe38; 18021 t.bracketleft = 0x005b; 18022 t.bracketleftbt = 0xf8f0; 18023 t.bracketleftex = 0xf8ef; 18024 t.bracketleftmonospace = 0xff3b; 18025 t.bracketlefttp = 0xf8ee; 18026 t.bracketright = 0x005d; 18027 t.bracketrightbt = 0xf8fb; 18028 t.bracketrightex = 0xf8fa; 18029 t.bracketrightmonospace = 0xff3d; 18030 t.bracketrighttp = 0xf8f9; 18031 t.breve = 0x02d8; 18032 t.brevebelowcmb = 0x032e; 18033 t.brevecmb = 0x0306; 18034 t.breveinvertedbelowcmb = 0x032f; 18035 t.breveinvertedcmb = 0x0311; 18036 t.breveinverteddoublecmb = 0x0361; 18037 t.bridgebelowcmb = 0x032a; 18038 t.bridgeinvertedbelowcmb = 0x033a; 18039 t.brokenbar = 0x00a6; 18040 t.bstroke = 0x0180; 18041 t.bsuperior = 0xf6ea; 18042 t.btopbar = 0x0183; 18043 t.buhiragana = 0x3076; 18044 t.bukatakana = 0x30d6; 18045 t.bullet = 0x2022; 18046 t.bulletinverse = 0x25d8; 18047 t.bulletoperator = 0x2219; 18048 t.bullseye = 0x25ce; 18049 t.c = 0x0063; 18050 t.caarmenian = 0x056e; 18051 t.cabengali = 0x099a; 18052 t.cacute = 0x0107; 18053 t.cadeva = 0x091a; 18054 t.cagujarati = 0x0a9a; 18055 t.cagurmukhi = 0x0a1a; 18056 t.calsquare = 0x3388; 18057 t.candrabindubengali = 0x0981; 18058 t.candrabinducmb = 0x0310; 18059 t.candrabindudeva = 0x0901; 18060 t.candrabindugujarati = 0x0a81; 18061 t.capslock = 0x21ea; 18062 t.careof = 0x2105; 18063 t.caron = 0x02c7; 18064 t.caronbelowcmb = 0x032c; 18065 t.caroncmb = 0x030c; 18066 t.carriagereturn = 0x21b5; 18067 t.cbopomofo = 0x3118; 18068 t.ccaron = 0x010d; 18069 t.ccedilla = 0x00e7; 18070 t.ccedillaacute = 0x1e09; 18071 t.ccircle = 0x24d2; 18072 t.ccircumflex = 0x0109; 18073 t.ccurl = 0x0255; 18074 t.cdot = 0x010b; 18075 t.cdotaccent = 0x010b; 18076 t.cdsquare = 0x33c5; 18077 t.cedilla = 0x00b8; 18078 t.cedillacmb = 0x0327; 18079 t.cent = 0x00a2; 18080 t.centigrade = 0x2103; 18081 t.centinferior = 0xf6df; 18082 t.centmonospace = 0xffe0; 18083 t.centoldstyle = 0xf7a2; 18084 t.centsuperior = 0xf6e0; 18085 t.chaarmenian = 0x0579; 18086 t.chabengali = 0x099b; 18087 t.chadeva = 0x091b; 18088 t.chagujarati = 0x0a9b; 18089 t.chagurmukhi = 0x0a1b; 18090 t.chbopomofo = 0x3114; 18091 t.cheabkhasiancyrillic = 0x04bd; 18092 t.checkmark = 0x2713; 18093 t.checyrillic = 0x0447; 18094 t.chedescenderabkhasiancyrillic = 0x04bf; 18095 t.chedescendercyrillic = 0x04b7; 18096 t.chedieresiscyrillic = 0x04f5; 18097 t.cheharmenian = 0x0573; 18098 t.chekhakassiancyrillic = 0x04cc; 18099 t.cheverticalstrokecyrillic = 0x04b9; 18100 t.chi = 0x03c7; 18101 t.chieuchacirclekorean = 0x3277; 18102 t.chieuchaparenkorean = 0x3217; 18103 t.chieuchcirclekorean = 0x3269; 18104 t.chieuchkorean = 0x314a; 18105 t.chieuchparenkorean = 0x3209; 18106 t.chochangthai = 0x0e0a; 18107 t.chochanthai = 0x0e08; 18108 t.chochingthai = 0x0e09; 18109 t.chochoethai = 0x0e0c; 18110 t.chook = 0x0188; 18111 t.cieucacirclekorean = 0x3276; 18112 t.cieucaparenkorean = 0x3216; 18113 t.cieuccirclekorean = 0x3268; 18114 t.cieuckorean = 0x3148; 18115 t.cieucparenkorean = 0x3208; 18116 t.cieucuparenkorean = 0x321c; 18117 t.circle = 0x25cb; 18118 t.circlecopyrt = 0x00a9; 18119 t.circlemultiply = 0x2297; 18120 t.circleot = 0x2299; 18121 t.circleplus = 0x2295; 18122 t.circlepostalmark = 0x3036; 18123 t.circlewithlefthalfblack = 0x25d0; 18124 t.circlewithrighthalfblack = 0x25d1; 18125 t.circumflex = 0x02c6; 18126 t.circumflexbelowcmb = 0x032d; 18127 t.circumflexcmb = 0x0302; 18128 t.clear = 0x2327; 18129 t.clickalveolar = 0x01c2; 18130 t.clickdental = 0x01c0; 18131 t.clicklateral = 0x01c1; 18132 t.clickretroflex = 0x01c3; 18133 t.club = 0x2663; 18134 t.clubsuitblack = 0x2663; 18135 t.clubsuitwhite = 0x2667; 18136 t.cmcubedsquare = 0x33a4; 18137 t.cmonospace = 0xff43; 18138 t.cmsquaredsquare = 0x33a0; 18139 t.coarmenian = 0x0581; 18140 t.colon = 0x003a; 18141 t.colonmonetary = 0x20a1; 18142 t.colonmonospace = 0xff1a; 18143 t.colonsign = 0x20a1; 18144 t.colonsmall = 0xfe55; 18145 t.colontriangularhalfmod = 0x02d1; 18146 t.colontriangularmod = 0x02d0; 18147 t.comma = 0x002c; 18148 t.commaabovecmb = 0x0313; 18149 t.commaaboverightcmb = 0x0315; 18150 t.commaaccent = 0xf6c3; 18151 t.commaarabic = 0x060c; 18152 t.commaarmenian = 0x055d; 18153 t.commainferior = 0xf6e1; 18154 t.commamonospace = 0xff0c; 18155 t.commareversedabovecmb = 0x0314; 18156 t.commareversedmod = 0x02bd; 18157 t.commasmall = 0xfe50; 18158 t.commasuperior = 0xf6e2; 18159 t.commaturnedabovecmb = 0x0312; 18160 t.commaturnedmod = 0x02bb; 18161 t.compass = 0x263c; 18162 t.congruent = 0x2245; 18163 t.contourintegral = 0x222e; 18164 t.control = 0x2303; 18165 t.controlACK = 0x0006; 18166 t.controlBEL = 0x0007; 18167 t.controlBS = 0x0008; 18168 t.controlCAN = 0x0018; 18169 t.controlCR = 0x000d; 18170 t.controlDC1 = 0x0011; 18171 t.controlDC2 = 0x0012; 18172 t.controlDC3 = 0x0013; 18173 t.controlDC4 = 0x0014; 18174 t.controlDEL = 0x007f; 18175 t.controlDLE = 0x0010; 18176 t.controlEM = 0x0019; 18177 t.controlENQ = 0x0005; 18178 t.controlEOT = 0x0004; 18179 t.controlESC = 0x001b; 18180 t.controlETB = 0x0017; 18181 t.controlETX = 0x0003; 18182 t.controlFF = 0x000c; 18183 t.controlFS = 0x001c; 18184 t.controlGS = 0x001d; 18185 t.controlHT = 0x0009; 18186 t.controlLF = 0x000a; 18187 t.controlNAK = 0x0015; 18188 t.controlNULL = 0x0000; 18189 t.controlRS = 0x001e; 18190 t.controlSI = 0x000f; 18191 t.controlSO = 0x000e; 18192 t.controlSOT = 0x0002; 18193 t.controlSTX = 0x0001; 18194 t.controlSUB = 0x001a; 18195 t.controlSYN = 0x0016; 18196 t.controlUS = 0x001f; 18197 t.controlVT = 0x000b; 18198 t.copyright = 0x00a9; 18199 t.copyrightsans = 0xf8e9; 18200 t.copyrightserif = 0xf6d9; 18201 t.cornerbracketleft = 0x300c; 18202 t.cornerbracketlefthalfwidth = 0xff62; 18203 t.cornerbracketleftvertical = 0xfe41; 18204 t.cornerbracketright = 0x300d; 18205 t.cornerbracketrighthalfwidth = 0xff63; 18206 t.cornerbracketrightvertical = 0xfe42; 18207 t.corporationsquare = 0x337f; 18208 t.cosquare = 0x33c7; 18209 t.coverkgsquare = 0x33c6; 18210 t.cparen = 0x249e; 18211 t.cruzeiro = 0x20a2; 18212 t.cstretched = 0x0297; 18213 t.curlyand = 0x22cf; 18214 t.curlyor = 0x22ce; 18215 t.currency = 0x00a4; 18216 t.cyrBreve = 0xf6d1; 18217 t.cyrFlex = 0xf6d2; 18218 t.cyrbreve = 0xf6d4; 18219 t.cyrflex = 0xf6d5; 18220 t.d = 0x0064; 18221 t.daarmenian = 0x0564; 18222 t.dabengali = 0x09a6; 18223 t.dadarabic = 0x0636; 18224 t.dadeva = 0x0926; 18225 t.dadfinalarabic = 0xfebe; 18226 t.dadinitialarabic = 0xfebf; 18227 t.dadmedialarabic = 0xfec0; 18228 t.dagesh = 0x05bc; 18229 t.dageshhebrew = 0x05bc; 18230 t.dagger = 0x2020; 18231 t.daggerdbl = 0x2021; 18232 t.dagujarati = 0x0aa6; 18233 t.dagurmukhi = 0x0a26; 18234 t.dahiragana = 0x3060; 18235 t.dakatakana = 0x30c0; 18236 t.dalarabic = 0x062f; 18237 t.dalet = 0x05d3; 18238 t.daletdagesh = 0xfb33; 18239 t.daletdageshhebrew = 0xfb33; 18240 t.dalethebrew = 0x05d3; 18241 t.dalfinalarabic = 0xfeaa; 18242 t.dammaarabic = 0x064f; 18243 t.dammalowarabic = 0x064f; 18244 t.dammatanaltonearabic = 0x064c; 18245 t.dammatanarabic = 0x064c; 18246 t.danda = 0x0964; 18247 t.dargahebrew = 0x05a7; 18248 t.dargalefthebrew = 0x05a7; 18249 t.dasiapneumatacyrilliccmb = 0x0485; 18250 t.dblGrave = 0xf6d3; 18251 t.dblanglebracketleft = 0x300a; 18252 t.dblanglebracketleftvertical = 0xfe3d; 18253 t.dblanglebracketright = 0x300b; 18254 t.dblanglebracketrightvertical = 0xfe3e; 18255 t.dblarchinvertedbelowcmb = 0x032b; 18256 t.dblarrowleft = 0x21d4; 18257 t.dblarrowright = 0x21d2; 18258 t.dbldanda = 0x0965; 18259 t.dblgrave = 0xf6d6; 18260 t.dblgravecmb = 0x030f; 18261 t.dblintegral = 0x222c; 18262 t.dbllowline = 0x2017; 18263 t.dbllowlinecmb = 0x0333; 18264 t.dbloverlinecmb = 0x033f; 18265 t.dblprimemod = 0x02ba; 18266 t.dblverticalbar = 0x2016; 18267 t.dblverticallineabovecmb = 0x030e; 18268 t.dbopomofo = 0x3109; 18269 t.dbsquare = 0x33c8; 18270 t.dcaron = 0x010f; 18271 t.dcedilla = 0x1e11; 18272 t.dcircle = 0x24d3; 18273 t.dcircumflexbelow = 0x1e13; 18274 t.dcroat = 0x0111; 18275 t.ddabengali = 0x09a1; 18276 t.ddadeva = 0x0921; 18277 t.ddagujarati = 0x0aa1; 18278 t.ddagurmukhi = 0x0a21; 18279 t.ddalarabic = 0x0688; 18280 t.ddalfinalarabic = 0xfb89; 18281 t.dddhadeva = 0x095c; 18282 t.ddhabengali = 0x09a2; 18283 t.ddhadeva = 0x0922; 18284 t.ddhagujarati = 0x0aa2; 18285 t.ddhagurmukhi = 0x0a22; 18286 t.ddotaccent = 0x1e0b; 18287 t.ddotbelow = 0x1e0d; 18288 t.decimalseparatorarabic = 0x066b; 18289 t.decimalseparatorpersian = 0x066b; 18290 t.decyrillic = 0x0434; 18291 t.degree = 0x00b0; 18292 t.dehihebrew = 0x05ad; 18293 t.dehiragana = 0x3067; 18294 t.deicoptic = 0x03ef; 18295 t.dekatakana = 0x30c7; 18296 t.deleteleft = 0x232b; 18297 t.deleteright = 0x2326; 18298 t.delta = 0x03b4; 18299 t.deltaturned = 0x018d; 18300 t.denominatorminusonenumeratorbengali = 0x09f8; 18301 t.dezh = 0x02a4; 18302 t.dhabengali = 0x09a7; 18303 t.dhadeva = 0x0927; 18304 t.dhagujarati = 0x0aa7; 18305 t.dhagurmukhi = 0x0a27; 18306 t.dhook = 0x0257; 18307 t.dialytikatonos = 0x0385; 18308 t.dialytikatonoscmb = 0x0344;
18309 t.diamond = 0x2666; 18310 t.diamondsuitwhite = 0x2662; 18311 t.dieresis = 0x00a8; 18312 t.dieresisacute = 0xf6d7; 18313 t.dieresisbelowcmb = 0x0324; 18314 t.dieresiscmb = 0x0308; 18315 t.dieresisgrave = 0xf6d8; 18316 t.dieresistonos = 0x0385; 18317 t.dihiragana = 0x3062; 18318 t.dikatakana = 0x30c2; 18319 t.dittomark = 0x3003; 18320 t.divide = 0x00f7; 18321 t.divides = 0x2223; 18322 t.divisionslash = 0x2215; 18323 t.djecyrillic = 0x0452; 18324 t.dkshade = 0x2593; 18325 t.dlinebelow = 0x1e0f; 18326 t.dlsquare = 0x3397; 18327 t.dmacron = 0x0111; 18328 t.dmonospace = 0xff44; 18329 t.dnblock = 0x2584; 18330 t.dochadathai = 0x0e0e; 18331 t.dodekthai = 0x0e14; 18332 t.dohiragana = 0x3069; 18333 t.dokatakana = 0x30c9; 18334 t.dollar = 0x0024; 18335 t.dollarinferior = 0xf6e3; 18336 t.dollarmonospace = 0xff04; 18337 t.dollaroldstyle = 0xf724; 18338 t.dollarsmall = 0xfe69; 18339 t.dollarsuperior = 0xf6e4; 18340 t.dong = 0x20ab; 18341 t.dorusquare = 0x3326; 18342 t.dotaccent = 0x02d9; 18343 t.dotaccentcmb = 0x0307; 18344 t.dotbelowcmb = 0x0323; 18345 t.dotbelowcomb = 0x0323; 18346 t.dotkatakana = 0x30fb; 18347 t.dotlessi = 0x0131; 18348 t.dotlessj = 0xf6be; 18349 t.dotlessjstrokehook = 0x0284; 18350 t.dotmath = 0x22c5; 18351 t.dottedcircle = 0x25cc; 18352 t.doubleyodpatah = 0xfb1f; 18353 t.doubleyodpatahhebrew = 0xfb1f; 18354 t.downtackbelowcmb = 0x031e; 18355 t.downtackmod = 0x02d5; 18356 t.dparen = 0x249f; 18357 t.dsuperior = 0xf6eb; 18358 t.dtail = 0x0256; 18359 t.dtopbar = 0x018c; 18360 t.duhiragana = 0x3065; 18361 t.dukatakana = 0x30c5; 18362 t.dz = 0x01f3; 18363 t.dzaltone = 0x02a3; 18364 t.dzcaron = 0x01c6; 18365 t.dzcurl = 0x02a5; 18366 t.dzeabkhasiancyrillic = 0x04e1; 18367 t.dzecyrillic = 0x0455; 18368 t.dzhecyrillic = 0x045f; 18369 t.e = 0x0065; 18370 t.eacute = 0x00e9; 18371 t.earth = 0x2641; 18372 t.ebengali = 0x098f; 18373 t.ebopomofo = 0x311c; 18374 t.ebreve = 0x0115; 18375 t.ecandradeva = 0x090d; 18376 t.ecandragujarati = 0x0a8d; 18377 t.ecandravowelsigndeva = 0x0945; 18378 t.ecandravowelsigngujarati = 0x0ac5; 18379 t.ecaron = 0x011b; 18380 t.ecedillabreve = 0x1e1d; 18381 t.echarmenian = 0x0565; 18382 t.echyiwnarmenian = 0x0587; 18383 t.ecircle = 0x24d4; 18384 t.ecircumflex = 0x00ea; 18385 t.ecircumflexacute = 0x1ebf; 18386 t.ecircumflexbelow = 0x1e19; 18387 t.ecircumflexdotbelow = 0x1ec7; 18388 t.ecircumflexgrave = 0x1ec1; 18389 t.ecircumflexhookabove = 0x1ec3; 18390 t.ecircumflextilde = 0x1ec5; 18391 t.ecyrillic = 0x0454; 18392 t.edblgrave = 0x0205; 18393 t.edeva = 0x090f; 18394 t.edieresis = 0x00eb; 18395 t.edot = 0x0117; 18396 t.edotaccent = 0x0117; 18397 t.edotbelow = 0x1eb9; 18398 t.eegurmukhi = 0x0a0f; 18399 t.eematragurmukhi = 0x0a47; 18400 t.efcyrillic = 0x0444; 18401 t.egrave = 0x00e8; 18402 t.egujarati = 0x0a8f; 18403 t.eharmenian = 0x0567; 18404 t.ehbopomofo = 0x311d; 18405 t.ehiragana = 0x3048; 18406 t.ehookabove = 0x1ebb; 18407 t.eibopomofo = 0x311f; 18408 t.eight = 0x0038; 18409 t.eightarabic = 0x0668; 18410 t.eightbengali = 0x09ee; 18411 t.eightcircle = 0x2467; 18412 t.eightcircleinversesansserif = 0x2791; 18413 t.eightdeva = 0x096e; 18414 t.eighteencircle = 0x2471; 18415 t.eighteenparen = 0x2485; 18416 t.eighteenperiod = 0x2499; 18417 t.eightgujarati = 0x0aee; 18418 t.eightgurmukhi = 0x0a6e; 18419 t.eighthackarabic = 0x0668; 18420 t.eighthangzhou = 0x3028; 18421 t.eighthnotebeamed = 0x266b; 18422 t.eightideographicparen = 0x3227; 18423 t.eightinferior = 0x2088; 18424 t.eightmonospace = 0xff18; 18425 t.eightoldstyle = 0xf738; 18426 t.eightparen = 0x247b; 18427 t.eightperiod = 0x248f; 18428 t.eightpersian = 0x06f8; 18429 t.eightroman = 0x2177; 18430 t.eightsuperior = 0x2078; 18431 t.eightthai = 0x0e58; 18432 t.einvertedbreve = 0x0207; 18433 t.eiotifiedcyrillic = 0x0465; 18434 t.ekatakana = 0x30a8; 18435 t.ekatakanahalfwidth = 0xff74; 18436 t.ekonkargurmukhi = 0x0a74; 18437 t.ekorean = 0x3154; 18438 t.elcyrillic = 0x043b; 18439 t.element = 0x2208; 18440 t.elevencircle = 0x246a; 18441 t.elevenparen = 0x247e; 18442 t.elevenperiod = 0x2492; 18443 t.elevenroman = 0x217a; 18444 t.ellipsis = 0x2026; 18445 t.ellipsisvertical = 0x22ee; 18446 t.emacron = 0x0113; 18447 t.emacronacute = 0x1e17; 18448 t.emacrongrave = 0x1e15; 18449 t.emcyrillic = 0x043c; 18450 t.emdash = 0x2014; 18451 t.emdashvertical = 0xfe31; 18452 t.emonospace = 0xff45; 18453 t.emphasismarkarmenian = 0x055b; 18454 t.emptyset = 0x2205; 18455 t.enbopomofo = 0x3123; 18456 t.encyrillic = 0x043d; 18457 t.endash = 0x2013; 18458 t.endashvertical = 0xfe32; 18459 t.endescendercyrillic = 0x04a3; 18460 t.eng = 0x014b; 18461 t.engbopomofo = 0x3125; 18462 t.enghecyrillic = 0x04a5; 18463 t.enhookcyrillic = 0x04c8; 18464 t.enspace = 0x2002; 18465 t.eogonek = 0x0119; 18466 t.eokorean = 0x3153; 18467 t.eopen = 0x025b; 18468 t.eopenclosed = 0x029a; 18469 t.eopenreversed = 0x025c; 18470 t.eopenreversedclosed = 0x025e; 18471 t.eopenreversedhook = 0x025d; 18472 t.eparen = 0x24a0; 18473 t.epsilon = 0x03b5; 18474 t.epsilontonos = 0x03ad; 18475 t.equal = 0x003d; 18476 t.equalmonospace = 0xff1d; 18477 t.equalsmall = 0xfe66; 18478 t.equalsuperior = 0x207c; 18479 t.equivalence = 0x2261; 18480 t.erbopomofo = 0x3126; 18481 t.ercyrillic = 0x0440; 18482 t.ereversed = 0x0258; 18483 t.ereversedcyrillic = 0x044d; 18484 t.escyrillic = 0x0441; 18485 t.esdescendercyrillic = 0x04ab; 18486 t.esh = 0x0283; 18487 t.eshcurl = 0x0286; 18488 t.eshortdeva = 0x090e; 18489 t.eshortvowelsigndeva = 0x0946; 18490 t.eshreversedloop = 0x01aa; 18491 t.eshsquatreversed = 0x0285; 18492 t.esmallhiragana = 0x3047; 18493 t.esmallkatakana = 0x30a7; 18494 t.esmallkatakanahalfwidth = 0xff6a; 18495 t.estimated = 0x212e; 18496 t.esuperior = 0xf6ec; 18497 t.eta = 0x03b7; 18498 t.etarmenian = 0x0568; 18499 t.etatonos = 0x03ae; 18500 t.eth = 0x00f0; 18501 t.etilde = 0x1ebd; 18502 t.etildebelow = 0x1e1b; 18503 t.etnahtafoukhhebrew = 0x0591; 18504 t.etnahtafoukhlefthebrew = 0x0591; 18505 t.etnahtahebrew = 0x0591; 18506 t.etnahtalefthebrew = 0x0591; 18507 t.eturned = 0x01dd; 18508 t.eukorean = 0x3161; 18509 t.euro = 0x20ac; 18510 t.evowelsignbengali = 0x09c7; 18511 t.evowelsigndeva = 0x0947; 18512 t.evowelsigngujarati = 0x0ac7; 18513 t.exclam = 0x0021; 18514 t.exclamarmenian = 0x055c; 18515 t.exclamdbl = 0x203c; 18516 t.exclamdown = 0x00a1; 18517 t.exclamdownsmall = 0xf7a1; 18518 t.exclammonospace = 0xff01; 18519 t.exclamsmall = 0xf721; 18520 t.existential = 0x2203; 18521 t.ezh = 0x0292; 18522 t.ezhcaron = 0x01ef; 18523 t.ezhcurl = 0x0293; 18524 t.ezhreversed = 0x01b9; 18525 t.ezhtail = 0x01ba; 18526 t.f = 0x0066; 18527 t.fadeva = 0x095e; 18528 t.fagurmukhi = 0x0a5e; 18529 t.fahrenheit = 0x2109; 18530 t.fathaarabic = 0x064e; 18531 t.fathalowarabic = 0x064e; 18532 t.fathatanarabic = 0x064b; 18533 t.fbopomofo = 0x3108; 18534 t.fcircle = 0x24d5; 18535 t.fdotaccent = 0x1e1f; 18536 t.feharabic = 0x0641; 18537 t.feharmenian = 0x0586; 18538 t.fehfinalarabic = 0xfed2; 18539 t.fehinitialarabic = 0xfed3; 18540 t.fehmedialarabic = 0xfed4; 18541 t.feicoptic = 0x03e5; 18542 t.female = 0x2640; 18543 t.ff = 0xfb00; 18544 t.f_f = 0xfb00; 18545 t.ffi = 0xfb03; 18546 t.f_f_i = 0xfb03; 18547 t.ffl = 0xfb04; 18548 t.f_f_l = 0xfb04; 18549 t.fi = 0xfb01; 18550 t.f_i = 0xfb01; 18551 t.fifteencircle = 0x246e; 18552 t.fifteenparen = 0x2482; 18553 t.fifteenperiod = 0x2496; 18554 t.figuredash = 0x2012; 18555 t.filledbox = 0x25a0; 18556 t.filledrect = 0x25ac; 18557 t.finalkaf = 0x05da; 18558 t.finalkafdagesh = 0xfb3a; 18559 t.finalkafdageshhebrew = 0xfb3a; 18560 t.finalkafhebrew = 0x05da; 18561 t.finalmem = 0x05dd; 18562 t.finalmemhebrew = 0x05dd; 18563 t.finalnun = 0x05df; 18564 t.finalnunhebrew = 0x05df; 18565 t.finalpe = 0x05e3; 18566 t.finalpehebrew = 0x05e3; 18567 t.finaltsadi = 0x05e5; 18568 t.finaltsadihebrew = 0x05e5; 18569 t.firsttonechinese = 0x02c9; 18570 t.fisheye = 0x25c9; 18571 t.fitacyrillic = 0x0473; 18572 t.five = 0x0035; 18573 t.fivearabic = 0x0665; 18574 t.fivebengali = 0x09eb; 18575 t.fivecircle = 0x2464; 18576 t.fivecircleinversesansserif = 0x278e; 18577 t.fivedeva = 0x096b; 18578 t.fiveeighths = 0x215d; 18579 t.fivegujarati = 0x0aeb; 18580 t.fivegurmukhi = 0x0a6b; 18581 t.fivehackarabic = 0x0665; 18582 t.fivehangzhou = 0x3025; 18583 t.fiveideographicparen = 0x3224; 18584 t.fiveinferior = 0x2085; 18585 t.fivemonospace = 0xff15; 18586 t.fiveoldstyle = 0xf735; 18587 t.fiveparen = 0x2478; 18588 t.fiveperiod = 0x248c; 18589 t.fivepersian = 0x06f5; 18590 t.fiveroman = 0x2174; 18591 t.fivesuperior = 0x2075; 18592 t.fivethai = 0x0e55; 18593 t.fl = 0xfb02; 18594 t.f_l = 0xfb02; 18595 t.florin = 0x0192; 18596 t.fmonospace = 0xff46; 18597 t.fmsquare = 0x3399; 18598 t.fofanthai = 0x0e1f; 18599 t.fofathai = 0x0e1d; 18600 t.fongmanthai = 0x0e4f; 18601 t.forall = 0x2200; 18602 t.four = 0x0034; 18603 t.fourarabic = 0x0664; 18604 t.fourbengali = 0x09ea;
18605 t.fourcircle = 0x2463; 18606 t.fourcircleinversesansserif = 0x278d; 18607 t.fourdeva = 0x096a; 18608 t.fourgujarati = 0x0aea; 18609 t.fourgurmukhi = 0x0a6a; 18610 t.fourhackarabic = 0x0664; 18611 t.fourhangzhou = 0x3024; 18612 t.fourideographicparen = 0x3223; 18613 t.fourinferior = 0x2084; 18614 t.fourmonospace = 0xff14; 18615 t.fournumeratorbengali = 0x09f7; 18616 t.fouroldstyle = 0xf734; 18617 t.fourparen = 0x2477; 18618 t.fourperiod = 0x248b; 18619 t.fourpersian = 0x06f4; 18620 t.fourroman = 0x2173; 18621 t.foursuperior = 0x2074; 18622 t.fourteencircle = 0x246d; 18623 t.fourteenparen = 0x2481; 18624 t.fourteenperiod = 0x2495; 18625 t.fourthai = 0x0e54; 18626 t.fourthtonechinese = 0x02cb; 18627 t.fparen = 0x24a1; 18628 t.fraction = 0x2044; 18629 t.franc = 0x20a3; 18630 t.g = 0x0067; 18631 t.gabengali = 0x0997; 18632 t.gacute = 0x01f5; 18633 t.gadeva = 0x0917; 18634 t.gafarabic = 0x06af; 18635 t.gaffinalarabic = 0xfb93; 18636 t.gafinitialarabic = 0xfb94; 18637 t.gafmedialarabic = 0xfb95; 18638 t.gagujarati = 0x0a97; 18639 t.gagurmukhi = 0x0a17; 18640 t.gahiragana = 0x304c; 18641 t.gakatakana = 0x30ac; 18642 t.gamma = 0x03b3; 18643 t.gammalatinsmall = 0x0263; 18644 t.gammasuperior = 0x02e0; 18645 t.gangiacoptic = 0x03eb; 18646 t.gbopomofo = 0x310d; 18647 t.gbreve = 0x011f; 18648 t.gcaron = 0x01e7; 18649 t.gcedilla = 0x0123; 18650 t.gcircle = 0x24d6; 18651 t.gcircumflex = 0x011d; 18652 t.gcommaaccent = 0x0123; 18653 t.gdot = 0x0121; 18654 t.gdotaccent = 0x0121; 18655 t.gecyrillic = 0x0433; 18656 t.gehiragana = 0x3052; 18657 t.gekatakana = 0x30b2; 18658 t.geometricallyequal = 0x2251; 18659 t.gereshaccenthebrew = 0x059c; 18660 t.gereshhebrew = 0x05f3; 18661 t.gereshmuqdamhebrew = 0x059d; 18662 t.germandbls = 0x00df; 18663 t.gershayimaccenthebrew = 0x059e; 18664 t.gershayimhebrew = 0x05f4; 18665 t.getamark = 0x3013; 18666 t.ghabengali = 0x0998; 18667 t.ghadarmenian = 0x0572; 18668 t.ghadeva = 0x0918; 18669 t.ghagujarati = 0x0a98; 18670 t.ghagurmukhi = 0x0a18; 18671 t.ghainarabic = 0x063a; 18672 t.ghainfinalarabic = 0xfece; 18673 t.ghaininitialarabic = 0xfecf; 18674 t.ghainmedialarabic = 0xfed0; 18675 t.ghemiddlehookcyrillic = 0x0495; 18676 t.ghestrokecyrillic = 0x0493; 18677 t.gheupturncyrillic = 0x0491; 18678 t.ghhadeva = 0x095a; 18679 t.ghhagurmukhi = 0x0a5a; 18680 t.ghook = 0x0260; 18681 t.ghzsquare = 0x3393; 18682 t.gihiragana = 0x304e; 18683 t.gikatakana = 0x30ae; 18684 t.gimarmenian = 0x0563;
18685 t.gimel = 0x05d2; 18686 t.gimeldagesh = 0xfb32; 18687 t.gimeldageshhebrew = 0xfb32; 18688 t.gimelhebrew = 0x05d2; 18689 t.gjecyrillic = 0x0453; 18690 t.glottalinvertedstroke = 0x01be; 18691 t.glottalstop = 0x0294; 18692 t.glottalstopinverted = 0x0296; 18693 t.glottalstopmod = 0x02c0; 18694 t.glottalstopreversed = 0x0295; 18695 t.glottalstopreversedmod = 0x02c1; 18696 t.glottalstopreversedsuperior = 0x02e4; 18697 t.glottalstopstroke = 0x02a1; 18698 t.glottalstopstrokereversed = 0x02a2; 18699 t.gmacron = 0x1e21; 18700 t.gmonospace = 0xff47; 18701 t.gohiragana = 0x3054; 18702 t.gokatakana = 0x30b4; 18703 t.gparen = 0x24a2; 18704 t.gpasquare = 0x33ac; 18705 t.gradient = 0x2207; 18706 t.grave = 0x0060; 18707 t.gravebelowcmb = 0x0316; 18708 t.gravecmb = 0x0300; 18709 t.gravecomb = 0x0300; 18710 t.gravedeva = 0x0953; 18711 t.gravelowmod = 0x02ce; 18712 t.gravemonospace = 0xff40; 18713 t.gravetonecmb = 0x0340; 18714 t.greater = 0x003e; 18715 t.greaterequal = 0x2265; 18716 t.greaterequalorless = 0x22db; 18717 t.greatermonospace = 0xff1e; 18718 t.greaterorequivalent = 0x2273; 18719 t.greaterorless = 0x2277; 18720 t.greateroverequal = 0x2267; 18721 t.greatersmall = 0xfe65; 18722 t.gscript = 0x0261; 18723 t.gstroke = 0x01e5; 18724 t.guhiragana = 0x3050; 18725 t.guillemotleft = 0x00ab; 18726 t.guillemotright = 0x00bb; 18727 t.guilsinglleft = 0x2039; 18728 t.guilsinglright = 0x203a; 18729 t.gukatakana = 0x30b0; 18730 t.guramusquare = 0x3318; 18731 t.gysquare = 0x33c9; 18732 t.h = 0x0068; 18733 t.haabkhasiancyrillic = 0x04a9; 18734 t.haaltonearabic = 0x06c1; 18735 t.habengali = 0x09b9; 18736 t.hadescendercyrillic = 0x04b3; 18737 t.hadeva = 0x0939; 18738 t.hagujarati = 0x0ab9; 18739 t.hagurmukhi = 0x0a39; 18740 t.haharabic = 0x062d; 18741 t.hahfinalarabic = 0xfea2; 18742 t.hahinitialarabic = 0xfea3; 18743 t.hahiragana = 0x306f; 18744 t.hahmedialarabic = 0xfea4; 18745 t.haitusquare = 0x332a; 18746 t.hakatakana = 0x30cf; 18747 t.hakatakanahalfwidth = 0xff8a; 18748 t.halantgurmukhi = 0x0a4d; 18749 t.hamzaarabic = 0x0621; 18750 t.hamzalowarabic = 0x0621; 18751 t.hangulfiller = 0x3164; 18752 t.hardsigncyrillic = 0x044a; 18753 t.harpoonleftbarbup = 0x21bc; 18754 t.harpoonrightbarbup = 0x21c0; 18755 t.hasquare = 0x33ca; 18756 t.hatafpatah = 0x05b2; 18757 t.hatafpatah16 = 0x05b2; 18758 t.hatafpatah23 = 0x05b2; 18759 t.hatafpatah2f = 0x05b2; 18760 t.hatafpatahhebrew = 0x05b2; 18761 t.hatafpatahnarrowhebrew = 0x05b2; 18762 t.hatafpatahquarterhebrew = 0x05b2; 18763 t.hatafpatahwidehebrew = 0x05b2; 18764 t.hatafqamats = 0x05b3; 18765 t.hatafqamats1b = 0x05b3; 18766 t.hatafqamats28 = 0x05b3; 18767 t.hatafqamats34 = 0x05b3; 18768 t.hatafqamatshebrew = 0x05b3; 18769 t.hatafqamatsnarrowhebrew = 0x05b3; 18770 t.hatafqamatsquarterhebrew = 0x05b3; 18771 t.hatafqamatswidehebrew = 0x05b3; 18772 t.hatafsegol = 0x05b1; 18773 t.hatafsegol17 = 0x05b1; 18774 t.hatafsegol24 = 0x05b1; 18775 t.hatafsegol30 = 0x05b1; 18776 t.hatafsegolhebrew = 0x05b1; 18777 t.hatafsegolnarrowhebrew = 0x05b1; 18778 t.hatafsegolquarterhebrew = 0x05b1; 18779 t.hatafsegolwidehebrew = 0x05b1; 18780 t.hbar = 0x0127; 18781 t.hbopomofo = 0x310f; 18782 t.hbrevebelow = 0x1e2b; 18783 t.hcedilla = 0x1e29; 18784 t.hcircle = 0x24d7; 18785 t.hcircumflex = 0x0125; 18786 t.hdieresis = 0x1e27; 18787 t.hdotaccent = 0x1e23; 18788 t.hdotbelow = 0x1e25; 18789 t.he = 0x05d4; 18790 t.heart = 0x2665; 18791 t.heartsuitblack = 0x2665; 18792 t.heartsuitwhite = 0x2661; 18793 t.hedagesh = 0xfb34; 18794 t.hedageshhebrew = 0xfb34; 18795 t.hehaltonearabic = 0x06c1; 18796 t.heharabic = 0x0647; 18797 t.hehebrew = 0x05d4; 18798 t.hehfinalaltonearabic = 0xfba7; 18799 t.hehfinalalttwoarabic = 0xfeea; 18800 t.hehfinalarabic = 0xfeea; 18801 t.hehhamzaabovefinalarabic = 0xfba5; 18802 t.hehhamzaaboveisolatedarabic = 0xfba4; 18803 t.hehinitialaltonearabic = 0xfba8; 18804 t.hehinitialarabic = 0xfeeb; 18805 t.hehiragana = 0x3078; 18806 t.hehmedialaltonearabic = 0xfba9; 18807 t.hehmedialarabic = 0xfeec; 18808 t.heiseierasquare = 0x337b; 18809 t.hekatakana = 0x30d8; 18810 t.hekatakanahalfwidth = 0xff8d; 18811 t.hekutaarusquare = 0x3336; 18812 t.henghook = 0x0267; 18813 t.herutusquare = 0x3339; 18814 t.het = 0x05d7; 18815 t.hethebrew = 0x05d7; 18816 t.hhook = 0x0266; 18817 t.hhooksuperior = 0x02b1; 18818 t.hieuhacirclekorean = 0x327b; 18819 t.hieuhaparenkorean = 0x321b; 18820 t.hieuhcirclekorean = 0x326d; 18821 t.hieuhkorean = 0x314e; 18822 t.hieuhparenkorean = 0x320d; 18823 t.hihiragana = 0x3072; 18824 t.hikatakana = 0x30d2; 18825 t.hikatakanahalfwidth = 0xff8b; 18826 t.hiriq = 0x05b4; 18827 t.hiriq14 = 0x05b4; 18828 t.hiriq21 = 0x05b4; 18829 t.hiriq2d = 0x05b4; 18830 t.hiriqhebrew = 0x05b4; 18831 t.hiriqnarrowhebrew = 0x05b4; 18832 t.hiriqquarterhebrew = 0x05b4; 18833 t.hiriqwidehebrew = 0x05b4; 18834 t.hlinebelow = 0x1e96; 18835 t.hmonospace = 0xff48; 18836 t.hoarmenian = 0x0570; 18837 t.hohipthai = 0x0e2b; 18838 t.hohiragana = 0x307b; 18839 t.hokatakana = 0x30db; 18840 t.hokatakanahalfwidth = 0xff8e; 18841 t.holam = 0x05b9; 18842 t.holam19 = 0x05b9; 18843 t.holam26 = 0x05b9; 18844 t.holam32 = 0x05b9; 18845 t.holamhebrew = 0x05b9; 18846 t.holamnarrowhebrew = 0x05b9; 18847 t.holamquarterhebrew = 0x05b9; 18848 t.holamwidehebrew = 0x05b9; 18849 t.honokhukthai = 0x0e2e; 18850 t.hookabovecomb = 0x0309; 18851 t.hookcmb = 0x0309; 18852 t.hookpalatalizedbelowcmb = 0x0321; 18853 t.hookretroflexbelowcmb = 0x0322; 18854 t.hoonsquare = 0x3342; 18855 t.horicoptic = 0x03e9; 18856 t.horizontalbar = 0x2015; 18857 t.horncmb = 0x031b; 18858 t.hotsprings = 0x2668; 18859 t.house = 0x2302; 18860 t.hparen = 0x24a3; 18861 t.hsuperior = 0x02b0; 18862 t.hturned = 0x0265; 18863 t.huhiragana = 0x3075; 18864 t.huiitosquare = 0x3333; 18865 t.hukatakana = 0x30d5; 18866 t.hukatakanahalfwidth = 0xff8c; 18867 t.hungarumlaut = 0x02dd; 18868 t.hungarumlautcmb = 0x030b; 18869 t.hv = 0x0195; 18870 t.hyphen = 0x002d; 18871 t.hypheninferior = 0xf6e5; 18872 t.hyphenmonospace = 0xff0d; 18873 t.hyphensmall = 0xfe63; 18874 t.hyphensuperior = 0xf6e6; 18875 t.hyphentwo = 0x2010; 18876 t.i = 0x0069; 18877 t.iacute = 0x00ed; 18878 t.iacyrillic = 0x044f; 18879 t.ibengali = 0x0987; 18880 t.ibopomofo = 0x3127; 18881 t.ibreve = 0x012d; 18882 t.icaron = 0x01d0; 18883 t.icircle = 0x24d8; 18884 t.icircumflex = 0x00ee; 18885 t.icyrillic = 0x0456; 18886 t.idblgrave = 0x0209; 18887 t.ideographearthcircle = 0x328f; 18888 t.ideographfirecircle = 0x328b; 18889 t.ideographicallianceparen = 0x323f; 18890 t.ideographiccallparen = 0x323a; 18891 t.ideographiccentrecircle = 0x32a5; 18892 t.ideographicclose = 0x3006; 18893 t.ideographiccomma = 0x3001; 18894 t.ideographiccommaleft = 0xff64; 18895 t.ideographiccongratulationparen = 0x3237; 18896 t.ideographiccorrectcircle = 0x32a3; 18897 t.ideographicearthparen = 0x322f; 18898 t.ideographicenterpriseparen = 0x323d; 18899 t.ideographicexcellentcircle = 0x329d; 18900 t.ideographicfestivalparen = 0x3240; 18901 t.ideographicfinancialcircle = 0x3296; 18902 t.ideographicfinancialparen = 0x3236; 18903 t.ideographicfireparen = 0x322b; 18904 t.ideographichaveparen = 0x3232; 18905 t.ideographichighcircle = 0x32a4; 18906 t.ideographiciterationmark = 0x3005; 18907 t.ideographiclaborcircle = 0x3298; 18908 t.ideographiclaborparen = 0x3238; 18909 t.ideographicleftcircle = 0x32a7; 18910 t.ideographiclowcircle = 0x32a6; 18911 t.ideographicmedicinecircle = 0x32a9; 18912 t.ideographicmetalparen = 0x322e; 18913 t.ideographicmoonparen = 0x322a; 18914 t.ideographicnameparen = 0x3234; 18915 t.ideographicperiod = 0x3002; 18916 t.ideographicprintcircle = 0x329e; 18917 t.ideographicreachparen = 0x3243; 18918 t.ideographicrepresentparen = 0x3239; 18919 t.ideographicresourceparen = 0x323e; 18920 t.ideographicrightcircle = 0x32a8;
18921 t.ideographicsecretcircle = 0x3299; 18922 t.ideographicselfparen = 0x3242; 18923 t.ideographicsocietyparen = 0x3233; 18924 t.ideographicspace = 0x3000; 18925 t.ideographicspecialparen = 0x3235; 18926 t.ideographicstockparen = 0x3231; 18927 t.ideographicstudyparen = 0x323b; 18928 t.ideographicsunparen = 0x3230; 18929 t.ideographicsuperviseparen = 0x323c; 18930 t.ideographicwaterparen = 0x322c; 18931 t.ideographicwoodparen = 0x322d; 18932 t.ideographiczero = 0x3007; 18933 t.ideographmetalcircle = 0x328e; 18934 t.ideographmooncircle = 0x328a; 18935 t.ideographnamecircle = 0x3294; 18936 t.ideographsuncircle = 0x3290; 18937 t.ideographwatercircle = 0x328c; 18938 t.ideographwoodcircle = 0x328d; 18939 t.ideva = 0x0907; 18940 t.idieresis = 0x00ef; 18941 t.idieresisacute = 0x1e2f; 18942 t.idieresiscyrillic = 0x04e5; 18943 t.idotbelow = 0x1ecb; 18944 t.iebrevecyrillic = 0x04d7; 18945 t.iecyrillic = 0x0435; 18946 t.ieungacirclekorean = 0x3275; 18947 t.ieungaparenkorean = 0x3215; 18948 t.ieungcirclekorean = 0x3267; 18949 t.ieungkorean = 0x3147; 18950 t.ieungparenkorean = 0x3207; 18951 t.igrave = 0x00ec; 18952 t.igujarati = 0x0a87; 18953 t.igurmukhi = 0x0a07; 18954 t.ihiragana = 0x3044; 18955 t.ihookabove = 0x1ec9; 18956 t.iibengali = 0x0988; 18957 t.iicyrillic = 0x0438; 18958 t.iideva = 0x0908; 18959 t.iigujarati = 0x0a88; 18960 t.iigurmukhi = 0x0a08; 18961 t.iimatragurmukhi = 0x0a40; 18962 t.iinvertedbreve = 0x020b; 18963 t.iishortcyrillic = 0x0439; 18964 t.iivowelsignbengali = 0x09c0; 18965 t.iivowelsigndeva = 0x0940; 18966 t.iivowelsigngujarati = 0x0ac0; 18967 t.ij = 0x0133; 18968 t.ikatakana = 0x30a4; 18969 t.ikatakanahalfwidth = 0xff72; 18970 t.ikorean = 0x3163; 18971 t.ilde = 0x02dc; 18972 t.iluyhebrew = 0x05ac; 18973 t.imacron = 0x012b; 18974 t.imacroncyrillic = 0x04e3; 18975 t.imageorapproximatelyequal = 0x2253; 18976 t.imatragurmukhi = 0x0a3f; 18977 t.imonospace = 0xff49; 18978 t.increment = 0x2206; 18979 t.infinity = 0x221e; 18980 t.iniarmenian = 0x056b; 18981 t.integral = 0x222b; 18982 t.integralbottom = 0x2321; 18983 t.integralbt = 0x2321; 18984 t.integralex = 0xf8f5; 18985 t.integraltop = 0x2320; 18986 t.integraltp = 0x2320; 18987 t.intersection = 0x2229; 18988 t.intisquare = 0x3305; 18989 t.invbullet = 0x25d8; 18990 t.invcircle = 0x25d9; 18991 t.invsmileface = 0x263b; 18992 t.iocyrillic = 0x0451; 18993 t.iogonek = 0x012f; 18994 t.iota = 0x03b9; 18995 t.iotadieresis = 0x03ca; 18996 t.iotadieresistonos = 0x0390; 18997 t.iotalatin = 0x0269; 18998 t.iotatonos = 0x03af; 18999 t.iparen = 0x24a4; 19000 t.irigurmukhi = 0x0a72; 19001 t.ismallhiragana = 0x3043; 19002 t.ismallkatakana = 0x30a3; 19003 t.ismallkatakanahalfwidth = 0xff68; 19004 t.issharbengali = 0x09fa; 19005 t.istroke = 0x0268; 19006 t.isuperior = 0xf6ed; 19007 t.iterationhiragana = 0x309d; 19008 t.iterationkatakana = 0x30fd; 19009 t.itilde = 0x0129; 19010 t.itildebelow = 0x1e2d; 19011 t.iubopomofo = 0x3129; 19012 t.iucyrillic = 0x044e; 19013 t.ivowelsignbengali = 0x09bf; 19014 t.ivowelsigndeva = 0x093f; 19015 t.ivowelsigngujarati = 0x0abf; 19016 t.izhitsacyrillic = 0x0475; 19017 t.izhitsadblgravecyrillic = 0x0477; 19018 t.j = 0x006a; 19019 t.jaarmenian = 0x0571; 19020 t.jabengali = 0x099c; 19021 t.jadeva = 0x091c; 19022 t.jagujarati = 0x0a9c; 19023 t.jagurmukhi = 0x0a1c; 19024 t.jbopomofo = 0x3110; 19025 t.jcaron = 0x01f0; 19026 t.jcircle = 0x24d9; 19027 t.jcircumflex = 0x0135; 19028 t.jcrossedtail = 0x029d; 19029 t.jdotlessstroke = 0x025f; 19030 t.jecyrillic = 0x0458; 19031 t.jeemarabic = 0x062c; 19032 t.jeemfinalarabic = 0xfe9e; 19033 t.jeeminitialarabic = 0xfe9f; 19034 t.jeemmedialarabic = 0xfea0; 19035 t.jeharabic = 0x0698; 19036 t.jehfinalarabic = 0xfb8b; 19037 t.jhabengali = 0x099d; 19038 t.jhadeva = 0x091d; 19039 t.jhagujarati = 0x0a9d; 19040 t.jhagurmukhi = 0x0a1d; 19041 t.jheharmenian = 0x057b; 19042 t.jis = 0x3004; 19043 t.jmonospace = 0xff4a; 19044 t.jparen = 0x24a5; 19045 t.jsuperior = 0x02b2; 19046 t.k = 0x006b; 19047 t.kabashkircyrillic = 0x04a1; 19048 t.kabengali = 0x0995; 19049 t.kacute = 0x1e31; 19050 t.kacyrillic = 0x043a; 19051 t.kadescendercyrillic = 0x049b; 19052 t.kadeva = 0x0915; 19053 t.kaf = 0x05db; 19054 t.kafarabic = 0x0643; 19055 t.kafdagesh = 0xfb3b; 19056 t.kafdageshhebrew = 0xfb3b; 19057 t.kaffinalarabic = 0xfeda; 19058 t.kafhebrew = 0x05db; 19059 t.kafinitialarabic = 0xfedb; 19060 t.kafmedialarabic = 0xfedc; 19061 t.kafrafehebrew = 0xfb4d; 19062 t.kagujarati = 0x0a95; 19063 t.kagurmukhi = 0x0a15; 19064 t.kahiragana = 0x304b; 19065 t.kahookcyrillic = 0x04c4; 19066 t.kakatakana = 0x30ab; 19067 t.kakatakanahalfwidth = 0xff76; 19068 t.kappa = 0x03ba; 19069 t.kappasymbolgreek = 0x03f0; 19070 t.kapyeounmieumkorean = 0x3171; 19071 t.kapyeounphieuphkorean = 0x3184; 19072 t.kapyeounpieupkorean = 0x3178; 19073 t.kapyeounssangpieupkorean = 0x3179; 19074 t.karoriisquare = 0x330d; 19075 t.kashidaautoarabic = 0x0640; 19076 t.kashidaautonosidebearingarabic = 0x0640; 19077 t.kasmallkatakana = 0x30f5; 19078 t.kasquare = 0x3384; 19079 t.kasraarabic = 0x0650; 19080 t.kasratanarabic = 0x064d; 19081 t.kastrokecyrillic = 0x049f; 19082 t.katahiraprolongmarkhalfwidth = 0xff70; 19083 t.kaverticalstrokecyrillic = 0x049d; 19084 t.kbopomofo = 0x310e; 19085 t.kcalsquare = 0x3389; 19086 t.kcaron = 0x01e9; 19087 t.kcedilla = 0x0137; 19088 t.kcircle = 0x24da; 19089 t.kcommaaccent = 0x0137; 19090 t.kdotbelow = 0x1e33; 19091 t.keharmenian = 0x0584; 19092 t.kehiragana = 0x3051; 19093 t.kekatakana = 0x30b1; 19094 t.kekatakanahalfwidth = 0xff79; 19095 t.kenarmenian = 0x056f; 19096 t.kesmallkatakana = 0x30f6; 19097 t.kgreenlandic = 0x0138; 19098 t.khabengali = 0x0996; 19099 t.khacyrillic = 0x0445; 19100 t.khadeva = 0x0916; 19101 t.khagujarati = 0x0a96; 19102 t.khagurmukhi = 0x0a16; 19103 t.khaharabic = 0x062e; 19104 t.khahfinalarabic = 0xfea6; 19105 t.khahinitialarabic = 0xfea7; 19106 t.khahmedialarabic = 0xfea8; 19107 t.kheicoptic = 0x03e7; 19108 t.khhadeva = 0x0959; 19109 t.khhagurmukhi = 0x0a59; 19110 t.khieukhacirclekorean = 0x3278; 19111 t.khieukhaparenkorean = 0x3218; 19112 t.khieukhcirclekorean = 0x326a; 19113 t.khieukhkorean = 0x314b; 19114 t.khieukhparenkorean = 0x320a; 19115 t.khokhaithai = 0x0e02; 19116 t.khokhonthai = 0x0e05; 19117 t.khokhuatthai = 0x0e03; 19118 t.khokhwaithai = 0x0e04; 19119 t.khomutthai = 0x0e5b; 19120 t.khook = 0x0199; 19121 t.khorakhangthai = 0x0e06; 19122 t.khzsquare = 0x3391; 19123 t.kihiragana = 0x304d; 19124 t.kikatakana = 0x30ad; 19125 t.kikatakanahalfwidth = 0xff77; 19126 t.kiroguramusquare = 0x3315; 19127 t.kiromeetorusquare = 0x3316; 19128 t.kirosquare = 0x3314; 19129 t.kiyeokacirclekorean = 0x326e; 19130 t.kiyeokaparenkorean = 0x320e; 19131 t.kiyeokcirclekorean = 0x3260; 19132 t.kiyeokkorean = 0x3131; 19133 t.kiyeokparenkorean = 0x3200; 19134 t.kiyeoksioskorean = 0x3133; 19135 t.kjecyrillic = 0x045c; 19136 t.klinebelow = 0x1e35; 19137 t.klsquare = 0x3398; 19138 t.kmcubedsquare = 0x33a6; 19139 t.kmonospace = 0xff4b; 19140 t.kmsquaredsquare = 0x33a2; 19141 t.kohiragana = 0x3053; 19142 t.kohmsquare = 0x33c0; 19143 t.kokaithai = 0x0e01; 19144 t.kokatakana = 0x30b3; 19145 t.kokatakanahalfwidth = 0xff7a; 19146 t.kooposquare = 0x331e; 19147 t.koppacyrillic = 0x0481; 19148 t.koreanstandardsymbol = 0x327f; 19149 t.koroniscmb = 0x0343; 19150 t.kparen = 0x24a6; 19151 t.kpasquare = 0x33aa; 19152 t.ksicyrillic = 0x046f; 19153 t.ktsquare = 0x33cf; 19154 t.kturned = 0x029e; 19155 t.kuhiragana = 0x304f; 19156 t.kukatakana = 0x30af; 19157 t.kukatakanahalfwidth = 0xff78; 19158 t.kvsquare = 0x33b8; 19159 t.kwsquare = 0x33be; 19160 t.l = 0x006c; 19161 t.labengali = 0x09b2; 19162 t.lacute = 0x013a; 19163 t.ladeva = 0x0932; 19164 t.lagujarati = 0x0ab2; 19165 t.lagurmukhi = 0x0a32; 19166 t.lakkhangyaothai = 0x0e45; 19167 t.lamaleffinalarabic = 0xfefc; 19168 t.lamalefhamzaabovefinalarabic = 0xfef8; 19169 t.lamalefhamzaaboveisolatedarabic = 0xfef7; 19170 t.lamalefhamzabelowfinalarabic = 0xfefa; 19171 t.lamalefhamzabelowisolatedarabic = 0xfef9; 19172 t.lamalefisolatedarabic = 0xfefb; 19173 t.lamalefmaddaabovefinalarabic = 0xfef6; 19174 t.lamalefmaddaaboveisolatedarabic = 0xfef5; 19175 t.lamarabic = 0x0644; 19176 t.lambda = 0x03bb; 19177 t.lambdastroke = 0x019b; 19178 t.lamed = 0x05dc; 19179 t.lameddagesh = 0xfb3c; 19180 t.lameddageshhebrew = 0xfb3c; 19181 t.lamedhebrew = 0x05dc; 19182 t.lamfinalarabic = 0xfede; 19183 t.lamhahinitialarabic = 0xfcca; 19184 t.laminitialarabic = 0xfedf; 19185 t.lamjeeminitialarabic = 0xfcc9; 19186 t.lamkhahinitialarabic = 0xfccb; 19187 t.lamlamhehisolatedarabic = 0xfdf2; 19188 t.lammedialarabic = 0xfee0; 19189 t.lammeemhahinitialarabic = 0xfd88; 19190 t.lammeeminitialarabic = 0xfccc; 19191 t.largecircle = 0x25ef; 19192 t.lbar = 0x019a; 19193 t.lbelt = 0x026c; 19194 t.lbopomofo = 0x310c; 19195 t.lcaron = 0x013e; 19196 t.lcedilla = 0x013c; 19197 t.lcircle = 0x24db; 19198 t.lcircumflexbelow = 0x1e3d; 19199 t.lcommaaccent = 0x013c; 19200 t.ldot = 0x0140; 19201 t.ldotaccent = 0x0140; 19202 t.ldotbelow = 0x1e37; 19203 t.ldotbelowmacron = 0x1e39; 19204 t.leftangleabovecmb = 0x031a; 19205 t.lefttackbelowcmb = 0x0318; 19206 t.less = 0x003c; 19207 t.lessequal = 0x2264; 19208 t.lessequalorgreater = 0x22da; 19209 t.lessmonospace = 0xff1c; 19210 t.lessorequivalent = 0x2272; 19211 t.lessorgreater = 0x2276; 19212 t.lessoverequal = 0x2266; 19213 t.lesssmall = 0xfe64; 19214 t.lezh = 0x026e; 19215 t.lfblock = 0x258c; 19216 t.lhookretroflex = 0x026d; 19217 t.lira = 0x20a4; 19218 t.liwnarmenian = 0x056c; 19219 t.lj = 0x01c9; 19220 t.ljecyrillic = 0x0459;
19221 t.ll = 0xf6c0; 19222 t.lladeva = 0x0933; 19223 t.llagujarati = 0x0ab3; 19224 t.llinebelow = 0x1e3b; 19225 t.llladeva = 0x0934; 19226 t.llvocalicbengali = 0x09e1; 19227 t.llvocalicdeva = 0x0961; 19228 t.llvocalicvowelsignbengali = 0x09e3; 19229 t.llvocalicvowelsigndeva = 0x0963; 19230 t.lmiddletilde = 0x026b; 19231 t.lmonospace = 0xff4c; 19232 t.lmsquare = 0x33d0; 19233 t.lochulathai = 0x0e2c; 19234 t.logicaland = 0x2227; 19235 t.logicalnot = 0x00ac; 19236 t.logicalnotreversed = 0x2310; 19237 t.logicalor = 0x2228; 19238 t.lolingthai = 0x0e25; 19239 t.longs = 0x017f; 19240 t.lowlinecenterline = 0xfe4e; 19241 t.lowlinecmb = 0x0332; 19242 t.lowlinedashed = 0xfe4d; 19243 t.lozenge = 0x25ca; 19244 t.lparen = 0x24a7; 19245 t.lslash = 0x0142; 19246 t.lsquare = 0x2113; 19247 t.lsuperior = 0xf6ee; 19248 t.ltshade = 0x2591; 19249 t.luthai = 0x0e26; 19250 t.lvocalicbengali = 0x098c; 19251 t.lvocalicdeva = 0x090c; 19252 t.lvocalicvowelsignbengali = 0x09e2; 19253 t.lvocalicvowelsigndeva = 0x0962; 19254 t.lxsquare = 0x33d3; 19255 t.m = 0x006d; 19256 t.mabengali = 0x09ae; 19257 t.macron = 0x00af; 19258 t.macronbelowcmb = 0x0331; 19259 t.macroncmb = 0x0304; 19260 t.macronlowmod = 0x02cd; 19261 t.macronmonospace = 0xffe3; 19262 t.macute = 0x1e3f; 19263 t.madeva = 0x092e; 19264 t.magujarati = 0x0aae; 19265 t.magurmukhi = 0x0a2e; 19266 t.mahapakhhebrew = 0x05a4; 19267 t.mahapakhlefthebrew = 0x05a4; 19268 t.mahiragana = 0x307e; 19269 t.maichattawalowleftthai = 0xf895; 19270 t.maichattawalowrightthai = 0xf894; 19271 t.maichattawathai = 0x0e4b; 19272 t.maichattawaupperleftthai = 0xf893; 19273 t.maieklowleftthai = 0xf88c; 19274 t.maieklowrightthai = 0xf88b; 19275 t.maiekthai = 0x0e48; 19276 t.maiekupperleftthai = 0xf88a; 19277 t.maihanakatleftthai = 0xf884; 19278 t.maihanakatthai = 0x0e31; 19279 t.maitaikhuleftthai = 0xf889; 19280 t.maitaikhuthai = 0x0e47; 19281 t.maitholowleftthai = 0xf88f; 19282 t.maitholowrightthai = 0xf88e; 19283 t.maithothai = 0x0e49; 19284 t.maithoupperleftthai = 0xf88d; 19285 t.maitrilowleftthai = 0xf892; 19286 t.maitrilowrightthai = 0xf891; 19287 t.maitrithai = 0x0e4a; 19288 t.maitriupperleftthai = 0xf890; 19289 t.maiyamokthai = 0x0e46; 19290 t.makatakana = 0x30de; 19291 t.makatakanahalfwidth = 0xff8f; 19292 t.male = 0x2642; 19293 t.mansyonsquare = 0x3347; 19294 t.maqafhebrew = 0x05be; 19295 t.mars = 0x2642; 19296 t.masoracirclehebrew = 0x05af; 19297 t.masquare = 0x3383; 19298 t.mbopomofo = 0x3107; 19299 t.mbsquare = 0x33d4; 19300 t.mcircle = 0x24dc; 19301 t.mcubedsquare = 0x33a5; 19302 t.mdotaccent = 0x1e41; 19303 t.mdotbelow = 0x1e43; 19304 t.meemarabic = 0x0645; 19305 t.meemfinalarabic = 0xfee2; 19306 t.meeminitialarabic = 0xfee3; 19307 t.meemmedialarabic = 0xfee4; 19308 t.meemmeeminitialarabic = 0xfcd1; 19309 t.meemmeemisolatedarabic = 0xfc48; 19310 t.meetorusquare = 0x334d; 19311 t.mehiragana = 0x3081; 19312 t.meizierasquare = 0x337e; 19313 t.mekatakana = 0x30e1; 19314 t.mekatakanahalfwidth = 0xff92; 19315 t.mem = 0x05de; 19316 t.memdagesh = 0xfb3e; 19317 t.memdageshhebrew = 0xfb3e; 19318 t.memhebrew = 0x05de; 19319 t.menarmenian = 0x0574; 19320 t.merkhahebrew = 0x05a5; 19321 t.merkhakefulahebrew = 0x05a6; 19322 t.merkhakefulalefthebrew = 0x05a6; 19323 t.merkhalefthebrew = 0x05a5; 19324 t.mhook = 0x0271; 19325 t.mhzsquare = 0x3392; 19326 t.middledotkatakanahalfwidth = 0xff65; 19327 t.middot = 0x00b7; 19328 t.mieumacirclekorean = 0x3272; 19329 t.mieumaparenkorean = 0x3212; 19330 t.mieumcirclekorean = 0x3264; 19331 t.mieumkorean = 0x3141; 19332 t.mieumpansioskorean = 0x3170; 19333 t.mieumparenkorean = 0x3204; 19334 t.mieumpieupkorean = 0x316e; 19335 t.mieumsioskorean = 0x316f; 19336 t.mihiragana = 0x307f; 19337 t.mikatakana = 0x30df; 19338 t.mikatakanahalfwidth = 0xff90; 19339 t.minus = 0x2212; 19340 t.minusbelowcmb = 0x0320; 19341 t.minuscircle = 0x2296; 19342 t.minusmod = 0x02d7; 19343 t.minusplus = 0x2213; 19344 t.minute = 0x2032; 19345 t.miribaarusquare = 0x334a; 19346 t.mirisquare = 0x3349; 19347 t.mlonglegturned = 0x0270; 19348 t.mlsquare = 0x3396; 19349 t.mmcubedsquare = 0x33a3; 19350 t.mmonospace = 0xff4d; 19351 t.mmsquaredsquare = 0x339f; 19352 t.mohiragana = 0x3082; 19353 t.mohmsquare = 0x33c1; 19354 t.mokatakana = 0x30e2; 19355 t.mokatakanahalfwidth = 0xff93; 19356 t.molsquare = 0x33d6; 19357 t.momathai = 0x0e21; 19358 t.moverssquare = 0x33a7; 19359 t.moverssquaredsquare = 0x33a8; 19360 t.mparen = 0x24a8; 19361 t.mpasquare = 0x33ab; 19362 t.mssquare = 0x33b3; 19363 t.msuperior = 0xf6ef; 19364 t.mturned = 0x026f; 19365 t.mu = 0x00b5; 19366 t.mu1 = 0x00b5; 19367 t.muasquare = 0x3382; 19368 t.muchgreater = 0x226b; 19369 t.muchless = 0x226a; 19370 t.mufsquare = 0x338c; 19371 t.mugreek = 0x03bc; 19372 t.mugsquare = 0x338d; 19373 t.muhiragana = 0x3080; 19374 t.mukatakana = 0x30e0; 19375 t.mukatakanahalfwidth = 0xff91; 19376 t.mulsquare = 0x3395; 19377 t.multiply = 0x00d7; 19378 t.mumsquare = 0x339b; 19379 t.munahhebrew = 0x05a3;
19380 t.munahlefthebrew = 0x05a3; 19381 t.musicalnote = 0x266a; 19382 t.musicalnotedbl = 0x266b; 19383 t.musicflatsign = 0x266d; 19384 t.musicsharpsign = 0x266f; 19385 t.mussquare = 0x33b2; 19386 t.muvsquare = 0x33b6; 19387 t.muwsquare = 0x33bc; 19388 t.mvmegasquare = 0x33b9; 19389 t.mvsquare = 0x33b7; 19390 t.mwmegasquare = 0x33bf; 19391 t.mwsquare = 0x33bd; 19392 t.n = 0x006e; 19393 t.nabengali = 0x09a8; 19394 t.nabla = 0x2207; 19395 t.nacute = 0x0144; 19396 t.nadeva = 0x0928; 19397 t.nagujarati = 0x0aa8; 19398 t.nagurmukhi = 0x0a28; 19399 t.nahiragana = 0x306a; 19400 t.nakatakana = 0x30ca; 19401 t.nakatakanahalfwidth = 0xff85; 19402 t.napostrophe = 0x0149; 19403 t.nasquare = 0x3381; 19404 t.nbopomofo = 0x310b; 19405 t.nbspace = 0x00a0; 19406 t.ncaron = 0x0148; 19407 t.ncedilla = 0x0146; 19408 t.ncircle = 0x24dd; 19409 t.ncircumflexbelow = 0x1e4b; 19410 t.ncommaaccent = 0x0146; 19411 t.ndotaccent = 0x1e45; 19412 t.ndotbelow = 0x1e47; 19413 t.nehiragana = 0x306d; 19414 t.nekatakana = 0x30cd; 19415 t.nekatakanahalfwidth = 0xff88; 19416 t.newsheqelsign = 0x20aa; 19417 t.nfsquare = 0x338b; 19418 t.ngabengali = 0x0999; 19419 t.ngadeva = 0x0919; 19420 t.ngagujarati = 0x0a99; 19421 t.ngagurmukhi = 0x0a19; 19422 t.ngonguthai = 0x0e07; 19423 t.nhiragana = 0x3093; 19424 t.nhookleft = 0x0272; 19425 t.nhookretroflex = 0x0273; 19426 t.nieunacirclekorean = 0x326f; 19427 t.nieunaparenkorean = 0x320f; 19428 t.nieuncieuckorean = 0x3135; 19429 t.nieuncirclekorean = 0x3261; 19430 t.nieunhieuhkorean = 0x3136; 19431 t.nieunkorean = 0x3134; 19432 t.nieunpansioskorean = 0x3168; 19433 t.nieunparenkorean = 0x3201; 19434 t.nieunsioskorean = 0x3167; 19435 t.nieuntikeutkorean = 0x3166; 19436 t.nihiragana = 0x306b; 19437 t.nikatakana = 0x30cb; 19438 t.nikatakanahalfwidth = 0xff86; 19439 t.nikhahitleftthai = 0xf899; 19440 t.nikhahitthai = 0x0e4d; 19441 t.nine = 0x0039; 19442 t.ninearabic = 0x0669; 19443 t.ninebengali = 0x09ef; 19444 t.ninecircle = 0x2468; 19445 t.ninecircleinversesansserif = 0x2792; 19446 t.ninedeva = 0x096f; 19447 t.ninegujarati = 0x0aef; 19448 t.ninegurmukhi = 0x0a6f; 19449 t.ninehackarabic = 0x0669; 19450 t.ninehangzhou = 0x3029; 19451 t.nineideographicparen = 0x3228; 19452 t.nineinferior = 0x2089; 19453 t.ninemonospace = 0xff19; 19454 t.nineoldstyle = 0xf739; 19455 t.nineparen = 0x247c; 19456 t.nineperiod = 0x2490; 19457 t.ninepersian = 0x06f9; 19458 t.nineroman = 0x2178; 19459 t.ninesuperior = 0x2079; 19460 t.nineteencircle = 0x2472; 19461 t.nineteenparen = 0x2486; 19462 t.nineteenperiod = 0x249a; 19463 t.ninethai = 0x0e59; 19464 t.nj = 0x01cc; 19465 t.njecyrillic = 0x045a; 19466 t.nkatakana = 0x30f3; 19467 t.nkatakanahalfwidth = 0xff9d; 19468 t.nlegrightlong = 0x019e; 19469 t.nlinebelow = 0x1e49; 19470 t.nmonospace = 0xff4e; 19471 t.nmsquare = 0x339a; 19472 t.nnabengali = 0x09a3; 19473 t.nnadeva = 0x0923; 19474 t.nnagujarati = 0x0aa3; 19475 t.nnagurmukhi = 0x0a23; 19476 t.nnnadeva = 0x0929; 19477 t.nohiragana = 0x306e; 19478 t.nokatakana = 0x30ce; 19479 t.nokatakanahalfwidth = 0xff89; 19480 t.nonbreakingspace = 0x00a0; 19481 t.nonenthai = 0x0e13; 19482 t.nonuthai = 0x0e19;
19483 t.noonarabic = 0x0646; 19484 t.noonfinalarabic = 0xfee6; 19485 t.noonghunnaarabic = 0x06ba; 19486 t.noonghunnafinalarabic = 0xfb9f; 19487 t.nooninitialarabic = 0xfee7; 19488 t.noonjeeminitialarabic = 0xfcd2; 19489 t.noonjeemisolatedarabic = 0xfc4b; 19490 t.noonmedialarabic = 0xfee8; 19491 t.noonmeeminitialarabic = 0xfcd5; 19492 t.noonmeemisolatedarabic = 0xfc4e; 19493 t.noonnoonfinalarabic = 0xfc8d; 19494 t.notcontains = 0x220c; 19495 t.notelement = 0x2209; 19496 t.notelementof = 0x2209; 19497 t.notequal = 0x2260; 19498 t.notgreater = 0x226f; 19499 t.notgreaternorequal = 0x2271; 19500 t.notgreaternorless = 0x2279; 19501 t.notidentical = 0x2262; 19502 t.notless = 0x226e; 19503 t.notlessnorequal = 0x2270; 19504 t.notparallel = 0x2226; 19505 t.notprecedes = 0x2280; 19506 t.notsubset = 0x2284; 19507 t.notsucceeds = 0x2281; 19508 t.notsuperset = 0x2285; 19509 t.nowarmenian = 0x0576; 19510 t.nparen = 0x24a9; 19511 t.nssquare = 0x33b1; 19512 t.nsuperior = 0x207f; 19513 t.ntilde = 0x00f1; 19514 t.nu = 0x03bd; 19515 t.nuhiragana = 0x306c; 19516 t.nukatakana = 0x30cc; 19517 t.nukatakanahalfwidth = 0xff87; 19518 t.nuktabengali = 0x09bc; 19519 t.nuktadeva = 0x093c; 19520 t.nuktagujarati = 0x0abc; 19521 t.nuktagurmukhi = 0x0a3c; 19522 t.numbersign = 0x0023; 19523 t.numbersignmonospace = 0xff03; 19524 t.numbersignsmall = 0xfe5f; 19525 t.numeralsigngreek = 0x0374; 19526 t.numeralsignlowergreek = 0x0375; 19527 t.numero = 0x2116; 19528 t.nun = 0x05e0; 19529 t.nundagesh = 0xfb40; 19530 t.nundageshhebrew = 0xfb40; 19531 t.nunhebrew = 0x05e0; 19532 t.nvsquare = 0x33b5; 19533 t.nwsquare = 0x33bb; 19534 t.nyabengali = 0x099e; 19535 t.nyadeva = 0x091e; 19536 t.nyagujarati = 0x0a9e; 19537 t.nyagurmukhi = 0x0a1e; 19538 t.o = 0x006f; 19539 t.oacute = 0x00f3; 19540 t.oangthai = 0x0e2d; 19541 t.obarred = 0x0275; 19542 t.obarredcyrillic = 0x04e9; 19543 t.obarreddieresiscyrillic = 0x04eb; 19544 t.obengali = 0x0993; 19545 t.obopomofo = 0x311b; 19546 t.obreve = 0x014f; 19547 t.ocandradeva = 0x0911; 19548 t.ocandragujarati = 0x0a91; 19549 t.ocandravowelsigndeva = 0x0949; 19550 t.ocandravowelsigngujarati = 0x0ac9; 19551 t.ocaron = 0x01d2; 19552 t.ocircle = 0x24de; 19553 t.ocircumflex = 0x00f4; 19554 t.ocircumflexacute = 0x1ed1; 19555 t.ocircumflexdotbelow = 0x1ed9; 19556 t.ocircumflexgrave = 0x1ed3; 19557 t.ocircumflexhookabove = 0x1ed5; 19558 t.ocircumflextilde = 0x1ed7; 19559 t.ocyrillic = 0x043e; 19560 t.odblacute = 0x0151; 19561 t.odblgrave = 0x020d; 19562 t.odeva = 0x0913; 19563 t.odieresis = 0x00f6; 19564 t.odieresiscyrillic = 0x04e7; 19565 t.odotbelow = 0x1ecd; 19566 t.oe = 0x0153; 19567 t.oekorean = 0x315a; 19568 t.ogonek = 0x02db; 19569 t.ogonekcmb = 0x0328; 19570 t.ograve = 0x00f2; 19571 t.ogujarati = 0x0a93; 19572 t.oharmenian = 0x0585; 19573 t.ohiragana = 0x304a; 19574 t.ohookabove = 0x1ecf; 19575 t.ohorn = 0x01a1; 19576 t.ohornacute = 0x1edb; 19577 t.ohorndotbelow = 0x1ee3; 19578 t.ohorngrave = 0x1edd; 19579 t.ohornhookabove = 0x1edf; 19580 t.ohorntilde = 0x1ee1; 19581 t.ohungarumlaut = 0x0151; 19582 t.oi = 0x01a3; 19583 t.oinvertedbreve = 0x020f; 19584 t.okatakana = 0x30aa; 19585 t.okatakanahalfwidth = 0xff75; 19586 t.okorean = 0x3157; 19587 t.olehebrew = 0x05ab; 19588 t.omacron = 0x014d; 19589 t.omacronacute = 0x1e53; 19590 t.omacrongrave = 0x1e51; 19591 t.omdeva = 0x0950; 19592 t.omega = 0x03c9; 19593 t.omega1 = 0x03d6; 19594 t.omegacyrillic = 0x0461; 19595 t.omegalatinclosed = 0x0277; 19596 t.omegaroundcyrillic = 0x047b; 19597 t.omegatitlocyrillic = 0x047d; 19598 t.omegatonos = 0x03ce; 19599 t.omgujarati = 0x0ad0; 19600 t.omicron = 0x03bf; 19601 t.omicrontonos = 0x03cc; 19602 t.omonospace = 0xff4f; 19603 t.one = 0x0031; 19604 t.onearabic = 0x0661; 19605 t.onebengali = 0x09e7; 19606 t.onecircle = 0x2460; 19607 t.onecircleinversesansserif = 0x278a; 19608 t.onedeva = 0x0967; 19609 t.onedotenleader = 0x2024; 19610 t.oneeighth = 0x215b; 19611 t.onefitted = 0xf6dc; 19612 t.onegujarati = 0x0ae7; 19613 t.onegurmukhi = 0x0a67; 19614 t.onehackarabic = 0x0661; 19615 t.onehalf = 0x00bd; 19616 t.onehangzhou = 0x3021; 19617 t.oneideographicparen = 0x3220; 19618 t.oneinferior = 0x2081; 19619 t.onemonospace = 0xff11; 19620 t.onenumeratorbengali = 0x09f4; 19621 t.oneoldstyle = 0xf731; 19622 t.oneparen = 0x2474; 19623 t.oneperiod = 0x2488; 19624 t.onepersian = 0x06f1; 19625 t.onequarter = 0x00bc; 19626 t.oneroman = 0x2170; 19627 t.onesuperior = 0x00b9; 19628 t.onethai = 0x0e51; 19629 t.onethird = 0x2153; 19630 t.oogonek = 0x01eb; 19631 t.oogonekmacron = 0x01ed; 19632 t.oogurmukhi = 0x0a13; 19633 t.oomatragurmukhi = 0x0a4b; 19634 t.oopen = 0x0254; 19635 t.oparen = 0x24aa; 19636 t.openbullet = 0x25e6; 19637 t.option = 0x2325; 19638 t.ordfeminine = 0x00aa; 19639 t.ordmasculine = 0x00ba; 19640 t.orthogonal = 0x221f; 19641 t.oshortdeva = 0x0912; 19642 t.oshortvowelsigndeva = 0x094a; 19643 t.oslash = 0x00f8; 19644 t.oslashacute = 0x01ff; 19645 t.osmallhiragana = 0x3049;
19646 t.osmallkatakana = 0x30a9; 19647 t.osmallkatakanahalfwidth = 0xff6b; 19648 t.ostrokeacute = 0x01ff; 19649 t.osuperior = 0xf6f0; 19650 t.otcyrillic = 0x047f; 19651 t.otilde = 0x00f5; 19652 t.otildeacute = 0x1e4d; 19653 t.otildedieresis = 0x1e4f; 19654 t.oubopomofo = 0x3121; 19655 t.overline = 0x203e; 19656 t.overlinecenterline = 0xfe4a; 19657 t.overlinecmb = 0x0305; 19658 t.overlinedashed = 0xfe49; 19659 t.overlinedblwavy = 0xfe4c; 19660 t.overlinewavy = 0xfe4b; 19661 t.overscore = 0x00af; 19662 t.ovowelsignbengali = 0x09cb; 19663 t.ovowelsigndeva = 0x094b; 19664 t.ovowelsigngujarati = 0x0acb; 19665 t.p = 0x0070; 19666 t.paampssquare = 0x3380; 19667 t.paasentosquare = 0x332b; 19668 t.pabengali = 0x09aa; 19669 t.pacute = 0x1e55; 19670 t.padeva = 0x092a; 19671 t.pagedown = 0x21df; 19672 t.pageup = 0x21de; 19673 t.pagujarati = 0x0aaa; 19674 t.pagurmukhi = 0x0a2a; 19675 t.pahiragana = 0x3071; 19676 t.paiyannoithai = 0x0e2f; 19677 t.pakatakana = 0x30d1; 19678 t.palatalizationcyrilliccmb = 0x0484; 19679 t.palochkacyrillic = 0x04c0; 19680 t.pansioskorean = 0x317f; 19681 t.paragraph = 0x00b6; 19682 t.parallel = 0x2225; 19683 t.parenleft = 0x0028; 19684 t.parenleftaltonearabic = 0xfd3e; 19685 t.parenleftbt = 0xf8ed; 19686 t.parenleftex = 0xf8ec; 19687 t.parenleftinferior = 0x208d; 19688 t.parenleftmonospace = 0xff08; 19689 t.parenleftsmall = 0xfe59; 19690 t.parenleftsuperior = 0x207d; 19691 t.parenlefttp = 0xf8eb; 19692 t.parenleftvertical = 0xfe35; 19693 t.parenright = 0x0029; 19694 t.parenrightaltonearabic = 0xfd3f; 19695 t.parenrightbt = 0xf8f8; 19696 t.parenrightex = 0xf8f7; 19697 t.parenrightinferior = 0x208e; 19698 t.parenrightmonospace = 0xff09; 19699 t.parenrightsmall = 0xfe5a; 19700 t.parenrightsuperior = 0x207e; 19701 t.parenrighttp = 0xf8f6; 19702 t.parenrightvertical = 0xfe36; 19703 t.partialdiff = 0x2202; 19704 t.paseqhebrew = 0x05c0; 19705 t.pashtahebrew = 0x0599; 19706 t.pasquare = 0x33a9; 19707 t.patah = 0x05b7; 19708 t.patah11 = 0x05b7; 19709 t.patah1d = 0x05b7; 19710 t.patah2a = 0x05b7; 19711 t.patahhebrew = 0x05b7; 19712 t.patahnarrowhebrew = 0x05b7; 19713 t.patahquarterhebrew = 0x05b7; 19714 t.patahwidehebrew = 0x05b7; 19715 t.pazerhebrew = 0x05a1; 19716 t.pbopomofo = 0x3106; 19717 t.pcircle = 0x24df; 19718 t.pdotaccent = 0x1e57; 19719 t.pe = 0x05e4; 19720 t.pecyrillic = 0x043f; 19721 t.pedagesh = 0xfb44; 19722 t.pedageshhebrew = 0xfb44; 19723 t.peezisquare = 0x333b; 19724 t.pefinaldageshhebrew = 0xfb43; 19725 t.peharabic = 0x067e; 19726 t.peharmenian = 0x057a; 19727 t.pehebrew = 0x05e4; 19728 t.pehfinalarabic = 0xfb57; 19729 t.pehinitialarabic = 0xfb58; 19730 t.pehiragana = 0x307a; 19731 t.pehmedialarabic = 0xfb59; 19732 t.pekatakana = 0x30da; 19733 t.pemiddlehookcyrillic = 0x04a7; 19734 t.perafehebrew = 0xfb4e; 19735 t.percent = 0x0025; 19736 t.percentarabic = 0x066a; 19737 t.percentmonospace = 0xff05; 19738 t.percentsmall = 0xfe6a; 19739 t.period = 0x002e; 19740 t.periodarmenian = 0x0589; 19741 t.periodcentered = 0x00b7; 19742 t.periodhalfwidth = 0xff61; 19743 t.periodinferior = 0xf6e7; 19744 t.periodmonospace = 0xff0e; 19745 t.periodsmall = 0xfe52; 19746 t.periodsuperior = 0xf6e8; 19747 t.perispomenigreekcmb = 0x0342; 19748 t.perpendicular = 0x22a5; 19749 t.perthousand = 0x2030; 19750 t.peseta = 0x20a7; 19751 t.pfsquare = 0x338a; 19752 t.phabengali = 0x09ab; 19753 t.phadeva = 0x092b; 19754 t.phagujarati = 0x0aab; 19755 t.phagurmukhi = 0x0a2b; 19756 t.phi = 0x03c6; 19757 t.phi1 = 0x03d5; 19758 t.phieuphacirclekorean = 0x327a; 19759 t.phieuphaparenkorean = 0x321a; 19760 t.phieuphcirclekorean = 0x326c; 19761 t.phieuphkorean = 0x314d; 19762 t.phieuphparenkorean = 0x320c; 19763 t.philatin = 0x0278; 19764 t.phinthuthai = 0x0e3a; 19765 t.phisymbolgreek = 0x03d5; 19766 t.phook = 0x01a5; 19767 t.phophanthai = 0x0e1e; 19768 t.phophungthai = 0x0e1c; 19769 t.phosamphaothai = 0x0e20; 19770 t.pi = 0x03c0; 19771 t.pieupacirclekorean = 0x3273; 19772 t.pieupaparenkorean = 0x3213; 19773 t.pieupcieuckorean = 0x3176; 19774 t.pieupcirclekorean = 0x3265; 19775 t.pieupkiyeokkorean = 0x3172; 19776 t.pieupkorean = 0x3142; 19777 t.pieupparenkorean = 0x3205; 19778 t.pieupsioskiyeokkorean = 0x3174; 19779 t.pieupsioskorean = 0x3144; 19780 t.pieupsiostikeutkorean = 0x3175; 19781 t.pieupthieuthkorean = 0x3177; 19782 t.pieuptikeutkorean = 0x3173; 19783 t.pihiragana = 0x3074; 19784 t.pikatakana = 0x30d4; 19785 t.pisymbolgreek = 0x03d6; 19786 t.piwrarmenian = 0x0583; 19787 t.planckover2pi = 0x210f; 19788 t.planckover2pi1 = 0x210f; 19789 t.plus = 0x002b; 19790 t.plusbelowcmb = 0x031f; 19791 t.pluscircle = 0x2295; 19792 t.plusminus = 0x00b1; 19793 t.plusmod = 0x02d6; 19794 t.plusmonospace = 0xff0b; 19795 t.plussmall = 0xfe62; 19796 t.plussuperior = 0x207a; 19797 t.pmonospace = 0xff50; 19798 t.pmsquare = 0x33d8; 19799 t.pohiragana = 0x307d; 19800 t.pointingindexdownwhite = 0x261f; 19801 t.pointingindexleftwhite = 0x261c; 19802 t.pointingindexrightwhite = 0x261e; 19803 t.pointingindexupwhite = 0x261d; 19804 t.pokatakana = 0x30dd; 19805 t.poplathai = 0x0e1b; 19806 t.postalmark = 0x3012; 19807 t.postalmarkface = 0x3020; 19808 t.pparen = 0x24ab; 19809 t.precedes = 0x227a; 19810 t.prescription = 0x211e; 19811 t.primemod = 0x02b9; 19812 t.primereversed = 0x2035; 19813 t.product = 0x220f; 19814 t.projective = 0x2305; 19815 t.prolongedkana = 0x30fc; 19816 t.propellor = 0x2318; 19817 t.propersubset = 0x2282; 19818 t.propersuperset = 0x2283; 19819 t.proportion = 0x2237; 19820 t.proportional = 0x221d; 19821 t.psi = 0x03c8; 19822 t.psicyrillic = 0x0471; 19823 t.psilipneumatacyrilliccmb = 0x0486; 19824 t.pssquare = 0x33b0; 19825 t.puhiragana = 0x3077; 19826 t.pukatakana = 0x30d7; 19827 t.pvsquare = 0x33b4; 19828 t.pwsquare = 0x33ba; 19829 t.q = 0x0071; 19830 t.qadeva = 0x0958; 19831 t.qadmahebrew = 0x05a8; 19832 t.qafarabic = 0x0642; 19833 t.qaffinalarabic = 0xfed6; 19834 t.qafinitialarabic = 0xfed7; 19835 t.qafmedialarabic = 0xfed8; 19836 t.qamats = 0x05b8; 19837 t.qamats10 = 0x05b8; 19838 t.qamats1a = 0x05b8; 19839 t.qamats1c = 0x05b8; 19840 t.qamats27 = 0x05b8; 19841 t.qamats29 = 0x05b8; 19842 t.qamats33 = 0x05b8; 19843 t.qamatsde = 0x05b8; 19844 t.qamatshebrew = 0x05b8; 19845 t.qamatsnarrowhebrew = 0x05b8; 19846 t.qamatsqatanhebrew = 0x05b8; 19847 t.qamatsqatannarrowhebrew = 0x05b8; 19848 t.qamatsqatanquarterhebrew = 0x05b8; 19849 t.qamatsqatanwidehebrew = 0x05b8; 19850 t.qamatsquarterhebrew = 0x05b8; 19851 t.qamatswidehebrew = 0x05b8; 19852 t.qarneyparahebrew = 0x059f; 19853 t.qbopomofo = 0x3111; 19854 t.qcircle = 0x24e0; 19855 t.qhook = 0x02a0; 19856 t.qmonospace = 0xff51; 19857 t.qof = 0x05e7; 19858 t.qofdagesh = 0xfb47; 19859 t.qofdageshhebrew = 0xfb47; 19860 t.qofhebrew = 0x05e7; 19861 t.qparen = 0x24ac; 19862 t.quarternote = 0x2669; 19863 t.qubuts = 0x05bb; 19864 t.qubuts18 = 0x05bb; 19865 t.qubuts25 = 0x05bb; 19866 t.qubuts31 = 0x05bb; 19867 t.qubutshebrew = 0x05bb; 19868 t.qubutsnarrowhebrew = 0x05bb; 19869 t.qubutsquarterhebrew = 0x05bb; 19870 t.qubutswidehebrew = 0x05bb; 19871 t.question = 0x003f; 19872 t.questionarabic = 0x061f; 19873 t.questionarmenian = 0x055e; 19874 t.questiondown = 0x00bf; 19875 t.questiondownsmall = 0xf7bf; 19876 t.questiongreek = 0x037e; 19877 t.questionmonospace = 0xff1f; 19878 t.questionsmall = 0xf73f; 19879 t.quotedbl = 0x0022; 19880 t.quotedblbase = 0x201e; 19881 t.quotedblleft = 0x201c; 19882 t.quotedblmonospace = 0xff02; 19883 t.quotedblprime = 0x301e; 19884 t.quotedblprimereversed = 0x301d; 19885 t.quotedblright = 0x201d; 19886 t.quoteleft = 0x2018; 19887 t.quoteleftreversed = 0x201b; 19888 t.quotereversed = 0x201b; 19889 t.quoteright = 0x2019; 19890 t.quoterightn = 0x0149; 19891 t.quotesinglbase = 0x201a; 19892 t.quotesingle = 0x0027; 19893 t.quotesinglemonospace = 0xff07; 19894 t.r = 0x0072; 19895 t.raarmenian = 0x057c; 19896 t.rabengali = 0x09b0; 19897 t.racute = 0x0155; 19898 t.radeva = 0x0930; 19899 t.radical = 0x221a; 19900 t.radicalex = 0xf8e5; 19901 t.radoverssquare = 0x33ae; 19902 t.radoverssquaredsquare = 0x33af; 19903 t.radsquare = 0x33ad; 19904 t.rafe = 0x05bf; 19905 t.rafehebrew = 0x05bf; 19906 t.ragujarati = 0x0ab0; 19907 t.ragurmukhi = 0x0a30; 19908 t.rahiragana = 0x3089; 19909 t.rakatakana = 0x30e9; 19910 t.rakatakanahalfwidth = 0xff97; 19911 t.ralowerdiagonalbengali = 0x09f1; 19912 t.ramiddlediagonalbengali = 0x09f0; 19913 t.ramshorn = 0x0264; 19914 t.ratio = 0x2236; 19915 t.rbopomofo = 0x3116; 19916 t.rcaron = 0x0159; 19917 t.rcedilla = 0x0157; 19918 t.rcircle = 0x24e1; 19919 t.rcommaaccent = 0x0157; 19920 t.rdblgrave = 0x0211; 19921 t.rdotaccent = 0x1e59; 19922 t.rdotbelow = 0x1e5b; 19923 t.rdotbelowmacron = 0x1e5d; 19924 t.referencemark = 0x203b; 19925 t.reflexsubset = 0x2286; 19926 t.reflexsuperset = 0x2287; 19927 t.registered = 0x00ae; 19928 t.registersans = 0xf8e8; 19929 t.registerserif = 0xf6da; 19930 t.reharabic = 0x0631; 19931 t.reharmenian = 0x0580; 19932 t.rehfinalarabic = 0xfeae; 19933 t.rehiragana = 0x308c; 19934 t.rekatakana = 0x30ec; 19935 t.rekatakanahalfwidth = 0xff9a; 19936 t.resh = 0x05e8; 19937 t.reshdageshhebrew = 0xfb48; 19938 t.reshhebrew = 0x05e8; 19939 t.reversedtilde = 0x223d; 19940 t.reviahebrew = 0x0597; 19941 t.reviamugrashhebrew = 0x0597; 19942 t.revlogicalnot = 0x2310;
19943 t.rfishhook = 0x027e; 19944 t.rfishhookreversed = 0x027f; 19945 t.rhabengali = 0x09dd; 19946 t.rhadeva = 0x095d; 19947 t.rho = 0x03c1; 19948 t.rhook = 0x027d; 19949 t.rhookturned = 0x027b; 19950 t.rhookturnedsuperior = 0x02b5; 19951 t.rhosymbolgreek = 0x03f1; 19952 t.rhotichookmod = 0x02de; 19953 t.rieulacirclekorean = 0x3271; 19954 t.rieulaparenkorean = 0x3211; 19955 t.rieulcirclekorean = 0x3263; 19956 t.rieulhieuhkorean = 0x3140; 19957 t.rieulkiyeokkorean = 0x313a; 19958 t.rieulkiyeoksioskorean = 0x3169; 19959 t.rieulkorean = 0x3139; 19960 t.rieulmieumkorean = 0x313b; 19961 t.rieulpansioskorean = 0x316c; 19962 t.rieulparenkorean = 0x3203; 19963 t.rieulphieuphkorean = 0x313f; 19964 t.rieulpieupkorean = 0x313c; 19965 t.rieulpieupsioskorean = 0x316b; 19966 t.rieulsioskorean = 0x313d; 19967 t.rieulthieuthkorean = 0x313e; 19968 t.rieultikeutkorean = 0x316a; 19969 t.rieulyeorinhieuhkorean = 0x316d; 19970 t.rightangle = 0x221f; 19971 t.righttackbelowcmb = 0x0319; 19972 t.righttriangle = 0x22bf; 19973 t.rihiragana = 0x308a; 19974 t.rikatakana = 0x30ea; 19975 t.rikatakanahalfwidth = 0xff98; 19976 t.ring = 0x02da; 19977 t.ringbelowcmb = 0x0325; 19978 t.ringcmb = 0x030a; 19979 t.ringhalfleft = 0x02bf; 19980 t.ringhalfleftarmenian = 0x0559; 19981 t.ringhalfleftbelowcmb = 0x031c; 19982 t.ringhalfleftcentered = 0x02d3; 19983 t.ringhalfright = 0x02be; 19984 t.ringhalfrightbelowcmb = 0x0339; 19985 t.ringhalfrightcentered = 0x02d2; 19986 t.rinvertedbreve = 0x0213; 19987 t.rittorusquare = 0x3351; 19988 t.rlinebelow = 0x1e5f; 19989 t.rlongleg = 0x027c; 19990 t.rlonglegturned = 0x027a; 19991 t.rmonospace = 0xff52; 19992 t.rohiragana = 0x308d; 19993 t.rokatakana = 0x30ed; 19994 t.rokatakanahalfwidth = 0xff9b; 19995 t.roruathai = 0x0e23; 19996 t.rparen = 0x24ad; 19997 t.rrabengali = 0x09dc; 19998 t.rradeva = 0x0931; 19999 t.rragurmukhi = 0x0a5c; 20000 t.rreharabic = 0x0691; 20001 t.rrehfinalarabic = 0xfb8d; 20002 t.rrvocalicbengali = 0x09e0; 20003 t.rrvocalicdeva = 0x0960; 20004 t.rrvocalicgujarati = 0x0ae0; 20005 t.rrvocalicvowelsignbengali = 0x09c4; 20006 t.rrvocalicvowelsigndeva = 0x0944; 20007 t.rrvocalicvowelsigngujarati = 0x0ac4; 20008 t.rsuperior = 0xf6f1; 20009 t.rtblock = 0x2590; 20010 t.rturned = 0x0279; 20011 t.rturnedsuperior = 0x02b4; 20012 t.ruhiragana = 0x308b; 20013 t.rukatakana = 0x30eb; 20014 t.rukatakanahalfwidth = 0xff99; 20015 t.rupeemarkbengali = 0x09f2; 20016 t.rupeesignbengali = 0x09f3; 20017 t.rupiah = 0xf6dd; 20018 t.ruthai = 0x0e24; 20019 t.rvocalicbengali = 0x098b; 20020 t.rvocalicdeva = 0x090b; 20021 t.rvocalicgujarati = 0x0a8b; 20022 t.rvocalicvowelsignbengali = 0x09c3; 20023 t.rvocalicvowelsigndeva = 0x0943; 20024 t.rvocalicvowelsigngujarati = 0x0ac3; 20025 t.s = 0x0073; 20026 t.sabengali = 0x09b8; 20027 t.sacute = 0x015b; 20028 t.sacutedotaccent = 0x1e65; 20029 t.sadarabic = 0x0635; 20030 t.sadeva = 0x0938; 20031 t.sadfinalarabic = 0xfeba; 20032 t.sadinitialarabic = 0xfebb; 20033 t.sadmedialarabic = 0xfebc; 20034 t.sagujarati = 0x0ab8; 20035 t.sagurmukhi = 0x0a38; 20036 t.sahiragana = 0x3055; 20037 t.sakatakana = 0x30b5; 20038 t.sakatakanahalfwidth = 0xff7b; 20039 t.sallallahoualayhewasallamarabic = 0xfdfa; 20040 t.samekh = 0x05e1; 20041 t.samekhdagesh = 0xfb41; 20042 t.samekhdageshhebrew = 0xfb41; 20043 t.samekhhebrew = 0x05e1; 20044 t.saraaathai = 0x0e32; 20045 t.saraaethai = 0x0e41; 20046 t.saraaimaimalaithai = 0x0e44; 20047 t.saraaimaimuanthai = 0x0e43; 20048 t.saraamthai = 0x0e33; 20049 t.saraathai = 0x0e30; 20050 t.saraethai = 0x0e40; 20051 t.saraiileftthai = 0xf886; 20052 t.saraiithai = 0x0e35; 20053 t.saraileftthai = 0xf885; 20054 t.saraithai = 0x0e34; 20055 t.saraothai = 0x0e42; 20056 t.saraueeleftthai = 0xf888; 20057 t.saraueethai = 0x0e37; 20058 t.saraueleftthai = 0xf887; 20059 t.sarauethai = 0x0e36; 20060 t.sarauthai = 0x0e38; 20061 t.sarauuthai = 0x0e39; 20062 t.sbopomofo = 0x3119; 20063 t.scaron = 0x0161; 20064 t.scarondotaccent = 0x1e67; 20065 t.scedilla = 0x015f; 20066 t.schwa = 0x0259; 20067 t.schwacyrillic = 0x04d9; 20068 t.schwadieresiscyrillic = 0x04db; 20069 t.schwahook = 0x025a; 20070 t.scircle = 0x24e2; 20071 t.scircumflex = 0x015d; 20072 t.scommaaccent = 0x0219; 20073 t.sdotaccent = 0x1e61; 20074 t.sdotbelow = 0x1e63; 20075 t.sdotbelowdotaccent = 0x1e69; 20076 t.seagullbelowcmb = 0x033c; 20077 t.second = 0x2033; 20078 t.secondtonechinese = 0x02ca; 20079 t.section = 0x00a7; 20080 t.seenarabic = 0x0633; 20081 t.seenfinalarabic = 0xfeb2; 20082 t.seeninitialarabic = 0xfeb3; 20083 t.seenmedialarabic = 0xfeb4; 20084 t.segol = 0x05b6; 20085 t.segol13 = 0x05b6; 20086 t.segol1f = 0x05b6; 20087 t.segol2c = 0x05b6; 20088 t.segolhebrew = 0x05b6; 20089 t.segolnarrowhebrew = 0x05b6; 20090 t.segolquarterhebrew = 0x05b6; 20091 t.segoltahebrew = 0x0592; 20092 t.segolwidehebrew = 0x05b6; 20093 t.seharmenian = 0x057d; 20094 t.sehiragana = 0x305b; 20095 t.sekatakana = 0x30bb; 20096 t.sekatakanahalfwidth = 0xff7e; 20097 t.semicolon = 0x003b; 20098 t.semicolonarabic = 0x061b; 20099 t.semicolonmonospace = 0xff1b; 20100 t.semicolonsmall = 0xfe54; 20101 t.semivoicedmarkkana = 0x309c; 20102 t.semivoicedmarkkanahalfwidth = 0xff9f; 20103 t.sentisquare = 0x3322; 20104 t.sentosquare = 0x3323; 20105 t.seven = 0x0037; 20106 t.sevenarabic = 0x0667; 20107 t.sevenbengali = 0x09ed; 20108 t.sevencircle = 0x2466; 20109 t.sevencircleinversesansserif = 0x2790; 20110 t.sevendeva = 0x096d; 20111 t.seveneighths = 0x215e; 20112 t.sevengujarati = 0x0aed; 20113 t.sevengurmukhi = 0x0a6d; 20114 t.sevenhackarabic = 0x0667; 20115 t.sevenhangzhou = 0x3027; 20116 t.sevenideographicparen = 0x3226; 20117 t.seveninferior = 0x2087; 20118 t.sevenmonospace = 0xff17; 20119 t.sevenoldstyle = 0xf737; 20120 t.sevenparen = 0x247a; 20121 t.sevenperiod = 0x248e; 20122 t.sevenpersian = 0x06f7; 20123 t.sevenroman = 0x2176; 20124 t.sevensuperior = 0x2077; 20125 t.seventeencircle = 0x2470; 20126 t.seventeenparen = 0x2484; 20127 t.seventeenperiod = 0x2498; 20128 t.seventhai = 0x0e57;
20129 t.sfthyphen = 0x00ad; 20130 t.shaarmenian = 0x0577; 20131 t.shabengali = 0x09b6; 20132 t.shacyrillic = 0x0448; 20133 t.shaddaarabic = 0x0651; 20134 t.shaddadammaarabic = 0xfc61; 20135 t.shaddadammatanarabic = 0xfc5e; 20136 t.shaddafathaarabic = 0xfc60; 20137 t.shaddakasraarabic = 0xfc62; 20138 t.shaddakasratanarabic = 0xfc5f; 20139 t.shade = 0x2592; 20140 t.shadedark = 0x2593; 20141 t.shadelight = 0x2591; 20142 t.shademedium = 0x2592; 20143 t.shadeva = 0x0936; 20144 t.shagujarati = 0x0ab6; 20145 t.shagurmukhi = 0x0a36; 20146 t.shalshelethebrew = 0x0593; 20147 t.shbopomofo = 0x3115; 20148 t.shchacyrillic = 0x0449; 20149 t.sheenarabic = 0x0634; 20150 t.sheenfinalarabic = 0xfeb6; 20151 t.sheeninitialarabic = 0xfeb7; 20152 t.sheenmedialarabic = 0xfeb8; 20153 t.sheicoptic = 0x03e3; 20154 t.sheqel = 0x20aa; 20155 t.sheqelhebrew = 0x20aa; 20156 t.sheva = 0x05b0; 20157 t.sheva115 = 0x05b0; 20158 t.sheva15 = 0x05b0; 20159 t.sheva22 = 0x05b0; 20160 t.sheva2e = 0x05b0; 20161 t.shevahebrew = 0x05b0; 20162 t.shevanarrowhebrew = 0x05b0; 20163 t.shevaquarterhebrew = 0x05b0; 20164 t.shevawidehebrew = 0x05b0; 20165 t.shhacyrillic = 0x04bb; 20166 t.shimacoptic = 0x03ed; 20167 t.shin = 0x05e9; 20168 t.shindagesh = 0xfb49; 20169 t.shindageshhebrew = 0xfb49; 20170 t.shindageshshindot = 0xfb2c; 20171 t.shindageshshindothebrew = 0xfb2c; 20172 t.shindageshsindot = 0xfb2d; 20173 t.shindageshsindothebrew = 0xfb2d; 20174 t.shindothebrew = 0x05c1; 20175 t.shinhebrew = 0x05e9; 20176 t.shinshindot = 0xfb2a; 20177 t.shinshindothebrew = 0xfb2a; 20178 t.shinsindot = 0xfb2b; 20179 t.shinsindothebrew = 0xfb2b; 20180 t.shook = 0x0282; 20181 t.sigma = 0x03c3; 20182 t.sigma1 = 0x03c2; 20183 t.sigmafinal = 0x03c2; 20184 t.sigmalunatesymbolgreek = 0x03f2; 20185 t.sihiragana = 0x3057; 20186 t.sikatakana = 0x30b7; 20187 t.sikatakanahalfwidth = 0xff7c; 20188 t.siluqhebrew = 0x05bd; 20189 t.siluqlefthebrew = 0x05bd; 20190 t.similar = 0x223c; 20191 t.sindothebrew = 0x05c2; 20192 t.siosacirclekorean = 0x3274; 20193 t.siosaparenkorean = 0x3214; 20194 t.sioscieuckorean = 0x317e; 20195 t.sioscirclekorean = 0x3266; 20196 t.sioskiyeokkorean = 0x317a; 20197 t.sioskorean = 0x3145; 20198 t.siosnieunkorean = 0x317b; 20199 t.siosparenkorean = 0x3206; 20200 t.siospieupkorean = 0x317d; 20201 t.siostikeutkorean = 0x317c; 20202 t.six = 0x0036; 20203 t.sixarabic = 0x0666; 20204 t.sixbengali = 0x09ec; 20205 t.sixcircle = 0x2465; 20206 t.sixcircleinversesansserif = 0x278f; 20207 t.sixdeva = 0x096c; 20208 t.sixgujarati = 0x0aec; 20209 t.sixgurmukhi = 0x0a6c; 20210 t.sixhackarabic = 0x0666; 20211 t.sixhangzhou = 0x3026; 20212 t.sixideographicparen = 0x3225; 20213 t.sixinferior = 0x2086; 20214 t.sixmonospace = 0xff16; 20215 t.sixoldstyle = 0xf736; 20216 t.sixparen = 0x2479; 20217 t.sixperiod = 0x248d; 20218 t.sixpersian = 0x06f6; 20219 t.sixroman = 0x2175; 20220 t.sixsuperior = 0x2076; 20221 t.sixteencircle = 0x246f; 20222 t.sixteencurrencydenominatorbengali = 0x09f9; 20223 t.sixteenparen = 0x2483; 20224 t.sixteenperiod = 0x2497; 20225 t.sixthai = 0x0e56; 20226 t.slash = 0x002f; 20227 t.slashmonospace = 0xff0f; 20228 t.slong = 0x017f; 20229 t.slongdotaccent = 0x1e9b; 20230 t.smileface = 0x263a; 20231 t.smonospace = 0xff53; 20232 t.sofpasuqhebrew = 0x05c3; 20233 t.softhyphen = 0x00ad; 20234 t.softsigncyrillic = 0x044c; 20235 t.sohiragana = 0x305d; 20236 t.sokatakana = 0x30bd; 20237 t.sokatakanahalfwidth = 0xff7f; 20238 t.soliduslongoverlaycmb = 0x0338; 20239 t.solidusshortoverlaycmb = 0x0337; 20240 t.sorusithai = 0x0e29; 20241 t.sosalathai = 0x0e28; 20242 t.sosothai = 0x0e0b; 20243 t.sosuathai = 0x0e2a; 20244 t.space = 0x0020; 20245 t.spacehackarabic = 0x0020; 20246 t.spade = 0x2660; 20247 t.spadesuitblack = 0x2660; 20248 t.spadesuitwhite = 0x2664; 20249 t.sparen = 0x24ae; 20250 t.squarebelowcmb = 0x033b; 20251 t.squarecc = 0x33c4; 20252 t.squarecm = 0x339d; 20253 t.squarediagonalcrosshatchfill = 0x25a9; 20254 t.squarehorizontalfill = 0x25a4; 20255 t.squarekg = 0x338f; 20256 t.squarekm = 0x339e; 20257 t.squarekmcapital = 0x33ce; 20258 t.squareln = 0x33d1; 20259 t.squarelog = 0x33d2; 20260 t.squaremg = 0x338e; 20261 t.squaremil = 0x33d5; 20262 t.squaremm = 0x339c; 20263 t.squaremsquared = 0x33a1; 20264 t.squareorthogonalcrosshatchfill = 0x25a6; 20265 t.squareupperlefttolowerrightfill = 0x25a7; 20266 t.squareupperrighttolowerleftfill = 0x25a8; 20267 t.squareverticalfill = 0x25a5; 20268 t.squarewhitewithsmallblack = 0x25a3; 20269 t.srsquare = 0x33db; 20270 t.ssabengali = 0x09b7; 20271 t.ssadeva = 0x0937; 20272 t.ssagujarati = 0x0ab7; 20273 t.ssangcieuckorean = 0x3149; 20274 t.ssanghieuhkorean = 0x3185; 20275 t.ssangieungkorean = 0x3180; 20276 t.ssangkiyeokkorean = 0x3132; 20277 t.ssangnieunkorean = 0x3165; 20278 t.ssangpieupkorean = 0x3143; 20279 t.ssangsioskorean = 0x3146; 20280 t.ssangtikeutkorean = 0x3138; 20281 t.ssuperior = 0xf6f2; 20282 t.sterling = 0x00a3; 20283 t.sterlingmonospace = 0xffe1; 20284 t.strokelongoverlaycmb = 0x0336; 20285 t.strokeshortoverlaycmb = 0x0335; 20286 t.subset = 0x2282; 20287 t.subsetnotequal = 0x228a; 20288 t.subsetorequal = 0x2286; 20289 t.succeeds = 0x227b; 20290 t.suchthat = 0x220b; 20291 t.suhiragana = 0x3059; 20292 t.sukatakana = 0x30b9; 20293 t.sukatakanahalfwidth = 0xff7d; 20294 t.sukunarabic = 0x0652; 20295 t.summation = 0x2211; 20296 t.sun = 0x263c; 20297 t.superset = 0x2283; 20298 t.supersetnotequal = 0x228b; 20299 t.supersetorequal = 0x2287; 20300 t.svsquare = 0x33dc; 20301 t.syouwaerasquare = 0x337c; 20302 t.t = 0x0074; 20303 t.tabengali = 0x09a4; 20304 t.tackdown = 0x22a4; 20305 t.tackleft = 0x22a3; 20306 t.tadeva = 0x0924; 20307 t.tagujarati = 0x0aa4; 20308 t.tagurmukhi = 0x0a24; 20309 t.taharabic = 0x0637; 20310 t.tahfinalarabic = 0xfec2; 20311 t.tahinitialarabic = 0xfec3; 20312 t.tahiragana = 0x305f; 20313 t.tahmedialarabic = 0xfec4; 20314 t.taisyouerasquare = 0x337d; 20315 t.takatakana = 0x30bf; 20316 t.takatakanahalfwidth = 0xff80; 20317 t.tatweelarabic = 0x0640; 20318 t.tau = 0x03c4; 20319 t.tav = 0x05ea; 20320 t.tavdages = 0xfb4a; 20321 t.tavdagesh = 0xfb4a; 20322 t.tavdageshhebrew = 0xfb4a; 20323 t.tavhebrew = 0x05ea; 20324 t.tbar = 0x0167; 20325 t.tbopomofo = 0x310a; 20326 t.tcaron = 0x0165; 20327 t.tccurl = 0x02a8; 20328 t.tcedilla = 0x0163; 20329 t.tcheharabic = 0x0686; 20330 t.tchehfinalarabic = 0xfb7b; 20331 t.tchehinitialarabic = 0xfb7c; 20332 t.tchehmedialarabic = 0xfb7d; 20333 t.tcircle = 0x24e3; 20334 t.tcircumflexbelow = 0x1e71; 20335 t.tcommaaccent = 0x0163; 20336 t.tdieresis = 0x1e97; 20337 t.tdotaccent = 0x1e6b; 20338 t.tdotbelow = 0x1e6d; 20339 t.tecyrillic = 0x0442; 20340 t.tedescendercyrillic = 0x04ad; 20341 t.teharabic = 0x062a; 20342 t.tehfinalarabic = 0xfe96; 20343 t.tehhahinitialarabic = 0xfca2; 20344 t.tehhahisolatedarabic = 0xfc0c; 20345 t.tehinitialarabic = 0xfe97; 20346 t.tehiragana = 0x3066; 20347 t.tehjeeminitialarabic = 0xfca1; 20348 t.tehjeemisolatedarabic = 0xfc0b; 20349 t.tehmarbutaarabic = 0x0629; 20350 t.tehmarbutafinalarabic = 0xfe94; 20351 t.tehmedialarabic = 0xfe98; 20352 t.tehmeeminitialarabic = 0xfca4; 20353 t.tehmeemisolatedarabic = 0xfc0e; 20354 t.tehnoonfinalarabic = 0xfc73; 20355 t.tekatakana = 0x30c6; 20356 t.tekatakanahalfwidth = 0xff83; 20357 t.telephone = 0x2121; 20358 t.telephoneblack = 0x260e; 20359 t.telishagedolahebrew = 0x05a0; 20360 t.telishaqetanahebrew = 0x05a9; 20361 t.tencircle = 0x2469; 20362 t.tenideographicparen = 0x3229; 20363 t.tenparen = 0x247d; 20364 t.tenperiod = 0x2491; 20365 t.tenroman = 0x2179; 20366 t.tesh = 0x02a7; 20367 t.tet = 0x05d8; 20368 t.tetdagesh = 0xfb38; 20369 t.tetdageshhebrew = 0xfb38; 20370 t.tethebrew = 0x05d8; 20371 t.tetsecyrillic = 0x04b5; 20372 t.tevirhebrew = 0x059b; 20373 t.tevirlefthebrew = 0x059b; 20374 t.thabengali = 0x09a5; 20375 t.thadeva = 0x0925; 20376 t.thagujarati = 0x0aa5; 20377 t.thagurmukhi = 0x0a25; 20378 t.thalarabic = 0x0630; 20379 t.thalfinalarabic = 0xfeac; 20380 t.thanthakhatlowleftthai = 0xf898; 20381 t.thanthakhatlowrightthai = 0xf897; 20382 t.thanthakhatthai = 0x0e4c; 20383 t.thanthakhatupperleftthai = 0xf896; 20384 t.theharabic = 0x062b; 20385 t.thehfinalarabic = 0xfe9a; 20386 t.thehinitialarabic = 0xfe9b; 20387 t.thehmedialarabic = 0xfe9c; 20388 t.thereexists = 0x2203; 20389 t.therefore = 0x2234; 20390 t.theta = 0x03b8; 20391 t.theta1 = 0x03d1; 20392 t.thetasymbolgreek = 0x03d1; 20393 t.thieuthacirclekorean = 0x3279; 20394 t.thieuthaparenkorean = 0x3219; 20395 t.thieuthcirclekorean = 0x326b; 20396 t.thieuthkorean = 0x314c; 20397 t.thieuthparenkorean = 0x320b; 20398 t.thirteencircle = 0x246c; 20399 t.thirteenparen = 0x2480; 20400 t.thirteenperiod = 0x2494; 20401 t.thonangmonthothai = 0x0e11; 20402 t.thook = 0x01ad; 20403 t.thophuthaothai = 0x0e12; 20404 t.thorn = 0x00fe; 20405 t.thothahanthai = 0x0e17; 20406 t.thothanthai = 0x0e10; 20407 t.thothongthai = 0x0e18; 20408 t.thothungthai = 0x0e16; 20409 t.thousandcyrillic = 0x0482; 20410 t.thousandsseparatorarabic = 0x066c; 20411 t.thousandsseparatorpersian = 0x066c; 20412 t.three = 0x0033; 20413 t.threearabic = 0x0663; 20414 t.threebengali = 0x09e9; 20415 t.threecircle = 0x2462; 20416 t.threecircleinversesansserif = 0x278c; 20417 t.threedeva = 0x0969; 20418 t.threeeighths = 0x215c; 20419 t.threegujarati = 0x0ae9; 20420 t.threegurmukhi = 0x0a69; 20421 t.threehackarabic = 0x0663; 20422 t.threehangzhou = 0x3023; 20423 t.threeideographicparen = 0x3222; 20424 t.threeinferior = 0x2083; 20425 t.threemonospace = 0xff13; 20426 t.threenumeratorbengali = 0x09f6; 20427 t.threeoldstyle = 0xf733; 20428 t.threeparen = 0x2476; 20429 t.threeperiod = 0x248a; 20430 t.threepersian = 0x06f3; 20431 t.threequarters = 0x00be; 20432 t.threequartersemdash = 0xf6de; 20433 t.threeroman = 0x2172; 20434 t.threesuperior = 0x00b3; 20435 t.threethai = 0x0e53; 20436 t.thzsquare = 0x3394; 20437 t.tihiragana = 0x3061; 20438 t.tikatakana = 0x30c1; 20439 t.tikatakanahalfwidth = 0xff81; 20440 t.tikeutacirclekorean = 0x3270; 20441 t.tikeutaparenkorean = 0x3210; 20442 t.tikeutcirclekorean = 0x3262; 20443 t.tikeutkorean = 0x3137; 20444 t.tikeutparenkorean = 0x3202; 20445 t.tilde = 0x02dc; 20446 t.tildebelowcmb = 0x0330; 20447 t.tildecmb = 0x0303; 20448 t.tildecomb = 0x0303; 20449 t.tildedoublecmb = 0x0360; 20450 t.tildeoperator = 0x223c; 20451 t.tildeoverlaycmb = 0x0334; 20452 t.tildeverticalcmb = 0x033e; 20453 t.timescircle = 0x2297; 20454 t.tipehahebrew = 0x0596; 20455 t.tipehalefthebrew = 0x0596; 20456 t.tippigurmukhi = 0x0a70; 20457 t.titlocyrilliccmb = 0x0483; 20458 t.tiwnarmenian = 0x057f; 20459 t.tlinebelow = 0x1e6f; 20460 t.tmonospace = 0xff54; 20461 t.toarmenian = 0x0569; 20462 t.tohiragana = 0x3068; 20463 t.tokatakana = 0x30c8; 20464 t.tokatakanahalfwidth = 0xff84; 20465 t.tonebarextrahighmod = 0x02e5; 20466 t.tonebarextralowmod = 0x02e9; 20467 t.tonebarhighmod = 0x02e6; 20468 t.tonebarlowmod = 0x02e8; 20469 t.tonebarmidmod = 0x02e7; 20470 t.tonefive = 0x01bd; 20471 t.tonesix = 0x0185; 20472 t.tonetwo = 0x01a8;
20473 t.tonos = 0x0384; 20474 t.tonsquare = 0x3327; 20475 t.topatakthai = 0x0e0f; 20476 t.tortoiseshellbracketleft = 0x3014; 20477 t.tortoiseshellbracketleftsmall = 0xfe5d; 20478 t.tortoiseshellbracketleftvertical = 0xfe39; 20479 t.tortoiseshellbracketright = 0x3015; 20480 t.tortoiseshellbracketrightsmall = 0xfe5e; 20481 t.tortoiseshellbracketrightvertical = 0xfe3a; 20482 t.totaothai = 0x0e15; 20483 t.tpalatalhook = 0x01ab; 20484 t.tparen = 0x24af; 20485 t.trademark = 0x2122; 20486 t.trademarksans = 0xf8ea; 20487 t.trademarkserif = 0xf6db; 20488 t.tretroflexhook = 0x0288; 20489 t.triagdn = 0x25bc; 20490 t.triaglf = 0x25c4; 20491 t.triagrt = 0x25ba; 20492 t.triagup = 0x25b2; 20493 t.ts = 0x02a6; 20494 t.tsadi = 0x05e6; 20495 t.tsadidagesh = 0xfb46; 20496 t.tsadidageshhebrew = 0xfb46; 20497 t.tsadihebrew = 0x05e6; 20498 t.tsecyrillic = 0x0446; 20499 t.tsere = 0x05b5; 20500 t.tsere12 = 0x05b5; 20501 t.tsere1e = 0x05b5; 20502 t.tsere2b = 0x05b5; 20503 t.tserehebrew = 0x05b5; 20504 t.tserenarrowhebrew = 0x05b5; 20505 t.tserequarterhebrew = 0x05b5; 20506 t.tserewidehebrew = 0x05b5; 20507 t.tshecyrillic = 0x045b; 20508 t.tsuperior = 0xf6f3; 20509 t.ttabengali = 0x099f; 20510 t.ttadeva = 0x091f; 20511 t.ttagujarati = 0x0a9f; 20512 t.ttagurmukhi = 0x0a1f; 20513 t.tteharabic = 0x0679; 20514 t.ttehfinalarabic = 0xfb67; 20515 t.ttehinitialarabic = 0xfb68; 20516 t.ttehmedialarabic = 0xfb69; 20517 t.tthabengali = 0x09a0; 20518 t.tthadeva = 0x0920; 20519 t.tthagujarati = 0x0aa0; 20520 t.tthagurmukhi = 0x0a20; 20521 t.tturned = 0x0287; 20522 t.tuhiragana = 0x3064; 20523 t.tukatakana = 0x30c4; 20524 t.tukatakanahalfwidth = 0xff82; 20525 t.tusmallhiragana = 0x3063; 20526 t.tusmallkatakana = 0x30c3; 20527 t.tusmallkatakanahalfwidth = 0xff6f; 20528 t.twelvecircle = 0x246b; 20529 t.twelveparen = 0x247f; 20530 t.twelveperiod = 0x2493; 20531 t.twelveroman = 0x217b; 20532 t.twentycircle = 0x2473; 20533 t.twentyhangzhou = 0x5344; 20534 t.twentyparen = 0x2487; 20535 t.twentyperiod = 0x249b; 20536 t.two = 0x0032; 20537 t.twoarabic = 0x0662; 20538 t.twobengali = 0x09e8; 20539 t.twocircle = 0x2461; 20540 t.twocircleinversesansserif = 0x278b; 20541 t.twodeva = 0x0968; 20542 t.twodotenleader = 0x2025; 20543 t.twodotleader = 0x2025; 20544 t.twodotleadervertical = 0xfe30; 20545 t.twogujarati = 0x0ae8; 20546 t.twogurmukhi = 0x0a68; 20547 t.twohackarabic = 0x0662; 20548 t.twohangzhou = 0x3022; 20549 t.twoideographicparen = 0x3221; 20550 t.twoinferior = 0x2082; 20551 t.twomonospace = 0xff12; 20552 t.twonumeratorbengali = 0x09f5; 20553 t.twooldstyle = 0xf732; 20554 t.twoparen = 0x2475; 20555 t.twoperiod = 0x2489; 20556 t.twopersian = 0x06f2; 20557 t.tworoman = 0x2171; 20558 t.twostroke = 0x01bb; 20559 t.twosuperior = 0x00b2; 20560 t.twothai = 0x0e52; 20561 t.twothirds = 0x2154; 20562 t.u = 0x0075; 20563 t.uacute = 0x00fa; 20564 t.ubar = 0x0289; 20565 t.ubengali = 0x0989; 20566 t.ubopomofo = 0x3128; 20567 t.ubreve = 0x016d; 20568 t.ucaron = 0x01d4; 20569 t.ucircle = 0x24e4; 20570 t.ucircumflex = 0x00fb; 20571 t.ucircumflexbelow = 0x1e77; 20572 t.ucyrillic = 0x0443; 20573 t.udattadeva = 0x0951; 20574 t.udblacute = 0x0171; 20575 t.udblgrave = 0x0215; 20576 t.udeva = 0x0909; 20577 t.udieresis = 0x00fc; 20578 t.udieresisacute = 0x01d8; 20579 t.udieresisbelow = 0x1e73; 20580 t.udieresiscaron = 0x01da; 20581 t.udieresiscyrillic = 0x04f1; 20582 t.udieresisgrave = 0x01dc; 20583 t.udieresismacron = 0x01d6; 20584 t.udotbelow = 0x1ee5; 20585 t.ugrave = 0x00f9; 20586 t.ugujarati = 0x0a89; 20587 t.ugurmukhi = 0x0a09; 20588 t.uhiragana = 0x3046; 20589 t.uhookabove = 0x1ee7; 20590 t.uhorn = 0x01b0; 20591 t.uhornacute = 0x1ee9; 20592 t.uhorndotbelow = 0x1ef1; 20593 t.uhorngrave = 0x1eeb; 20594 t.uhornhookabove = 0x1eed; 20595 t.uhorntilde = 0x1eef; 20596 t.uhungarumlaut = 0x0171; 20597 t.uhungarumlautcyrillic = 0x04f3; 20598 t.uinvertedbreve = 0x0217; 20599 t.ukatakana = 0x30a6; 20600 t.ukatakanahalfwidth = 0xff73; 20601 t.ukcyrillic = 0x0479; 20602 t.ukorean = 0x315c; 20603 t.umacron = 0x016b; 20604 t.umacroncyrillic = 0x04ef; 20605 t.umacrondieresis = 0x1e7b; 20606 t.umatragurmukhi = 0x0a41; 20607 t.umonospace = 0xff55; 20608 t.underscore = 0x005f; 20609 t.underscoredbl = 0x2017; 20610 t.underscoremonospace = 0xff3f; 20611 t.underscorevertical = 0xfe33; 20612 t.underscorewavy = 0xfe4f; 20613 t.union = 0x222a; 20614 t.universal = 0x2200; 20615 t.uogonek = 0x0173; 20616 t.uparen = 0x24b0; 20617 t.upblock = 0x2580; 20618 t.upperdothebrew = 0x05c4; 20619 t.upsilon = 0x03c5; 20620 t.upsilondieresis = 0x03cb; 20621 t.upsilondieresistonos = 0x03b0; 20622 t.upsilonlatin = 0x028a; 20623 t.upsilontonos = 0x03cd; 20624 t.uptackbelowcmb = 0x031d; 20625 t.uptackmod = 0x02d4; 20626 t.uragurmukhi = 0x0a73; 20627 t.uring = 0x016f; 20628 t.ushortcyrillic = 0x045e; 20629 t.usmallhiragana = 0x3045; 20630 t.usmallkatakana = 0x30a5; 20631 t.usmallkatakanahalfwidth = 0xff69; 20632 t.ustraightcyrillic = 0x04af; 20633 t.ustraightstrokecyrillic = 0x04b1; 20634 t.utilde = 0x0169; 20635 t.utildeacute = 0x1e79; 20636 t.utildebelow = 0x1e75; 20637 t.uubengali = 0x098a; 20638 t.uudeva = 0x090a; 20639 t.uugujarati = 0x0a8a; 20640 t.uugurmukhi = 0x0a0a; 20641 t.uumatragurmukhi = 0x0a42; 20642 t.uuvowelsignbengali = 0x09c2; 20643 t.uuvowelsigndeva = 0x0942; 20644 t.uuvowelsigngujarati = 0x0ac2; 20645 t.uvowelsignbengali = 0x09c1; 20646 t.uvowelsigndeva = 0x0941; 20647 t.uvowelsigngujarati = 0x0ac1; 20648 t.v = 0x0076; 20649 t.vadeva = 0x0935; 20650 t.vagujarati = 0x0ab5; 20651 t.vagurmukhi = 0x0a35; 20652 t.vakatakana = 0x30f7; 20653 t.vav = 0x05d5; 20654 t.vavdagesh = 0xfb35; 20655 t.vavdagesh65 = 0xfb35; 20656 t.vavdageshhebrew = 0xfb35; 20657 t.vavhebrew = 0x05d5; 20658 t.vavholam = 0xfb4b; 20659 t.vavholamhebrew = 0xfb4b; 20660 t.vavvavhebrew = 0x05f0; 20661 t.vavyodhebrew = 0x05f1; 20662 t.vcircle = 0x24e5; 20663 t.vdotbelow = 0x1e7f; 20664 t.vecyrillic = 0x0432; 20665 t.veharabic = 0x06a4; 20666 t.vehfinalarabic = 0xfb6b; 20667 t.vehinitialarabic = 0xfb6c; 20668 t.vehmedialarabic = 0xfb6d; 20669 t.vekatakana = 0x30f9; 20670 t.venus = 0x2640; 20671 t.verticalbar = 0x007c; 20672 t.verticallineabovecmb = 0x030d; 20673 t.verticallinebelowcmb = 0x0329; 20674 t.verticallinelowmod = 0x02cc; 20675 t.verticallinemod = 0x02c8; 20676 t.vewarmenian = 0x057e; 20677 t.vhook = 0x028b; 20678 t.vikatakana = 0x30f8; 20679 t.viramabengali = 0x09cd; 20680 t.viramadeva = 0x094d; 20681 t.viramagujarati = 0x0acd; 20682 t.visargabengali = 0x0983; 20683 t.visargadeva = 0x0903; 20684 t.visargagujarati = 0x0a83; 20685 t.vmonospace = 0xff56; 20686 t.voarmenian = 0x0578; 20687 t.voicediterationhiragana = 0x309e; 20688 t.voicediterationkatakana = 0x30fe; 20689 t.voicedmarkkana = 0x309b; 20690 t.voicedmarkkanahalfwidth = 0xff9e; 20691 t.vokatakana = 0x30fa; 20692 t.vparen = 0x24b1; 20693 t.vtilde = 0x1e7d; 20694 t.vturned = 0x028c; 20695 t.vuhiragana = 0x3094; 20696 t.vukatakana = 0x30f4; 20697 t.w = 0x0077; 20698 t.wacute = 0x1e83; 20699 t.waekorean = 0x3159; 20700 t.wahiragana = 0x308f; 20701 t.wakatakana = 0x30ef; 20702 t.wakatakanahalfwidth = 0xff9c; 20703 t.wakorean = 0x3158; 20704 t.wasmallhiragana = 0x308e; 20705 t.wasmallkatakana = 0x30ee; 20706 t.wattosquare = 0x3357; 20707 t.wavedash = 0x301c; 20708 t.wavyunderscorevertical = 0xfe34; 20709 t.wawarabic = 0x0648; 20710 t.wawfinalarabic = 0xfeee; 20711 t.wawhamzaabovearabic = 0x0624; 20712 t.wawhamzaabovefinalarabic = 0xfe86; 20713 t.wbsquare = 0x33dd; 20714 t.wcircle = 0x24e6; 20715 t.wcircumflex = 0x0175; 20716 t.wdieresis = 0x1e85; 20717 t.wdotaccent = 0x1e87; 20718 t.wdotbelow = 0x1e89; 20719 t.wehiragana = 0x3091; 20720 t.weierstrass = 0x2118; 20721 t.wekatakana = 0x30f1; 20722 t.wekorean = 0x315e; 20723 t.weokorean = 0x315d; 20724 t.wgrave = 0x1e81; 20725 t.whitebullet = 0x25e6; 20726 t.whitecircle = 0x25cb; 20727 t.whitecircleinverse = 0x25d9; 20728 t.whitecornerbracketleft = 0x300e; 20729 t.whitecornerbracketleftvertical = 0xfe43; 20730 t.whitecornerbracketright = 0x300f; 20731 t.whitecornerbracketrightvertical = 0xfe44; 20732 t.whitediamond = 0x25c7; 20733 t.whitediamondcontainingblacksmalldiamond = 0x25c8;
20734 t.whitedownpointingsmalltriangle = 0x25bf; 20735 t.whitedownpointingtriangle = 0x25bd; 20736 t.whiteleftpointingsmalltriangle = 0x25c3; 20737 t.whiteleftpointingtriangle = 0x25c1; 20738 t.whitelenticularbracketleft = 0x3016; 20739 t.whitelenticularbracketright = 0x3017; 20740 t.whiterightpointingsmalltriangle = 0x25b9; 20741 t.whiterightpointingtriangle = 0x25b7; 20742 t.whitesmallsquare = 0x25ab; 20743 t.whitesmilingface = 0x263a; 20744 t.whitesquare = 0x25a1; 20745 t.whitestar = 0x2606; 20746 t.whitetelephone = 0x260f; 20747 t.whitetortoiseshellbracketleft = 0x3018; 20748 t.whitetortoiseshellbracketright = 0x3019; 20749 t.whiteuppointingsmalltriangle = 0x25b5; 20750 t.whiteuppointingtriangle = 0x25b3; 20751 t.wihiragana = 0x3090; 20752 t.wikatakana = 0x30f0; 20753 t.wikorean = 0x315f; 20754 t.wmonospace = 0xff57; 20755 t.wohiragana = 0x3092; 20756 t.wokatakana = 0x30f2; 20757 t.wokatakanahalfwidth = 0xff66; 20758 t.won = 0x20a9; 20759 t.wonmonospace = 0xffe6; 20760 t.wowaenthai = 0x0e27; 20761 t.wparen = 0x24b2; 20762 t.wring = 0x1e98; 20763 t.wsuperior = 0x02b7; 20764 t.wturned = 0x028d; 20765 t.wynn = 0x01bf; 20766 t.x = 0x0078; 20767 t.xabovecmb = 0x033d; 20768 t.xbopomofo = 0x3112; 20769 t.xcircle = 0x24e7; 20770 t.xdieresis = 0x1e8d; 20771 t.xdotaccent = 0x1e8b; 20772 t.xeharmenian = 0x056d; 20773 t.xi = 0x03be; 20774 t.xmonospace = 0xff58; 20775 t.xparen = 0x24b3; 20776 t.xsuperior = 0x02e3; 20777 t.y = 0x0079; 20778 t.yaadosquare = 0x334e; 20779 t.yabengali = 0x09af; 20780 t.yacute = 0x00fd; 20781 t.yadeva = 0x092f; 20782 t.yaekorean = 0x3152; 20783 t.yagujarati = 0x0aaf; 20784 t.yagurmukhi = 0x0a2f; 20785 t.yahiragana = 0x3084; 20786 t.yakatakana = 0x30e4; 20787 t.yakatakanahalfwidth = 0xff94; 20788 t.yakorean = 0x3151; 20789 t.yamakkanthai = 0x0e4e; 20790 t.yasmallhiragana = 0x3083; 20791 t.yasmallkatakana = 0x30e3; 20792 t.yasmallkatakanahalfwidth = 0xff6c; 20793 t.yatcyrillic = 0x0463; 20794 t.ycircle = 0x24e8; 20795 t.ycircumflex = 0x0177; 20796 t.ydieresis = 0x00ff; 20797 t.ydotaccent = 0x1e8f; 20798 t.ydotbelow = 0x1ef5; 20799 t.yeharabic = 0x064a; 20800 t.yehbarreearabic = 0x06d2; 20801 t.yehbarreefinalarabic = 0xfbaf; 20802 t.yehfinalarabic = 0xfef2; 20803 t.yehhamzaabovearabic = 0x0626; 20804 t.yehhamzaabovefinalarabic = 0xfe8a; 20805 t.yehhamzaaboveinitialarabic = 0xfe8b; 20806 t.yehhamzaabovemedialarabic = 0xfe8c; 20807 t.yehinitialarabic = 0xfef3; 20808 t.yehmedialarabic = 0xfef4; 20809 t.yehmeeminitialarabic = 0xfcdd; 20810 t.yehmeemisolatedarabic = 0xfc58; 20811 t.yehnoonfinalarabic = 0xfc94; 20812 t.yehthreedotsbelowarabic = 0x06d1; 20813 t.yekorean = 0x3156; 20814 t.yen = 0x00a5; 20815 t.yenmonospace = 0xffe5; 20816 t.yeokorean = 0x3155; 20817 t.yeorinhieuhkorean = 0x3186; 20818 t.yerahbenyomohebrew = 0x05aa; 20819 t.yerahbenyomolefthebrew = 0x05aa; 20820 t.yericyrillic = 0x044b; 20821 t.yerudieresiscyrillic = 0x04f9; 20822 t.yesieungkorean = 0x3181; 20823 t.yesieungpansioskorean = 0x3183; 20824 t.yesieungsioskorean = 0x3182; 20825 t.yetivhebrew = 0x059a; 20826 t.ygrave = 0x1ef3; 20827 t.yhook = 0x01b4; 20828 t.yhookabove = 0x1ef7; 20829 t.yiarmenian = 0x0575; 20830 t.yicyrillic = 0x0457; 20831 t.yikorean = 0x3162; 20832 t.yinyang = 0x262f; 20833 t.yiwnarmenian = 0x0582; 20834 t.ymonospace = 0xff59; 20835 t.yod = 0x05d9; 20836 t.yoddagesh = 0xfb39; 20837 t.yoddageshhebrew = 0xfb39; 20838 t.yodhebrew = 0x05d9; 20839 t.yodyodhebrew = 0x05f2; 20840 t.yodyodpatahhebrew = 0xfb1f; 20841 t.yohiragana = 0x3088; 20842 t.yoikorean = 0x3189; 20843 t.yokatakana = 0x30e8; 20844 t.yokatakanahalfwidth = 0xff96; 20845 t.yokorean = 0x315b; 20846 t.yosmallhiragana = 0x3087; 20847 t.yosmallkatakana = 0x30e7; 20848 t.yosmallkatakanahalfwidth = 0xff6e; 20849 t.yotgreek = 0x03f3; 20850 t.yoyaekorean = 0x3188; 20851 t.yoyakorean = 0x3187; 20852 t.yoyakthai = 0x0e22; 20853 t.yoyingthai = 0x0e0d; 20854 t.yparen = 0x24b4; 20855 t.ypogegrammeni = 0x037a; 20856 t.ypogegrammenigreekcmb = 0x0345; 20857 t.yr = 0x01a6; 20858 t.yring = 0x1e99; 20859 t.ysuperior = 0x02b8; 20860 t.ytilde = 0x1ef9; 20861 t.yturned = 0x028e; 20862 t.yuhiragana = 0x3086; 20863 t.yuikorean = 0x318c; 20864 t.yukatakana = 0x30e6; 20865 t.yukatakanahalfwidth = 0xff95; 20866 t.yukorean = 0x3160; 20867 t.yusbigcyrillic = 0x046b; 20868 t.yusbigiotifiedcyrillic = 0x046d; 20869 t.yuslittlecyrillic = 0x0467; 20870 t.yuslittleiotifiedcyrillic = 0x0469; 20871 t.yusmallhiragana = 0x3085; 20872 t.yusmallkatakana = 0x30e5; 20873 t.yusmallkatakanahalfwidth = 0xff6d; 20874 t.yuyekorean = 0x318b; 20875 t.yuyeokorean = 0x318a; 20876 t.yyabengali = 0x09df; 20877 t.yyadeva = 0x095f; 20878 t.z = 0x007a; 20879 t.zaarmenian = 0x0566; 20880 t.zacute = 0x017a; 20881 t.zadeva = 0x095b; 20882 t.zagurmukhi = 0x0a5b; 20883 t.zaharabic = 0x0638; 20884 t.zahfinalarabic = 0xfec6; 20885 t.zahinitialarabic = 0xfec7; 20886 t.zahiragana = 0x3056; 20887 t.zahmedialarabic = 0xfec8; 20888 t.zainarabic = 0x0632; 20889 t.zainfinalarabic = 0xfeb0; 20890 t.zakatakana = 0x30b6; 20891 t.zaqefgadolhebrew = 0x0595; 20892 t.zaqefqatanhebrew = 0x0594; 20893 t.zarqahebrew = 0x0598; 20894 t.zayin = 0x05d6; 20895 t.zayindagesh = 0xfb36; 20896 t.zayindageshhebrew = 0xfb36; 20897 t.zayinhebrew = 0x05d6; 20898 t.zbopomofo = 0x3117; 20899 t.zcaron = 0x017e; 20900 t.zcircle = 0x24e9; 20901 t.zcircumflex = 0x1e91; 20902 t.zcurl = 0x0291; 20903 t.zdot = 0x017c; 20904 t.zdotaccent = 0x017c; 20905 t.zdotbelow = 0x1e93; 20906 t.zecyrillic = 0x0437; 20907 t.zedescendercyrillic = 0x0499; 20908 t.zedieresiscyrillic = 0x04df; 20909 t.zehiragana = 0x305c; 20910 t.zekatakana = 0x30bc; 20911 t.zero = 0x0030; 20912 t.zeroarabic = 0x0660; 20913 t.zerobengali = 0x09e6; 20914 t.zerodeva = 0x0966; 20915 t.zerogujarati = 0x0ae6; 20916 t.zerogurmukhi = 0x0a66; 20917 t.zerohackarabic = 0x0660; 20918 t.zeroinferior = 0x2080; 20919 t.zeromonospace = 0xff10; 20920 t.zerooldstyle = 0xf730; 20921 t.zeropersian = 0x06f0; 20922 t.zerosuperior = 0x2070; 20923 t.zerothai = 0x0e50; 20924 t.zerowidthjoiner = 0xfeff; 20925 t.zerowidthnonjoiner = 0x200c; 20926 t.zerowidthspace = 0x200b; 20927 t.zeta = 0x03b6; 20928 t.zhbopomofo = 0x3113; 20929 t.zhearmenian = 0x056a; 20930 t.zhebrevecyrillic = 0x04c2; 20931 t.zhecyrillic = 0x0436; 20932 t.zhedescendercyrillic = 0x0497; 20933 t.zhedieresiscyrillic = 0x04dd; 20934 t.zihiragana = 0x3058; 20935 t.zikatakana = 0x30b8; 20936 t.zinorhebrew = 0x05ae; 20937 t.zlinebelow = 0x1e95; 20938 t.zmonospace = 0xff5a; 20939 t.zohiragana = 0x305e; 20940 t.zokatakana = 0x30be; 20941 t.zparen = 0x24b5; 20942 t.zretroflexhook = 0x0290; 20943 t.zstroke = 0x01b6; 20944 t.zuhiragana = 0x305a; 20945 t.zukatakana = 0x30ba;
20946 t[".notdef"] = 0x0000; 20947 t.angbracketleftbig = 0x2329; 20948 t.angbracketleftBig = 0x2329; 20949 t.angbracketleftbigg = 0x2329; 20950 t.angbracketleftBigg = 0x2329; 20951 t.angbracketrightBig = 0x232a; 20952 t.angbracketrightbig = 0x232a; 20953 t.angbracketrightBigg = 0x232a; 20954 t.angbracketrightbigg = 0x232a; 20955 t.arrowhookleft = 0x21aa; 20956 t.arrowhookright = 0x21a9; 20957 t.arrowlefttophalf = 0x21bc; 20958 t.arrowleftbothalf = 0x21bd; 20959 t.arrownortheast = 0x2197; 20960 t.arrownorthwest = 0x2196; 20961 t.arrowrighttophalf = 0x21c0; 20962 t.arrowrightbothalf = 0x21c1; 20963 t.arrowsoutheast = 0x2198; 20964 t.arrowsouthwest = 0x2199; 20965 t.backslashbig = 0x2216; 20966 t.backslashBig = 0x2216; 20967 t.backslashBigg = 0x2216; 20968 t.backslashbigg = 0x2216; 20969 t.bardbl = 0x2016; 20970 t.bracehtipdownleft = 0xfe37; 20971 t.bracehtipdownright = 0xfe37; 20972 t.bracehtipupleft = 0xfe38; 20973 t.bracehtipupright = 0xfe38; 20974 t.braceleftBig = 0x007b; 20975 t.braceleftbig = 0x007b; 20976 t.braceleftbigg = 0x007b; 20977 t.braceleftBigg = 0x007b; 20978 t.bracerightBig = 0x007d; 20979 t.bracerightbig = 0x007d; 20980 t.bracerightbigg = 0x007d; 20981 t.bracerightBigg = 0x007d; 20982 t.bracketleftbig = 0x005b; 20983 t.bracketleftBig = 0x005b; 20984 t.bracketleftbigg = 0x005b; 20985 t.bracketleftBigg = 0x005b; 20986 t.bracketrightBig = 0x005d; 20987 t.bracketrightbig = 0x005d; 20988 t.bracketrightbigg = 0x005d; 20989 t.bracketrightBigg = 0x005d; 20990 t.ceilingleftbig = 0x2308; 20991 t.ceilingleftBig = 0x2308; 20992 t.ceilingleftBigg = 0x2308; 20993 t.ceilingleftbigg = 0x2308; 20994 t.ceilingrightbig = 0x2309; 20995 t.ceilingrightBig = 0x2309; 20996 t.ceilingrightbigg = 0x2309; 20997 t.ceilingrightBigg = 0x2309; 20998 t.circledotdisplay = 0x2299; 20999 t.circledottext = 0x2299; 21000 t.circlemultiplydisplay = 0x2297; 21001 t.circlemultiplytext = 0x2297; 21002 t.circleplusdisplay = 0x2295; 21003 t.circleplustext = 0x2295; 21004 t.contintegraldisplay = 0x222e; 21005 t.contintegraltext = 0x222e; 21006 t.coproductdisplay = 0x2210; 21007 t.coproducttext = 0x2210; 21008 t.floorleftBig = 0x230a; 21009 t.floorleftbig = 0x230a; 21010 t.floorleftbigg = 0x230a; 21011 t.floorleftBigg = 0x230a; 21012 t.floorrightbig = 0x230b; 21013 t.floorrightBig = 0x230b; 21014 t.floorrightBigg = 0x230b; 21015 t.floorrightbigg = 0x230b; 21016 t.hatwide = 0x0302; 21017 t.hatwider = 0x0302; 21018 t.hatwidest = 0x0302; 21019 t.intercal = 0x1d40; 21020 t.integraldisplay = 0x222b; 21021 t.integraltext = 0x222b; 21022 t.intersectiondisplay = 0x22c2; 21023 t.intersectiontext = 0x22c2; 21024 t.logicalanddisplay = 0x2227; 21025 t.logicalandtext = 0x2227; 21026 t.logicalordisplay = 0x2228; 21027 t.logicalortext = 0x2228; 21028 t.parenleftBig = 0x0028; 21029 t.parenleftbig = 0x0028; 21030 t.parenleftBigg = 0x0028; 21031 t.parenleftbigg = 0x0028; 21032 t.parenrightBig = 0x0029; 21033 t.parenrightbig = 0x0029; 21034 t.parenrightBigg = 0x0029; 21035 t.parenrightbigg = 0x0029; 21036 t.prime = 0x2032; 21037 t.productdisplay = 0x220f; 21038 t.producttext = 0x220f; 21039 t.radicalbig = 0x221a; 21040 t.radicalBig = 0x221a; 21041 t.radicalBigg = 0x221a; 21042 t.radicalbigg = 0x221a; 21043 t.radicalbt = 0x221a; 21044 t.radicaltp = 0x221a; 21045 t.radicalvertex = 0x221a; 21046 t.slashbig = 0x002f; 21047 t.slashBig = 0x002f; 21048 t.slashBigg = 0x002f; 21049 t.slashbigg = 0x002f; 21050 t.summationdisplay = 0x2211; 21051 t.summationtext = 0x2211; 21052 t.tildewide = 0x02dc; 21053 t.tildewider = 0x02dc; 21054 t.tildewidest = 0x02dc; 21055 t.uniondisplay = 0x22c3; 21056 t.unionmultidisplay = 0x228e; 21057 t.unionmultitext = 0x228e; 21058 t.unionsqdisplay = 0x2294; 21059 t.unionsqtext = 0x2294; 21060 t.uniontext = 0x22c3; 21061 t.vextenddouble = 0x2225; 21062 t.vextendsingle = 0x2223; 21063}); 21064const getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) { 21065 t.space = 0x0020; 21066 t.a1 = 0x2701; 21067 t.a2 = 0x2702; 21068 t.a202 = 0x2703; 21069 t.a3 = 0x2704; 21070 t.a4 = 0x260e; 21071 t.a5 = 0x2706; 21072 t.a119 = 0x2707; 21073 t.a118 = 0x2708; 21074 t.a117 = 0x2709; 21075 t.a11 = 0x261b; 21076 t.a12 = 0x261e; 21077 t.a13 = 0x270c; 21078 t.a14 = 0x270d; 21079 t.a15 = 0x270e; 21080 t.a16 = 0x270f; 21081 t.a105 = 0x2710; 21082 t.a17 = 0x2711; 21083 t.a18 = 0x2712; 21084 t.a19 = 0x2713; 21085 t.a20 = 0x2714; 21086 t.a21 = 0x2715; 21087 t.a22 = 0x2716; 21088 t.a23 = 0x2717; 21089 t.a24 = 0x2718; 21090 t.a25 = 0x2719; 21091 t.a26 = 0x271a; 21092 t.a27 = 0x271b; 21093 t.a28 = 0x271c; 21094 t.a6 = 0x271d; 21095 t.a7 = 0x271e; 21096 t.a8 = 0x271f; 21097 t.a9 = 0x2720; 21098 t.a10 = 0x2721; 21099 t.a29 = 0x2722; 21100 t.a30 = 0x2723; 21101 t.a31 = 0x2724; 21102 t.a32 = 0x2725; 21103 t.a33 = 0x2726; 21104 t.a34 = 0x2727; 21105 t.a35 = 0x2605; 21106 t.a36 = 0x2729; 21107 t.a37 = 0x272a; 21108 t.a38 = 0x272b; 21109 t.a39 = 0x272c; 21110 t.a40 = 0x272d; 21111 t.a41 = 0x272e; 21112 t.a42 = 0x272f; 21113 t.a43 = 0x2730; 21114 t.a44 = 0x2731; 21115 t.a45 = 0x2732; 21116 t.a46 = 0x2733; 21117 t.a47 = 0x2734; 21118 t.a48 = 0x2735; 21119 t.a49 = 0x2736; 21120 t.a50 = 0x2737; 21121 t.a51 = 0x2738; 21122 t.a52 = 0x2739; 21123 t.a53 = 0x273a; 21124 t.a54 = 0x273b; 21125 t.a55 = 0x273c; 21126 t.a56 = 0x273d; 21127 t.a57 = 0x273e; 21128 t.a58 = 0x273f; 21129 t.a59 = 0x2740; 21130 t.a60 = 0x2741; 21131 t.a61 = 0x2742; 21132 t.a62 = 0x2743; 21133 t.a63 = 0x2744; 21134 t.a64 = 0x2745; 21135 t.a65 = 0x2746; 21136 t.a66 = 0x2747; 21137 t.a67 = 0x2748; 21138 t.a68 = 0x2749; 21139 t.a69 = 0x274a; 21140 t.a70 = 0x274b; 21141 t.a71 = 0x25cf; 21142 t.a72 = 0x274d; 21143 t.a73 = 0x25a0; 21144 t.a74 = 0x274f; 21145 t.a203 = 0x2750; 21146 t.a75 = 0x2751; 21147 t.a204 = 0x2752; 21148 t.a76 = 0x25b2; 21149 t.a77 = 0x25bc; 21150 t.a78 = 0x25c6; 21151 t.a79 = 0x2756; 21152 t.a81 = 0x25d7; 21153 t.a82 = 0x2758; 21154 t.a83 = 0x2759; 21155 t.a84 = 0x275a; 21156 t.a97 = 0x275b; 21157 t.a98 = 0x275c; 21158 t.a99 = 0x275d; 21159 t.a100 = 0x275e; 21160 t.a101 = 0x2761; 21161 t.a102 = 0x2762; 21162 t.a103 = 0x2763; 21163 t.a104 = 0x2764; 21164 t.a106 = 0x2765; 21165 t.a107 = 0x2766; 21166 t.a108 = 0x2767; 21167 t.a112 = 0x2663; 21168 t.a111 = 0x2666; 21169 t.a110 = 0x2665; 21170 t.a109 = 0x2660; 21171 t.a120 = 0x2460; 21172 t.a121 = 0x2461; 21173 t.a122 = 0x2462; 21174 t.a123 = 0x2463; 21175 t.a124 = 0x2464; 21176 t.a125 = 0x2465; 21177 t.a126 = 0x2466; 21178 t.a127 = 0x2467; 21179 t.a128 = 0x2468; 21180 t.a129 = 0x2469; 21181 t.a130 = 0x2776; 21182 t.a131 = 0x2777; 21183 t.a132 = 0x2778; 21184 t.a133 = 0x2779; 21185 t.a134 = 0x277a; 21186 t.a135 = 0x277b; 21187 t.a136 = 0x277c; 21188 t.a137 = 0x277d; 21189 t.a138 = 0x277e; 21190 t.a139 = 0x277f; 21191 t.a140 = 0x2780; 21192 t.a141 = 0x2781; 21193 t.a142 = 0x2782; 21194 t.a143 = 0x2783; 21195 t.a144 = 0x2784; 21196 t.a145 = 0x2785; 21197 t.a146 = 0x2786; 21198 t.a147 = 0x2787; 21199 t.a148 = 0x2788; 21200 t.a149 = 0x2789; 21201 t.a150 = 0x278a; 21202 t.a151 = 0x278b; 21203 t.a152 = 0x278c; 21204 t.a153 = 0x278d; 21205 t.a154 = 0x278e; 21206 t.a155 = 0x278f; 21207 t.a156 = 0x2790; 21208 t.a157 = 0x2791; 21209 t.a158 = 0x2792; 21210 t.a159 = 0x2793; 21211 t.a160 = 0x2794; 21212 t.a161 = 0x2192; 21213 t.a163 = 0x2194; 21214 t.a164 = 0x2195; 21215 t.a196 = 0x2798; 21216 t.a165 = 0x2799; 21217 t.a192 = 0x279a; 21218 t.a166 = 0x279b; 21219 t.a167 = 0x279c; 21220 t.a168 = 0x279d; 21221 t.a169 = 0x279e; 21222 t.a170 = 0x279f; 21223 t.a171 = 0x27a0; 21224 t.a172 = 0x27a1; 21225 t.a173 = 0x27a2; 21226 t.a162 = 0x27a3; 21227 t.a174 = 0x27a4; 21228 t.a175 = 0x27a5; 21229 t.a176 = 0x27a6; 21230 t.a177 = 0x27a7; 21231 t.a178 = 0x27a8; 21232 t.a179 = 0x27a9; 21233 t.a193 = 0x27aa; 21234 t.a180 = 0x27ab; 21235 t.a199 = 0x27ac; 21236 t.a181 = 0x27ad; 21237 t.a200 = 0x27ae; 21238 t.a182 = 0x27af; 21239 t.a201 = 0x27b1; 21240 t.a183 = 0x27b2; 21241 t.a184 = 0x27b3; 21242 t.a197 = 0x27b4; 21243 t.a185 = 0x27b5; 21244 t.a194 = 0x27b6; 21245 t.a198 = 0x27b7; 21246 t.a186 = 0x27b8; 21247 t.a195 = 0x27b9; 21248 t.a187 = 0x27ba; 21249 t.a188 = 0x27bb; 21250 t.a189 = 0x27bc; 21251 t.a190 = 0x27bd; 21252 t.a191 = 0x27be; 21253 t.a89 = 0x2768; 21254 t.a90 = 0x2769; 21255 t.a93 = 0x276a; 21256 t.a94 = 0x276b; 21257 t.a91 = 0x276c; 21258 t.a92 = 0x276d; 21259 t.a205 = 0x276e; 21260 t.a85 = 0x276f; 21261 t.a206 = 0x2770; 21262 t.a86 = 0x2771; 21263 t.a87 = 0x2772; 21264 t.a88 = 0x2773; 21265 t.a95 = 0x2774; 21266 t.a96 = 0x2775;
vendor: 12,545 bytes, lines 21267-21526
21267 t[".notdef"] = 0x0000; 21268}); 21269 21270;// ./src/core/unicode.js 21271 21272const getSpecialPUASymbols = getLookupTableFactory(function (t) { 21273 t[63721] = 0x00a9; 21274 t[63193] = 0x00a9; 21275 t[63720] = 0x00ae; 21276 t[63194] = 0x00ae; 21277 t[63722] = 0x2122; 21278 t[63195] = 0x2122; 21279 t[63729] = 0x23a7; 21280 t[63730] = 0x23a8; 21281 t[63731] = 0x23a9; 21282 t[63740] = 0x23ab; 21283 t[63741] = 0x23ac; 21284 t[63742] = 0x23ad; 21285 t[63726] = 0x23a1; 21286 t[63727] = 0x23a2; 21287 t[63728] = 0x23a3; 21288 t[63737] = 0x23a4; 21289 t[63738] = 0x23a5; 21290 t[63739] = 0x23a6; 21291 t[63723] = 0x239b; 21292 t[63724] = 0x239c; 21293 t[63725] = 0x239d; 21294 t[63734] = 0x239e; 21295 t[63735] = 0x239f; 21296 t[63736] = 0x23a0; 21297}); 21298function mapSpecialUnicodeValues(code) { 21299 if (code >= 0xfff0 && code <= 0xffff) { 21300 return 0; 21301 } else if (code >= 0xf600 && code <= 0xf8ff) { 21302 return getSpecialPUASymbols()[code] || code; 21303 } else if (code === 0x00ad) { 21304 return 0x002d; 21305 } 21306 return code; 21307} 21308function getUnicodeForGlyph(name, glyphsUnicodeMap) { 21309 let unicode = glyphsUnicodeMap[name]; 21310 if (unicode !== undefined) { 21311 return unicode; 21312 } 21313 if (!name) { 21314 return -1; 21315 } 21316 if (name[0] === "u") { 21317 const nameLen = name.length; 21318 let hexStr; 21319 if (nameLen === 7 && name[1] === "n" && name[2] === "i") { 21320 hexStr = name.substring(3); 21321 } else if (nameLen >= 5 && nameLen <= 7) { 21322 hexStr = name.substring(1); 21323 } else { 21324 return -1; 21325 } 21326 if (hexStr === hexStr.toUpperCase()) { 21327 unicode = parseInt(hexStr, 16); 21328 if (unicode >= 0) { 21329 return unicode; 21330 } 21331 } 21332 } 21333 return -1; 21334} 21335const 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]]; 21336function getUnicodeRangeFor(value, lastPosition = -1) { 21337 if (lastPosition !== -1) { 21338 const range = UnicodeRanges[lastPosition]; 21339 for (let i = 0, ii = range.length; i < ii; i += 2) { 21340 if (value >= range[i] && value <= range[i + 1]) { 21341 return lastPosition; 21342 } 21343 } 21344 } 21345 for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) { 21346 const range = UnicodeRanges[i]; 21347 for (let j = 0, jj = range.length; j < jj; j += 2) { 21348 if (value >= range[j] && value <= range[j + 1]) { 21349 return i; 21350 } 21351 } 21352 } 21353 return -1; 21354} 21355const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"); 21356const CategoryCache = new Map(); 21357function getCharUnicodeCategory(char) { 21358 const cachedCategory = CategoryCache.get(char); 21359 if (cachedCategory) { 21360 return cachedCategory; 21361 } 21362 const groups = char.match(SpecialCharRegExp); 21363 const category = { 21364 isWhitespace: !!groups?.[1], 21365 isZeroWidthDiacritic: !!groups?.[2], 21366 isInvisibleFormatMark: !!groups?.[3] 21367 }; 21368 CategoryCache.set(char, category); 21369 return category; 21370} 21371function clearUnicodeCaches() { 21372 CategoryCache.clear(); 21373} 21374 21375;// ./src/core/fonts_utils.js 21376 21377 21378 21379 21380 21381 21382const SEAC_ANALYSIS_ENABLED = true; 21383const FontFlags = { 21384 FixedPitch: 1, 21385 Serif: 2, 21386 Symbolic: 4, 21387 Script: 8, 21388 Nonsymbolic: 32, 21389 Italic: 64, 21390 AllCap: 65536, 21391 SmallCap: 131072, 21392 ForceBold: 262144 21393}; 21394const 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"]; 21395function recoverGlyphName(name, glyphsUnicodeMap) { 21396 if (glyphsUnicodeMap[name] !== undefined) { 21397 return name; 21398 } 21399 const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); 21400 if (unicode !== -1) { 21401 for (const key in glyphsUnicodeMap) { 21402 if (glyphsUnicodeMap[key] === unicode) { 21403 return key; 21404 } 21405 } 21406 } 21407 info("Unable to recover a standard glyph name for: " + name); 21408 return name; 21409} 21410function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { 21411 const charCodeToGlyphId = Object.create(null); 21412 let glyphId, charCode, baseEncoding; 21413 const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); 21414 if (properties.isInternalFont) { 21415 baseEncoding = builtInEncoding; 21416 for (charCode = 0; charCode < baseEncoding.length; charCode++) { 21417 glyphId = glyphNames.indexOf(baseEncoding[charCode]); 21418 charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; 21419 } 21420 } else if (properties.baseEncodingName) { 21421 baseEncoding = getEncoding(properties.baseEncodingName); 21422 for (charCode = 0; charCode < baseEncoding.length; charCode++) { 21423 glyphId = glyphNames.indexOf(baseEncoding[charCode]); 21424 charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; 21425 } 21426 } else if (isSymbolicFont) { 21427 for (charCode in builtInEncoding) { 21428 charCodeToGlyphId[charCode] = builtInEncoding[charCode]; 21429 } 21430 } else { 21431 baseEncoding = StandardEncoding; 21432 for (charCode = 0; charCode < baseEncoding.length; charCode++) { 21433 glyphId = glyphNames.indexOf(baseEncoding[charCode]); 21434 charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; 21435 } 21436 } 21437 const differences = properties.differences; 21438 let glyphsUnicodeMap; 21439 if (differences) { 21440 for (charCode in differences) { 21441 const glyphName = differences[charCode]; 21442 glyphId = glyphNames.indexOf(glyphName); 21443 if (glyphId === -1) { 21444 if (!glyphsUnicodeMap) { 21445 glyphsUnicodeMap = getGlyphsUnicode(); 21446 } 21447 const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); 21448 if (standardGlyphName !== glyphName) { 21449 glyphId = glyphNames.indexOf(standardGlyphName); 21450 } 21451 } 21452 charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; 21453 } 21454 } 21455 return charCodeToGlyphId; 21456} 21457function normalizeFontName(name) { 21458 return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); 21459} 21460const getVerticalPresentationForm = getLookupTableFactory(t => { 21461 t[0x2013] = 0xfe32; 21462 t[0x2014] = 0xfe31; 21463 t[0x2025] = 0xfe30; 21464 t[0x2026] = 0xfe19; 21465 t[0x3001] = 0xfe11; 21466 t[0x3002] = 0xfe12; 21467 t[0x3008] = 0xfe3f; 21468 t[0x3009] = 0xfe40; 21469 t[0x300a] = 0xfe3d; 21470 t[0x300b] = 0xfe3e; 21471 t[0x300c] = 0xfe41; 21472 t[0x300d] = 0xfe42; 21473 t[0x300e] = 0xfe43; 21474 t[0x300f] = 0xfe44; 21475 t[0x3010] = 0xfe3b; 21476 t[0x3011] = 0xfe3c; 21477 t[0x3014] = 0xfe39; 21478 t[0x3015] = 0xfe3a; 21479 t[0x3016] = 0xfe17; 21480 t[0x3017] = 0xfe18; 21481 t[0xfe4f] = 0xfe34; 21482 t[0xff01] = 0xfe15; 21483 t[0xff08] = 0xfe35; 21484 t[0xff09] = 0xfe36; 21485 t[0xff0c] = 0xfe10; 21486 t[0xff1a] = 0xfe13; 21487 t[0xff1b] = 0xfe14; 21488 t[0xff1f] = 0xfe16; 21489 t[0xff3b] = 0xfe47; 21490 t[0xff3d] = 0xfe48; 21491 t[0xff3f] = 0xfe33; 21492 t[0xff5b] = 0xfe37; 21493 t[0xff5d] = 0xfe38; 21494}); 21495 21496;// ./src/core/standard_fonts.js 21497 21498 21499const getStdFontMap = getLookupTableFactory(function (t) { 21500 t["Times-Roman"] = "Times-Roman"; 21501 t.Helvetica = "Helvetica"; 21502 t.Courier = "Courier"; 21503 t.Symbol = "Symbol"; 21504 t["Times-Bold"] = "Times-Bold"; 21505 t["Helvetica-Bold"] = "Helvetica-Bold"; 21506 t["Courier-Bold"] = "Courier-Bold"; 21507 t.ZapfDingbats = "ZapfDingbats"; 21508 t["Times-Italic"] = "Times-Italic"; 21509 t["Helvetica-Oblique"] = "Helvetica-Oblique"; 21510 t["Courier-Oblique"] = "Courier-Oblique"; 21511 t["Times-BoldItalic"] = "Times-BoldItalic"; 21512 t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique"; 21513 t["Courier-BoldOblique"] = "Courier-BoldOblique"; 21514 t.ArialNarrow = "Helvetica"; 21515 t["ArialNarrow-Bold"] = "Helvetica-Bold"; 21516 t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique"; 21517 t["ArialNarrow-Italic"] = "Helvetica-Oblique"; 21518 t.ArialBlack = "Helvetica"; 21519 t["ArialBlack-Bold"] = "Helvetica-Bold"; 21520 t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique"; 21521 t["ArialBlack-Italic"] = "Helvetica-Oblique"; 21522 t["Arial-Black"] = "Helvetica"; 21523 t["Arial-Black-Bold"] = "Helvetica-Bold"; 21524 t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique"; 21525 t["Arial-Black-Italic"] = "Helvetica-Oblique"; 21526 t.Arial = "Helvetica";
21527 t["Arial-Bold"] = "Helvetica-Bold"; 21528 t["Arial-BoldItalic"] = "Helvetica-BoldOblique"; 21529 t["Arial-Italic"] = "Helvetica-Oblique"; 21530 t.ArialMT = "Helvetica"; 21531 t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; 21532 t["Arial-BoldMT"] = "Helvetica-Bold"; 21533 t["Arial-ItalicMT"] = "Helvetica-Oblique"; 21534 t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique"; 21535 t["Arial-BoldMT-Bold"] = "Helvetica-Bold"; 21536 t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique"; 21537 t.ArialUnicodeMS = "Helvetica"; 21538 t["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; 21539 t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; 21540 t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique"; 21541 t["Courier-BoldItalic"] = "Courier-BoldOblique"; 21542 t["Courier-Italic"] = "Courier-Oblique"; 21543 t.CourierNew = "Courier"; 21544 t["CourierNew-Bold"] = "Courier-Bold"; 21545 t["CourierNew-BoldItalic"] = "Courier-BoldOblique"; 21546 t["CourierNew-Italic"] = "Courier-Oblique"; 21547 t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique"; 21548 t["CourierNewPS-BoldMT"] = "Courier-Bold"; 21549 t["CourierNewPS-ItalicMT"] = "Courier-Oblique"; 21550 t.CourierNewPSMT = "Courier"; 21551 t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique"; 21552 t["Helvetica-Italic"] = "Helvetica-Oblique"; 21553 t["HelveticaLTStd-Bold"] = "Helvetica-Bold"; 21554 t["Symbol-Bold"] = "Symbol"; 21555 t["Symbol-BoldItalic"] = "Symbol"; 21556 t["Symbol-Italic"] = "Symbol"; 21557 t.TimesNewRoman = "Times-Roman"; 21558 t["TimesNewRoman-Bold"] = "Times-Bold"; 21559 t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic"; 21560 t["TimesNewRoman-Italic"] = "Times-Italic"; 21561 t.TimesNewRomanPS = "Times-Roman"; 21562 t["TimesNewRomanPS-Bold"] = "Times-Bold"; 21563 t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic"; 21564 t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic"; 21565 t["TimesNewRomanPS-BoldMT"] = "Times-Bold"; 21566 t["TimesNewRomanPS-Italic"] = "Times-Italic"; 21567 t["TimesNewRomanPS-ItalicMT"] = "Times-Italic"; 21568 t.TimesNewRomanPSMT = "Times-Roman"; 21569 t["TimesNewRomanPSMT-Bold"] = "Times-Bold"; 21570 t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic"; 21571 t["TimesNewRomanPSMT-Italic"] = "Times-Italic"; 21572}); 21573const getFontNameToFileMap = getLookupTableFactory(function (t) { 21574 t.Courier = "FoxitFixed.pfb"; 21575 t["Courier-Bold"] = "FoxitFixedBold.pfb"; 21576 t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb"; 21577 t["Courier-Oblique"] = "FoxitFixedItalic.pfb"; 21578 t.Helvetica = "LiberationSans-Regular.ttf"; 21579 t["Helvetica-Bold"] = "LiberationSans-Bold.ttf"; 21580 t["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf"; 21581 t["Helvetica-Oblique"] = "LiberationSans-Italic.ttf"; 21582 t["Times-Roman"] = "FoxitSerif.pfb"; 21583 t["Times-Bold"] = "FoxitSerifBold.pfb"; 21584 t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb"; 21585 t["Times-Italic"] = "FoxitSerifItalic.pfb"; 21586 t.Symbol = "FoxitSymbol.pfb"; 21587 t.ZapfDingbats = "FoxitDingbats.pfb"; 21588 t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf"; 21589 t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf"; 21590 t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf"; 21591 t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf"; 21592}); 21593const getNonStdFontMap = getLookupTableFactory(function (t) { 21594 t.Calibri = "Helvetica"; 21595 t["Calibri-Bold"] = "Helvetica-Bold"; 21596 t["Calibri-BoldItalic"] = "Helvetica-BoldOblique"; 21597 t["Calibri-Italic"] = "Helvetica-Oblique"; 21598 t.CenturyGothic = "Helvetica"; 21599 t["CenturyGothic-Bold"] = "Helvetica-Bold"; 21600 t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique"; 21601 t["CenturyGothic-Italic"] = "Helvetica-Oblique"; 21602 t.ComicSansMS = "Comic Sans MS"; 21603 t["ComicSansMS-Bold"] = "Comic Sans MS-Bold"; 21604 t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic"; 21605 t["ComicSansMS-Italic"] = "Comic Sans MS-Italic"; 21606 t.GillSansMT = "Helvetica";
21607 t["GillSansMT-Bold"] = "Helvetica-Bold"; 21608 t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique"; 21609 t["GillSansMT-Italic"] = "Helvetica-Oblique"; 21610 t.Impact = "Helvetica"; 21611 t["ItcSymbol-Bold"] = "Helvetica-Bold"; 21612 t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; 21613 t["ItcSymbol-Book"] = "Helvetica"; 21614 t["ItcSymbol-BookItalic"] = "Helvetica-Oblique"; 21615 t["ItcSymbol-Medium"] = "Helvetica"; 21616 t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique"; 21617 t.LucidaConsole = "Courier"; 21618 t["LucidaConsole-Bold"] = "Courier-Bold"; 21619 t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique"; 21620 t["LucidaConsole-Italic"] = "Courier-Oblique"; 21621 t["LucidaSans-Demi"] = "Helvetica-Bold"; 21622 t["MS-Gothic"] = "MS Gothic"; 21623 t["MS-Gothic-Bold"] = "MS Gothic-Bold"; 21624 t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic"; 21625 t["MS-Gothic-Italic"] = "MS Gothic-Italic"; 21626 t["MS-Mincho"] = "MS Mincho"; 21627 t["MS-Mincho-Bold"] = "MS Mincho-Bold"; 21628 t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic"; 21629 t["MS-Mincho-Italic"] = "MS Mincho-Italic"; 21630 t["MS-PGothic"] = "MS PGothic"; 21631 t["MS-PGothic-Bold"] = "MS PGothic-Bold"; 21632 t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic"; 21633 t["MS-PGothic-Italic"] = "MS PGothic-Italic"; 21634 t["MS-PMincho"] = "MS PMincho"; 21635 t["MS-PMincho-Bold"] = "MS PMincho-Bold"; 21636 t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic"; 21637 t["MS-PMincho-Italic"] = "MS PMincho-Italic"; 21638 t.NuptialScript = "Times-Italic"; 21639 t.SegoeUISymbol = "Helvetica"; 21640}); 21641const getSerifFonts = getLookupTableFactory(function (t) { 21642 t["Adobe Jenson"] = true; 21643 t["Adobe Text"] = true; 21644 t.Albertus = true; 21645 t.Aldus = true; 21646 t.Alexandria = true; 21647 t.Algerian = true; 21648 t["American Typewriter"] = true; 21649 t.Antiqua = true; 21650 t.Apex = true; 21651 t.Arno = true; 21652 t.Aster = true; 21653 t.Aurora = true; 21654 t.Baskerville = true; 21655 t.Bell = true; 21656 t.Bembo = true; 21657 t["Bembo Schoolbook"] = true; 21658 t.Benguiat = true; 21659 t["Berkeley Old Style"] = true; 21660 t["Bernhard Modern"] = true; 21661 t["Berthold City"] = true; 21662 t.Bodoni = true; 21663 t["Bauer Bodoni"] = true; 21664 t["Book Antiqua"] = true; 21665 t.Bookman = true; 21666 t["Bordeaux Roman"] = true; 21667 t["Californian FB"] = true; 21668 t.Calisto = true; 21669 t.Calvert = true; 21670 t.Capitals = true; 21671 t.Cambria = true; 21672 t.Cartier = true; 21673 t.Caslon = true; 21674 t.Catull = true; 21675 t.Centaur = true; 21676 t["Century Old Style"] = true; 21677 t["Century Schoolbook"] = true; 21678 t.Chaparral = true; 21679 t["Charis SIL"] = true; 21680 t.Cheltenham = true; 21681 t["Cholla Slab"] = true; 21682 t.Clarendon = true; 21683 t.Clearface = true; 21684 t.Cochin = true; 21685 t.Colonna = true; 21686 t["Computer Modern"] = true; 21687 t["Concrete Roman"] = true; 21688 t.Constantia = true; 21689 t["Cooper Black"] = true; 21690 t.Corona = true; 21691 t.Ecotype = true; 21692 t.Egyptienne = true; 21693 t.Elephant = true; 21694 t.Excelsior = true; 21695 t.Fairfield = true; 21696 t["FF Scala"] = true; 21697 t.Folkard = true; 21698 t.Footlight = true; 21699 t.FreeSerif = true; 21700 t["Friz Quadrata"] = true; 21701 t.Garamond = true; 21702 t.Gentium = true; 21703 t.Georgia = true; 21704 t.Gloucester = true; 21705 t["Goudy Old Style"] = true; 21706 t["Goudy Schoolbook"] = true; 21707 t["Goudy Pro Font"] = true; 21708 t.Granjon = true; 21709 t["Guardian Egyptian"] = true; 21710 t.Heather = true; 21711 t.Hercules = true; 21712 t["High Tower Text"] = true; 21713 t.Hiroshige = true; 21714 t["Hoefler Text"] = true; 21715 t["Humana Serif"] = true; 21716 t.Imprint = true; 21717 t["Ionic No. 5"] = true; 21718 t.Janson = true; 21719 t.Joanna = true; 21720 t.Korinna = true; 21721 t.Lexicon = true; 21722 t.LiberationSerif = true; 21723 t["Liberation Serif"] = true; 21724 t["Linux Libertine"] = true; 21725 t.Literaturnaya = true; 21726 t.Lucida = true; 21727 t["Lucida Bright"] = true; 21728 t.Melior = true; 21729 t.Memphis = true; 21730 t.Miller = true; 21731 t.Minion = true; 21732 t.Modern = true; 21733 t["Mona Lisa"] = true; 21734 t["Mrs Eaves"] = true; 21735 t["MS Serif"] = true; 21736 t["Museo Slab"] = true; 21737 t["New York"] = true; 21738 t["Nimbus Roman"] = true; 21739 t["NPS Rawlinson Roadway"] = true; 21740 t.NuptialScript = true; 21741 t.Palatino = true; 21742 t.Perpetua = true; 21743 t.Plantin = true; 21744 t["Plantin Schoolbook"] = true; 21745 t.Playbill = true; 21746 t["Poor Richard"] = true; 21747 t["Rawlinson Roadway"] = true; 21748 t.Renault = true; 21749 t.Requiem = true; 21750 t.Rockwell = true; 21751 t.Roman = true; 21752 t["Rotis Serif"] = true; 21753 t.Sabon = true; 21754 t.Scala = true; 21755 t.Seagull = true; 21756 t.Sistina = true; 21757 t.Souvenir = true; 21758 t.STIX = true; 21759 t["Stone Informal"] = true; 21760 t["Stone Serif"] = true; 21761 t.Sylfaen = true; 21762 t.Times = true; 21763 t.Trajan = true; 21764 t["Trinité"] = true; 21765 t["Trump Mediaeval"] = true; 21766 t.Utopia = true; 21767 t["Vale Type"] = true;
21768 t["Bitstream Vera"] = true; 21769 t["Vera Serif"] = true; 21770 t.Versailles = true; 21771 t.Wanted = true; 21772 t.Weiss = true; 21773 t["Wide Latin"] = true; 21774 t.Windsor = true; 21775 t.XITS = true; 21776}); 21777const getSymbolsFonts = getLookupTableFactory(function (t) { 21778 t.Dingbats = true; 21779 t.Symbol = true; 21780 t.ZapfDingbats = true; 21781 t.Wingdings = true; 21782 t["Wingdings-Bold"] = true; 21783 t["Wingdings-Regular"] = true; 21784}); 21785const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { 21786 t[2] = 10; 21787 t[3] = 32; 21788 t[4] = 33; 21789 t[5] = 34; 21790 t[6] = 35; 21791 t[7] = 36; 21792 t[8] = 37; 21793 t[9] = 38; 21794 t[10] = 39; 21795 t[11] = 40; 21796 t[12] = 41; 21797 t[13] = 42; 21798 t[14] = 43; 21799 t[15] = 44; 21800 t[16] = 45; 21801 t[17] = 46; 21802 t[18] = 47; 21803 t[19] = 48; 21804 t[20] = 49; 21805 t[21] = 50; 21806 t[22] = 51; 21807 t[23] = 52; 21808 t[24] = 53; 21809 t[25] = 54; 21810 t[26] = 55; 21811 t[27] = 56; 21812 t[28] = 57; 21813 t[29] = 58; 21814 t[30] = 894; 21815 t[31] = 60; 21816 t[32] = 61; 21817 t[33] = 62; 21818 t[34] = 63; 21819 t[35] = 64; 21820 t[36] = 65; 21821 t[37] = 66; 21822 t[38] = 67; 21823 t[39] = 68; 21824 t[40] = 69; 21825 t[41] = 70; 21826 t[42] = 71; 21827 t[43] = 72; 21828 t[44] = 73; 21829 t[45] = 74; 21830 t[46] = 75; 21831 t[47] = 76; 21832 t[48] = 77; 21833 t[49] = 78; 21834 t[50] = 79; 21835 t[51] = 80; 21836 t[52] = 81; 21837 t[53] = 82; 21838 t[54] = 83; 21839 t[55] = 84; 21840 t[56] = 85; 21841 t[57] = 86; 21842 t[58] = 87; 21843 t[59] = 88; 21844 t[60] = 89; 21845 t[61] = 90; 21846 t[62] = 91; 21847 t[63] = 92; 21848 t[64] = 93; 21849 t[65] = 94; 21850 t[66] = 95; 21851 t[67] = 96; 21852 t[68] = 97; 21853 t[69] = 98; 21854 t[70] = 99; 21855 t[71] = 100; 21856 t[72] = 101; 21857 t[73] = 102; 21858 t[74] = 103; 21859 t[75] = 104; 21860 t[76] = 105; 21861 t[77] = 106; 21862 t[78] = 107; 21863 t[79] = 108; 21864 t[80] = 109; 21865 t[81] = 110; 21866 t[82] = 111; 21867 t[83] = 112; 21868 t[84] = 113; 21869 t[85] = 114; 21870 t[86] = 115; 21871 t[87] = 116; 21872 t[88] = 117; 21873 t[89] = 118; 21874 t[90] = 119; 21875 t[91] = 120; 21876 t[92] = 121; 21877 t[93] = 122; 21878 t[94] = 123; 21879 t[95] = 124; 21880 t[96] = 125; 21881 t[97] = 126; 21882 t[98] = 196; 21883 t[99] = 197; 21884 t[100] = 199; 21885 t[101] = 201; 21886 t[102] = 209; 21887 t[103] = 214; 21888 t[104] = 220; 21889 t[105] = 225; 21890 t[106] = 224; 21891 t[107] = 226; 21892 t[108] = 228; 21893 t[109] = 227; 21894 t[110] = 229; 21895 t[111] = 231; 21896 t[112] = 233; 21897 t[113] = 232; 21898 t[114] = 234; 21899 t[115] = 235; 21900 t[116] = 237; 21901 t[117] = 236; 21902 t[118] = 238; 21903 t[119] = 239; 21904 t[120] = 241; 21905 t[121] = 243; 21906 t[122] = 242; 21907 t[123] = 244; 21908 t[124] = 246; 21909 t[125] = 245; 21910 t[126] = 250; 21911 t[127] = 249; 21912 t[128] = 251; 21913 t[129] = 252; 21914 t[130] = 8224; 21915 t[131] = 176; 21916 t[132] = 162; 21917 t[133] = 163; 21918 t[134] = 167; 21919 t[135] = 8226; 21920 t[136] = 182; 21921 t[137] = 223; 21922 t[138] = 174; 21923 t[139] = 169; 21924 t[140] = 8482; 21925 t[141] = 180; 21926 t[142] = 168; 21927 t[143] = 8800; 21928 t[144] = 198; 21929 t[145] = 216; 21930 t[146] = 8734; 21931 t[147] = 177; 21932 t[148] = 8804; 21933 t[149] = 8805; 21934 t[150] = 165; 21935 t[151] = 181; 21936 t[152] = 8706; 21937 t[153] = 8721; 21938 t[154] = 8719; 21939 t[156] = 8747; 21940 t[157] = 170; 21941 t[158] = 186; 21942 t[159] = 8486; 21943 t[160] = 230; 21944 t[161] = 248; 21945 t[162] = 191; 21946 t[163] = 161; 21947 t[164] = 172; 21948 t[165] = 8730; 21949 t[166] = 402; 21950 t[167] = 8776; 21951 t[168] = 8710; 21952 t[169] = 171; 21953 t[170] = 187; 21954 t[171] = 8230; 21955 t[179] = 8220; 21956 t[180] = 8221; 21957 t[181] = 8216; 21958 t[182] = 8217; 21959 t[200] = 193; 21960 t[203] = 205; 21961 t[207] = 211; 21962 t[210] = 218; 21963 t[223] = 711; 21964 t[224] = 321; 21965 t[225] = 322; 21966 t[226] = 352; 21967 t[227] = 353; 21968 t[228] = 381; 21969 t[229] = 382; 21970 t[233] = 221; 21971 t[234] = 253; 21972 t[252] = 263; 21973 t[253] = 268; 21974 t[254] = 269; 21975 t[258] = 258; 21976 t[260] = 260; 21977 t[261] = 261; 21978 t[265] = 280; 21979 t[266] = 281; 21980 t[267] = 282; 21981 t[268] = 283; 21982 t[269] = 313; 21983 t[275] = 323; 21984 t[276] = 324; 21985 t[278] = 328; 21986 t[283] = 344; 21987 t[284] = 345; 21988 t[285] = 346; 21989 t[286] = 347; 21990 t[292] = 367; 21991 t[295] = 377; 21992 t[296] = 378; 21993 t[298] = 380; 21994 t[305] = 963; 21995 t[306] = 964; 21996 t[307] = 966; 21997 t[308] = 8215; 21998 t[309] = 8252; 21999 t[310] = 8319; 22000 t[311] = 8359; 22001 t[312] = 8592; 22002 t[313] = 8593; 22003 t[337] = 9552; 22004 t[493] = 1039; 22005 t[494] = 1040; 22006 t[672] = 1488; 22007 t[673] = 1489; 22008 t[674] = 1490; 22009 t[675] = 1491; 22010 t[676] = 1492; 22011 t[677] = 1493; 22012 t[678] = 1494; 22013 t[679] = 1495; 22014 t[680] = 1496; 22015 t[681] = 1497; 22016 t[682] = 1498; 22017 t[683] = 1499; 22018 t[684] = 1500; 22019 t[685] = 1501; 22020 t[686] = 1502; 22021 t[687] = 1503; 22022 t[688] = 1504; 22023 t[689] = 1505; 22024 t[690] = 1506; 22025 t[691] = 1507; 22026 t[692] = 1508; 22027 t[693] = 1509; 22028 t[694] = 1510; 22029 t[695] = 1511; 22030 t[696] = 1512; 22031 t[697] = 1513; 22032 t[698] = 1514; 22033 t[705] = 1524; 22034 t[706] = 8362; 22035 t[710] = 64288; 22036 t[711] = 64298; 22037 t[759] = 1617; 22038 t[761] = 1776; 22039 t[763] = 1778; 22040 t[775] = 1652; 22041 t[777] = 1764; 22042 t[778] = 1780; 22043 t[779] = 1781; 22044 t[780] = 1782; 22045 t[782] = 771; 22046 t[783] = 64726; 22047 t[786] = 8363; 22048 t[788] = 8532; 22049 t[790] = 768; 22050 t[791] = 769; 22051 t[792] = 768; 22052 t[795] = 803; 22053 t[797] = 64336; 22054 t[798] = 64337; 22055 t[799] = 64342; 22056 t[800] = 64343; 22057 t[801] = 64344; 22058 t[802] = 64345; 22059 t[803] = 64362; 22060 t[804] = 64363; 22061 t[805] = 64364; 22062 t[2424] = 7821; 22063 t[2425] = 7822; 22064 t[2426] = 7823; 22065 t[2427] = 7824; 22066 t[2428] = 7825; 22067 t[2429] = 7826; 22068 t[2430] = 7827; 22069 t[2433] = 7682; 22070 t[2678] = 8045; 22071 t[2679] = 8046; 22072 t[2830] = 1552; 22073 t[2838] = 686; 22074 t[2840] = 751; 22075 t[2842] = 753; 22076 t[2843] = 754; 22077 t[2844] = 755; 22078 t[2846] = 757; 22079 t[2856] = 767; 22080 t[2857] = 848; 22081 t[2858] = 849; 22082 t[2862] = 853; 22083 t[2863] = 854; 22084 t[2864] = 855; 22085 t[2865] = 861; 22086 t[2866] = 862; 22087 t[2906] = 7460; 22088 t[2908] = 7462; 22089 t[2909] = 7463; 22090 t[2910] = 7464; 22091 t[2912] = 7466; 22092 t[2913] = 7467; 22093 t[2914] = 7468; 22094 t[2916] = 7470; 22095 t[2917] = 7471; 22096 t[2918] = 7472; 22097 t[2920] = 7474; 22098 t[2921] = 7475; 22099 t[2922] = 7476; 22100 t[2924] = 7478; 22101 t[2925] = 7479; 22102 t[2926] = 7480; 22103 t[2928] = 7482;
vendor: 17,224 bytes, lines 22104-22906
22104 t[2929] = 7483; 22105 t[2930] = 7484; 22106 t[2932] = 7486; 22107 t[2933] = 7487; 22108 t[2934] = 7488; 22109 t[2936] = 7490; 22110 t[2937] = 7491; 22111 t[2938] = 7492; 22112 t[2940] = 7494; 22113 t[2941] = 7495; 22114 t[2942] = 7496; 22115 t[2944] = 7498; 22116 t[2946] = 7500; 22117 t[2948] = 7502; 22118 t[2950] = 7504; 22119 t[2951] = 7505; 22120 t[2952] = 7506; 22121 t[2954] = 7508; 22122 t[2955] = 7509; 22123 t[2956] = 7510; 22124 t[2958] = 7512; 22125 t[2959] = 7513; 22126 t[2960] = 7514; 22127 t[2962] = 7516; 22128 t[2963] = 7517; 22129 t[2964] = 7518; 22130 t[2966] = 7520; 22131 t[2967] = 7521; 22132 t[2968] = 7522; 22133 t[2970] = 7524; 22134 t[2971] = 7525; 22135 t[2972] = 7526; 22136 t[2974] = 7528; 22137 t[2975] = 7529; 22138 t[2976] = 7530; 22139 t[2978] = 1537; 22140 t[2979] = 1538; 22141 t[2980] = 1539; 22142 t[2982] = 1549; 22143 t[2983] = 1551; 22144 t[2984] = 1552; 22145 t[2986] = 1554; 22146 t[2987] = 1555; 22147 t[2988] = 1556; 22148 t[2990] = 1623; 22149 t[2991] = 1624; 22150 t[2995] = 1775; 22151 t[2999] = 1791; 22152 t[3002] = 64290; 22153 t[3003] = 64291; 22154 t[3004] = 64292; 22155 t[3006] = 64294; 22156 t[3007] = 64295; 22157 t[3008] = 64296; 22158 t[3011] = 1900; 22159 t[3014] = 8223; 22160 t[3015] = 8244; 22161 t[3017] = 7532; 22162 t[3018] = 7533; 22163 t[3019] = 7534; 22164 t[3075] = 7590; 22165 t[3076] = 7591; 22166 t[3079] = 7594; 22167 t[3080] = 7595; 22168 t[3083] = 7598; 22169 t[3084] = 7599; 22170 t[3087] = 7602; 22171 t[3088] = 7603; 22172 t[3091] = 7606; 22173 t[3092] = 7607; 22174 t[3095] = 7610; 22175 t[3096] = 7611; 22176 t[3099] = 7614; 22177 t[3100] = 7615; 22178 t[3103] = 7618; 22179 t[3104] = 7619; 22180 t[3107] = 8337; 22181 t[3108] = 8338; 22182 t[3116] = 1884; 22183 t[3119] = 1885; 22184 t[3120] = 1885; 22185 t[3123] = 1886; 22186 t[3124] = 1886; 22187 t[3127] = 1887; 22188 t[3128] = 1887; 22189 t[3131] = 1888; 22190 t[3132] = 1888; 22191 t[3135] = 1889; 22192 t[3136] = 1889; 22193 t[3139] = 1890; 22194 t[3140] = 1890; 22195 t[3143] = 1891; 22196 t[3144] = 1891; 22197 t[3147] = 1892; 22198 t[3148] = 1892; 22199 t[3153] = 580; 22200 t[3154] = 581; 22201 t[3157] = 584; 22202 t[3158] = 585; 22203 t[3161] = 588; 22204 t[3162] = 589; 22205 t[3165] = 891; 22206 t[3166] = 892; 22207 t[3169] = 1274; 22208 t[3170] = 1275; 22209 t[3173] = 1278; 22210 t[3174] = 1279; 22211 t[3181] = 7622; 22212 t[3182] = 7623; 22213 t[3282] = 11799; 22214 t[3316] = 578; 22215 t[3379] = 42785; 22216 t[3393] = 1159; 22217 t[3416] = 8377; 22218}); 22219const getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) { 22220 t[227] = 322; 22221 t[264] = 261; 22222 t[291] = 346; 22223}); 22224const getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) { 22225 t[1] = 32; 22226 t[4] = 65; 22227 t[5] = 192; 22228 t[6] = 193; 22229 t[9] = 196; 22230 t[17] = 66; 22231 t[18] = 67; 22232 t[21] = 268; 22233 t[24] = 68; 22234 t[28] = 69; 22235 t[29] = 200; 22236 t[30] = 201; 22237 t[32] = 282; 22238 t[38] = 70; 22239 t[39] = 71; 22240 t[44] = 72; 22241 t[47] = 73; 22242 t[48] = 204; 22243 t[49] = 205; 22244 t[58] = 74; 22245 t[60] = 75; 22246 t[62] = 76; 22247 t[68] = 77; 22248 t[69] = 78; 22249 t[75] = 79; 22250 t[76] = 210; 22251 t[80] = 214; 22252 t[87] = 80; 22253 t[89] = 81; 22254 t[90] = 82; 22255 t[92] = 344; 22256 t[94] = 83; 22257 t[97] = 352; 22258 t[100] = 84; 22259 t[104] = 85; 22260 t[109] = 220; 22261 t[115] = 86; 22262 t[116] = 87; 22263 t[121] = 88; 22264 t[122] = 89; 22265 t[124] = 221; 22266 t[127] = 90; 22267 t[129] = 381; 22268 t[258] = 97; 22269 t[259] = 224; 22270 t[260] = 225; 22271 t[263] = 228; 22272 t[268] = 261; 22273 t[271] = 98; 22274 t[272] = 99; 22275 t[273] = 263; 22276 t[275] = 269; 22277 t[282] = 100; 22278 t[286] = 101; 22279 t[287] = 232; 22280 t[288] = 233; 22281 t[290] = 283; 22282 t[295] = 281; 22283 t[296] = 102; 22284 t[336] = 103; 22285 t[346] = 104; 22286 t[349] = 105; 22287 t[350] = 236; 22288 t[351] = 237; 22289 t[361] = 106; 22290 t[364] = 107; 22291 t[367] = 108; 22292 t[371] = 322; 22293 t[373] = 109; 22294 t[374] = 110; 22295 t[381] = 111; 22296 t[382] = 242; 22297 t[383] = 243; 22298 t[386] = 246; 22299 t[393] = 112; 22300 t[395] = 113; 22301 t[396] = 114; 22302 t[398] = 345; 22303 t[400] = 115; 22304 t[401] = 347; 22305 t[403] = 353; 22306 t[410] = 116; 22307 t[437] = 117; 22308 t[442] = 252; 22309 t[448] = 118; 22310 t[449] = 119; 22311 t[454] = 120; 22312 t[455] = 121; 22313 t[457] = 253; 22314 t[460] = 122; 22315 t[462] = 382; 22316 t[463] = 380; 22317 t[853] = 44; 22318 t[855] = 58; 22319 t[856] = 46; 22320 t[876] = 47; 22321 t[878] = 45; 22322 t[882] = 45; 22323 t[894] = 40; 22324 t[895] = 41; 22325 t[896] = 91; 22326 t[897] = 93; 22327 t[923] = 64; 22328 t[1004] = 48; 22329 t[1005] = 49; 22330 t[1006] = 50; 22331 t[1007] = 51; 22332 t[1008] = 52; 22333 t[1009] = 53; 22334 t[1010] = 54; 22335 t[1011] = 55; 22336 t[1012] = 56; 22337 t[1013] = 57; 22338 t[1081] = 37; 22339 t[1085] = 43; 22340 t[1086] = 45; 22341}); 22342function getStandardFontName(name) { 22343 const fontName = normalizeFontName(name); 22344 const stdFontMap = getStdFontMap(); 22345 return stdFontMap[fontName]; 22346} 22347function isKnownFontName(name) { 22348 const fontName = normalizeFontName(name); 22349 return !!(getStdFontMap()[fontName] || getNonStdFontMap()[fontName] || getSerifFonts()[fontName] || getSymbolsFonts()[fontName]); 22350} 22351 22352;// ./src/core/to_unicode_map.js 22353 22354class ToUnicodeMap { 22355 constructor(cmap = []) { 22356 this._map = cmap; 22357 } 22358 get length() { 22359 return this._map.length; 22360 } 22361 forEach(callback) { 22362 for (const charCode in this._map) { 22363 callback(charCode, this._map[charCode].codePointAt(0)); 22364 } 22365 } 22366 has(i) { 22367 return this._map[i] !== undefined; 22368 } 22369 get(i) { 22370 return this._map[i]; 22371 } 22372 charCodeOf(value) { 22373 const map = this._map; 22374 if (map.length <= 0x10000) { 22375 return map.indexOf(value); 22376 } 22377 for (const charCode in map) { 22378 if (map[charCode] === value) { 22379 return charCode | 0; 22380 } 22381 } 22382 return -1; 22383 } 22384 amend(map) { 22385 for (const charCode in map) { 22386 this._map[charCode] = map[charCode]; 22387 } 22388 } 22389} 22390class IdentityToUnicodeMap { 22391 constructor(firstChar, lastChar) { 22392 this.firstChar = firstChar; 22393 this.lastChar = lastChar; 22394 } 22395 get length() { 22396 return this.lastChar + 1 - this.firstChar; 22397 } 22398 forEach(callback) { 22399 for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) { 22400 callback(i, i); 22401 } 22402 } 22403 has(i) { 22404 return this.firstChar <= i && i <= this.lastChar; 22405 } 22406 get(i) { 22407 if (this.firstChar <= i && i <= this.lastChar) { 22408 return String.fromCharCode(i); 22409 } 22410 return undefined; 22411 } 22412 charCodeOf(v) { 22413 return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1; 22414 } 22415 amend(map) { 22416 unreachable("Should not call amend()"); 22417 } 22418} 22419 22420;// ./src/core/cff_font.js 22421 22422 22423 22424class CFFFont { 22425 constructor(file, properties) { 22426 this.properties = properties; 22427 const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); 22428 this.cff = parser.parse(); 22429 this.cff.duplicateFirstGlyph(); 22430 const compiler = new CFFCompiler(this.cff); 22431 this.seacs = this.cff.seacs; 22432 try { 22433 this.data = compiler.compile(); 22434 } catch { 22435 warn("Failed to compile font " + properties.loadedName); 22436 this.data = file; 22437 } 22438 this._createBuiltInEncoding(); 22439 } 22440 get numGlyphs() { 22441 return this.cff.charStrings.count; 22442 } 22443 getCharset() { 22444 return this.cff.charset.charset; 22445 } 22446 getGlyphMapping() { 22447 const cff = this.cff; 22448 const properties = this.properties; 22449 const { 22450 cidToGidMap, 22451 cMap 22452 } = properties; 22453 const charsets = cff.charset.charset; 22454 let charCodeToGlyphId; 22455 let glyphId; 22456 if (properties.composite) { 22457 let invCidToGidMap; 22458 if (cidToGidMap?.length > 0) { 22459 invCidToGidMap = Object.create(null); 22460 for (let i = 0, ii = cidToGidMap.length; i < ii; i++) { 22461 const gid = cidToGidMap[i]; 22462 if (gid !== undefined) { 22463 invCidToGidMap[gid] = i; 22464 } 22465 } 22466 } 22467 charCodeToGlyphId = Object.create(null); 22468 let charCode; 22469 if (cff.isCIDFont) { 22470 for (glyphId = 0; glyphId < charsets.length; glyphId++) { 22471 const cid = charsets[glyphId]; 22472 charCode = cMap.charCodeOf(cid); 22473 if (invCidToGidMap?.[charCode] !== undefined) { 22474 charCode = invCidToGidMap[charCode]; 22475 } 22476 charCodeToGlyphId[charCode] = glyphId; 22477 } 22478 } else { 22479 for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { 22480 charCode = cMap.charCodeOf(glyphId); 22481 charCodeToGlyphId[charCode] = glyphId; 22482 } 22483 } 22484 return charCodeToGlyphId; 22485 } 22486 let encoding = cff.encoding ? cff.encoding.encoding : null; 22487 if (properties.isInternalFont) { 22488 encoding = properties.defaultEncoding; 22489 } 22490 charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); 22491 return charCodeToGlyphId; 22492 } 22493 hasGlyphId(id) { 22494 return this.cff.hasGlyphId(id); 22495 } 22496 _createBuiltInEncoding() { 22497 const { 22498 charset, 22499 encoding 22500 } = this.cff; 22501 if (!charset || !encoding) { 22502 return; 22503 } 22504 const charsets = charset.charset, 22505 encodings = encoding.encoding; 22506 const map = []; 22507 for (const charCode in encodings) { 22508 const glyphId = encodings[charCode]; 22509 if (glyphId >= 0) { 22510 const glyphName = charsets[glyphId]; 22511 if (glyphName) { 22512 map[charCode] = glyphName; 22513 } 22514 } 22515 } 22516 if (map.length > 0) { 22517 this.properties.builtInEncoding = map; 22518 } 22519 } 22520} 22521 22522;// ./src/core/font_renderer.js 22523 22524 22525 22526 22527 22528 22529 22530 22531 22532 22533 22534 22535 22536 22537function getUint32(data, offset) { 22538 return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; 22539} 22540function getUint16(data, offset) { 22541 return data[offset] << 8 | data[offset + 1]; 22542} 22543function getInt16(data, offset) { 22544 return (data[offset] << 24 | data[offset + 1] << 16) >> 16; 22545} 22546function getInt8(data, offset) { 22547 return data[offset] << 24 >> 24; 22548} 22549function getFloat214(data, offset) { 22550 return getInt16(data, offset) / 16384; 22551} 22552function getSubroutineBias(subrs) { 22553 const numSubrs = subrs.length; 22554 let bias = 32768; 22555 if (numSubrs < 1240) { 22556 bias = 107; 22557 } else if (numSubrs < 33900) { 22558 bias = 1131; 22559 } 22560 return bias; 22561} 22562function parseCmap(data, start, end) { 22563 const offset = getUint16(data, start + 2) === 1 ? getUint32(data, start + 8) : getUint32(data, start + 16); 22564 const format = getUint16(data, start + offset); 22565 let ranges, p, i; 22566 if (format === 4) { 22567 getUint16(data, start + offset + 2); 22568 const segCount = getUint16(data, start + offset + 6) >> 1; 22569 p = start + offset + 14; 22570 ranges = []; 22571 for (i = 0; i < segCount; i++, p += 2) { 22572 ranges[i] = { 22573 end: getUint16(data, p) 22574 }; 22575 } 22576 p += 2; 22577 for (i = 0; i < segCount; i++, p += 2) { 22578 ranges[i].start = getUint16(data, p); 22579 } 22580 for (i = 0; i < segCount; i++, p += 2) { 22581 ranges[i].idDelta = getUint16(data, p); 22582 } 22583 for (i = 0; i < segCount; i++, p += 2) { 22584 let idOffset = getUint16(data, p); 22585 if (idOffset === 0) { 22586 continue; 22587 } 22588 ranges[i].ids = []; 22589 for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { 22590 ranges[i].ids[j] = getUint16(data, p + idOffset); 22591 idOffset += 2; 22592 } 22593 } 22594 return ranges; 22595 } else if (format === 12) { 22596 const groups = getUint32(data, start + offset + 12); 22597 p = start + offset + 16; 22598 ranges = []; 22599 for (i = 0; i < groups; i++) { 22600 start = getUint32(data, p); 22601 ranges.push({ 22602 start, 22603 end: getUint32(data, p + 4), 22604 idDelta: getUint32(data, p + 8) - start 22605 }); 22606 p += 12; 22607 } 22608 return ranges; 22609 } 22610 throw new FormatError(`unsupported cmap: ${format}`); 22611} 22612function parseCff(data, start, end, seacAnalysisEnabled) { 22613 const properties = {}; 22614 const parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled); 22615 const cff = parser.parse(); 22616 return { 22617 glyphs: cff.charStrings.objects, 22618 subrs: cff.topDict.privateDict?.subrsIndex?.objects, 22619 gsubrs: cff.globalSubrIndex?.objects, 22620 isCFFCIDFont: cff.isCIDFont, 22621 fdSelect: cff.fdSelect, 22622 fdArray: cff.fdArray 22623 }; 22624} 22625function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { 22626 let itemSize, itemDecode; 22627 if (isGlyphLocationsLong) { 22628 itemSize = 4; 22629 itemDecode = getUint32; 22630 } else { 22631 itemSize = 2; 22632 itemDecode = (data, offset) => 2 * getUint16(data, offset); 22633 } 22634 const glyphs = []; 22635 let startOffset = itemDecode(loca, 0); 22636 for (let j = itemSize; j < loca.length; j += itemSize) { 22637 const endOffset = itemDecode(loca, j); 22638 glyphs.push(glyf.subarray(startOffset, endOffset)); 22639 startOffset = endOffset; 22640 } 22641 return glyphs; 22642} 22643function lookupCmap(ranges, unicode) { 22644 const code = unicode.codePointAt(0); 22645 let gid = 0, 22646 l = 0, 22647 r = ranges.length - 1; 22648 while (l < r) { 22649 const c = l + r + 1 >> 1; 22650 if (code < ranges[c].start) { 22651 r = c - 1; 22652 } else { 22653 l = c; 22654 } 22655 } 22656 if (ranges[l].start <= code && code <= ranges[l].end) { 22657 gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff; 22658 } 22659 return { 22660 charCode: code, 22661 glyphId: gid 22662 }; 22663} 22664function compileGlyf(code, cmds, font) { 22665 function moveTo(x, y) { 22666 cmds.add("M", [x, y]); 22667 } 22668 function lineTo(x, y) { 22669 cmds.add("L", [x, y]); 22670 } 22671 function quadraticCurveTo(xa, ya, x, y) { 22672 cmds.add("Q", [xa, ya, x, y]); 22673 } 22674 let i = 0; 22675 const numberOfContours = getInt16(code, i); 22676 let flags; 22677 let x = 0, 22678 y = 0; 22679 i += 10; 22680 if (numberOfContours < 0) { 22681 do { 22682 flags = getUint16(code, i); 22683 const glyphIndex = getUint16(code, i + 2); 22684 i += 4; 22685 let arg1, arg2; 22686 if (flags & 0x01) { 22687 if (flags & 0x02) { 22688 arg1 = getInt16(code, i); 22689 arg2 = getInt16(code, i + 2); 22690 } else { 22691 arg1 = getUint16(code, i); 22692 arg2 = getUint16(code, i + 2); 22693 } 22694 i += 4; 22695 } else if (flags & 0x02) { 22696 arg1 = getInt8(code, i++); 22697 arg2 = getInt8(code, i++); 22698 } else { 22699 arg1 = code[i++]; 22700 arg2 = code[i++]; 22701 } 22702 if (flags & 0x02) { 22703 x = arg1; 22704 y = arg2; 22705 } else { 22706 x = 0; 22707 y = 0; 22708 } 22709 let scaleX = 1, 22710 scaleY = 1, 22711 scale01 = 0, 22712 scale10 = 0; 22713 if (flags & 0x08) { 22714 scaleX = scaleY = getFloat214(code, i); 22715 i += 2; 22716 } else if (flags & 0x40) { 22717 scaleX = getFloat214(code, i); 22718 scaleY = getFloat214(code, i + 2); 22719 i += 4; 22720 } else if (flags & 0x80) { 22721 scaleX = getFloat214(code, i); 22722 scale01 = getFloat214(code, i + 2); 22723 scale10 = getFloat214(code, i + 4); 22724 scaleY = getFloat214(code, i + 6); 22725 i += 8; 22726 } 22727 const subglyph = font.glyphs[glyphIndex]; 22728 if (subglyph) { 22729 cmds.save(); 22730 cmds.transform([scaleX, scale01, scale10, scaleY, x, y]); 22731 if (!(flags & 0x02)) {} 22732 compileGlyf(subglyph, cmds, font); 22733 cmds.restore(); 22734 } 22735 } while (flags & 0x20); 22736 } else { 22737 const endPtsOfContours = []; 22738 let j, jj; 22739 for (j = 0; j < numberOfContours; j++) { 22740 endPtsOfContours.push(getUint16(code, i)); 22741 i += 2; 22742 } 22743 const instructionLength = getUint16(code, i); 22744 i += 2 + instructionLength; 22745 const numberOfPoints = endPtsOfContours.at(-1) + 1; 22746 const points = []; 22747 while (points.length < numberOfPoints) { 22748 flags = code[i++]; 22749 let repeat = 1; 22750 if (flags & 0x08) { 22751 repeat += code[i++]; 22752 } 22753 while (repeat-- > 0) { 22754 points.push({ 22755 flags 22756 }); 22757 } 22758 } 22759 for (j = 0; j < numberOfPoints; j++) { 22760 switch (points[j].flags & 0x12) { 22761 case 0x00: 22762 x += getInt16(code, i); 22763 i += 2; 22764 break; 22765 case 0x02: 22766 x -= code[i++]; 22767 break; 22768 case 0x12: 22769 x += code[i++]; 22770 break; 22771 } 22772 points[j].x = x; 22773 } 22774 for (j = 0; j < numberOfPoints; j++) { 22775 switch (points[j].flags & 0x24) { 22776 case 0x00: 22777 y += getInt16(code, i); 22778 i += 2; 22779 break; 22780 case 0x04: 22781 y -= code[i++]; 22782 break; 22783 case 0x24: 22784 y += code[i++]; 22785 break; 22786 } 22787 points[j].y = y; 22788 } 22789 let startPoint = 0; 22790 for (i = 0; i < numberOfContours; i++) { 22791 const endPoint = endPtsOfContours[i]; 22792 const contour = points.slice(startPoint, endPoint + 1); 22793 if (contour[0].flags & 1) { 22794 contour.push(contour[0]); 22795 } else if (contour.at(-1).flags & 1) { 22796 contour.unshift(contour.at(-1)); 22797 } else { 22798 const p = { 22799 flags: 1, 22800 x: (contour[0].x + contour.at(-1).x) / 2, 22801 y: (contour[0].y + contour.at(-1).y) / 2 22802 }; 22803 contour.unshift(p); 22804 contour.push(p); 22805 } 22806 moveTo(contour[0].x, contour[0].y); 22807 for (j = 1, jj = contour.length; j < jj; j++) { 22808 if (contour[j].flags & 1) { 22809 lineTo(contour[j].x, contour[j].y); 22810 } else if (contour[j + 1].flags & 1) { 22811 quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); 22812 j++; 22813 } else { 22814 quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); 22815 } 22816 } 22817 startPoint = endPoint + 1; 22818 } 22819 } 22820} 22821function compileCharString(charStringCode, cmds, font, glyphId) { 22822 function moveTo(x, y) { 22823 cmds.add("M", [x, y]); 22824 } 22825 function lineTo(x, y) { 22826 cmds.add("L", [x, y]); 22827 } 22828 function bezierCurveTo(x1, y1, x2, y2, x, y) { 22829 cmds.add("C", [x1, y1, x2, y2, x, y]); 22830 } 22831 const stack = []; 22832 let x = 0, 22833 y = 0; 22834 let stems = 0; 22835 function parse(code) { 22836 let i = 0; 22837 while (i < code.length) { 22838 let stackClean = false; 22839 let v = code[i++]; 22840 let xa, xb, ya, yb, y1, y2, y3, n, subrCode; 22841 switch (v) { 22842 case 1: 22843 stems += stack.length >> 1; 22844 stackClean = true; 22845 break; 22846 case 3: 22847 stems += stack.length >> 1; 22848 stackClean = true; 22849 break; 22850 case 4: 22851 y += stack.pop(); 22852 moveTo(x, y); 22853 stackClean = true; 22854 break; 22855 case 5: 22856 while (stack.length > 0) { 22857 x += stack.shift(); 22858 y += stack.shift(); 22859 lineTo(x, y); 22860 } 22861 break; 22862 case 6: 22863 while (stack.length > 0) { 22864 x += stack.shift(); 22865 lineTo(x, y); 22866 if (stack.length === 0) { 22867 break; 22868 } 22869 y += stack.shift(); 22870 lineTo(x, y); 22871 } 22872 break; 22873 case 7: 22874 while (stack.length > 0) { 22875 y += stack.shift(); 22876 lineTo(x, y); 22877 if (stack.length === 0) { 22878 break; 22879 } 22880 x += stack.shift(); 22881 lineTo(x, y); 22882 } 22883 break; 22884 case 8: 22885 while (stack.length > 0) { 22886 xa = x + stack.shift(); 22887 ya = y + stack.shift(); 22888 xb = xa + stack.shift(); 22889 yb = ya + stack.shift(); 22890 x = xb + stack.shift(); 22891 y = yb + stack.shift(); 22892 bezierCurveTo(xa, ya, xb, yb, x, y); 22893 } 22894 break; 22895 case 10: 22896 n = stack.pop(); 22897 subrCode = null; 22898 if (font.isCFFCIDFont) { 22899 const fdIndex = font.fdSelect.getFDIndex(glyphId); 22900 if (fdIndex >= 0 && fdIndex < font.fdArray.length) { 22901 const fontDict = font.fdArray[fdIndex]; 22902 let subrs; 22903 if (fontDict.privateDict?.subrsIndex) { 22904 subrs = fontDict.privateDict.subrsIndex.objects; 22905 } 22906 if (subrs) {
vendor: 6,546 bytes, lines 22907-23154
22907 n += getSubroutineBias(subrs); 22908 subrCode = subrs[n]; 22909 } 22910 } else { 22911 warn("Invalid fd index for glyph index."); 22912 } 22913 } else { 22914 subrCode = font.subrs[n + font.subrsBias]; 22915 } 22916 if (subrCode) { 22917 parse(subrCode); 22918 } 22919 break; 22920 case 11: 22921 return; 22922 case 12: 22923 v = code[i++]; 22924 switch (v) { 22925 case 34: 22926 xa = x + stack.shift(); 22927 xb = xa + stack.shift(); 22928 y1 = y + stack.shift(); 22929 x = xb + stack.shift(); 22930 bezierCurveTo(xa, y, xb, y1, x, y1); 22931 xa = x + stack.shift(); 22932 xb = xa + stack.shift(); 22933 x = xb + stack.shift(); 22934 bezierCurveTo(xa, y1, xb, y, x, y); 22935 break; 22936 case 35: 22937 xa = x + stack.shift(); 22938 ya = y + stack.shift(); 22939 xb = xa + stack.shift(); 22940 yb = ya + stack.shift(); 22941 x = xb + stack.shift(); 22942 y = yb + stack.shift(); 22943 bezierCurveTo(xa, ya, xb, yb, x, y); 22944 xa = x + stack.shift(); 22945 ya = y + stack.shift(); 22946 xb = xa + stack.shift(); 22947 yb = ya + stack.shift(); 22948 x = xb + stack.shift(); 22949 y = yb + stack.shift(); 22950 bezierCurveTo(xa, ya, xb, yb, x, y); 22951 stack.pop(); 22952 break; 22953 case 36: 22954 xa = x + stack.shift(); 22955 y1 = y + stack.shift(); 22956 xb = xa + stack.shift(); 22957 y2 = y1 + stack.shift(); 22958 x = xb + stack.shift(); 22959 bezierCurveTo(xa, y1, xb, y2, x, y2); 22960 xa = x + stack.shift(); 22961 xb = xa + stack.shift(); 22962 y3 = y2 + stack.shift(); 22963 x = xb + stack.shift(); 22964 bezierCurveTo(xa, y2, xb, y3, x, y); 22965 break; 22966 case 37: 22967 const x0 = x, 22968 y0 = y; 22969 xa = x + stack.shift(); 22970 ya = y + stack.shift(); 22971 xb = xa + stack.shift(); 22972 yb = ya + stack.shift(); 22973 x = xb + stack.shift(); 22974 y = yb + stack.shift(); 22975 bezierCurveTo(xa, ya, xb, yb, x, y); 22976 xa = x + stack.shift(); 22977 ya = y + stack.shift(); 22978 xb = xa + stack.shift(); 22979 yb = ya + stack.shift(); 22980 x = xb; 22981 y = yb; 22982 if (Math.abs(x - x0) > Math.abs(y - y0)) { 22983 x += stack.shift(); 22984 } else { 22985 y += stack.shift(); 22986 } 22987 bezierCurveTo(xa, ya, xb, yb, x, y); 22988 break; 22989 default: 22990 throw new FormatError(`unknown operator: 12 ${v}`); 22991 } 22992 break; 22993 case 14: 22994 if (stack.length >= 4) { 22995 const achar = stack.pop(); 22996 const bchar = stack.pop(); 22997 y = stack.pop(); 22998 x = stack.pop(); 22999 cmds.save(); 23000 cmds.translate(x, y); 23001 let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])); 23002 compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); 23003 cmds.restore(); 23004 cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])); 23005 compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); 23006 } 23007 return; 23008 case 18: 23009 stems += stack.length >> 1; 23010 stackClean = true; 23011 break; 23012 case 19: 23013 stems += stack.length >> 1; 23014 i += stems + 7 >> 3; 23015 stackClean = true; 23016 break; 23017 case 20: 23018 stems += stack.length >> 1; 23019 i += stems + 7 >> 3; 23020 stackClean = true; 23021 break; 23022 case 21: 23023 y += stack.pop(); 23024 x += stack.pop(); 23025 moveTo(x, y); 23026 stackClean = true; 23027 break; 23028 case 22: 23029 x += stack.pop(); 23030 moveTo(x, y); 23031 stackClean = true; 23032 break; 23033 case 23: 23034 stems += stack.length >> 1; 23035 stackClean = true; 23036 break; 23037 case 24: 23038 while (stack.length > 2) { 23039 xa = x + stack.shift(); 23040 ya = y + stack.shift(); 23041 xb = xa + stack.shift(); 23042 yb = ya + stack.shift(); 23043 x = xb + stack.shift(); 23044 y = yb + stack.shift(); 23045 bezierCurveTo(xa, ya, xb, yb, x, y); 23046 } 23047 x += stack.shift(); 23048 y += stack.shift(); 23049 lineTo(x, y); 23050 break; 23051 case 25: 23052 while (stack.length > 6) { 23053 x += stack.shift(); 23054 y += stack.shift(); 23055 lineTo(x, y); 23056 } 23057 xa = x + stack.shift(); 23058 ya = y + stack.shift(); 23059 xb = xa + stack.shift(); 23060 yb = ya + stack.shift(); 23061 x = xb + stack.shift(); 23062 y = yb + stack.shift(); 23063 bezierCurveTo(xa, ya, xb, yb, x, y); 23064 break; 23065 case 26: 23066 if (stack.length % 2) { 23067 x += stack.shift(); 23068 } 23069 while (stack.length > 0) { 23070 xa = x; 23071 ya = y + stack.shift(); 23072 xb = xa + stack.shift(); 23073 yb = ya + stack.shift(); 23074 x = xb; 23075 y = yb + stack.shift(); 23076 bezierCurveTo(xa, ya, xb, yb, x, y); 23077 } 23078 break; 23079 case 27: 23080 if (stack.length % 2) { 23081 y += stack.shift(); 23082 } 23083 while (stack.length > 0) { 23084 xa = x + stack.shift(); 23085 ya = y; 23086 xb = xa + stack.shift(); 23087 yb = ya + stack.shift(); 23088 x = xb + stack.shift(); 23089 y = yb; 23090 bezierCurveTo(xa, ya, xb, yb, x, y); 23091 } 23092 break; 23093 case 28: 23094 stack.push((code[i] << 24 | code[i + 1] << 16) >> 16); 23095 i += 2; 23096 break; 23097 case 29: 23098 n = stack.pop() + font.gsubrsBias; 23099 subrCode = font.gsubrs[n]; 23100 if (subrCode) { 23101 parse(subrCode); 23102 } 23103 break; 23104 case 30: 23105 while (stack.length > 0) { 23106 xa = x; 23107 ya = y + stack.shift(); 23108 xb = xa + stack.shift(); 23109 yb = ya + stack.shift(); 23110 x = xb + stack.shift(); 23111 y = yb + (stack.length === 1 ? stack.shift() : 0); 23112 bezierCurveTo(xa, ya, xb, yb, x, y); 23113 if (stack.length === 0) { 23114 break; 23115 } 23116 xa = x + stack.shift(); 23117 ya = y; 23118 xb = xa + stack.shift(); 23119 yb = ya + stack.shift(); 23120 y = yb + stack.shift(); 23121 x = xb + (stack.length === 1 ? stack.shift() : 0); 23122 bezierCurveTo(xa, ya, xb, yb, x, y); 23123 } 23124 break; 23125 case 31: 23126 while (stack.length > 0) { 23127 xa = x + stack.shift(); 23128 ya = y; 23129 xb = xa + stack.shift(); 23130 yb = ya + stack.shift(); 23131 y = yb + stack.shift(); 23132 x = xb + (stack.length === 1 ? stack.shift() : 0); 23133 bezierCurveTo(xa, ya, xb, yb, x, y); 23134 if (stack.length === 0) { 23135 break; 23136 } 23137 xa = x; 23138 ya = y + stack.shift(); 23139 xb = xa + stack.shift(); 23140 yb = ya + stack.shift(); 23141 x = xb + stack.shift(); 23142 y = yb + (stack.length === 1 ? stack.shift() : 0); 23143 bezierCurveTo(xa, ya, xb, yb, x, y); 23144 } 23145 break; 23146 default: 23147 if (v < 32) { 23148 throw new FormatError(`unknown operator: ${v}`); 23149 } 23150 if (v < 247) { 23151 stack.push(v - 139); 23152 } else if (v < 251) { 23153 stack.push((v - 247) * 256 + code[i++] + 108); 23154 } else if (v < 255) {
vendor: 4,901 bytes, lines 23155-23331
23155 stack.push(-(v - 251) * 256 - code[i++] - 108); 23156 } else { 23157 stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536); 23158 i += 4; 23159 } 23160 break; 23161 } 23162 if (stackClean) { 23163 stack.length = 0; 23164 } 23165 } 23166 } 23167 parse(charStringCode); 23168} 23169const NOOP = ""; 23170class Commands { 23171 cmds = []; 23172 transformStack = []; 23173 currentTransform = [1, 0, 0, 1, 0, 0]; 23174 add(cmd, args) { 23175 if (args) { 23176 const [a, b, c, d, e, f] = this.currentTransform; 23177 for (let i = 0, ii = args.length; i < ii; i += 2) { 23178 const x = args[i]; 23179 const y = args[i + 1]; 23180 args[i] = a * x + c * y + e; 23181 args[i + 1] = b * x + d * y + f; 23182 } 23183 this.cmds.push(`${cmd}${args.join(" ")}`); 23184 } else { 23185 this.cmds.push(cmd); 23186 } 23187 } 23188 transform(transf) { 23189 this.currentTransform = Util.transform(this.currentTransform, transf); 23190 } 23191 translate(x, y) { 23192 this.transform([1, 0, 0, 1, x, y]); 23193 } 23194 save() { 23195 this.transformStack.push(this.currentTransform.slice()); 23196 } 23197 restore() { 23198 this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0]; 23199 } 23200 getSVG() { 23201 return this.cmds.join(""); 23202 } 23203} 23204class CompiledFont { 23205 constructor(fontMatrix) { 23206 this.fontMatrix = fontMatrix; 23207 this.compiledGlyphs = Object.create(null); 23208 this.compiledCharCodeToGlyphId = Object.create(null); 23209 } 23210 getPathJs(unicode) { 23211 const { 23212 charCode, 23213 glyphId 23214 } = lookupCmap(this.cmap, unicode); 23215 let fn = this.compiledGlyphs[glyphId], 23216 compileEx; 23217 if (fn === undefined) { 23218 try { 23219 fn = this.compileGlyph(this.glyphs[glyphId], glyphId); 23220 } catch (ex) { 23221 fn = NOOP; 23222 compileEx = ex; 23223 } 23224 this.compiledGlyphs[glyphId] = fn; 23225 } 23226 this.compiledCharCodeToGlyphId[charCode] ??= glyphId; 23227 if (compileEx) { 23228 throw compileEx; 23229 } 23230 return fn; 23231 } 23232 compileGlyph(code, glyphId) { 23233 if (!code?.length || code[0] === 14) { 23234 return NOOP; 23235 } 23236 let fontMatrix = this.fontMatrix; 23237 if (this.isCFFCIDFont) { 23238 const fdIndex = this.fdSelect.getFDIndex(glyphId); 23239 if (fdIndex >= 0 && fdIndex < this.fdArray.length) { 23240 const fontDict = this.fdArray[fdIndex]; 23241 fontMatrix = fontDict.getByName("FontMatrix") || FONT_IDENTITY_MATRIX; 23242 } else { 23243 warn("Invalid fd index for glyph index."); 23244 } 23245 } 23246 assert(isNumberArray(fontMatrix, 6), "Expected a valid fontMatrix."); 23247 const cmds = new Commands(); 23248 cmds.transform(fontMatrix.slice()); 23249 this.compileGlyphImpl(code, cmds, glyphId); 23250 cmds.add("Z"); 23251 return cmds.getSVG(); 23252 } 23253 compileGlyphImpl() { 23254 unreachable("Children classes should implement this."); 23255 } 23256 hasBuiltPath(unicode) { 23257 const { 23258 charCode, 23259 glyphId 23260 } = lookupCmap(this.cmap, unicode); 23261 return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== undefined; 23262 } 23263} 23264class TrueTypeCompiled extends CompiledFont { 23265 constructor(glyphs, cmap, fontMatrix) { 23266 super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]); 23267 this.glyphs = glyphs; 23268 this.cmap = cmap; 23269 } 23270 compileGlyphImpl(code, cmds) { 23271 compileGlyf(code, cmds, this); 23272 } 23273} 23274class Type2Compiled extends CompiledFont { 23275 constructor(cffInfo, cmap, fontMatrix) { 23276 super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]); 23277 this.glyphs = cffInfo.glyphs; 23278 this.gsubrs = cffInfo.gsubrs || []; 23279 this.subrs = cffInfo.subrs || []; 23280 this.cmap = cmap; 23281 this.glyphNameMap = getGlyphsUnicode(); 23282 this.gsubrsBias = getSubroutineBias(this.gsubrs); 23283 this.subrsBias = getSubroutineBias(this.subrs); 23284 this.isCFFCIDFont = cffInfo.isCFFCIDFont; 23285 this.fdSelect = cffInfo.fdSelect; 23286 this.fdArray = cffInfo.fdArray; 23287 } 23288 compileGlyphImpl(code, cmds, glyphId) { 23289 compileCharString(code, cmds, this, glyphId); 23290 } 23291} 23292class FontRendererFactory { 23293 static create(font, seacAnalysisEnabled) { 23294 const data = new Uint8Array(font.data); 23295 let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; 23296 const numTables = getUint16(data, 4); 23297 for (let i = 0, p = 12; i < numTables; i++, p += 16) { 23298 const tag = bytesToString(data.subarray(p, p + 4)); 23299 const offset = getUint32(data, p + 8); 23300 const length = getUint32(data, p + 12); 23301 switch (tag) { 23302 case "cmap": 23303 cmap = parseCmap(data, offset, offset + length); 23304 break; 23305 case "glyf": 23306 glyf = data.subarray(offset, offset + length); 23307 break; 23308 case "loca": 23309 loca = data.subarray(offset, offset + length); 23310 break; 23311 case "head": 23312 unitsPerEm = getUint16(data, offset + 18); 23313 indexToLocFormat = getUint16(data, offset + 50); 23314 break; 23315 case "CFF ": 23316 cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); 23317 break; 23318 } 23319 } 23320 if (glyf) { 23321 const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; 23322 return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); 23323 } 23324 return new Type2Compiled(cff, cmap, font.fontMatrix); 23325 } 23326} 23327 23328;// ./src/core/metrics.js 23329 23330const getMetrics = getLookupTableFactory(function (t) { 23331 t.Courier = 600;
23332 t["Courier-Bold"] = 600; 23333 t["Courier-BoldOblique"] = 600; 23334 t["Courier-Oblique"] = 600; 23335 t.Helvetica = getLookupTableFactory(function (t) { 23336 t.space = 278; 23337 t.exclam = 278; 23338 t.quotedbl = 355; 23339 t.numbersign = 556; 23340 t.dollar = 556; 23341 t.percent = 889; 23342 t.ampersand = 667; 23343 t.quoteright = 222; 23344 t.parenleft = 333; 23345 t.parenright = 333; 23346 t.asterisk = 389; 23347 t.plus = 584; 23348 t.comma = 278; 23349 t.hyphen = 333; 23350 t.period = 278; 23351 t.slash = 278; 23352 t.zero = 556; 23353 t.one = 556; 23354 t.two = 556; 23355 t.three = 556; 23356 t.four = 556; 23357 t.five = 556; 23358 t.six = 556; 23359 t.seven = 556; 23360 t.eight = 556; 23361 t.nine = 556; 23362 t.colon = 278; 23363 t.semicolon = 278; 23364 t.less = 584; 23365 t.equal = 584; 23366 t.greater = 584; 23367 t.question = 556; 23368 t.at = 1015; 23369 t.A = 667; 23370 t.B = 667; 23371 t.C = 722; 23372 t.D = 722; 23373 t.E = 667; 23374 t.F = 611; 23375 t.G = 778; 23376 t.H = 722; 23377 t.I = 278; 23378 t.J = 500; 23379 t.K = 667; 23380 t.L = 556; 23381 t.M = 833; 23382 t.N = 722; 23383 t.O = 778; 23384 t.P = 667; 23385 t.Q = 778; 23386 t.R = 722; 23387 t.S = 667; 23388 t.T = 611; 23389 t.U = 722; 23390 t.V = 667; 23391 t.W = 944; 23392 t.X = 667; 23393 t.Y = 667; 23394 t.Z = 611; 23395 t.bracketleft = 278; 23396 t.backslash = 278; 23397 t.bracketright = 278; 23398 t.asciicircum = 469; 23399 t.underscore = 556; 23400 t.quoteleft = 222; 23401 t.a = 556; 23402 t.b = 556; 23403 t.c = 500; 23404 t.d = 556; 23405 t.e = 556; 23406 t.f = 278; 23407 t.g = 556; 23408 t.h = 556; 23409 t.i = 222; 23410 t.j = 222; 23411 t.k = 500; 23412 t.l = 222; 23413 t.m = 833; 23414 t.n = 556; 23415 t.o = 556; 23416 t.p = 556; 23417 t.q = 556; 23418 t.r = 333; 23419 t.s = 500; 23420 t.t = 278; 23421 t.u = 556; 23422 t.v = 500; 23423 t.w = 722; 23424 t.x = 500; 23425 t.y = 500; 23426 t.z = 500; 23427 t.braceleft = 334; 23428 t.bar = 260; 23429 t.braceright = 334; 23430 t.asciitilde = 584; 23431 t.exclamdown = 333; 23432 t.cent = 556; 23433 t.sterling = 556; 23434 t.fraction = 167; 23435 t.yen = 556; 23436 t.florin = 556; 23437 t.section = 556; 23438 t.currency = 556; 23439 t.quotesingle = 191; 23440 t.quotedblleft = 333; 23441 t.guillemotleft = 556; 23442 t.guilsinglleft = 333; 23443 t.guilsinglright = 333; 23444 t.fi = 500; 23445 t.fl = 500; 23446 t.endash = 556; 23447 t.dagger = 556; 23448 t.daggerdbl = 556;
23449 t.periodcentered = 278; 23450 t.paragraph = 537; 23451 t.bullet = 350; 23452 t.quotesinglbase = 222; 23453 t.quotedblbase = 333; 23454 t.quotedblright = 333; 23455 t.guillemotright = 556; 23456 t.ellipsis = 1000; 23457 t.perthousand = 1000; 23458 t.questiondown = 611; 23459 t.grave = 333; 23460 t.acute = 333; 23461 t.circumflex = 333; 23462 t.tilde = 333; 23463 t.macron = 333; 23464 t.breve = 333; 23465 t.dotaccent = 333; 23466 t.dieresis = 333; 23467 t.ring = 333; 23468 t.cedilla = 333; 23469 t.hungarumlaut = 333; 23470 t.ogonek = 333; 23471 t.caron = 333; 23472 t.emdash = 1000; 23473 t.AE = 1000; 23474 t.ordfeminine = 370; 23475 t.Lslash = 556; 23476 t.Oslash = 778; 23477 t.OE = 1000; 23478 t.ordmasculine = 365; 23479 t.ae = 889; 23480 t.dotlessi = 278; 23481 t.lslash = 222; 23482 t.oslash = 611; 23483 t.oe = 944; 23484 t.germandbls = 611; 23485 t.Idieresis = 278; 23486 t.eacute = 556; 23487 t.abreve = 556; 23488 t.uhungarumlaut = 556; 23489 t.ecaron = 556; 23490 t.Ydieresis = 667; 23491 t.divide = 584; 23492 t.Yacute = 667; 23493 t.Acircumflex = 667; 23494 t.aacute = 556; 23495 t.Ucircumflex = 722; 23496 t.yacute = 500; 23497 t.scommaaccent = 500; 23498 t.ecircumflex = 556; 23499 t.Uring = 722; 23500 t.Udieresis = 722; 23501 t.aogonek = 556; 23502 t.Uacute = 722; 23503 t.uogonek = 556; 23504 t.Edieresis = 667; 23505 t.Dcroat = 722; 23506 t.commaaccent = 250; 23507 t.copyright = 737; 23508 t.Emacron = 667; 23509 t.ccaron = 500; 23510 t.aring = 556; 23511 t.Ncommaaccent = 722; 23512 t.lacute = 222; 23513 t.agrave = 556; 23514 t.Tcommaaccent = 611; 23515 t.Cacute = 722; 23516 t.atilde = 556; 23517 t.Edotaccent = 667; 23518 t.scaron = 500; 23519 t.scedilla = 500; 23520 t.iacute = 278; 23521 t.lozenge = 471; 23522 t.Rcaron = 722; 23523 t.Gcommaaccent = 778; 23524 t.ucircumflex = 556; 23525 t.acircumflex = 556; 23526 t.Amacron = 667; 23527 t.rcaron = 333; 23528 t.ccedilla = 500; 23529 t.Zdotaccent = 611; 23530 t.Thorn = 667; 23531 t.Omacron = 778; 23532 t.Racute = 722; 23533 t.Sacute = 667; 23534 t.dcaron = 643; 23535 t.Umacron = 722; 23536 t.uring = 556; 23537 t.threesuperior = 333; 23538 t.Ograve = 778; 23539 t.Agrave = 667; 23540 t.Abreve = 667; 23541 t.multiply = 584; 23542 t.uacute = 556; 23543 t.Tcaron = 611; 23544 t.partialdiff = 476; 23545 t.ydieresis = 500; 23546 t.Nacute = 722; 23547 t.icircumflex = 278; 23548 t.Ecircumflex = 667; 23549 t.adieresis = 556; 23550 t.edieresis = 556; 23551 t.cacute = 500; 23552 t.nacute = 556; 23553 t.umacron = 556; 23554 t.Ncaron = 722; 23555 t.Iacute = 278; 23556 t.plusminus = 584; 23557 t.brokenbar = 260; 23558 t.registered = 737; 23559 t.Gbreve = 778; 23560 t.Idotaccent = 278; 23561 t.summation = 600; 23562 t.Egrave = 667; 23563 t.racute = 333; 23564 t.omacron = 556; 23565 t.Zacute = 611; 23566 t.Zcaron = 611; 23567 t.greaterequal = 549; 23568 t.Eth = 722; 23569 t.Ccedilla = 722; 23570 t.lcommaaccent = 222; 23571 t.tcaron = 317; 23572 t.eogonek = 556; 23573 t.Uogonek = 722; 23574 t.Aacute = 667; 23575 t.Adieresis = 667; 23576 t.egrave = 556; 23577 t.zacute = 500; 23578 t.iogonek = 222; 23579 t.Oacute = 778; 23580 t.oacute = 556; 23581 t.amacron = 556; 23582 t.sacute = 500; 23583 t.idieresis = 278; 23584 t.Ocircumflex = 778; 23585 t.Ugrave = 722; 23586 t.Delta = 612; 23587 t.thorn = 556; 23588 t.twosuperior = 333; 23589 t.Odieresis = 778; 23590 t.mu = 556; 23591 t.igrave = 278; 23592 t.ohungarumlaut = 556; 23593 t.Eogonek = 667; 23594 t.dcroat = 556; 23595 t.threequarters = 834; 23596 t.Scedilla = 667; 23597 t.lcaron = 299; 23598 t.Kcommaaccent = 667; 23599 t.Lacute = 556; 23600 t.trademark = 1000; 23601 t.edotaccent = 556; 23602 t.Igrave = 278; 23603 t.Imacron = 278; 23604 t.Lcaron = 556; 23605 t.onehalf = 834; 23606 t.lessequal = 549; 23607 t.ocircumflex = 556; 23608 t.ntilde = 556; 23609 t.Uhungarumlaut = 722; 23610 t.Eacute = 667; 23611 t.emacron = 556; 23612 t.gbreve = 556; 23613 t.onequarter = 834; 23614 t.Scaron = 667; 23615 t.Scommaaccent = 667; 23616 t.Ohungarumlaut = 778; 23617 t.degree = 400; 23618 t.ograve = 556; 23619 t.Ccaron = 722; 23620 t.ugrave = 556; 23621 t.radical = 453; 23622 t.Dcaron = 722; 23623 t.rcommaaccent = 333; 23624 t.Ntilde = 722; 23625 t.otilde = 556; 23626 t.Rcommaaccent = 722; 23627 t.Lcommaaccent = 556; 23628 t.Atilde = 667; 23629 t.Aogonek = 667; 23630 t.Aring = 667; 23631 t.Otilde = 778; 23632 t.zdotaccent = 500; 23633 t.Ecaron = 667; 23634 t.Iogonek = 278; 23635 t.kcommaaccent = 500; 23636 t.minus = 584; 23637 t.Icircumflex = 278; 23638 t.ncaron = 556; 23639 t.tcommaaccent = 278; 23640 t.logicalnot = 584; 23641 t.odieresis = 556; 23642 t.udieresis = 556; 23643 t.notequal = 549; 23644 t.gcommaaccent = 556; 23645 t.eth = 556; 23646 t.zcaron = 500; 23647 t.ncommaaccent = 556; 23648 t.onesuperior = 333; 23649 t.imacron = 278; 23650 t.Euro = 556; 23651 }); 23652 t["Helvetica-Bold"] = getLookupTableFactory(function (t) { 23653 t.space = 278; 23654 t.exclam = 333; 23655 t.quotedbl = 474; 23656 t.numbersign = 556; 23657 t.dollar = 556; 23658 t.percent = 889; 23659 t.ampersand = 722; 23660 t.quoteright = 278; 23661 t.parenleft = 333; 23662 t.parenright = 333; 23663 t.asterisk = 389; 23664 t.plus = 584; 23665 t.comma = 278; 23666 t.hyphen = 333; 23667 t.period = 278; 23668 t.slash = 278; 23669 t.zero = 556; 23670 t.one = 556; 23671 t.two = 556; 23672 t.three = 556; 23673 t.four = 556; 23674 t.five = 556; 23675 t.six = 556; 23676 t.seven = 556; 23677 t.eight = 556; 23678 t.nine = 556; 23679 t.colon = 333; 23680 t.semicolon = 333; 23681 t.less = 584; 23682 t.equal = 584; 23683 t.greater = 584; 23684 t.question = 611; 23685 t.at = 975; 23686 t.A = 722; 23687 t.B = 722; 23688 t.C = 722; 23689 t.D = 722; 23690 t.E = 667; 23691 t.F = 611; 23692 t.G = 778; 23693 t.H = 722; 23694 t.I = 278; 23695 t.J = 556; 23696 t.K = 722; 23697 t.L = 611; 23698 t.M = 833; 23699 t.N = 722; 23700 t.O = 778; 23701 t.P = 667; 23702 t.Q = 778; 23703 t.R = 722; 23704 t.S = 667; 23705 t.T = 611; 23706 t.U = 722; 23707 t.V = 667; 23708 t.W = 944; 23709 t.X = 667; 23710 t.Y = 667; 23711 t.Z = 611; 23712 t.bracketleft = 333; 23713 t.backslash = 278; 23714 t.bracketright = 333; 23715 t.asciicircum = 584; 23716 t.underscore = 556; 23717 t.quoteleft = 278; 23718 t.a = 556; 23719 t.b = 611; 23720 t.c = 556; 23721 t.d = 611; 23722 t.e = 556; 23723 t.f = 333; 23724 t.g = 611; 23725 t.h = 611; 23726 t.i = 278; 23727 t.j = 278; 23728 t.k = 556; 23729 t.l = 278; 23730 t.m = 889; 23731 t.n = 611; 23732 t.o = 611; 23733 t.p = 611; 23734 t.q = 611; 23735 t.r = 389; 23736 t.s = 556; 23737 t.t = 333; 23738 t.u = 611; 23739 t.v = 556; 23740 t.w = 778;
23741 t.x = 556; 23742 t.y = 556; 23743 t.z = 500; 23744 t.braceleft = 389; 23745 t.bar = 280; 23746 t.braceright = 389; 23747 t.asciitilde = 584; 23748 t.exclamdown = 333; 23749 t.cent = 556; 23750 t.sterling = 556; 23751 t.fraction = 167; 23752 t.yen = 556; 23753 t.florin = 556; 23754 t.section = 556; 23755 t.currency = 556; 23756 t.quotesingle = 238; 23757 t.quotedblleft = 500; 23758 t.guillemotleft = 556; 23759 t.guilsinglleft = 333; 23760 t.guilsinglright = 333; 23761 t.fi = 611; 23762 t.fl = 611; 23763 t.endash = 556; 23764 t.dagger = 556; 23765 t.daggerdbl = 556; 23766 t.periodcentered = 278; 23767 t.paragraph = 556; 23768 t.bullet = 350; 23769 t.quotesinglbase = 278; 23770 t.quotedblbase = 500; 23771 t.quotedblright = 500; 23772 t.guillemotright = 556; 23773 t.ellipsis = 1000; 23774 t.perthousand = 1000; 23775 t.questiondown = 611; 23776 t.grave = 333; 23777 t.acute = 333; 23778 t.circumflex = 333; 23779 t.tilde = 333; 23780 t.macron = 333; 23781 t.breve = 333; 23782 t.dotaccent = 333; 23783 t.dieresis = 333; 23784 t.ring = 333; 23785 t.cedilla = 333; 23786 t.hungarumlaut = 333; 23787 t.ogonek = 333; 23788 t.caron = 333; 23789 t.emdash = 1000; 23790 t.AE = 1000; 23791 t.ordfeminine = 370; 23792 t.Lslash = 611; 23793 t.Oslash = 778; 23794 t.OE = 1000; 23795 t.ordmasculine = 365; 23796 t.ae = 889; 23797 t.dotlessi = 278; 23798 t.lslash = 278; 23799 t.oslash = 611; 23800 t.oe = 944; 23801 t.germandbls = 611; 23802 t.Idieresis = 278; 23803 t.eacute = 556; 23804 t.abreve = 556; 23805 t.uhungarumlaut = 611; 23806 t.ecaron = 556; 23807 t.Ydieresis = 667; 23808 t.divide = 584; 23809 t.Yacute = 667; 23810 t.Acircumflex = 722; 23811 t.aacute = 556; 23812 t.Ucircumflex = 722; 23813 t.yacute = 556; 23814 t.scommaaccent = 556; 23815 t.ecircumflex = 556; 23816 t.Uring = 722; 23817 t.Udieresis = 722; 23818 t.aogonek = 556; 23819 t.Uacute = 722; 23820 t.uogonek = 611; 23821 t.Edieresis = 667; 23822 t.Dcroat = 722; 23823 t.commaaccent = 250; 23824 t.copyright = 737; 23825 t.Emacron = 667; 23826 t.ccaron = 556; 23827 t.aring = 556; 23828 t.Ncommaaccent = 722; 23829 t.lacute = 278; 23830 t.agrave = 556; 23831 t.Tcommaaccent = 611; 23832 t.Cacute = 722; 23833 t.atilde = 556; 23834 t.Edotaccent = 667; 23835 t.scaron = 556; 23836 t.scedilla = 556; 23837 t.iacute = 278; 23838 t.lozenge = 494; 23839 t.Rcaron = 722; 23840 t.Gcommaaccent = 778; 23841 t.ucircumflex = 611; 23842 t.acircumflex = 556; 23843 t.Amacron = 722; 23844 t.rcaron = 389; 23845 t.ccedilla = 556; 23846 t.Zdotaccent = 611; 23847 t.Thorn = 667; 23848 t.Omacron = 778; 23849 t.Racute = 722; 23850 t.Sacute = 667; 23851 t.dcaron = 743; 23852 t.Umacron = 722; 23853 t.uring = 611; 23854 t.threesuperior = 333; 23855 t.Ograve = 778; 23856 t.Agrave = 722; 23857 t.Abreve = 722; 23858 t.multiply = 584; 23859 t.uacute = 611; 23860 t.Tcaron = 611; 23861 t.partialdiff = 494; 23862 t.ydieresis = 556; 23863 t.Nacute = 722; 23864 t.icircumflex = 278; 23865 t.Ecircumflex = 667; 23866 t.adieresis = 556; 23867 t.edieresis = 556; 23868 t.cacute = 556; 23869 t.nacute = 611; 23870 t.umacron = 611; 23871 t.Ncaron = 722; 23872 t.Iacute = 278; 23873 t.plusminus = 584; 23874 t.brokenbar = 280; 23875 t.registered = 737; 23876 t.Gbreve = 778; 23877 t.Idotaccent = 278; 23878 t.summation = 600; 23879 t.Egrave = 667; 23880 t.racute = 389; 23881 t.omacron = 611; 23882 t.Zacute = 611; 23883 t.Zcaron = 611; 23884 t.greaterequal = 549; 23885 t.Eth = 722; 23886 t.Ccedilla = 722; 23887 t.lcommaaccent = 278; 23888 t.tcaron = 389; 23889 t.eogonek = 556; 23890 t.Uogonek = 722; 23891 t.Aacute = 722; 23892 t.Adieresis = 722; 23893 t.egrave = 556; 23894 t.zacute = 500; 23895 t.iogonek = 278; 23896 t.Oacute = 778; 23897 t.oacute = 611; 23898 t.amacron = 556; 23899 t.sacute = 556; 23900 t.idieresis = 278; 23901 t.Ocircumflex = 778; 23902 t.Ugrave = 722; 23903 t.Delta = 612; 23904 t.thorn = 611; 23905 t.twosuperior = 333; 23906 t.Odieresis = 778; 23907 t.mu = 611; 23908 t.igrave = 278; 23909 t.ohungarumlaut = 611; 23910 t.Eogonek = 667; 23911 t.dcroat = 611; 23912 t.threequarters = 834; 23913 t.Scedilla = 667; 23914 t.lcaron = 400; 23915 t.Kcommaaccent = 722; 23916 t.Lacute = 611; 23917 t.trademark = 1000; 23918 t.edotaccent = 556; 23919 t.Igrave = 278; 23920 t.Imacron = 278; 23921 t.Lcaron = 611; 23922 t.onehalf = 834; 23923 t.lessequal = 549; 23924 t.ocircumflex = 611; 23925 t.ntilde = 611; 23926 t.Uhungarumlaut = 722; 23927 t.Eacute = 667; 23928 t.emacron = 556; 23929 t.gbreve = 611; 23930 t.onequarter = 834; 23931 t.Scaron = 667; 23932 t.Scommaaccent = 667; 23933 t.Ohungarumlaut = 778; 23934 t.degree = 400; 23935 t.ograve = 611; 23936 t.Ccaron = 722; 23937 t.ugrave = 611; 23938 t.radical = 549; 23939 t.Dcaron = 722; 23940 t.rcommaaccent = 389;
23941 t.Ntilde = 722; 23942 t.otilde = 611; 23943 t.Rcommaaccent = 722; 23944 t.Lcommaaccent = 611; 23945 t.Atilde = 722; 23946 t.Aogonek = 722; 23947 t.Aring = 722; 23948 t.Otilde = 778; 23949 t.zdotaccent = 500; 23950 t.Ecaron = 667; 23951 t.Iogonek = 278; 23952 t.kcommaaccent = 556; 23953 t.minus = 584; 23954 t.Icircumflex = 278; 23955 t.ncaron = 611; 23956 t.tcommaaccent = 333; 23957 t.logicalnot = 584; 23958 t.odieresis = 611; 23959 t.udieresis = 611; 23960 t.notequal = 549; 23961 t.gcommaaccent = 611; 23962 t.eth = 611; 23963 t.zcaron = 500; 23964 t.ncommaaccent = 611; 23965 t.onesuperior = 333; 23966 t.imacron = 278; 23967 t.Euro = 556; 23968 }); 23969 t["Helvetica-BoldOblique"] = getLookupTableFactory(function (t) { 23970 t.space = 278; 23971 t.exclam = 333; 23972 t.quotedbl = 474; 23973 t.numbersign = 556; 23974 t.dollar = 556; 23975 t.percent = 889; 23976 t.ampersand = 722; 23977 t.quoteright = 278; 23978 t.parenleft = 333; 23979 t.parenright = 333; 23980 t.asterisk = 389; 23981 t.plus = 584; 23982 t.comma = 278; 23983 t.hyphen = 333; 23984 t.period = 278; 23985 t.slash = 278; 23986 t.zero = 556; 23987 t.one = 556; 23988 t.two = 556; 23989 t.three = 556; 23990 t.four = 556; 23991 t.five = 556; 23992 t.six = 556; 23993 t.seven = 556; 23994 t.eight = 556; 23995 t.nine = 556; 23996 t.colon = 333; 23997 t.semicolon = 333; 23998 t.less = 584; 23999 t.equal = 584; 24000 t.greater = 584; 24001 t.question = 611; 24002 t.at = 975; 24003 t.A = 722; 24004 t.B = 722; 24005 t.C = 722; 24006 t.D = 722; 24007 t.E = 667; 24008 t.F = 611; 24009 t.G = 778; 24010 t.H = 722; 24011 t.I = 278; 24012 t.J = 556; 24013 t.K = 722; 24014 t.L = 611; 24015 t.M = 833; 24016 t.N = 722; 24017 t.O = 778; 24018 t.P = 667; 24019 t.Q = 778; 24020 t.R = 722; 24021 t.S = 667; 24022 t.T = 611; 24023 t.U = 722; 24024 t.V = 667; 24025 t.W = 944; 24026 t.X = 667; 24027 t.Y = 667; 24028 t.Z = 611; 24029 t.bracketleft = 333; 24030 t.backslash = 278; 24031 t.bracketright = 333; 24032 t.asciicircum = 584; 24033 t.underscore = 556; 24034 t.quoteleft = 278; 24035 t.a = 556; 24036 t.b = 611; 24037 t.c = 556; 24038 t.d = 611; 24039 t.e = 556; 24040 t.f = 333; 24041 t.g = 611; 24042 t.h = 611; 24043 t.i = 278; 24044 t.j = 278; 24045 t.k = 556; 24046 t.l = 278; 24047 t.m = 889; 24048 t.n = 611; 24049 t.o = 611; 24050 t.p = 611; 24051 t.q = 611; 24052 t.r = 389; 24053 t.s = 556; 24054 t.t = 333; 24055 t.u = 611; 24056 t.v = 556; 24057 t.w = 778; 24058 t.x = 556; 24059 t.y = 556; 24060 t.z = 500; 24061 t.braceleft = 389; 24062 t.bar = 280; 24063 t.braceright = 389; 24064 t.asciitilde = 584; 24065 t.exclamdown = 333; 24066 t.cent = 556; 24067 t.sterling = 556; 24068 t.fraction = 167; 24069 t.yen = 556; 24070 t.florin = 556; 24071 t.section = 556; 24072 t.currency = 556; 24073 t.quotesingle = 238; 24074 t.quotedblleft = 500; 24075 t.guillemotleft = 556; 24076 t.guilsinglleft = 333; 24077 t.guilsinglright = 333; 24078 t.fi = 611; 24079 t.fl = 611; 24080 t.endash = 556; 24081 t.dagger = 556; 24082 t.daggerdbl = 556;
24083 t.periodcentered = 278; 24084 t.paragraph = 556; 24085 t.bullet = 350; 24086 t.quotesinglbase = 278; 24087 t.quotedblbase = 500; 24088 t.quotedblright = 500; 24089 t.guillemotright = 556; 24090 t.ellipsis = 1000; 24091 t.perthousand = 1000; 24092 t.questiondown = 611; 24093 t.grave = 333; 24094 t.acute = 333; 24095 t.circumflex = 333; 24096 t.tilde = 333; 24097 t.macron = 333; 24098 t.breve = 333; 24099 t.dotaccent = 333; 24100 t.dieresis = 333; 24101 t.ring = 333; 24102 t.cedilla = 333; 24103 t.hungarumlaut = 333; 24104 t.ogonek = 333; 24105 t.caron = 333; 24106 t.emdash = 1000; 24107 t.AE = 1000; 24108 t.ordfeminine = 370; 24109 t.Lslash = 611; 24110 t.Oslash = 778; 24111 t.OE = 1000; 24112 t.ordmasculine = 365; 24113 t.ae = 889; 24114 t.dotlessi = 278; 24115 t.lslash = 278; 24116 t.oslash = 611; 24117 t.oe = 944; 24118 t.germandbls = 611; 24119 t.Idieresis = 278; 24120 t.eacute = 556; 24121 t.abreve = 556; 24122 t.uhungarumlaut = 611; 24123 t.ecaron = 556; 24124 t.Ydieresis = 667; 24125 t.divide = 584; 24126 t.Yacute = 667; 24127 t.Acircumflex = 722; 24128 t.aacute = 556; 24129 t.Ucircumflex = 722; 24130 t.yacute = 556; 24131 t.scommaaccent = 556; 24132 t.ecircumflex = 556; 24133 t.Uring = 722; 24134 t.Udieresis = 722; 24135 t.aogonek = 556; 24136 t.Uacute = 722; 24137 t.uogonek = 611; 24138 t.Edieresis = 667; 24139 t.Dcroat = 722; 24140 t.commaaccent = 250; 24141 t.copyright = 737; 24142 t.Emacron = 667; 24143 t.ccaron = 556; 24144 t.aring = 556; 24145 t.Ncommaaccent = 722; 24146 t.lacute = 278; 24147 t.agrave = 556; 24148 t.Tcommaaccent = 611; 24149 t.Cacute = 722; 24150 t.atilde = 556; 24151 t.Edotaccent = 667; 24152 t.scaron = 556; 24153 t.scedilla = 556; 24154 t.iacute = 278; 24155 t.lozenge = 494; 24156 t.Rcaron = 722; 24157 t.Gcommaaccent = 778; 24158 t.ucircumflex = 611; 24159 t.acircumflex = 556; 24160 t.Amacron = 722; 24161 t.rcaron = 389; 24162 t.ccedilla = 556; 24163 t.Zdotaccent = 611; 24164 t.Thorn = 667; 24165 t.Omacron = 778; 24166 t.Racute = 722; 24167 t.Sacute = 667; 24168 t.dcaron = 743; 24169 t.Umacron = 722; 24170 t.uring = 611; 24171 t.threesuperior = 333; 24172 t.Ograve = 778; 24173 t.Agrave = 722; 24174 t.Abreve = 722; 24175 t.multiply = 584; 24176 t.uacute = 611; 24177 t.Tcaron = 611; 24178 t.partialdiff = 494; 24179 t.ydieresis = 556; 24180 t.Nacute = 722; 24181 t.icircumflex = 278; 24182 t.Ecircumflex = 667; 24183 t.adieresis = 556; 24184 t.edieresis = 556; 24185 t.cacute = 556; 24186 t.nacute = 611; 24187 t.umacron = 611; 24188 t.Ncaron = 722; 24189 t.Iacute = 278; 24190 t.plusminus = 584; 24191 t.brokenbar = 280; 24192 t.registered = 737; 24193 t.Gbreve = 778; 24194 t.Idotaccent = 278; 24195 t.summation = 600; 24196 t.Egrave = 667; 24197 t.racute = 389; 24198 t.omacron = 611; 24199 t.Zacute = 611; 24200 t.Zcaron = 611; 24201 t.greaterequal = 549; 24202 t.Eth = 722; 24203 t.Ccedilla = 722; 24204 t.lcommaaccent = 278; 24205 t.tcaron = 389; 24206 t.eogonek = 556; 24207 t.Uogonek = 722; 24208 t.Aacute = 722; 24209 t.Adieresis = 722; 24210 t.egrave = 556; 24211 t.zacute = 500; 24212 t.iogonek = 278; 24213 t.Oacute = 778; 24214 t.oacute = 611; 24215 t.amacron = 556; 24216 t.sacute = 556; 24217 t.idieresis = 278; 24218 t.Ocircumflex = 778; 24219 t.Ugrave = 722; 24220 t.Delta = 612; 24221 t.thorn = 611; 24222 t.twosuperior = 333; 24223 t.Odieresis = 778; 24224 t.mu = 611; 24225 t.igrave = 278; 24226 t.ohungarumlaut = 611; 24227 t.Eogonek = 667; 24228 t.dcroat = 611; 24229 t.threequarters = 834; 24230 t.Scedilla = 667; 24231 t.lcaron = 400; 24232 t.Kcommaaccent = 722; 24233 t.Lacute = 611; 24234 t.trademark = 1000; 24235 t.edotaccent = 556; 24236 t.Igrave = 278; 24237 t.Imacron = 278; 24238 t.Lcaron = 611; 24239 t.onehalf = 834; 24240 t.lessequal = 549; 24241 t.ocircumflex = 611; 24242 t.ntilde = 611; 24243 t.Uhungarumlaut = 722; 24244 t.Eacute = 667; 24245 t.emacron = 556; 24246 t.gbreve = 611; 24247 t.onequarter = 834; 24248 t.Scaron = 667; 24249 t.Scommaaccent = 667; 24250 t.Ohungarumlaut = 778; 24251 t.degree = 400; 24252 t.ograve = 611; 24253 t.Ccaron = 722; 24254 t.ugrave = 611; 24255 t.radical = 549; 24256 t.Dcaron = 722; 24257 t.rcommaaccent = 389;
24258 t.Ntilde = 722; 24259 t.otilde = 611; 24260 t.Rcommaaccent = 722; 24261 t.Lcommaaccent = 611; 24262 t.Atilde = 722; 24263 t.Aogonek = 722; 24264 t.Aring = 722; 24265 t.Otilde = 778; 24266 t.zdotaccent = 500; 24267 t.Ecaron = 667; 24268 t.Iogonek = 278; 24269 t.kcommaaccent = 556; 24270 t.minus = 584; 24271 t.Icircumflex = 278; 24272 t.ncaron = 611; 24273 t.tcommaaccent = 333; 24274 t.logicalnot = 584; 24275 t.odieresis = 611; 24276 t.udieresis = 611; 24277 t.notequal = 549; 24278 t.gcommaaccent = 611; 24279 t.eth = 611; 24280 t.zcaron = 500; 24281 t.ncommaaccent = 611; 24282 t.onesuperior = 333; 24283 t.imacron = 278; 24284 t.Euro = 556; 24285 }); 24286 t["Helvetica-Oblique"] = getLookupTableFactory(function (t) { 24287 t.space = 278; 24288 t.exclam = 278; 24289 t.quotedbl = 355; 24290 t.numbersign = 556; 24291 t.dollar = 556; 24292 t.percent = 889; 24293 t.ampersand = 667; 24294 t.quoteright = 222; 24295 t.parenleft = 333; 24296 t.parenright = 333; 24297 t.asterisk = 389; 24298 t.plus = 584; 24299 t.comma = 278; 24300 t.hyphen = 333; 24301 t.period = 278; 24302 t.slash = 278; 24303 t.zero = 556; 24304 t.one = 556; 24305 t.two = 556; 24306 t.three = 556; 24307 t.four = 556; 24308 t.five = 556; 24309 t.six = 556; 24310 t.seven = 556; 24311 t.eight = 556; 24312 t.nine = 556; 24313 t.colon = 278; 24314 t.semicolon = 278; 24315 t.less = 584; 24316 t.equal = 584; 24317 t.greater = 584; 24318 t.question = 556; 24319 t.at = 1015; 24320 t.A = 667; 24321 t.B = 667; 24322 t.C = 722; 24323 t.D = 722; 24324 t.E = 667; 24325 t.F = 611; 24326 t.G = 778; 24327 t.H = 722; 24328 t.I = 278; 24329 t.J = 500; 24330 t.K = 667; 24331 t.L = 556; 24332 t.M = 833; 24333 t.N = 722; 24334 t.O = 778; 24335 t.P = 667; 24336 t.Q = 778; 24337 t.R = 722; 24338 t.S = 667; 24339 t.T = 611; 24340 t.U = 722; 24341 t.V = 667; 24342 t.W = 944; 24343 t.X = 667; 24344 t.Y = 667; 24345 t.Z = 611; 24346 t.bracketleft = 278; 24347 t.backslash = 278; 24348 t.bracketright = 278; 24349 t.asciicircum = 469; 24350 t.underscore = 556; 24351 t.quoteleft = 222; 24352 t.a = 556; 24353 t.b = 556; 24354 t.c = 500; 24355 t.d = 556; 24356 t.e = 556; 24357 t.f = 278; 24358 t.g = 556; 24359 t.h = 556; 24360 t.i = 222; 24361 t.j = 222; 24362 t.k = 500; 24363 t.l = 222; 24364 t.m = 833; 24365 t.n = 556; 24366 t.o = 556; 24367 t.p = 556; 24368 t.q = 556; 24369 t.r = 333; 24370 t.s = 500; 24371 t.t = 278; 24372 t.u = 556; 24373 t.v = 500; 24374 t.w = 722; 24375 t.x = 500; 24376 t.y = 500; 24377 t.z = 500; 24378 t.braceleft = 334; 24379 t.bar = 260; 24380 t.braceright = 334; 24381 t.asciitilde = 584; 24382 t.exclamdown = 333; 24383 t.cent = 556; 24384 t.sterling = 556; 24385 t.fraction = 167; 24386 t.yen = 556; 24387 t.florin = 556; 24388 t.section = 556; 24389 t.currency = 556; 24390 t.quotesingle = 191; 24391 t.quotedblleft = 333; 24392 t.guillemotleft = 556; 24393 t.guilsinglleft = 333; 24394 t.guilsinglright = 333; 24395 t.fi = 500; 24396 t.fl = 500; 24397 t.endash = 556; 24398 t.dagger = 556; 24399 t.daggerdbl = 556;
24400 t.periodcentered = 278; 24401 t.paragraph = 537; 24402 t.bullet = 350; 24403 t.quotesinglbase = 222; 24404 t.quotedblbase = 333; 24405 t.quotedblright = 333; 24406 t.guillemotright = 556; 24407 t.ellipsis = 1000; 24408 t.perthousand = 1000; 24409 t.questiondown = 611; 24410 t.grave = 333; 24411 t.acute = 333; 24412 t.circumflex = 333; 24413 t.tilde = 333; 24414 t.macron = 333; 24415 t.breve = 333; 24416 t.dotaccent = 333; 24417 t.dieresis = 333; 24418 t.ring = 333; 24419 t.cedilla = 333; 24420 t.hungarumlaut = 333; 24421 t.ogonek = 333; 24422 t.caron = 333; 24423 t.emdash = 1000; 24424 t.AE = 1000; 24425 t.ordfeminine = 370; 24426 t.Lslash = 556; 24427 t.Oslash = 778; 24428 t.OE = 1000; 24429 t.ordmasculine = 365; 24430 t.ae = 889; 24431 t.dotlessi = 278; 24432 t.lslash = 222; 24433 t.oslash = 611; 24434 t.oe = 944; 24435 t.germandbls = 611; 24436 t.Idieresis = 278; 24437 t.eacute = 556; 24438 t.abreve = 556; 24439 t.uhungarumlaut = 556; 24440 t.ecaron = 556; 24441 t.Ydieresis = 667; 24442 t.divide = 584; 24443 t.Yacute = 667; 24444 t.Acircumflex = 667; 24445 t.aacute = 556; 24446 t.Ucircumflex = 722; 24447 t.yacute = 500; 24448 t.scommaaccent = 500; 24449 t.ecircumflex = 556; 24450 t.Uring = 722; 24451 t.Udieresis = 722; 24452 t.aogonek = 556; 24453 t.Uacute = 722; 24454 t.uogonek = 556; 24455 t.Edieresis = 667; 24456 t.Dcroat = 722; 24457 t.commaaccent = 250; 24458 t.copyright = 737; 24459 t.Emacron = 667; 24460 t.ccaron = 500; 24461 t.aring = 556; 24462 t.Ncommaaccent = 722; 24463 t.lacute = 222; 24464 t.agrave = 556; 24465 t.Tcommaaccent = 611; 24466 t.Cacute = 722; 24467 t.atilde = 556; 24468 t.Edotaccent = 667; 24469 t.scaron = 500; 24470 t.scedilla = 500; 24471 t.iacute = 278; 24472 t.lozenge = 471; 24473 t.Rcaron = 722; 24474 t.Gcommaaccent = 778; 24475 t.ucircumflex = 556; 24476 t.acircumflex = 556; 24477 t.Amacron = 667; 24478 t.rcaron = 333; 24479 t.ccedilla = 500; 24480 t.Zdotaccent = 611; 24481 t.Thorn = 667; 24482 t.Omacron = 778; 24483 t.Racute = 722; 24484 t.Sacute = 667; 24485 t.dcaron = 643; 24486 t.Umacron = 722; 24487 t.uring = 556; 24488 t.threesuperior = 333; 24489 t.Ograve = 778; 24490 t.Agrave = 667; 24491 t.Abreve = 667; 24492 t.multiply = 584; 24493 t.uacute = 556; 24494 t.Tcaron = 611; 24495 t.partialdiff = 476; 24496 t.ydieresis = 500; 24497 t.Nacute = 722; 24498 t.icircumflex = 278; 24499 t.Ecircumflex = 667; 24500 t.adieresis = 556; 24501 t.edieresis = 556; 24502 t.cacute = 500; 24503 t.nacute = 556; 24504 t.umacron = 556; 24505 t.Ncaron = 722; 24506 t.Iacute = 278; 24507 t.plusminus = 584; 24508 t.brokenbar = 260; 24509 t.registered = 737; 24510 t.Gbreve = 778; 24511 t.Idotaccent = 278; 24512 t.summation = 600; 24513 t.Egrave = 667; 24514 t.racute = 333; 24515 t.omacron = 556; 24516 t.Zacute = 611; 24517 t.Zcaron = 611; 24518 t.greaterequal = 549; 24519 t.Eth = 722; 24520 t.Ccedilla = 722; 24521 t.lcommaaccent = 222; 24522 t.tcaron = 317; 24523 t.eogonek = 556; 24524 t.Uogonek = 722; 24525 t.Aacute = 667; 24526 t.Adieresis = 667; 24527 t.egrave = 556; 24528 t.zacute = 500; 24529 t.iogonek = 222; 24530 t.Oacute = 778; 24531 t.oacute = 556; 24532 t.amacron = 556; 24533 t.sacute = 500; 24534 t.idieresis = 278; 24535 t.Ocircumflex = 778; 24536 t.Ugrave = 722; 24537 t.Delta = 612; 24538 t.thorn = 556; 24539 t.twosuperior = 333; 24540 t.Odieresis = 778; 24541 t.mu = 556; 24542 t.igrave = 278; 24543 t.ohungarumlaut = 556; 24544 t.Eogonek = 667; 24545 t.dcroat = 556; 24546 t.threequarters = 834; 24547 t.Scedilla = 667; 24548 t.lcaron = 299; 24549 t.Kcommaaccent = 667; 24550 t.Lacute = 556; 24551 t.trademark = 1000; 24552 t.edotaccent = 556; 24553 t.Igrave = 278; 24554 t.Imacron = 278; 24555 t.Lcaron = 556; 24556 t.onehalf = 834; 24557 t.lessequal = 549; 24558 t.ocircumflex = 556; 24559 t.ntilde = 556; 24560 t.Uhungarumlaut = 722; 24561 t.Eacute = 667; 24562 t.emacron = 556; 24563 t.gbreve = 556; 24564 t.onequarter = 834; 24565 t.Scaron = 667; 24566 t.Scommaaccent = 667; 24567 t.Ohungarumlaut = 778; 24568 t.degree = 400; 24569 t.ograve = 556; 24570 t.Ccaron = 722; 24571 t.ugrave = 556; 24572 t.radical = 453; 24573 t.Dcaron = 722; 24574 t.rcommaaccent = 333; 24575 t.Ntilde = 722; 24576 t.otilde = 556; 24577 t.Rcommaaccent = 722; 24578 t.Lcommaaccent = 556; 24579 t.Atilde = 667; 24580 t.Aogonek = 667; 24581 t.Aring = 667; 24582 t.Otilde = 778; 24583 t.zdotaccent = 500; 24584 t.Ecaron = 667; 24585 t.Iogonek = 278; 24586 t.kcommaaccent = 500; 24587 t.minus = 584; 24588 t.Icircumflex = 278; 24589 t.ncaron = 556; 24590 t.tcommaaccent = 278; 24591 t.logicalnot = 584; 24592 t.odieresis = 556; 24593 t.udieresis = 556; 24594 t.notequal = 549; 24595 t.gcommaaccent = 556; 24596 t.eth = 556; 24597 t.zcaron = 500; 24598 t.ncommaaccent = 556; 24599 t.onesuperior = 333; 24600 t.imacron = 278; 24601 t.Euro = 556; 24602 }); 24603 t.Symbol = getLookupTableFactory(function (t) { 24604 t.space = 250; 24605 t.exclam = 333; 24606 t.universal = 713; 24607 t.numbersign = 500; 24608 t.existential = 549; 24609 t.percent = 833; 24610 t.ampersand = 778; 24611 t.suchthat = 439; 24612 t.parenleft = 333; 24613 t.parenright = 333; 24614 t.asteriskmath = 500; 24615 t.plus = 549; 24616 t.comma = 250; 24617 t.minus = 549; 24618 t.period = 250; 24619 t.slash = 278; 24620 t.zero = 500; 24621 t.one = 500; 24622 t.two = 500; 24623 t.three = 500; 24624 t.four = 500; 24625 t.five = 500; 24626 t.six = 500; 24627 t.seven = 500; 24628 t.eight = 500; 24629 t.nine = 500; 24630 t.colon = 278; 24631 t.semicolon = 278; 24632 t.less = 549; 24633 t.equal = 549; 24634 t.greater = 549; 24635 t.question = 444; 24636 t.congruent = 549; 24637 t.Alpha = 722; 24638 t.Beta = 667; 24639 t.Chi = 722; 24640 t.Delta = 612; 24641 t.Epsilon = 611; 24642 t.Phi = 763; 24643 t.Gamma = 603; 24644 t.Eta = 722; 24645 t.Iota = 333; 24646 t.theta1 = 631; 24647 t.Kappa = 722;
24648 t.Lambda = 686; 24649 t.Mu = 889; 24650 t.Nu = 722; 24651 t.Omicron = 722; 24652 t.Pi = 768; 24653 t.Theta = 741; 24654 t.Rho = 556; 24655 t.Sigma = 592; 24656 t.Tau = 611; 24657 t.Upsilon = 690; 24658 t.sigma1 = 439; 24659 t.Omega = 768; 24660 t.Xi = 645; 24661 t.Psi = 795; 24662 t.Zeta = 611; 24663 t.bracketleft = 333; 24664 t.therefore = 863; 24665 t.bracketright = 333; 24666 t.perpendicular = 658; 24667 t.underscore = 500; 24668 t.radicalex = 500; 24669 t.alpha = 631; 24670 t.beta = 549; 24671 t.chi = 549; 24672 t.delta = 494; 24673 t.epsilon = 439; 24674 t.phi = 521; 24675 t.gamma = 411; 24676 t.eta = 603; 24677 t.iota = 329; 24678 t.phi1 = 603; 24679 t.kappa = 549; 24680 t.lambda = 549; 24681 t.mu = 576; 24682 t.nu = 521; 24683 t.omicron = 549; 24684 t.pi = 549; 24685 t.theta = 521; 24686 t.rho = 549; 24687 t.sigma = 603; 24688 t.tau = 439; 24689 t.upsilon = 576; 24690 t.omega1 = 713; 24691 t.omega = 686; 24692 t.xi = 493; 24693 t.psi = 686; 24694 t.zeta = 494; 24695 t.braceleft = 480; 24696 t.bar = 200; 24697 t.braceright = 480; 24698 t.similar = 549; 24699 t.Euro = 750; 24700 t.Upsilon1 = 620; 24701 t.minute = 247; 24702 t.lessequal = 549; 24703 t.fraction = 167; 24704 t.infinity = 713; 24705 t.florin = 500; 24706 t.club = 753; 24707 t.diamond = 753; 24708 t.heart = 753; 24709 t.spade = 753; 24710 t.arrowboth = 1042; 24711 t.arrowleft = 987; 24712 t.arrowup = 603; 24713 t.arrowright = 987; 24714 t.arrowdown = 603; 24715 t.degree = 400; 24716 t.plusminus = 549; 24717 t.second = 411; 24718 t.greaterequal = 549; 24719 t.multiply = 549; 24720 t.proportional = 713; 24721 t.partialdiff = 494; 24722 t.bullet = 460; 24723 t.divide = 549; 24724 t.notequal = 549; 24725 t.equivalence = 549; 24726 t.approxequal = 549; 24727 t.ellipsis = 1000; 24728 t.arrowvertex = 603; 24729 t.arrowhorizex = 1000; 24730 t.carriagereturn = 658; 24731 t.aleph = 823; 24732 t.Ifraktur = 686; 24733 t.Rfraktur = 795; 24734 t.weierstrass = 987; 24735 t.circlemultiply = 768; 24736 t.circleplus = 768; 24737 t.emptyset = 823; 24738 t.intersection = 768; 24739 t.union = 768; 24740 t.propersuperset = 713; 24741 t.reflexsuperset = 713; 24742 t.notsubset = 713; 24743 t.propersubset = 713; 24744 t.reflexsubset = 713; 24745 t.element = 713; 24746 t.notelement = 713; 24747 t.angle = 768; 24748 t.gradient = 713; 24749 t.registerserif = 790; 24750 t.copyrightserif = 790; 24751 t.trademarkserif = 890; 24752 t.product = 823; 24753 t.radical = 549; 24754 t.dotmath = 250; 24755 t.logicalnot = 713; 24756 t.logicaland = 603; 24757 t.logicalor = 603; 24758 t.arrowdblboth = 1042; 24759 t.arrowdblleft = 987; 24760 t.arrowdblup = 603; 24761 t.arrowdblright = 987; 24762 t.arrowdbldown = 603; 24763 t.lozenge = 494; 24764 t.angleleft = 329; 24765 t.registersans = 790; 24766 t.copyrightsans = 790; 24767 t.trademarksans = 786; 24768 t.summation = 713; 24769 t.parenlefttp = 384; 24770 t.parenleftex = 384; 24771 t.parenleftbt = 384; 24772 t.bracketlefttp = 384; 24773 t.bracketleftex = 384; 24774 t.bracketleftbt = 384; 24775 t.bracelefttp = 494; 24776 t.braceleftmid = 494; 24777 t.braceleftbt = 494; 24778 t.braceex = 494; 24779 t.angleright = 329; 24780 t.integral = 274; 24781 t.integraltp = 686; 24782 t.integralex = 686; 24783 t.integralbt = 686; 24784 t.parenrighttp = 384; 24785 t.parenrightex = 384; 24786 t.parenrightbt = 384; 24787 t.bracketrighttp = 384; 24788 t.bracketrightex = 384; 24789 t.bracketrightbt = 384; 24790 t.bracerighttp = 494; 24791 t.bracerightmid = 494; 24792 t.bracerightbt = 494; 24793 t.apple = 790; 24794 }); 24795 t["Times-Roman"] = getLookupTableFactory(function (t) { 24796 t.space = 250; 24797 t.exclam = 333; 24798 t.quotedbl = 408; 24799 t.numbersign = 500; 24800 t.dollar = 500; 24801 t.percent = 833; 24802 t.ampersand = 778; 24803 t.quoteright = 333; 24804 t.parenleft = 333; 24805 t.parenright = 333; 24806 t.asterisk = 500; 24807 t.plus = 564; 24808 t.comma = 250; 24809 t.hyphen = 333; 24810 t.period = 250; 24811 t.slash = 278; 24812 t.zero = 500; 24813 t.one = 500; 24814 t.two = 500; 24815 t.three = 500; 24816 t.four = 500; 24817 t.five = 500; 24818 t.six = 500; 24819 t.seven = 500; 24820 t.eight = 500; 24821 t.nine = 500; 24822 t.colon = 278; 24823 t.semicolon = 278; 24824 t.less = 564; 24825 t.equal = 564; 24826 t.greater = 564; 24827 t.question = 444; 24828 t.at = 921; 24829 t.A = 722; 24830 t.B = 667; 24831 t.C = 667; 24832 t.D = 722; 24833 t.E = 611; 24834 t.F = 556; 24835 t.G = 722; 24836 t.H = 722; 24837 t.I = 333; 24838 t.J = 389; 24839 t.K = 722; 24840 t.L = 611; 24841 t.M = 889; 24842 t.N = 722; 24843 t.O = 722; 24844 t.P = 556; 24845 t.Q = 722; 24846 t.R = 667; 24847 t.S = 556; 24848 t.T = 611; 24849 t.U = 722; 24850 t.V = 722; 24851 t.W = 944; 24852 t.X = 722; 24853 t.Y = 722; 24854 t.Z = 611; 24855 t.bracketleft = 333; 24856 t.backslash = 278; 24857 t.bracketright = 333; 24858 t.asciicircum = 469; 24859 t.underscore = 500; 24860 t.quoteleft = 333; 24861 t.a = 444; 24862 t.b = 500; 24863 t.c = 444; 24864 t.d = 500; 24865 t.e = 444; 24866 t.f = 333; 24867 t.g = 500; 24868 t.h = 500; 24869 t.i = 278; 24870 t.j = 278; 24871 t.k = 500; 24872 t.l = 278; 24873 t.m = 778; 24874 t.n = 500; 24875 t.o = 500; 24876 t.p = 500; 24877 t.q = 500; 24878 t.r = 333; 24879 t.s = 389; 24880 t.t = 278; 24881 t.u = 500; 24882 t.v = 500; 24883 t.w = 722;
24884 t.x = 500; 24885 t.y = 500; 24886 t.z = 444; 24887 t.braceleft = 480; 24888 t.bar = 200; 24889 t.braceright = 480; 24890 t.asciitilde = 541; 24891 t.exclamdown = 333; 24892 t.cent = 500; 24893 t.sterling = 500; 24894 t.fraction = 167; 24895 t.yen = 500; 24896 t.florin = 500; 24897 t.section = 500; 24898 t.currency = 500; 24899 t.quotesingle = 180; 24900 t.quotedblleft = 444; 24901 t.guillemotleft = 500; 24902 t.guilsinglleft = 333; 24903 t.guilsinglright = 333; 24904 t.fi = 556; 24905 t.fl = 556; 24906 t.endash = 500; 24907 t.dagger = 500; 24908 t.daggerdbl = 500; 24909 t.periodcentered = 250; 24910 t.paragraph = 453; 24911 t.bullet = 350; 24912 t.quotesinglbase = 333; 24913 t.quotedblbase = 444; 24914 t.quotedblright = 444; 24915 t.guillemotright = 500; 24916 t.ellipsis = 1000; 24917 t.perthousand = 1000; 24918 t.questiondown = 444; 24919 t.grave = 333; 24920 t.acute = 333; 24921 t.circumflex = 333; 24922 t.tilde = 333; 24923 t.macron = 333; 24924 t.breve = 333; 24925 t.dotaccent = 333; 24926 t.dieresis = 333; 24927 t.ring = 333; 24928 t.cedilla = 333; 24929 t.hungarumlaut = 333; 24930 t.ogonek = 333; 24931 t.caron = 333; 24932 t.emdash = 1000; 24933 t.AE = 889; 24934 t.ordfeminine = 276; 24935 t.Lslash = 611; 24936 t.Oslash = 722; 24937 t.OE = 889; 24938 t.ordmasculine = 310; 24939 t.ae = 667; 24940 t.dotlessi = 278; 24941 t.lslash = 278; 24942 t.oslash = 500; 24943 t.oe = 722; 24944 t.germandbls = 500; 24945 t.Idieresis = 333; 24946 t.eacute = 444; 24947 t.abreve = 444; 24948 t.uhungarumlaut = 500; 24949 t.ecaron = 444; 24950 t.Ydieresis = 722; 24951 t.divide = 564; 24952 t.Yacute = 722; 24953 t.Acircumflex = 722; 24954 t.aacute = 444; 24955 t.Ucircumflex = 722; 24956 t.yacute = 500; 24957 t.scommaaccent = 389; 24958 t.ecircumflex = 444; 24959 t.Uring = 722; 24960 t.Udieresis = 722; 24961 t.aogonek = 444; 24962 t.Uacute = 722; 24963 t.uogonek = 500; 24964 t.Edieresis = 611; 24965 t.Dcroat = 722; 24966 t.commaaccent = 250; 24967 t.copyright = 760; 24968 t.Emacron = 611; 24969 t.ccaron = 444; 24970 t.aring = 444; 24971 t.Ncommaaccent = 722; 24972 t.lacute = 278; 24973 t.agrave = 444; 24974 t.Tcommaaccent = 611; 24975 t.Cacute = 667; 24976 t.atilde = 444; 24977 t.Edotaccent = 611; 24978 t.scaron = 389; 24979 t.scedilla = 389; 24980 t.iacute = 278; 24981 t.lozenge = 471; 24982 t.Rcaron = 667; 24983 t.Gcommaaccent = 722; 24984 t.ucircumflex = 500; 24985 t.acircumflex = 444; 24986 t.Amacron = 722; 24987 t.rcaron = 333; 24988 t.ccedilla = 444; 24989 t.Zdotaccent = 611; 24990 t.Thorn = 556; 24991 t.Omacron = 722; 24992 t.Racute = 667; 24993 t.Sacute = 556; 24994 t.dcaron = 588; 24995 t.Umacron = 722; 24996 t.uring = 500; 24997 t.threesuperior = 300; 24998 t.Ograve = 722; 24999 t.Agrave = 722; 25000 t.Abreve = 722; 25001 t.multiply = 564; 25002 t.uacute = 500; 25003 t.Tcaron = 611; 25004 t.partialdiff = 476; 25005 t.ydieresis = 500; 25006 t.Nacute = 722; 25007 t.icircumflex = 278; 25008 t.Ecircumflex = 611; 25009 t.adieresis = 444; 25010 t.edieresis = 444; 25011 t.cacute = 444; 25012 t.nacute = 500; 25013 t.umacron = 500; 25014 t.Ncaron = 722; 25015 t.Iacute = 333; 25016 t.plusminus = 564; 25017 t.brokenbar = 200; 25018 t.registered = 760; 25019 t.Gbreve = 722; 25020 t.Idotaccent = 333; 25021 t.summation = 600; 25022 t.Egrave = 611; 25023 t.racute = 333; 25024 t.omacron = 500; 25025 t.Zacute = 611; 25026 t.Zcaron = 611; 25027 t.greaterequal = 549; 25028 t.Eth = 722; 25029 t.Ccedilla = 667; 25030 t.lcommaaccent = 278; 25031 t.tcaron = 326; 25032 t.eogonek = 444; 25033 t.Uogonek = 722; 25034 t.Aacute = 722; 25035 t.Adieresis = 722; 25036 t.egrave = 444; 25037 t.zacute = 444; 25038 t.iogonek = 278; 25039 t.Oacute = 722; 25040 t.oacute = 500; 25041 t.amacron = 444; 25042 t.sacute = 389; 25043 t.idieresis = 278; 25044 t.Ocircumflex = 722; 25045 t.Ugrave = 722; 25046 t.Delta = 612; 25047 t.thorn = 500; 25048 t.twosuperior = 300; 25049 t.Odieresis = 722; 25050 t.mu = 500; 25051 t.igrave = 278; 25052 t.ohungarumlaut = 500; 25053 t.Eogonek = 611; 25054 t.dcroat = 500; 25055 t.threequarters = 750; 25056 t.Scedilla = 556; 25057 t.lcaron = 344; 25058 t.Kcommaaccent = 722; 25059 t.Lacute = 611; 25060 t.trademark = 980; 25061 t.edotaccent = 444; 25062 t.Igrave = 333; 25063 t.Imacron = 333; 25064 t.Lcaron = 611; 25065 t.onehalf = 750; 25066 t.lessequal = 549; 25067 t.ocircumflex = 500; 25068 t.ntilde = 500; 25069 t.Uhungarumlaut = 722; 25070 t.Eacute = 611; 25071 t.emacron = 444; 25072 t.gbreve = 500; 25073 t.onequarter = 750; 25074 t.Scaron = 556; 25075 t.Scommaaccent = 556; 25076 t.Ohungarumlaut = 722; 25077 t.degree = 400; 25078 t.ograve = 500; 25079 t.Ccaron = 667; 25080 t.ugrave = 500; 25081 t.radical = 453; 25082 t.Dcaron = 722; 25083 t.rcommaaccent = 333; 25084 t.Ntilde = 722; 25085 t.otilde = 500; 25086 t.Rcommaaccent = 667; 25087 t.Lcommaaccent = 611; 25088 t.Atilde = 722; 25089 t.Aogonek = 722; 25090 t.Aring = 722; 25091 t.Otilde = 722; 25092 t.zdotaccent = 444; 25093 t.Ecaron = 611; 25094 t.Iogonek = 333; 25095 t.kcommaaccent = 500; 25096 t.minus = 564; 25097 t.Icircumflex = 333; 25098 t.ncaron = 500; 25099 t.tcommaaccent = 278; 25100 t.logicalnot = 564; 25101 t.odieresis = 500; 25102 t.udieresis = 500; 25103 t.notequal = 549; 25104 t.gcommaaccent = 500; 25105 t.eth = 500; 25106 t.zcaron = 444; 25107 t.ncommaaccent = 500; 25108 t.onesuperior = 300; 25109 t.imacron = 278; 25110 t.Euro = 500; 25111 }); 25112 t["Times-Bold"] = getLookupTableFactory(function (t) { 25113 t.space = 250; 25114 t.exclam = 333; 25115 t.quotedbl = 555; 25116 t.numbersign = 500; 25117 t.dollar = 500; 25118 t.percent = 1000; 25119 t.ampersand = 833; 25120 t.quoteright = 333; 25121 t.parenleft = 333; 25122 t.parenright = 333; 25123 t.asterisk = 500; 25124 t.plus = 570; 25125 t.comma = 250; 25126 t.hyphen = 333; 25127 t.period = 250; 25128 t.slash = 278; 25129 t.zero = 500; 25130 t.one = 500; 25131 t.two = 500; 25132 t.three = 500; 25133 t.four = 500; 25134 t.five = 500; 25135 t.six = 500; 25136 t.seven = 500; 25137 t.eight = 500; 25138 t.nine = 500; 25139 t.colon = 333; 25140 t.semicolon = 333; 25141 t.less = 570; 25142 t.equal = 570; 25143 t.greater = 570; 25144 t.question = 500; 25145 t.at = 930; 25146 t.A = 722; 25147 t.B = 667; 25148 t.C = 722; 25149 t.D = 722; 25150 t.E = 667; 25151 t.F = 611; 25152 t.G = 778; 25153 t.H = 778; 25154 t.I = 389; 25155 t.J = 500; 25156 t.K = 778; 25157 t.L = 667; 25158 t.M = 944; 25159 t.N = 722; 25160 t.O = 778; 25161 t.P = 611; 25162 t.Q = 778; 25163 t.R = 722; 25164 t.S = 556; 25165 t.T = 667; 25166 t.U = 722; 25167 t.V = 722; 25168 t.W = 1000; 25169 t.X = 722; 25170 t.Y = 722; 25171 t.Z = 667; 25172 t.bracketleft = 333; 25173 t.backslash = 278; 25174 t.bracketright = 333; 25175 t.asciicircum = 581; 25176 t.underscore = 500; 25177 t.quoteleft = 333; 25178 t.a = 500; 25179 t.b = 556; 25180 t.c = 444; 25181 t.d = 556; 25182 t.e = 444; 25183 t.f = 333; 25184 t.g = 500; 25185 t.h = 556; 25186 t.i = 278; 25187 t.j = 333; 25188 t.k = 556; 25189 t.l = 278; 25190 t.m = 833; 25191 t.n = 556; 25192 t.o = 500; 25193 t.p = 556; 25194 t.q = 556; 25195 t.r = 444; 25196 t.s = 389; 25197 t.t = 333; 25198 t.u = 556; 25199 t.v = 500; 25200 t.w = 722;
25201 t.x = 500; 25202 t.y = 500; 25203 t.z = 444; 25204 t.braceleft = 394; 25205 t.bar = 220; 25206 t.braceright = 394; 25207 t.asciitilde = 520; 25208 t.exclamdown = 333; 25209 t.cent = 500; 25210 t.sterling = 500; 25211 t.fraction = 167; 25212 t.yen = 500; 25213 t.florin = 500; 25214 t.section = 500; 25215 t.currency = 500; 25216 t.quotesingle = 278; 25217 t.quotedblleft = 500; 25218 t.guillemotleft = 500; 25219 t.guilsinglleft = 333; 25220 t.guilsinglright = 333; 25221 t.fi = 556; 25222 t.fl = 556; 25223 t.endash = 500; 25224 t.dagger = 500; 25225 t.daggerdbl = 500; 25226 t.periodcentered = 250; 25227 t.paragraph = 540; 25228 t.bullet = 350; 25229 t.quotesinglbase = 333; 25230 t.quotedblbase = 500; 25231 t.quotedblright = 500; 25232 t.guillemotright = 500; 25233 t.ellipsis = 1000; 25234 t.perthousand = 1000; 25235 t.questiondown = 500; 25236 t.grave = 333; 25237 t.acute = 333; 25238 t.circumflex = 333; 25239 t.tilde = 333; 25240 t.macron = 333; 25241 t.breve = 333; 25242 t.dotaccent = 333; 25243 t.dieresis = 333; 25244 t.ring = 333; 25245 t.cedilla = 333; 25246 t.hungarumlaut = 333; 25247 t.ogonek = 333; 25248 t.caron = 333; 25249 t.emdash = 1000; 25250 t.AE = 1000; 25251 t.ordfeminine = 300; 25252 t.Lslash = 667; 25253 t.Oslash = 778; 25254 t.OE = 1000; 25255 t.ordmasculine = 330; 25256 t.ae = 722; 25257 t.dotlessi = 278; 25258 t.lslash = 278; 25259 t.oslash = 500; 25260 t.oe = 722; 25261 t.germandbls = 556; 25262 t.Idieresis = 389; 25263 t.eacute = 444; 25264 t.abreve = 500; 25265 t.uhungarumlaut = 556; 25266 t.ecaron = 444; 25267 t.Ydieresis = 722; 25268 t.divide = 570; 25269 t.Yacute = 722; 25270 t.Acircumflex = 722; 25271 t.aacute = 500; 25272 t.Ucircumflex = 722; 25273 t.yacute = 500; 25274 t.scommaaccent = 389; 25275 t.ecircumflex = 444; 25276 t.Uring = 722; 25277 t.Udieresis = 722; 25278 t.aogonek = 500; 25279 t.Uacute = 722; 25280 t.uogonek = 556; 25281 t.Edieresis = 667; 25282 t.Dcroat = 722; 25283 t.commaaccent = 250; 25284 t.copyright = 747; 25285 t.Emacron = 667; 25286 t.ccaron = 444; 25287 t.aring = 500; 25288 t.Ncommaaccent = 722; 25289 t.lacute = 278; 25290 t.agrave = 500; 25291 t.Tcommaaccent = 667; 25292 t.Cacute = 722; 25293 t.atilde = 500; 25294 t.Edotaccent = 667; 25295 t.scaron = 389; 25296 t.scedilla = 389; 25297 t.iacute = 278; 25298 t.lozenge = 494; 25299 t.Rcaron = 722; 25300 t.Gcommaaccent = 778; 25301 t.ucircumflex = 556; 25302 t.acircumflex = 500; 25303 t.Amacron = 722; 25304 t.rcaron = 444; 25305 t.ccedilla = 444; 25306 t.Zdotaccent = 667; 25307 t.Thorn = 611; 25308 t.Omacron = 778; 25309 t.Racute = 722; 25310 t.Sacute = 556; 25311 t.dcaron = 672; 25312 t.Umacron = 722; 25313 t.uring = 556; 25314 t.threesuperior = 300; 25315 t.Ograve = 778; 25316 t.Agrave = 722; 25317 t.Abreve = 722; 25318 t.multiply = 570; 25319 t.uacute = 556; 25320 t.Tcaron = 667; 25321 t.partialdiff = 494; 25322 t.ydieresis = 500; 25323 t.Nacute = 722; 25324 t.icircumflex = 278; 25325 t.Ecircumflex = 667; 25326 t.adieresis = 500; 25327 t.edieresis = 444; 25328 t.cacute = 444; 25329 t.nacute = 556; 25330 t.umacron = 556; 25331 t.Ncaron = 722; 25332 t.Iacute = 389; 25333 t.plusminus = 570; 25334 t.brokenbar = 220; 25335 t.registered = 747; 25336 t.Gbreve = 778; 25337 t.Idotaccent = 389; 25338 t.summation = 600; 25339 t.Egrave = 667; 25340 t.racute = 444; 25341 t.omacron = 500; 25342 t.Zacute = 667; 25343 t.Zcaron = 667; 25344 t.greaterequal = 549; 25345 t.Eth = 722; 25346 t.Ccedilla = 722; 25347 t.lcommaaccent = 278; 25348 t.tcaron = 416; 25349 t.eogonek = 444; 25350 t.Uogonek = 722; 25351 t.Aacute = 722; 25352 t.Adieresis = 722; 25353 t.egrave = 444; 25354 t.zacute = 444; 25355 t.iogonek = 278; 25356 t.Oacute = 778; 25357 t.oacute = 500; 25358 t.amacron = 500; 25359 t.sacute = 389; 25360 t.idieresis = 278; 25361 t.Ocircumflex = 778; 25362 t.Ugrave = 722; 25363 t.Delta = 612; 25364 t.thorn = 556; 25365 t.twosuperior = 300; 25366 t.Odieresis = 778; 25367 t.mu = 556; 25368 t.igrave = 278; 25369 t.ohungarumlaut = 500; 25370 t.Eogonek = 667; 25371 t.dcroat = 556; 25372 t.threequarters = 750; 25373 t.Scedilla = 556; 25374 t.lcaron = 394; 25375 t.Kcommaaccent = 778; 25376 t.Lacute = 667; 25377 t.trademark = 1000; 25378 t.edotaccent = 444; 25379 t.Igrave = 389; 25380 t.Imacron = 389; 25381 t.Lcaron = 667; 25382 t.onehalf = 750; 25383 t.lessequal = 549; 25384 t.ocircumflex = 500; 25385 t.ntilde = 556; 25386 t.Uhungarumlaut = 722; 25387 t.Eacute = 667; 25388 t.emacron = 444; 25389 t.gbreve = 500; 25390 t.onequarter = 750; 25391 t.Scaron = 556; 25392 t.Scommaaccent = 556; 25393 t.Ohungarumlaut = 778; 25394 t.degree = 400; 25395 t.ograve = 500; 25396 t.Ccaron = 722; 25397 t.ugrave = 556; 25398 t.radical = 549; 25399 t.Dcaron = 722; 25400 t.rcommaaccent = 444; 25401 t.Ntilde = 722; 25402 t.otilde = 500; 25403 t.Rcommaaccent = 722; 25404 t.Lcommaaccent = 667; 25405 t.Atilde = 722; 25406 t.Aogonek = 722; 25407 t.Aring = 722; 25408 t.Otilde = 778; 25409 t.zdotaccent = 444; 25410 t.Ecaron = 667; 25411 t.Iogonek = 389; 25412 t.kcommaaccent = 556; 25413 t.minus = 570; 25414 t.Icircumflex = 389; 25415 t.ncaron = 556; 25416 t.tcommaaccent = 333; 25417 t.logicalnot = 570; 25418 t.odieresis = 500; 25419 t.udieresis = 556; 25420 t.notequal = 549; 25421 t.gcommaaccent = 500; 25422 t.eth = 500; 25423 t.zcaron = 444; 25424 t.ncommaaccent = 556; 25425 t.onesuperior = 300; 25426 t.imacron = 278; 25427 t.Euro = 500; 25428 }); 25429 t["Times-BoldItalic"] = getLookupTableFactory(function (t) { 25430 t.space = 250; 25431 t.exclam = 389; 25432 t.quotedbl = 555; 25433 t.numbersign = 500; 25434 t.dollar = 500; 25435 t.percent = 833; 25436 t.ampersand = 778; 25437 t.quoteright = 333; 25438 t.parenleft = 333; 25439 t.parenright = 333; 25440 t.asterisk = 500; 25441 t.plus = 570; 25442 t.comma = 250; 25443 t.hyphen = 333; 25444 t.period = 250; 25445 t.slash = 278; 25446 t.zero = 500; 25447 t.one = 500; 25448 t.two = 500; 25449 t.three = 500; 25450 t.four = 500; 25451 t.five = 500; 25452 t.six = 500; 25453 t.seven = 500; 25454 t.eight = 500; 25455 t.nine = 500; 25456 t.colon = 333; 25457 t.semicolon = 333; 25458 t.less = 570; 25459 t.equal = 570; 25460 t.greater = 570; 25461 t.question = 500; 25462 t.at = 832; 25463 t.A = 667; 25464 t.B = 667; 25465 t.C = 667; 25466 t.D = 722; 25467 t.E = 667; 25468 t.F = 667; 25469 t.G = 722; 25470 t.H = 778; 25471 t.I = 389; 25472 t.J = 500; 25473 t.K = 667; 25474 t.L = 611; 25475 t.M = 889;
25476 t.N = 722; 25477 t.O = 722; 25478 t.P = 611; 25479 t.Q = 722; 25480 t.R = 667; 25481 t.S = 556; 25482 t.T = 611; 25483 t.U = 722; 25484 t.V = 667; 25485 t.W = 889; 25486 t.X = 667; 25487 t.Y = 611; 25488 t.Z = 611; 25489 t.bracketleft = 333; 25490 t.backslash = 278; 25491 t.bracketright = 333; 25492 t.asciicircum = 570; 25493 t.underscore = 500; 25494 t.quoteleft = 333; 25495 t.a = 500; 25496 t.b = 500; 25497 t.c = 444; 25498 t.d = 500; 25499 t.e = 444; 25500 t.f = 333; 25501 t.g = 500; 25502 t.h = 556; 25503 t.i = 278; 25504 t.j = 278; 25505 t.k = 500; 25506 t.l = 278; 25507 t.m = 778; 25508 t.n = 556; 25509 t.o = 500; 25510 t.p = 500; 25511 t.q = 500; 25512 t.r = 389; 25513 t.s = 389; 25514 t.t = 278; 25515 t.u = 556; 25516 t.v = 444; 25517 t.w = 667; 25518 t.x = 500; 25519 t.y = 444; 25520 t.z = 389; 25521 t.braceleft = 348; 25522 t.bar = 220; 25523 t.braceright = 348; 25524 t.asciitilde = 570; 25525 t.exclamdown = 389; 25526 t.cent = 500; 25527 t.sterling = 500; 25528 t.fraction = 167; 25529 t.yen = 500; 25530 t.florin = 500; 25531 t.section = 500; 25532 t.currency = 500; 25533 t.quotesingle = 278; 25534 t.quotedblleft = 500; 25535 t.guillemotleft = 500; 25536 t.guilsinglleft = 333; 25537 t.guilsinglright = 333; 25538 t.fi = 556; 25539 t.fl = 556; 25540 t.endash = 500; 25541 t.dagger = 500; 25542 t.daggerdbl = 500;
25543 t.periodcentered = 250; 25544 t.paragraph = 500; 25545 t.bullet = 350; 25546 t.quotesinglbase = 333; 25547 t.quotedblbase = 500; 25548 t.quotedblright = 500; 25549 t.guillemotright = 500; 25550 t.ellipsis = 1000; 25551 t.perthousand = 1000; 25552 t.questiondown = 500; 25553 t.grave = 333; 25554 t.acute = 333; 25555 t.circumflex = 333; 25556 t.tilde = 333; 25557 t.macron = 333; 25558 t.breve = 333; 25559 t.dotaccent = 333; 25560 t.dieresis = 333; 25561 t.ring = 333; 25562 t.cedilla = 333; 25563 t.hungarumlaut = 333; 25564 t.ogonek = 333; 25565 t.caron = 333; 25566 t.emdash = 1000; 25567 t.AE = 944; 25568 t.ordfeminine = 266; 25569 t.Lslash = 611; 25570 t.Oslash = 722; 25571 t.OE = 944; 25572 t.ordmasculine = 300; 25573 t.ae = 722; 25574 t.dotlessi = 278; 25575 t.lslash = 278; 25576 t.oslash = 500; 25577 t.oe = 722; 25578 t.germandbls = 500; 25579 t.Idieresis = 389; 25580 t.eacute = 444; 25581 t.abreve = 500; 25582 t.uhungarumlaut = 556; 25583 t.ecaron = 444; 25584 t.Ydieresis = 611; 25585 t.divide = 570; 25586 t.Yacute = 611; 25587 t.Acircumflex = 667; 25588 t.aacute = 500; 25589 t.Ucircumflex = 722; 25590 t.yacute = 444; 25591 t.scommaaccent = 389; 25592 t.ecircumflex = 444; 25593 t.Uring = 722; 25594 t.Udieresis = 722; 25595 t.aogonek = 500; 25596 t.Uacute = 722; 25597 t.uogonek = 556; 25598 t.Edieresis = 667; 25599 t.Dcroat = 722; 25600 t.commaaccent = 250; 25601 t.copyright = 747; 25602 t.Emacron = 667; 25603 t.ccaron = 444; 25604 t.aring = 500; 25605 t.Ncommaaccent = 722; 25606 t.lacute = 278; 25607 t.agrave = 500; 25608 t.Tcommaaccent = 611; 25609 t.Cacute = 667; 25610 t.atilde = 500; 25611 t.Edotaccent = 667; 25612 t.scaron = 389; 25613 t.scedilla = 389; 25614 t.iacute = 278; 25615 t.lozenge = 494; 25616 t.Rcaron = 667; 25617 t.Gcommaaccent = 722; 25618 t.ucircumflex = 556; 25619 t.acircumflex = 500; 25620 t.Amacron = 667; 25621 t.rcaron = 389; 25622 t.ccedilla = 444; 25623 t.Zdotaccent = 611; 25624 t.Thorn = 611; 25625 t.Omacron = 722; 25626 t.Racute = 667; 25627 t.Sacute = 556; 25628 t.dcaron = 608; 25629 t.Umacron = 722; 25630 t.uring = 556; 25631 t.threesuperior = 300; 25632 t.Ograve = 722; 25633 t.Agrave = 667; 25634 t.Abreve = 667; 25635 t.multiply = 570; 25636 t.uacute = 556; 25637 t.Tcaron = 611; 25638 t.partialdiff = 494; 25639 t.ydieresis = 444; 25640 t.Nacute = 722; 25641 t.icircumflex = 278; 25642 t.Ecircumflex = 667; 25643 t.adieresis = 500; 25644 t.edieresis = 444; 25645 t.cacute = 444; 25646 t.nacute = 556; 25647 t.umacron = 556; 25648 t.Ncaron = 722; 25649 t.Iacute = 389; 25650 t.plusminus = 570; 25651 t.brokenbar = 220; 25652 t.registered = 747; 25653 t.Gbreve = 722; 25654 t.Idotaccent = 389; 25655 t.summation = 600; 25656 t.Egrave = 667; 25657 t.racute = 389; 25658 t.omacron = 500; 25659 t.Zacute = 611; 25660 t.Zcaron = 611; 25661 t.greaterequal = 549; 25662 t.Eth = 722; 25663 t.Ccedilla = 667; 25664 t.lcommaaccent = 278; 25665 t.tcaron = 366; 25666 t.eogonek = 444; 25667 t.Uogonek = 722; 25668 t.Aacute = 667; 25669 t.Adieresis = 667; 25670 t.egrave = 444; 25671 t.zacute = 389; 25672 t.iogonek = 278; 25673 t.Oacute = 722; 25674 t.oacute = 500; 25675 t.amacron = 500; 25676 t.sacute = 389; 25677 t.idieresis = 278; 25678 t.Ocircumflex = 722; 25679 t.Ugrave = 722; 25680 t.Delta = 612; 25681 t.thorn = 500; 25682 t.twosuperior = 300; 25683 t.Odieresis = 722; 25684 t.mu = 576; 25685 t.igrave = 278; 25686 t.ohungarumlaut = 500; 25687 t.Eogonek = 667; 25688 t.dcroat = 500; 25689 t.threequarters = 750; 25690 t.Scedilla = 556; 25691 t.lcaron = 382; 25692 t.Kcommaaccent = 667; 25693 t.Lacute = 611; 25694 t.trademark = 1000; 25695 t.edotaccent = 444; 25696 t.Igrave = 389; 25697 t.Imacron = 389; 25698 t.Lcaron = 611; 25699 t.onehalf = 750; 25700 t.lessequal = 549; 25701 t.ocircumflex = 500; 25702 t.ntilde = 556; 25703 t.Uhungarumlaut = 722; 25704 t.Eacute = 667; 25705 t.emacron = 444; 25706 t.gbreve = 500; 25707 t.onequarter = 750; 25708 t.Scaron = 556; 25709 t.Scommaaccent = 556; 25710 t.Ohungarumlaut = 722; 25711 t.degree = 400; 25712 t.ograve = 500; 25713 t.Ccaron = 667; 25714 t.ugrave = 556; 25715 t.radical = 549; 25716 t.Dcaron = 722; 25717 t.rcommaaccent = 389;
25718 t.Ntilde = 722; 25719 t.otilde = 500; 25720 t.Rcommaaccent = 667; 25721 t.Lcommaaccent = 611; 25722 t.Atilde = 667; 25723 t.Aogonek = 667; 25724 t.Aring = 667; 25725 t.Otilde = 722; 25726 t.zdotaccent = 389; 25727 t.Ecaron = 667; 25728 t.Iogonek = 389; 25729 t.kcommaaccent = 500; 25730 t.minus = 606; 25731 t.Icircumflex = 389; 25732 t.ncaron = 556; 25733 t.tcommaaccent = 278; 25734 t.logicalnot = 606; 25735 t.odieresis = 500; 25736 t.udieresis = 556; 25737 t.notequal = 549; 25738 t.gcommaaccent = 500; 25739 t.eth = 500; 25740 t.zcaron = 389; 25741 t.ncommaaccent = 556; 25742 t.onesuperior = 300; 25743 t.imacron = 278; 25744 t.Euro = 500; 25745 }); 25746 t["Times-Italic"] = getLookupTableFactory(function (t) { 25747 t.space = 250; 25748 t.exclam = 333; 25749 t.quotedbl = 420; 25750 t.numbersign = 500; 25751 t.dollar = 500; 25752 t.percent = 833; 25753 t.ampersand = 778; 25754 t.quoteright = 333; 25755 t.parenleft = 333; 25756 t.parenright = 333; 25757 t.asterisk = 500; 25758 t.plus = 675; 25759 t.comma = 250; 25760 t.hyphen = 333; 25761 t.period = 250; 25762 t.slash = 278; 25763 t.zero = 500; 25764 t.one = 500; 25765 t.two = 500; 25766 t.three = 500; 25767 t.four = 500; 25768 t.five = 500; 25769 t.six = 500; 25770 t.seven = 500; 25771 t.eight = 500; 25772 t.nine = 500; 25773 t.colon = 333; 25774 t.semicolon = 333; 25775 t.less = 675; 25776 t.equal = 675; 25777 t.greater = 675; 25778 t.question = 500; 25779 t.at = 920; 25780 t.A = 611; 25781 t.B = 611; 25782 t.C = 667; 25783 t.D = 722; 25784 t.E = 611; 25785 t.F = 611; 25786 t.G = 722; 25787 t.H = 722; 25788 t.I = 333; 25789 t.J = 444; 25790 t.K = 667; 25791 t.L = 556; 25792 t.M = 833; 25793 t.N = 667; 25794 t.O = 722; 25795 t.P = 611; 25796 t.Q = 722; 25797 t.R = 611; 25798 t.S = 500; 25799 t.T = 556; 25800 t.U = 722; 25801 t.V = 611; 25802 t.W = 833; 25803 t.X = 611; 25804 t.Y = 556; 25805 t.Z = 556; 25806 t.bracketleft = 389; 25807 t.backslash = 278; 25808 t.bracketright = 389; 25809 t.asciicircum = 422; 25810 t.underscore = 500; 25811 t.quoteleft = 333; 25812 t.a = 500; 25813 t.b = 500; 25814 t.c = 444; 25815 t.d = 500; 25816 t.e = 444; 25817 t.f = 278; 25818 t.g = 500; 25819 t.h = 500; 25820 t.i = 278; 25821 t.j = 278; 25822 t.k = 444; 25823 t.l = 278; 25824 t.m = 722; 25825 t.n = 500; 25826 t.o = 500; 25827 t.p = 500; 25828 t.q = 500; 25829 t.r = 389; 25830 t.s = 389; 25831 t.t = 278; 25832 t.u = 500; 25833 t.v = 444; 25834 t.w = 667; 25835 t.x = 444; 25836 t.y = 444; 25837 t.z = 389; 25838 t.braceleft = 400; 25839 t.bar = 275; 25840 t.braceright = 400; 25841 t.asciitilde = 541; 25842 t.exclamdown = 389; 25843 t.cent = 500; 25844 t.sterling = 500; 25845 t.fraction = 167; 25846 t.yen = 500; 25847 t.florin = 500; 25848 t.section = 500; 25849 t.currency = 500; 25850 t.quotesingle = 214; 25851 t.quotedblleft = 556; 25852 t.guillemotleft = 500; 25853 t.guilsinglleft = 333; 25854 t.guilsinglright = 333; 25855 t.fi = 500; 25856 t.fl = 500; 25857 t.endash = 500; 25858 t.dagger = 500; 25859 t.daggerdbl = 500;
25860 t.periodcentered = 250; 25861 t.paragraph = 523; 25862 t.bullet = 350; 25863 t.quotesinglbase = 333; 25864 t.quotedblbase = 556; 25865 t.quotedblright = 556; 25866 t.guillemotright = 500; 25867 t.ellipsis = 889; 25868 t.perthousand = 1000; 25869 t.questiondown = 500; 25870 t.grave = 333; 25871 t.acute = 333; 25872 t.circumflex = 333; 25873 t.tilde = 333; 25874 t.macron = 333; 25875 t.breve = 333; 25876 t.dotaccent = 333; 25877 t.dieresis = 333; 25878 t.ring = 333; 25879 t.cedilla = 333; 25880 t.hungarumlaut = 333; 25881 t.ogonek = 333; 25882 t.caron = 333; 25883 t.emdash = 889; 25884 t.AE = 889; 25885 t.ordfeminine = 276; 25886 t.Lslash = 556; 25887 t.Oslash = 722; 25888 t.OE = 944; 25889 t.ordmasculine = 310; 25890 t.ae = 667; 25891 t.dotlessi = 278; 25892 t.lslash = 278; 25893 t.oslash = 500; 25894 t.oe = 667; 25895 t.germandbls = 500; 25896 t.Idieresis = 333; 25897 t.eacute = 444; 25898 t.abreve = 500; 25899 t.uhungarumlaut = 500; 25900 t.ecaron = 444; 25901 t.Ydieresis = 556; 25902 t.divide = 675; 25903 t.Yacute = 556; 25904 t.Acircumflex = 611; 25905 t.aacute = 500; 25906 t.Ucircumflex = 722; 25907 t.yacute = 444; 25908 t.scommaaccent = 389; 25909 t.ecircumflex = 444; 25910 t.Uring = 722; 25911 t.Udieresis = 722; 25912 t.aogonek = 500; 25913 t.Uacute = 722; 25914 t.uogonek = 500; 25915 t.Edieresis = 611; 25916 t.Dcroat = 722; 25917 t.commaaccent = 250; 25918 t.copyright = 760; 25919 t.Emacron = 611; 25920 t.ccaron = 444; 25921 t.aring = 500; 25922 t.Ncommaaccent = 667; 25923 t.lacute = 278; 25924 t.agrave = 500; 25925 t.Tcommaaccent = 556; 25926 t.Cacute = 667; 25927 t.atilde = 500; 25928 t.Edotaccent = 611; 25929 t.scaron = 389; 25930 t.scedilla = 389; 25931 t.iacute = 278; 25932 t.lozenge = 471; 25933 t.Rcaron = 611; 25934 t.Gcommaaccent = 722; 25935 t.ucircumflex = 500; 25936 t.acircumflex = 500; 25937 t.Amacron = 611; 25938 t.rcaron = 389; 25939 t.ccedilla = 444; 25940 t.Zdotaccent = 556; 25941 t.Thorn = 611; 25942 t.Omacron = 722; 25943 t.Racute = 611; 25944 t.Sacute = 500; 25945 t.dcaron = 544; 25946 t.Umacron = 722; 25947 t.uring = 500; 25948 t.threesuperior = 300; 25949 t.Ograve = 722; 25950 t.Agrave = 611; 25951 t.Abreve = 611; 25952 t.multiply = 675; 25953 t.uacute = 500; 25954 t.Tcaron = 556; 25955 t.partialdiff = 476; 25956 t.ydieresis = 444; 25957 t.Nacute = 667; 25958 t.icircumflex = 278; 25959 t.Ecircumflex = 611; 25960 t.adieresis = 500; 25961 t.edieresis = 444; 25962 t.cacute = 444; 25963 t.nacute = 500; 25964 t.umacron = 500; 25965 t.Ncaron = 667; 25966 t.Iacute = 333; 25967 t.plusminus = 675; 25968 t.brokenbar = 275; 25969 t.registered = 760; 25970 t.Gbreve = 722; 25971 t.Idotaccent = 333; 25972 t.summation = 600; 25973 t.Egrave = 611; 25974 t.racute = 389; 25975 t.omacron = 500; 25976 t.Zacute = 556; 25977 t.Zcaron = 556; 25978 t.greaterequal = 549; 25979 t.Eth = 722; 25980 t.Ccedilla = 667; 25981 t.lcommaaccent = 278; 25982 t.tcaron = 300; 25983 t.eogonek = 444; 25984 t.Uogonek = 722; 25985 t.Aacute = 611; 25986 t.Adieresis = 611; 25987 t.egrave = 444; 25988 t.zacute = 389; 25989 t.iogonek = 278; 25990 t.Oacute = 722; 25991 t.oacute = 500; 25992 t.amacron = 500; 25993 t.sacute = 389; 25994 t.idieresis = 278; 25995 t.Ocircumflex = 722; 25996 t.Ugrave = 722; 25997 t.Delta = 612; 25998 t.thorn = 500; 25999 t.twosuperior = 300; 26000 t.Odieresis = 722; 26001 t.mu = 500; 26002 t.igrave = 278; 26003 t.ohungarumlaut = 500; 26004 t.Eogonek = 611; 26005 t.dcroat = 500; 26006 t.threequarters = 750; 26007 t.Scedilla = 500; 26008 t.lcaron = 300; 26009 t.Kcommaaccent = 667; 26010 t.Lacute = 556; 26011 t.trademark = 980; 26012 t.edotaccent = 444; 26013 t.Igrave = 333; 26014 t.Imacron = 333; 26015 t.Lcaron = 611; 26016 t.onehalf = 750; 26017 t.lessequal = 549; 26018 t.ocircumflex = 500; 26019 t.ntilde = 500; 26020 t.Uhungarumlaut = 722; 26021 t.Eacute = 611; 26022 t.emacron = 444; 26023 t.gbreve = 500; 26024 t.onequarter = 750; 26025 t.Scaron = 500; 26026 t.Scommaaccent = 500; 26027 t.Ohungarumlaut = 722; 26028 t.degree = 400; 26029 t.ograve = 500; 26030 t.Ccaron = 667; 26031 t.ugrave = 500; 26032 t.radical = 453; 26033 t.Dcaron = 722; 26034 t.rcommaaccent = 389;
vendor: 27,180 bytes, lines 26035-27208
26035 t.Ntilde = 667; 26036 t.otilde = 500; 26037 t.Rcommaaccent = 611; 26038 t.Lcommaaccent = 556; 26039 t.Atilde = 611; 26040 t.Aogonek = 611; 26041 t.Aring = 611; 26042 t.Otilde = 722; 26043 t.zdotaccent = 389; 26044 t.Ecaron = 611; 26045 t.Iogonek = 333; 26046 t.kcommaaccent = 444; 26047 t.minus = 675; 26048 t.Icircumflex = 333; 26049 t.ncaron = 500; 26050 t.tcommaaccent = 278; 26051 t.logicalnot = 675; 26052 t.odieresis = 500; 26053 t.udieresis = 500; 26054 t.notequal = 549; 26055 t.gcommaaccent = 500; 26056 t.eth = 500; 26057 t.zcaron = 389; 26058 t.ncommaaccent = 500; 26059 t.onesuperior = 300; 26060 t.imacron = 278; 26061 t.Euro = 500; 26062 }); 26063 t.ZapfDingbats = getLookupTableFactory(function (t) { 26064 t.space = 278; 26065 t.a1 = 974; 26066 t.a2 = 961; 26067 t.a202 = 974; 26068 t.a3 = 980; 26069 t.a4 = 719; 26070 t.a5 = 789; 26071 t.a119 = 790; 26072 t.a118 = 791; 26073 t.a117 = 690; 26074 t.a11 = 960; 26075 t.a12 = 939; 26076 t.a13 = 549; 26077 t.a14 = 855; 26078 t.a15 = 911; 26079 t.a16 = 933; 26080 t.a105 = 911; 26081 t.a17 = 945; 26082 t.a18 = 974; 26083 t.a19 = 755; 26084 t.a20 = 846; 26085 t.a21 = 762; 26086 t.a22 = 761; 26087 t.a23 = 571; 26088 t.a24 = 677; 26089 t.a25 = 763; 26090 t.a26 = 760; 26091 t.a27 = 759; 26092 t.a28 = 754; 26093 t.a6 = 494; 26094 t.a7 = 552; 26095 t.a8 = 537; 26096 t.a9 = 577; 26097 t.a10 = 692; 26098 t.a29 = 786; 26099 t.a30 = 788; 26100 t.a31 = 788; 26101 t.a32 = 790; 26102 t.a33 = 793; 26103 t.a34 = 794; 26104 t.a35 = 816; 26105 t.a36 = 823; 26106 t.a37 = 789; 26107 t.a38 = 841; 26108 t.a39 = 823; 26109 t.a40 = 833; 26110 t.a41 = 816; 26111 t.a42 = 831; 26112 t.a43 = 923; 26113 t.a44 = 744; 26114 t.a45 = 723; 26115 t.a46 = 749; 26116 t.a47 = 790; 26117 t.a48 = 792; 26118 t.a49 = 695; 26119 t.a50 = 776; 26120 t.a51 = 768; 26121 t.a52 = 792; 26122 t.a53 = 759; 26123 t.a54 = 707; 26124 t.a55 = 708; 26125 t.a56 = 682; 26126 t.a57 = 701; 26127 t.a58 = 826; 26128 t.a59 = 815; 26129 t.a60 = 789; 26130 t.a61 = 789; 26131 t.a62 = 707; 26132 t.a63 = 687; 26133 t.a64 = 696; 26134 t.a65 = 689; 26135 t.a66 = 786; 26136 t.a67 = 787; 26137 t.a68 = 713; 26138 t.a69 = 791; 26139 t.a70 = 785; 26140 t.a71 = 791; 26141 t.a72 = 873; 26142 t.a73 = 761; 26143 t.a74 = 762; 26144 t.a203 = 762; 26145 t.a75 = 759; 26146 t.a204 = 759; 26147 t.a76 = 892; 26148 t.a77 = 892; 26149 t.a78 = 788; 26150 t.a79 = 784; 26151 t.a81 = 438; 26152 t.a82 = 138; 26153 t.a83 = 277; 26154 t.a84 = 415; 26155 t.a97 = 392; 26156 t.a98 = 392; 26157 t.a99 = 668; 26158 t.a100 = 668; 26159 t.a89 = 390; 26160 t.a90 = 390; 26161 t.a93 = 317; 26162 t.a94 = 317; 26163 t.a91 = 276; 26164 t.a92 = 276; 26165 t.a205 = 509; 26166 t.a85 = 509; 26167 t.a206 = 410; 26168 t.a86 = 410; 26169 t.a87 = 234; 26170 t.a88 = 234; 26171 t.a95 = 334; 26172 t.a96 = 334; 26173 t.a101 = 732; 26174 t.a102 = 544; 26175 t.a103 = 544; 26176 t.a104 = 910; 26177 t.a106 = 667; 26178 t.a107 = 760; 26179 t.a108 = 760; 26180 t.a112 = 776; 26181 t.a111 = 595; 26182 t.a110 = 694; 26183 t.a109 = 626; 26184 t.a120 = 788; 26185 t.a121 = 788; 26186 t.a122 = 788; 26187 t.a123 = 788; 26188 t.a124 = 788; 26189 t.a125 = 788; 26190 t.a126 = 788; 26191 t.a127 = 788; 26192 t.a128 = 788; 26193 t.a129 = 788; 26194 t.a130 = 788; 26195 t.a131 = 788; 26196 t.a132 = 788; 26197 t.a133 = 788; 26198 t.a134 = 788; 26199 t.a135 = 788; 26200 t.a136 = 788; 26201 t.a137 = 788; 26202 t.a138 = 788; 26203 t.a139 = 788; 26204 t.a140 = 788; 26205 t.a141 = 788; 26206 t.a142 = 788; 26207 t.a143 = 788; 26208 t.a144 = 788; 26209 t.a145 = 788; 26210 t.a146 = 788; 26211 t.a147 = 788; 26212 t.a148 = 788; 26213 t.a149 = 788; 26214 t.a150 = 788; 26215 t.a151 = 788; 26216 t.a152 = 788; 26217 t.a153 = 788; 26218 t.a154 = 788; 26219 t.a155 = 788; 26220 t.a156 = 788; 26221 t.a157 = 788; 26222 t.a158 = 788; 26223 t.a159 = 788; 26224 t.a160 = 894; 26225 t.a161 = 838; 26226 t.a163 = 1016; 26227 t.a164 = 458; 26228 t.a196 = 748; 26229 t.a165 = 924; 26230 t.a192 = 748; 26231 t.a166 = 918; 26232 t.a167 = 927; 26233 t.a168 = 928; 26234 t.a169 = 928; 26235 t.a170 = 834; 26236 t.a171 = 873; 26237 t.a172 = 828; 26238 t.a173 = 924; 26239 t.a162 = 924; 26240 t.a174 = 917; 26241 t.a175 = 930; 26242 t.a176 = 931; 26243 t.a177 = 463; 26244 t.a178 = 883; 26245 t.a179 = 836; 26246 t.a193 = 836; 26247 t.a180 = 867; 26248 t.a199 = 867; 26249 t.a181 = 696; 26250 t.a200 = 696; 26251 t.a182 = 874; 26252 t.a201 = 874; 26253 t.a183 = 760; 26254 t.a184 = 946; 26255 t.a197 = 771; 26256 t.a185 = 865; 26257 t.a194 = 771; 26258 t.a198 = 888; 26259 t.a186 = 967; 26260 t.a195 = 888; 26261 t.a187 = 831; 26262 t.a188 = 873; 26263 t.a189 = 927; 26264 t.a190 = 970; 26265 t.a191 = 918; 26266 }); 26267}); 26268const getFontBasicMetrics = getLookupTableFactory(function (t) { 26269 t.Courier = { 26270 ascent: 629, 26271 descent: -157, 26272 capHeight: 562, 26273 xHeight: -426 26274 }; 26275 t["Courier-Bold"] = { 26276 ascent: 629, 26277 descent: -157, 26278 capHeight: 562, 26279 xHeight: 439 26280 }; 26281 t["Courier-Oblique"] = { 26282 ascent: 629, 26283 descent: -157, 26284 capHeight: 562, 26285 xHeight: 426 26286 }; 26287 t["Courier-BoldOblique"] = { 26288 ascent: 629, 26289 descent: -157, 26290 capHeight: 562, 26291 xHeight: 426 26292 }; 26293 t.Helvetica = { 26294 ascent: 718, 26295 descent: -207, 26296 capHeight: 718, 26297 xHeight: 523 26298 }; 26299 t["Helvetica-Bold"] = { 26300 ascent: 718, 26301 descent: -207, 26302 capHeight: 718, 26303 xHeight: 532 26304 }; 26305 t["Helvetica-Oblique"] = { 26306 ascent: 718, 26307 descent: -207, 26308 capHeight: 718, 26309 xHeight: 523 26310 }; 26311 t["Helvetica-BoldOblique"] = { 26312 ascent: 718, 26313 descent: -207, 26314 capHeight: 718, 26315 xHeight: 532 26316 }; 26317 t["Times-Roman"] = { 26318 ascent: 683, 26319 descent: -217, 26320 capHeight: 662, 26321 xHeight: 450 26322 }; 26323 t["Times-Bold"] = { 26324 ascent: 683, 26325 descent: -217, 26326 capHeight: 676, 26327 xHeight: 461 26328 }; 26329 t["Times-Italic"] = { 26330 ascent: 683, 26331 descent: -217, 26332 capHeight: 653, 26333 xHeight: 441 26334 }; 26335 t["Times-BoldItalic"] = { 26336 ascent: 683, 26337 descent: -217, 26338 capHeight: 669, 26339 xHeight: 462 26340 }; 26341 t.Symbol = { 26342 ascent: Math.NaN, 26343 descent: Math.NaN, 26344 capHeight: Math.NaN, 26345 xHeight: Math.NaN 26346 }; 26347 t.ZapfDingbats = { 26348 ascent: Math.NaN, 26349 descent: Math.NaN, 26350 capHeight: Math.NaN, 26351 xHeight: Math.NaN 26352 }; 26353}); 26354 26355;// ./src/core/glyf.js 26356 26357 26358 26359 26360 26361 26362 26363 26364 26365 26366const ON_CURVE_POINT = 1 << 0; 26367const X_SHORT_VECTOR = 1 << 1; 26368const Y_SHORT_VECTOR = 1 << 2; 26369const REPEAT_FLAG = 1 << 3; 26370const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4; 26371const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5; 26372const OVERLAP_SIMPLE = 1 << 6; 26373const ARG_1_AND_2_ARE_WORDS = 1 << 0; 26374const ARGS_ARE_XY_VALUES = 1 << 1; 26375const WE_HAVE_A_SCALE = 1 << 3; 26376const MORE_COMPONENTS = 1 << 5; 26377const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; 26378const WE_HAVE_A_TWO_BY_TWO = 1 << 7; 26379const WE_HAVE_INSTRUCTIONS = 1 << 8; 26380class GlyfTable { 26381 constructor({ 26382 glyfTable, 26383 isGlyphLocationsLong, 26384 locaTable, 26385 numGlyphs 26386 }) { 26387 this.glyphs = []; 26388 const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); 26389 const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); 26390 const offsetSize = isGlyphLocationsLong ? 4 : 2; 26391 let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); 26392 let pos = 0; 26393 for (let i = 0; i < numGlyphs; i++) { 26394 pos += offsetSize; 26395 const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); 26396 if (next === prev) { 26397 this.glyphs.push(new Glyph({})); 26398 continue; 26399 } 26400 const glyph = Glyph.parse(prev, glyf); 26401 this.glyphs.push(glyph); 26402 prev = next; 26403 } 26404 } 26405 getSize() { 26406 return this.glyphs.reduce((a, g) => { 26407 const size = g.getSize(); 26408 return a + (size + 3 & ~3); 26409 }, 0); 26410 } 26411 write() { 26412 const totalSize = this.getSize(); 26413 const glyfTable = new DataView(new ArrayBuffer(totalSize)); 26414 const isLocationLong = totalSize > 0x1fffe; 26415 const offsetSize = isLocationLong ? 4 : 2; 26416 const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); 26417 if (isLocationLong) { 26418 locaTable.setUint32(0, 0); 26419 } else { 26420 locaTable.setUint16(0, 0); 26421 } 26422 let pos = 0; 26423 let locaIndex = 0; 26424 for (const glyph of this.glyphs) { 26425 pos += glyph.write(pos, glyfTable); 26426 pos = pos + 3 & ~3; 26427 locaIndex += offsetSize; 26428 if (isLocationLong) { 26429 locaTable.setUint32(locaIndex, pos); 26430 } else { 26431 locaTable.setUint16(locaIndex, pos >> 1); 26432 } 26433 } 26434 return { 26435 isLocationLong, 26436 loca: new Uint8Array(locaTable.buffer), 26437 glyf: new Uint8Array(glyfTable.buffer) 26438 }; 26439 } 26440 scale(factors) { 26441 for (let i = 0, ii = this.glyphs.length; i < ii; i++) { 26442 this.glyphs[i].scale(factors[i]); 26443 } 26444 } 26445} 26446class Glyph { 26447 constructor({ 26448 header = null, 26449 simple = null, 26450 composites = null 26451 }) { 26452 this.header = header; 26453 this.simple = simple; 26454 this.composites = composites; 26455 } 26456 static parse(pos, glyf) { 26457 const [read, header] = GlyphHeader.parse(pos, glyf); 26458 pos += read; 26459 if (header.numberOfContours < 0) { 26460 const composites = []; 26461 while (true) { 26462 const [n, composite] = CompositeGlyph.parse(pos, glyf); 26463 pos += n; 26464 composites.push(composite); 26465 if (!(composite.flags & MORE_COMPONENTS)) { 26466 break; 26467 } 26468 } 26469 return new Glyph({ 26470 header, 26471 composites 26472 }); 26473 } 26474 const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); 26475 return new Glyph({ 26476 header, 26477 simple 26478 }); 26479 } 26480 getSize() { 26481 if (!this.header) { 26482 return 0; 26483 } 26484 const size = this.simple ? this.simple.getSize() : this.composites.reduce((a, c) => a + c.getSize(), 0); 26485 return this.header.getSize() + size; 26486 } 26487 write(pos, buf) { 26488 if (!this.header) { 26489 return 0; 26490 } 26491 const spos = pos; 26492 pos += this.header.write(pos, buf); 26493 if (this.simple) { 26494 pos += this.simple.write(pos, buf); 26495 } else { 26496 for (const composite of this.composites) { 26497 pos += composite.write(pos, buf); 26498 } 26499 } 26500 return pos - spos; 26501 } 26502 scale(factor) { 26503 if (!this.header) { 26504 return; 26505 } 26506 const xMiddle = (this.header.xMin + this.header.xMax) / 2; 26507 this.header.scale(xMiddle, factor); 26508 if (this.simple) { 26509 this.simple.scale(xMiddle, factor); 26510 } else { 26511 for (const composite of this.composites) { 26512 composite.scale(xMiddle, factor); 26513 } 26514 } 26515 } 26516} 26517class GlyphHeader { 26518 constructor({ 26519 numberOfContours, 26520 xMin, 26521 yMin, 26522 xMax, 26523 yMax 26524 }) { 26525 this.numberOfContours = numberOfContours; 26526 this.xMin = xMin; 26527 this.yMin = yMin; 26528 this.xMax = xMax; 26529 this.yMax = yMax; 26530 } 26531 static parse(pos, glyf) { 26532 return [10, new GlyphHeader({ 26533 numberOfContours: glyf.getInt16(pos), 26534 xMin: glyf.getInt16(pos + 2), 26535 yMin: glyf.getInt16(pos + 4), 26536 xMax: glyf.getInt16(pos + 6), 26537 yMax: glyf.getInt16(pos + 8) 26538 })]; 26539 } 26540 getSize() { 26541 return 10; 26542 } 26543 write(pos, buf) { 26544 buf.setInt16(pos, this.numberOfContours); 26545 buf.setInt16(pos + 2, this.xMin); 26546 buf.setInt16(pos + 4, this.yMin); 26547 buf.setInt16(pos + 6, this.xMax); 26548 buf.setInt16(pos + 8, this.yMax); 26549 return 10; 26550 } 26551 scale(x, factor) { 26552 this.xMin = Math.round(x + (this.xMin - x) * factor); 26553 this.xMax = Math.round(x + (this.xMax - x) * factor); 26554 } 26555} 26556class Contour { 26557 constructor({ 26558 flags, 26559 xCoordinates, 26560 yCoordinates 26561 }) { 26562 this.xCoordinates = xCoordinates; 26563 this.yCoordinates = yCoordinates; 26564 this.flags = flags; 26565 } 26566} 26567class SimpleGlyph { 26568 constructor({ 26569 contours, 26570 instructions 26571 }) { 26572 this.contours = contours; 26573 this.instructions = instructions; 26574 } 26575 static parse(pos, glyf, numberOfContours) { 26576 const endPtsOfContours = []; 26577 for (let i = 0; i < numberOfContours; i++) { 26578 const endPt = glyf.getUint16(pos); 26579 pos += 2; 26580 endPtsOfContours.push(endPt); 26581 } 26582 const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1; 26583 const instructionLength = glyf.getUint16(pos); 26584 pos += 2; 26585 const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); 26586 pos += instructionLength; 26587 const flags = []; 26588 for (let i = 0; i < numberOfPt; pos++, i++) { 26589 let flag = glyf.getUint8(pos); 26590 flags.push(flag); 26591 if (flag & REPEAT_FLAG) { 26592 const count = glyf.getUint8(++pos); 26593 flag ^= REPEAT_FLAG; 26594 for (let m = 0; m < count; m++) { 26595 flags.push(flag); 26596 } 26597 i += count; 26598 } 26599 } 26600 const allXCoordinates = []; 26601 let xCoordinates = []; 26602 let yCoordinates = []; 26603 let pointFlags = []; 26604 const contours = []; 26605 let endPtsOfContoursIndex = 0; 26606 let lastCoordinate = 0; 26607 for (let i = 0; i < numberOfPt; i++) { 26608 const flag = flags[i]; 26609 if (flag & X_SHORT_VECTOR) { 26610 const x = glyf.getUint8(pos++); 26611 lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; 26612 xCoordinates.push(lastCoordinate); 26613 } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { 26614 xCoordinates.push(lastCoordinate); 26615 } else { 26616 lastCoordinate += glyf.getInt16(pos); 26617 pos += 2; 26618 xCoordinates.push(lastCoordinate); 26619 } 26620 if (endPtsOfContours[endPtsOfContoursIndex] === i) { 26621 endPtsOfContoursIndex++; 26622 allXCoordinates.push(xCoordinates); 26623 xCoordinates = []; 26624 } 26625 } 26626 lastCoordinate = 0; 26627 endPtsOfContoursIndex = 0; 26628 for (let i = 0; i < numberOfPt; i++) { 26629 const flag = flags[i]; 26630 if (flag & Y_SHORT_VECTOR) { 26631 const y = glyf.getUint8(pos++); 26632 lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y; 26633 yCoordinates.push(lastCoordinate); 26634 } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) { 26635 yCoordinates.push(lastCoordinate); 26636 } else { 26637 lastCoordinate += glyf.getInt16(pos); 26638 pos += 2; 26639 yCoordinates.push(lastCoordinate); 26640 } 26641 pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); 26642 if (endPtsOfContours[endPtsOfContoursIndex] === i) { 26643 xCoordinates = allXCoordinates[endPtsOfContoursIndex]; 26644 endPtsOfContoursIndex++; 26645 contours.push(new Contour({ 26646 flags: pointFlags, 26647 xCoordinates, 26648 yCoordinates 26649 })); 26650 yCoordinates = []; 26651 pointFlags = []; 26652 } 26653 } 26654 return new SimpleGlyph({ 26655 contours, 26656 instructions 26657 }); 26658 } 26659 getSize() { 26660 let size = this.contours.length * 2 + 2 + this.instructions.length; 26661 let lastX = 0; 26662 let lastY = 0; 26663 for (const contour of this.contours) { 26664 size += contour.flags.length; 26665 for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { 26666 const x = contour.xCoordinates[i]; 26667 const y = contour.yCoordinates[i]; 26668 let abs = Math.abs(x - lastX); 26669 if (abs > 255) { 26670 size += 2; 26671 } else if (abs > 0) { 26672 size += 1; 26673 } 26674 lastX = x; 26675 abs = Math.abs(y - lastY); 26676 if (abs > 255) { 26677 size += 2; 26678 } else if (abs > 0) { 26679 size += 1; 26680 } 26681 lastY = y; 26682 } 26683 } 26684 return size; 26685 } 26686 write(pos, buf) { 26687 const spos = pos; 26688 const xCoordinates = []; 26689 const yCoordinates = []; 26690 const flags = []; 26691 let lastX = 0; 26692 let lastY = 0; 26693 for (const contour of this.contours) { 26694 for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { 26695 let flag = contour.flags[i]; 26696 const x = contour.xCoordinates[i]; 26697 let delta = x - lastX; 26698 if (delta === 0) { 26699 flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; 26700 xCoordinates.push(0); 26701 } else { 26702 const abs = Math.abs(delta); 26703 if (abs <= 255) { 26704 flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR; 26705 xCoordinates.push(abs); 26706 } else { 26707 xCoordinates.push(delta); 26708 } 26709 } 26710 lastX = x; 26711 const y = contour.yCoordinates[i]; 26712 delta = y - lastY; 26713 if (delta === 0) { 26714 flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; 26715 yCoordinates.push(0); 26716 } else { 26717 const abs = Math.abs(delta); 26718 if (abs <= 255) { 26719 flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR; 26720 yCoordinates.push(abs); 26721 } else { 26722 yCoordinates.push(delta); 26723 } 26724 } 26725 lastY = y; 26726 flags.push(flag); 26727 } 26728 buf.setUint16(pos, xCoordinates.length - 1); 26729 pos += 2; 26730 } 26731 buf.setUint16(pos, this.instructions.length); 26732 pos += 2; 26733 if (this.instructions.length) { 26734 new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); 26735 pos += this.instructions.length; 26736 } 26737 for (const flag of flags) { 26738 buf.setUint8(pos++, flag); 26739 } 26740 for (let i = 0, ii = xCoordinates.length; i < ii; i++) { 26741 const x = xCoordinates[i]; 26742 const flag = flags[i]; 26743 if (flag & X_SHORT_VECTOR) { 26744 buf.setUint8(pos++, x); 26745 } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { 26746 buf.setInt16(pos, x); 26747 pos += 2; 26748 } 26749 } 26750 for (let i = 0, ii = yCoordinates.length; i < ii; i++) { 26751 const y = yCoordinates[i]; 26752 const flag = flags[i]; 26753 if (flag & Y_SHORT_VECTOR) { 26754 buf.setUint8(pos++, y); 26755 } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { 26756 buf.setInt16(pos, y); 26757 pos += 2; 26758 } 26759 } 26760 return pos - spos; 26761 } 26762 scale(x, factor) { 26763 for (const contour of this.contours) { 26764 if (contour.xCoordinates.length === 0) { 26765 continue; 26766 } 26767 for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { 26768 contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); 26769 } 26770 } 26771 } 26772} 26773class CompositeGlyph { 26774 constructor({ 26775 flags, 26776 glyphIndex, 26777 argument1, 26778 argument2, 26779 transf, 26780 instructions 26781 }) { 26782 this.flags = flags; 26783 this.glyphIndex = glyphIndex; 26784 this.argument1 = argument1; 26785 this.argument2 = argument2; 26786 this.transf = transf; 26787 this.instructions = instructions; 26788 } 26789 static parse(pos, glyf) { 26790 const spos = pos; 26791 const transf = []; 26792 let flags = glyf.getUint16(pos); 26793 const glyphIndex = glyf.getUint16(pos + 2); 26794 pos += 4; 26795 let argument1, argument2; 26796 if (flags & ARG_1_AND_2_ARE_WORDS) { 26797 if (flags & ARGS_ARE_XY_VALUES) { 26798 argument1 = glyf.getInt16(pos); 26799 argument2 = glyf.getInt16(pos + 2); 26800 } else { 26801 argument1 = glyf.getUint16(pos); 26802 argument2 = glyf.getUint16(pos + 2); 26803 } 26804 pos += 4; 26805 flags ^= ARG_1_AND_2_ARE_WORDS; 26806 } else { 26807 if (flags & ARGS_ARE_XY_VALUES) { 26808 argument1 = glyf.getInt8(pos); 26809 argument2 = glyf.getInt8(pos + 1); 26810 } else { 26811 argument1 = glyf.getUint8(pos); 26812 argument2 = glyf.getUint8(pos + 1); 26813 } 26814 pos += 2; 26815 } 26816 if (flags & WE_HAVE_A_SCALE) { 26817 transf.push(glyf.getUint16(pos)); 26818 pos += 2; 26819 } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { 26820 transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); 26821 pos += 4; 26822 } else if (flags & WE_HAVE_A_TWO_BY_TWO) { 26823 transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); 26824 pos += 8; 26825 } 26826 let instructions = null; 26827 if (flags & WE_HAVE_INSTRUCTIONS) { 26828 const instructionLength = glyf.getUint16(pos); 26829 pos += 2; 26830 instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); 26831 pos += instructionLength; 26832 } 26833 return [pos - spos, new CompositeGlyph({ 26834 flags, 26835 glyphIndex, 26836 argument1, 26837 argument2, 26838 transf, 26839 instructions 26840 })]; 26841 } 26842 getSize() { 26843 let size = 2 + 2 + this.transf.length * 2; 26844 if (this.flags & WE_HAVE_INSTRUCTIONS) { 26845 size += 2 + this.instructions.length; 26846 } 26847 size += 2; 26848 if (this.flags & 2) { 26849 if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { 26850 size += 2; 26851 } 26852 } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { 26853 size += 2; 26854 } 26855 return size; 26856 } 26857 write(pos, buf) { 26858 const spos = pos; 26859 if (this.flags & ARGS_ARE_XY_VALUES) { 26860 if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { 26861 this.flags |= ARG_1_AND_2_ARE_WORDS; 26862 } 26863 } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { 26864 this.flags |= ARG_1_AND_2_ARE_WORDS; 26865 } 26866 buf.setUint16(pos, this.flags); 26867 buf.setUint16(pos + 2, this.glyphIndex); 26868 pos += 4; 26869 if (this.flags & ARG_1_AND_2_ARE_WORDS) { 26870 if (this.flags & ARGS_ARE_XY_VALUES) { 26871 buf.setInt16(pos, this.argument1); 26872 buf.setInt16(pos + 2, this.argument2); 26873 } else { 26874 buf.setUint16(pos, this.argument1); 26875 buf.setUint16(pos + 2, this.argument2); 26876 } 26877 pos += 4; 26878 } else { 26879 buf.setUint8(pos, this.argument1); 26880 buf.setUint8(pos + 1, this.argument2); 26881 pos += 2; 26882 } 26883 if (this.flags & WE_HAVE_INSTRUCTIONS) { 26884 buf.setUint16(pos, this.instructions.length); 26885 pos += 2; 26886 if (this.instructions.length) { 26887 new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); 26888 pos += this.instructions.length; 26889 } 26890 } 26891 return pos - spos; 26892 } 26893 scale(x, factor) {} 26894} 26895 26896;// ./src/core/opentype_file_builder.js 26897 26898 26899 26900 26901 26902 26903 26904 26905 26906function writeInt16(dest, offset, num) { 26907 dest[offset] = num >> 8 & 0xff; 26908 dest[offset + 1] = num & 0xff; 26909} 26910function writeInt32(dest, offset, num) { 26911 dest[offset] = num >> 24 & 0xff; 26912 dest[offset + 1] = num >> 16 & 0xff; 26913 dest[offset + 2] = num >> 8 & 0xff; 26914 dest[offset + 3] = num & 0xff; 26915} 26916function writeData(dest, offset, data) { 26917 if (data instanceof Uint8Array) { 26918 dest.set(data, offset); 26919 } else if (typeof data === "string") { 26920 for (let i = 0, ii = data.length; i < ii; i++) { 26921 dest[offset++] = data.charCodeAt(i) & 0xff; 26922 } 26923 } else { 26924 for (const num of data) { 26925 dest[offset++] = num & 0xff; 26926 } 26927 } 26928} 26929const OTF_HEADER_SIZE = 12; 26930const OTF_TABLE_ENTRY_SIZE = 16; 26931class OpenTypeFileBuilder { 26932 constructor(sfnt) { 26933 this.sfnt = sfnt; 26934 this.tables = Object.create(null); 26935 } 26936 static getSearchParams(entriesCount, entrySize) { 26937 let maxPower2 = 1, 26938 log2 = 0; 26939 while ((maxPower2 ^ entriesCount) > maxPower2) { 26940 maxPower2 <<= 1; 26941 log2++; 26942 } 26943 const searchRange = maxPower2 * entrySize; 26944 return { 26945 range: searchRange, 26946 entry: log2, 26947 rangeShift: entrySize * entriesCount - searchRange 26948 }; 26949 } 26950 toArray() { 26951 let sfnt = this.sfnt; 26952 const tables = this.tables; 26953 const tablesNames = Object.keys(tables); 26954 tablesNames.sort(); 26955 const numTables = tablesNames.length; 26956 let i, j, jj, table, tableName; 26957 let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; 26958 const tableOffsets = [offset]; 26959 for (i = 0; i < numTables; i++) { 26960 table = tables[tablesNames[i]]; 26961 const paddedLength = (table.length + 3 & ~3) >>> 0; 26962 offset += paddedLength; 26963 tableOffsets.push(offset); 26964 } 26965 const file = new Uint8Array(offset); 26966 for (i = 0; i < numTables; i++) { 26967 table = tables[tablesNames[i]]; 26968 writeData(file, tableOffsets[i], table); 26969 } 26970 if (sfnt === "true") { 26971 sfnt = string32(0x00010000); 26972 } 26973 file[0] = sfnt.charCodeAt(0) & 0xff; 26974 file[1] = sfnt.charCodeAt(1) & 0xff; 26975 file[2] = sfnt.charCodeAt(2) & 0xff; 26976 file[3] = sfnt.charCodeAt(3) & 0xff; 26977 writeInt16(file, 4, numTables); 26978 const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); 26979 writeInt16(file, 6, searchParams.range); 26980 writeInt16(file, 8, searchParams.entry); 26981 writeInt16(file, 10, searchParams.rangeShift); 26982 offset = OTF_HEADER_SIZE; 26983 for (i = 0; i < numTables; i++) { 26984 tableName = tablesNames[i]; 26985 file[offset] = tableName.charCodeAt(0) & 0xff; 26986 file[offset + 1] = tableName.charCodeAt(1) & 0xff; 26987 file[offset + 2] = tableName.charCodeAt(2) & 0xff; 26988 file[offset + 3] = tableName.charCodeAt(3) & 0xff; 26989 let checksum = 0; 26990 for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { 26991 const quad = readUint32(file, j); 26992 checksum = checksum + quad >>> 0; 26993 } 26994 writeInt32(file, offset + 4, checksum); 26995 writeInt32(file, offset + 8, tableOffsets[i]); 26996 writeInt32(file, offset + 12, tables[tableName].length); 26997 offset += OTF_TABLE_ENTRY_SIZE; 26998 } 26999 return file; 27000 } 27001 addTable(tag, data) { 27002 if (tag in this.tables) { 27003 throw new Error("Table " + tag + " already exists"); 27004 } 27005 this.tables[tag] = data; 27006 } 27007} 27008 27009;// ./src/core/type1_parser.js 27010 27011 27012 27013 27014 27015 27016 27017 27018 27019 27020 27021const HINTING_ENABLED = false; 27022const COMMAND_MAP = { 27023 hstem: [1], 27024 vstem: [3], 27025 vmoveto: [4], 27026 rlineto: [5], 27027 hlineto: [6], 27028 vlineto: [7], 27029 rrcurveto: [8], 27030 callsubr: [10], 27031 flex: [12, 35], 27032 drop: [12, 18], 27033 endchar: [14], 27034 rmoveto: [21], 27035 hmoveto: [22], 27036 vhcurveto: [30], 27037 hvcurveto: [31] 27038}; 27039class Type1CharString { 27040 constructor() { 27041 this.width = 0; 27042 this.lsb = 0; 27043 this.flexing = false; 27044 this.output = []; 27045 this.stack = []; 27046 } 27047 convert(encoded, subrs, seacAnalysisEnabled) { 27048 const count = encoded.length; 27049 let error = false; 27050 let wx, sbx, subrNumber; 27051 for (let i = 0; i < count; i++) { 27052 let value = encoded[i]; 27053 if (value < 32) { 27054 if (value === 12) { 27055 value = (value << 8) + encoded[++i]; 27056 } 27057 switch (value) { 27058 case 1: 27059 if (!HINTING_ENABLED) { 27060 this.stack = []; 27061 break; 27062 } 27063 error = this.executeCommand(2, COMMAND_MAP.hstem); 27064 break; 27065 case 3: 27066 if (!HINTING_ENABLED) { 27067 this.stack = []; 27068 break; 27069 } 27070 error = this.executeCommand(2, COMMAND_MAP.vstem); 27071 break; 27072 case 4: 27073 if (this.flexing) { 27074 if (this.stack.length < 1) { 27075 error = true; 27076 break; 27077 } 27078 const dy = this.stack.pop(); 27079 this.stack.push(0, dy); 27080 break; 27081 } 27082 error = this.executeCommand(1, COMMAND_MAP.vmoveto); 27083 break; 27084 case 5: 27085 error = this.executeCommand(2, COMMAND_MAP.rlineto); 27086 break; 27087 case 6: 27088 error = this.executeCommand(1, COMMAND_MAP.hlineto); 27089 break; 27090 case 7: 27091 error = this.executeCommand(1, COMMAND_MAP.vlineto); 27092 break; 27093 case 8: 27094 error = this.executeCommand(6, COMMAND_MAP.rrcurveto); 27095 break; 27096 case 9: 27097 this.stack = []; 27098 break; 27099 case 10: 27100 if (this.stack.length < 1) { 27101 error = true; 27102 break; 27103 } 27104 subrNumber = this.stack.pop(); 27105 if (!subrs[subrNumber]) { 27106 error = true; 27107 break; 27108 } 27109 error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); 27110 break; 27111 case 11: 27112 return error; 27113 case 13: 27114 if (this.stack.length < 2) { 27115 error = true; 27116 break; 27117 } 27118 wx = this.stack.pop(); 27119 sbx = this.stack.pop(); 27120 this.lsb = sbx; 27121 this.width = wx; 27122 this.stack.push(wx, sbx); 27123 error = this.executeCommand(2, COMMAND_MAP.hmoveto); 27124 break; 27125 case 14: 27126 this.output.push(COMMAND_MAP.endchar[0]); 27127 break; 27128 case 21: 27129 if (this.flexing) { 27130 break; 27131 } 27132 error = this.executeCommand(2, COMMAND_MAP.rmoveto); 27133 break; 27134 case 22: 27135 if (this.flexing) { 27136 this.stack.push(0); 27137 break; 27138 } 27139 error = this.executeCommand(1, COMMAND_MAP.hmoveto); 27140 break; 27141 case 30: 27142 error = this.executeCommand(4, COMMAND_MAP.vhcurveto); 27143 break; 27144 case 31: 27145 error = this.executeCommand(4, COMMAND_MAP.hvcurveto); 27146 break; 27147 case (12 << 8) + 0: 27148 this.stack = []; 27149 break; 27150 case (12 << 8) + 1: 27151 if (!HINTING_ENABLED) { 27152 this.stack = []; 27153 break; 27154 } 27155 error = this.executeCommand(2, COMMAND_MAP.vstem); 27156 break; 27157 case (12 << 8) + 2: 27158 if (!HINTING_ENABLED) { 27159 this.stack = []; 27160 break; 27161 } 27162 error = this.executeCommand(2, COMMAND_MAP.hstem); 27163 break; 27164 case (12 << 8) + 6: 27165 if (seacAnalysisEnabled) { 27166 const asb = this.stack.at(-5); 27167 this.seac = this.stack.splice(-4, 4); 27168 this.seac[0] += this.lsb - asb; 27169 error = this.executeCommand(0, COMMAND_MAP.endchar); 27170 } else { 27171 error = this.executeCommand(4, COMMAND_MAP.endchar); 27172 } 27173 break; 27174 case (12 << 8) + 7: 27175 if (this.stack.length < 4) { 27176 error = true; 27177 break; 27178 } 27179 this.stack.pop(); 27180 wx = this.stack.pop(); 27181 const sby = this.stack.pop(); 27182 sbx = this.stack.pop(); 27183 this.lsb = sbx; 27184 this.width = wx; 27185 this.stack.push(wx, sbx, sby); 27186 error = this.executeCommand(3, COMMAND_MAP.rmoveto); 27187 break; 27188 case (12 << 8) + 12: 27189 if (this.stack.length < 2) { 27190 error = true; 27191 break; 27192 } 27193 const num2 = this.stack.pop(); 27194 const num1 = this.stack.pop(); 27195 this.stack.push(num1 / num2); 27196 break; 27197 case (12 << 8) + 16: 27198 if (this.stack.length < 2) { 27199 error = true; 27200 break; 27201 } 27202 subrNumber = this.stack.pop(); 27203 const numArgs = this.stack.pop(); 27204 if (subrNumber === 0 && numArgs === 3) { 27205 const flexArgs = this.stack.splice(-17, 17); 27206 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]); 27207 error = this.executeCommand(13, COMMAND_MAP.flex, true); 27208 this.flexing = false;
vendor: 4,258 bytes, lines 27209-27362
27209 this.stack.push(flexArgs[15], flexArgs[16]); 27210 } else if (subrNumber === 1 && numArgs === 0) { 27211 this.flexing = true; 27212 } 27213 break; 27214 case (12 << 8) + 17: 27215 break; 27216 case (12 << 8) + 33: 27217 this.stack = []; 27218 break; 27219 default: 27220 warn('Unknown type 1 charstring command of "' + value + '"'); 27221 break; 27222 } 27223 if (error) { 27224 break; 27225 } 27226 continue; 27227 } else if (value <= 246) { 27228 value -= 139; 27229 } else if (value <= 250) { 27230 value = (value - 247) * 256 + encoded[++i] + 108; 27231 } else if (value <= 254) { 27232 value = -((value - 251) * 256) - encoded[++i] - 108; 27233 } else { 27234 value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; 27235 } 27236 this.stack.push(value); 27237 } 27238 return error; 27239 } 27240 executeCommand(howManyArgs, command, keepStack) { 27241 const stackLength = this.stack.length; 27242 if (howManyArgs > stackLength) { 27243 return true; 27244 } 27245 const start = stackLength - howManyArgs; 27246 for (let i = start; i < stackLength; i++) { 27247 let value = this.stack[i]; 27248 if (Number.isInteger(value)) { 27249 this.output.push(28, value >> 8 & 0xff, value & 0xff); 27250 } else { 27251 value = 65536 * value | 0; 27252 this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); 27253 } 27254 } 27255 this.output.push(...command); 27256 if (keepStack) { 27257 this.stack.splice(start, howManyArgs); 27258 } else { 27259 this.stack.length = 0; 27260 } 27261 return false; 27262 } 27263} 27264const EEXEC_ENCRYPT_KEY = 55665; 27265const CHAR_STRS_ENCRYPT_KEY = 4330; 27266function isHexDigit(code) { 27267 return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102; 27268} 27269function decrypt(data, key, discardNumber) { 27270 if (discardNumber >= data.length) { 27271 return new Uint8Array(0); 27272 } 27273 const c1 = 52845, 27274 c2 = 22719; 27275 let r = key | 0, 27276 i, 27277 j; 27278 for (i = 0; i < discardNumber; i++) { 27279 r = (data[i] + r) * c1 + c2 & (1 << 16) - 1; 27280 } 27281 const count = data.length - discardNumber; 27282 const decrypted = new Uint8Array(count); 27283 for (i = discardNumber, j = 0; j < count; i++, j++) { 27284 const value = data[i]; 27285 decrypted[j] = value ^ r >> 8; 27286 r = (value + r) * c1 + c2 & (1 << 16) - 1; 27287 } 27288 return decrypted; 27289} 27290function decryptAscii(data, key, discardNumber) { 27291 const c1 = 52845, 27292 c2 = 22719; 27293 let r = key | 0; 27294 const count = data.length, 27295 maybeLength = count >>> 1; 27296 const decrypted = new Uint8Array(maybeLength); 27297 let i, j; 27298 for (i = 0, j = 0; i < count; i++) { 27299 const digit1 = data[i]; 27300 if (!isHexDigit(digit1)) { 27301 continue; 27302 } 27303 i++; 27304 let digit2; 27305 while (i < count && !isHexDigit(digit2 = data[i])) { 27306 i++; 27307 } 27308 if (i < count) { 27309 const value = parseInt(String.fromCharCode(digit1, digit2), 16); 27310 decrypted[j++] = value ^ r >> 8; 27311 r = (value + r) * c1 + c2 & (1 << 16) - 1; 27312 } 27313 } 27314 return decrypted.slice(discardNumber, j); 27315} 27316function isSpecial(c) { 27317 return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29; 27318} 27319class Type1Parser { 27320 constructor(stream, encrypted, seacAnalysisEnabled) { 27321 if (encrypted) { 27322 const data = stream.getBytes(); 27323 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])); 27324 stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); 27325 } 27326 this.seacAnalysisEnabled = !!seacAnalysisEnabled; 27327 this.stream = stream; 27328 this.nextChar(); 27329 } 27330 readNumberArray() { 27331 this.getToken(); 27332 const array = []; 27333 while (true) { 27334 const token = this.getToken(); 27335 if (token === null || token === "]" || token === "}") { 27336 break; 27337 } 27338 array.push(parseFloat(token || 0)); 27339 } 27340 return array; 27341 } 27342 readNumber() { 27343 const token = this.getToken(); 27344 return parseFloat(token || 0); 27345 } 27346 readInt() { 27347 const token = this.getToken(); 27348 return parseInt(token || 0, 10) | 0; 27349 } 27350 readBoolean() { 27351 const token = this.getToken(); 27352 return token === "true" ? 1 : 0; 27353 } 27354 nextChar() { 27355 return this.currentChar = this.stream.getByte(); 27356 } 27357 prevChar() { 27358 this.stream.skip(-2); 27359 return this.currentChar = this.stream.getByte(); 27360 } 27361 getToken() { 27362 let comment = false;
vendor: 44,761 bytes, lines 27363-28841
27363 let ch = this.currentChar; 27364 while (true) { 27365 if (ch === -1) { 27366 return null; 27367 } 27368 if (comment) { 27369 if (ch === 0x0a || ch === 0x0d) { 27370 comment = false; 27371 } 27372 } else if (ch === 0x25) { 27373 comment = true; 27374 } else if (!isWhiteSpace(ch)) { 27375 break; 27376 } 27377 ch = this.nextChar(); 27378 } 27379 if (isSpecial(ch)) { 27380 this.nextChar(); 27381 return String.fromCharCode(ch); 27382 } 27383 let token = ""; 27384 do { 27385 token += String.fromCharCode(ch); 27386 ch = this.nextChar(); 27387 } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch)); 27388 return token; 27389 } 27390 readCharStrings(bytes, lenIV) { 27391 if (lenIV === -1) { 27392 return bytes; 27393 } 27394 return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV); 27395 } 27396 extractFontProgram(properties) { 27397 const stream = this.stream; 27398 const subrs = [], 27399 charstrings = []; 27400 const privateData = Object.create(null); 27401 privateData.lenIV = 4; 27402 const program = { 27403 subrs: [], 27404 charstrings: [], 27405 properties: { 27406 privateData 27407 } 27408 }; 27409 let token, length, data, lenIV; 27410 while ((token = this.getToken()) !== null) { 27411 if (token !== "/") { 27412 continue; 27413 } 27414 token = this.getToken(); 27415 switch (token) { 27416 case "CharStrings": 27417 this.getToken(); 27418 this.getToken(); 27419 this.getToken(); 27420 this.getToken(); 27421 while (true) { 27422 token = this.getToken(); 27423 if (token === null || token === "end") { 27424 break; 27425 } 27426 if (token !== "/") { 27427 continue; 27428 } 27429 const glyph = this.getToken(); 27430 length = this.readInt(); 27431 this.getToken(); 27432 data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); 27433 lenIV = program.properties.privateData.lenIV; 27434 const encoded = this.readCharStrings(data, lenIV); 27435 this.nextChar(); 27436 token = this.getToken(); 27437 if (token === "noaccess") { 27438 this.getToken(); 27439 } else if (token === "/") { 27440 this.prevChar(); 27441 } 27442 charstrings.push({ 27443 glyph, 27444 encoded 27445 }); 27446 } 27447 break; 27448 case "Subrs": 27449 this.readInt(); 27450 this.getToken(); 27451 while (this.getToken() === "dup") { 27452 const index = this.readInt(); 27453 length = this.readInt(); 27454 this.getToken(); 27455 data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); 27456 lenIV = program.properties.privateData.lenIV; 27457 const encoded = this.readCharStrings(data, lenIV); 27458 this.nextChar(); 27459 token = this.getToken(); 27460 if (token === "noaccess") { 27461 this.getToken(); 27462 } 27463 subrs[index] = encoded; 27464 } 27465 break; 27466 case "BlueValues": 27467 case "OtherBlues": 27468 case "FamilyBlues": 27469 case "FamilyOtherBlues": 27470 const blueArray = this.readNumberArray(); 27471 if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) { 27472 program.properties.privateData[token] = blueArray; 27473 } 27474 break; 27475 case "StemSnapH": 27476 case "StemSnapV": 27477 program.properties.privateData[token] = this.readNumberArray(); 27478 break; 27479 case "StdHW": 27480 case "StdVW": 27481 program.properties.privateData[token] = this.readNumberArray()[0]; 27482 break; 27483 case "BlueShift": 27484 case "lenIV": 27485 case "BlueFuzz": 27486 case "BlueScale": 27487 case "LanguageGroup": 27488 program.properties.privateData[token] = this.readNumber(); 27489 break; 27490 case "ExpansionFactor": 27491 program.properties.privateData[token] = this.readNumber() || 0.06; 27492 break; 27493 case "ForceBold": 27494 program.properties.privateData[token] = this.readBoolean(); 27495 break; 27496 } 27497 } 27498 for (const { 27499 encoded, 27500 glyph 27501 } of charstrings) { 27502 const charString = new Type1CharString(); 27503 const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); 27504 let output = charString.output; 27505 if (error) { 27506 output = [14]; 27507 } 27508 const charStringObject = { 27509 glyphName: glyph, 27510 charstring: output, 27511 width: charString.width, 27512 lsb: charString.lsb, 27513 seac: charString.seac 27514 }; 27515 if (glyph === ".notdef") { 27516 program.charstrings.unshift(charStringObject); 27517 } else { 27518 program.charstrings.push(charStringObject); 27519 } 27520 if (properties.builtInEncoding) { 27521 const index = properties.builtInEncoding.indexOf(glyph); 27522 if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) { 27523 properties.widths[index] = charString.width; 27524 } 27525 } 27526 } 27527 return program; 27528 } 27529 extractFontHeader(properties) { 27530 let token; 27531 while ((token = this.getToken()) !== null) { 27532 if (token !== "/") { 27533 continue; 27534 } 27535 token = this.getToken(); 27536 switch (token) { 27537 case "FontMatrix": 27538 const matrix = this.readNumberArray(); 27539 properties.fontMatrix = matrix; 27540 break; 27541 case "Encoding": 27542 const encodingArg = this.getToken(); 27543 let encoding; 27544 if (!/^\d+$/.test(encodingArg)) { 27545 encoding = getEncoding(encodingArg); 27546 } else { 27547 encoding = []; 27548 const size = parseInt(encodingArg, 10) | 0; 27549 this.getToken(); 27550 for (let j = 0; j < size; j++) { 27551 token = this.getToken(); 27552 while (token !== "dup" && token !== "def") { 27553 token = this.getToken(); 27554 if (token === null) { 27555 return; 27556 } 27557 } 27558 if (token === "def") { 27559 break; 27560 } 27561 const index = this.readInt(); 27562 this.getToken(); 27563 const glyph = this.getToken(); 27564 encoding[index] = glyph; 27565 this.getToken(); 27566 } 27567 } 27568 properties.builtInEncoding = encoding; 27569 break; 27570 case "FontBBox": 27571 const fontBBox = this.readNumberArray(); 27572 properties.ascent = Math.max(fontBBox[3], fontBBox[1]); 27573 properties.descent = Math.min(fontBBox[1], fontBBox[3]); 27574 properties.ascentScaled = true; 27575 break; 27576 } 27577 } 27578 } 27579} 27580 27581;// ./src/core/type1_font.js 27582 27583 27584 27585 27586 27587 27588 27589function findBlock(streamBytes, signature, startIndex) { 27590 const streamBytesLength = streamBytes.length; 27591 const signatureLength = signature.length; 27592 const scanLength = streamBytesLength - signatureLength; 27593 let i = startIndex, 27594 found = false; 27595 while (i < scanLength) { 27596 let j = 0; 27597 while (j < signatureLength && streamBytes[i + j] === signature[j]) { 27598 j++; 27599 } 27600 if (j >= signatureLength) { 27601 i += j; 27602 while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) { 27603 i++; 27604 } 27605 found = true; 27606 break; 27607 } 27608 i++; 27609 } 27610 return { 27611 found, 27612 length: i 27613 }; 27614} 27615function getHeaderBlock(stream, suggestedLength) { 27616 const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; 27617 const streamStartPos = stream.pos; 27618 let headerBytes, headerBytesLength, block; 27619 try { 27620 headerBytes = stream.getBytes(suggestedLength); 27621 headerBytesLength = headerBytes.length; 27622 } catch {} 27623 if (headerBytesLength === suggestedLength) { 27624 block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length); 27625 if (block.found && block.length === suggestedLength) { 27626 return { 27627 stream: new Stream(headerBytes), 27628 length: suggestedLength 27629 }; 27630 } 27631 } 27632 warn('Invalid "Length1" property in Type1 font -- trying to recover.'); 27633 stream.pos = streamStartPos; 27634 const SCAN_BLOCK_LENGTH = 2048; 27635 let actualLength; 27636 while (true) { 27637 const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); 27638 block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); 27639 if (block.length === 0) { 27640 break; 27641 } 27642 stream.pos += block.length; 27643 if (block.found) { 27644 actualLength = stream.pos - streamStartPos; 27645 break; 27646 } 27647 } 27648 stream.pos = streamStartPos; 27649 if (actualLength) { 27650 return { 27651 stream: new Stream(stream.getBytes(actualLength)), 27652 length: actualLength 27653 }; 27654 } 27655 warn('Unable to recover "Length1" property in Type1 font -- using as is.'); 27656 return { 27657 stream: new Stream(stream.getBytes(suggestedLength)), 27658 length: suggestedLength 27659 }; 27660} 27661function getEexecBlock(stream, suggestedLength) { 27662 const eexecBytes = stream.getBytes(); 27663 if (eexecBytes.length === 0) { 27664 throw new FormatError("getEexecBlock - no font program found."); 27665 } 27666 return { 27667 stream: new Stream(eexecBytes), 27668 length: eexecBytes.length 27669 }; 27670} 27671class Type1Font { 27672 constructor(name, file, properties) { 27673 const PFB_HEADER_SIZE = 6; 27674 let headerBlockLength = properties.length1; 27675 let eexecBlockLength = properties.length2; 27676 let pfbHeader = file.peekBytes(PFB_HEADER_SIZE); 27677 const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; 27678 if (pfbHeaderPresent) { 27679 file.skip(PFB_HEADER_SIZE); 27680 headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; 27681 } 27682 const headerBlock = getHeaderBlock(file, headerBlockLength); 27683 const headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED); 27684 headerBlockParser.extractFontHeader(properties); 27685 if (pfbHeaderPresent) { 27686 pfbHeader = file.getBytes(PFB_HEADER_SIZE); 27687 eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; 27688 } 27689 const eexecBlock = getEexecBlock(file, eexecBlockLength); 27690 const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); 27691 const data = eexecBlockParser.extractFontProgram(properties); 27692 for (const key in data.properties) { 27693 properties[key] = data.properties[key]; 27694 } 27695 const charstrings = data.charstrings; 27696 const type2Charstrings = this.getType2Charstrings(charstrings); 27697 const subrs = this.getType2Subrs(data.subrs); 27698 this.charstrings = charstrings; 27699 this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); 27700 this.seacs = this.getSeacs(data.charstrings); 27701 } 27702 get numGlyphs() { 27703 return this.charstrings.length + 1; 27704 } 27705 getCharset() { 27706 const charset = [".notdef"]; 27707 for (const { 27708 glyphName 27709 } of this.charstrings) { 27710 charset.push(glyphName); 27711 } 27712 return charset; 27713 } 27714 getGlyphMapping(properties) { 27715 const charstrings = this.charstrings; 27716 if (properties.composite) { 27717 const charCodeToGlyphId = Object.create(null); 27718 for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) { 27719 const charCode = properties.cMap.charCodeOf(glyphId); 27720 charCodeToGlyphId[charCode] = glyphId + 1; 27721 } 27722 return charCodeToGlyphId; 27723 } 27724 const glyphNames = [".notdef"]; 27725 let builtInEncoding, glyphId; 27726 for (glyphId = 0; glyphId < charstrings.length; glyphId++) { 27727 glyphNames.push(charstrings[glyphId].glyphName); 27728 } 27729 const encoding = properties.builtInEncoding; 27730 if (encoding) { 27731 builtInEncoding = Object.create(null); 27732 for (const charCode in encoding) { 27733 glyphId = glyphNames.indexOf(encoding[charCode]); 27734 if (glyphId >= 0) { 27735 builtInEncoding[charCode] = glyphId; 27736 } 27737 } 27738 } 27739 return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); 27740 } 27741 hasGlyphId(id) { 27742 if (id < 0 || id >= this.numGlyphs) { 27743 return false; 27744 } 27745 if (id === 0) { 27746 return true; 27747 } 27748 const glyph = this.charstrings[id - 1]; 27749 return glyph.charstring.length > 0; 27750 } 27751 getSeacs(charstrings) { 27752 const seacMap = []; 27753 for (let i = 0, ii = charstrings.length; i < ii; i++) { 27754 const charstring = charstrings[i]; 27755 if (charstring.seac) { 27756 seacMap[i + 1] = charstring.seac; 27757 } 27758 } 27759 return seacMap; 27760 } 27761 getType2Charstrings(type1Charstrings) { 27762 const type2Charstrings = []; 27763 for (const type1Charstring of type1Charstrings) { 27764 type2Charstrings.push(type1Charstring.charstring); 27765 } 27766 return type2Charstrings; 27767 } 27768 getType2Subrs(type1Subrs) { 27769 let bias = 0; 27770 const count = type1Subrs.length; 27771 if (count < 1133) { 27772 bias = 107; 27773 } else if (count < 33769) { 27774 bias = 1131; 27775 } else { 27776 bias = 32768; 27777 } 27778 const type2Subrs = []; 27779 let i; 27780 for (i = 0; i < bias; i++) { 27781 type2Subrs.push([0x0b]); 27782 } 27783 for (i = 0; i < count; i++) { 27784 type2Subrs.push(type1Subrs[i]); 27785 } 27786 return type2Subrs; 27787 } 27788 wrap(name, glyphs, charstrings, subrs, properties) { 27789 const cff = new CFF(); 27790 cff.header = new CFFHeader(1, 0, 4, 4); 27791 cff.names = [name]; 27792 const topDict = new CFFTopDict(); 27793 topDict.setByName("version", 391); 27794 topDict.setByName("Notice", 392); 27795 topDict.setByName("FullName", 393); 27796 topDict.setByName("FamilyName", 394); 27797 topDict.setByName("Weight", 395); 27798 topDict.setByName("Encoding", null); 27799 topDict.setByName("FontMatrix", properties.fontMatrix); 27800 topDict.setByName("FontBBox", properties.bbox); 27801 topDict.setByName("charset", null); 27802 topDict.setByName("CharStrings", null); 27803 topDict.setByName("Private", null); 27804 cff.topDict = topDict; 27805 const strings = new CFFStrings(); 27806 strings.add("Version 0.11"); 27807 strings.add("See original notice"); 27808 strings.add(name); 27809 strings.add(name); 27810 strings.add("Medium"); 27811 cff.strings = strings; 27812 cff.globalSubrIndex = new CFFIndex(); 27813 const count = glyphs.length; 27814 const charsetArray = [".notdef"]; 27815 let i, ii; 27816 for (i = 0; i < count; i++) { 27817 const glyphName = charstrings[i].glyphName; 27818 const index = CFFStandardStrings.indexOf(glyphName); 27819 if (index === -1) { 27820 strings.add(glyphName); 27821 } 27822 charsetArray.push(glyphName); 27823 } 27824 cff.charset = new CFFCharset(false, 0, charsetArray); 27825 const charStringsIndex = new CFFIndex(); 27826 charStringsIndex.add([0x8b, 0x0e]); 27827 for (i = 0; i < count; i++) { 27828 charStringsIndex.add(glyphs[i]); 27829 } 27830 cff.charStrings = charStringsIndex; 27831 const privateDict = new CFFPrivateDict(); 27832 privateDict.setByName("Subrs", null); 27833 const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"]; 27834 for (i = 0, ii = fields.length; i < ii; i++) { 27835 const field = fields[i]; 27836 if (!(field in properties.privateData)) { 27837 continue; 27838 } 27839 const value = properties.privateData[field]; 27840 if (Array.isArray(value)) { 27841 for (let j = value.length - 1; j > 0; j--) { 27842 value[j] -= value[j - 1]; 27843 } 27844 } 27845 privateDict.setByName(field, value); 27846 } 27847 cff.topDict.privateDict = privateDict; 27848 const subrIndex = new CFFIndex(); 27849 for (i = 0, ii = subrs.length; i < ii; i++) { 27850 subrIndex.add(subrs[i]); 27851 } 27852 privateDict.subrsIndex = subrIndex; 27853 const compiler = new CFFCompiler(cff); 27854 return compiler.compile(); 27855 } 27856} 27857 27858;// ./src/core/fonts.js 27859 27860 27861 27862 27863 27864 27865 27866 27867 27868 27869 27870 27871 27872 27873 27874 27875 27876 27877 27878 27879 27880 27881 27882 27883 27884 27885 27886 27887 27888 27889 27890 27891 27892 27893 27894 27895const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; 27896const PDF_GLYPH_SPACE_UNITS = 1000; 27897const 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"]; 27898const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "toFontChar", "toUnicode", "vmetrics", "widths"]; 27899function adjustWidths(properties) { 27900 if (!properties.fontMatrix) { 27901 return; 27902 } 27903 if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { 27904 return; 27905 } 27906 const scale = 0.001 / properties.fontMatrix[0]; 27907 const glyphsWidths = properties.widths; 27908 for (const glyph in glyphsWidths) { 27909 glyphsWidths[glyph] *= scale; 27910 } 27911 properties.defaultWidth *= scale; 27912} 27913function adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) { 27914 if (properties.isInternalFont) { 27915 return; 27916 } 27917 if (properties.hasIncludedToUnicodeMap) { 27918 return; 27919 } 27920 if (properties.hasEncoding) { 27921 return; 27922 } 27923 if (properties.toUnicode instanceof IdentityToUnicodeMap) { 27924 return; 27925 } 27926 if (!isSymbolicFont) { 27927 return; 27928 } 27929 if (nameRecords.length === 0) { 27930 return; 27931 } 27932 if (properties.defaultEncoding === WinAnsiEncoding) { 27933 return; 27934 } 27935 for (const r of nameRecords) { 27936 if (!isWinNameRecord(r)) { 27937 return; 27938 } 27939 } 27940 const encoding = WinAnsiEncoding; 27941 const toUnicode = [], 27942 glyphsUnicodeMap = getGlyphsUnicode(); 27943 for (const charCode in encoding) { 27944 const glyphName = encoding[charCode]; 27945 if (glyphName === "") { 27946 continue; 27947 } 27948 const unicode = glyphsUnicodeMap[glyphName]; 27949 if (unicode === undefined) { 27950 continue; 27951 } 27952 toUnicode[charCode] = String.fromCharCode(unicode); 27953 } 27954 if (toUnicode.length > 0) { 27955 properties.toUnicode.amend(toUnicode); 27956 } 27957} 27958function adjustType1ToUnicode(properties, builtInEncoding) { 27959 if (properties.isInternalFont) { 27960 return; 27961 } 27962 if (properties.hasIncludedToUnicodeMap) { 27963 return; 27964 } 27965 if (builtInEncoding === properties.defaultEncoding) { 27966 return; 27967 } 27968 if (properties.toUnicode instanceof IdentityToUnicodeMap) { 27969 return; 27970 } 27971 const toUnicode = [], 27972 glyphsUnicodeMap = getGlyphsUnicode(); 27973 for (const charCode in builtInEncoding) { 27974 if (properties.hasEncoding) { 27975 if (properties.baseEncodingName || properties.differences[charCode] !== undefined) { 27976 continue; 27977 } 27978 } 27979 const glyphName = builtInEncoding[charCode]; 27980 const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); 27981 if (unicode !== -1) { 27982 toUnicode[charCode] = String.fromCharCode(unicode); 27983 } 27984 } 27985 if (toUnicode.length > 0) { 27986 properties.toUnicode.amend(toUnicode); 27987 } 27988} 27989function amendFallbackToUnicode(properties) { 27990 if (!properties.fallbackToUnicode) { 27991 return; 27992 } 27993 if (properties.toUnicode instanceof IdentityToUnicodeMap) { 27994 return; 27995 } 27996 const toUnicode = []; 27997 for (const charCode in properties.fallbackToUnicode) { 27998 if (properties.toUnicode.has(charCode)) { 27999 continue; 28000 } 28001 toUnicode[charCode] = properties.fallbackToUnicode[charCode]; 28002 } 28003 if (toUnicode.length > 0) { 28004 properties.toUnicode.amend(toUnicode); 28005 } 28006} 28007class fonts_Glyph { 28008 constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { 28009 this.originalCharCode = originalCharCode; 28010 this.fontChar = fontChar; 28011 this.unicode = unicode; 28012 this.accent = accent; 28013 this.width = width; 28014 this.vmetric = vmetric; 28015 this.operatorListId = operatorListId; 28016 this.isSpace = isSpace; 28017 this.isInFont = isInFont; 28018 } 28019 get category() { 28020 return shadow(this, "category", getCharUnicodeCategory(this.unicode), true); 28021 } 28022} 28023function int16(b0, b1) { 28024 return (b0 << 8) + b1; 28025} 28026function writeSignedInt16(bytes, index, value) { 28027 bytes[index + 1] = value; 28028 bytes[index] = value >>> 8; 28029} 28030function signedInt16(b0, b1) { 28031 const value = (b0 << 8) + b1; 28032 return value & 1 << 15 ? value - 0x10000 : value; 28033} 28034function writeUint32(bytes, index, value) { 28035 bytes[index + 3] = value & 0xff; 28036 bytes[index + 2] = value >>> 8; 28037 bytes[index + 1] = value >>> 16; 28038 bytes[index] = value >>> 24; 28039} 28040function int32(b0, b1, b2, b3) { 28041 return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; 28042} 28043function string16(value) { 28044 return String.fromCharCode(value >> 8 & 0xff, value & 0xff); 28045} 28046function safeString16(value) { 28047 if (value > 0x7fff) { 28048 value = 0x7fff; 28049 } else if (value < -0x8000) { 28050 value = -0x8000; 28051 } 28052 return String.fromCharCode(value >> 8 & 0xff, value & 0xff); 28053} 28054function isTrueTypeFile(file) { 28055 const header = file.peekBytes(4); 28056 return readUint32(header, 0) === 0x00010000 || bytesToString(header) === "true"; 28057} 28058function isTrueTypeCollectionFile(file) { 28059 const header = file.peekBytes(4); 28060 return bytesToString(header) === "ttcf"; 28061} 28062function isOpenTypeFile(file) { 28063 const header = file.peekBytes(4); 28064 return bytesToString(header) === "OTTO"; 28065} 28066function isType1File(file) { 28067 const header = file.peekBytes(2); 28068 if (header[0] === 0x25 && header[1] === 0x21) { 28069 return true; 28070 } 28071 if (header[0] === 0x80 && header[1] === 0x01) { 28072 return true; 28073 } 28074 return false; 28075} 28076function isCFFFile(file) { 28077 const header = file.peekBytes(4); 28078 if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) { 28079 return true; 28080 } 28081 return false; 28082} 28083function getFontFileType(file, { 28084 type, 28085 subtype, 28086 composite 28087}) { 28088 let fileType, fileSubtype; 28089 if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) { 28090 fileType = composite ? "CIDFontType2" : "TrueType"; 28091 } else if (isOpenTypeFile(file)) { 28092 fileType = composite ? "CIDFontType2" : "OpenType"; 28093 } else if (isType1File(file)) { 28094 if (composite) { 28095 fileType = "CIDFontType0"; 28096 } else { 28097 fileType = type === "MMType1" ? "MMType1" : "Type1"; 28098 } 28099 } else if (isCFFFile(file)) { 28100 if (composite) { 28101 fileType = "CIDFontType0"; 28102 fileSubtype = "CIDFontType0C"; 28103 } else { 28104 fileType = type === "MMType1" ? "MMType1" : "Type1"; 28105 fileSubtype = "Type1C"; 28106 } 28107 } else { 28108 warn("getFontFileType: Unable to detect correct font file Type/Subtype."); 28109 fileType = type; 28110 fileSubtype = subtype; 28111 } 28112 return [fileType, fileSubtype]; 28113} 28114function applyStandardFontGlyphMap(map, glyphMap) { 28115 for (const charCode in glyphMap) { 28116 map[+charCode] = glyphMap[charCode]; 28117 } 28118} 28119function buildToFontChar(encoding, glyphsUnicodeMap, differences) { 28120 const toFontChar = []; 28121 let unicode; 28122 for (let i = 0, ii = encoding.length; i < ii; i++) { 28123 unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); 28124 if (unicode !== -1) { 28125 toFontChar[i] = unicode; 28126 } 28127 } 28128 for (const charCode in differences) { 28129 unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); 28130 if (unicode !== -1) { 28131 toFontChar[+charCode] = unicode; 28132 } 28133 } 28134 return toFontChar; 28135} 28136function isMacNameRecord(r) { 28137 return r.platform === 1 && r.encoding === 0 && r.language === 0; 28138} 28139function isWinNameRecord(r) { 28140 return r.platform === 3 && r.encoding === 1 && r.language === 0x409; 28141} 28142function convertCidString(charCode, cid, shouldThrow = false) { 28143 switch (cid.length) { 28144 case 1: 28145 return cid.charCodeAt(0); 28146 case 2: 28147 return cid.charCodeAt(0) << 8 | cid.charCodeAt(1); 28148 } 28149 const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; 28150 if (shouldThrow) { 28151 throw new FormatError(msg); 28152 } 28153 warn(msg); 28154 return cid; 28155} 28156function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { 28157 const newMap = Object.create(null); 28158 const toUnicodeExtraMap = new Map(); 28159 const toFontChar = []; 28160 const usedGlyphIds = new Set(); 28161 let privateUseAreaIndex = 0; 28162 const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; 28163 let nextAvailableFontCharCode = privateUseOffetStart; 28164 let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; 28165 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]; 28166 for (const originalCharCode in charCodeToGlyphId) { 28167 let glyphId = charCodeToGlyphId[originalCharCode]; 28168 if (!hasGlyph(glyphId)) { 28169 continue; 28170 } 28171 if (nextAvailableFontCharCode > privateUseOffetEnd) { 28172 privateUseAreaIndex++; 28173 if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) { 28174 warn("Ran out of space in font private use area."); 28175 break; 28176 } 28177 nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; 28178 privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; 28179 } 28180 const fontCharCode = nextAvailableFontCharCode++; 28181 if (glyphId === 0) { 28182 glyphId = newGlyphZeroId; 28183 } 28184 let unicode = toUnicode.get(originalCharCode); 28185 if (typeof unicode === "string") { 28186 unicode = unicode.codePointAt(0); 28187 } 28188 if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) { 28189 toUnicodeExtraMap.set(unicode, glyphId); 28190 usedGlyphIds.add(glyphId); 28191 } 28192 newMap[fontCharCode] = glyphId; 28193 toFontChar[originalCharCode] = fontCharCode; 28194 } 28195 return { 28196 toFontChar, 28197 charCodeToGlyphId: newMap, 28198 toUnicodeExtraMap, 28199 nextAvailableFontCharCode 28200 }; 28201} 28202function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) { 28203 const codes = []; 28204 for (const charCode in glyphs) { 28205 if (glyphs[charCode] >= numGlyphs) { 28206 continue; 28207 } 28208 codes.push({ 28209 fontCharCode: charCode | 0, 28210 glyphId: glyphs[charCode] 28211 }); 28212 } 28213 if (toUnicodeExtraMap) { 28214 for (const [unicode, glyphId] of toUnicodeExtraMap) { 28215 if (glyphId >= numGlyphs) { 28216 continue; 28217 } 28218 codes.push({ 28219 fontCharCode: unicode, 28220 glyphId 28221 }); 28222 } 28223 } 28224 if (codes.length === 0) { 28225 codes.push({ 28226 fontCharCode: 0, 28227 glyphId: 0 28228 }); 28229 } 28230 codes.sort(function fontGetRangesSort(a, b) { 28231 return a.fontCharCode - b.fontCharCode; 28232 }); 28233 const ranges = []; 28234 const length = codes.length; 28235 for (let n = 0; n < length;) { 28236 const start = codes[n].fontCharCode; 28237 const codeIndices = [codes[n].glyphId]; 28238 ++n; 28239 let end = start; 28240 while (n < length && end + 1 === codes[n].fontCharCode) { 28241 codeIndices.push(codes[n].glyphId); 28242 ++end; 28243 ++n; 28244 if (end === 0xffff) { 28245 break; 28246 } 28247 } 28248 ranges.push([start, end, codeIndices]); 28249 } 28250 return ranges; 28251} 28252function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) { 28253 const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs); 28254 const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1; 28255 let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + string32(4 + numTables * 8); 28256 let i, ii, j, jj; 28257 for (i = ranges.length - 1; i >= 0; --i) { 28258 if (ranges[i][0] <= 0xffff) { 28259 break; 28260 } 28261 } 28262 const bmpLength = i + 1; 28263 if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) { 28264 ranges[i][1] = 0xfffe; 28265 } 28266 const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0; 28267 const segCount = bmpLength + trailingRangesCount; 28268 const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); 28269 let startCount = ""; 28270 let endCount = ""; 28271 let idDeltas = ""; 28272 let idRangeOffsets = ""; 28273 let glyphsIds = ""; 28274 let bias = 0; 28275 let range, start, end, codes; 28276 for (i = 0, ii = bmpLength; i < ii; i++) { 28277 range = ranges[i]; 28278 start = range[0]; 28279 end = range[1]; 28280 startCount += string16(start); 28281 endCount += string16(end); 28282 codes = range[2]; 28283 let contiguous = true; 28284 for (j = 1, jj = codes.length; j < jj; ++j) { 28285 if (codes[j] !== codes[j - 1] + 1) { 28286 contiguous = false; 28287 break; 28288 } 28289 } 28290 if (!contiguous) { 28291 const offset = (segCount - i) * 2 + bias * 2; 28292 bias += end - start + 1; 28293 idDeltas += string16(0); 28294 idRangeOffsets += string16(offset); 28295 for (j = 0, jj = codes.length; j < jj; ++j) { 28296 glyphsIds += string16(codes[j]); 28297 } 28298 } else { 28299 const startCode = codes[0]; 28300 idDeltas += string16(startCode - start & 0xffff); 28301 idRangeOffsets += string16(0); 28302 } 28303 } 28304 if (trailingRangesCount > 0) { 28305 endCount += "\xFF\xFF"; 28306 startCount += "\xFF\xFF"; 28307 idDeltas += "\x00\x01"; 28308 idRangeOffsets += "\x00\x00"; 28309 } 28310 const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + idDeltas + idRangeOffsets + glyphsIds; 28311 let format31012 = ""; 28312 let header31012 = ""; 28313 if (numTables > 1) { 28314 cmap += "\x00\x03" + "\x00\x0A" + string32(4 + numTables * 8 + 4 + format314.length); 28315 format31012 = ""; 28316 for (i = 0, ii = ranges.length; i < ii; i++) { 28317 range = ranges[i]; 28318 start = range[0]; 28319 codes = range[2]; 28320 let code = codes[0]; 28321 for (j = 1, jj = codes.length; j < jj; ++j) { 28322 if (codes[j] !== codes[j - 1] + 1) { 28323 end = range[0] + j - 1; 28324 format31012 += string32(start) + string32(end) + string32(code); 28325 start = end + 1; 28326 code = codes[j]; 28327 } 28328 } 28329 format31012 += string32(start) + string32(range[1]) + string32(code); 28330 } 28331 header31012 = "\x00\x0C" + "\x00\x00" + string32(format31012.length + 16) + "\x00\x00\x00\x00" + string32(format31012.length / 12); 28332 } 28333 return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012; 28334} 28335function validateOS2Table(os2, file) { 28336 file.pos = (file.start || 0) + os2.offset; 28337 const version = file.getUint16(); 28338 file.skip(60); 28339 const selection = file.getUint16(); 28340 if (version < 4 && selection & 0x0300) { 28341 return false; 28342 } 28343 const firstChar = file.getUint16(); 28344 const lastChar = file.getUint16(); 28345 if (firstChar > lastChar) { 28346 return false; 28347 } 28348 file.skip(6); 28349 const usWinAscent = file.getUint16(); 28350 if (usWinAscent === 0) { 28351 return false; 28352 } 28353 os2.data[8] = os2.data[9] = 0; 28354 return true; 28355} 28356function createOS2Table(properties, charstrings, override) { 28357 override ||= { 28358 unitsPerEm: 0, 28359 yMax: 0, 28360 yMin: 0, 28361 ascent: 0, 28362 descent: 0 28363 }; 28364 let ulUnicodeRange1 = 0; 28365 let ulUnicodeRange2 = 0; 28366 let ulUnicodeRange3 = 0; 28367 let ulUnicodeRange4 = 0; 28368 let firstCharIndex = null; 28369 let lastCharIndex = 0; 28370 let position = -1; 28371 if (charstrings) { 28372 for (let code in charstrings) { 28373 code |= 0; 28374 if (firstCharIndex > code || !firstCharIndex) { 28375 firstCharIndex = code; 28376 } 28377 if (lastCharIndex < code) { 28378 lastCharIndex = code; 28379 } 28380 position = getUnicodeRangeFor(code, position); 28381 if (position < 32) { 28382 ulUnicodeRange1 |= 1 << position; 28383 } else if (position < 64) { 28384 ulUnicodeRange2 |= 1 << position - 32; 28385 } else if (position < 96) { 28386 ulUnicodeRange3 |= 1 << position - 64; 28387 } else if (position < 123) { 28388 ulUnicodeRange4 |= 1 << position - 96; 28389 } else { 28390 throw new FormatError("Unicode ranges Bits > 123 are reserved for internal usage"); 28391 } 28392 } 28393 if (lastCharIndex > 0xffff) { 28394 lastCharIndex = 0xffff; 28395 } 28396 } else { 28397 firstCharIndex = 0; 28398 lastCharIndex = 255; 28399 } 28400 const bbox = properties.bbox || [0, 0, 0, 0]; 28401 const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000); 28402 const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; 28403 const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); 28404 let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); 28405 if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { 28406 typoDescent = -typoDescent; 28407 } 28408 const winAscent = override.yMax || typoAscent; 28409 const winDescent = -override.yMin || -typoDescent; 28410 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"; 28411} 28412function createPostTable(properties) { 28413 const angle = Math.floor(properties.italicAngle * 2 ** 16); 28414 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"; 28415} 28416function createPostscriptName(name) { 28417 return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); 28418} 28419function createNameTable(name, proto) { 28420 if (!proto) { 28421 proto = [[], []]; 28422 } 28423 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"]; 28424 const stringsUnicode = []; 28425 let i, ii, j, jj, str; 28426 for (i = 0, ii = strings.length; i < ii; i++) { 28427 str = proto[1][i] || strings[i]; 28428 const strBufUnicode = []; 28429 for (j = 0, jj = str.length; j < jj; j++) { 28430 strBufUnicode.push(string16(str.charCodeAt(j))); 28431 } 28432 stringsUnicode.push(strBufUnicode.join("")); 28433 } 28434 const names = [strings, stringsUnicode]; 28435 const platforms = ["\x00\x01", "\x00\x03"]; 28436 const encodings = ["\x00\x00", "\x00\x01"]; 28437 const languages = ["\x00\x00", "\x04\x09"]; 28438 const namesRecordCount = strings.length * platforms.length; 28439 let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6); 28440 let strOffset = 0; 28441 for (i = 0, ii = platforms.length; i < ii; i++) { 28442 const strs = names[i]; 28443 for (j = 0, jj = strs.length; j < jj; j++) { 28444 str = strs[j]; 28445 const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset); 28446 nameTable += nameRecord; 28447 strOffset += str.length; 28448 } 28449 } 28450 nameTable += strings.join("") + stringsUnicode.join(""); 28451 return nameTable; 28452} 28453class Font { 28454 constructor(name, file, properties) { 28455 this.name = name; 28456 this.psName = null; 28457 this.mimetype = null; 28458 this.disableFontFace = false; 28459 this.loadedName = properties.loadedName; 28460 this.isType3Font = properties.isType3Font; 28461 this.missingFile = false; 28462 this.cssFontInfo = properties.cssFontInfo; 28463 this._charsCache = Object.create(null); 28464 this._glyphCache = Object.create(null); 28465 let isSerifFont = !!(properties.flags & FontFlags.Serif); 28466 if (!isSerifFont && !properties.isSimulatedFlags) { 28467 const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0], 28468 serifFonts = getSerifFonts(); 28469 for (const namePart of baseName.split("+")) { 28470 if (serifFonts[namePart]) { 28471 isSerifFont = true; 28472 break; 28473 } 28474 } 28475 } 28476 this.isSerifFont = isSerifFont; 28477 this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); 28478 this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); 28479 let { 28480 type, 28481 subtype 28482 } = properties; 28483 this.type = type; 28484 this.subtype = subtype; 28485 this.systemFontInfo = properties.systemFontInfo; 28486 const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/); 28487 this.isInvalidPDFjsFont = !!matches; 28488 if (this.isInvalidPDFjsFont) { 28489 this.fallbackName = matches[1]; 28490 } else if (this.isMonospace) { 28491 this.fallbackName = "monospace"; 28492 } else if (this.isSerifFont) { 28493 this.fallbackName = "serif"; 28494 } else { 28495 this.fallbackName = "sans-serif"; 28496 } 28497 if (this.systemFontInfo?.guessFallback) { 28498 this.systemFontInfo.guessFallback = false; 28499 this.systemFontInfo.css += `,${this.fallbackName}`; 28500 } 28501 this.differences = properties.differences; 28502 this.widths = properties.widths; 28503 this.defaultWidth = properties.defaultWidth; 28504 this.composite = properties.composite; 28505 this.cMap = properties.cMap; 28506 this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS; 28507 this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; 28508 this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; 28509 this.lineHeight = this.ascent - this.descent; 28510 this.fontMatrix = properties.fontMatrix; 28511 this.bbox = properties.bbox; 28512 this.defaultEncoding = properties.defaultEncoding; 28513 this.toUnicode = properties.toUnicode; 28514 this.toFontChar = []; 28515 if (properties.type === "Type3") { 28516 for (let charCode = 0; charCode < 256; charCode++) { 28517 this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode]; 28518 } 28519 return; 28520 } 28521 this.cidEncoding = properties.cidEncoding || ""; 28522 this.vertical = !!properties.vertical; 28523 if (this.vertical) { 28524 this.vmetrics = properties.vmetrics; 28525 this.defaultVMetrics = properties.defaultVMetrics; 28526 } 28527 if (!file || file.isEmpty) { 28528 if (file) { 28529 warn('Font file is empty in "' + name + '" (' + this.loadedName + ")"); 28530 } 28531 this.fallbackToSystemFont(properties); 28532 return; 28533 } 28534 [type, subtype] = getFontFileType(file, properties); 28535 if (type !== this.type || subtype !== this.subtype) { 28536 info("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`); 28537 } 28538 let data; 28539 try { 28540 switch (type) { 28541 case "MMType1": 28542 info("MMType1 font (" + name + "), falling back to Type1."); 28543 case "Type1": 28544 case "CIDFontType0": 28545 this.mimetype = "font/opentype"; 28546 const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new CFFFont(file, properties) : new Type1Font(name, file, properties); 28547 adjustWidths(properties); 28548 data = this.convert(name, cff, properties); 28549 break; 28550 case "OpenType": 28551 case "TrueType": 28552 case "CIDFontType2": 28553 this.mimetype = "font/opentype"; 28554 data = this.checkAndRepair(name, file, properties); 28555 if (this.isOpenType) { 28556 adjustWidths(properties); 28557 type = "OpenType"; 28558 } 28559 break; 28560 default: 28561 throw new FormatError(`Font ${type} is not supported`); 28562 } 28563 } catch (e) { 28564 warn(e); 28565 this.fallbackToSystemFont(properties); 28566 return; 28567 } 28568 amendFallbackToUnicode(properties); 28569 this.data = data; 28570 this.type = type; 28571 this.subtype = subtype; 28572 this.fontMatrix = properties.fontMatrix; 28573 this.widths = properties.widths; 28574 this.defaultWidth = properties.defaultWidth; 28575 this.toUnicode = properties.toUnicode; 28576 this.seacMap = properties.seacMap; 28577 } 28578 get renderer() { 28579 const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); 28580 return shadow(this, "renderer", renderer); 28581 } 28582 exportData(extraProperties = false) { 28583 const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES; 28584 const data = Object.create(null); 28585 let property, value; 28586 for (property of exportDataProperties) { 28587 value = this[property]; 28588 if (value !== undefined) { 28589 data[property] = value; 28590 } 28591 } 28592 return data; 28593 } 28594 fallbackToSystemFont(properties) { 28595 this.missingFile = true; 28596 const { 28597 name, 28598 type 28599 } = this; 28600 let fontName = normalizeFontName(name); 28601 const stdFontMap = getStdFontMap(), 28602 nonStdFontMap = getNonStdFontMap(); 28603 const isStandardFont = !!stdFontMap[fontName]; 28604 const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); 28605 fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; 28606 const fontBasicMetricsMap = getFontBasicMetrics(); 28607 const metrics = fontBasicMetricsMap[fontName]; 28608 if (metrics) { 28609 if (isNaN(this.ascent)) { 28610 this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS; 28611 } 28612 if (isNaN(this.descent)) { 28613 this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS; 28614 } 28615 if (isNaN(this.capHeight)) { 28616 this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS; 28617 } 28618 } 28619 this.bold = /bold/gi.test(fontName); 28620 this.italic = /oblique|italic/gi.test(fontName); 28621 this.black = /Black/g.test(name); 28622 const isNarrow = /Narrow/g.test(name); 28623 this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; 28624 if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) { 28625 const cidToGidMap = properties.cidToGidMap; 28626 const map = []; 28627 applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); 28628 if (/Arial-?Black/i.test(name)) { 28629 applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack()); 28630 } else if (/Calibri/i.test(name)) { 28631 applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri()); 28632 } 28633 if (cidToGidMap) { 28634 for (const charCode in map) { 28635 const cid = map[charCode]; 28636 if (cidToGidMap[cid] !== undefined) { 28637 map[+charCode] = cidToGidMap[cid]; 28638 } 28639 } 28640 if (cidToGidMap.length !== this.toUnicode.length && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof IdentityToUnicodeMap) { 28641 this.toUnicode.forEach(function (charCode, unicodeCharCode) { 28642 const cid = map[charCode]; 28643 if (cidToGidMap[cid] === undefined) { 28644 map[+charCode] = unicodeCharCode; 28645 } 28646 }); 28647 } 28648 } 28649 if (!(this.toUnicode instanceof IdentityToUnicodeMap)) { 28650 this.toUnicode.forEach(function (charCode, unicodeCharCode) { 28651 map[+charCode] = unicodeCharCode; 28652 }); 28653 } 28654 this.toFontChar = map; 28655 this.toUnicode = new ToUnicodeMap(map); 28656 } else if (/Symbol/i.test(fontName)) { 28657 this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), this.differences); 28658 } else if (/Dingbats/i.test(fontName)) { 28659 this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), this.differences); 28660 } else if (isStandardFont || isMappedToStandardFont) { 28661 const map = buildToFontChar(this.defaultEncoding, getGlyphsUnicode(), this.differences); 28662 if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof IdentityToUnicodeMap)) { 28663 this.toUnicode.forEach(function (charCode, unicodeCharCode) { 28664 map[+charCode] = unicodeCharCode; 28665 }); 28666 } 28667 this.toFontChar = map; 28668 } else { 28669 const glyphsUnicodeMap = getGlyphsUnicode(); 28670 const map = []; 28671 this.toUnicode.forEach((charCode, unicodeCharCode) => { 28672 if (!this.composite) { 28673 const glyphName = this.differences[charCode] || this.defaultEncoding[charCode]; 28674 const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); 28675 if (unicode !== -1) { 28676 unicodeCharCode = unicode; 28677 } 28678 } 28679 map[+charCode] = unicodeCharCode; 28680 }); 28681 if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) { 28682 if (/Tahoma|Verdana/i.test(name)) { 28683 applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); 28684 } 28685 } 28686 this.toFontChar = map; 28687 } 28688 amendFallbackToUnicode(properties); 28689 this.loadedName = fontName.split("-", 1)[0]; 28690 } 28691 checkAndRepair(name, font, properties) { 28692 const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "]; 28693 function readTables(file, numTables) { 28694 const tables = Object.create(null); 28695 tables["OS/2"] = null; 28696 tables.cmap = null; 28697 tables.head = null; 28698 tables.hhea = null; 28699 tables.hmtx = null; 28700 tables.maxp = null; 28701 tables.name = null; 28702 tables.post = null; 28703 for (let i = 0; i < numTables; i++) { 28704 const table = readTableEntry(file); 28705 if (!VALID_TABLES.includes(table.tag)) { 28706 continue; 28707 } 28708 if (table.length === 0) { 28709 continue; 28710 } 28711 tables[table.tag] = table; 28712 } 28713 return tables; 28714 } 28715 function readTableEntry(file) { 28716 const tag = file.getString(4); 28717 const checksum = file.getInt32() >>> 0; 28718 const offset = file.getInt32() >>> 0; 28719 const length = file.getInt32() >>> 0; 28720 const previousPosition = file.pos; 28721 file.pos = file.start || 0; 28722 file.skip(offset); 28723 const data = file.getBytes(length); 28724 file.pos = previousPosition; 28725 if (tag === "head") { 28726 data[8] = data[9] = data[10] = data[11] = 0; 28727 data[17] |= 0x20; 28728 } 28729 return { 28730 tag, 28731 checksum, 28732 length, 28733 offset, 28734 data 28735 }; 28736 } 28737 function readOpenTypeHeader(ttf) { 28738 return { 28739 version: ttf.getString(4), 28740 numTables: ttf.getUint16(), 28741 searchRange: ttf.getUint16(), 28742 entrySelector: ttf.getUint16(), 28743 rangeShift: ttf.getUint16() 28744 }; 28745 } 28746 function readTrueTypeCollectionHeader(ttc) { 28747 const ttcTag = ttc.getString(4); 28748 assert(ttcTag === "ttcf", "Must be a TrueType Collection font."); 28749 const majorVersion = ttc.getUint16(); 28750 const minorVersion = ttc.getUint16(); 28751 const numFonts = ttc.getInt32() >>> 0; 28752 const offsetTable = []; 28753 for (let i = 0; i < numFonts; i++) { 28754 offsetTable.push(ttc.getInt32() >>> 0); 28755 } 28756 const header = { 28757 ttcTag, 28758 majorVersion, 28759 minorVersion, 28760 numFonts, 28761 offsetTable 28762 }; 28763 switch (majorVersion) { 28764 case 1: 28765 return header; 28766 case 2: 28767 header.dsigTag = ttc.getInt32() >>> 0; 28768 header.dsigLength = ttc.getInt32() >>> 0; 28769 header.dsigOffset = ttc.getInt32() >>> 0; 28770 return header; 28771 } 28772 throw new FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`); 28773 } 28774 function readTrueTypeCollectionData(ttc, fontName) { 28775 const { 28776 numFonts, 28777 offsetTable 28778 } = readTrueTypeCollectionHeader(ttc); 28779 const fontNameParts = fontName.split("+"); 28780 let fallbackData; 28781 for (let i = 0; i < numFonts; i++) { 28782 ttc.pos = (ttc.start || 0) + offsetTable[i]; 28783 const potentialHeader = readOpenTypeHeader(ttc); 28784 const potentialTables = readTables(ttc, potentialHeader.numTables); 28785 if (!potentialTables.name) { 28786 throw new FormatError('TrueType Collection font must contain a "name" table.'); 28787 } 28788 const [nameTable] = readNameTable(potentialTables.name); 28789 for (let j = 0, jj = nameTable.length; j < jj; j++) { 28790 for (let k = 0, kk = nameTable[j].length; k < kk; k++) { 28791 const nameEntry = nameTable[j][k]?.replaceAll(/\s/g, ""); 28792 if (!nameEntry) { 28793 continue; 28794 } 28795 if (nameEntry === fontName) { 28796 return { 28797 header: potentialHeader, 28798 tables: potentialTables 28799 }; 28800 } 28801 if (fontNameParts.length < 2) { 28802 continue; 28803 } 28804 for (const part of fontNameParts) { 28805 if (nameEntry === part) { 28806 fallbackData = { 28807 name: part, 28808 header: potentialHeader, 28809 tables: potentialTables 28810 }; 28811 } 28812 } 28813 } 28814 } 28815 } 28816 if (fallbackData) { 28817 warn(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`); 28818 return { 28819 header: fallbackData.header, 28820 tables: fallbackData.tables 28821 }; 28822 } 28823 throw new FormatError(`TrueType Collection does not contain "${fontName}" font.`); 28824 } 28825 function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) { 28826 if (!cmap) { 28827 warn("No cmap table available."); 28828 return { 28829 platformId: -1, 28830 encodingId: -1, 28831 mappings: [], 28832 hasShortCmap: false 28833 }; 28834 } 28835 let segment; 28836 let start = (file.start || 0) + cmap.offset; 28837 file.pos = start; 28838 file.skip(2); 28839 const numTables = file.getUint16(); 28840 let potentialTable; 28841 let canBreak = false;
vendor: 9,409 bytes, lines 28842-29174
28842 for (let i = 0; i < numTables; i++) { 28843 const platformId = file.getUint16(); 28844 const encodingId = file.getUint16(); 28845 const offset = file.getInt32() >>> 0; 28846 let useTable = false; 28847 if (potentialTable?.platformId === platformId && potentialTable?.encodingId === encodingId) { 28848 continue; 28849 } 28850 if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) { 28851 useTable = true; 28852 } else if (platformId === 1 && encodingId === 0) { 28853 useTable = true; 28854 } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) { 28855 useTable = true; 28856 if (!isSymbolicFont) { 28857 canBreak = true; 28858 } 28859 } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { 28860 useTable = true; 28861 let correctlySorted = true; 28862 if (i < numTables - 1) { 28863 const nextBytes = file.peekBytes(2), 28864 nextPlatformId = int16(nextBytes[0], nextBytes[1]); 28865 if (nextPlatformId < platformId) { 28866 correctlySorted = false; 28867 } 28868 } 28869 if (correctlySorted) { 28870 canBreak = true; 28871 } 28872 } 28873 if (useTable) { 28874 potentialTable = { 28875 platformId, 28876 encodingId, 28877 offset 28878 }; 28879 } 28880 if (canBreak) { 28881 break; 28882 } 28883 } 28884 if (potentialTable) { 28885 file.pos = start + potentialTable.offset; 28886 } 28887 if (!potentialTable || file.peekByte() === -1) { 28888 warn("Could not find a preferred cmap table."); 28889 return { 28890 platformId: -1, 28891 encodingId: -1, 28892 mappings: [], 28893 hasShortCmap: false 28894 }; 28895 } 28896 const format = file.getUint16(); 28897 let hasShortCmap = false; 28898 const mappings = []; 28899 let j, glyphId; 28900 if (format === 0) { 28901 file.skip(2 + 2); 28902 for (j = 0; j < 256; j++) { 28903 const index = file.getByte(); 28904 if (!index) { 28905 continue; 28906 } 28907 mappings.push({ 28908 charCode: j, 28909 glyphId: index 28910 }); 28911 } 28912 hasShortCmap = true; 28913 } else if (format === 2) { 28914 file.skip(2 + 2); 28915 const subHeaderKeys = []; 28916 let maxSubHeaderKey = 0; 28917 for (let i = 0; i < 256; i++) { 28918 const subHeaderKey = file.getUint16() >> 3; 28919 subHeaderKeys.push(subHeaderKey); 28920 maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey); 28921 } 28922 const subHeaders = []; 28923 for (let i = 0; i <= maxSubHeaderKey; i++) { 28924 subHeaders.push({ 28925 firstCode: file.getUint16(), 28926 entryCount: file.getUint16(), 28927 idDelta: signedInt16(file.getByte(), file.getByte()), 28928 idRangePos: file.pos + file.getUint16() 28929 }); 28930 } 28931 for (let i = 0; i < 256; i++) { 28932 if (subHeaderKeys[i] === 0) { 28933 file.pos = subHeaders[0].idRangePos + 2 * i; 28934 glyphId = file.getUint16(); 28935 mappings.push({ 28936 charCode: i, 28937 glyphId 28938 }); 28939 } else { 28940 const s = subHeaders[subHeaderKeys[i]]; 28941 for (j = 0; j < s.entryCount; j++) { 28942 const charCode = (i << 8) + j + s.firstCode; 28943 file.pos = s.idRangePos + 2 * j; 28944 glyphId = file.getUint16(); 28945 if (glyphId !== 0) { 28946 glyphId = (glyphId + s.idDelta) % 65536; 28947 } 28948 mappings.push({ 28949 charCode, 28950 glyphId 28951 }); 28952 } 28953 } 28954 } 28955 } else if (format === 4) { 28956 file.skip(2 + 2); 28957 const segCount = file.getUint16() >> 1; 28958 file.skip(6); 28959 const segments = []; 28960 let segIndex; 28961 for (segIndex = 0; segIndex < segCount; segIndex++) { 28962 segments.push({ 28963 end: file.getUint16() 28964 }); 28965 } 28966 file.skip(2); 28967 for (segIndex = 0; segIndex < segCount; segIndex++) { 28968 segments[segIndex].start = file.getUint16(); 28969 } 28970 for (segIndex = 0; segIndex < segCount; segIndex++) { 28971 segments[segIndex].delta = file.getUint16(); 28972 } 28973 let offsetsCount = 0, 28974 offsetIndex; 28975 for (segIndex = 0; segIndex < segCount; segIndex++) { 28976 segment = segments[segIndex]; 28977 const rangeOffset = file.getUint16(); 28978 if (!rangeOffset) { 28979 segment.offsetIndex = -1; 28980 continue; 28981 } 28982 offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); 28983 segment.offsetIndex = offsetIndex; 28984 offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1); 28985 } 28986 const offsets = []; 28987 for (j = 0; j < offsetsCount; j++) { 28988 offsets.push(file.getUint16()); 28989 } 28990 for (segIndex = 0; segIndex < segCount; segIndex++) { 28991 segment = segments[segIndex]; 28992 start = segment.start; 28993 const end = segment.end; 28994 const delta = segment.delta; 28995 offsetIndex = segment.offsetIndex; 28996 for (j = start; j <= end; j++) { 28997 if (j === 0xffff) { 28998 continue; 28999 } 29000 glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; 29001 glyphId = glyphId + delta & 0xffff; 29002 mappings.push({ 29003 charCode: j, 29004 glyphId 29005 }); 29006 } 29007 } 29008 } else if (format === 6) { 29009 file.skip(2 + 2); 29010 const firstCode = file.getUint16(); 29011 const entryCount = file.getUint16(); 29012 for (j = 0; j < entryCount; j++) { 29013 glyphId = file.getUint16(); 29014 const charCode = firstCode + j; 29015 mappings.push({ 29016 charCode, 29017 glyphId 29018 }); 29019 } 29020 } else if (format === 12) { 29021 file.skip(2 + 4 + 4); 29022 const nGroups = file.getInt32() >>> 0; 29023 for (j = 0; j < nGroups; j++) { 29024 const startCharCode = file.getInt32() >>> 0; 29025 const endCharCode = file.getInt32() >>> 0; 29026 let glyphCode = file.getInt32() >>> 0; 29027 for (let charCode = startCharCode; charCode <= endCharCode; charCode++) { 29028 mappings.push({ 29029 charCode, 29030 glyphId: glyphCode++ 29031 }); 29032 } 29033 } 29034 } else { 29035 warn("cmap table has unsupported format: " + format); 29036 return { 29037 platformId: -1, 29038 encodingId: -1, 29039 mappings: [], 29040 hasShortCmap: false 29041 }; 29042 } 29043 mappings.sort(function (a, b) { 29044 return a.charCode - b.charCode; 29045 }); 29046 for (let i = 1; i < mappings.length; i++) { 29047 if (mappings[i - 1].charCode === mappings[i].charCode) { 29048 mappings.splice(i, 1); 29049 i--; 29050 } 29051 } 29052 return { 29053 platformId: potentialTable.platformId, 29054 encodingId: potentialTable.encodingId, 29055 mappings, 29056 hasShortCmap 29057 }; 29058 } 29059 function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) { 29060 if (!header) { 29061 if (metrics) { 29062 metrics.data = null; 29063 } 29064 return; 29065 } 29066 file.pos = (file.start || 0) + header.offset; 29067 file.pos += 4; 29068 file.pos += 2; 29069 file.pos += 2; 29070 file.pos += 2; 29071 file.pos += 2; 29072 file.pos += 2; 29073 file.pos += 2; 29074 file.pos += 2; 29075 file.pos += 2; 29076 file.pos += 2; 29077 const caretOffset = file.getUint16(); 29078 file.pos += 8; 29079 file.pos += 2; 29080 let numOfMetrics = file.getUint16(); 29081 if (caretOffset !== 0) { 29082 const macStyle = int16(headTable.data[44], headTable.data[45]); 29083 if (!(macStyle & 2)) { 29084 header.data[22] = 0; 29085 header.data[23] = 0; 29086 } 29087 } 29088 if (numOfMetrics > numGlyphs) { 29089 info(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs (${numGlyphs}).`); 29090 numOfMetrics = numGlyphs; 29091 header.data[34] = (numOfMetrics & 0xff00) >> 8; 29092 header.data[35] = numOfMetrics & 0x00ff; 29093 } 29094 const numOfSidebearings = numGlyphs - numOfMetrics; 29095 const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1); 29096 if (numMissing > 0) { 29097 const entries = new Uint8Array(metrics.length + numMissing * 2); 29098 entries.set(metrics.data); 29099 if (dupFirstEntry) { 29100 entries[metrics.length] = metrics.data[2]; 29101 entries[metrics.length + 1] = metrics.data[3]; 29102 } 29103 metrics.data = entries; 29104 } 29105 } 29106 function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) { 29107 const glyphProfile = { 29108 length: 0, 29109 sizeOfInstructions: 0 29110 }; 29111 if (sourceStart < 0 || sourceStart >= source.length || sourceEnd > source.length || sourceEnd - sourceStart <= 12) { 29112 return glyphProfile; 29113 } 29114 const glyf = source.subarray(sourceStart, sourceEnd); 29115 const xMin = signedInt16(glyf[2], glyf[3]); 29116 const yMin = signedInt16(glyf[4], glyf[5]); 29117 const xMax = signedInt16(glyf[6], glyf[7]); 29118 const yMax = signedInt16(glyf[8], glyf[9]); 29119 if (xMin > xMax) { 29120 writeSignedInt16(glyf, 2, xMax); 29121 writeSignedInt16(glyf, 6, xMin); 29122 } 29123 if (yMin > yMax) { 29124 writeSignedInt16(glyf, 4, yMax); 29125 writeSignedInt16(glyf, 8, yMin); 29126 } 29127 const contoursCount = signedInt16(glyf[0], glyf[1]); 29128 if (contoursCount < 0) { 29129 if (contoursCount < -1) { 29130 return glyphProfile; 29131 } 29132 dest.set(glyf, destStart); 29133 glyphProfile.length = glyf.length; 29134 return glyphProfile; 29135 } 29136 let i, 29137 j = 10, 29138 flagsCount = 0; 29139 for (i = 0; i < contoursCount; i++) { 29140 const endPoint = glyf[j] << 8 | glyf[j + 1]; 29141 flagsCount = endPoint + 1; 29142 j += 2; 29143 } 29144 const instructionsStart = j; 29145 const instructionsLength = glyf[j] << 8 | glyf[j + 1]; 29146 glyphProfile.sizeOfInstructions = instructionsLength; 29147 j += 2 + instructionsLength; 29148 const instructionsEnd = j; 29149 let coordinatesLength = 0; 29150 for (i = 0; i < flagsCount; i++) { 29151 const flag = glyf[j++]; 29152 if (flag & 0xc0) { 29153 glyf[j - 1] = flag & 0x3f; 29154 } 29155 let xLength = 2; 29156 if (flag & 2) { 29157 xLength = 1; 29158 } else if (flag & 16) { 29159 xLength = 0; 29160 } 29161 let yLength = 2; 29162 if (flag & 4) { 29163 yLength = 1; 29164 } else if (flag & 32) { 29165 yLength = 0; 29166 } 29167 const xyLength = xLength + yLength; 29168 coordinatesLength += xyLength; 29169 if (flag & 8) { 29170 const repeat = glyf[j++]; 29171 if (repeat === 0) { 29172 glyf[j - 1] ^= 8; 29173 } 29174 i += repeat;
vendor: 39,639 bytes, lines 29175-30406
29175 coordinatesLength += repeat * xyLength; 29176 } 29177 } 29178 if (coordinatesLength === 0) { 29179 return glyphProfile; 29180 } 29181 let glyphDataLength = j + coordinatesLength; 29182 if (glyphDataLength > glyf.length) { 29183 return glyphProfile; 29184 } 29185 if (!hintsValid && instructionsLength > 0) { 29186 dest.set(glyf.subarray(0, instructionsStart), destStart); 29187 dest.set([0, 0], destStart + instructionsStart); 29188 dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2); 29189 glyphDataLength -= instructionsLength; 29190 if (glyf.length - glyphDataLength > 3) { 29191 glyphDataLength = glyphDataLength + 3 & ~3; 29192 } 29193 glyphProfile.length = glyphDataLength; 29194 return glyphProfile; 29195 } 29196 if (glyf.length - glyphDataLength > 3) { 29197 glyphDataLength = glyphDataLength + 3 & ~3; 29198 dest.set(glyf.subarray(0, glyphDataLength), destStart); 29199 glyphProfile.length = glyphDataLength; 29200 return glyphProfile; 29201 } 29202 dest.set(glyf, destStart); 29203 glyphProfile.length = glyf.length; 29204 return glyphProfile; 29205 } 29206 function sanitizeHead(head, numGlyphs, locaLength) { 29207 const data = head.data; 29208 const version = int32(data[0], data[1], data[2], data[3]); 29209 if (version >> 16 !== 1) { 29210 info("Attempting to fix invalid version in head table: " + version); 29211 data[0] = 0; 29212 data[1] = 1; 29213 data[2] = 0; 29214 data[3] = 0; 29215 } 29216 const indexToLocFormat = int16(data[50], data[51]); 29217 if (indexToLocFormat < 0 || indexToLocFormat > 1) { 29218 info("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat); 29219 const numGlyphsPlusOne = numGlyphs + 1; 29220 if (locaLength === numGlyphsPlusOne << 1) { 29221 data[50] = 0; 29222 data[51] = 0; 29223 } else if (locaLength === numGlyphsPlusOne << 2) { 29224 data[50] = 0; 29225 data[51] = 1; 29226 } else { 29227 throw new FormatError("Could not fix indexToLocFormat: " + indexToLocFormat); 29228 } 29229 } 29230 } 29231 function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) { 29232 let itemSize, itemDecode, itemEncode; 29233 if (isGlyphLocationsLong) { 29234 itemSize = 4; 29235 itemDecode = function fontItemDecodeLong(data, offset) { 29236 return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; 29237 }; 29238 itemEncode = function fontItemEncodeLong(data, offset, value) { 29239 data[offset] = value >>> 24 & 0xff; 29240 data[offset + 1] = value >> 16 & 0xff; 29241 data[offset + 2] = value >> 8 & 0xff; 29242 data[offset + 3] = value & 0xff; 29243 }; 29244 } else { 29245 itemSize = 2; 29246 itemDecode = function fontItemDecode(data, offset) { 29247 return data[offset] << 9 | data[offset + 1] << 1; 29248 }; 29249 itemEncode = function fontItemEncode(data, offset, value) { 29250 data[offset] = value >> 9 & 0xff; 29251 data[offset + 1] = value >> 1 & 0xff; 29252 }; 29253 } 29254 const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs; 29255 const locaDataSize = itemSize * (1 + numGlyphsOut); 29256 const locaData = new Uint8Array(locaDataSize); 29257 locaData.set(loca.data.subarray(0, locaDataSize)); 29258 loca.data = locaData; 29259 const oldGlyfData = glyf.data; 29260 const oldGlyfDataLength = oldGlyfData.length; 29261 const newGlyfData = new Uint8Array(oldGlyfDataLength); 29262 let i, j; 29263 const locaEntries = []; 29264 for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) { 29265 let offset = itemDecode(locaData, j); 29266 if (offset > oldGlyfDataLength) { 29267 offset = oldGlyfDataLength; 29268 } 29269 locaEntries.push({ 29270 index: i, 29271 offset, 29272 endOffset: 0 29273 }); 29274 } 29275 locaEntries.sort((a, b) => a.offset - b.offset); 29276 for (i = 0; i < numGlyphs; i++) { 29277 locaEntries[i].endOffset = locaEntries[i + 1].offset; 29278 } 29279 locaEntries.sort((a, b) => a.index - b.index); 29280 for (i = 0; i < numGlyphs; i++) { 29281 const { 29282 offset, 29283 endOffset 29284 } = locaEntries[i]; 29285 if (offset !== 0 || endOffset !== 0) { 29286 break; 29287 } 29288 const nextOffset = locaEntries[i + 1].offset; 29289 if (nextOffset === 0) { 29290 continue; 29291 } 29292 locaEntries[i].endOffset = nextOffset; 29293 break; 29294 } 29295 const last = locaEntries.at(-2); 29296 if (last.offset !== 0 && last.endOffset === 0) { 29297 last.endOffset = oldGlyfDataLength; 29298 } 29299 const missingGlyphs = Object.create(null); 29300 let writeOffset = 0; 29301 itemEncode(locaData, 0, writeOffset); 29302 for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { 29303 const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); 29304 const newLength = glyphProfile.length; 29305 if (newLength === 0) { 29306 missingGlyphs[i] = true; 29307 } 29308 if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) { 29309 maxSizeOfInstructions = glyphProfile.sizeOfInstructions; 29310 } 29311 writeOffset += newLength; 29312 itemEncode(locaData, j, writeOffset); 29313 } 29314 if (writeOffset === 0) { 29315 const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); 29316 for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) { 29317 itemEncode(locaData, j, simpleGlyph.length); 29318 } 29319 glyf.data = simpleGlyph; 29320 } else if (dupFirstEntry) { 29321 const firstEntryLength = itemDecode(locaData, itemSize); 29322 if (newGlyfData.length > firstEntryLength + writeOffset) { 29323 glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); 29324 } else { 29325 glyf.data = new Uint8Array(firstEntryLength + writeOffset); 29326 glyf.data.set(newGlyfData.subarray(0, writeOffset)); 29327 } 29328 glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); 29329 itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength); 29330 } else { 29331 glyf.data = newGlyfData.subarray(0, writeOffset); 29332 } 29333 return { 29334 missingGlyphs, 29335 maxSizeOfInstructions 29336 }; 29337 } 29338 function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) { 29339 const start = (font.start || 0) + post.offset; 29340 font.pos = start; 29341 const length = post.length, 29342 end = start + length; 29343 const version = font.getInt32(); 29344 font.skip(28); 29345 let glyphNames; 29346 let valid = true; 29347 let i; 29348 switch (version) { 29349 case 0x00010000: 29350 glyphNames = MacStandardGlyphOrdering; 29351 break; 29352 case 0x00020000: 29353 const numGlyphs = font.getUint16(); 29354 if (numGlyphs !== maxpNumGlyphs) { 29355 valid = false; 29356 break; 29357 } 29358 const glyphNameIndexes = []; 29359 for (i = 0; i < numGlyphs; ++i) { 29360 const index = font.getUint16(); 29361 if (index >= 32768) { 29362 valid = false; 29363 break; 29364 } 29365 glyphNameIndexes.push(index); 29366 } 29367 if (!valid) { 29368 break; 29369 } 29370 const customNames = [], 29371 strBuf = []; 29372 while (font.pos < end) { 29373 const stringLength = font.getByte(); 29374 strBuf.length = stringLength; 29375 for (i = 0; i < stringLength; ++i) { 29376 strBuf[i] = String.fromCharCode(font.getByte()); 29377 } 29378 customNames.push(strBuf.join("")); 29379 } 29380 glyphNames = []; 29381 for (i = 0; i < numGlyphs; ++i) { 29382 const j = glyphNameIndexes[i]; 29383 if (j < 258) { 29384 glyphNames.push(MacStandardGlyphOrdering[j]); 29385 continue; 29386 } 29387 glyphNames.push(customNames[j - 258]); 29388 } 29389 break; 29390 case 0x00030000: 29391 break; 29392 default: 29393 warn("Unknown/unsupported post table version " + version); 29394 valid = false; 29395 if (propertiesObj.defaultEncoding) { 29396 glyphNames = propertiesObj.defaultEncoding; 29397 } 29398 break; 29399 } 29400 propertiesObj.glyphNames = glyphNames; 29401 return valid; 29402 } 29403 function readNameTable(nameTable) { 29404 const start = (font.start || 0) + nameTable.offset; 29405 font.pos = start; 29406 const names = [[], []], 29407 records = []; 29408 const length = nameTable.length, 29409 end = start + length; 29410 const format = font.getUint16(); 29411 const FORMAT_0_HEADER_LENGTH = 6; 29412 if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { 29413 return [names, records]; 29414 } 29415 const numRecords = font.getUint16(); 29416 const stringsStart = font.getUint16(); 29417 const NAME_RECORD_LENGTH = 12; 29418 let i, ii; 29419 for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) { 29420 const r = { 29421 platform: font.getUint16(), 29422 encoding: font.getUint16(), 29423 language: font.getUint16(), 29424 name: font.getUint16(), 29425 length: font.getUint16(), 29426 offset: font.getUint16() 29427 }; 29428 if (isMacNameRecord(r) || isWinNameRecord(r)) { 29429 records.push(r); 29430 } 29431 } 29432 for (i = 0, ii = records.length; i < ii; i++) { 29433 const record = records[i]; 29434 if (record.length <= 0) { 29435 continue; 29436 } 29437 const pos = start + stringsStart + record.offset; 29438 if (pos + record.length > end) { 29439 continue; 29440 } 29441 font.pos = pos; 29442 const nameIndex = record.name; 29443 if (record.encoding) { 29444 let str = ""; 29445 for (let j = 0, jj = record.length; j < jj; j += 2) { 29446 str += String.fromCharCode(font.getUint16()); 29447 } 29448 names[1][nameIndex] = str; 29449 } else { 29450 names[0][nameIndex] = font.getString(record.length); 29451 } 29452 } 29453 return [names, records]; 29454 } 29455 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]; 29456 function sanitizeTTProgram(table, ttContext) { 29457 let data = table.data; 29458 let i = 0, 29459 j, 29460 n, 29461 b, 29462 funcId, 29463 pc, 29464 lastEndf = 0, 29465 lastDeff = 0; 29466 const stack = []; 29467 const callstack = []; 29468 const functionsCalled = []; 29469 let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; 29470 let inFDEF = false, 29471 ifLevel = 0, 29472 inELSE = 0; 29473 for (let ii = data.length; i < ii;) { 29474 const op = data[i++]; 29475 if (op === 0x40) { 29476 n = data[i++]; 29477 if (inFDEF || inELSE) { 29478 i += n; 29479 } else { 29480 for (j = 0; j < n; j++) { 29481 stack.push(data[i++]); 29482 } 29483 } 29484 } else if (op === 0x41) { 29485 n = data[i++]; 29486 if (inFDEF || inELSE) { 29487 i += n * 2; 29488 } else { 29489 for (j = 0; j < n; j++) { 29490 b = data[i++]; 29491 stack.push(b << 8 | data[i++]); 29492 } 29493 } 29494 } else if ((op & 0xf8) === 0xb0) { 29495 n = op - 0xb0 + 1; 29496 if (inFDEF || inELSE) { 29497 i += n; 29498 } else { 29499 for (j = 0; j < n; j++) { 29500 stack.push(data[i++]); 29501 } 29502 } 29503 } else if ((op & 0xf8) === 0xb8) { 29504 n = op - 0xb8 + 1; 29505 if (inFDEF || inELSE) { 29506 i += n * 2; 29507 } else { 29508 for (j = 0; j < n; j++) { 29509 b = data[i++]; 29510 stack.push(signedInt16(b, data[i++])); 29511 } 29512 } 29513 } else if (op === 0x2b && !tooComplexToFollowFunctions) { 29514 if (!inFDEF && !inELSE) { 29515 funcId = stack.at(-1); 29516 if (isNaN(funcId)) { 29517 info("TT: CALL empty stack (or invalid entry)."); 29518 } else { 29519 ttContext.functionsUsed[funcId] = true; 29520 if (funcId in ttContext.functionsStackDeltas) { 29521 const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId]; 29522 if (newStackLength < 0) { 29523 warn("TT: CALL invalid functions stack delta."); 29524 ttContext.hintsValid = false; 29525 return; 29526 } 29527 stack.length = newStackLength; 29528 } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) { 29529 callstack.push({ 29530 data, 29531 i, 29532 stackTop: stack.length - 1 29533 }); 29534 functionsCalled.push(funcId); 29535 pc = ttContext.functionsDefined[funcId]; 29536 if (!pc) { 29537 warn("TT: CALL non-existent function"); 29538 ttContext.hintsValid = false; 29539 return; 29540 } 29541 data = pc.data; 29542 i = pc.i; 29543 } 29544 } 29545 } 29546 } else if (op === 0x2c && !tooComplexToFollowFunctions) { 29547 if (inFDEF || inELSE) { 29548 warn("TT: nested FDEFs not allowed"); 29549 tooComplexToFollowFunctions = true; 29550 } 29551 inFDEF = true; 29552 lastDeff = i; 29553 funcId = stack.pop(); 29554 ttContext.functionsDefined[funcId] = { 29555 data, 29556 i 29557 }; 29558 } else if (op === 0x2d) { 29559 if (inFDEF) { 29560 inFDEF = false; 29561 lastEndf = i; 29562 } else { 29563 pc = callstack.pop(); 29564 if (!pc) { 29565 warn("TT: ENDF bad stack"); 29566 ttContext.hintsValid = false; 29567 return; 29568 } 29569 funcId = functionsCalled.pop(); 29570 data = pc.data; 29571 i = pc.i; 29572 ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; 29573 } 29574 } else if (op === 0x89) { 29575 if (inFDEF || inELSE) { 29576 warn("TT: nested IDEFs not allowed"); 29577 tooComplexToFollowFunctions = true; 29578 } 29579 inFDEF = true; 29580 lastDeff = i; 29581 } else if (op === 0x58) { 29582 ++ifLevel; 29583 } else if (op === 0x1b) { 29584 inELSE = ifLevel; 29585 } else if (op === 0x59) { 29586 if (inELSE === ifLevel) { 29587 inELSE = 0; 29588 } 29589 --ifLevel; 29590 } else if (op === 0x1c) { 29591 if (!inFDEF && !inELSE) { 29592 const offset = stack.at(-1); 29593 if (offset > 0) { 29594 i += offset - 1; 29595 } 29596 } 29597 } 29598 if (!inFDEF && !inELSE) { 29599 let stackDelta = 0; 29600 if (op <= 0x8e) { 29601 stackDelta = TTOpsStackDeltas[op]; 29602 } else if (op >= 0xc0 && op <= 0xdf) { 29603 stackDelta = -1; 29604 } else if (op >= 0xe0) { 29605 stackDelta = -2; 29606 } 29607 if (op >= 0x71 && op <= 0x75) { 29608 n = stack.pop(); 29609 if (!isNaN(n)) { 29610 stackDelta = -n * 2; 29611 } 29612 } 29613 while (stackDelta < 0 && stack.length > 0) { 29614 stack.pop(); 29615 stackDelta++; 29616 } 29617 while (stackDelta > 0) { 29618 stack.push(NaN); 29619 stackDelta--; 29620 } 29621 } 29622 } 29623 ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; 29624 const content = [data]; 29625 if (i > data.length) { 29626 content.push(new Uint8Array(i - data.length)); 29627 } 29628 if (lastDeff > lastEndf) { 29629 warn("TT: complementing a missing function tail"); 29630 content.push(new Uint8Array([0x22, 0x2d])); 29631 } 29632 foldTTTable(table, content); 29633 } 29634 function checkInvalidFunctions(ttContext, maxFunctionDefs) { 29635 if (ttContext.tooComplexToFollowFunctions) { 29636 return; 29637 } 29638 if (ttContext.functionsDefined.length > maxFunctionDefs) { 29639 warn("TT: more functions defined than expected"); 29640 ttContext.hintsValid = false; 29641 return; 29642 } 29643 for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { 29644 if (j > maxFunctionDefs) { 29645 warn("TT: invalid function id: " + j); 29646 ttContext.hintsValid = false; 29647 return; 29648 } 29649 if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { 29650 warn("TT: undefined function: " + j); 29651 ttContext.hintsValid = false; 29652 return; 29653 } 29654 } 29655 } 29656 function foldTTTable(table, content) { 29657 if (content.length > 1) { 29658 let newLength = 0; 29659 let j, jj; 29660 for (j = 0, jj = content.length; j < jj; j++) { 29661 newLength += content[j].length; 29662 } 29663 newLength = newLength + 3 & ~3; 29664 const result = new Uint8Array(newLength); 29665 let pos = 0; 29666 for (j = 0, jj = content.length; j < jj; j++) { 29667 result.set(content[j], pos); 29668 pos += content[j].length; 29669 } 29670 table.data = result; 29671 table.length = newLength; 29672 } 29673 } 29674 function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { 29675 const ttContext = { 29676 functionsDefined: [], 29677 functionsUsed: [], 29678 functionsStackDeltas: [], 29679 tooComplexToFollowFunctions: false, 29680 hintsValid: true 29681 }; 29682 if (fpgm) { 29683 sanitizeTTProgram(fpgm, ttContext); 29684 } 29685 if (prep) { 29686 sanitizeTTProgram(prep, ttContext); 29687 } 29688 if (fpgm) { 29689 checkInvalidFunctions(ttContext, maxFunctionDefs); 29690 } 29691 if (cvt && cvt.length & 1) { 29692 const cvtData = new Uint8Array(cvt.length + 1); 29693 cvtData.set(cvt.data); 29694 cvt.data = cvtData; 29695 } 29696 return ttContext.hintsValid; 29697 } 29698 font = new Stream(new Uint8Array(font.getBytes())); 29699 let header, tables; 29700 if (isTrueTypeCollectionFile(font)) { 29701 const ttcData = readTrueTypeCollectionData(font, this.name); 29702 header = ttcData.header; 29703 tables = ttcData.tables; 29704 } else { 29705 header = readOpenTypeHeader(font); 29706 tables = readTables(font, header.numTables); 29707 } 29708 let cff, cffFile; 29709 const isTrueType = !tables["CFF "]; 29710 if (!isTrueType) { 29711 const isComposite = properties.composite && (properties.cidToGidMap?.length > 0 || !(properties.cMap instanceof IdentityCMap)); 29712 if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { 29713 cffFile = new Stream(tables["CFF "].data); 29714 cff = new CFFFont(cffFile, properties); 29715 adjustWidths(properties); 29716 return this.convert(name, cff, properties); 29717 } 29718 delete tables.glyf; 29719 delete tables.loca; 29720 delete tables.fpgm; 29721 delete tables.prep; 29722 delete tables["cvt "]; 29723 this.isOpenType = true; 29724 } else { 29725 if (!tables.loca) { 29726 throw new FormatError('Required "loca" table is not found'); 29727 } 29728 if (!tables.glyf) { 29729 warn('Required "glyf" table is not found -- trying to recover.'); 29730 tables.glyf = { 29731 tag: "glyf", 29732 data: new Uint8Array(0) 29733 }; 29734 } 29735 this.isOpenType = false; 29736 } 29737 if (!tables.maxp) { 29738 throw new FormatError('Required "maxp" table is not found'); 29739 } 29740 font.pos = (font.start || 0) + tables.maxp.offset; 29741 let version = font.getInt32(); 29742 const numGlyphs = font.getUint16(); 29743 if (version !== 0x00010000 && version !== 0x00005000) { 29744 if (tables.maxp.length === 6) { 29745 version = 0x0005000; 29746 } else if (tables.maxp.length >= 32) { 29747 version = 0x00010000; 29748 } else { 29749 throw new FormatError(`"maxp" table has a wrong version number`); 29750 } 29751 writeUint32(tables.maxp.data, 0, version); 29752 } 29753 if (properties.scaleFactors?.length === numGlyphs && isTrueType) { 29754 const { 29755 scaleFactors 29756 } = properties; 29757 const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); 29758 const glyphs = new GlyfTable({ 29759 glyfTable: tables.glyf.data, 29760 isGlyphLocationsLong, 29761 locaTable: tables.loca.data, 29762 numGlyphs 29763 }); 29764 glyphs.scale(scaleFactors); 29765 const { 29766 glyf, 29767 loca, 29768 isLocationLong 29769 } = glyphs.write(); 29770 tables.glyf.data = glyf; 29771 tables.loca.data = loca; 29772 if (isLocationLong !== !!isGlyphLocationsLong) { 29773 tables.head.data[50] = 0; 29774 tables.head.data[51] = isLocationLong ? 1 : 0; 29775 } 29776 const metrics = tables.hmtx.data; 29777 for (let i = 0; i < numGlyphs; i++) { 29778 const j = 4 * i; 29779 const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1])); 29780 metrics[j] = advanceWidth >> 8 & 0xff; 29781 metrics[j + 1] = advanceWidth & 0xff; 29782 const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3])); 29783 writeSignedInt16(metrics, j + 2, lsb); 29784 } 29785 } 29786 let numGlyphsOut = numGlyphs + 1; 29787 let dupFirstEntry = true; 29788 if (numGlyphsOut > 0xffff) { 29789 dupFirstEntry = false; 29790 numGlyphsOut = numGlyphs; 29791 warn("Not enough space in glyfs to duplicate first glyph."); 29792 } 29793 let maxFunctionDefs = 0; 29794 let maxSizeOfInstructions = 0; 29795 if (version >= 0x00010000 && tables.maxp.length >= 32) { 29796 font.pos += 8; 29797 const maxZones = font.getUint16(); 29798 if (maxZones > 2) { 29799 tables.maxp.data[14] = 0; 29800 tables.maxp.data[15] = 2; 29801 } 29802 font.pos += 4; 29803 maxFunctionDefs = font.getUint16(); 29804 font.pos += 4; 29805 maxSizeOfInstructions = font.getUint16(); 29806 } 29807 tables.maxp.data[4] = numGlyphsOut >> 8; 29808 tables.maxp.data[5] = numGlyphsOut & 255; 29809 const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs); 29810 if (!hintsValid) { 29811 delete tables.fpgm; 29812 delete tables.prep; 29813 delete tables["cvt "]; 29814 } 29815 sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry); 29816 if (!tables.head) { 29817 throw new FormatError('Required "head" table is not found'); 29818 } 29819 sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); 29820 let missingGlyphs = Object.create(null); 29821 if (isTrueType) { 29822 const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); 29823 const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions); 29824 missingGlyphs = glyphsInfo.missingGlyphs; 29825 if (version >= 0x00010000 && tables.maxp.length >= 32) { 29826 tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8; 29827 tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255; 29828 } 29829 } 29830 if (!tables.hhea) { 29831 throw new FormatError('Required "hhea" table is not found'); 29832 } 29833 if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { 29834 tables.hhea.data[10] = 0xff; 29835 tables.hhea.data[11] = 0xff; 29836 } 29837 const metricsOverride = { 29838 unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), 29839 yMax: signedInt16(tables.head.data[42], tables.head.data[43]), 29840 yMin: signedInt16(tables.head.data[38], tables.head.data[39]), 29841 ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]), 29842 descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]), 29843 lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9]) 29844 }; 29845 this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; 29846 this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; 29847 this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm; 29848 if (this.cssFontInfo?.lineHeight) { 29849 this.lineHeight = this.cssFontInfo.metrics.lineHeight; 29850 this.lineGap = this.cssFontInfo.metrics.lineGap; 29851 } else { 29852 this.lineHeight = this.ascent - this.descent + this.lineGap; 29853 } 29854 if (tables.post) { 29855 readPostScriptTable(tables.post, properties, numGlyphs); 29856 } 29857 tables.post = { 29858 tag: "post", 29859 data: createPostTable(properties) 29860 }; 29861 const charCodeToGlyphId = Object.create(null); 29862 function hasGlyph(glyphId) { 29863 return !missingGlyphs[glyphId]; 29864 } 29865 if (properties.composite) { 29866 const cidToGidMap = properties.cidToGidMap || []; 29867 const isCidToGidMapEmpty = cidToGidMap.length === 0; 29868 properties.cMap.forEach(function (charCode, cid) { 29869 if (typeof cid === "string") { 29870 cid = convertCidString(charCode, cid, true); 29871 } 29872 if (cid > 0xffff) { 29873 throw new FormatError("Max size of CID is 65,535"); 29874 } 29875 let glyphId = -1; 29876 if (isCidToGidMapEmpty) { 29877 glyphId = cid; 29878 } else if (cidToGidMap[cid] !== undefined) { 29879 glyphId = cidToGidMap[cid]; 29880 } 29881 if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) { 29882 charCodeToGlyphId[charCode] = glyphId; 29883 } 29884 }); 29885 } else { 29886 const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding); 29887 const cmapPlatformId = cmapTable.platformId; 29888 const cmapEncodingId = cmapTable.encodingId; 29889 const cmapMappings = cmapTable.mappings; 29890 let baseEncoding = [], 29891 forcePostTable = false; 29892 if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) { 29893 baseEncoding = getEncoding(properties.baseEncodingName); 29894 } 29895 if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) { 29896 const glyphsUnicodeMap = getGlyphsUnicode(); 29897 for (let charCode = 0; charCode < 256; charCode++) { 29898 let glyphName; 29899 if (this.differences[charCode] !== undefined) { 29900 glyphName = this.differences[charCode]; 29901 } else if (baseEncoding.length && baseEncoding[charCode] !== "") { 29902 glyphName = baseEncoding[charCode]; 29903 } else { 29904 glyphName = StandardEncoding[charCode]; 29905 } 29906 if (!glyphName) { 29907 continue; 29908 } 29909 const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); 29910 let unicodeOrCharCode; 29911 if (cmapPlatformId === 3 && cmapEncodingId === 1) { 29912 unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; 29913 } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { 29914 unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); 29915 } 29916 if (unicodeOrCharCode === undefined) { 29917 if (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap)) { 29918 const unicode = this.toUnicode.get(charCode); 29919 if (unicode) { 29920 unicodeOrCharCode = unicode.codePointAt(0); 29921 } 29922 } 29923 if (unicodeOrCharCode === undefined) { 29924 continue; 29925 } 29926 } 29927 for (const mapping of cmapMappings) { 29928 if (mapping.charCode !== unicodeOrCharCode) { 29929 continue; 29930 } 29931 charCodeToGlyphId[charCode] = mapping.glyphId; 29932 break; 29933 } 29934 } 29935 } else if (cmapPlatformId === 0) { 29936 for (const mapping of cmapMappings) { 29937 charCodeToGlyphId[mapping.charCode] = mapping.glyphId; 29938 } 29939 forcePostTable = true; 29940 } else if (cmapPlatformId === 3 && cmapEncodingId === 0) { 29941 for (const mapping of cmapMappings) { 29942 let charCode = mapping.charCode; 29943 if (charCode >= 0xf000 && charCode <= 0xf0ff) { 29944 charCode &= 0xff; 29945 } 29946 charCodeToGlyphId[charCode] = mapping.glyphId; 29947 } 29948 } else { 29949 for (const mapping of cmapMappings) { 29950 charCodeToGlyphId[mapping.charCode] = mapping.glyphId; 29951 } 29952 } 29953 if (properties.glyphNames && (baseEncoding.length || this.differences.length)) { 29954 for (let i = 0; i < 256; ++i) { 29955 if (!forcePostTable && charCodeToGlyphId[i] !== undefined) { 29956 continue; 29957 } 29958 const glyphName = this.differences[i] || baseEncoding[i]; 29959 if (!glyphName) { 29960 continue; 29961 } 29962 const glyphId = properties.glyphNames.indexOf(glyphName); 29963 if (glyphId > 0 && hasGlyph(glyphId)) { 29964 charCodeToGlyphId[i] = glyphId; 29965 } 29966 } 29967 } 29968 } 29969 if (charCodeToGlyphId.length === 0) { 29970 charCodeToGlyphId[0] = 0; 29971 } 29972 let glyphZeroId = numGlyphsOut - 1; 29973 if (!dupFirstEntry) { 29974 glyphZeroId = 0; 29975 } 29976 if (!properties.cssFontInfo) { 29977 const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode); 29978 this.toFontChar = newMapping.toFontChar; 29979 tables.cmap = { 29980 tag: "cmap", 29981 data: createCmapTable(newMapping.charCodeToGlyphId, newMapping.toUnicodeExtraMap, numGlyphsOut) 29982 }; 29983 if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) { 29984 tables["OS/2"] = { 29985 tag: "OS/2", 29986 data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride) 29987 }; 29988 } 29989 } 29990 if (!isTrueType) { 29991 try { 29992 cffFile = new Stream(tables["CFF "].data); 29993 const parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED); 29994 cff = parser.parse(); 29995 cff.duplicateFirstGlyph(); 29996 const compiler = new CFFCompiler(cff); 29997 tables["CFF "].data = compiler.compile(); 29998 } catch { 29999 warn("Failed to compile font " + properties.loadedName); 30000 } 30001 } 30002 if (!tables.name) { 30003 tables.name = { 30004 tag: "name", 30005 data: createNameTable(this.name) 30006 }; 30007 } else { 30008 const [namePrototype, nameRecords] = readNameTable(tables.name); 30009 tables.name.data = createNameTable(name, namePrototype); 30010 this.psName = namePrototype[0][6] || null; 30011 if (!properties.composite) { 30012 adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords); 30013 } 30014 } 30015 const builder = new OpenTypeFileBuilder(header.version); 30016 for (const tableTag in tables) { 30017 builder.addTable(tableTag, tables[tableTag].data); 30018 } 30019 return builder.toArray(); 30020 } 30021 convert(fontName, font, properties) { 30022 properties.fixedPitch = false; 30023 if (properties.builtInEncoding) { 30024 adjustType1ToUnicode(properties, properties.builtInEncoding); 30025 } 30026 let glyphZeroId = 1; 30027 if (font instanceof CFFFont) { 30028 glyphZeroId = font.numGlyphs - 1; 30029 } 30030 const mapping = font.getGlyphMapping(properties); 30031 let newMapping = null; 30032 let newCharCodeToGlyphId = mapping; 30033 let toUnicodeExtraMap = null; 30034 if (!properties.cssFontInfo) { 30035 newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId, this.toUnicode); 30036 this.toFontChar = newMapping.toFontChar; 30037 newCharCodeToGlyphId = newMapping.charCodeToGlyphId; 30038 toUnicodeExtraMap = newMapping.toUnicodeExtraMap; 30039 } 30040 const numGlyphs = font.numGlyphs; 30041 function getCharCodes(charCodeToGlyphId, glyphId) { 30042 let charCodes = null; 30043 for (const charCode in charCodeToGlyphId) { 30044 if (glyphId === charCodeToGlyphId[charCode]) { 30045 (charCodes ||= []).push(charCode | 0); 30046 } 30047 } 30048 return charCodes; 30049 } 30050 function createCharCode(charCodeToGlyphId, glyphId) { 30051 for (const charCode in charCodeToGlyphId) { 30052 if (glyphId === charCodeToGlyphId[charCode]) { 30053 return charCode | 0; 30054 } 30055 } 30056 newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId; 30057 return newMapping.nextAvailableFontCharCode++; 30058 } 30059 const seacs = font.seacs; 30060 if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) { 30061 const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; 30062 const charset = font.getCharset(); 30063 const seacMap = Object.create(null); 30064 for (let glyphId in seacs) { 30065 glyphId |= 0; 30066 const seac = seacs[glyphId]; 30067 const baseGlyphName = StandardEncoding[seac[2]]; 30068 const accentGlyphName = StandardEncoding[seac[3]]; 30069 const baseGlyphId = charset.indexOf(baseGlyphName); 30070 const accentGlyphId = charset.indexOf(accentGlyphName); 30071 if (baseGlyphId < 0 || accentGlyphId < 0) { 30072 continue; 30073 } 30074 const accentOffset = { 30075 x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], 30076 y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] 30077 }; 30078 const charCodes = getCharCodes(mapping, glyphId); 30079 if (!charCodes) { 30080 continue; 30081 } 30082 for (const charCode of charCodes) { 30083 const charCodeToGlyphId = newMapping.charCodeToGlyphId; 30084 const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); 30085 const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); 30086 seacMap[charCode] = { 30087 baseFontCharCode, 30088 accentFontCharCode, 30089 accentOffset 30090 }; 30091 } 30092 } 30093 properties.seacMap = seacMap; 30094 } 30095 const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000; 30096 const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F"); 30097 builder.addTable("CFF ", font.data); 30098 builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); 30099 builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs)); 30100 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"); 30101 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)); 30102 builder.addTable("hmtx", function fontFieldsHmtx() { 30103 const charstrings = font.charstrings; 30104 const cffWidths = font.cff ? font.cff.widths : null; 30105 let hmtx = "\x00\x00\x00\x00"; 30106 for (let i = 1, ii = numGlyphs; i < ii; i++) { 30107 let width = 0; 30108 if (charstrings) { 30109 const charstring = charstrings[i - 1]; 30110 width = "width" in charstring ? charstring.width : 0; 30111 } else if (cffWidths) { 30112 width = Math.ceil(cffWidths[i] || 0); 30113 } 30114 hmtx += string16(width) + string16(0); 30115 } 30116 return hmtx; 30117 }()); 30118 builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs)); 30119 builder.addTable("name", createNameTable(fontName)); 30120 builder.addTable("post", createPostTable(properties)); 30121 return builder.toArray(); 30122 } 30123 get _spaceWidth() { 30124 const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; 30125 let width; 30126 for (const glyphName of possibleSpaceReplacements) { 30127 if (glyphName in this.widths) { 30128 width = this.widths[glyphName]; 30129 break; 30130 } 30131 const glyphsUnicodeMap = getGlyphsUnicode(); 30132 const glyphUnicode = glyphsUnicodeMap[glyphName]; 30133 let charcode = 0; 30134 if (this.composite && this.cMap.contains(glyphUnicode)) { 30135 charcode = this.cMap.lookup(glyphUnicode); 30136 if (typeof charcode === "string") { 30137 charcode = convertCidString(glyphUnicode, charcode); 30138 } 30139 } 30140 if (!charcode && this.toUnicode) { 30141 charcode = this.toUnicode.charCodeOf(glyphUnicode); 30142 } 30143 if (charcode <= 0) { 30144 charcode = glyphUnicode; 30145 } 30146 width = this.widths[charcode]; 30147 if (width) { 30148 break; 30149 } 30150 } 30151 return shadow(this, "_spaceWidth", width || this.defaultWidth); 30152 } 30153 _charToGlyph(charcode, isSpace = false) { 30154 let glyph = this._glyphCache[charcode]; 30155 if (glyph?.isSpace === isSpace) { 30156 return glyph; 30157 } 30158 let fontCharCode, width, operatorListId; 30159 let widthCode = charcode; 30160 if (this.cMap?.contains(charcode)) { 30161 widthCode = this.cMap.lookup(charcode); 30162 if (typeof widthCode === "string") { 30163 widthCode = convertCidString(charcode, widthCode); 30164 } 30165 } 30166 width = this.widths[widthCode]; 30167 if (typeof width !== "number") { 30168 width = this.defaultWidth; 30169 } 30170 const vmetric = this.vmetrics?.[widthCode]; 30171 let unicode = this.toUnicode.get(charcode) || charcode; 30172 if (typeof unicode === "number") { 30173 unicode = String.fromCharCode(unicode); 30174 } 30175 let isInFont = this.toFontChar[charcode] !== undefined; 30176 fontCharCode = this.toFontChar[charcode] || charcode; 30177 if (this.missingFile) { 30178 const glyphName = this.differences[charcode] || this.defaultEncoding[charcode]; 30179 if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { 30180 fontCharCode = 0x20; 30181 if (glyphName === "") { 30182 width ||= this._spaceWidth; 30183 unicode = String.fromCharCode(fontCharCode); 30184 } 30185 } 30186 fontCharCode = mapSpecialUnicodeValues(fontCharCode); 30187 } 30188 if (this.isType3Font) { 30189 operatorListId = fontCharCode; 30190 } 30191 let accent = null; 30192 if (this.seacMap?.[charcode]) { 30193 isInFont = true; 30194 const seac = this.seacMap[charcode]; 30195 fontCharCode = seac.baseFontCharCode; 30196 accent = { 30197 fontChar: String.fromCodePoint(seac.accentFontCharCode), 30198 offset: seac.accentOffset 30199 }; 30200 } 30201 let fontChar = ""; 30202 if (typeof fontCharCode === "number") { 30203 if (fontCharCode <= 0x10ffff) { 30204 fontChar = String.fromCodePoint(fontCharCode); 30205 } else { 30206 warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); 30207 } 30208 } 30209 if (this.missingFile && this.vertical && fontChar.length === 1) { 30210 const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)]; 30211 if (vertical) { 30212 fontChar = unicode = String.fromCharCode(vertical); 30213 } 30214 } 30215 glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); 30216 return this._glyphCache[charcode] = glyph; 30217 } 30218 charsToGlyphs(chars) { 30219 let glyphs = this._charsCache[chars]; 30220 if (glyphs) { 30221 return glyphs; 30222 } 30223 glyphs = []; 30224 if (this.cMap) { 30225 const c = Object.create(null), 30226 ii = chars.length; 30227 let i = 0; 30228 while (i < ii) { 30229 this.cMap.readCharCode(chars, i, c); 30230 const { 30231 charcode, 30232 length 30233 } = c; 30234 i += length; 30235 const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20); 30236 glyphs.push(glyph); 30237 } 30238 } else { 30239 for (let i = 0, ii = chars.length; i < ii; ++i) { 30240 const charcode = chars.charCodeAt(i); 30241 const glyph = this._charToGlyph(charcode, charcode === 0x20); 30242 glyphs.push(glyph); 30243 } 30244 } 30245 return this._charsCache[chars] = glyphs; 30246 } 30247 getCharPositions(chars) { 30248 const positions = []; 30249 if (this.cMap) { 30250 const c = Object.create(null); 30251 let i = 0; 30252 while (i < chars.length) { 30253 this.cMap.readCharCode(chars, i, c); 30254 const length = c.length; 30255 positions.push([i, i + length]); 30256 i += length; 30257 } 30258 } else { 30259 for (let i = 0, ii = chars.length; i < ii; ++i) { 30260 positions.push([i, i + 1]); 30261 } 30262 } 30263 return positions; 30264 } 30265 get glyphCacheValues() { 30266 return Object.values(this._glyphCache); 30267 } 30268 encodeString(str) { 30269 const buffers = []; 30270 const currentBuf = []; 30271 const hasCurrentBufErrors = () => buffers.length % 2 === 1; 30272 const getCharCode = this.toUnicode instanceof IdentityToUnicodeMap ? unicode => this.toUnicode.charCodeOf(unicode) : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode)); 30273 for (let i = 0, ii = str.length; i < ii; i++) { 30274 const unicode = str.codePointAt(i); 30275 if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) { 30276 i++; 30277 } 30278 if (this.toUnicode) { 30279 const charCode = getCharCode(unicode); 30280 if (charCode !== -1) { 30281 if (hasCurrentBufErrors()) { 30282 buffers.push(currentBuf.join("")); 30283 currentBuf.length = 0; 30284 } 30285 const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1; 30286 for (let j = charCodeLength - 1; j >= 0; j--) { 30287 currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff)); 30288 } 30289 continue; 30290 } 30291 } 30292 if (!hasCurrentBufErrors()) { 30293 buffers.push(currentBuf.join("")); 30294 currentBuf.length = 0; 30295 } 30296 currentBuf.push(String.fromCodePoint(unicode)); 30297 } 30298 buffers.push(currentBuf.join("")); 30299 return buffers; 30300 } 30301} 30302class ErrorFont { 30303 constructor(error) { 30304 this.error = error; 30305 this.loadedName = "g_font_error"; 30306 this.missingFile = true; 30307 } 30308 charsToGlyphs() { 30309 return []; 30310 } 30311 encodeString(chars) { 30312 return [chars]; 30313 } 30314 exportData(extraProperties = false) { 30315 return { 30316 error: this.error 30317 }; 30318 } 30319} 30320 30321;// ./src/core/pattern.js 30322 30323 30324 30325 30326 30327 30328 30329 30330 30331 30332 30333const ShadingType = { 30334 FUNCTION_BASED: 1, 30335 AXIAL: 2, 30336 RADIAL: 3, 30337 FREE_FORM_MESH: 4, 30338 LATTICE_FORM_MESH: 5, 30339 COONS_PATCH_MESH: 6, 30340 TENSOR_PATCH_MESH: 7 30341}; 30342class Pattern { 30343 constructor() { 30344 unreachable("Cannot initialize Pattern."); 30345 } 30346 static parseShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache) { 30347 const dict = shading instanceof BaseStream ? shading.dict : shading; 30348 const type = dict.get("ShadingType"); 30349 try { 30350 switch (type) { 30351 case ShadingType.AXIAL: 30352 case ShadingType.RADIAL: 30353 return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, localColorSpaceCache); 30354 case ShadingType.FREE_FORM_MESH: 30355 case ShadingType.LATTICE_FORM_MESH: 30356 case ShadingType.COONS_PATCH_MESH: 30357 case ShadingType.TENSOR_PATCH_MESH: 30358 return new MeshShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache); 30359 default: 30360 throw new FormatError("Unsupported ShadingType: " + type); 30361 } 30362 } catch (ex) { 30363 if (ex instanceof MissingDataException) { 30364 throw ex; 30365 } 30366 warn(ex); 30367 return new DummyShading(); 30368 } 30369 } 30370} 30371class BaseShading { 30372 static SMALL_NUMBER = 1e-6; 30373 getIR() { 30374 unreachable("Abstract method `getIR` called."); 30375 } 30376} 30377class RadialAxialShading extends BaseShading { 30378 constructor(dict, xref, resources, pdfFunctionFactory, localColorSpaceCache) { 30379 super(); 30380 this.shadingType = dict.get("ShadingType"); 30381 let coordsLen = 0; 30382 if (this.shadingType === ShadingType.AXIAL) { 30383 coordsLen = 4; 30384 } else if (this.shadingType === ShadingType.RADIAL) { 30385 coordsLen = 6; 30386 } 30387 this.coordsArr = dict.getArray("Coords"); 30388 if (!isNumberArray(this.coordsArr, coordsLen)) { 30389 throw new FormatError("RadialAxialShading: Invalid /Coords array."); 30390 } 30391 const cs = ColorSpace.parse({ 30392 cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), 30393 xref, 30394 resources, 30395 pdfFunctionFactory, 30396 localColorSpaceCache 30397 }); 30398 this.bbox = lookupNormalRect(dict.getArray("BBox"), null); 30399 let t0 = 0.0, 30400 t1 = 1.0; 30401 const domainArr = dict.getArray("Domain"); 30402 if (isNumberArray(domainArr, 2)) { 30403 [t0, t1] = domainArr; 30404 } 30405 let extendStart = false, 30406 extendEnd = false;
30407 const extendArr = dict.getArray("Extend"); 30408 if (isBooleanArray(extendArr, 2)) { 30409 [extendStart, extendEnd] = extendArr; 30410 } 30411 if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { 30412 const [x1, y1, r1, x2, y2, r2] = this.coordsArr; 30413 const distance = Math.hypot(x1 - x2, y1 - y2); 30414 if (r1 <= r2 + distance && r2 <= r1 + distance) { 30415 warn("Unsupported radial gradient."); 30416 } 30417 } 30418 this.extendStart = extendStart; 30419 this.extendEnd = extendEnd; 30420 const fnObj = dict.getRaw("Function"); 30421 const fn = pdfFunctionFactory.createFromArray(fnObj); 30422 const NUMBER_OF_SAMPLES = 840; 30423 const step = (t1 - t0) / NUMBER_OF_SAMPLES; 30424 const colorStops = this.colorStops = []; 30425 if (t0 >= t1 || step <= 0) { 30426 info("Bad shading domain."); 30427 return; 30428 } 30429 const color = new Float32Array(cs.numComps), 30430 ratio = new Float32Array(1); 30431 let rgbColor; 30432 let iBase = 0; 30433 ratio[0] = t0; 30434 fn(ratio, 0, color, 0); 30435 let rgbBase = cs.getRgb(color, 0); 30436 const cssColorBase = Util.makeHexColor(rgbBase[0], rgbBase[1], rgbBase[2]); 30437 colorStops.push([0, cssColorBase]); 30438 let iPrev = 1; 30439 ratio[0] = t0 + step; 30440 fn(ratio, 0, color, 0); 30441 let rgbPrev = cs.getRgb(color, 0); 30442 let maxSlopeR = rgbPrev[0] - rgbBase[0] + 1; 30443 let maxSlopeG = rgbPrev[1] - rgbBase[1] + 1; 30444 let maxSlopeB = rgbPrev[2] - rgbBase[2] + 1; 30445 let minSlopeR = rgbPrev[0] - rgbBase[0] - 1; 30446 let minSlopeG = rgbPrev[1] - rgbBase[1] - 1; 30447 let minSlopeB = rgbPrev[2] - rgbBase[2] - 1; 30448 for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { 30449 ratio[0] = t0 + i * step; 30450 fn(ratio, 0, color, 0); 30451 rgbColor = cs.getRgb(color, 0); 30452 const run = i - iBase; 30453 maxSlopeR = Math.min(maxSlopeR, (rgbColor[0] - rgbBase[0] + 1) / run); 30454 maxSlopeG = Math.min(maxSlopeG, (rgbColor[1] - rgbBase[1] + 1) / run); 30455 maxSlopeB = Math.min(maxSlopeB, (rgbColor[2] - rgbBase[2] + 1) / run); 30456 minSlopeR = Math.max(minSlopeR, (rgbColor[0] - rgbBase[0] - 1) / run); 30457 minSlopeG = Math.max(minSlopeG, (rgbColor[1] - rgbBase[1] - 1) / run); 30458 minSlopeB = Math.max(minSlopeB, (rgbColor[2] - rgbBase[2] - 1) / run); 30459 const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB; 30460 if (!slopesExist) { 30461 const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); 30462 colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); 30463 maxSlopeR = rgbColor[0] - rgbPrev[0] + 1; 30464 maxSlopeG = rgbColor[1] - rgbPrev[1] + 1; 30465 maxSlopeB = rgbColor[2] - rgbPrev[2] + 1; 30466 minSlopeR = rgbColor[0] - rgbPrev[0] - 1; 30467 minSlopeG = rgbColor[1] - rgbPrev[1] - 1; 30468 minSlopeB = rgbColor[2] - rgbPrev[2] - 1; 30469 iBase = iPrev; 30470 rgbBase = rgbPrev; 30471 } 30472 iPrev = i; 30473 rgbPrev = rgbColor; 30474 } 30475 const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); 30476 colorStops.push([1, cssColor]); 30477 let background = "transparent";
30478 if (dict.has("Background")) { 30479 rgbColor = cs.getRgb(dict.get("Background"), 0); 30480 background = Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]); 30481 } 30482 if (!extendStart) { 30483 colorStops.unshift([0, background]); 30484 colorStops[1][0] += BaseShading.SMALL_NUMBER; 30485 } 30486 if (!extendEnd) { 30487 colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; 30488 colorStops.push([1, background]); 30489 } 30490 this.colorStops = colorStops; 30491 } 30492 getIR() { 30493 const { 30494 coordsArr, 30495 shadingType 30496 } = this; 30497 let type, p0, p1, r0, r1; 30498 if (shadingType === ShadingType.AXIAL) { 30499 p0 = [coordsArr[0], coordsArr[1]]; 30500 p1 = [coordsArr[2], coordsArr[3]]; 30501 r0 = null; 30502 r1 = null; 30503 type = "axial"; 30504 } else if (shadingType === ShadingType.RADIAL) { 30505 p0 = [coordsArr[0], coordsArr[1]]; 30506 p1 = [coordsArr[3], coordsArr[4]]; 30507 r0 = coordsArr[2]; 30508 r1 = coordsArr[5]; 30509 type = "radial"; 30510 } else { 30511 unreachable(`getPattern type unknown: ${shadingType}`); 30512 } 30513 return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; 30514 } 30515} 30516class MeshStreamReader { 30517 constructor(stream, context) { 30518 this.stream = stream; 30519 this.context = context; 30520 this.buffer = 0; 30521 this.bufferLength = 0; 30522 const numComps = context.numComps; 30523 this.tmpCompsBuf = new Float32Array(numComps); 30524 const csNumComps = context.colorSpace.numComps; 30525 this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; 30526 } 30527 get hasData() { 30528 if (this.stream.end) { 30529 return this.stream.pos < this.stream.end; 30530 } 30531 if (this.bufferLength > 0) { 30532 return true; 30533 } 30534 const nextByte = this.stream.getByte(); 30535 if (nextByte < 0) { 30536 return false; 30537 } 30538 this.buffer = nextByte; 30539 this.bufferLength = 8; 30540 return true; 30541 } 30542 readBits(n) { 30543 let buffer = this.buffer; 30544 let bufferLength = this.bufferLength; 30545 if (n === 32) { 30546 if (bufferLength === 0) { 30547 return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0; 30548 } 30549 buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte(); 30550 const nextByte = this.stream.getByte(); 30551 this.buffer = nextByte & (1 << bufferLength) - 1; 30552 return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; 30553 } 30554 if (n === 8 && bufferLength === 0) { 30555 return this.stream.getByte(); 30556 } 30557 while (bufferLength < n) { 30558 buffer = buffer << 8 | this.stream.getByte(); 30559 bufferLength += 8; 30560 } 30561 bufferLength -= n; 30562 this.bufferLength = bufferLength; 30563 this.buffer = buffer & (1 << bufferLength) - 1; 30564 return buffer >> bufferLength; 30565 } 30566 align() { 30567 this.buffer = 0; 30568 this.bufferLength = 0; 30569 } 30570 readFlag() { 30571 return this.readBits(this.context.bitsPerFlag); 30572 } 30573 readCoordinate() { 30574 const bitsPerCoordinate = this.context.bitsPerCoordinate; 30575 const xi = this.readBits(bitsPerCoordinate); 30576 const yi = this.readBits(bitsPerCoordinate); 30577 const decode = this.context.decode; 30578 const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; 30579 return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]]; 30580 } 30581 readComponents() { 30582 const numComps = this.context.numComps; 30583 const bitsPerComponent = this.context.bitsPerComponent; 30584 const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; 30585 const decode = this.context.decode; 30586 const components = this.tmpCompsBuf; 30587 for (let i = 0, j = 4; i < numComps; i++, j += 2) { 30588 const ci = this.readBits(bitsPerComponent); 30589 components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; 30590 } 30591 const color = this.tmpCsCompsBuf; 30592 if (this.context.colorFn) { 30593 this.context.colorFn(components, 0, color, 0); 30594 } 30595 return this.context.colorSpace.getRgb(color, 0); 30596 } 30597} 30598let bCache = Object.create(null); 30599function buildB(count) { 30600 const lut = []; 30601 for (let i = 0; i <= count; i++) { 30602 const t = i / count, 30603 t_ = 1 - t; 30604 lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])); 30605 } 30606 return lut; 30607} 30608function getB(count) { 30609 return bCache[count] ||= buildB(count); 30610} 30611function clearPatternCaches() { 30612 bCache = Object.create(null); 30613} 30614class MeshShading extends BaseShading { 30615 static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; 30616 static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; 30617 static TRIANGLE_DENSITY = 20; 30618 constructor(stream, xref, resources, pdfFunctionFactory, localColorSpaceCache) { 30619 super(); 30620 if (!(stream instanceof BaseStream)) { 30621 throw new FormatError("Mesh data is not a stream"); 30622 } 30623 const dict = stream.dict; 30624 this.shadingType = dict.get("ShadingType"); 30625 this.bbox = lookupNormalRect(dict.getArray("BBox"), null); 30626 const cs = ColorSpace.parse({ 30627 cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), 30628 xref, 30629 resources, 30630 pdfFunctionFactory, 30631 localColorSpaceCache 30632 });
vendor: 15,338 bytes, lines 30633-31138
30633 this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; 30634 const fnObj = dict.getRaw("Function"); 30635 const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null; 30636 this.coords = []; 30637 this.colors = []; 30638 this.figures = []; 30639 const decodeContext = { 30640 bitsPerCoordinate: dict.get("BitsPerCoordinate"), 30641 bitsPerComponent: dict.get("BitsPerComponent"), 30642 bitsPerFlag: dict.get("BitsPerFlag"), 30643 decode: dict.getArray("Decode"), 30644 colorFn: fn, 30645 colorSpace: cs, 30646 numComps: fn ? 1 : cs.numComps 30647 }; 30648 const reader = new MeshStreamReader(stream, decodeContext); 30649 let patchMesh = false; 30650 switch (this.shadingType) { 30651 case ShadingType.FREE_FORM_MESH: 30652 this._decodeType4Shading(reader); 30653 break; 30654 case ShadingType.LATTICE_FORM_MESH: 30655 const verticesPerRow = dict.get("VerticesPerRow") | 0; 30656 if (verticesPerRow < 2) { 30657 throw new FormatError("Invalid VerticesPerRow"); 30658 } 30659 this._decodeType5Shading(reader, verticesPerRow); 30660 break; 30661 case ShadingType.COONS_PATCH_MESH: 30662 this._decodeType6Shading(reader); 30663 patchMesh = true; 30664 break; 30665 case ShadingType.TENSOR_PATCH_MESH: 30666 this._decodeType7Shading(reader); 30667 patchMesh = true; 30668 break; 30669 default: 30670 unreachable("Unsupported mesh type."); 30671 break; 30672 } 30673 if (patchMesh) { 30674 this._updateBounds(); 30675 for (let i = 0, ii = this.figures.length; i < ii; i++) { 30676 this._buildFigureFromPatch(i); 30677 } 30678 } 30679 this._updateBounds(); 30680 this._packData(); 30681 } 30682 _decodeType4Shading(reader) { 30683 const coords = this.coords; 30684 const colors = this.colors; 30685 const operators = []; 30686 const ps = []; 30687 let verticesLeft = 0; 30688 while (reader.hasData) { 30689 const f = reader.readFlag(); 30690 const coord = reader.readCoordinate(); 30691 const color = reader.readComponents(); 30692 if (verticesLeft === 0) { 30693 if (!(0 <= f && f <= 2)) { 30694 throw new FormatError("Unknown type4 flag"); 30695 } 30696 switch (f) { 30697 case 0: 30698 verticesLeft = 3; 30699 break; 30700 case 1: 30701 ps.push(ps.at(-2), ps.at(-1)); 30702 verticesLeft = 1; 30703 break; 30704 case 2: 30705 ps.push(ps.at(-3), ps.at(-1)); 30706 verticesLeft = 1; 30707 break; 30708 } 30709 operators.push(f); 30710 } 30711 ps.push(coords.length); 30712 coords.push(coord); 30713 colors.push(color); 30714 verticesLeft--; 30715 reader.align(); 30716 } 30717 this.figures.push({ 30718 type: "triangles", 30719 coords: new Int32Array(ps), 30720 colors: new Int32Array(ps) 30721 }); 30722 } 30723 _decodeType5Shading(reader, verticesPerRow) { 30724 const coords = this.coords; 30725 const colors = this.colors; 30726 const ps = []; 30727 while (reader.hasData) { 30728 const coord = reader.readCoordinate(); 30729 const color = reader.readComponents(); 30730 ps.push(coords.length); 30731 coords.push(coord); 30732 colors.push(color); 30733 } 30734 this.figures.push({ 30735 type: "lattice", 30736 coords: new Int32Array(ps), 30737 colors: new Int32Array(ps), 30738 verticesPerRow 30739 }); 30740 } 30741 _decodeType6Shading(reader) { 30742 const coords = this.coords; 30743 const colors = this.colors; 30744 const ps = new Int32Array(16); 30745 const cs = new Int32Array(4); 30746 while (reader.hasData) { 30747 const f = reader.readFlag(); 30748 if (!(0 <= f && f <= 3)) { 30749 throw new FormatError("Unknown type6 flag"); 30750 } 30751 const pi = coords.length; 30752 for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { 30753 coords.push(reader.readCoordinate()); 30754 } 30755 const ci = colors.length; 30756 for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { 30757 colors.push(reader.readComponents()); 30758 } 30759 let tmp1, tmp2, tmp3, tmp4; 30760 switch (f) { 30761 case 0: 30762 ps[12] = pi + 3; 30763 ps[13] = pi + 4; 30764 ps[14] = pi + 5; 30765 ps[15] = pi + 6; 30766 ps[8] = pi + 2; 30767 ps[11] = pi + 7; 30768 ps[4] = pi + 1; 30769 ps[7] = pi + 8; 30770 ps[0] = pi; 30771 ps[1] = pi + 11; 30772 ps[2] = pi + 10; 30773 ps[3] = pi + 9; 30774 cs[2] = ci + 1; 30775 cs[3] = ci + 2; 30776 cs[0] = ci; 30777 cs[1] = ci + 3; 30778 break; 30779 case 1: 30780 tmp1 = ps[12]; 30781 tmp2 = ps[13]; 30782 tmp3 = ps[14]; 30783 tmp4 = ps[15]; 30784 ps[12] = tmp4; 30785 ps[13] = pi + 0; 30786 ps[14] = pi + 1; 30787 ps[15] = pi + 2; 30788 ps[8] = tmp3; 30789 ps[11] = pi + 3; 30790 ps[4] = tmp2; 30791 ps[7] = pi + 4; 30792 ps[0] = tmp1; 30793 ps[1] = pi + 7; 30794 ps[2] = pi + 6; 30795 ps[3] = pi + 5; 30796 tmp1 = cs[2]; 30797 tmp2 = cs[3]; 30798 cs[2] = tmp2; 30799 cs[3] = ci; 30800 cs[0] = tmp1; 30801 cs[1] = ci + 1; 30802 break; 30803 case 2: 30804 tmp1 = ps[15]; 30805 tmp2 = ps[11]; 30806 ps[12] = ps[3]; 30807 ps[13] = pi + 0; 30808 ps[14] = pi + 1; 30809 ps[15] = pi + 2; 30810 ps[8] = ps[7]; 30811 ps[11] = pi + 3; 30812 ps[4] = tmp2; 30813 ps[7] = pi + 4; 30814 ps[0] = tmp1; 30815 ps[1] = pi + 7; 30816 ps[2] = pi + 6; 30817 ps[3] = pi + 5; 30818 tmp1 = cs[3]; 30819 cs[2] = cs[1]; 30820 cs[3] = ci; 30821 cs[0] = tmp1; 30822 cs[1] = ci + 1; 30823 break; 30824 case 3: 30825 ps[12] = ps[0]; 30826 ps[13] = pi + 0; 30827 ps[14] = pi + 1; 30828 ps[15] = pi + 2; 30829 ps[8] = ps[1]; 30830 ps[11] = pi + 3; 30831 ps[4] = ps[2]; 30832 ps[7] = pi + 4; 30833 ps[0] = ps[3]; 30834 ps[1] = pi + 7; 30835 ps[2] = pi + 6; 30836 ps[3] = pi + 5; 30837 cs[2] = cs[0]; 30838 cs[3] = ci; 30839 cs[0] = cs[1]; 30840 cs[1] = ci + 1; 30841 break; 30842 } 30843 ps[5] = coords.length; 30844 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]); 30845 ps[6] = coords.length; 30846 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]); 30847 ps[9] = coords.length; 30848 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]); 30849 ps[10] = coords.length; 30850 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]); 30851 this.figures.push({ 30852 type: "patch", 30853 coords: new Int32Array(ps), 30854 colors: new Int32Array(cs) 30855 }); 30856 } 30857 } 30858 _decodeType7Shading(reader) { 30859 const coords = this.coords; 30860 const colors = this.colors; 30861 const ps = new Int32Array(16); 30862 const cs = new Int32Array(4); 30863 while (reader.hasData) { 30864 const f = reader.readFlag(); 30865 if (!(0 <= f && f <= 3)) { 30866 throw new FormatError("Unknown type7 flag"); 30867 } 30868 const pi = coords.length; 30869 for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { 30870 coords.push(reader.readCoordinate()); 30871 } 30872 const ci = colors.length; 30873 for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { 30874 colors.push(reader.readComponents()); 30875 } 30876 let tmp1, tmp2, tmp3, tmp4; 30877 switch (f) { 30878 case 0: 30879 ps[12] = pi + 3; 30880 ps[13] = pi + 4; 30881 ps[14] = pi + 5; 30882 ps[15] = pi + 6; 30883 ps[8] = pi + 2; 30884 ps[9] = pi + 13; 30885 ps[10] = pi + 14; 30886 ps[11] = pi + 7; 30887 ps[4] = pi + 1; 30888 ps[5] = pi + 12; 30889 ps[6] = pi + 15; 30890 ps[7] = pi + 8; 30891 ps[0] = pi; 30892 ps[1] = pi + 11; 30893 ps[2] = pi + 10; 30894 ps[3] = pi + 9; 30895 cs[2] = ci + 1; 30896 cs[3] = ci + 2; 30897 cs[0] = ci; 30898 cs[1] = ci + 3; 30899 break; 30900 case 1: 30901 tmp1 = ps[12]; 30902 tmp2 = ps[13]; 30903 tmp3 = ps[14]; 30904 tmp4 = ps[15]; 30905 ps[12] = tmp4; 30906 ps[13] = pi + 0; 30907 ps[14] = pi + 1; 30908 ps[15] = pi + 2; 30909 ps[8] = tmp3; 30910 ps[9] = pi + 9; 30911 ps[10] = pi + 10; 30912 ps[11] = pi + 3; 30913 ps[4] = tmp2; 30914 ps[5] = pi + 8; 30915 ps[6] = pi + 11; 30916 ps[7] = pi + 4; 30917 ps[0] = tmp1; 30918 ps[1] = pi + 7; 30919 ps[2] = pi + 6; 30920 ps[3] = pi + 5; 30921 tmp1 = cs[2]; 30922 tmp2 = cs[3]; 30923 cs[2] = tmp2; 30924 cs[3] = ci; 30925 cs[0] = tmp1; 30926 cs[1] = ci + 1; 30927 break; 30928 case 2: 30929 tmp1 = ps[15]; 30930 tmp2 = ps[11]; 30931 ps[12] = ps[3]; 30932 ps[13] = pi + 0; 30933 ps[14] = pi + 1; 30934 ps[15] = pi + 2; 30935 ps[8] = ps[7]; 30936 ps[9] = pi + 9; 30937 ps[10] = pi + 10; 30938 ps[11] = pi + 3; 30939 ps[4] = tmp2; 30940 ps[5] = pi + 8; 30941 ps[6] = pi + 11; 30942 ps[7] = pi + 4; 30943 ps[0] = tmp1; 30944 ps[1] = pi + 7; 30945 ps[2] = pi + 6; 30946 ps[3] = pi + 5; 30947 tmp1 = cs[3]; 30948 cs[2] = cs[1]; 30949 cs[3] = ci; 30950 cs[0] = tmp1; 30951 cs[1] = ci + 1; 30952 break; 30953 case 3: 30954 ps[12] = ps[0]; 30955 ps[13] = pi + 0; 30956 ps[14] = pi + 1; 30957 ps[15] = pi + 2; 30958 ps[8] = ps[1]; 30959 ps[9] = pi + 9; 30960 ps[10] = pi + 10; 30961 ps[11] = pi + 3; 30962 ps[4] = ps[2]; 30963 ps[5] = pi + 8; 30964 ps[6] = pi + 11; 30965 ps[7] = pi + 4; 30966 ps[0] = ps[3]; 30967 ps[1] = pi + 7; 30968 ps[2] = pi + 6; 30969 ps[3] = pi + 5; 30970 cs[2] = cs[0]; 30971 cs[3] = ci; 30972 cs[0] = cs[1]; 30973 cs[1] = ci + 1; 30974 break; 30975 } 30976 this.figures.push({ 30977 type: "patch", 30978 coords: new Int32Array(ps), 30979 colors: new Int32Array(cs) 30980 }); 30981 } 30982 } 30983 _buildFigureFromPatch(index) { 30984 const figure = this.figures[index]; 30985 assert(figure.type === "patch", "Unexpected patch mesh figure"); 30986 const coords = this.coords, 30987 colors = this.colors; 30988 const pi = figure.coords; 30989 const ci = figure.colors; 30990 const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); 30991 const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); 30992 const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); 30993 const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); 30994 let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); 30995 splitXBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); 30996 let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); 30997 splitYBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); 30998 const verticesPerRow = splitXBy + 1; 30999 const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); 31000 const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); 31001 let k = 0; 31002 const cl = new Uint8Array(3), 31003 cr = new Uint8Array(3); 31004 const c0 = colors[ci[0]], 31005 c1 = colors[ci[1]], 31006 c2 = colors[ci[2]], 31007 c3 = colors[ci[3]]; 31008 const bRow = getB(splitYBy), 31009 bCol = getB(splitXBy); 31010 for (let row = 0; row <= splitYBy; row++) { 31011 cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; 31012 cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; 31013 cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; 31014 cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; 31015 cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; 31016 cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; 31017 for (let col = 0; col <= splitXBy; col++, k++) { 31018 if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { 31019 continue; 31020 } 31021 let x = 0, 31022 y = 0; 31023 let q = 0; 31024 for (let i = 0; i <= 3; i++) { 31025 for (let j = 0; j <= 3; j++, q++) { 31026 const m = bRow[row][i] * bCol[col][j]; 31027 x += coords[pi[q]][0] * m; 31028 y += coords[pi[q]][1] * m; 31029 } 31030 } 31031 figureCoords[k] = coords.length; 31032 coords.push([x, y]); 31033 figureColors[k] = colors.length; 31034 const newColor = new Uint8Array(3); 31035 newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; 31036 newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; 31037 newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; 31038 colors.push(newColor); 31039 } 31040 } 31041 figureCoords[0] = pi[0]; 31042 figureColors[0] = ci[0]; 31043 figureCoords[splitXBy] = pi[3]; 31044 figureColors[splitXBy] = ci[1]; 31045 figureCoords[verticesPerRow * splitYBy] = pi[12]; 31046 figureColors[verticesPerRow * splitYBy] = ci[2]; 31047 figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; 31048 figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; 31049 this.figures[index] = { 31050 type: "lattice", 31051 coords: figureCoords, 31052 colors: figureColors, 31053 verticesPerRow 31054 }; 31055 } 31056 _updateBounds() { 31057 let minX = this.coords[0][0], 31058 minY = this.coords[0][1], 31059 maxX = minX, 31060 maxY = minY; 31061 for (let i = 1, ii = this.coords.length; i < ii; i++) { 31062 const x = this.coords[i][0], 31063 y = this.coords[i][1]; 31064 minX = minX > x ? x : minX; 31065 minY = minY > y ? y : minY; 31066 maxX = maxX < x ? x : maxX; 31067 maxY = maxY < y ? y : maxY; 31068 } 31069 this.bounds = [minX, minY, maxX, maxY]; 31070 } 31071 _packData() { 31072 let i, ii, j, jj; 31073 const coords = this.coords; 31074 const coordsPacked = new Float32Array(coords.length * 2); 31075 for (i = 0, j = 0, ii = coords.length; i < ii; i++) { 31076 const xy = coords[i]; 31077 coordsPacked[j++] = xy[0]; 31078 coordsPacked[j++] = xy[1]; 31079 } 31080 this.coords = coordsPacked; 31081 const colors = this.colors; 31082 const colorsPacked = new Uint8Array(colors.length * 3); 31083 for (i = 0, j = 0, ii = colors.length; i < ii; i++) { 31084 const c = colors[i]; 31085 colorsPacked[j++] = c[0]; 31086 colorsPacked[j++] = c[1]; 31087 colorsPacked[j++] = c[2]; 31088 } 31089 this.colors = colorsPacked; 31090 const figures = this.figures; 31091 for (i = 0, ii = figures.length; i < ii; i++) { 31092 const figure = figures[i], 31093 ps = figure.coords, 31094 cs = figure.colors; 31095 for (j = 0, jj = ps.length; j < jj; j++) { 31096 ps[j] *= 2; 31097 cs[j] *= 3; 31098 } 31099 } 31100 } 31101 getIR() { 31102 const { 31103 bounds 31104 } = this; 31105 if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) { 31106 throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`); 31107 } 31108 return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, bounds, this.bbox, this.background]; 31109 } 31110} 31111class DummyShading extends BaseShading { 31112 getIR() { 31113 return ["Dummy"]; 31114 } 31115} 31116function getTilingPatternIR(operatorList, dict, color) { 31117 const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); 31118 const bbox = lookupNormalRect(dict.getArray("BBox"), null); 31119 if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { 31120 throw new FormatError(`Invalid getTilingPatternIR /BBox array.`); 31121 } 31122 const xstep = dict.get("XStep"); 31123 if (typeof xstep !== "number") { 31124 throw new FormatError(`Invalid getTilingPatternIR /XStep value.`); 31125 } 31126 const ystep = dict.get("YStep"); 31127 if (typeof ystep !== "number") { 31128 throw new FormatError(`Invalid getTilingPatternIR /YStep value.`); 31129 } 31130 const paintType = dict.get("PaintType"); 31131 if (!Number.isInteger(paintType)) { 31132 throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`); 31133 } 31134 const tilingType = dict.get("TilingType"); 31135 if (!Number.isInteger(tilingType)) { 31136 throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`); 31137 } 31138
vendor: 5,000 bytes, lines 31138-31143
31138return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType]; 31139} 31140 31141;// ./src/core/calibri_factors.js 31142const 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]; 31143const CalibriBoldMetrics = {
31144 lineHeight: 1.2207, 31145 lineGap: 0.2207 31146}
vendor: 4,884 bytes, lines 31146-31147
31146; 31147const 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];
31148const CalibriBoldItalicMetrics = { 31149 lineHeight: 1.2207, 31150
vendor: 4,853 bytes, lines 31150-31153
31150lineGap: 0.2207 31151}; 31152const 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]; 31153const CalibriItalicMetrics = {
31154 lineHeight: 1.2207, 31155
vendor: 4,912 bytes, lines 31155-31158
31155lineGap: 0.2207 31156}; 31157const 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]; 31158const CalibriRegularMetrics = {
31159 lineHeight: 1.2207, 31160 lineGap: 0.2207 31161}; 31162 31163;// ./src/core/helvetica_factors.js 31164const 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];
31165const HelveticaBoldMetrics = { 31166 lineHeight: 1.2, 31167 lineGap: 0.2 31168}; 31169const 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];
31170const HelveticaBoldItalicMetrics = { 31171 lineHeight: 1.35, 31172 lineGap: 0.2 31173}; 31174const 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]; 31175const HelveticaItalicMetrics = { 31176 lineHeight: 1.35, 31177 lineGap: 0.2 31178}; 31179const 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,
311791.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]; 31180const HelveticaRegularMetrics = { 31181 lineHeight: 1.2, 31182
vendor: 32,941 bytes, lines 31182-31197
31182lineGap: 0.2 31183}; 31184 31185;// ./src/core/liberationsans_widths.js 31186const 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]; 31187const 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]; 31188const 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]; 31189const 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]; 31190const 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]; 31191const 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]; 31192const 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]; 31193const 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]; 31194 31195;// ./src/core/myriadpro_factors.js 31196const 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]; 31197const MyriadProBoldMetrics = {
31198 lineHeight: 1.2, 31199
vendor: 4,628 bytes, lines 31199-31202
31199lineGap: 0.2 31200}; 31201const 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]; 31202const MyriadProBoldItalicMetrics = {
31203 lineHeight: 1.2, 31204 lineGap: 0.2 31205}; 31206const 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]; 31207const MyriadProItalicMetrics = { 31208 lineHeight: 1.2, 31209 lineGap: 0.2 31210}; 31211const 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,
312111.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]; 31212const MyriadProRegularMetrics = { 31213 lineHeight: 1.2, 31214 lineGap: 0.2 31215}; 31216 31217;// ./src/core/segoeui_factors.js 31218const 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]; 31219const SegoeuiBoldMetrics = { 31220 lineHeight: 1.33008, 31221 lineGap: 0 31222}; 31223const 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,
312231.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]; 31224const SegoeuiBoldItalicMetrics = { 31225 lineHeight: 1.33008, 31226 lineGap: 0 31227}; 31228const 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,
312280.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]; 31229const SegoeuiItalicMetrics = { 31230 lineHeight: 1.33008, 31231 lineGap: 0 31232}; 31233const 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,
vendor: 5,775 bytes, lines 31233-31363
312330.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]; 31234const SegoeuiRegularMetrics = { 31235 lineHeight: 1.33008, 31236 lineGap: 0 31237}; 31238 31239;// ./src/core/xfa_fonts.js 31240 31241 31242 31243 31244 31245 31246 31247 31248 31249 31250const getXFAFontMap = getLookupTableFactory(function (t) { 31251 t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { 31252 name: "LiberationSans-Regular", 31253 factors: MyriadProRegularFactors, 31254 baseWidths: LiberationSansRegularWidths, 31255 baseMapping: LiberationSansRegularMapping, 31256 metrics: MyriadProRegularMetrics 31257 }; 31258 t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = { 31259 name: "LiberationSans-Bold", 31260 factors: MyriadProBoldFactors, 31261 baseWidths: LiberationSansBoldWidths, 31262 baseMapping: LiberationSansBoldMapping, 31263 metrics: MyriadProBoldMetrics 31264 }; 31265 t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = { 31266 name: "LiberationSans-Italic", 31267 factors: MyriadProItalicFactors, 31268 baseWidths: LiberationSansItalicWidths, 31269 baseMapping: LiberationSansItalicMapping, 31270 metrics: MyriadProItalicMetrics 31271 }; 31272 t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = { 31273 name: "LiberationSans-BoldItalic", 31274 factors: MyriadProBoldItalicFactors, 31275 baseWidths: LiberationSansBoldItalicWidths, 31276 baseMapping: LiberationSansBoldItalicMapping, 31277 metrics: MyriadProBoldItalicMetrics 31278 }; 31279 t.ArialMT = t.Arial = t["Arial-Regular"] = { 31280 name: "LiberationSans-Regular", 31281 baseWidths: LiberationSansRegularWidths, 31282 baseMapping: LiberationSansRegularMapping 31283 }; 31284 t["Arial-BoldMT"] = t["Arial-Bold"] = { 31285 name: "LiberationSans-Bold", 31286 baseWidths: LiberationSansBoldWidths, 31287 baseMapping: LiberationSansBoldMapping 31288 }; 31289 t["Arial-ItalicMT"] = t["Arial-Italic"] = { 31290 name: "LiberationSans-Italic", 31291 baseWidths: LiberationSansItalicWidths, 31292 baseMapping: LiberationSansItalicMapping 31293 }; 31294 t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = { 31295 name: "LiberationSans-BoldItalic", 31296 baseWidths: LiberationSansBoldItalicWidths, 31297 baseMapping: LiberationSansBoldItalicMapping 31298 }; 31299 t["Calibri-Regular"] = { 31300 name: "LiberationSans-Regular", 31301 factors: CalibriRegularFactors, 31302 baseWidths: LiberationSansRegularWidths, 31303 baseMapping: LiberationSansRegularMapping, 31304 metrics: CalibriRegularMetrics 31305 }; 31306 t["Calibri-Bold"] = { 31307 name: "LiberationSans-Bold", 31308 factors: CalibriBoldFactors, 31309 baseWidths: LiberationSansBoldWidths, 31310 baseMapping: LiberationSansBoldMapping, 31311 metrics: CalibriBoldMetrics 31312 }; 31313 t["Calibri-Italic"] = { 31314 name: "LiberationSans-Italic", 31315 factors: CalibriItalicFactors, 31316 baseWidths: LiberationSansItalicWidths, 31317 baseMapping: LiberationSansItalicMapping, 31318 metrics: CalibriItalicMetrics 31319 }; 31320 t["Calibri-BoldItalic"] = { 31321 name: "LiberationSans-BoldItalic", 31322 factors: CalibriBoldItalicFactors, 31323 baseWidths: LiberationSansBoldItalicWidths, 31324 baseMapping: LiberationSansBoldItalicMapping, 31325 metrics: CalibriBoldItalicMetrics 31326 }; 31327 t["Segoeui-Regular"] = { 31328 name: "LiberationSans-Regular", 31329 factors: SegoeuiRegularFactors, 31330 baseWidths: LiberationSansRegularWidths, 31331 baseMapping: LiberationSansRegularMapping, 31332 metrics: SegoeuiRegularMetrics 31333 }; 31334 t["Segoeui-Bold"] = { 31335 name: "LiberationSans-Bold", 31336 factors: SegoeuiBoldFactors, 31337 baseWidths: LiberationSansBoldWidths, 31338 baseMapping: LiberationSansBoldMapping, 31339 metrics: SegoeuiBoldMetrics 31340 }; 31341 t["Segoeui-Italic"] = { 31342 name: "LiberationSans-Italic", 31343 factors: SegoeuiItalicFactors, 31344 baseWidths: LiberationSansItalicWidths, 31345 baseMapping: LiberationSansItalicMapping, 31346 metrics: SegoeuiItalicMetrics 31347 }; 31348 t["Segoeui-BoldItalic"] = { 31349 name: "LiberationSans-BoldItalic", 31350 factors: SegoeuiBoldItalicFactors, 31351 baseWidths: LiberationSansBoldItalicWidths, 31352 baseMapping: LiberationSansBoldItalicMapping, 31353 metrics: SegoeuiBoldItalicMetrics 31354 }; 31355 t["Helvetica-Regular"] = t.Helvetica = { 31356 name: "LiberationSans-Regular", 31357 factors: HelveticaRegularFactors, 31358 baseWidths: LiberationSansRegularWidths, 31359 baseMapping: LiberationSansRegularMapping, 31360 metrics: HelveticaRegularMetrics 31361 }; 31362 t["Helvetica-Bold"] = { 31363 name: "LiberationSans-Bold",
vendor: 10,466 bytes, lines 31364-31790
31364 factors: HelveticaBoldFactors, 31365 baseWidths: LiberationSansBoldWidths, 31366 baseMapping: LiberationSansBoldMapping, 31367 metrics: HelveticaBoldMetrics 31368 }; 31369 t["Helvetica-Italic"] = { 31370 name: "LiberationSans-Italic", 31371 factors: HelveticaItalicFactors, 31372 baseWidths: LiberationSansItalicWidths, 31373 baseMapping: LiberationSansItalicMapping, 31374 metrics: HelveticaItalicMetrics 31375 }; 31376 t["Helvetica-BoldItalic"] = { 31377 name: "LiberationSans-BoldItalic", 31378 factors: HelveticaBoldItalicFactors, 31379 baseWidths: LiberationSansBoldItalicWidths, 31380 baseMapping: LiberationSansBoldItalicMapping, 31381 metrics: HelveticaBoldItalicMetrics 31382 }; 31383}); 31384function getXfaFontName(name) { 31385 const fontName = normalizeFontName(name); 31386 const fontMap = getXFAFontMap(); 31387 return fontMap[fontName]; 31388} 31389function getXfaFontWidths(name) { 31390 const info = getXfaFontName(name); 31391 if (!info) { 31392 return null; 31393 } 31394 const { 31395 baseWidths, 31396 baseMapping, 31397 factors 31398 } = info; 31399 const rescaledBaseWidths = !factors ? baseWidths : baseWidths.map((w, i) => w * factors[i]); 31400 let currentCode = -2; 31401 let currentArray; 31402 const newWidths = []; 31403 for (const [unicode, glyphIndex] of baseMapping.map((charUnicode, index) => [charUnicode, index]).sort(([unicode1], [unicode2]) => unicode1 - unicode2)) { 31404 if (unicode === -1) { 31405 continue; 31406 } 31407 if (unicode === currentCode + 1) { 31408 currentArray.push(rescaledBaseWidths[glyphIndex]); 31409 currentCode += 1; 31410 } else { 31411 currentCode = unicode; 31412 currentArray = [rescaledBaseWidths[glyphIndex]]; 31413 newWidths.push(unicode, currentArray); 31414 } 31415 } 31416 return newWidths; 31417} 31418function getXfaFontDict(name) { 31419 const widths = getXfaFontWidths(name); 31420 const dict = new Dict(null); 31421 dict.set("BaseFont", Name.get(name)); 31422 dict.set("Type", Name.get("Font")); 31423 dict.set("Subtype", Name.get("CIDFontType2")); 31424 dict.set("Encoding", Name.get("Identity-H")); 31425 dict.set("CIDToGIDMap", Name.get("Identity")); 31426 dict.set("W", widths); 31427 dict.set("FirstChar", widths[0]); 31428 dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1); 31429 const descriptor = new Dict(null); 31430 dict.set("FontDescriptor", descriptor); 31431 const systemInfo = new Dict(null); 31432 systemInfo.set("Ordering", "Identity"); 31433 systemInfo.set("Registry", "Adobe"); 31434 systemInfo.set("Supplement", 0); 31435 dict.set("CIDSystemInfo", systemInfo); 31436 return dict; 31437} 31438 31439;// ./src/core/ps_parser.js 31440 31441 31442 31443 31444class PostScriptParser { 31445 constructor(lexer) { 31446 this.lexer = lexer; 31447 this.operators = []; 31448 this.token = null; 31449 this.prev = null; 31450 } 31451 nextToken() { 31452 this.prev = this.token; 31453 this.token = this.lexer.getToken(); 31454 } 31455 accept(type) { 31456 if (this.token.type === type) { 31457 this.nextToken(); 31458 return true; 31459 } 31460 return false; 31461 } 31462 expect(type) { 31463 if (this.accept(type)) { 31464 return true; 31465 } 31466 throw new FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`); 31467 } 31468 parse() { 31469 this.nextToken(); 31470 this.expect(PostScriptTokenTypes.LBRACE); 31471 this.parseBlock(); 31472 this.expect(PostScriptTokenTypes.RBRACE); 31473 return this.operators; 31474 } 31475 parseBlock() { 31476 while (true) { 31477 if (this.accept(PostScriptTokenTypes.NUMBER)) { 31478 this.operators.push(this.prev.value); 31479 } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { 31480 this.operators.push(this.prev.value); 31481 } else if (this.accept(PostScriptTokenTypes.LBRACE)) { 31482 this.parseCondition(); 31483 } else { 31484 return; 31485 } 31486 } 31487 } 31488 parseCondition() { 31489 const conditionLocation = this.operators.length; 31490 this.operators.push(null, null); 31491 this.parseBlock(); 31492 this.expect(PostScriptTokenTypes.RBRACE); 31493 if (this.accept(PostScriptTokenTypes.IF)) { 31494 this.operators[conditionLocation] = this.operators.length; 31495 this.operators[conditionLocation + 1] = "jz"; 31496 } else if (this.accept(PostScriptTokenTypes.LBRACE)) { 31497 const jumpLocation = this.operators.length; 31498 this.operators.push(null, null); 31499 const endOfTrue = this.operators.length; 31500 this.parseBlock(); 31501 this.expect(PostScriptTokenTypes.RBRACE); 31502 this.expect(PostScriptTokenTypes.IFELSE); 31503 this.operators[jumpLocation] = this.operators.length; 31504 this.operators[jumpLocation + 1] = "j"; 31505 this.operators[conditionLocation] = endOfTrue; 31506 this.operators[conditionLocation + 1] = "jz"; 31507 } else { 31508 throw new FormatError("PS Function: error parsing conditional."); 31509 } 31510 } 31511} 31512const PostScriptTokenTypes = { 31513 LBRACE: 0, 31514 RBRACE: 1, 31515 NUMBER: 2, 31516 OPERATOR: 3, 31517 IF: 4, 31518 IFELSE: 5 31519}; 31520class PostScriptToken { 31521 static get opCache() { 31522 return shadow(this, "opCache", Object.create(null)); 31523 } 31524 constructor(type, value) { 31525 this.type = type; 31526 this.value = value; 31527 } 31528 static getOperator(op) { 31529 return PostScriptToken.opCache[op] ||= new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); 31530 } 31531 static get LBRACE() { 31532 return shadow(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{")); 31533 } 31534 static get RBRACE() { 31535 return shadow(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}")); 31536 } 31537 static get IF() { 31538 return shadow(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF")); 31539 } 31540 static get IFELSE() { 31541 return shadow(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE")); 31542 } 31543} 31544class PostScriptLexer { 31545 constructor(stream) { 31546 this.stream = stream; 31547 this.nextChar(); 31548 this.strBuf = []; 31549 } 31550 nextChar() { 31551 return this.currentChar = this.stream.getByte(); 31552 } 31553 getToken() { 31554 let comment = false; 31555 let ch = this.currentChar; 31556 while (true) { 31557 if (ch < 0) { 31558 return EOF; 31559 } 31560 if (comment) { 31561 if (ch === 0x0a || ch === 0x0d) { 31562 comment = false; 31563 } 31564 } else if (ch === 0x25) { 31565 comment = true; 31566 } else if (!isWhiteSpace(ch)) { 31567 break; 31568 } 31569 ch = this.nextChar(); 31570 } 31571 switch (ch | 0) { 31572 case 0x30: 31573 case 0x31: 31574 case 0x32: 31575 case 0x33: 31576 case 0x34: 31577 case 0x35: 31578 case 0x36: 31579 case 0x37: 31580 case 0x38: 31581 case 0x39: 31582 case 0x2b: 31583 case 0x2d: 31584 case 0x2e: 31585 return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber()); 31586 case 0x7b: 31587 this.nextChar(); 31588 return PostScriptToken.LBRACE; 31589 case 0x7d: 31590 this.nextChar(); 31591 return PostScriptToken.RBRACE; 31592 } 31593 const strBuf = this.strBuf; 31594 strBuf.length = 0; 31595 strBuf[0] = String.fromCharCode(ch); 31596 while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) { 31597 strBuf.push(String.fromCharCode(ch)); 31598 } 31599 const str = strBuf.join(""); 31600 switch (str.toLowerCase()) { 31601 case "if": 31602 return PostScriptToken.IF; 31603 case "ifelse": 31604 return PostScriptToken.IFELSE; 31605 default: 31606 return PostScriptToken.getOperator(str); 31607 } 31608 } 31609 getNumber() { 31610 let ch = this.currentChar; 31611 const strBuf = this.strBuf; 31612 strBuf.length = 0; 31613 strBuf[0] = String.fromCharCode(ch); 31614 while ((ch = this.nextChar()) >= 0) { 31615 if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) { 31616 strBuf.push(String.fromCharCode(ch)); 31617 } else { 31618 break; 31619 } 31620 } 31621 const value = parseFloat(strBuf.join("")); 31622 if (isNaN(value)) { 31623 throw new FormatError(`Invalid floating point number: ${value}`); 31624 } 31625 return value; 31626 } 31627} 31628 31629;// ./src/core/image_utils.js 31630 31631 31632 31633 31634 31635 31636 31637 31638 31639class BaseLocalCache { 31640 constructor(options) { 31641 this._onlyRefs = options?.onlyRefs === true; 31642 if (!this._onlyRefs) { 31643 this._nameRefMap = new Map(); 31644 this._imageMap = new Map(); 31645 } 31646 this._imageCache = new RefSetCache(); 31647 } 31648 getByName(name) { 31649 if (this._onlyRefs) { 31650 unreachable("Should not call `getByName` method."); 31651 } 31652 const ref = this._nameRefMap.get(name); 31653 if (ref) { 31654 return this.getByRef(ref); 31655 } 31656 return this._imageMap.get(name) || null; 31657 } 31658 getByRef(ref) { 31659 return this._imageCache.get(ref) || null; 31660 } 31661 set(name, ref, data) { 31662 unreachable("Abstract method `set` called."); 31663 } 31664} 31665class LocalImageCache extends BaseLocalCache { 31666 set(name, ref = null, data) { 31667 if (typeof name !== "string") { 31668 throw new Error('LocalImageCache.set - expected "name" argument.'); 31669 } 31670 if (ref) { 31671 if (this._imageCache.has(ref)) { 31672 return; 31673 } 31674 this._nameRefMap.set(name, ref); 31675 this._imageCache.put(ref, data); 31676 return; 31677 } 31678 if (this._imageMap.has(name)) { 31679 return; 31680 } 31681 this._imageMap.set(name, data); 31682 } 31683} 31684class LocalColorSpaceCache extends BaseLocalCache { 31685 set(name = null, ref = null, data) { 31686 if (typeof name !== "string" && !ref) { 31687 throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.'); 31688 } 31689 if (ref) { 31690 if (this._imageCache.has(ref)) { 31691 return; 31692 } 31693 if (name !== null) { 31694 this._nameRefMap.set(name, ref); 31695 } 31696 this._imageCache.put(ref, data); 31697 return; 31698 } 31699 if (this._imageMap.has(name)) { 31700 return; 31701 } 31702 this._imageMap.set(name, data); 31703 } 31704} 31705class LocalFunctionCache extends BaseLocalCache { 31706 constructor(options) { 31707 super({ 31708 onlyRefs: true 31709 }); 31710 } 31711 set(name = null, ref, data) { 31712 if (!ref) { 31713 throw new Error('LocalFunctionCache.set - expected "ref" argument.'); 31714 } 31715 if (this._imageCache.has(ref)) { 31716 return; 31717 } 31718 this._imageCache.put(ref, data); 31719 } 31720} 31721class LocalGStateCache extends BaseLocalCache { 31722 set(name, ref = null, data) { 31723 if (typeof name !== "string") { 31724 throw new Error('LocalGStateCache.set - expected "name" argument.'); 31725 } 31726 if (ref) { 31727 if (this._imageCache.has(ref)) { 31728 return; 31729 } 31730 this._nameRefMap.set(name, ref); 31731 this._imageCache.put(ref, data); 31732 return; 31733 } 31734 if (this._imageMap.has(name)) { 31735 return; 31736 } 31737 this._imageMap.set(name, data); 31738 } 31739} 31740class LocalTilingPatternCache extends BaseLocalCache { 31741 constructor(options) { 31742 super({ 31743 onlyRefs: true 31744 }); 31745 } 31746 set(name = null, ref, data) { 31747 if (!ref) { 31748 throw new Error('LocalTilingPatternCache.set - expected "ref" argument.'); 31749 } 31750 if (this._imageCache.has(ref)) { 31751 return; 31752 } 31753 this._imageCache.put(ref, data); 31754 } 31755} 31756class RegionalImageCache extends BaseLocalCache { 31757 constructor(options) { 31758 super({ 31759 onlyRefs: true 31760 }); 31761 } 31762 set(name = null, ref, data) { 31763 if (!ref) { 31764 throw new Error('RegionalImageCache.set - expected "ref" argument.'); 31765 } 31766 if (this._imageCache.has(ref)) { 31767 return; 31768 } 31769 this._imageCache.put(ref, data); 31770 } 31771} 31772class GlobalImageCache { 31773 static NUM_PAGES_THRESHOLD = 2; 31774 static MIN_IMAGES_TO_CACHE = 10; 31775 static MAX_BYTE_SIZE = 5 * MAX_IMAGE_SIZE_TO_CACHE; 31776 #decodeFailedSet = new RefSet(); 31777 constructor() { 31778 this._refCache = new RefSetCache(); 31779 this._imageCache = new RefSetCache(); 31780 } 31781 get #byteSize() { 31782 let byteSize = 0; 31783 for (const imageData of this._imageCache) { 31784 byteSize += imageData.byteSize; 31785 } 31786 return byteSize; 31787 } 31788 get #cacheLimitReached() { 31789 if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) { 31790 return false;
31791 } 31792 if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) { 31793 return false; 31794 } 31795 return true; 31796 } 31797 shouldCache(ref, pageIndex) { 31798 let pageIndexSet = this._refCache.get(ref); 31799 if (!pageIndexSet) { 31800 pageIndexSet = new Set(); 31801 this._refCache.put(ref, pageIndexSet); 31802 } 31803 pageIndexSet.add(pageIndex); 31804 if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { 31805 return false; 31806 } 31807 if (!this._imageCache.has(ref) && this.#cacheLimitReached) { 31808 return false; 31809 } 31810 return true; 31811 } 31812 addDecodeFailed(ref) { 31813 this.#decodeFailedSet.put(ref); 31814 } 31815 hasDecodeFailed(ref) { 31816 return this.#decodeFailedSet.has(ref); 31817 } 31818 addByteSize(ref, byteSize) { 31819 const imageData = this._imageCache.get(ref); 31820 if (!imageData) { 31821 return; 31822 } 31823 if (imageData.byteSize) { 31824 return; 31825 } 31826 imageData.byteSize = byteSize; 31827 } 31828 getData(ref, pageIndex) { 31829 const pageIndexSet = this._refCache.get(ref); 31830 if (!pageIndexSet) { 31831 return null; 31832 } 31833 if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { 31834 return null; 31835 } 31836 const imageData = this._imageCache.get(ref); 31837 if (!imageData) { 31838 return null; 31839 } 31840 pageIndexSet.add(pageIndex); 31841 return imageData; 31842 } 31843 setData(ref, data) { 31844 if (!this._refCache.has(ref)) { 31845 throw new Error('GlobalImageCache.setData - expected "shouldCache" to have been called.'); 31846 } 31847 if (this._imageCache.has(ref)) { 31848 return; 31849 } 31850 if (this.#cacheLimitReached) { 31851 warn("GlobalImageCache.setData - cache limit reached."); 31852 return; 31853 } 31854 this._imageCache.put(ref, data); 31855 } 31856 clear(onlyData = false) { 31857 if (!onlyData) { 31858 this.#decodeFailedSet.clear(); 31859 this._refCache.clear(); 31860 } 31861 this._imageCache.clear(); 31862 } 31863} 31864 31865;// ./src/core/function.js 31866 31867 31868 31869 31870 31871 31872 31873 31874 31875 31876 31877 31878 31879 31880class PDFFunctionFactory { 31881 constructor({ 31882 xref, 31883 isEvalSupported = true 31884 }) { 31885 this.xref = xref; 31886 this.isEvalSupported = isEvalSupported !== false; 31887 } 31888 create(fn) { 31889 const cachedFunction = this.getCached(fn); 31890 if (cachedFunction) { 31891 return cachedFunction; 31892 } 31893 const parsedFunction = PDFFunction.parse({ 31894 xref: this.xref, 31895 isEvalSupported: this.isEvalSupported, 31896 fn: fn instanceof Ref ? this.xref.fetch(fn) : fn 31897 }); 31898 this._cache(fn, parsedFunction); 31899 return parsedFunction; 31900 } 31901 createFromArray(fnObj) { 31902 const cachedFunction = this.getCached(fnObj); 31903 if (cachedFunction) { 31904 return cachedFunction; 31905 } 31906 const parsedFunction = PDFFunction.parseArray({ 31907 xref: this.xref, 31908 isEvalSupported: this.isEvalSupported, 31909 fnObj: fnObj instanceof Ref ? this.xref.fetch(fnObj) : fnObj 31910 }); 31911 this._cache(fnObj, parsedFunction); 31912 return parsedFunction; 31913 } 31914 getCached(cacheKey) { 31915 let fnRef; 31916 if (cacheKey instanceof Ref) { 31917 fnRef = cacheKey; 31918 } else if (cacheKey instanceof Dict) { 31919 fnRef = cacheKey.objId; 31920 } else if (cacheKey instanceof BaseStream) { 31921 fnRef = cacheKey.dict?.objId; 31922 } 31923 if (fnRef) { 31924 const localFunction = this._localFunctionCache.getByRef(fnRef); 31925 if (localFunction) { 31926 return localFunction; 31927 } 31928 } 31929 return null; 31930 } 31931 _cache(cacheKey, parsedFunction) { 31932 if (!parsedFunction) { 31933 throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.'); 31934 } 31935 let fnRef; 31936 if (cacheKey instanceof Ref) { 31937 fnRef = cacheKey; 31938 } else if (cacheKey instanceof Dict) { 31939 fnRef = cacheKey.objId; 31940 } else if (cacheKey instanceof BaseStream) { 31941 fnRef = cacheKey.dict?.objId; 31942 } 31943 if (fnRef) { 31944 this._localFunctionCache.set(null, fnRef, parsedFunction); 31945 } 31946 } 31947 get _localFunctionCache() { 31948 return shadow(this, "_localFunctionCache", new LocalFunctionCache()); 31949 } 31950} 31951function toNumberArray(arr) { 31952 if (!Array.isArray(arr)) { 31953 return null; 31954 } 31955 if (!isNumberArray(arr, null)) { 31956 return arr.map(x => +x); 31957 } 31958 return arr; 31959} 31960class PDFFunction { 31961 static getSampleArray(size, outputSize, bps, stream) { 31962 let i, ii; 31963 let length = 1; 31964 for (i = 0, ii = size.length; i < ii; i++) { 31965 length *= size[i]; 31966 } 31967 length *= outputSize; 31968 const array = new Array(length); 31969 let codeSize = 0; 31970 let codeBuf = 0; 31971 const sampleMul = 1.0 / (2.0 ** bps - 1); 31972 const strBytes = stream.getBytes((length * bps + 7) / 8); 31973 let strIdx = 0; 31974 for (i = 0; i < length; i++) { 31975 while (codeSize < bps) { 31976 codeBuf <<= 8; 31977 codeBuf |= strBytes[strIdx++]; 31978 codeSize += 8; 31979 } 31980 codeSize -= bps; 31981 array[i] = (codeBuf >> codeSize) * sampleMul; 31982 codeBuf &= (1 << codeSize) - 1; 31983 } 31984 return array; 31985 } 31986 static parse({ 31987 xref, 31988 isEvalSupported, 31989 fn 31990 }) { 31991 const dict = fn.dict || fn; 31992 const typeNum = dict.get("FunctionType"); 31993 switch (typeNum) { 31994 case 0: 31995 return this.constructSampled({ 31996 xref, 31997 isEvalSupported, 31998 fn, 31999 dict 32000 }); 32001 case 1: 32002 break; 32003 case 2: 32004 return this.constructInterpolated({ 32005 xref, 32006 isEvalSupported, 32007 dict 32008 }); 32009 case 3: 32010 return this.constructStiched({ 32011 xref, 32012 isEvalSupported, 32013 dict 32014 }); 32015 case 4: 32016 return this.constructPostScript({ 32017 xref, 32018 isEvalSupported, 32019 fn, 32020 dict 32021 }); 32022 } 32023 throw new FormatError("Unknown type of function"); 32024 } 32025 static parseArray({ 32026 xref, 32027 isEvalSupported, 32028 fnObj 32029 }) { 32030 if (!Array.isArray(fnObj)) { 32031 return this.parse({ 32032 xref, 32033 isEvalSupported, 32034 fn: fnObj 32035 }); 32036 } 32037 const fnArray = []; 32038 for (const fn of fnObj) { 32039 fnArray.push(this.parse({ 32040 xref, 32041 isEvalSupported, 32042 fn: xref.fetchIfRef(fn) 32043 })); 32044 }
vendor: 8,937 bytes, lines 32045-32375
32045 return function (src, srcOffset, dest, destOffset) { 32046 for (let i = 0, ii = fnArray.length; i < ii; i++) { 32047 fnArray[i](src, srcOffset, dest, destOffset + i); 32048 } 32049 }; 32050 } 32051 static constructSampled({ 32052 xref, 32053 isEvalSupported, 32054 fn, 32055 dict 32056 }) { 32057 function toMultiArray(arr) { 32058 const inputLength = arr.length; 32059 const out = []; 32060 let index = 0; 32061 for (let i = 0; i < inputLength; i += 2) { 32062 out[index++] = [arr[i], arr[i + 1]]; 32063 } 32064 return out; 32065 } 32066 function interpolate(x, xmin, xmax, ymin, ymax) { 32067 return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); 32068 } 32069 let domain = toNumberArray(dict.getArray("Domain")); 32070 let range = toNumberArray(dict.getArray("Range")); 32071 if (!domain || !range) { 32072 throw new FormatError("No domain or range"); 32073 } 32074 const inputSize = domain.length / 2; 32075 const outputSize = range.length / 2; 32076 domain = toMultiArray(domain); 32077 range = toMultiArray(range); 32078 const size = toNumberArray(dict.getArray("Size")); 32079 const bps = dict.get("BitsPerSample"); 32080 const order = dict.get("Order") || 1; 32081 if (order !== 1) { 32082 info("No support for cubic spline interpolation: " + order); 32083 } 32084 let encode = toNumberArray(dict.getArray("Encode")); 32085 if (!encode) { 32086 encode = []; 32087 for (let i = 0; i < inputSize; ++i) { 32088 encode.push([0, size[i] - 1]); 32089 } 32090 } else { 32091 encode = toMultiArray(encode); 32092 } 32093 let decode = toNumberArray(dict.getArray("Decode")); 32094 decode = !decode ? range : toMultiArray(decode); 32095 const samples = this.getSampleArray(size, outputSize, bps, fn); 32096 return function constructSampledFn(src, srcOffset, dest, destOffset) { 32097 const cubeVertices = 1 << inputSize; 32098 const cubeN = new Float64Array(cubeVertices); 32099 const cubeVertex = new Uint32Array(cubeVertices); 32100 let i, j; 32101 for (j = 0; j < cubeVertices; j++) { 32102 cubeN[j] = 1; 32103 } 32104 let k = outputSize, 32105 pos = 1; 32106 for (i = 0; i < inputSize; ++i) { 32107 const domain_2i = domain[i][0]; 32108 const domain_2i_1 = domain[i][1]; 32109 const xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1); 32110 let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); 32111 const size_i = size[i]; 32112 e = Math.min(Math.max(e, 0), size_i - 1); 32113 const e0 = e < size_i - 1 ? Math.floor(e) : e - 1; 32114 const n0 = e0 + 1 - e; 32115 const n1 = e - e0; 32116 const offset0 = e0 * k; 32117 const offset1 = offset0 + k; 32118 for (j = 0; j < cubeVertices; j++) { 32119 if (j & pos) { 32120 cubeN[j] *= n1; 32121 cubeVertex[j] += offset1; 32122 } else { 32123 cubeN[j] *= n0; 32124 cubeVertex[j] += offset0; 32125 } 32126 } 32127 k *= size_i; 32128 pos <<= 1; 32129 } 32130 for (j = 0; j < outputSize; ++j) { 32131 let rj = 0; 32132 for (i = 0; i < cubeVertices; i++) { 32133 rj += samples[cubeVertex[i] + j] * cubeN[i]; 32134 } 32135 rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); 32136 dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); 32137 } 32138 }; 32139 } 32140 static constructInterpolated({ 32141 xref, 32142 isEvalSupported, 32143 dict 32144 }) { 32145 const c0 = toNumberArray(dict.getArray("C0")) || [0]; 32146 const c1 = toNumberArray(dict.getArray("C1")) || [1]; 32147 const n = dict.get("N"); 32148 const diff = []; 32149 for (let i = 0, ii = c0.length; i < ii; ++i) { 32150 diff.push(c1[i] - c0[i]); 32151 } 32152 const length = diff.length; 32153 return function constructInterpolatedFn(src, srcOffset, dest, destOffset) { 32154 const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n; 32155 for (let j = 0; j < length; ++j) { 32156 dest[destOffset + j] = c0[j] + x * diff[j]; 32157 } 32158 }; 32159 } 32160 static constructStiched({ 32161 xref, 32162 isEvalSupported, 32163 dict 32164 }) { 32165 const domain = toNumberArray(dict.getArray("Domain")); 32166 if (!domain) { 32167 throw new FormatError("No domain"); 32168 } 32169 const inputSize = domain.length / 2; 32170 if (inputSize !== 1) { 32171 throw new FormatError("Bad domain for stiched function"); 32172 } 32173 const fns = []; 32174 for (const fn of dict.get("Functions")) { 32175 fns.push(this.parse({ 32176 xref, 32177 isEvalSupported, 32178 fn: xref.fetchIfRef(fn) 32179 })); 32180 } 32181 const bounds = toNumberArray(dict.getArray("Bounds")); 32182 const encode = toNumberArray(dict.getArray("Encode")); 32183 const tmpBuf = new Float32Array(1); 32184 return function constructStichedFn(src, srcOffset, dest, destOffset) { 32185 const clip = function constructStichedFromIRClip(v, min, max) { 32186 if (v > max) { 32187 v = max; 32188 } else if (v < min) { 32189 v = min; 32190 } 32191 return v; 32192 }; 32193 const v = clip(src[srcOffset], domain[0], domain[1]); 32194 const length = bounds.length; 32195 let i; 32196 for (i = 0; i < length; ++i) { 32197 if (v < bounds[i]) { 32198 break; 32199 } 32200 } 32201 let dmin = domain[0]; 32202 if (i > 0) { 32203 dmin = bounds[i - 1]; 32204 } 32205 let dmax = domain[1]; 32206 if (i < bounds.length) { 32207 dmax = bounds[i]; 32208 } 32209 const rmin = encode[2 * i]; 32210 const rmax = encode[2 * i + 1]; 32211 tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); 32212 fns[i](tmpBuf, 0, dest, destOffset); 32213 }; 32214 } 32215 static constructPostScript({ 32216 xref, 32217 isEvalSupported, 32218 fn, 32219 dict 32220 }) { 32221 const domain = toNumberArray(dict.getArray("Domain")); 32222 const range = toNumberArray(dict.getArray("Range")); 32223 if (!domain) { 32224 throw new FormatError("No domain."); 32225 } 32226 if (!range) { 32227 throw new FormatError("No range."); 32228 } 32229 const lexer = new PostScriptLexer(fn); 32230 const parser = new PostScriptParser(lexer); 32231 const code = parser.parse(); 32232 if (isEvalSupported && FeatureTest.isEvalSupported) { 32233 const compiled = new PostScriptCompiler().compile(code, domain, range); 32234 if (compiled) { 32235 return new Function("src", "srcOffset", "dest", "destOffset", compiled); 32236 } 32237 } 32238 info("Unable to compile PS function"); 32239 const numOutputs = range.length >> 1; 32240 const numInputs = domain.length >> 1; 32241 const evaluator = new PostScriptEvaluator(code); 32242 const cache = Object.create(null); 32243 const MAX_CACHE_SIZE = 2048 * 4; 32244 let cache_available = MAX_CACHE_SIZE; 32245 const tmpBuf = new Float32Array(numInputs); 32246 return function constructPostScriptFn(src, srcOffset, dest, destOffset) { 32247 let i, value; 32248 let key = ""; 32249 const input = tmpBuf; 32250 for (i = 0; i < numInputs; i++) { 32251 value = src[srcOffset + i]; 32252 input[i] = value; 32253 key += value + "_"; 32254 } 32255 const cachedValue = cache[key]; 32256 if (cachedValue !== undefined) { 32257 dest.set(cachedValue, destOffset); 32258 return; 32259 } 32260 const output = new Float32Array(numOutputs); 32261 const stack = evaluator.execute(input); 32262 const stackIndex = stack.length - numOutputs; 32263 for (i = 0; i < numOutputs; i++) { 32264 value = stack[stackIndex + i]; 32265 let bound = range[i * 2]; 32266 if (value < bound) { 32267 value = bound; 32268 } else { 32269 bound = range[i * 2 + 1]; 32270 if (value > bound) { 32271 value = bound; 32272 } 32273 } 32274 output[i] = value; 32275 } 32276 if (cache_available > 0) { 32277 cache_available--; 32278 cache[key] = output; 32279 } 32280 dest.set(output, destOffset); 32281 }; 32282 } 32283} 32284function isPDFFunction(v) { 32285 let fnDict; 32286 if (v instanceof Dict) { 32287 fnDict = v; 32288 } else if (v instanceof BaseStream) { 32289 fnDict = v.dict; 32290 } else { 32291 return false; 32292 } 32293 return fnDict.has("FunctionType"); 32294} 32295class PostScriptStack { 32296 static MAX_STACK_SIZE = 100; 32297 constructor(initialStack) { 32298 this.stack = initialStack ? Array.from(initialStack) : []; 32299 } 32300 push(value) { 32301 if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) { 32302 throw new Error("PostScript function stack overflow."); 32303 } 32304 this.stack.push(value); 32305 } 32306 pop() { 32307 if (this.stack.length <= 0) { 32308 throw new Error("PostScript function stack underflow."); 32309 } 32310 return this.stack.pop(); 32311 } 32312 copy(n) { 32313 if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) { 32314 throw new Error("PostScript function stack overflow."); 32315 } 32316 const stack = this.stack; 32317 for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) { 32318 stack.push(stack[i]); 32319 } 32320 } 32321 index(n) { 32322 this.push(this.stack[this.stack.length - n - 1]); 32323 } 32324 roll(n, p) { 32325 const stack = this.stack; 32326 const l = stack.length - n; 32327 const r = stack.length - 1; 32328 const c = l + (p - Math.floor(p / n) * n); 32329 for (let i = l, j = r; i < j; i++, j--) { 32330 const t = stack[i]; 32331 stack[i] = stack[j]; 32332 stack[j] = t; 32333 } 32334 for (let i = l, j = c - 1; i < j; i++, j--) { 32335 const t = stack[i]; 32336 stack[i] = stack[j]; 32337 stack[j] = t; 32338 } 32339 for (let i = c, j = r; i < j; i++, j--) { 32340 const t = stack[i]; 32341 stack[i] = stack[j]; 32342 stack[j] = t; 32343 } 32344 } 32345} 32346class PostScriptEvaluator { 32347 constructor(operators) { 32348 this.operators = operators; 32349 } 32350 execute(initialStack) { 32351 const stack = new PostScriptStack(initialStack); 32352 let counter = 0; 32353 const operators = this.operators; 32354 const length = operators.length; 32355 let operator, a, b; 32356 while (counter < length) { 32357 operator = operators[counter++]; 32358 if (typeof operator === "number") { 32359 stack.push(operator); 32360 continue; 32361 } 32362 switch (operator) { 32363 case "jz": 32364 b = stack.pop(); 32365 a = stack.pop(); 32366 if (!a) { 32367 counter = b; 32368 } 32369 break; 32370 case "j": 32371 a = stack.pop(); 32372 counter = a; 32373 break; 32374 case "abs": 32375 a = stack.pop();
vendor: 10,137 bytes, lines 32376-32830
32376 stack.push(Math.abs(a)); 32377 break; 32378 case "add": 32379 b = stack.pop(); 32380 a = stack.pop(); 32381 stack.push(a + b); 32382 break; 32383 case "and": 32384 b = stack.pop(); 32385 a = stack.pop(); 32386 if (typeof a === "boolean" && typeof b === "boolean") { 32387 stack.push(a && b); 32388 } else { 32389 stack.push(a & b); 32390 } 32391 break; 32392 case "atan": 32393 b = stack.pop(); 32394 a = stack.pop(); 32395 a = Math.atan2(a, b) / Math.PI * 180; 32396 if (a < 0) { 32397 a += 360; 32398 } 32399 stack.push(a); 32400 break; 32401 case "bitshift": 32402 b = stack.pop(); 32403 a = stack.pop(); 32404 if (a > 0) { 32405 stack.push(a << b); 32406 } else { 32407 stack.push(a >> b); 32408 } 32409 break; 32410 case "ceiling": 32411 a = stack.pop(); 32412 stack.push(Math.ceil(a)); 32413 break; 32414 case "copy": 32415 a = stack.pop(); 32416 stack.copy(a); 32417 break; 32418 case "cos": 32419 a = stack.pop(); 32420 stack.push(Math.cos(a % 360 / 180 * Math.PI)); 32421 break; 32422 case "cvi": 32423 a = stack.pop() | 0; 32424 stack.push(a); 32425 break; 32426 case "cvr": 32427 break; 32428 case "div": 32429 b = stack.pop(); 32430 a = stack.pop(); 32431 stack.push(a / b); 32432 break; 32433 case "dup": 32434 stack.copy(1); 32435 break; 32436 case "eq": 32437 b = stack.pop(); 32438 a = stack.pop(); 32439 stack.push(a === b); 32440 break; 32441 case "exch": 32442 stack.roll(2, 1); 32443 break; 32444 case "exp": 32445 b = stack.pop(); 32446 a = stack.pop(); 32447 stack.push(a ** b); 32448 break; 32449 case "false": 32450 stack.push(false); 32451 break; 32452 case "floor": 32453 a = stack.pop(); 32454 stack.push(Math.floor(a)); 32455 break; 32456 case "ge": 32457 b = stack.pop(); 32458 a = stack.pop(); 32459 stack.push(a >= b); 32460 break; 32461 case "gt": 32462 b = stack.pop(); 32463 a = stack.pop(); 32464 stack.push(a > b); 32465 break; 32466 case "idiv": 32467 b = stack.pop(); 32468 a = stack.pop(); 32469 stack.push(a / b | 0); 32470 break; 32471 case "index": 32472 a = stack.pop(); 32473 stack.index(a); 32474 break; 32475 case "le": 32476 b = stack.pop(); 32477 a = stack.pop(); 32478 stack.push(a <= b); 32479 break; 32480 case "ln": 32481 a = stack.pop(); 32482 stack.push(Math.log(a)); 32483 break; 32484 case "log": 32485 a = stack.pop(); 32486 stack.push(Math.log10(a)); 32487 break; 32488 case "lt": 32489 b = stack.pop(); 32490 a = stack.pop(); 32491 stack.push(a < b); 32492 break; 32493 case "mod": 32494 b = stack.pop(); 32495 a = stack.pop(); 32496 stack.push(a % b); 32497 break; 32498 case "mul": 32499 b = stack.pop(); 32500 a = stack.pop(); 32501 stack.push(a * b); 32502 break; 32503 case "ne": 32504 b = stack.pop(); 32505 a = stack.pop(); 32506 stack.push(a !== b); 32507 break; 32508 case "neg": 32509 a = stack.pop(); 32510 stack.push(-a); 32511 break; 32512 case "not": 32513 a = stack.pop(); 32514 if (typeof a === "boolean") { 32515 stack.push(!a); 32516 } else { 32517 stack.push(~a); 32518 } 32519 break; 32520 case "or": 32521 b = stack.pop(); 32522 a = stack.pop(); 32523 if (typeof a === "boolean" && typeof b === "boolean") { 32524 stack.push(a || b); 32525 } else { 32526 stack.push(a | b); 32527 } 32528 break; 32529 case "pop": 32530 stack.pop(); 32531 break; 32532 case "roll": 32533 b = stack.pop(); 32534 a = stack.pop(); 32535 stack.roll(a, b); 32536 break; 32537 case "round": 32538 a = stack.pop(); 32539 stack.push(Math.round(a)); 32540 break; 32541 case "sin": 32542 a = stack.pop(); 32543 stack.push(Math.sin(a % 360 / 180 * Math.PI)); 32544 break; 32545 case "sqrt": 32546 a = stack.pop(); 32547 stack.push(Math.sqrt(a)); 32548 break; 32549 case "sub": 32550 b = stack.pop(); 32551 a = stack.pop(); 32552 stack.push(a - b); 32553 break; 32554 case "true": 32555 stack.push(true); 32556 break; 32557 case "truncate": 32558 a = stack.pop(); 32559 a = a < 0 ? Math.ceil(a) : Math.floor(a); 32560 stack.push(a); 32561 break; 32562 case "xor": 32563 b = stack.pop(); 32564 a = stack.pop(); 32565 if (typeof a === "boolean" && typeof b === "boolean") { 32566 stack.push(a !== b); 32567 } else { 32568 stack.push(a ^ b); 32569 } 32570 break; 32571 default: 32572 throw new FormatError(`Unknown operator ${operator}`); 32573 } 32574 } 32575 return stack.stack; 32576 } 32577} 32578class AstNode { 32579 constructor(type) { 32580 this.type = type; 32581 } 32582 visit(visitor) { 32583 unreachable("abstract method"); 32584 } 32585} 32586class AstArgument extends AstNode { 32587 constructor(index, min, max) { 32588 super("args"); 32589 this.index = index; 32590 this.min = min; 32591 this.max = max; 32592 } 32593 visit(visitor) { 32594 visitor.visitArgument(this); 32595 } 32596} 32597class AstLiteral extends AstNode { 32598 constructor(number) { 32599 super("literal"); 32600 this.number = number; 32601 this.min = number; 32602 this.max = number; 32603 } 32604 visit(visitor) { 32605 visitor.visitLiteral(this); 32606 } 32607} 32608class AstBinaryOperation extends AstNode { 32609 constructor(op, arg1, arg2, min, max) { 32610 super("binary"); 32611 this.op = op; 32612 this.arg1 = arg1; 32613 this.arg2 = arg2; 32614 this.min = min; 32615 this.max = max; 32616 } 32617 visit(visitor) { 32618 visitor.visitBinaryOperation(this); 32619 } 32620} 32621class AstMin extends AstNode { 32622 constructor(arg, max) { 32623 super("max"); 32624 this.arg = arg; 32625 this.min = arg.min; 32626 this.max = max; 32627 } 32628 visit(visitor) { 32629 visitor.visitMin(this); 32630 } 32631} 32632class AstVariable extends AstNode { 32633 constructor(index, min, max) { 32634 super("var"); 32635 this.index = index; 32636 this.min = min; 32637 this.max = max; 32638 } 32639 visit(visitor) { 32640 visitor.visitVariable(this); 32641 } 32642} 32643class AstVariableDefinition extends AstNode { 32644 constructor(variable, arg) { 32645 super("definition"); 32646 this.variable = variable; 32647 this.arg = arg; 32648 } 32649 visit(visitor) { 32650 visitor.visitVariableDefinition(this); 32651 } 32652} 32653class ExpressionBuilderVisitor { 32654 constructor() { 32655 this.parts = []; 32656 } 32657 visitArgument(arg) { 32658 this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))"); 32659 } 32660 visitVariable(variable) { 32661 this.parts.push("v", variable.index); 32662 } 32663 visitLiteral(literal) { 32664 this.parts.push(literal.number); 32665 } 32666 visitBinaryOperation(operation) { 32667 this.parts.push("("); 32668 operation.arg1.visit(this); 32669 this.parts.push(" ", operation.op, " "); 32670 operation.arg2.visit(this); 32671 this.parts.push(")"); 32672 } 32673 visitVariableDefinition(definition) { 32674 this.parts.push("var "); 32675 definition.variable.visit(this); 32676 this.parts.push(" = "); 32677 definition.arg.visit(this); 32678 this.parts.push(";"); 32679 } 32680 visitMin(max) { 32681 this.parts.push("Math.min("); 32682 max.arg.visit(this); 32683 this.parts.push(", ", max.max, ")"); 32684 } 32685 toString() { 32686 return this.parts.join(""); 32687 } 32688} 32689function buildAddOperation(num1, num2) { 32690 if (num2.type === "literal" && num2.number === 0) { 32691 return num1; 32692 } 32693 if (num1.type === "literal" && num1.number === 0) { 32694 return num2; 32695 } 32696 if (num2.type === "literal" && num1.type === "literal") { 32697 return new AstLiteral(num1.number + num2.number); 32698 } 32699 return new AstBinaryOperation("+", num1, num2, num1.min + num2.min, num1.max + num2.max); 32700} 32701function buildMulOperation(num1, num2) { 32702 if (num2.type === "literal") { 32703 if (num2.number === 0) { 32704 return new AstLiteral(0); 32705 } else if (num2.number === 1) { 32706 return num1; 32707 } else if (num1.type === "literal") { 32708 return new AstLiteral(num1.number * num2.number); 32709 } 32710 } 32711 if (num1.type === "literal") { 32712 if (num1.number === 0) { 32713 return new AstLiteral(0); 32714 } else if (num1.number === 1) { 32715 return num2; 32716 } 32717 } 32718 const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); 32719 const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); 32720 return new AstBinaryOperation("*", num1, num2, min, max); 32721} 32722function buildSubOperation(num1, num2) { 32723 if (num2.type === "literal") { 32724 if (num2.number === 0) { 32725 return num1; 32726 } else if (num1.type === "literal") { 32727 return new AstLiteral(num1.number - num2.number); 32728 } 32729 } 32730 if (num2.type === "binary" && num2.op === "-" && num1.type === "literal" && num1.number === 1 && num2.arg1.type === "literal" && num2.arg1.number === 1) { 32731 return num2.arg2; 32732 } 32733 return new AstBinaryOperation("-", num1, num2, num1.min - num2.max, num1.max - num2.min); 32734} 32735function buildMinOperation(num1, max) { 32736 if (num1.min >= max) { 32737 return new AstLiteral(max); 32738 } else if (num1.max <= max) { 32739 return num1; 32740 } 32741 return new AstMin(num1, max); 32742} 32743class PostScriptCompiler { 32744 compile(code, domain, range) { 32745 const stack = []; 32746 const instructions = []; 32747 const inputSize = domain.length >> 1, 32748 outputSize = range.length >> 1; 32749 let lastRegister = 0; 32750 let n, j; 32751 let num1, num2, ast1, ast2, tmpVar, item; 32752 for (let i = 0; i < inputSize; i++) { 32753 stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); 32754 } 32755 for (let i = 0, ii = code.length; i < ii; i++) { 32756 item = code[i]; 32757 if (typeof item === "number") { 32758 stack.push(new AstLiteral(item)); 32759 continue; 32760 } 32761 switch (item) { 32762 case "add": 32763 if (stack.length < 2) { 32764 return null; 32765 } 32766 num2 = stack.pop(); 32767 num1 = stack.pop(); 32768 stack.push(buildAddOperation(num1, num2)); 32769 break; 32770 case "cvr": 32771 if (stack.length < 1) { 32772 return null; 32773 } 32774 break; 32775 case "mul": 32776 if (stack.length < 2) { 32777 return null; 32778 } 32779 num2 = stack.pop(); 32780 num1 = stack.pop(); 32781 stack.push(buildMulOperation(num1, num2)); 32782 break; 32783 case "sub": 32784 if (stack.length < 2) { 32785 return null; 32786 } 32787 num2 = stack.pop(); 32788 num1 = stack.pop(); 32789 stack.push(buildSubOperation(num1, num2)); 32790 break; 32791 case "exch": 32792 if (stack.length < 2) { 32793 return null; 32794 } 32795 ast1 = stack.pop(); 32796 ast2 = stack.pop(); 32797 stack.push(ast1, ast2); 32798 break; 32799 case "pop": 32800 if (stack.length < 1) { 32801 return null; 32802 } 32803 stack.pop(); 32804 break; 32805 case "index": 32806 if (stack.length < 1) { 32807 return null; 32808 } 32809 num1 = stack.pop(); 32810 if (num1.type !== "literal") { 32811 return null; 32812 } 32813 n = num1.number; 32814 if (n < 0 || !Number.isInteger(n) || stack.length < n) { 32815 return null; 32816 } 32817 ast1 = stack[stack.length - n - 1]; 32818 if (ast1.type === "literal" || ast1.type === "var") { 32819 stack.push(ast1); 32820 break; 32821 } 32822 tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); 32823 stack[stack.length - n - 1] = tmpVar; 32824 stack.push(tmpVar); 32825 instructions.push(new AstVariableDefinition(tmpVar, ast1)); 32826 break; 32827 case "dup": 32828 if (stack.length < 1) { 32829 return null; 32830 }
vendor: 5,748 bytes, lines 32831-32939
32831 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]) { 32832 num1 = stack.pop(); 32833 stack.push(buildMinOperation(num1, code[i + 1])); 32834 i += 6; 32835 break; 32836 } 32837 ast1 = stack.at(-1); 32838 if (ast1.type === "literal" || ast1.type === "var") { 32839 stack.push(ast1); 32840 break; 32841 } 32842 tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); 32843 stack[stack.length - 1] = tmpVar; 32844 stack.push(tmpVar); 32845 instructions.push(new AstVariableDefinition(tmpVar, ast1)); 32846 break; 32847 case "roll": 32848 if (stack.length < 2) { 32849 return null; 32850 } 32851 num2 = stack.pop(); 32852 num1 = stack.pop(); 32853 if (num2.type !== "literal" || num1.type !== "literal") { 32854 return null; 32855 } 32856 j = num2.number; 32857 n = num1.number; 32858 if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) { 32859 return null; 32860 } 32861 j = (j % n + n) % n; 32862 if (j === 0) { 32863 break; 32864 } 32865 stack.push(...stack.splice(stack.length - n, n - j)); 32866 break; 32867 default: 32868 return null; 32869 } 32870 } 32871 if (stack.length !== outputSize) { 32872 return null; 32873 } 32874 const result = []; 32875 for (const instruction of instructions) { 32876 const statementBuilder = new ExpressionBuilderVisitor(); 32877 instruction.visit(statementBuilder); 32878 result.push(statementBuilder.toString()); 32879 } 32880 for (let i = 0, ii = stack.length; i < ii; i++) { 32881 const expr = stack[i], 32882 statementBuilder = new ExpressionBuilderVisitor(); 32883 expr.visit(statementBuilder); 32884 const min = range[i * 2], 32885 max = range[i * 2 + 1]; 32886 const out = [statementBuilder.toString()]; 32887 if (min > expr.min) { 32888 out.unshift("Math.max(", min, ", "); 32889 out.push(")"); 32890 } 32891 if (max < expr.max) { 32892 out.unshift("Math.min(", max, ", "); 32893 out.push(")"); 32894 } 32895 out.unshift("dest[destOffset + ", i, "] = "); 32896 out.push(";"); 32897 result.push(out.join("")); 32898 } 32899 return result.join("\n"); 32900 } 32901} 32902 32903;// ./src/core/bidi.js 32904 32905const 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"]; 32906const 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"]; 32907function isOdd(i) { 32908 return (i & 1) !== 0; 32909} 32910function isEven(i) { 32911 return (i & 1) === 0; 32912} 32913function findUnequal(arr, start, value) { 32914 let j, jj; 32915 for (j = start, jj = arr.length; j < jj; ++j) { 32916 if (arr[j] !== value) { 32917 return j; 32918 } 32919 } 32920 return j; 32921} 32922function setValues(arr, start, end, value) { 32923 for (let j = start; j < end; ++j) { 32924 arr[j] = value; 32925 } 32926} 32927function reverseValues(arr, start, end) { 32928 for (let i = start, j = end - 1; i < j; ++i, --j) { 32929 const temp = arr[i]; 32930 arr[i] = arr[j]; 32931 arr[j] = temp; 32932 } 32933} 32934function createBidiText(str, isLTR, vertical = false) { 32935 let dir = "ltr"; 32936 if (vertical) { 32937 dir = "ttb"; 32938 } else if (!isLTR) { 32939 dir = "rtl";
vendor: 3,188 bytes, lines 32940-33075
32940 } 32941 return { 32942 str, 32943 dir 32944 }; 32945} 32946const chars = []; 32947const types = []; 32948function bidi(str, startLevel = -1, vertical = false) { 32949 let isLTR = true; 32950 const strLength = str.length; 32951 if (strLength === 0 || vertical) { 32952 return createBidiText(str, isLTR, vertical); 32953 } 32954 chars.length = strLength; 32955 types.length = strLength; 32956 let numBidi = 0; 32957 let i, ii; 32958 for (i = 0; i < strLength; ++i) { 32959 chars[i] = str.charAt(i); 32960 const charCode = str.charCodeAt(i); 32961 let charType = "L"; 32962 if (charCode <= 0x00ff) { 32963 charType = baseTypes[charCode]; 32964 } else if (0x0590 <= charCode && charCode <= 0x05f4) { 32965 charType = "R"; 32966 } else if (0x0600 <= charCode && charCode <= 0x06ff) { 32967 charType = arabicTypes[charCode & 0xff]; 32968 if (!charType) { 32969 warn("Bidi: invalid Unicode character " + charCode.toString(16)); 32970 } 32971 } else if (0x0700 <= charCode && charCode <= 0x08ac || 0xfb50 <= charCode && charCode <= 0xfdff || 0xfe70 <= charCode && charCode <= 0xfeff) { 32972 charType = "AL"; 32973 } 32974 if (charType === "R" || charType === "AL" || charType === "AN") { 32975 numBidi++; 32976 } 32977 types[i] = charType; 32978 } 32979 if (numBidi === 0) { 32980 isLTR = true; 32981 return createBidiText(str, isLTR); 32982 } 32983 if (startLevel === -1) { 32984 if (numBidi / strLength < 0.3 && strLength > 4) { 32985 isLTR = true; 32986 startLevel = 0; 32987 } else { 32988 isLTR = false; 32989 startLevel = 1; 32990 } 32991 } 32992 const levels = []; 32993 for (i = 0; i < strLength; ++i) { 32994 levels[i] = startLevel; 32995 } 32996 const e = isOdd(startLevel) ? "R" : "L"; 32997 const sor = e; 32998 const eor = sor; 32999 let lastType = sor; 33000 for (i = 0; i < strLength; ++i) { 33001 if (types[i] === "NSM") { 33002 types[i] = lastType; 33003 } else { 33004 lastType = types[i]; 33005 } 33006 } 33007 lastType = sor; 33008 let t; 33009 for (i = 0; i < strLength; ++i) { 33010 t = types[i]; 33011 if (t === "EN") { 33012 types[i] = lastType === "AL" ? "AN" : "EN"; 33013 } else if (t === "R" || t === "L" || t === "AL") { 33014 lastType = t; 33015 } 33016 } 33017 for (i = 0; i < strLength; ++i) { 33018 t = types[i]; 33019 if (t === "AL") { 33020 types[i] = "R"; 33021 } 33022 } 33023 for (i = 1; i < strLength - 1; ++i) { 33024 if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") { 33025 types[i] = "EN"; 33026 } 33027 if (types[i] === "CS" && (types[i - 1] === "EN" || types[i - 1] === "AN") && types[i + 1] === types[i - 1]) { 33028 types[i] = types[i - 1]; 33029 } 33030 } 33031 for (i = 0; i < strLength; ++i) { 33032 if (types[i] === "EN") { 33033 for (let j = i - 1; j >= 0; --j) { 33034 if (types[j] !== "ET") { 33035 break; 33036 } 33037 types[j] = "EN"; 33038 } 33039 for (let j = i + 1; j < strLength; ++j) { 33040 if (types[j] !== "ET") { 33041 break; 33042 } 33043 types[j] = "EN"; 33044 } 33045 } 33046 } 33047 for (i = 0; i < strLength; ++i) { 33048 t = types[i]; 33049 if (t === "WS" || t === "ES" || t === "ET" || t === "CS") { 33050 types[i] = "ON"; 33051 } 33052 } 33053 lastType = sor; 33054 for (i = 0; i < strLength; ++i) { 33055 t = types[i]; 33056 if (t === "EN") { 33057 types[i] = lastType === "L" ? "L" : "EN"; 33058 } else if (t === "R" || t === "L") { 33059 lastType = t; 33060 } 33061 } 33062 for (i = 0; i < strLength; ++i) { 33063 if (types[i] === "ON") { 33064 const end = findUnequal(types, i + 1, "ON"); 33065 let before = sor; 33066 if (i > 0) { 33067 before = types[i - 1]; 33068 } 33069 let after = eor; 33070 if (end + 1 < strLength) { 33071 after = types[end + 1]; 33072 } 33073 if (before !== "L") { 33074 before = "R"; 33075 }
vendor: 1,732 bytes, lines 33076-33170
33076 if (after !== "L") { 33077 after = "R"; 33078 } 33079 if (before === after) { 33080 setValues(types, i, end, before); 33081 } 33082 i = end - 1; 33083 } 33084 } 33085 for (i = 0; i < strLength; ++i) { 33086 if (types[i] === "ON") { 33087 types[i] = e; 33088 } 33089 } 33090 for (i = 0; i < strLength; ++i) { 33091 t = types[i]; 33092 if (isEven(levels[i])) { 33093 if (t === "R") { 33094 levels[i] += 1; 33095 } else if (t === "AN" || t === "EN") { 33096 levels[i] += 2; 33097 } 33098 } else if (t === "L" || t === "AN" || t === "EN") { 33099 levels[i] += 1; 33100 } 33101 } 33102 let highestLevel = -1; 33103 let lowestOddLevel = 99; 33104 let level; 33105 for (i = 0, ii = levels.length; i < ii; ++i) { 33106 level = levels[i]; 33107 if (highestLevel < level) { 33108 highestLevel = level; 33109 } 33110 if (lowestOddLevel > level && isOdd(level)) { 33111 lowestOddLevel = level; 33112 } 33113 } 33114 for (level = highestLevel; level >= lowestOddLevel; --level) { 33115 let start = -1; 33116 for (i = 0, ii = levels.length; i < ii; ++i) { 33117 if (levels[i] < level) { 33118 if (start >= 0) { 33119 reverseValues(chars, start, i); 33120 start = -1; 33121 } 33122 } else if (start < 0) { 33123 start = i; 33124 } 33125 } 33126 if (start >= 0) { 33127 reverseValues(chars, start, levels.length); 33128 } 33129 } 33130 for (i = 0, ii = chars.length; i < ii; ++i) { 33131 const ch = chars[i]; 33132 if (ch === "<" || ch === ">") { 33133 chars[i] = ""; 33134 } 33135 } 33136 return createBidiText(chars.join(""), isLTR); 33137} 33138 33139;// ./src/core/font_substitutions.js 33140 33141 33142 33143 33144 33145 33146 33147 33148 33149 33150 33151 33152 33153const NORMAL = { 33154 style: "normal", 33155 weight: "normal" 33156}; 33157const BOLD = { 33158 style: "normal", 33159 weight: "bold" 33160}; 33161const ITALIC = { 33162 style: "italic", 33163 weight: "normal" 33164}; 33165const BOLDITALIC = { 33166 style: "italic", 33167 weight: "bold" 33168}; 33169const substitutionMap = new Map([["Times-Roman", { 33170 local: ["Times New Roman", "Times-Roman", "Times", "Liberation Serif", "Nimbus Roman", "Nimbus Roman
vendor: 5,884 bytes, lines 33170-33366
33170L", "Tinos", "Thorndale", "TeX Gyre Termes", "FreeSerif", "Linux Libertine O", "Libertinus Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"], 33171 style: NORMAL, 33172 ultimate: "serif" 33173}], ["Times-Bold", { 33174 alias: "Times-Roman", 33175 style: BOLD, 33176 ultimate: "serif" 33177}], ["Times-Italic", { 33178 alias: "Times-Roman", 33179 style: ITALIC, 33180 ultimate: "serif" 33181}], ["Times-BoldItalic", { 33182 alias: "Times-Roman", 33183 style: BOLDITALIC, 33184 ultimate: "serif" 33185}], ["Helvetica", { 33186 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"], 33187 path: "LiberationSans-Regular.ttf", 33188 style: NORMAL, 33189 ultimate: "sans-serif" 33190}], ["Helvetica-Bold", { 33191 alias: "Helvetica", 33192 path: "LiberationSans-Bold.ttf", 33193 style: BOLD, 33194 ultimate: "sans-serif" 33195}], ["Helvetica-Oblique", { 33196 alias: "Helvetica", 33197 path: "LiberationSans-Italic.ttf", 33198 style: ITALIC, 33199 ultimate: "sans-serif" 33200}], ["Helvetica-BoldOblique", { 33201 alias: "Helvetica", 33202 path: "LiberationSans-BoldItalic.ttf", 33203 style: BOLDITALIC, 33204 ultimate: "sans-serif" 33205}], ["Courier", { 33206 local: ["Courier", "Courier New", "Liberation Mono", "Nimbus Mono", "Nimbus Mono L", "Cousine", "Cumberland", "TeX Gyre Cursor", "FreeMono", "Linux Libertine Mono O", "Libertinus Mono"], 33207 style: NORMAL, 33208 ultimate: "monospace" 33209}], ["Courier-Bold", { 33210 alias: "Courier", 33211 style: BOLD, 33212 ultimate: "monospace" 33213}], ["Courier-Oblique", { 33214 alias: "Courier", 33215 style: ITALIC, 33216 ultimate: "monospace" 33217}], ["Courier-BoldOblique", { 33218 alias: "Courier", 33219 style: BOLDITALIC, 33220 ultimate: "monospace" 33221}], ["ArialBlack", { 33222 local: ["Arial Black"], 33223 style: { 33224 style: "normal", 33225 weight: "900" 33226 }, 33227 fallback: "Helvetica-Bold" 33228}], ["ArialBlack-Bold", { 33229 alias: "ArialBlack" 33230}], ["ArialBlack-Italic", { 33231 alias: "ArialBlack", 33232 style: { 33233 style: "italic", 33234 weight: "900" 33235 }, 33236 fallback: "Helvetica-BoldOblique" 33237}], ["ArialBlack-BoldItalic", { 33238 alias: "ArialBlack-Italic" 33239}], ["ArialNarrow", { 33240 local: ["Arial Narrow", "Liberation Sans Narrow", "Helvetica Condensed", "Nimbus Sans Narrow", "TeX Gyre Heros Cn"], 33241 style: NORMAL, 33242 fallback: "Helvetica" 33243}], ["ArialNarrow-Bold", { 33244 alias: "ArialNarrow", 33245 style: BOLD, 33246 fallback: "Helvetica-Bold" 33247}], ["ArialNarrow-Italic", { 33248 alias: "ArialNarrow", 33249 style: ITALIC, 33250 fallback: "Helvetica-Oblique" 33251}], ["ArialNarrow-BoldItalic", { 33252 alias: "ArialNarrow", 33253 style: BOLDITALIC, 33254 fallback: "Helvetica-BoldOblique" 33255}], ["Calibri", { 33256 local: ["Calibri", "Carlito"], 33257 style: NORMAL, 33258 fallback: "Helvetica" 33259}], ["Calibri-Bold", { 33260 alias: "Calibri", 33261 style: BOLD, 33262 fallback: "Helvetica-Bold" 33263}], ["Calibri-Italic", { 33264 alias: "Calibri", 33265 style: ITALIC, 33266 fallback: "Helvetica-Oblique" 33267}], ["Calibri-BoldItalic", { 33268 alias: "Calibri", 33269 style: BOLDITALIC, 33270 fallback: "Helvetica-BoldOblique" 33271}], ["Wingdings", { 33272 local: ["Wingdings", "URW Dingbats"], 33273 style: NORMAL 33274}], ["Wingdings-Regular", { 33275 alias: "Wingdings" 33276}], ["Wingdings-Bold", { 33277 alias: "Wingdings" 33278}]]); 33279const fontAliases = new Map([["Arial-Black", "ArialBlack"]]); 33280function getStyleToAppend(style) { 33281 switch (style) { 33282 case BOLD: 33283 return "Bold"; 33284 case ITALIC: 33285 return "Italic"; 33286 case BOLDITALIC: 33287 return "Bold Italic"; 33288 default: 33289 if (style?.weight === "bold") { 33290 return "Bold"; 33291 } 33292 if (style?.style === "italic") { 33293 return "Italic"; 33294 } 33295 } 33296 return ""; 33297} 33298function getFamilyName(str) { 33299 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"]); 33300 return str.split(/[- ,+]+/g).filter(tok => !keywords.has(tok.toLowerCase())).join(" "); 33301} 33302function generateFont({ 33303 alias, 33304 local, 33305 path, 33306 fallback, 33307 style, 33308 ultimate 33309}, src, localFontPath, useFallback = true, usePath = true, append = "") { 33310 const result = { 33311 style: null, 33312 ultimate: null 33313 }; 33314 if (local) { 33315 const extra = append ? ` ${append}` : ""; 33316 for (const name of local) { 33317 src.push(`local(${name}${extra})`); 33318 } 33319 } 33320 if (alias) { 33321 const substitution = substitutionMap.get(alias); 33322 const aliasAppend = append || getStyleToAppend(style); 33323 Object.assign(result, generateFont(substitution, src, localFontPath, useFallback && !fallback, usePath && !path, aliasAppend)); 33324 } 33325 if (style) { 33326 result.style = style; 33327 } 33328 if (ultimate) { 33329 result.ultimate = ultimate; 33330 } 33331 if (useFallback && fallback) { 33332 const fallbackInfo = substitutionMap.get(fallback); 33333 const { 33334 ultimate: fallbackUltimate 33335 } = generateFont(fallbackInfo, src, localFontPath, useFallback, usePath && !path, append); 33336 result.ultimate ||= fallbackUltimate; 33337 } 33338 if (usePath && path && localFontPath) { 33339 src.push(`url(${localFontPath}${path})`); 33340 } 33341 return result; 33342} 33343function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName, type) { 33344 if (baseFontName.startsWith("InvalidPDFjsFont_")) { 33345 return null; 33346 } 33347 if ((type === "TrueType" || type === "Type1") && /^[A-Z]{6}\+/.test(baseFontName)) { 33348 baseFontName = baseFontName.slice(7); 33349 } 33350 baseFontName = normalizeFontName(baseFontName); 33351 const key = baseFontName; 33352 let substitutionInfo = systemFontCache.get(key); 33353 if (substitutionInfo) { 33354 return substitutionInfo; 33355 } 33356 let substitution = substitutionMap.get(baseFontName); 33357 if (!substitution) { 33358 for (const [alias, subst] of fontAliases) { 33359 if (baseFontName.startsWith(alias)) { 33360 baseFontName = `${subst}${baseFontName.substring(alias.length)}`; 33361 substitution = substitutionMap.get(baseFontName); 33362 break; 33363 } 33364 } 33365 } 33366 let mustAddBaseFont = false;
vendor: 5,055 bytes, lines 33367-33552
33367 if (!substitution) { 33368 substitution = substitutionMap.get(standardFontName); 33369 mustAddBaseFont = true; 33370 } 33371 const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`; 33372 if (!substitution) { 33373 if (!validateFontName(baseFontName)) { 33374 warn(`Cannot substitute the font because of its name: ${baseFontName}`); 33375 systemFontCache.set(key, null); 33376 return null; 33377 } 33378 const bold = /bold/gi.test(baseFontName); 33379 const italic = /oblique|italic/gi.test(baseFontName); 33380 const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || NORMAL; 33381 substitutionInfo = { 33382 css: `"${getFamilyName(baseFontName)}",${loadedName}`, 33383 guessFallback: true, 33384 loadedName, 33385 baseFontName, 33386 src: `local(${baseFontName})`, 33387 style 33388 }; 33389 systemFontCache.set(key, substitutionInfo); 33390 return substitutionInfo; 33391 } 33392 const src = []; 33393 if (mustAddBaseFont && validateFontName(baseFontName)) { 33394 src.push(`local(${baseFontName})`); 33395 } 33396 const { 33397 style, 33398 ultimate 33399 } = generateFont(substitution, src, localFontPath); 33400 const guessFallback = ultimate === null; 33401 const fallback = guessFallback ? "" : `,${ultimate}`; 33402 substitutionInfo = { 33403 css: `"${getFamilyName(baseFontName)}",${loadedName}${fallback}`, 33404 guessFallback, 33405 loadedName, 33406 baseFontName, 33407 src: src.join(","), 33408 style 33409 }; 33410 systemFontCache.set(key, substitutionInfo); 33411 return substitutionInfo; 33412} 33413 33414;// ./src/core/image_resizer.js 33415 33416 33417 33418 33419 33420 33421 33422 33423 33424const MIN_IMAGE_DIM = 2048; 33425const MAX_IMAGE_DIM = 65537; 33426const MAX_ERROR = 128; 33427class ImageResizer { 33428 static #goodSquareLength = MIN_IMAGE_DIM; 33429 static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; 33430 constructor(imgData, isMask) { 33431 this._imgData = imgData; 33432 this._isMask = isMask; 33433 } 33434 static get canUseImageDecoder() { 33435 return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false)); 33436 } 33437 static needsToBeResized(width, height) { 33438 if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) { 33439 return false; 33440 } 33441 const { 33442 MAX_DIM 33443 } = this; 33444 if (width > MAX_DIM || height > MAX_DIM) { 33445 return true; 33446 } 33447 const area = width * height; 33448 if (this._hasMaxArea) { 33449 return area > this.MAX_AREA; 33450 } 33451 if (area < this.#goodSquareLength ** 2) { 33452 return false; 33453 } 33454 if (this._areGoodDims(width, height)) { 33455 this.#goodSquareLength = Math.max(this.#goodSquareLength, Math.floor(Math.sqrt(width * height))); 33456 return false; 33457 } 33458 this.#goodSquareLength = this._guessMax(this.#goodSquareLength, MAX_DIM, MAX_ERROR, 0); 33459 const maxArea = this.MAX_AREA = this.#goodSquareLength ** 2; 33460 return area > maxArea; 33461 } 33462 static get MAX_DIM() { 33463 return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); 33464 } 33465 static get MAX_AREA() { 33466 this._hasMaxArea = true; 33467 return shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); 33468 } 33469 static set MAX_AREA(area) { 33470 if (area >= 0) { 33471 this._hasMaxArea = true; 33472 shadow(this, "MAX_AREA", area); 33473 } 33474 } 33475 static setOptions({ 33476 canvasMaxAreaInBytes = -1, 33477 isImageDecoderSupported = false 33478 }) { 33479 if (!this._hasMaxArea) { 33480 this.MAX_AREA = canvasMaxAreaInBytes >> 2; 33481 } 33482 this.#isImageDecoderSupported = isImageDecoderSupported; 33483 } 33484 static _areGoodDims(width, height) { 33485 try { 33486 const canvas = new OffscreenCanvas(width, height); 33487 const ctx = canvas.getContext("2d"); 33488 ctx.fillRect(0, 0, 1, 1); 33489 const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; 33490 canvas.width = canvas.height = 1; 33491 return opacity !== 0; 33492 } catch { 33493 return false; 33494 } 33495 } 33496 static _guessMax(start, end, tolerance, defaultHeight) { 33497 while (start + tolerance + 1 < end) { 33498 const middle = Math.floor((start + end) / 2); 33499 const height = defaultHeight || middle; 33500 if (this._areGoodDims(middle, height)) { 33501 start = middle; 33502 } else { 33503 end = middle; 33504 } 33505 } 33506 return start; 33507 } 33508 static async createImage(imgData, isMask = false) { 33509 return new ImageResizer(imgData, isMask)._createImage(); 33510 } 33511 async _createImage() { 33512 const { 33513 _imgData: imgData 33514 } = this; 33515 const { 33516 width, 33517 height 33518 } = imgData; 33519 if (width * height * 4 > MAX_INT_32) { 33520 const result = this.#rescaleImageData(); 33521 if (result) { 33522 return result; 33523 } 33524 } 33525 const data = this._encodeBMP(); 33526 let decoder, imagePromise; 33527 if (await ImageResizer.canUseImageDecoder) { 33528 decoder = new ImageDecoder({ 33529 data, 33530 type: "image/bmp", 33531 preferAnimation: false, 33532 transfer: [data.buffer] 33533 }); 33534 imagePromise = decoder.decode().catch(reason => { 33535 warn(`BMP image decoding failed: ${reason}`); 33536 return createImageBitmap(new Blob([this._encodeBMP().buffer], { 33537 type: "image/bmp" 33538 })); 33539 }).finally(() => { 33540 decoder.close(); 33541 }); 33542 } else { 33543 imagePromise = createImageBitmap(new Blob([data.buffer], { 33544 type: "image/bmp" 33545 })); 33546 } 33547 const { 33548 MAX_AREA, 33549 MAX_DIM 33550 } = ImageResizer; 33551 const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA)); 33552 const firstFactor = Math.max(minFactor, 2);
vendor: 9,422 bytes, lines 33553-33906
33553 const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; 33554 const N = Math.floor(Math.log2(factor)); 33555 const steps = new Array(N + 2).fill(2); 33556 steps[0] = firstFactor; 33557 steps.splice(-1, 1, factor / (1 << N)); 33558 let newWidth = width; 33559 let newHeight = height; 33560 const result = await imagePromise; 33561 let bitmap = result.image || result; 33562 for (const step of steps) { 33563 const prevWidth = newWidth; 33564 const prevHeight = newHeight; 33565 newWidth = Math.floor(newWidth / step) - 1; 33566 newHeight = Math.floor(newHeight / step) - 1; 33567 const canvas = new OffscreenCanvas(newWidth, newHeight); 33568 const ctx = canvas.getContext("2d"); 33569 ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); 33570 bitmap.close(); 33571 bitmap = canvas.transferToImageBitmap(); 33572 } 33573 imgData.data = null; 33574 imgData.bitmap = bitmap; 33575 imgData.width = newWidth; 33576 imgData.height = newHeight; 33577 return imgData; 33578 } 33579 #rescaleImageData() { 33580 const { 33581 _imgData: imgData 33582 } = this; 33583 const { 33584 data, 33585 width, 33586 height, 33587 kind 33588 } = imgData; 33589 const rgbaSize = width * height * 4; 33590 const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32)); 33591 const newWidth = width >> K; 33592 const newHeight = height >> K; 33593 let rgbaData; 33594 let maxHeight = height; 33595 try { 33596 rgbaData = new Uint8Array(rgbaSize); 33597 } catch { 33598 let n = Math.floor(Math.log2(rgbaSize + 1)); 33599 while (true) { 33600 try { 33601 rgbaData = new Uint8Array(2 ** n - 1); 33602 break; 33603 } catch { 33604 n -= 1; 33605 } 33606 } 33607 maxHeight = Math.floor((2 ** n - 1) / (width * 4)); 33608 const newSize = width * maxHeight * 4; 33609 if (newSize < rgbaData.length) { 33610 rgbaData = new Uint8Array(newSize); 33611 } 33612 } 33613 const src32 = new Uint32Array(rgbaData.buffer); 33614 const dest32 = new Uint32Array(newWidth * newHeight); 33615 let srcPos = 0; 33616 let newIndex = 0; 33617 const step = Math.ceil(height / maxHeight); 33618 const remainder = height % maxHeight === 0 ? height : height % maxHeight; 33619 for (let k = 0; k < step; k++) { 33620 const h = k < step - 1 ? maxHeight : remainder; 33621 ({ 33622 srcPos 33623 } = convertToRGBA({ 33624 kind, 33625 src: data, 33626 dest: src32, 33627 width, 33628 height: h, 33629 inverseDecode: this._isMask, 33630 srcPos 33631 })); 33632 for (let i = 0, ii = h >> K; i < ii; i++) { 33633 const buf = src32.subarray((i << K) * width); 33634 for (let j = 0; j < newWidth; j++) { 33635 dest32[newIndex++] = buf[j << K]; 33636 } 33637 } 33638 } 33639 if (ImageResizer.needsToBeResized(newWidth, newHeight)) { 33640 imgData.data = dest32; 33641 imgData.width = newWidth; 33642 imgData.height = newHeight; 33643 imgData.kind = ImageKind.RGBA_32BPP; 33644 return null; 33645 } 33646 const canvas = new OffscreenCanvas(newWidth, newHeight); 33647 const ctx = canvas.getContext("2d", { 33648 willReadFrequently: true 33649 }); 33650 ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0); 33651 imgData.data = null; 33652 imgData.bitmap = canvas.transferToImageBitmap(); 33653 imgData.width = newWidth; 33654 imgData.height = newHeight; 33655 return imgData; 33656 } 33657 _encodeBMP() { 33658 const { 33659 width, 33660 height, 33661 kind 33662 } = this._imgData; 33663 let data = this._imgData.data; 33664 let bitPerPixel; 33665 let colorTable = new Uint8Array(0); 33666 let maskTable = colorTable; 33667 let compression = 0; 33668 switch (kind) { 33669 case ImageKind.GRAYSCALE_1BPP: 33670 { 33671 bitPerPixel = 1; 33672 colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]); 33673 const rowLen = width + 7 >> 3; 33674 const rowSize = rowLen + 3 & -4; 33675 if (rowLen !== rowSize) { 33676 const newData = new Uint8Array(rowSize * height); 33677 let k = 0; 33678 for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) { 33679 newData.set(data.subarray(i, i + rowLen), k); 33680 } 33681 data = newData; 33682 } 33683 break; 33684 } 33685 case ImageKind.RGB_24BPP: 33686 { 33687 bitPerPixel = 24; 33688 if (width & 3) { 33689 const rowLen = 3 * width; 33690 const rowSize = rowLen + 3 & -4; 33691 const extraLen = rowSize - rowLen; 33692 const newData = new Uint8Array(rowSize * height); 33693 let k = 0; 33694 for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { 33695 const row = data.subarray(i, i + rowLen); 33696 for (let j = 0; j < rowLen; j += 3) { 33697 newData[k++] = row[j + 2]; 33698 newData[k++] = row[j + 1]; 33699 newData[k++] = row[j]; 33700 } 33701 k += extraLen; 33702 } 33703 data = newData; 33704 } else { 33705 for (let i = 0, ii = data.length; i < ii; i += 3) { 33706 const tmp = data[i]; 33707 data[i] = data[i + 2]; 33708 data[i + 2] = tmp; 33709 } 33710 } 33711 break; 33712 } 33713 case ImageKind.RGBA_32BPP: 33714 bitPerPixel = 32; 33715 compression = 3; 33716 maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); 33717 const view = new DataView(maskTable.buffer); 33718 if (FeatureTest.isLittleEndian) { 33719 view.setUint32(0, 0x000000ff, true); 33720 view.setUint32(4, 0x0000ff00, true); 33721 view.setUint32(8, 0x00ff0000, true); 33722 view.setUint32(12, 0xff000000, true); 33723 } else { 33724 view.setUint32(0, 0xff000000, true); 33725 view.setUint32(4, 0x00ff0000, true); 33726 view.setUint32(8, 0x0000ff00, true); 33727 view.setUint32(12, 0x000000ff, true); 33728 } 33729 break; 33730 default: 33731 throw new Error("invalid format"); 33732 } 33733 let i = 0; 33734 const headerLength = 40 + maskTable.length; 33735 const fileLength = 14 + headerLength + colorTable.length + data.length; 33736 const bmpData = new Uint8Array(fileLength); 33737 const view = new DataView(bmpData.buffer); 33738 view.setUint16(i, 0x4d42, true); 33739 i += 2; 33740 view.setUint32(i, fileLength, true); 33741 i += 4; 33742 view.setUint32(i, 0, true); 33743 i += 4; 33744 view.setUint32(i, 14 + headerLength + colorTable.length, true); 33745 i += 4; 33746 view.setUint32(i, headerLength, true); 33747 i += 4; 33748 view.setInt32(i, width, true); 33749 i += 4; 33750 view.setInt32(i, -height, true); 33751 i += 4; 33752 view.setUint16(i, 1, true); 33753 i += 2; 33754 view.setUint16(i, bitPerPixel, true); 33755 i += 2; 33756 view.setUint32(i, compression, true); 33757 i += 4; 33758 view.setUint32(i, 0, true); 33759 i += 4; 33760 view.setInt32(i, 0, true); 33761 i += 4; 33762 view.setInt32(i, 0, true); 33763 i += 4; 33764 view.setUint32(i, colorTable.length / 4, true); 33765 i += 4; 33766 view.setUint32(i, 0, true); 33767 i += 4; 33768 bmpData.set(maskTable, i); 33769 i += maskTable.length; 33770 bmpData.set(colorTable, i); 33771 i += colorTable.length; 33772 bmpData.set(data, i); 33773 return bmpData; 33774 } 33775} 33776 33777;// ./src/shared/murmurhash3.js 33778 33779 33780 33781 33782 33783 33784const SEED = 0xc3d2e1f0; 33785const MASK_HIGH = 0xffff0000; 33786const MASK_LOW = 0xffff; 33787class MurmurHash3_64 { 33788 constructor(seed) { 33789 this.h1 = seed ? seed & 0xffffffff : SEED; 33790 this.h2 = seed ? seed & 0xffffffff : SEED; 33791 } 33792 update(input) { 33793 let data, length; 33794 if (typeof input === "string") { 33795 data = new Uint8Array(input.length * 2); 33796 length = 0; 33797 for (let i = 0, ii = input.length; i < ii; i++) { 33798 const code = input.charCodeAt(i); 33799 if (code <= 0xff) { 33800 data[length++] = code; 33801 } else { 33802 data[length++] = code >>> 8; 33803 data[length++] = code & 0xff; 33804 } 33805 } 33806 } else if (ArrayBuffer.isView(input)) { 33807 data = input.slice(); 33808 length = data.byteLength; 33809 } else { 33810 throw new Error("Invalid data format, must be a string or TypedArray."); 33811 } 33812 const blockCounts = length >> 2; 33813 const tailLength = length - blockCounts * 4; 33814 const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); 33815 let k1 = 0, 33816 k2 = 0; 33817 let h1 = this.h1, 33818 h2 = this.h2; 33819 const C1 = 0xcc9e2d51, 33820 C2 = 0x1b873593; 33821 const C1_LOW = C1 & MASK_LOW, 33822 C2_LOW = C2 & MASK_LOW; 33823 for (let i = 0; i < blockCounts; i++) { 33824 if (i & 1) { 33825 k1 = dataUint32[i]; 33826 k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; 33827 k1 = k1 << 15 | k1 >>> 17; 33828 k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; 33829 h1 ^= k1; 33830 h1 = h1 << 13 | h1 >>> 19; 33831 h1 = h1 * 5 + 0xe6546b64; 33832 } else { 33833 k2 = dataUint32[i]; 33834 k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; 33835 k2 = k2 << 15 | k2 >>> 17; 33836 k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; 33837 h2 ^= k2; 33838 h2 = h2 << 13 | h2 >>> 19; 33839 h2 = h2 * 5 + 0xe6546b64; 33840 } 33841 } 33842 k1 = 0; 33843 switch (tailLength) { 33844 case 3: 33845 k1 ^= data[blockCounts * 4 + 2] << 16; 33846 case 2: 33847 k1 ^= data[blockCounts * 4 + 1] << 8; 33848 case 1: 33849 k1 ^= data[blockCounts * 4]; 33850 k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; 33851 k1 = k1 << 15 | k1 >>> 17; 33852 k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; 33853 if (blockCounts & 1) { 33854 h1 ^= k1; 33855 } else { 33856 h2 ^= k1; 33857 } 33858 } 33859 this.h1 = h1; 33860 this.h2 = h2; 33861 } 33862 hexdigest() { 33863 let h1 = this.h1, 33864 h2 = this.h2; 33865 h1 ^= h2 >>> 1; 33866 h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; 33867 h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; 33868 h1 ^= h2 >>> 1; 33869 h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; 33870 h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; 33871 h1 ^= h2 >>> 1; 33872 return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); 33873 } 33874} 33875 33876;// ./src/core/operator_list.js 33877 33878 33879 33880 33881 33882 33883 33884 33885 33886 33887 33888 33889 33890 33891 33892function addState(parentState, pattern, checkFn, iterateFn, processFn) { 33893 let state = parentState; 33894 for (let i = 0, ii = pattern.length - 1; i < ii; i++) { 33895 const item = pattern[i]; 33896 state = state[item] ||= []; 33897 } 33898 state[pattern.at(-1)] = { 33899 checkFn, 33900 iterateFn, 33901 processFn 33902 }; 33903} 33904const InitialState = []; 33905addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) { 33906 const fnArray = context.fnArray;
vendor: 14,522 bytes, lines 33907-34354
33907 const iFirstSave = context.iCurr - 3; 33908 const pos = (i - iFirstSave) % 4; 33909 switch (pos) { 33910 case 0: 33911 return fnArray[i] === OPS.save; 33912 case 1: 33913 return fnArray[i] === OPS.transform; 33914 case 2: 33915 return fnArray[i] === OPS.paintInlineImageXObject; 33916 case 3: 33917 return fnArray[i] === OPS.restore; 33918 } 33919 throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); 33920}, function foundInlineImageGroup(context, i) { 33921 const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; 33922 const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; 33923 const MAX_WIDTH = 1000; 33924 const IMAGE_PADDING = 1; 33925 const fnArray = context.fnArray, 33926 argsArray = context.argsArray; 33927 const curr = context.iCurr; 33928 const iFirstSave = curr - 3; 33929 const iFirstTransform = curr - 2; 33930 const iFirstPIIXO = curr - 1; 33931 const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); 33932 if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { 33933 return i - (i - iFirstSave) % 4; 33934 } 33935 let maxX = 0; 33936 const map = []; 33937 let maxLineHeight = 0; 33938 let currentX = IMAGE_PADDING, 33939 currentY = IMAGE_PADDING; 33940 for (let q = 0; q < count; q++) { 33941 const transform = argsArray[iFirstTransform + (q << 2)]; 33942 const img = argsArray[iFirstPIIXO + (q << 2)][0]; 33943 if (currentX + img.width > MAX_WIDTH) { 33944 maxX = Math.max(maxX, currentX); 33945 currentY += maxLineHeight + 2 * IMAGE_PADDING; 33946 currentX = 0; 33947 maxLineHeight = 0; 33948 } 33949 map.push({ 33950 transform, 33951 x: currentX, 33952 y: currentY, 33953 w: img.width, 33954 h: img.height 33955 }); 33956 currentX += img.width + 2 * IMAGE_PADDING; 33957 maxLineHeight = Math.max(maxLineHeight, img.height); 33958 } 33959 const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; 33960 const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; 33961 const imgData = new Uint8Array(imgWidth * imgHeight * 4); 33962 const imgRowSize = imgWidth << 2; 33963 for (let q = 0; q < count; q++) { 33964 const data = argsArray[iFirstPIIXO + (q << 2)][0].data; 33965 const rowSize = map[q].w << 2; 33966 let dataOffset = 0; 33967 let offset = map[q].x + map[q].y * imgWidth << 2; 33968 imgData.set(data.subarray(0, rowSize), offset - imgRowSize); 33969 for (let k = 0, kk = map[q].h; k < kk; k++) { 33970 imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); 33971 dataOffset += rowSize; 33972 offset += imgRowSize; 33973 } 33974 imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); 33975 while (offset >= 0) { 33976 data[offset - 4] = data[offset]; 33977 data[offset - 3] = data[offset + 1]; 33978 data[offset - 2] = data[offset + 2]; 33979 data[offset - 1] = data[offset + 3]; 33980 data[offset + rowSize] = data[offset + rowSize - 4]; 33981 data[offset + rowSize + 1] = data[offset + rowSize - 3]; 33982 data[offset + rowSize + 2] = data[offset + rowSize - 2]; 33983 data[offset + rowSize + 3] = data[offset + rowSize - 1]; 33984 offset -= imgRowSize; 33985 } 33986 } 33987 const img = { 33988 width: imgWidth, 33989 height: imgHeight 33990 }; 33991 if (context.isOffscreenCanvasSupported) { 33992 const canvas = new OffscreenCanvas(imgWidth, imgHeight); 33993 const ctx = canvas.getContext("2d"); 33994 ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0); 33995 img.bitmap = canvas.transferToImageBitmap(); 33996 img.data = null; 33997 } else { 33998 img.kind = ImageKind.RGBA_32BPP; 33999 img.data = imgData; 34000 } 34001 fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); 34002 argsArray.splice(iFirstSave, count * 4, [img, map]); 34003 return iFirstSave + 1; 34004}); 34005addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) { 34006 const fnArray = context.fnArray; 34007 const iFirstSave = context.iCurr - 3; 34008 const pos = (i - iFirstSave) % 4; 34009 switch (pos) { 34010 case 0: 34011 return fnArray[i] === OPS.save; 34012 case 1: 34013 return fnArray[i] === OPS.transform; 34014 case 2: 34015 return fnArray[i] === OPS.paintImageMaskXObject; 34016 case 3: 34017 return fnArray[i] === OPS.restore; 34018 } 34019 throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); 34020}, function foundImageMaskGroup(context, i) { 34021 const MIN_IMAGES_IN_MASKS_BLOCK = 10; 34022 const MAX_IMAGES_IN_MASKS_BLOCK = 100; 34023 const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; 34024 const fnArray = context.fnArray, 34025 argsArray = context.argsArray; 34026 const curr = context.iCurr; 34027 const iFirstSave = curr - 3; 34028 const iFirstTransform = curr - 2; 34029 const iFirstPIMXO = curr - 1; 34030 let count = Math.floor((i - iFirstSave) / 4); 34031 if (count < MIN_IMAGES_IN_MASKS_BLOCK) { 34032 return i - (i - iFirstSave) % 4; 34033 } 34034 let isSameImage = false; 34035 let iTransform, transformArgs; 34036 const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; 34037 const firstTransformArg0 = argsArray[iFirstTransform][0], 34038 firstTransformArg1 = argsArray[iFirstTransform][1], 34039 firstTransformArg2 = argsArray[iFirstTransform][2], 34040 firstTransformArg3 = argsArray[iFirstTransform][3]; 34041 if (firstTransformArg1 === firstTransformArg2) { 34042 isSameImage = true; 34043 iTransform = iFirstTransform + 4; 34044 let iPIMXO = iFirstPIMXO + 4; 34045 for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { 34046 transformArgs = argsArray[iTransform]; 34047 if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { 34048 if (q < MIN_IMAGES_IN_MASKS_BLOCK) { 34049 isSameImage = false; 34050 } else { 34051 count = q; 34052 } 34053 break; 34054 } 34055 } 34056 } 34057 if (isSameImage) { 34058 count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); 34059 const positions = new Float32Array(count * 2); 34060 iTransform = iFirstTransform; 34061 for (let q = 0; q < count; q++, iTransform += 4) { 34062 transformArgs = argsArray[iTransform]; 34063 positions[q << 1] = transformArgs[4]; 34064 positions[(q << 1) + 1] = transformArgs[5]; 34065 } 34066 fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); 34067 argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); 34068 } else { 34069 count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); 34070 const images = []; 34071 for (let q = 0; q < count; q++) { 34072 transformArgs = argsArray[iFirstTransform + (q << 2)]; 34073 const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; 34074 images.push({ 34075 data: maskParams.data, 34076 width: maskParams.width, 34077 height: maskParams.height, 34078 interpolate: maskParams.interpolate, 34079 count: maskParams.count, 34080 transform: transformArgs 34081 }); 34082 } 34083 fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); 34084 argsArray.splice(iFirstSave, count * 4, [images]); 34085 } 34086 return iFirstSave + 1; 34087}); 34088addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) { 34089 const argsArray = context.argsArray; 34090 const iFirstTransform = context.iCurr - 2; 34091 return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; 34092}, function iterateImageGroup(context, i) { 34093 const fnArray = context.fnArray, 34094 argsArray = context.argsArray; 34095 const iFirstSave = context.iCurr - 3; 34096 const pos = (i - iFirstSave) % 4; 34097 switch (pos) { 34098 case 0: 34099 return fnArray[i] === OPS.save; 34100 case 1: 34101 if (fnArray[i] !== OPS.transform) { 34102 return false; 34103 } 34104 const iFirstTransform = context.iCurr - 2; 34105 const firstTransformArg0 = argsArray[iFirstTransform][0]; 34106 const firstTransformArg3 = argsArray[iFirstTransform][3]; 34107 if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) { 34108 return false; 34109 } 34110 return true; 34111 case 2: 34112 if (fnArray[i] !== OPS.paintImageXObject) { 34113 return false; 34114 } 34115 const iFirstPIXO = context.iCurr - 1; 34116 const firstPIXOArg0 = argsArray[iFirstPIXO][0]; 34117 if (argsArray[i][0] !== firstPIXOArg0) { 34118 return false; 34119 } 34120 return true; 34121 case 3: 34122 return fnArray[i] === OPS.restore; 34123 } 34124 throw new Error(`iterateImageGroup - invalid pos: ${pos}`); 34125}, function (context, i) { 34126 const MIN_IMAGES_IN_BLOCK = 3; 34127 const MAX_IMAGES_IN_BLOCK = 1000; 34128 const fnArray = context.fnArray, 34129 argsArray = context.argsArray; 34130 const curr = context.iCurr; 34131 const iFirstSave = curr - 3; 34132 const iFirstTransform = curr - 2; 34133 const iFirstPIXO = curr - 1; 34134 const firstPIXOArg0 = argsArray[iFirstPIXO][0]; 34135 const firstTransformArg0 = argsArray[iFirstTransform][0]; 34136 const firstTransformArg3 = argsArray[iFirstTransform][3]; 34137 const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); 34138 if (count < MIN_IMAGES_IN_BLOCK) { 34139 return i - (i - iFirstSave) % 4; 34140 } 34141 const positions = new Float32Array(count * 2); 34142 let iTransform = iFirstTransform; 34143 for (let q = 0; q < count; q++, iTransform += 4) { 34144 const transformArgs = argsArray[iTransform]; 34145 positions[q << 1] = transformArgs[4]; 34146 positions[(q << 1) + 1] = transformArgs[5]; 34147 } 34148 const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; 34149 fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); 34150 argsArray.splice(iFirstSave, count * 4, args); 34151 return iFirstSave + 1; 34152}); 34153addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) { 34154 const fnArray = context.fnArray, 34155 argsArray = context.argsArray; 34156 const iFirstSave = context.iCurr - 4; 34157 const pos = (i - iFirstSave) % 5; 34158 switch (pos) { 34159 case 0: 34160 return fnArray[i] === OPS.beginText; 34161 case 1: 34162 return fnArray[i] === OPS.setFont; 34163 case 2: 34164 return fnArray[i] === OPS.setTextMatrix; 34165 case 3: 34166 if (fnArray[i] !== OPS.showText) { 34167 return false; 34168 } 34169 const iFirstSetFont = context.iCurr - 3; 34170 const firstSetFontArg0 = argsArray[iFirstSetFont][0]; 34171 const firstSetFontArg1 = argsArray[iFirstSetFont][1]; 34172 if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) { 34173 return false; 34174 } 34175 return true; 34176 case 4: 34177 return fnArray[i] === OPS.endText; 34178 } 34179 throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); 34180}, function (context, i) { 34181 const MIN_CHARS_IN_BLOCK = 3; 34182 const MAX_CHARS_IN_BLOCK = 1000; 34183 const fnArray = context.fnArray, 34184 argsArray = context.argsArray; 34185 const curr = context.iCurr; 34186 const iFirstBeginText = curr - 4; 34187 const iFirstSetFont = curr - 3; 34188 const iFirstSetTextMatrix = curr - 2; 34189 const iFirstShowText = curr - 1; 34190 const iFirstEndText = curr; 34191 const firstSetFontArg0 = argsArray[iFirstSetFont][0]; 34192 const firstSetFontArg1 = argsArray[iFirstSetFont][1]; 34193 let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); 34194 if (count < MIN_CHARS_IN_BLOCK) { 34195 return i - (i - iFirstBeginText) % 5; 34196 } 34197 let iFirst = iFirstBeginText; 34198 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) { 34199 count++; 34200 iFirst -= 5; 34201 } 34202 let iEndText = iFirst + 4; 34203 for (let q = 1; q < count; q++) { 34204 fnArray.splice(iEndText, 3); 34205 argsArray.splice(iEndText, 3); 34206 iEndText += 2; 34207 } 34208 return iEndText + 1; 34209}); 34210class NullOptimizer { 34211 constructor(queue) { 34212 this.queue = queue; 34213 } 34214 _optimize() {} 34215 push(fn, args) { 34216 this.queue.fnArray.push(fn); 34217 this.queue.argsArray.push(args); 34218 this._optimize(); 34219 } 34220 flush() {} 34221 reset() {} 34222} 34223class QueueOptimizer extends NullOptimizer { 34224 constructor(queue) { 34225 super(queue); 34226 this.state = null; 34227 this.context = { 34228 iCurr: 0, 34229 fnArray: queue.fnArray, 34230 argsArray: queue.argsArray, 34231 isOffscreenCanvasSupported: false 34232 }; 34233 this.match = null; 34234 this.lastProcessed = 0; 34235 } 34236 set isOffscreenCanvasSupported(value) { 34237 this.context.isOffscreenCanvasSupported = value; 34238 } 34239 _optimize() { 34240 const fnArray = this.queue.fnArray; 34241 let i = this.lastProcessed, 34242 ii = fnArray.length; 34243 let state = this.state; 34244 let match = this.match; 34245 if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { 34246 this.lastProcessed = ii; 34247 return; 34248 } 34249 const context = this.context; 34250 while (i < ii) { 34251 if (match) { 34252 const iterate = (0, match.iterateFn)(context, i); 34253 if (iterate) { 34254 i++; 34255 continue; 34256 } 34257 i = (0, match.processFn)(context, i + 1); 34258 ii = fnArray.length; 34259 match = null; 34260 state = null; 34261 if (i >= ii) { 34262 break; 34263 } 34264 } 34265 state = (state || InitialState)[fnArray[i]]; 34266 if (!state || Array.isArray(state)) { 34267 i++; 34268 continue; 34269 } 34270 context.iCurr = i; 34271 i++; 34272 if (state.checkFn && !(0, state.checkFn)(context)) { 34273 state = null; 34274 continue; 34275 } 34276 match = state; 34277 state = null; 34278 } 34279 this.state = state; 34280 this.match = match; 34281 this.lastProcessed = i; 34282 } 34283 flush() { 34284 while (this.match) { 34285 const length = this.queue.fnArray.length; 34286 this.lastProcessed = (0, this.match.processFn)(this.context, length); 34287 this.match = null; 34288 this.state = null; 34289 this._optimize(); 34290 } 34291 } 34292 reset() { 34293 this.state = null; 34294 this.match = null; 34295 this.lastProcessed = 0; 34296 } 34297} 34298class OperatorList { 34299 static CHUNK_SIZE = 1000; 34300 static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; 34301 constructor(intent = 0, streamSink) { 34302 this._streamSink = streamSink; 34303 this.fnArray = []; 34304 this.argsArray = []; 34305 this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this); 34306 this.dependencies = new Set(); 34307 this._totalLength = 0; 34308 this.weight = 0; 34309 this._resolved = streamSink ? null : Promise.resolve(); 34310 } 34311 set isOffscreenCanvasSupported(value) { 34312 this.optimizer.isOffscreenCanvasSupported = value; 34313 } 34314 get length() { 34315 return this.argsArray.length; 34316 } 34317 get ready() { 34318 return this._resolved || this._streamSink.ready; 34319 } 34320 get totalLength() { 34321 return this._totalLength + this.length; 34322 } 34323 addOp(fn, args) { 34324 this.optimizer.push(fn, args); 34325 this.weight++; 34326 if (this._streamSink) { 34327 if (this.weight >= OperatorList.CHUNK_SIZE) { 34328 this.flush(); 34329 } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { 34330 this.flush(); 34331 } 34332 } 34333 } 34334 addImageOps(fn, args, optionalContent, hasMask = false) { 34335 if (hasMask) { 34336 this.addOp(OPS.save); 34337 this.addOp(OPS.setGState, [[["SMask", false]]]); 34338 } 34339 if (optionalContent !== undefined) { 34340 this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); 34341 } 34342 this.addOp(fn, args); 34343 if (optionalContent !== undefined) { 34344 this.addOp(OPS.endMarkedContent, []); 34345 } 34346 if (hasMask) { 34347 this.addOp(OPS.restore); 34348 } 34349 } 34350 addDependency(dependency) { 34351 if (this.dependencies.has(dependency)) { 34352 return; 34353 } 34354 this.dependencies.add(dependency);
vendor: 5,708 bytes, lines 34355-34586
34355 this.addOp(OPS.dependency, [dependency]); 34356 } 34357 addDependencies(dependencies) { 34358 for (const dependency of dependencies) { 34359 this.addDependency(dependency); 34360 } 34361 } 34362 addOpList(opList) { 34363 if (!(opList instanceof OperatorList)) { 34364 warn('addOpList - ignoring invalid "opList" parameter.'); 34365 return; 34366 } 34367 for (const dependency of opList.dependencies) { 34368 this.dependencies.add(dependency); 34369 } 34370 for (let i = 0, ii = opList.length; i < ii; i++) { 34371 this.addOp(opList.fnArray[i], opList.argsArray[i]); 34372 } 34373 } 34374 getIR() { 34375 return { 34376 fnArray: this.fnArray, 34377 argsArray: this.argsArray, 34378 length: this.length 34379 }; 34380 } 34381 get _transfers() { 34382 const transfers = []; 34383 const { 34384 fnArray, 34385 argsArray, 34386 length 34387 } = this; 34388 for (let i = 0; i < length; i++) { 34389 switch (fnArray[i]) { 34390 case OPS.paintInlineImageXObject: 34391 case OPS.paintInlineImageXObjectGroup: 34392 case OPS.paintImageMaskXObject: 34393 const arg = argsArray[i][0]; 34394 if (!arg.cached && arg.data?.buffer instanceof ArrayBuffer) { 34395 transfers.push(arg.data.buffer); 34396 } 34397 break; 34398 } 34399 } 34400 return transfers; 34401 } 34402 flush(lastChunk = false, separateAnnots = null) { 34403 this.optimizer.flush(); 34404 const length = this.length; 34405 this._totalLength += length; 34406 this._streamSink.enqueue({ 34407 fnArray: this.fnArray, 34408 argsArray: this.argsArray, 34409 lastChunk, 34410 separateAnnots, 34411 length 34412 }, 1, this._transfers); 34413 this.dependencies.clear(); 34414 this.fnArray.length = 0; 34415 this.argsArray.length = 0; 34416 this.weight = 0; 34417 this.optimizer.reset(); 34418 } 34419} 34420 34421;// ./src/core/image.js 34422 34423 34424 34425 34426 34427 34428 34429 34430 34431 34432 34433 34434 34435 34436 34437function decodeAndClamp(value, addend, coefficient, max) { 34438 value = addend + value * coefficient; 34439 if (value < 0) { 34440 value = 0; 34441 } else if (value > max) { 34442 value = max; 34443 } 34444 return value; 34445} 34446function resizeImageMask(src, bpc, w1, h1, w2, h2) { 34447 const length = w2 * h2; 34448 let dest; 34449 if (bpc <= 8) { 34450 dest = new Uint8Array(length); 34451 } else if (bpc <= 16) { 34452 dest = new Uint16Array(length); 34453 } else { 34454 dest = new Uint32Array(length); 34455 } 34456 const xRatio = w1 / w2; 34457 const yRatio = h1 / h2; 34458 let i, 34459 j, 34460 py, 34461 newIndex = 0, 34462 oldIndex; 34463 const xScaled = new Uint16Array(w2); 34464 const w1Scanline = w1; 34465 for (i = 0; i < w2; i++) { 34466 xScaled[i] = Math.floor(i * xRatio); 34467 } 34468 for (i = 0; i < h2; i++) { 34469 py = Math.floor(i * yRatio) * w1Scanline; 34470 for (j = 0; j < w2; j++) { 34471 oldIndex = py + xScaled[j]; 34472 dest[newIndex++] = src[oldIndex]; 34473 } 34474 } 34475 return dest; 34476} 34477class PDFImage { 34478 constructor({ 34479 xref, 34480 res, 34481 image, 34482 isInline = false, 34483 smask = null, 34484 mask = null, 34485 isMask = false, 34486 pdfFunctionFactory, 34487 localColorSpaceCache 34488 }) { 34489 this.image = image; 34490 const dict = image.dict; 34491 const filter = dict.get("F", "Filter"); 34492 let filterName; 34493 if (filter instanceof Name) { 34494 filterName = filter.name; 34495 } else if (Array.isArray(filter)) { 34496 const filterZero = xref.fetchIfRef(filter[0]); 34497 if (filterZero instanceof Name) { 34498 filterName = filterZero.name; 34499 } 34500 } 34501 switch (filterName) { 34502 case "JPXDecode": 34503 ({ 34504 width: image.width, 34505 height: image.height, 34506 componentsCount: image.numComps, 34507 bitsPerComponent: image.bitsPerComponent 34508 } = JpxImage.parseImageProperties(image.stream)); 34509 image.stream.reset(); 34510 this.jpxDecoderOptions = { 34511 numComponents: 0, 34512 isIndexedColormap: false, 34513 smaskInData: dict.has("SMaskInData") 34514 }; 34515 break; 34516 case "JBIG2Decode": 34517 image.bitsPerComponent = 1; 34518 image.numComps = 1; 34519 break; 34520 } 34521 let width = dict.get("W", "Width"); 34522 let height = dict.get("H", "Height"); 34523 if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) { 34524 warn("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary."); 34525 width = image.width; 34526 height = image.height; 34527 } 34528 if (width < 1 || height < 1) { 34529 throw new FormatError(`Invalid image width: ${width} or height: ${height}`); 34530 } 34531 this.width = width; 34532 this.height = height; 34533 this.interpolate = dict.get("I", "Interpolate"); 34534 this.imageMask = dict.get("IM", "ImageMask") || false; 34535 this.matte = dict.get("Matte") || false; 34536 let bitsPerComponent = image.bitsPerComponent; 34537 if (!bitsPerComponent) { 34538 bitsPerComponent = dict.get("BPC", "BitsPerComponent"); 34539 if (!bitsPerComponent) { 34540 if (this.imageMask) { 34541 bitsPerComponent = 1; 34542 } else { 34543 throw new FormatError(`Bits per component missing in image: ${this.imageMask}`); 34544 } 34545 } 34546 } 34547 this.bpc = bitsPerComponent; 34548 if (!this.imageMask) { 34549 let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); 34550 const hasColorSpace = !!colorSpace; 34551 if (!hasColorSpace) { 34552 if (this.jpxDecoderOptions) { 34553 colorSpace = Name.get("DeviceRGBA"); 34554 } else { 34555 switch (image.numComps) { 34556 case 1: 34557 colorSpace = Name.get("DeviceGray"); 34558 break; 34559 case 3: 34560 colorSpace = Name.get("DeviceRGB"); 34561 break; 34562 case 4: 34563 colorSpace = Name.get("DeviceCMYK"); 34564 break; 34565 default: 34566 throw new Error(`Images with ${image.numComps} color components not supported.`); 34567 } 34568 } 34569 } else if (this.jpxDecoderOptions?.smaskInData) { 34570 colorSpace = Name.get("DeviceRGBA"); 34571 } 34572 this.colorSpace = ColorSpace.parse({ 34573 cs: colorSpace, 34574 xref, 34575 resources: isInline ? res : null, 34576 pdfFunctionFactory, 34577 localColorSpaceCache 34578 }); 34579 this.numComps = this.colorSpace.numComps; 34580 if (this.jpxDecoderOptions) { 34581 this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComp : 0; 34582 this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed"; 34583 } 34584 } 34585 this.decode = dict.getArray("D", "Decode"); 34586 this.needsDecode = false;
34587 if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) { 34588 this.needsDecode = true; 34589 const max = (1 << bitsPerComponent) - 1; 34590 this.decodeCoefficients = []; 34591 this.decodeAddends = []; 34592 const isIndexed = this.colorSpace?.name === "Indexed"; 34593 for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) { 34594 const dmin = this.decode[i]; 34595 const dmax = this.decode[i + 1]; 34596 this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin; 34597 this.decodeAddends[j] = isIndexed ? dmin : max * dmin; 34598 } 34599 } 34600 if (smask) { 34601 this.smask = new PDFImage({ 34602 xref, 34603 res, 34604 image: smask, 34605 isInline, 34606 pdfFunctionFactory, 34607 localColorSpaceCache 34608 }); 34609 } else if (mask) { 34610 if (mask instanceof BaseStream) { 34611 const maskDict = mask.dict, 34612 imageMask = maskDict.get("IM", "ImageMask"); 34613 if (!imageMask) { 34614 warn("Ignoring /Mask in image without /ImageMask."); 34615 } else { 34616 this.mask = new PDFImage({ 34617 xref, 34618 res, 34619 image: mask, 34620 isInline, 34621 isMask: true, 34622 pdfFunctionFactory, 34623 localColorSpaceCache 34624 }); 34625 } 34626 } else { 34627 this.mask = mask; 34628 } 34629 } 34630 } 34631 static async buildImage({ 34632 xref, 34633 res, 34634 image, 34635 isInline = false, 34636 pdfFunctionFactory, 34637 localColorSpaceCache 34638 }) { 34639 const imageData = image; 34640 let smaskData = null; 34641 let maskData = null; 34642 const smask = image.dict.get("SMask"); 34643 const mask = image.dict.get("Mask"); 34644 if (smask) { 34645 if (smask instanceof BaseStream) { 34646 smaskData = smask; 34647 } else { 34648 warn("Unsupported /SMask format."); 34649 } 34650 } else if (mask) { 34651 if (mask instanceof BaseStream || Array.isArray(mask)) { 34652 maskData = mask; 34653 } else { 34654 warn("Unsupported /Mask format."); 34655 } 34656 } 34657 return new PDFImage({ 34658 xref, 34659 res, 34660 image: imageData, 34661 isInline, 34662 smask: smaskData, 34663 mask: maskData, 34664 pdfFunctionFactory, 34665 localColorSpaceCache 34666 }); 34667 } 34668 static createRawMask({ 34669 imgArray, 34670 width, 34671 height, 34672 imageIsFromDecodeStream, 34673 inverseDecode, 34674 interpolate 34675 }) { 34676 const computedLength = (width + 7 >> 3) * height; 34677 const actualLength = imgArray.byteLength; 34678 const haveFullData = computedLength === actualLength; 34679 let data, i; 34680 if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { 34681 data = imgArray; 34682 } else if (!inverseDecode) { 34683 data = new Uint8Array(imgArray); 34684 } else { 34685 data = new Uint8Array(computedLength); 34686 data.set(imgArray); 34687 data.fill(0xff, actualLength); 34688 } 34689 if (inverseDecode) { 34690 for (i = 0; i < actualLength; i++) { 34691 data[i] ^= 0xff; 34692 } 34693 } 34694 return { 34695 data, 34696 width, 34697 height, 34698 interpolate 34699 }; 34700 } 34701 static async createMask({ 34702 imgArray, 34703 width, 34704 height, 34705 imageIsFromDecodeStream, 34706 inverseDecode, 34707 interpolate, 34708 isOffscreenCanvasSupported = false 34709 }) { 34710 const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); 34711 if (isSingleOpaquePixel) { 34712 return { 34713 isSingleOpaquePixel 34714 }; 34715 } 34716 if (isOffscreenCanvasSupported) { 34717 if (ImageResizer.needsToBeResized(width, height)) { 34718 const data = new Uint8ClampedArray(width * height * 4); 34719 convertBlackAndWhiteToRGBA({ 34720 src: imgArray, 34721 dest: data, 34722 width, 34723 height, 34724 nonBlackColor: 0, 34725 inverseDecode 34726 }); 34727 return ImageResizer.createImage({ 34728 kind: ImageKind.RGBA_32BPP, 34729 data, 34730 width, 34731 height, 34732 interpolate 34733 }); 34734 } 34735 const canvas = new OffscreenCanvas(width, height); 34736 const ctx = canvas.getContext("2d"); 34737 const imgData = ctx.createImageData(width, height); 34738 convertBlackAndWhiteToRGBA({ 34739 src: imgArray, 34740 dest: imgData.data, 34741 width, 34742 height, 34743 nonBlackColor: 0, 34744 inverseDecode 34745 }); 34746 ctx.putImageData(imgData, 0, 0); 34747 const bitmap = canvas.transferToImageBitmap(); 34748 return { 34749 data: null, 34750 width, 34751 height, 34752 interpolate, 34753 bitmap 34754 }; 34755 } 34756 return this.createRawMask({ 34757 imgArray, 34758 width, 34759 height, 34760 inverseDecode, 34761 imageIsFromDecodeStream, 34762 interpolate 34763 }); 34764 } 34765 get drawWidth() { 34766 return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0); 34767 } 34768 get drawHeight() { 34769 return Math.max(this.height, this.smask?.height || 0, this.mask?.height || 0
vendor: 16,670 bytes, lines 34769-35421
34769); 34770 } 34771 decodeBuffer(buffer) { 34772 const bpc = this.bpc; 34773 const numComps = this.numComps; 34774 const decodeAddends = this.decodeAddends; 34775 const decodeCoefficients = this.decodeCoefficients; 34776 const max = (1 << bpc) - 1; 34777 let i, ii; 34778 if (bpc === 1) { 34779 for (i = 0, ii = buffer.length; i < ii; i++) { 34780 buffer[i] = +!buffer[i]; 34781 } 34782 return; 34783 } 34784 let index = 0; 34785 for (i = 0, ii = this.width * this.height; i < ii; i++) { 34786 for (let j = 0; j < numComps; j++) { 34787 buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max); 34788 index++; 34789 } 34790 } 34791 } 34792 getComponents(buffer) { 34793 const bpc = this.bpc; 34794 if (bpc === 8) { 34795 return buffer; 34796 } 34797 const width = this.width; 34798 const height = this.height; 34799 const numComps = this.numComps; 34800 const length = width * height * numComps; 34801 let bufferPos = 0; 34802 let output; 34803 if (bpc <= 8) { 34804 output = new Uint8Array(length); 34805 } else if (bpc <= 16) { 34806 output = new Uint16Array(length); 34807 } else { 34808 output = new Uint32Array(length); 34809 } 34810 const rowComps = width * numComps; 34811 const max = (1 << bpc) - 1; 34812 let i = 0, 34813 ii, 34814 buf; 34815 if (bpc === 1) { 34816 let mask, loop1End, loop2End; 34817 for (let j = 0; j < height; j++) { 34818 loop1End = i + (rowComps & ~7); 34819 loop2End = i + rowComps; 34820 while (i < loop1End) { 34821 buf = buffer[bufferPos++]; 34822 output[i] = buf >> 7 & 1; 34823 output[i + 1] = buf >> 6 & 1; 34824 output[i + 2] = buf >> 5 & 1; 34825 output[i + 3] = buf >> 4 & 1; 34826 output[i + 4] = buf >> 3 & 1; 34827 output[i + 5] = buf >> 2 & 1; 34828 output[i + 6] = buf >> 1 & 1; 34829 output[i + 7] = buf & 1; 34830 i += 8; 34831 } 34832 if (i < loop2End) { 34833 buf = buffer[bufferPos++]; 34834 mask = 128; 34835 while (i < loop2End) { 34836 output[i++] = +!!(buf & mask); 34837 mask >>= 1; 34838 } 34839 } 34840 } 34841 } else { 34842 let bits = 0; 34843 buf = 0; 34844 for (i = 0, ii = length; i < ii; ++i) { 34845 if (i % rowComps === 0) { 34846 buf = 0; 34847 bits = 0; 34848 } 34849 while (bits < bpc) { 34850 buf = buf << 8 | buffer[bufferPos++]; 34851 bits += 8; 34852 } 34853 const remainingBits = bits - bpc; 34854 let value = buf >> remainingBits; 34855 if (value < 0) { 34856 value = 0; 34857 } else if (value > max) { 34858 value = max; 34859 } 34860 output[i] = value; 34861 buf &= (1 << remainingBits) - 1; 34862 bits = remainingBits; 34863 } 34864 } 34865 return output; 34866 } 34867 async fillOpacity(rgbaBuf, width, height, actualHeight, image) { 34868 const smask = this.smask; 34869 const mask = this.mask; 34870 let alphaBuf, sw, sh, i, ii, j; 34871 if (smask) { 34872 sw = smask.width; 34873 sh = smask.height; 34874 alphaBuf = new Uint8ClampedArray(sw * sh); 34875 await smask.fillGrayBuffer(alphaBuf); 34876 if (sw !== width || sh !== height) { 34877 alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); 34878 } 34879 } else if (mask) { 34880 if (mask instanceof PDFImage) { 34881 sw = mask.width; 34882 sh = mask.height; 34883 alphaBuf = new Uint8ClampedArray(sw * sh); 34884 mask.numComps = 1; 34885 await mask.fillGrayBuffer(alphaBuf); 34886 for (i = 0, ii = sw * sh; i < ii; ++i) { 34887 alphaBuf[i] = 255 - alphaBuf[i]; 34888 } 34889 if (sw !== width || sh !== height) { 34890 alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height); 34891 } 34892 } else if (Array.isArray(mask)) { 34893 alphaBuf = new Uint8ClampedArray(width * height); 34894 const numComps = this.numComps; 34895 for (i = 0, ii = width * height; i < ii; ++i) { 34896 let opacity = 0; 34897 const imageOffset = i * numComps; 34898 for (j = 0; j < numComps; ++j) { 34899 const color = image[imageOffset + j]; 34900 const maskOffset = j * 2; 34901 if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { 34902 opacity = 255; 34903 break; 34904 } 34905 } 34906 alphaBuf[i] = opacity; 34907 } 34908 } else { 34909 throw new FormatError("Unknown mask format."); 34910 } 34911 } 34912 if (alphaBuf) { 34913 for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { 34914 rgbaBuf[j] = alphaBuf[i]; 34915 } 34916 } else { 34917 for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { 34918 rgbaBuf[j] = 255; 34919 } 34920 } 34921 } 34922 undoPreblend(buffer, width, height) { 34923 const matte = this.smask?.matte; 34924 if (!matte) { 34925 return; 34926 } 34927 const matteRgb = this.colorSpace.getRgb(matte, 0); 34928 const matteR = matteRgb[0]; 34929 const matteG = matteRgb[1]; 34930 const matteB = matteRgb[2]; 34931 const length = width * height * 4; 34932 for (let i = 0; i < length; i += 4) { 34933 const alpha = buffer[i + 3]; 34934 if (alpha === 0) { 34935 buffer[i] = 255; 34936 buffer[i + 1] = 255; 34937 buffer[i + 2] = 255; 34938 continue; 34939 } 34940 const k = 255 / alpha; 34941 buffer[i] = (buffer[i] - matteR) * k + matteR; 34942 buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG; 34943 buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB; 34944 } 34945 } 34946 async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) { 34947 const drawWidth = this.drawWidth; 34948 const drawHeight = this.drawHeight; 34949 const imgData = { 34950 width: drawWidth, 34951 height: drawHeight, 34952 interpolate: this.interpolate, 34953 kind: 0, 34954 data: null 34955 }; 34956 const numComps = this.numComps; 34957 const originalWidth = this.width; 34958 const originalHeight = this.height; 34959 const bpc = this.bpc; 34960 const rowBytes = originalWidth * numComps * bpc + 7 >> 3; 34961 const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight); 34962 if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") { 34963 imgData.kind = ImageKind.RGBA_32BPP; 34964 const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, {}); 34965 if (isOffscreenCanvasSupported) { 34966 if (!mustBeResized) { 34967 return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray); 34968 } 34969 return ImageResizer.createImage(imgData, false); 34970 } 34971 return imgData; 34972 } 34973 if (!forceRGBA) { 34974 let kind; 34975 if (this.colorSpace.name === "DeviceGray" && bpc === 1) { 34976 kind = ImageKind.GRAYSCALE_1BPP; 34977 } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) { 34978 kind = ImageKind.RGB_24BPP; 34979 } 34980 if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { 34981 const image = await this.#getImage(originalWidth, originalHeight); 34982 if (image) { 34983 return image; 34984 } 34985 const data = await this.getImageBytes(originalHeight * rowBytes, {}); 34986 if (isOffscreenCanvasSupported) { 34987 if (mustBeResized) { 34988 return ImageResizer.createImage({ 34989 data, 34990 kind, 34991 width: drawWidth, 34992 height: drawHeight, 34993 interpolate: this.interpolate 34994 }, this.needsDecode); 34995 } 34996 return this.createBitmap(kind, originalWidth, originalHeight, data); 34997 } 34998 imgData.kind = kind; 34999 imgData.data = data; 35000 if (this.needsDecode) { 35001 assert(kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale."); 35002 const buffer = imgData.data; 35003 for (let i = 0, ii = buffer.length; i < ii; i++) { 35004 buffer[i] ^= 0xff; 35005 } 35006 } 35007 return imgData; 35008 } 35009 if (this.image instanceof JpegStream && !this.smask && !this.mask && !this.needsDecode) { 35010 let imageLength = originalHeight * rowBytes; 35011 if (isOffscreenCanvasSupported && !mustBeResized) { 35012 let isHandled = false; 35013 switch (this.colorSpace.name) { 35014 case "DeviceGray": 35015 imageLength *= 4; 35016 isHandled = true; 35017 break; 35018 case "DeviceRGB": 35019 imageLength = imageLength / 3 * 4; 35020 isHandled = true; 35021 break; 35022 case "DeviceCMYK": 35023 isHandled = true; 35024 break; 35025 } 35026 if (isHandled) { 35027 const image = await this.#getImage(drawWidth, drawHeight); 35028 if (image) { 35029 return image; 35030 } 35031 const rgba = await this.getImageBytes(imageLength, { 35032 drawWidth, 35033 drawHeight, 35034 forceRGBA: true 35035 }); 35036 return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba); 35037 } 35038 } else { 35039 switch (this.colorSpace.name) { 35040 case "DeviceGray": 35041 imageLength *= 3; 35042 case "DeviceRGB": 35043 case "DeviceCMYK": 35044 imgData.kind = ImageKind.RGB_24BPP; 35045 imgData.data = await this.getImageBytes(imageLength, { 35046 drawWidth, 35047 drawHeight, 35048 forceRGB: true 35049 }); 35050 if (mustBeResized) { 35051 return ImageResizer.createImage(imgData); 35052 } 35053 return imgData; 35054 } 35055 } 35056 } 35057 } 35058 const imgArray = await this.getImageBytes(originalHeight * rowBytes, { 35059 internal: true 35060 }); 35061 const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; 35062 const comps = this.getComponents(imgArray); 35063 let alpha01, maybeUndoPreblend; 35064 let canvas, ctx, canvasImgData, data; 35065 if (isOffscreenCanvasSupported && !mustBeResized) { 35066 canvas = new OffscreenCanvas(drawWidth, drawHeight); 35067 ctx = canvas.getContext("2d"); 35068 canvasImgData = ctx.createImageData(drawWidth, drawHeight); 35069 data = canvasImgData.data; 35070 } 35071 imgData.kind = ImageKind.RGBA_32BPP; 35072 if (!forceRGBA && !this.smask && !this.mask) { 35073 if (!isOffscreenCanvasSupported || mustBeResized) { 35074 imgData.kind = ImageKind.RGB_24BPP; 35075 data = new Uint8ClampedArray(drawWidth * drawHeight * 3); 35076 alpha01 = 0; 35077 } else { 35078 const arr = new Uint32Array(data.buffer); 35079 arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff); 35080 alpha01 = 1; 35081 } 35082 maybeUndoPreblend = false; 35083 } else { 35084 if (!isOffscreenCanvasSupported || mustBeResized) { 35085 data = new Uint8ClampedArray(drawWidth * drawHeight * 4); 35086 } 35087 alpha01 = 1; 35088 maybeUndoPreblend = true; 35089 await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); 35090 } 35091 if (this.needsDecode) { 35092 this.decodeBuffer(comps); 35093 } 35094 this.colorSpace.fillRgb(data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); 35095 if (maybeUndoPreblend) { 35096 this.undoPreblend(data, drawWidth, actualHeight); 35097 } 35098 if (isOffscreenCanvasSupported && !mustBeResized) { 35099 ctx.putImageData(canvasImgData, 0, 0); 35100 const bitmap = canvas.transferToImageBitmap(); 35101 return { 35102 data: null, 35103 width: drawWidth, 35104 height: drawHeight, 35105 bitmap, 35106 interpolate: this.interpolate 35107 }; 35108 } 35109 imgData.data = data; 35110 if (mustBeResized) { 35111 return ImageResizer.createImage(imgData); 35112 } 35113 return imgData; 35114 } 35115 async fillGrayBuffer(buffer) { 35116 const numComps = this.numComps; 35117 if (numComps !== 1) { 35118 throw new FormatError(`Reading gray scale from a color image: ${numComps}`); 35119 } 35120 const width = this.width; 35121 const height = this.height; 35122 const bpc = this.bpc; 35123 const rowBytes = width * numComps * bpc + 7 >> 3; 35124 const imgArray = await this.getImageBytes(height * rowBytes, { 35125 internal: true 35126 }); 35127 const comps = this.getComponents(imgArray); 35128 let i, length; 35129 if (bpc === 1) { 35130 length = width * height; 35131 if (this.needsDecode) { 35132 for (i = 0; i < length; ++i) { 35133 buffer[i] = comps[i] - 1 & 255; 35134 } 35135 } else { 35136 for (i = 0; i < length; ++i) { 35137 buffer[i] = -comps[i] & 255; 35138 } 35139 } 35140 return; 35141 } 35142 if (this.needsDecode) { 35143 this.decodeBuffer(comps); 35144 } 35145 length = width * height; 35146 const scale = 255 / ((1 << bpc) - 1); 35147 for (i = 0; i < length; ++i) { 35148 buffer[i] = scale * comps[i]; 35149 } 35150 } 35151 createBitmap(kind, width, height, src) { 35152 const canvas = new OffscreenCanvas(width, height); 35153 const ctx = canvas.getContext("2d"); 35154 let imgData; 35155 if (kind === ImageKind.RGBA_32BPP) { 35156 imgData = new ImageData(src, width, height); 35157 } else { 35158 imgData = ctx.createImageData(width, height); 35159 convertToRGBA({ 35160 kind, 35161 src, 35162 dest: new Uint32Array(imgData.data.buffer), 35163 width, 35164 height, 35165 inverseDecode: this.needsDecode 35166 }); 35167 } 35168 ctx.putImageData(imgData, 0, 0); 35169 const bitmap = canvas.transferToImageBitmap(); 35170 return { 35171 data: null, 35172 width, 35173 height, 35174 bitmap, 35175 interpolate: this.interpolate 35176 }; 35177 } 35178 async #getImage(width, height) { 35179 const bitmap = await this.image.getTransferableImage(); 35180 if (!bitmap) { 35181 return null; 35182 } 35183 return { 35184 data: null, 35185 width, 35186 height, 35187 bitmap, 35188 interpolate: this.interpolate 35189 }; 35190 } 35191 async getImageBytes(length, { 35192 drawWidth, 35193 drawHeight, 35194 forceRGBA = false, 35195 forceRGB = false, 35196 internal = false 35197 }) { 35198 this.image.reset(); 35199 this.image.drawWidth = drawWidth || this.width; 35200 this.image.drawHeight = drawHeight || this.height; 35201 this.image.forceRGBA = !!forceRGBA; 35202 this.image.forceRGB = !!forceRGB; 35203 const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions); 35204 if (internal || this.image instanceof DecodeStream) { 35205 return imageBytes; 35206 } 35207 assert(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.'); 35208 return new Uint8Array(imageBytes); 35209 } 35210} 35211 35212;// ./src/core/evaluator.js 35213 35214 35215 35216 35217 35218 35219 35220 35221 35222 35223 35224 35225 35226 35227 35228 35229 35230 35231 35232 35233 35234 35235 35236 35237 35238 35239 35240 35241 35242 35243 35244 35245 35246 35247 35248 35249 35250 35251 35252 35253 35254 35255 35256 35257 35258 35259const DefaultPartialEvaluatorOptions = Object.freeze({ 35260 maxImageSize: -1, 35261 disableFontFace: false, 35262 ignoreErrors: false, 35263 isEvalSupported: true, 35264 isOffscreenCanvasSupported: false, 35265 isImageDecoderSupported: false, 35266 canvasMaxAreaInBytes: -1, 35267 fontExtraProperties: false, 35268 useSystemFonts: true, 35269 cMapUrl: null, 35270 standardFontDataUrl: null 35271}); 35272const PatternType = { 35273 TILING: 1, 35274 SHADING: 2 35275}; 35276const TEXT_CHUNK_BATCH_SIZE = 10; 35277const deferred = Promise.resolve(); 35278function normalizeBlendMode(value, parsingArray = false) { 35279 if (Array.isArray(value)) { 35280 for (const val of value) { 35281 const maybeBM = normalizeBlendMode(val, true); 35282 if (maybeBM) { 35283 return maybeBM; 35284 } 35285 } 35286 warn(`Unsupported blend mode Array: ${value}`); 35287 return "source-over"; 35288 } 35289 if (!(value instanceof Name)) { 35290 if (parsingArray) { 35291 return null; 35292 } 35293 return "source-over"; 35294 } 35295 switch (value.name) { 35296 case "Normal": 35297 case "Compatible": 35298 return "source-over"; 35299 case "Multiply": 35300 return "multiply"; 35301 case "Screen": 35302 return "screen"; 35303 case "Overlay": 35304 return "overlay"; 35305 case "Darken": 35306 return "darken"; 35307 case "Lighten": 35308 return "lighten"; 35309 case "ColorDodge": 35310 return "color-dodge"; 35311 case "ColorBurn": 35312 return "color-burn"; 35313 case "HardLight": 35314 return "hard-light"; 35315 case "SoftLight": 35316 return "soft-light"; 35317 case "Difference": 35318 return "difference"; 35319 case "Exclusion": 35320 return "exclusion"; 35321 case "Hue": 35322 return "hue"; 35323 case "Saturation": 35324 return "saturation"; 35325 case "Color": 35326 return "color"; 35327 case "Luminosity": 35328 return "luminosity"; 35329 } 35330 if (parsingArray) { 35331 return null; 35332 } 35333 warn(`Unsupported blend mode: ${value.name}`); 35334 return "source-over"; 35335} 35336function addLocallyCachedImageOps(opList, data) { 35337 if (data.objId) { 35338 opList.addDependency(data.objId); 35339 } 35340 opList.addImageOps(data.fn, data.args, data.optionalContent, data.hasMask); 35341 if (data.fn === OPS.paintImageMaskXObject && data.args[0]?.count > 0) { 35342 data.args[0].count++; 35343 } 35344} 35345class TimeSlotManager { 35346 static TIME_SLOT_DURATION_MS = 20; 35347 static CHECK_TIME_EVERY = 100; 35348 constructor() { 35349 this.reset(); 35350 } 35351 check() { 35352 if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) { 35353 return false; 35354 } 35355 this.checked = 0; 35356 return this.endTime <= Date.now(); 35357 } 35358 reset() { 35359 this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS; 35360 this.checked = 0; 35361 } 35362} 35363class PartialEvaluator { 35364 constructor({ 35365 xref, 35366 handler, 35367 pageIndex, 35368 idFactory, 35369 fontCache, 35370 builtInCMapCache, 35371 standardFontDataCache, 35372 globalImageCache, 35373 systemFontCache, 35374 options = null 35375 }) { 35376 this.xref = xref; 35377 this.handler = handler; 35378 this.pageIndex = pageIndex; 35379 this.idFactory = idFactory; 35380 this.fontCache = fontCache; 35381 this.builtInCMapCache = builtInCMapCache; 35382 this.standardFontDataCache = standardFontDataCache; 35383 this.globalImageCache = globalImageCache; 35384 this.systemFontCache = systemFontCache; 35385 this.options = options || DefaultPartialEvaluatorOptions; 35386 this.type3FontRefs = null; 35387 this._regionalImageCache = new RegionalImageCache(); 35388 this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); 35389 ImageResizer.setOptions(this.options); 35390 JpegStream.setOptions(this.options); 35391 } 35392 get _pdfFunctionFactory() { 35393 const pdfFunctionFactory = new PDFFunctionFactory({ 35394 xref: this.xref, 35395 isEvalSupported: this.options.isEvalSupported 35396 }); 35397 return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); 35398 } 35399 get parsingType3Font() { 35400 return !!this.type3FontRefs; 35401 } 35402 clone(newOptions = null) { 35403 const newEvaluator = Object.create(this); 35404 newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions); 35405 return newEvaluator; 35406 } 35407 hasBlendModes(resources, nonBlendModesSet) { 35408 if (!(resources instanceof Dict)) { 35409 return false; 35410 } 35411 if (resources.objId && nonBlendModesSet.has(resources.objId)) { 35412 return false; 35413 } 35414 const processed = new RefSet(nonBlendModesSet); 35415 if (resources.objId) { 35416 processed.put(resources.objId); 35417 } 35418 const nodes = [resources], 35419 xref = this.xref; 35420 while (nodes.length) { 35421 const node = nodes.shift();
35422 const graphicStates = node.get("ExtGState"); 35423 if (graphicStates instanceof Dict) { 35424 for (let graphicState of graphicStates.getRawValues()) { 35425 if (graphicState instanceof Ref) { 35426 if (processed.has(graphicState)) { 35427 continue; 35428 } 35429 try { 35430 graphicState = xref.fetch(graphicState); 35431 } catch (ex) { 35432 processed.put(graphicState); 35433 info(`hasBlendModes - ignoring ExtGState: "${ex}".`); 35434 continue; 35435 } 35436 } 35437 if (!(graphicState instanceof Dict)) { 35438 continue; 35439 } 35440 if (graphicState.objId) { 35441 processed.put(graphicState.objId); 35442 } 35443 const bm = graphicState.get("BM"); 35444 if (bm instanceof Name) { 35445 if (bm.name !== "Normal") { 35446 return true; 35447 } 35448 continue; 35449 } 35450 if (bm !== undefined && Array.isArray(bm)) { 35451 for (const element of bm) { 35452 if (element instanceof Name && element.name !== "Normal") { 35453 return true; 35454 } 35455 } 35456 } 35457 } 35458 } 35459 const xObjects = node.get("XObject"); 35460 if (!(xObjects instanceof Dict)) { 35461 continue; 35462 } 35463 for (let xObject of xObjects.getRawValues()) { 35464 if (xObject instanceof Ref) { 35465 if (processed.has(xObject)) { 35466 continue; 35467 } 35468 try { 35469 xObject = xref.fetch(xObject); 35470 } catch (ex) { 35471 processed.put(xObject); 35472 info(`hasBlendModes - ignoring XObject: "${ex}".`); 35473 continue; 35474 } 35475 } 35476 if (!(xObject instanceof BaseStream)) { 35477 continue; 35478 } 35479 if (xObject.dict.objId) { 35480 processed.put(xObject.dict.objId); 35481 } 35482 const xResources = xObject.dict.get("Resources"); 35483 if (!(xResources instanceof Dict)) { 35484 continue; 35485 } 35486 if (xResources.objId && processed.has(xResources.objId)) { 35487 continue; 35488 } 35489 nodes.push(xResources); 35490 if (xResources.objId) { 35491 processed.put(xResources.objId); 35492 } 35493 } 35494 } 35495 for (const ref of processed) { 35496 nonBlendModesSet.put(ref); 35497 } 35498 return false; 35499 } 35500 async #fetchData(url) { 35501 const response = await fetch(url); 35502 if (!response.ok) { 35503 throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`); 35504 } 35505 return new Uint8Array(await response.arrayBuffer()); 35506 } 35507 async fetchBuiltInCMap(name) { 35508 const cachedData = this.builtInCMapCache.get(name); 35509 if (cachedData) { 35510 return cachedData; 35511 } 35512 let data; 35513 if (this.options.cMapUrl !== null) { 35514 const cMapData = await this.#fetchData(`${this.options.cMapUrl}${name}.bcmap`); 35515 data = { 35516 cMapData, 35517 isCompressed: true 35518 }; 35519 } else { 35520 data = await this.handler.sendWithPromise("FetchBuiltInCMap", { 35521 name 35522 }); 35523 } 35524 this.builtInCMapCache.set(name, data); 35525 return data; 35526 } 35527 async fetchStandardFontData(name) { 35528 const cachedData = this.standardFontDataCache.get(name); 35529 if (cachedData) { 35530 return new Stream(cachedData); 35531 } 35532 if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") { 35533 return null; 35534 } 35535 const standardFontNameToFileName = getFontNameToFileMap(), 35536 filename = standardFontNameToFileName[name]; 35537 let data; 35538 try { 35539 if (this.options.standardFontDataUrl !== null) { 35540 data = await this.#fetchData(`${this.options.standardFontDataUrl}${filename}`); 35541 } else { 35542 data = await this.handler.sendWithPromise("FetchStandardFontData", { 35543 filename 35544 }); 35545 } 35546 } catch (ex) { 35547 warn(ex); 35548 return null; 35549 } 35550 this.standardFontDataCache.set(name, data); 35551 return new Stream(data); 35552 } 35553 async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) { 35554 const dict = xobj.dict; 35555 const matrix = lookupMatrix(dict.getArray("Matrix"), null); 35556 const bbox = lookupNormalRect(dict.getArray("BBox"), null); 35557 let optionalContent, groupOptions; 35558 if (dict.has("OC")) { 35559 optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); 35560 } 35561 if (optionalContent !== undefined) { 35562 operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); 35563 } 35564 const group = dict.get("Group"); 35565 if (group) { 35566 groupOptions = { 35567 matrix, 35568 bbox, 35569 smask, 35570 isolated: false, 35571 knockout: false 35572 }; 35573 const groupSubtype = group.get("S"); 35574 let colorSpace = null; 35575 if (isName(groupSubtype, "Transparency")) { 35576 groupOptions.isolated = group.get("I") || false; 35577 groupOptions.knockout = group.get("K") || false; 35578 if (group.has("CS")) { 35579 const cs = group.getRaw("CS"); 35580 const cachedColorSpace = ColorSpace.getCached(cs, this.xref, localColorSpaceCache); 35581 if (cachedColorSpace) { 35582 colorSpace = cachedColorSpace; 35583 } else { 35584 colorSpace = await this.parseColorSpace({ 35585 cs, 35586 resources, 35587 localColorSpaceCache 35588 }); 35589 } 35590 } 35591 } 35592 if (smask?.backdrop) { 35593 colorSpace ||= ColorSpace.singletons.rgb; 35594 smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); 35595 } 35596 operatorList.addOp(OPS.beginGroup, [groupOptions]); 35597 } 35598 const args = group ? [matrix, null] : [matrix, bbox]; 35599 operatorList.addOp(OPS.paintFormXObjectBegin, args); 35600 await this.getOperatorList({ 35601 stream: xobj, 35602 task, 35603 resources: dict.get("Resources") || resources, 35604 operatorList, 35605 initialState 35606 }); 35607 operatorList.addOp(OPS.paintFormXObjectEnd, []); 35608 if (group) { 35609 operatorList.addOp(OPS.endGroup, [groupOptions]); 35610 } 35611 if (optionalContent !== undefined) { 35612 operatorList.addOp(OPS.endMarkedContent, []); 35613 } 35614 } 35615 _sendImgData(objId, imgData, cacheGlobally = false) { 35616 const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null; 35617 if (this.parsingType3Font || cacheGlobally) { 35618 return this.handler.send("commonobj", [objId, "Image", imgData], transfers); 35619 } 35620 return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers); 35621 } 35622 async buildPaintImageXObject({ 35623 resources, 35624 image, 35625 isInline = false, 35626 operatorList, 35627 cacheKey, 35628 localImageCache, 35629 localColorSpaceCache 35630 }) { 35631 const dict = image.dict; 35632 const imageRef = dict.objId; 35633 const w = dict.get("W", "Width"); 35634 const h = dict.get("H", "Height");
35635 if (!(w && typeof w === "number") || !(h && typeof h === "number")) { 35636 warn("Image dimensions are missing, or not numbers."); 35637 return; 35638 } 35639 const maxImageSize = this.options.maxImageSize; 35640 if (maxImageSize !== -1 && w * h > maxImageSize) { 35641 const msg = "Image exceeded maximum allowed size and was removed."; 35642 if (this.options.ignoreErrors) { 35643 warn(msg); 35644 return; 35645 } 35646 throw new Error(msg); 35647 } 35648 let optionalContent; 35649 if (dict.has("OC")) { 35650 optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); 35651 } 35652 const imageMask = dict.get("IM", "ImageMask") || false; 35653 let imgData, args; 35654 if (imageMask) { 35655 const interpolate = dict.get("I", "Interpolate"); 35656 const bitStrideLength = w + 7 >> 3; 35657 const imgArray = image.getBytes(bitStrideLength * h); 35658 const decode = dict.getArray("D", "Decode"); 35659 if (this.parsingType3Font) { 35660 imgData = PDFImage.createRawMask({ 35661 imgArray, 35662 width: w, 35663 height: h, 35664 imageIsFromDecodeStream: image instanceof DecodeStream, 35665 inverseDecode: decode?.[0] > 0, 35666 interpolate 35667 }); 35668 imgData.cached = !!cacheKey; 35669 args = [imgData]; 35670 operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); 35671 if (cacheKey) { 35672 const cacheData = { 35673 fn: OPS.paintImageMaskXObject, 35674 args, 35675 optionalContent 35676 }; 35677 localImageCache.set(cacheKey, imageRef, cacheData); 35678 if (imageRef) { 35679 this._regionalImageCache.set(null, imageRef, cacheData); 35680 } 35681 } 35682 return; 35683 } 35684 imgData = await PDFImage.createMask({ 35685 imgArray, 35686 width: w, 35687 height: h,
35688 imageIsFromDecodeStream: image instanceof DecodeStream, 35689 inverseDecode: decode?.[0] > 0, 35690 interpolate, 35691 isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported 35692 }); 35693 if (imgData.isSingleOpaquePixel) { 35694 operatorList.addImageOps(OPS.paintSolidColorImageMask, [], optionalContent); 35695 if (cacheKey) { 35696 const cacheData = { 35697 fn: OPS.paintSolidColorImageMask, 35698 args: [], 35699 optionalContent 35700 }; 35701 localImageCache.set(cacheKey, imageRef, cacheData); 35702 if (imageRef) { 35703 this._regionalImageCache.set(null, imageRef, cacheData); 35704 } 35705 } 35706 return; 35707 } 35708 const objId = `mask_${this.idFactory.createObjId()}`; 35709 operatorList.addDependency(objId); 35710 imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; 35711 this._sendImgData(objId, imgData); 35712 args = [{ 35713 data: objId, 35714 width: imgData.width, 35715 height: imgData.height, 35716 interpolate: imgData.interpolate, 35717 count: 1 35718 }]; 35719 operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); 35720 if (cacheKey) { 35721 const cacheData = { 35722 objId, 35723 fn: OPS.paintImageMaskXObject, 35724 args, 35725 optionalContent 35726 }; 35727 localImageCache.set(cacheKey, imageRef, cacheData); 35728 if (imageRef) { 35729 this._regionalImageCache.set(null, imageRef, cacheData); 35730 } 35731 } 35732 return; 35733 } 35734 const SMALL_IMAGE_DIMENSIONS = 200; 35735 const hasMask = dict.has("SMask") || dict.has("Mask"); 35736 if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) { 35737 try { 35738 const imageObj = new PDFImage({ 35739 xref: this.xref, 35740 res: resources, 35741 image, 35742 isInline, 35743 pdfFunctionFactory: this._pdfFunctionFactory, 35744 localColorSpaceCache 35745 }); 35746 imgData = await imageObj.createImageData(true, false); 35747 operatorList.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported; 35748 operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent); 35749 } catch (reason) { 35750 const msg = `Unable to decode inline image: "${reason}".`; 35751 if (!this.options.ignoreErrors) { 35752 throw new Error(msg); 35753 } 35754 warn(msg); 35755 } 35756 return; 35757 } 35758 let objId = `img_${this.idFactory.createObjId()}`, 35759 cacheGlobally = false; 35760 if (this.parsingType3Font) {
35761 objId = `${this.idFactory.getDocId()}_type3_${objId}`; 35762 } else if (cacheKey && imageRef) { 35763 cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex); 35764 if (cacheGlobally) { 35765 assert(!isInline, "Cannot cache an inline image globally."); 35766 objId = `${this.idFactory.getDocId()}_${objId}`; 35767 } 35768 } 35769 operatorList.addDependency(objId); 35770 args = [objId, w, h]; 35771 operatorList.addImageOps(OPS.paintImageXObject, args, optionalContent, hasMask); 35772 if (cacheGlobally) { 35773 if (this.globalImageCache.hasDecodeFailed(imageRef)) { 35774 this.globalImageCache.setData(imageRef, { 35775 objId, 35776 fn: OPS.paintImageXObject, 35777 args, 35778 optionalContent, 35779 hasMask, 35780 byteSize: 0 35781 }); 35782 this._sendImgData(objId, null, cacheGlobally); 35783 return; 35784 } 35785 if (w * h > 250000 || hasMask) { 35786 const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", { 35787 imageRef 35788 }]); 35789 if (localLength) { 35790 this.globalImageCache.setData(imageRef, { 35791 objId, 35792 fn: OPS.paintImageXObject, 35793 args, 35794 optionalContent, 35795 hasMask, 35796 byteSize: 0 35797 }); 35798 this.globalImageCache.addByteSize(imageRef, localLength); 35799 return; 35800 } 35801 } 35802 } 35803 PDFImage.buildImage({ 35804 xref: this.xref, 35805 res: resources, 35806 image, 35807 isInline, 35808 pdfFunctionFactory: this._pdfFunctionFactory, 35809 localColorSpaceCache 35810 }).then(async imageObj => { 35811 imgData = await imageObj.createImageData(false, this.options.isOffscreenCanvasSupported); 35812 imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; 35813 imgData.ref = imageRef; 35814 if (cacheGlobally) { 35815 this.globalImageCache.addByteSize(imageRef, imgData.dataLen); 35816 } 35817 return this._sendImgData(objId, imgData, cacheGlobally); 35818 }).catch(reason => { 35819 warn(`Unable to decode image "${objId}": "${reason}".`); 35820 if (imageRef) { 35821 this.globalImageCache.addDecodeFailed(imageRef); 35822 } 35823 return this._sendImgData(objId, null, cacheGlobally); 35824 }); 35825 if (cacheKey) { 35826 const cacheData = { 35827 objId, 35828 fn: OPS.paintImageXObject, 35829 args, 35830 optionalContent, 35831 hasMask 35832 }; 35833 localImageCache.set(cacheKey, imageRef, cacheData); 35834 if (imageRef) { 35835 this._regionalImageCache.set(null, imageRef, cacheData); 35836 if (cacheGlobally) { 35837 this.globalImageCache.setData(imageRef, { 35838 objId, 35839 fn: OPS.paintImageXObject, 35840 args, 35841 optionalContent, 35842 hasMask, 35843 byteSize: 0 35844 }); 35845 } 35846 } 35847 } 35848 } 35849 handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) { 35850 const smaskContent = smask.get("G"); 35851 const smaskOptions = { 35852 subtype: smask.get("S").name, 35853 backdrop: smask.get("BC") 35854 }; 35855 const transferObj = smask.get("TR"); 35856 if (isPDFFunction(transferObj)) { 35857 const transferFn = this._pdfFunctionFactory.create(transferObj); 35858 const transferMap = new Uint8Array(256); 35859 const tmp = new Float32Array(1); 35860 for (let i = 0; i < 256; i++) { 35861 tmp[0] = i / 255; 35862 transferFn(tmp, 0, tmp, 0); 35863 transferMap[i] = tmp[0] * 255 | 0; 35864 } 35865 smaskOptions.transferMap = transferMap; 35866 } 35867 return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone(), localColorSpaceCache); 35868 } 35869 handleTransferFunction(tr) { 35870 let transferArray; 35871 if (Array.isArray(tr)) { 35872 transferArray = tr; 35873 } else if (isPDFFunction(tr)) { 35874 transferArray = [tr]; 35875 } else { 35876 return null; 35877 } 35878 const transferMaps = []; 35879 let numFns = 0, 35880 numEffectfulFns = 0; 35881 for (const entry of transferArray) { 35882 const transferObj = this.xref.fetchIfRef(entry); 35883 numFns++; 35884 if (isName(transferObj, "Identity")) { 35885 transferMaps.push(null); 35886 continue; 35887 } else if (!isPDFFunction(transferObj)) { 35888 return null; 35889 } 35890 const transferFn = this._pdfFunctionFactory.create(transferObj); 35891 const transferMap = new Uint8Array(256), 35892 tmp = new Float32Array(1); 35893 for (let j = 0; j < 256; j++) { 35894 tmp[0] = j / 255; 35895 transferFn(tmp, 0, tmp, 0); 35896 transferMap[j] = tmp[0] * 255 | 0; 35897 } 35898 transferMaps.push(transferMap); 35899 numEffectfulFns++; 35900 } 35901 if (!(numFns === 1 || numFns === 4)) { 35902 return null; 35903 } 35904 if (numEffectfulFns === 0) { 35905 return null; 35906 } 35907 return transferMaps; 35908 } 35909 handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache) { 35910 const tilingOpList = new OperatorList(); 35911 const patternResources = Dict.merge({ 35912 xref: this.xref, 35913 dictArray: [patternDict.get("Resources"), resources] 35914 }); 35915 return this.getOperatorList({ 35916 stream: pattern, 35917 task,
35918 resources: patternResources, 35919 operatorList: tilingOpList 35920 }).then(function () { 35921 const operatorListIR = tilingOpList.getIR(); 35922 const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color); 35923 operatorList.addDependencies(tilingOpList.dependencies); 35924 operatorList.addOp(fn, tilingPatternIR); 35925 if (patternDict.objId) { 35926 localTilingPatternCache.set(null, patternDict.objId, { 35927 operatorListIR, 35928 dict: patternDict 35929 }); 35930 } 35931 }).catch(reason => { 35932 if (reason instanceof AbortException) { 35933 return; 35934 } 35935 if (this.options.ignoreErrors) { 35936 warn(`handleTilingType - ignoring pattern: "${reason}".`); 35937 return; 35938 } 35939 throw reason; 35940 }); 35941 } 35942 async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null) { 35943 const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null; 35944 let translated = await this.loadFont(fontName, fontRef, resources, fallbackFontDict, cssFontInfo); 35945 if (translated.font.isType3Font) { 35946 try { 35947 await translated.loadType3Data(this, resources, task); 35948 operatorList.addDependencies(translated.type3Dependencies); 35949 } catch (reason) { 35950 translated = new TranslatedFont({ 35951 loadedName: "g_font_error", 35952 font: new ErrorFont(`Type3 font load error: ${reason}`), 35953 dict: translated.font, 35954 evaluatorOptions: this.options 35955 }); 35956 } 35957 } 35958 state.font = translated.font; 35959 translated.send(this.handler); 35960 return translated.loadedName; 35961 }
vendor: 4,621 bytes, lines 35962-36134
35962 handleText(chars, state) { 35963 const font = state.font; 35964 const glyphs = font.charsToGlyphs(chars); 35965 if (font.data) { 35966 const isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); 35967 if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || this.options.disableFontFace) { 35968 PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options); 35969 } 35970 } 35971 return glyphs; 35972 } 35973 ensureStateFont(state) { 35974 if (state.font) { 35975 return; 35976 } 35977 const reason = new FormatError("Missing setFont (Tf) operator before text rendering operator."); 35978 if (this.options.ignoreErrors) { 35979 warn(`ensureStateFont: "${reason}".`); 35980 return; 35981 } 35982 throw reason; 35983 } 35984 async setGState({ 35985 resources, 35986 gState, 35987 operatorList, 35988 cacheKey, 35989 task, 35990 stateManager, 35991 localGStateCache, 35992 localColorSpaceCache 35993 }) { 35994 const gStateRef = gState.objId; 35995 let isSimpleGState = true; 35996 const gStateObj = []; 35997 let promise = Promise.resolve(); 35998 for (const key of gState.getKeys()) { 35999 const value = gState.get(key); 36000 switch (key) { 36001 case "Type": 36002 break; 36003 case "LW": 36004 case "LC": 36005 case "LJ": 36006 case "ML": 36007 case "D": 36008 case "RI": 36009 case "FL": 36010 case "CA": 36011 case "ca": 36012 gStateObj.push([key, value]); 36013 break; 36014 case "Font": 36015 isSimpleGState = false; 36016 promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) { 36017 operatorList.addDependency(loadedName); 36018 gStateObj.push([key, [loadedName, value[1]]]); 36019 })); 36020 break; 36021 case "BM": 36022 gStateObj.push([key, normalizeBlendMode(value)]); 36023 break; 36024 case "SMask": 36025 if (isName(value, "None")) { 36026 gStateObj.push([key, false]); 36027 break; 36028 } 36029 if (value instanceof Dict) { 36030 isSimpleGState = false; 36031 promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache)); 36032 gStateObj.push([key, true]); 36033 } else { 36034 warn("Unsupported SMask type"); 36035 } 36036 break; 36037 case "TR": 36038 const transferMaps = this.handleTransferFunction(value); 36039 gStateObj.push([key, transferMaps]); 36040 break; 36041 case "OP": 36042 case "op": 36043 case "OPM": 36044 case "BG": 36045 case "BG2": 36046 case "UCR": 36047 case "UCR2": 36048 case "TR2": 36049 case "HT": 36050 case "SM": 36051 case "SA": 36052 case "AIS": 36053 case "TK": 36054 info("graphic state operator " + key); 36055 break; 36056 default: 36057 info("Unknown graphic state operator " + key); 36058 break; 36059 } 36060 } 36061 await promise; 36062 if (gStateObj.length > 0) { 36063 operatorList.addOp(OPS.setGState, [gStateObj]); 36064 } 36065 if (isSimpleGState) { 36066 localGStateCache.set(cacheKey, gStateRef, gStateObj); 36067 } 36068 } 36069 loadFont(fontName, font, resources, fallbackFontDict = null, cssFontInfo = null) { 36070 const errorFont = async () => { 36071 return new TranslatedFont({ 36072 loadedName: "g_font_error", 36073 font: new ErrorFont(`Font "${fontName}" is not available.`), 36074 dict: font, 36075 evaluatorOptions: this.options 36076 }); 36077 }; 36078 let fontRef; 36079 if (font) { 36080 if (font instanceof Ref) { 36081 fontRef = font; 36082 } 36083 } else { 36084 const fontRes = resources.get("Font"); 36085 if (fontRes) { 36086 fontRef = fontRes.getRaw(fontName); 36087 } 36088 } 36089 if (fontRef) { 36090 if (this.type3FontRefs?.has(fontRef)) { 36091 return errorFont(); 36092 } 36093 if (this.fontCache.has(fontRef)) { 36094 return this.fontCache.get(fontRef); 36095 } 36096 try { 36097 font = this.xref.fetchIfRef(fontRef); 36098 } catch (ex) { 36099 warn(`loadFont - lookup failed: "${ex}".`); 36100 } 36101 } 36102 if (!(font instanceof Dict)) { 36103 if (!this.options.ignoreErrors && !this.parsingType3Font) { 36104 warn(`Font "${fontName}" is not available.`); 36105 return errorFont(); 36106 } 36107 warn(`Font "${fontName}" is not available -- attempting to fallback to a default font.`); 36108 font = fallbackFontDict || PartialEvaluator.fallbackFontDict; 36109 } 36110 if (font.cacheKey && this.fontCache.has(font.cacheKey)) { 36111 return this.fontCache.get(font.cacheKey); 36112 } 36113 const { 36114 promise, 36115 resolve 36116 } = Promise.withResolvers(); 36117 let preEvaluatedFont; 36118 try { 36119 preEvaluatedFont = this.preEvaluateFont(font); 36120 preEvaluatedFont.cssFontInfo = cssFontInfo; 36121 } catch (reason) { 36122 warn(`loadFont - preEvaluateFont failed: "${reason}".`); 36123 return errorFont(); 36124 } 36125 const { 36126 descriptor, 36127 hash 36128 } = preEvaluatedFont; 36129 const fontRefIsRef = fontRef instanceof Ref; 36130 let fontID; 36131 if (hash && descriptor instanceof Dict) { 36132 const fontAliases = descriptor.fontAliases ||= Object.create(null); 36133 if (fontAliases[hash]) { 36134 const aliasFontRef = fontAliases[hash].aliasRef;
36135 if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) { 36136 this.fontCache.putAlias(fontRef, aliasFontRef); 36137 return this.fontCache.get(fontRef); 36138 } 36139 } else { 36140 fontAliases[hash] = { 36141 fontID: this.idFactory.createFontId() 36142 }; 36143 } 36144 if (fontRefIsRef) { 36145 fontAliases[hash].aliasRef = fontRef; 36146 } 36147 fontID = fontAliases[hash].fontID; 36148 } else { 36149 fontID = this.idFactory.createFontId(); 36150 } 36151 assert(fontID?.startsWith("f"), 'The "fontID" must be (correctly) defined.'); 36152 if (fontRefIsRef) { 36153 this.fontCache.put(fontRef, promise); 36154 } else { 36155 font.cacheKey = `cacheKey_${fontID}`; 36156 this.fontCache.put(font.cacheKey, promise); 36157 } 36158 font.loadedName = `${this.idFactory.getDocId()}_${fontID}`; 36159 this.translateFont(preEvaluatedFont).then(translatedFont => { 36160 resolve(new TranslatedFont({ 36161 loadedName: font.loadedName, 36162 font: translatedFont, 36163 dict: font, 36164 evaluatorOptions: this.options 36165 })); 36166 }).catch(reason => { 36167 warn(`loadFont - translateFont failed: "${reason}".`); 36168 resolve(new TranslatedFont({ 36169 loadedName: font.loadedName, 36170 font: new ErrorFont(reason instanceof Error ? reason.message : reason), 36171 dict: font, 36172 evaluatorOptions: this.options 36173 })); 36174 }); 36175 return promise; 36176 } 36177 buildPath(operatorList, fn, args, parsingText = false) { 36178 const lastIndex = operatorList.length - 1; 36179 if (!args) { 36180 args = []; 36181 } 36182 if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== OPS.constructPath) { 36183 if (parsingText) { 36184 warn(`Encountered path operator "${fn}" inside of a text object.`); 36185 operatorList.addOp(OPS.save, null); 36186 } 36187 let minMax; 36188 switch (fn) { 36189 case OPS.rectangle: 36190 const x = args[0] + args[2]; 36191 const y = args[1] + args[3]; 36192 minMax = [Math.min(args[0], x), Math.min(args[1], y), Math.max(args[0], x), Math.max(args[1], y)]; 36193 break; 36194 case OPS.moveTo: 36195 case OPS.lineTo: 36196 minMax = [args[0], args[1], args[0], args[1]]; 36197 break; 36198 default: 36199 minMax = [Infinity, Infinity, -Infinity, -Infinity]; 36200 break; 36201 } 36202 operatorList.addOp(OPS.constructPath, [[fn], args, minMax]); 36203 if (parsingText) { 36204 operatorList.addOp(OPS.restore, null); 36205 } 36206 } else { 36207 const opArgs = operatorList.argsArray[lastIndex]; 36208 opArgs[0].push(fn); 36209 opArgs[1].push(...args); 36210 const minMax = opArgs[2]; 36211 switch (fn) { 36212 case OPS.rectangle: 36213 const x = args[0] + args[2]; 36214 const y = args[1] + args[3]; 36215 minMax[0] = Math.min(minMax[0], args[0], x); 36216 minMax[1] = Math.min(minMax[1], args[1], y); 36217 minMax[2] = Math.max(minMax[2], args[0], x); 36218 minMax[3] = Math.max(minMax[3], args[1], y); 36219 break; 36220 case OPS.moveTo: 36221 case OPS.lineTo: 36222 minMax[0] = Math.min(minMax[0], args[0]); 36223 minMax[1] = Math.min(minMax[1], args[1]); 36224 minMax[2] = Math.max(minMax[2], args[0]); 36225 minMax[3] = Math.max(minMax[3], args[1]); 36226 break; 36227 } 36228 } 36229 } 36230 parseColorSpace({ 36231 cs, 36232 resources, 36233 localColorSpaceCache 36234 }) { 36235 return ColorSpace.parseAsync({ 36236 cs, 36237 xref: this.xref, 36238 resources, 36239 pdfFunctionFactory: this._pdfFunctionFactory, 36240 localColorSpaceCache 36241 }).catch(reason => { 36242 if (reason instanceof AbortException) { 36243 return null; 36244 } 36245 if (this.options.ignoreErrors) { 36246 warn(`parseColorSpace - ignoring ColorSpace: "${reason}".`); 36247 return null; 36248 } 36249 throw reason; 36250 }); 36251 } 36252 parseShading({ 36253 shading, 36254 resources, 36255 localColorSpaceCache, 36256 localShadingPatternCache 36257 }) { 36258 let id = localShadingPatternCache.get(shading); 36259 if (id) { 36260 return id; 36261 } 36262 let patternIR; 36263 try { 36264 const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, localColorSpaceCache); 36265 patternIR = shadingFill.getIR(); 36266 } catch (reason) { 36267 if (reason instanceof AbortException) { 36268 return null; 36269 } 36270 if (this.options.ignoreErrors) { 36271 warn(`parseShading - ignoring shading: "${reason}".`); 36272 localShadingPatternCache.set(shading, null); 36273 return null; 36274 } 36275 throw reason; 36276 } 36277 id = `pattern_${this.idFactory.createObjId()}`; 36278 if (this.parsingType3Font) { 36279 id = `${this.idFactory.getDocId()}_type3_${id}`; 36280 } 36281 localShadingPatternCache.set(shading, id); 36282 if (this.parsingType3Font) { 36283 this.handler.send("commonobj", [id, "Pattern", patternIR]); 36284 } else { 36285 this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); 36286 } 36287 return id; 36288 } 36289 handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache) { 36290 const patternName = args.pop(); 36291 if (patternName instanceof Name) { 36292 const rawPattern = patterns.getRaw(patternName.name); 36293 const localTilingPattern = rawPattern instanceof Ref && localTilingPatternCache.getByRef(rawPattern); 36294 if (localTilingPattern) { 36295 try { 36296 const color = cs.base ? cs.base.getRgb(args, 0) : null; 36297 const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color); 36298 operatorList.addOp(fn, tilingPatternIR); 36299 return undefined; 36300 } catch {} 36301 } 36302 const pattern = this.xref.fetchIfRef(rawPattern); 36303 if (pattern) { 36304 const dict = pattern instanceof BaseStream ? pattern.dict : pattern; 36305 const typeNum = dict.get("PatternType"); 36306 if (typeNum === PatternType.TILING) { 36307 const color = cs.base ? cs.base.getRgb(args, 0) : null; 36308 return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache); 36309 } else if (typeNum === PatternType.SHADING) { 36310 const shading = dict.get("Shading"); 36311 const objId = this.parseShading({ 36312 shading, 36313 resources, 36314 localColorSpaceCache, 36315 localShadingPatternCache 36316 }); 36317 if (objId) { 36318 const matrix = lookupMatrix(dict.getArray("Matrix"), null); 36319 operatorList.addOp(fn, ["Shading", objId, matrix]); 36320 } 36321 return undefined; 36322 } 36323 throw new FormatError(`Unknown PatternType: ${typeNum}`); 36324 } 36325 } 36326 throw new FormatError(`Unknown PatternName: ${patternName}`); 36327 } 36328 _parseVisibilityExpression(array, nestingCounter, currentResult) { 36329 const MAX_NESTING = 10; 36330 if (++nestingCounter > MAX_NESTING) { 36331 warn("Visibility expression is too deeply nested"); 36332 return; 36333 } 36334 const length = array.length; 36335 const operator = this.xref.fetchIfRef(array[0]); 36336 if (length < 2 || !(operator instanceof Name)) { 36337 warn("Invalid visibility expression"); 36338 return; 36339 } 36340 switch (operator.name) { 36341 case "And": 36342 case "Or": 36343 case "Not": 36344 currentResult.push(operator.name); 36345 break; 36346 default: 36347 warn(`Invalid operator ${operator.name} in visibility expression`); 36348 return; 36349 } 36350 for (let i = 1; i < length; i++) { 36351 const raw = array[i]; 36352 const object = this.xref.fetchIfRef(raw); 36353 if (Array.isArray(object)) { 36354 const nestedResult = []; 36355 currentResult.push(nestedResult); 36356 this._parseVisibilityExpression(object, nestingCounter, nestedResult); 36357 } else if (raw instanceof Ref) { 36358 currentResult.push(raw.toString()); 36359 } 36360 } 36361 } 36362 async parseMarkedContentProps(contentProperties, resources) { 36363 let optionalContent; 36364 if (contentProperties instanceof Name) { 36365 const properties = resources.get("Properties"); 36366 optionalContent = properties.get(contentProperties.name); 36367 } else if (contentProperties instanceof Dict) { 36368 optionalContent = contentProperties; 36369 } else { 36370 throw new FormatError("Optional content properties malformed."); 36371 } 36372 const optionalContentType = optionalContent.get("Type")?.name; 36373 if (optionalContentType === "OCG") { 36374 return { 36375 type: optionalContentType, 36376 id: optionalContent.objId 36377 }; 36378 } else if (optionalContentType === "OCMD") { 36379 const expression = optionalContent.get("VE"); 36380 if (Array.isArray(expression)) { 36381 const result = []; 36382 this._parseVisibilityExpression(expression, 0, result); 36383 if (result.length > 0) { 36384 return { 36385 type: "OCMD", 36386 expression: result 36387 }; 36388 } 36389 } 36390 const optionalContentGroups = optionalContent.get("OCGs"); 36391 if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) { 36392 const groupIds = []; 36393 if (Array.isArray(optionalContentGroups)) { 36394 for (const ocg of optionalContentGroups) { 36395 groupIds.push(ocg.toString()); 36396 } 36397 } else { 36398 groupIds.push(optionalContentGroups.objId); 36399 } 36400 return { 36401 type: optionalContentType, 36402 ids: groupIds, 36403 policy: optionalContent.get("P") instanceof Name ? optionalContent.get("P").name : null, 36404 expression: null 36405 }; 36406 } else if (optionalContentGroups instanceof Ref) { 36407 return { 36408 type: optionalContentType, 36409 id: optionalContentGroups.toString() 36410 }; 36411 } 36412 } 36413 return null; 36414 } 36415 getOperatorList({ 36416 stream, 36417 task, 36418 resources, 36419 operatorList, 36420 initialState = null, 36421 fallbackFontDict = null 36422 }) { 36423 resources ||= Dict.empty; 36424 initialState ||= new EvalState(); 36425 if (!operatorList) { 36426 throw new Error('getOperatorList: missing "operatorList" parameter'); 36427 } 36428 const self = this; 36429 const xref = this.xref; 36430 let parsingText = false;
vendor: 17,557 bytes, lines 36431-36989
36431 const localImageCache = new LocalImageCache(); 36432 const localColorSpaceCache = new LocalColorSpaceCache(); 36433 const localGStateCache = new LocalGStateCache(); 36434 const localTilingPatternCache = new LocalTilingPatternCache(); 36435 const localShadingPatternCache = new Map(); 36436 const xobjs = resources.get("XObject") || Dict.empty; 36437 const patterns = resources.get("Pattern") || Dict.empty; 36438 const stateManager = new StateManager(initialState); 36439 const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); 36440 const timeSlotManager = new TimeSlotManager(); 36441 function closePendingRestoreOPS(argument) { 36442 for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { 36443 operatorList.addOp(OPS.restore, []); 36444 } 36445 } 36446 return new Promise(function promiseBody(resolve, reject) { 36447 const next = function (promise) { 36448 Promise.all([promise, operatorList.ready]).then(function () { 36449 try { 36450 promiseBody(resolve, reject); 36451 } catch (ex) { 36452 reject(ex); 36453 } 36454 }, reject); 36455 }; 36456 task.ensureNotTerminated(); 36457 timeSlotManager.reset(); 36458 const operation = {}; 36459 let stop, i, ii, cs, name, isValidName; 36460 while (!(stop = timeSlotManager.check())) { 36461 operation.args = null; 36462 if (!preprocessor.read(operation)) { 36463 break; 36464 } 36465 let args = operation.args; 36466 let fn = operation.fn; 36467 switch (fn | 0) { 36468 case OPS.paintXObject: 36469 isValidName = args[0] instanceof Name; 36470 name = args[0].name; 36471 if (isValidName) { 36472 const localImage = localImageCache.getByName(name); 36473 if (localImage) { 36474 addLocallyCachedImageOps(operatorList, localImage); 36475 args = null; 36476 continue; 36477 } 36478 } 36479 next(new Promise(function (resolveXObject, rejectXObject) { 36480 if (!isValidName) { 36481 throw new FormatError("XObject must be referred to by name."); 36482 } 36483 let xobj = xobjs.getRaw(name); 36484 if (xobj instanceof Ref) { 36485 const localImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj); 36486 if (localImage) { 36487 addLocallyCachedImageOps(operatorList, localImage); 36488 resolveXObject(); 36489 return; 36490 } 36491 const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); 36492 if (globalImage) { 36493 operatorList.addDependency(globalImage.objId); 36494 operatorList.addImageOps(globalImage.fn, globalImage.args, globalImage.optionalContent, globalImage.hasMask); 36495 resolveXObject(); 36496 return; 36497 } 36498 xobj = xref.fetch(xobj); 36499 } 36500 if (!(xobj instanceof BaseStream)) { 36501 throw new FormatError("XObject should be a stream"); 36502 } 36503 const type = xobj.dict.get("Subtype"); 36504 if (!(type instanceof Name)) { 36505 throw new FormatError("XObject should have a Name subtype"); 36506 } 36507 if (type.name === "Form") { 36508 stateManager.save(); 36509 self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () { 36510 stateManager.restore(); 36511 resolveXObject(); 36512 }, rejectXObject); 36513 return; 36514 } else if (type.name === "Image") { 36515 self.buildPaintImageXObject({ 36516 resources, 36517 image: xobj, 36518 operatorList, 36519 cacheKey: name, 36520 localImageCache, 36521 localColorSpaceCache 36522 }).then(resolveXObject, rejectXObject); 36523 return; 36524 } else if (type.name === "PS") { 36525 info("Ignored XObject subtype PS"); 36526 } else { 36527 throw new FormatError(`Unhandled XObject subtype ${type.name}`); 36528 } 36529 resolveXObject(); 36530 }).catch(function (reason) { 36531 if (reason instanceof AbortException) { 36532 return; 36533 } 36534 if (self.options.ignoreErrors) { 36535 warn(`getOperatorList - ignoring XObject: "${reason}".`); 36536 return; 36537 } 36538 throw reason; 36539 })); 36540 return; 36541 case OPS.setFont: 36542 const fontSize = args[1]; 36543 next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) { 36544 operatorList.addDependency(loadedName); 36545 operatorList.addOp(OPS.setFont, [loadedName, fontSize]); 36546 })); 36547 return; 36548 case OPS.beginText: 36549 parsingText = true; 36550 break; 36551 case OPS.endText: 36552 parsingText = false; 36553 break; 36554 case OPS.endInlineImage: 36555 const cacheKey = args[0].cacheKey; 36556 if (cacheKey) { 36557 const localImage = localImageCache.getByName(cacheKey); 36558 if (localImage) { 36559 addLocallyCachedImageOps(operatorList, localImage); 36560 args = null; 36561 continue; 36562 } 36563 } 36564 next(self.buildPaintImageXObject({ 36565 resources, 36566 image: args[0], 36567 isInline: true, 36568 operatorList, 36569 cacheKey, 36570 localImageCache, 36571 localColorSpaceCache 36572 })); 36573 return; 36574 case OPS.showText: 36575 if (!stateManager.state.font) { 36576 self.ensureStateFont(stateManager.state); 36577 continue; 36578 } 36579 args[0] = self.handleText(args[0], stateManager.state); 36580 break; 36581 case OPS.showSpacedText: 36582 if (!stateManager.state.font) { 36583 self.ensureStateFont(stateManager.state); 36584 continue; 36585 } 36586 const combinedGlyphs = [], 36587 state = stateManager.state; 36588 for (const arrItem of args[0]) { 36589 if (typeof arrItem === "string") { 36590 combinedGlyphs.push(...self.handleText(arrItem, state)); 36591 } else if (typeof arrItem === "number") { 36592 combinedGlyphs.push(arrItem); 36593 } 36594 } 36595 args[0] = combinedGlyphs; 36596 fn = OPS.showText; 36597 break; 36598 case OPS.nextLineShowText: 36599 if (!stateManager.state.font) { 36600 self.ensureStateFont(stateManager.state); 36601 continue; 36602 } 36603 operatorList.addOp(OPS.nextLine); 36604 args[0] = self.handleText(args[0], stateManager.state); 36605 fn = OPS.showText; 36606 break; 36607 case OPS.nextLineSetSpacingShowText: 36608 if (!stateManager.state.font) { 36609 self.ensureStateFont(stateManager.state); 36610 continue; 36611 } 36612 operatorList.addOp(OPS.nextLine); 36613 operatorList.addOp(OPS.setWordSpacing, [args.shift()]); 36614 operatorList.addOp(OPS.setCharSpacing, [args.shift()]); 36615 args[0] = self.handleText(args[0], stateManager.state); 36616 fn = OPS.showText; 36617 break; 36618 case OPS.setTextRenderingMode: 36619 stateManager.state.textRenderingMode = args[0]; 36620 break; 36621 case OPS.setFillColorSpace: 36622 { 36623 const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); 36624 if (cachedColorSpace) { 36625 stateManager.state.fillColorSpace = cachedColorSpace; 36626 continue; 36627 } 36628 next(self.parseColorSpace({ 36629 cs: args[0], 36630 resources, 36631 localColorSpaceCache 36632 }).then(function (colorSpace) { 36633 stateManager.state.fillColorSpace = colorSpace || ColorSpace.singletons.gray; 36634 })); 36635 return; 36636 } 36637 case OPS.setStrokeColorSpace: 36638 { 36639 const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); 36640 if (cachedColorSpace) { 36641 stateManager.state.strokeColorSpace = cachedColorSpace; 36642 continue; 36643 } 36644 next(self.parseColorSpace({ 36645 cs: args[0], 36646 resources, 36647 localColorSpaceCache 36648 }).then(function (colorSpace) { 36649 stateManager.state.strokeColorSpace = colorSpace || ColorSpace.singletons.gray; 36650 })); 36651 return; 36652 } 36653 case OPS.setFillColor: 36654 cs = stateManager.state.fillColorSpace; 36655 args = cs.getRgb(args, 0); 36656 fn = OPS.setFillRGBColor; 36657 break; 36658 case OPS.setStrokeColor: 36659 cs = stateManager.state.strokeColorSpace; 36660 args = cs.getRgb(args, 0); 36661 fn = OPS.setStrokeRGBColor; 36662 break; 36663 case OPS.setFillGray: 36664 stateManager.state.fillColorSpace = ColorSpace.singletons.gray; 36665 args = ColorSpace.singletons.gray.getRgb(args, 0); 36666 fn = OPS.setFillRGBColor; 36667 break; 36668 case OPS.setStrokeGray: 36669 stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; 36670 args = ColorSpace.singletons.gray.getRgb(args, 0); 36671 fn = OPS.setStrokeRGBColor; 36672 break; 36673 case OPS.setFillCMYKColor: 36674 stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; 36675 args = ColorSpace.singletons.cmyk.getRgb(args, 0); 36676 fn = OPS.setFillRGBColor; 36677 break; 36678 case OPS.setStrokeCMYKColor: 36679 stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; 36680 args = ColorSpace.singletons.cmyk.getRgb(args, 0); 36681 fn = OPS.setStrokeRGBColor; 36682 break; 36683 case OPS.setFillRGBColor: 36684 stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; 36685 args = ColorSpace.singletons.rgb.getRgb(args, 0); 36686 break; 36687 case OPS.setStrokeRGBColor: 36688 stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; 36689 args = ColorSpace.singletons.rgb.getRgb(args, 0); 36690 break; 36691 case OPS.setFillColorN: 36692 cs = stateManager.state.patternFillColorSpace; 36693 if (!cs) { 36694 if (isNumberArray(args, null)) { 36695 args = ColorSpace.singletons.gray.getRgb(args, 0); 36696 fn = OPS.setFillRGBColor; 36697 break; 36698 } 36699 args = []; 36700 fn = OPS.setFillTransparent; 36701 break; 36702 } 36703 if (cs.name === "Pattern") { 36704 next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); 36705 return; 36706 } 36707 args = cs.getRgb(args, 0); 36708 fn = OPS.setFillRGBColor; 36709 break; 36710 case OPS.setStrokeColorN: 36711 cs = stateManager.state.patternStrokeColorSpace; 36712 if (!cs) { 36713 if (isNumberArray(args, null)) { 36714 args = ColorSpace.singletons.gray.getRgb(args, 0); 36715 fn = OPS.setStrokeRGBColor; 36716 break; 36717 } 36718 args = []; 36719 fn = OPS.setStrokeTransparent; 36720 break; 36721 } 36722 if (cs.name === "Pattern") { 36723 next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); 36724 return; 36725 } 36726 args = cs.getRgb(args, 0); 36727 fn = OPS.setStrokeRGBColor; 36728 break; 36729 case OPS.shadingFill: 36730 let shading; 36731 try { 36732 const shadingRes = resources.get("Shading"); 36733 if (!shadingRes) { 36734 throw new FormatError("No shading resource found"); 36735 } 36736 shading = shadingRes.get(args[0].name); 36737 if (!shading) { 36738 throw new FormatError("No shading object found"); 36739 } 36740 } catch (reason) { 36741 if (reason instanceof AbortException) { 36742 continue; 36743 } 36744 if (self.options.ignoreErrors) { 36745 warn(`getOperatorList - ignoring Shading: "${reason}".`); 36746 continue; 36747 } 36748 throw reason; 36749 } 36750 const patternId = self.parseShading({ 36751 shading, 36752 resources, 36753 localColorSpaceCache, 36754 localShadingPatternCache 36755 }); 36756 if (!patternId) { 36757 continue; 36758 } 36759 args = [patternId]; 36760 fn = OPS.shadingFill; 36761 break; 36762 case OPS.setGState: 36763 isValidName = args[0] instanceof Name; 36764 name = args[0].name; 36765 if (isValidName) { 36766 const localGStateObj = localGStateCache.getByName(name); 36767 if (localGStateObj) { 36768 if (localGStateObj.length > 0) { 36769 operatorList.addOp(OPS.setGState, [localGStateObj]); 36770 } 36771 args = null; 36772 continue; 36773 } 36774 } 36775 next(new Promise(function (resolveGState, rejectGState) { 36776 if (!isValidName) { 36777 throw new FormatError("GState must be referred to by name."); 36778 } 36779 const extGState = resources.get("ExtGState"); 36780 if (!(extGState instanceof Dict)) { 36781 throw new FormatError("ExtGState should be a dictionary."); 36782 } 36783 const gState = extGState.get(name); 36784 if (!(gState instanceof Dict)) { 36785 throw new FormatError("GState should be a dictionary."); 36786 } 36787 self.setGState({ 36788 resources, 36789 gState, 36790 operatorList, 36791 cacheKey: name, 36792 task, 36793 stateManager, 36794 localGStateCache, 36795 localColorSpaceCache 36796 }).then(resolveGState, rejectGState); 36797 }).catch(function (reason) { 36798 if (reason instanceof AbortException) { 36799 return; 36800 } 36801 if (self.options.ignoreErrors) { 36802 warn(`getOperatorList - ignoring ExtGState: "${reason}".`); 36803 return; 36804 } 36805 throw reason; 36806 })); 36807 return; 36808 case OPS.moveTo: 36809 case OPS.lineTo: 36810 case OPS.curveTo: 36811 case OPS.curveTo2: 36812 case OPS.curveTo3: 36813 case OPS.closePath: 36814 case OPS.rectangle: 36815 self.buildPath(operatorList, fn, args, parsingText); 36816 continue; 36817 case OPS.markPoint: 36818 case OPS.markPointProps: 36819 case OPS.beginCompat: 36820 case OPS.endCompat: 36821 continue; 36822 case OPS.beginMarkedContentProps: 36823 if (!(args[0] instanceof Name)) { 36824 warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`); 36825 operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); 36826 continue; 36827 } 36828 if (args[0].name === "OC") { 36829 next(self.parseMarkedContentProps(args[1], resources).then(data => { 36830 operatorList.addOp(OPS.beginMarkedContentProps, ["OC", data]); 36831 }).catch(reason => { 36832 if (reason instanceof AbortException) { 36833 return; 36834 } 36835 if (self.options.ignoreErrors) { 36836 warn(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`); 36837 operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); 36838 return; 36839 } 36840 throw reason; 36841 })); 36842 return; 36843 } 36844 args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null]; 36845 break; 36846 case OPS.beginMarkedContent: 36847 case OPS.endMarkedContent: 36848 default: 36849 if (args !== null) { 36850 for (i = 0, ii = args.length; i < ii; i++) { 36851 if (args[i] instanceof Dict) { 36852 break; 36853 } 36854 } 36855 if (i < ii) { 36856 warn("getOperatorList - ignoring operator: " + fn); 36857 continue; 36858 } 36859 } 36860 } 36861 operatorList.addOp(fn, args); 36862 } 36863 if (stop) { 36864 next(deferred); 36865 return; 36866 } 36867 closePendingRestoreOPS(); 36868 resolve(); 36869 }).catch(reason => { 36870 if (reason instanceof AbortException) { 36871 return; 36872 } 36873 if (this.options.ignoreErrors) { 36874 warn(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`); 36875 closePendingRestoreOPS(); 36876 return; 36877 } 36878 throw reason; 36879 }); 36880 } 36881 getTextContent({ 36882 stream, 36883 task, 36884 resources, 36885 stateManager = null, 36886 includeMarkedContent = false, 36887 sink, 36888 seenStyles = new Set(), 36889 viewBox, 36890 lang = null, 36891 markedContentData = null, 36892 disableNormalization = false, 36893 keepWhiteSpace = false 36894 }) { 36895 resources ||= Dict.empty; 36896 stateManager ||= new StateManager(new TextState()); 36897 if (includeMarkedContent) { 36898 markedContentData ||= { 36899 level: 0 36900 }; 36901 } 36902 const textContent = { 36903 items: [], 36904 styles: Object.create(null), 36905 lang 36906 }; 36907 const textContentItem = { 36908 initialized: false, 36909 str: [], 36910 totalWidth: 0, 36911 totalHeight: 0, 36912 width: 0, 36913 height: 0, 36914 vertical: false, 36915 prevTransform: null, 36916 textAdvanceScale: 0, 36917 spaceInFlowMin: 0, 36918 spaceInFlowMax: 0, 36919 trackingSpaceMin: Infinity, 36920 negativeSpaceMax: -Infinity, 36921 notASpace: -Infinity, 36922 transform: null, 36923 fontName: null, 36924 hasEOL: false 36925 }; 36926 const twoLastChars = [" ", " "]; 36927 let twoLastCharsPos = 0; 36928 function saveLastChar(char) { 36929 const nextPos = (twoLastCharsPos + 1) % 2; 36930 const ret = twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " "; 36931 twoLastChars[twoLastCharsPos] = char; 36932 twoLastCharsPos = nextPos; 36933 return !keepWhiteSpace && ret; 36934 } 36935 function shouldAddWhitepsace() { 36936 return !keepWhiteSpace && twoLastChars[twoLastCharsPos] !== " " && twoLastChars[(twoLastCharsPos + 1) % 2] === " "; 36937 } 36938 function resetLastChars() { 36939 twoLastChars[0] = twoLastChars[1] = " "; 36940 twoLastCharsPos = 0; 36941 } 36942 const TRACKING_SPACE_FACTOR = 0.102; 36943 const NOT_A_SPACE_FACTOR = 0.03; 36944 const NEGATIVE_SPACE_FACTOR = -0.2; 36945 const SPACE_IN_FLOW_MIN_FACTOR = 0.102; 36946 const SPACE_IN_FLOW_MAX_FACTOR = 0.6; 36947 const VERTICAL_SHIFT_RATIO = 0.25; 36948 const self = this; 36949 const xref = this.xref; 36950 const showSpacedTextBuffer = []; 36951 let xobjs = null; 36952 const emptyXObjectCache = new LocalImageCache(); 36953 const emptyGStateCache = new LocalGStateCache(); 36954 const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); 36955 let textState; 36956 function pushWhitespace({ 36957 width = 0, 36958 height = 0, 36959 transform = textContentItem.prevTransform, 36960 fontName = textContentItem.fontName 36961 }) { 36962 textContent.items.push({ 36963 str: " ", 36964 dir: "ltr", 36965 width, 36966 height, 36967 transform, 36968 fontName, 36969 hasEOL: false 36970 }); 36971 } 36972 function getCurrentTextTransform() { 36973 const font = textState.font; 36974 const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; 36975 if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)) { 36976 const glyphHeight = font.bbox[3] - font.bbox[1]; 36977 if (glyphHeight > 0) { 36978 tsm[3] *= glyphHeight * textState.fontMatrix[3]; 36979 } 36980 } 36981 return Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm)); 36982 } 36983 function ensureTextContentItem() { 36984 if (textContentItem.initialized) { 36985 return textContentItem; 36986 } 36987 const { 36988 font, 36989 loadedName
vendor: 1,032 bytes, lines 36990-37015
36990 } = textState; 36991 if (!seenStyles.has(loadedName)) { 36992 seenStyles.add(loadedName); 36993 textContent.styles[loadedName] = { 36994 fontFamily: font.fallbackName, 36995 ascent: font.ascent, 36996 descent: font.descent, 36997 vertical: font.vertical 36998 }; 36999 if (self.options.fontExtraProperties && font.systemFontInfo) { 37000 const style = textContent.styles[loadedName]; 37001 style.fontSubstitution = font.systemFontInfo.css; 37002 style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName; 37003 } 37004 } 37005 textContentItem.fontName = loadedName; 37006 const trm = textContentItem.transform = getCurrentTextTransform(); 37007 if (!font.vertical) { 37008 textContentItem.width = textContentItem.totalWidth = 0; 37009 textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]); 37010 textContentItem.vertical = false; 37011 } else { 37012 textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]); 37013 textContentItem.height = textContentItem.totalHeight = 0; 37014 textContentItem.vertical = true; 37015 }
vendor: 23,612 bytes, lines 37016-37764
37016 const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); 37017 const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); 37018 textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; 37019 const { 37020 fontSize 37021 } = textState; 37022 textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR; 37023 textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR; 37024 textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR; 37025 textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR; 37026 textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR; 37027 textContentItem.hasEOL = false; 37028 textContentItem.initialized = true; 37029 return textContentItem; 37030 } 37031 function updateAdvanceScale() { 37032 if (!textContentItem.initialized) { 37033 return; 37034 } 37035 const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); 37036 const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); 37037 const scaleFactor = scaleCtmX * scaleLineX; 37038 if (scaleFactor === textContentItem.textAdvanceScale) { 37039 return; 37040 } 37041 if (!textContentItem.vertical) { 37042 textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; 37043 textContentItem.width = 0; 37044 } else { 37045 textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; 37046 textContentItem.height = 0; 37047 } 37048 textContentItem.textAdvanceScale = scaleFactor; 37049 } 37050 function runBidiTransform(textChunk) { 37051 let text = textChunk.str.join(""); 37052 if (!disableNormalization) { 37053 text = normalizeUnicode(text); 37054 } 37055 const bidiResult = bidi(text, -1, textChunk.vertical); 37056 return { 37057 str: bidiResult.str, 37058 dir: bidiResult.dir, 37059 width: Math.abs(textChunk.totalWidth), 37060 height: Math.abs(textChunk.totalHeight), 37061 transform: textChunk.transform, 37062 fontName: textChunk.fontName, 37063 hasEOL: textChunk.hasEOL 37064 }; 37065 } 37066 async function handleSetFont(fontName, fontRef) { 37067 const translated = await self.loadFont(fontName, fontRef, resources); 37068 if (translated.font.isType3Font) { 37069 try { 37070 await translated.loadType3Data(self, resources, task); 37071 } catch {} 37072 } 37073 textState.loadedName = translated.loadedName; 37074 textState.font = translated.font; 37075 textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; 37076 } 37077 function applyInverseRotation(x, y, matrix) { 37078 const scale = Math.hypot(matrix[0], matrix[1]); 37079 return [(matrix[0] * x + matrix[1] * y) / scale, (matrix[2] * x + matrix[3] * y) / scale]; 37080 } 37081 function compareWithLastPosition(glyphWidth) { 37082 const currentTransform = getCurrentTextTransform(); 37083 let posX = currentTransform[4]; 37084 let posY = currentTransform[5]; 37085 if (textState.font?.vertical) { 37086 if (posX < viewBox[0] || posX > viewBox[2] || posY + glyphWidth < viewBox[1] || posY > viewBox[3]) { 37087 return false; 37088 } 37089 } else if (posX + glyphWidth < viewBox[0] || posX > viewBox[2] || posY < viewBox[1] || posY > viewBox[3]) { 37090 return false; 37091 } 37092 if (!textState.font || !textContentItem.prevTransform) { 37093 return true; 37094 } 37095 let lastPosX = textContentItem.prevTransform[4]; 37096 let lastPosY = textContentItem.prevTransform[5]; 37097 if (lastPosX === posX && lastPosY === posY) { 37098 return true; 37099 } 37100 let rotate = -1; 37101 if (currentTransform[0] && currentTransform[1] === 0 && currentTransform[2] === 0) { 37102 rotate = currentTransform[0] > 0 ? 0 : 180; 37103 } else if (currentTransform[1] && currentTransform[0] === 0 && currentTransform[3] === 0) { 37104 rotate = currentTransform[1] > 0 ? 90 : 270; 37105 } 37106 switch (rotate) { 37107 case 0: 37108 break; 37109 case 90: 37110 [posX, posY] = [posY, posX]; 37111 [lastPosX, lastPosY] = [lastPosY, lastPosX]; 37112 break; 37113 case 180: 37114 [posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY]; 37115 break; 37116 case 270: 37117 [posX, posY] = [-posY, -posX]; 37118 [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; 37119 break; 37120 default: 37121 [posX, posY] = applyInverseRotation(posX, posY, currentTransform); 37122 [lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform); 37123 } 37124 if (textState.font.vertical) { 37125 const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; 37126 const advanceX = posX - lastPosX; 37127 const textOrientation = Math.sign(textContentItem.height); 37128 if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { 37129 if (Math.abs(advanceX) > 0.5 * textContentItem.width) { 37130 appendEOL(); 37131 return true; 37132 } 37133 resetLastChars(); 37134 flushTextContentItem(); 37135 return true; 37136 } 37137 if (Math.abs(advanceX) > textContentItem.width) { 37138 appendEOL(); 37139 return true; 37140 } 37141 if (advanceY <= textOrientation * textContentItem.notASpace) { 37142 resetLastChars(); 37143 } 37144 if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { 37145 if (shouldAddWhitepsace()) { 37146 resetLastChars(); 37147 flushTextContentItem(); 37148 pushWhitespace({ 37149 height: Math.abs(advanceY) 37150 }); 37151 } else { 37152 textContentItem.height += advanceY; 37153 } 37154 } else if (!addFakeSpaces(advanceY, textContentItem.prevTransform, textOrientation)) { 37155 if (textContentItem.str.length === 0) { 37156 resetLastChars(); 37157 pushWhitespace({ 37158 height: Math.abs(advanceY) 37159 }); 37160 } else { 37161 textContentItem.height += advanceY; 37162 } 37163 } 37164 if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) { 37165 flushTextContentItem(); 37166 } 37167 return true; 37168 } 37169 const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; 37170 const advanceY = posY - lastPosY; 37171 const textOrientation = Math.sign(textContentItem.width); 37172 if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { 37173 if (Math.abs(advanceY) > 0.5 * textContentItem.height) { 37174 appendEOL(); 37175 return true; 37176 } 37177 resetLastChars(); 37178 flushTextContentItem(); 37179 return true; 37180 } 37181 if (Math.abs(advanceY) > textContentItem.height) { 37182 appendEOL(); 37183 return true; 37184 } 37185 if (advanceX <= textOrientation * textContentItem.notASpace) { 37186 resetLastChars(); 37187 } 37188 if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { 37189 if (shouldAddWhitepsace()) { 37190 resetLastChars(); 37191 flushTextContentItem(); 37192 pushWhitespace({ 37193 width: Math.abs(advanceX) 37194 }); 37195 } else { 37196 textContentItem.width += advanceX; 37197 } 37198 } else if (!addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)) { 37199 if (textContentItem.str.length === 0) { 37200 resetLastChars(); 37201 pushWhitespace({ 37202 width: Math.abs(advanceX) 37203 }); 37204 } else { 37205 textContentItem.width += advanceX; 37206 } 37207 } 37208 if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) { 37209 flushTextContentItem(); 37210 } 37211 return true; 37212 } 37213 function buildTextContentItem({ 37214 chars, 37215 extraSpacing 37216 }) { 37217 const font = textState.font; 37218 if (!chars) { 37219 const charSpacing = textState.charSpacing + extraSpacing; 37220 if (charSpacing) { 37221 if (!font.vertical) { 37222 textState.translateTextMatrix(charSpacing * textState.textHScale, 0); 37223 } else { 37224 textState.translateTextMatrix(0, -charSpacing); 37225 } 37226 } 37227 if (keepWhiteSpace) { 37228 compareWithLastPosition(0); 37229 } 37230 return; 37231 } 37232 const glyphs = font.charsToGlyphs(chars); 37233 const scale = textState.fontMatrix[0] * textState.fontSize; 37234 for (let i = 0, ii = glyphs.length; i < ii; i++) { 37235 const glyph = glyphs[i]; 37236 const { 37237 category 37238 } = glyph; 37239 if (category.isInvisibleFormatMark) { 37240 continue; 37241 } 37242 let charSpacing = textState.charSpacing + (i + 1 === ii ? extraSpacing : 0); 37243 let glyphWidth = glyph.width; 37244 if (font.vertical) { 37245 glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth; 37246 } 37247 let scaledDim = glyphWidth * scale; 37248 if (!keepWhiteSpace && category.isWhitespace) { 37249 if (!font.vertical) { 37250 charSpacing += scaledDim + textState.wordSpacing; 37251 textState.translateTextMatrix(charSpacing * textState.textHScale, 0); 37252 } else { 37253 charSpacing += -scaledDim + textState.wordSpacing; 37254 textState.translateTextMatrix(0, -charSpacing); 37255 } 37256 saveLastChar(" "); 37257 continue; 37258 } 37259 if (!category.isZeroWidthDiacritic && !compareWithLastPosition(scaledDim)) { 37260 if (!font.vertical) { 37261 textState.translateTextMatrix(scaledDim * textState.textHScale, 0); 37262 } else { 37263 textState.translateTextMatrix(0, scaledDim); 37264 } 37265 continue; 37266 } 37267 const textChunk = ensureTextContentItem(); 37268 if (category.isZeroWidthDiacritic) { 37269 scaledDim = 0; 37270 } 37271 if (!font.vertical) { 37272 scaledDim *= textState.textHScale; 37273 textState.translateTextMatrix(scaledDim, 0); 37274 textChunk.width += scaledDim; 37275 } else { 37276 textState.translateTextMatrix(0, scaledDim); 37277 scaledDim = Math.abs(scaledDim); 37278 textChunk.height += scaledDim; 37279 } 37280 if (scaledDim) { 37281 textChunk.prevTransform = getCurrentTextTransform(); 37282 } 37283 const glyphUnicode = glyph.unicode; 37284 if (saveLastChar(glyphUnicode)) { 37285 textChunk.str.push(" "); 37286 } 37287 textChunk.str.push(glyphUnicode); 37288 if (charSpacing) { 37289 if (!font.vertical) { 37290 textState.translateTextMatrix(charSpacing * textState.textHScale, 0); 37291 } else { 37292 textState.translateTextMatrix(0, -charSpacing); 37293 } 37294 } 37295 } 37296 } 37297 function appendEOL() { 37298 resetLastChars(); 37299 if (textContentItem.initialized) { 37300 textContentItem.hasEOL = true; 37301 flushTextContentItem(); 37302 } else { 37303 textContent.items.push({ 37304 str: "", 37305 dir: "ltr", 37306 width: 0, 37307 height: 0, 37308 transform: getCurrentTextTransform(), 37309 fontName: textState.loadedName, 37310 hasEOL: true 37311 }); 37312 } 37313 } 37314 function addFakeSpaces(width, transf, textOrientation) { 37315 if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) { 37316 if (textContentItem.initialized) { 37317 resetLastChars(); 37318 textContentItem.str.push(" "); 37319 } 37320 return false; 37321 } 37322 const fontName = textContentItem.fontName; 37323 let height = 0; 37324 if (textContentItem.vertical) { 37325 height = width; 37326 width = 0; 37327 } 37328 flushTextContentItem(); 37329 resetLastChars(); 37330 pushWhitespace({ 37331 width: Math.abs(width), 37332 height: Math.abs(height), 37333 transform: transf || getCurrentTextTransform(), 37334 fontName 37335 }); 37336 return true; 37337 } 37338 function flushTextContentItem() { 37339 if (!textContentItem.initialized || !textContentItem.str) { 37340 return; 37341 } 37342 if (!textContentItem.vertical) { 37343 textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; 37344 } else { 37345 textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; 37346 } 37347 textContent.items.push(runBidiTransform(textContentItem)); 37348 textContentItem.initialized = false; 37349 textContentItem.str.length = 0; 37350 } 37351 function enqueueChunk(batch = false) { 37352 const length = textContent.items.length; 37353 if (length === 0) { 37354 return; 37355 } 37356 if (batch && length < TEXT_CHUNK_BATCH_SIZE) { 37357 return; 37358 } 37359 sink.enqueue(textContent, length); 37360 textContent.items = []; 37361 textContent.styles = Object.create(null); 37362 } 37363 const timeSlotManager = new TimeSlotManager(); 37364 return new Promise(function promiseBody(resolve, reject) { 37365 const next = function (promise) { 37366 enqueueChunk(true); 37367 Promise.all([promise, sink.ready]).then(function () { 37368 try { 37369 promiseBody(resolve, reject); 37370 } catch (ex) { 37371 reject(ex); 37372 } 37373 }, reject); 37374 }; 37375 task.ensureNotTerminated(); 37376 timeSlotManager.reset(); 37377 const operation = {}; 37378 let stop, 37379 name, 37380 isValidName, 37381 args = []; 37382 while (!(stop = timeSlotManager.check())) { 37383 args.length = 0; 37384 operation.args = args; 37385 if (!preprocessor.read(operation)) { 37386 break; 37387 } 37388 const previousState = textState; 37389 textState = stateManager.state; 37390 const fn = operation.fn; 37391 args = operation.args; 37392 switch (fn | 0) { 37393 case OPS.setFont: 37394 const fontNameArg = args[0].name, 37395 fontSizeArg = args[1]; 37396 if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { 37397 break; 37398 } 37399 flushTextContentItem(); 37400 textState.fontName = fontNameArg; 37401 textState.fontSize = fontSizeArg; 37402 next(handleSetFont(fontNameArg, null)); 37403 return; 37404 case OPS.setTextRise: 37405 textState.textRise = args[0]; 37406 break; 37407 case OPS.setHScale: 37408 textState.textHScale = args[0] / 100; 37409 break; 37410 case OPS.setLeading: 37411 textState.leading = args[0]; 37412 break; 37413 case OPS.moveText: 37414 textState.translateTextLineMatrix(args[0], args[1]); 37415 textState.textMatrix = textState.textLineMatrix.slice(); 37416 break; 37417 case OPS.setLeadingMoveText: 37418 textState.leading = -args[1]; 37419 textState.translateTextLineMatrix(args[0], args[1]); 37420 textState.textMatrix = textState.textLineMatrix.slice(); 37421 break; 37422 case OPS.nextLine: 37423 textState.carriageReturn(); 37424 break; 37425 case OPS.setTextMatrix: 37426 textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); 37427 textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); 37428 updateAdvanceScale(); 37429 break; 37430 case OPS.setCharSpacing: 37431 textState.charSpacing = args[0]; 37432 break; 37433 case OPS.setWordSpacing: 37434 textState.wordSpacing = args[0]; 37435 break; 37436 case OPS.beginText: 37437 textState.textMatrix = IDENTITY_MATRIX.slice(); 37438 textState.textLineMatrix = IDENTITY_MATRIX.slice(); 37439 break; 37440 case OPS.showSpacedText: 37441 if (!stateManager.state.font) { 37442 self.ensureStateFont(stateManager.state); 37443 continue; 37444 } 37445 const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000; 37446 const elements = args[0]; 37447 for (let i = 0, ii = elements.length; i < ii; i++) { 37448 const item = elements[i]; 37449 if (typeof item === "string") { 37450 showSpacedTextBuffer.push(item); 37451 } else if (typeof item === "number" && item !== 0) { 37452 const str = showSpacedTextBuffer.join(""); 37453 showSpacedTextBuffer.length = 0; 37454 buildTextContentItem({ 37455 chars: str, 37456 extraSpacing: item * spaceFactor 37457 }); 37458 } 37459 } 37460 if (showSpacedTextBuffer.length > 0) { 37461 const str = showSpacedTextBuffer.join(""); 37462 showSpacedTextBuffer.length = 0; 37463 buildTextContentItem({ 37464 chars: str, 37465 extraSpacing: 0 37466 }); 37467 } 37468 break; 37469 case OPS.showText: 37470 if (!stateManager.state.font) { 37471 self.ensureStateFont(stateManager.state); 37472 continue; 37473 } 37474 buildTextContentItem({ 37475 chars: args[0], 37476 extraSpacing: 0 37477 }); 37478 break; 37479 case OPS.nextLineShowText: 37480 if (!stateManager.state.font) { 37481 self.ensureStateFont(stateManager.state); 37482 continue; 37483 } 37484 textState.carriageReturn(); 37485 buildTextContentItem({ 37486 chars: args[0], 37487 extraSpacing: 0 37488 }); 37489 break; 37490 case OPS.nextLineSetSpacingShowText: 37491 if (!stateManager.state.font) { 37492 self.ensureStateFont(stateManager.state); 37493 continue; 37494 } 37495 textState.wordSpacing = args[0]; 37496 textState.charSpacing = args[1]; 37497 textState.carriageReturn(); 37498 buildTextContentItem({ 37499 chars: args[2], 37500 extraSpacing: 0 37501 }); 37502 break; 37503 case OPS.paintXObject: 37504 flushTextContentItem(); 37505 xobjs ??= resources.get("XObject") || Dict.empty; 37506 isValidName = args[0] instanceof Name; 37507 name = args[0].name; 37508 if (isValidName && emptyXObjectCache.getByName(name)) { 37509 break; 37510 } 37511 next(new Promise(function (resolveXObject, rejectXObject) { 37512 if (!isValidName) { 37513 throw new FormatError("XObject must be referred to by name."); 37514 } 37515 let xobj = xobjs.getRaw(name); 37516 if (xobj instanceof Ref) { 37517 if (emptyXObjectCache.getByRef(xobj)) { 37518 resolveXObject(); 37519 return; 37520 } 37521 const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); 37522 if (globalImage) { 37523 resolveXObject(); 37524 return; 37525 } 37526 xobj = xref.fetch(xobj); 37527 } 37528 if (!(xobj instanceof BaseStream)) { 37529 throw new FormatError("XObject should be a stream"); 37530 } 37531 const type = xobj.dict.get("Subtype"); 37532 if (!(type instanceof Name)) { 37533 throw new FormatError("XObject should have a Name subtype"); 37534 } 37535 if (type.name !== "Form") { 37536 emptyXObjectCache.set(name, xobj.dict.objId, true); 37537 resolveXObject(); 37538 return; 37539 } 37540 const currentState = stateManager.state.clone(); 37541 const xObjStateManager = new StateManager(currentState); 37542 const matrix = lookupMatrix(xobj.dict.getArray("Matrix"), null); 37543 if (matrix) { 37544 xObjStateManager.transform(matrix); 37545 } 37546 enqueueChunk(); 37547 const sinkWrapper = { 37548 enqueueInvoked: false, 37549 enqueue(chunk, size) { 37550 this.enqueueInvoked = true; 37551 sink.enqueue(chunk, size); 37552 }, 37553 get desiredSize() { 37554 return sink.desiredSize; 37555 }, 37556 get ready() { 37557 return sink.ready; 37558 } 37559 }; 37560 self.getTextContent({ 37561 stream: xobj, 37562 task, 37563 resources: xobj.dict.get("Resources") || resources, 37564 stateManager: xObjStateManager, 37565 includeMarkedContent, 37566 sink: sinkWrapper, 37567 seenStyles, 37568 viewBox, 37569 lang, 37570 markedContentData, 37571 disableNormalization, 37572 keepWhiteSpace 37573 }).then(function () { 37574 if (!sinkWrapper.enqueueInvoked) { 37575 emptyXObjectCache.set(name, xobj.dict.objId, true); 37576 } 37577 resolveXObject(); 37578 }, rejectXObject); 37579 }).catch(function (reason) { 37580 if (reason instanceof AbortException) { 37581 return; 37582 } 37583 if (self.options.ignoreErrors) { 37584 warn(`getTextContent - ignoring XObject: "${reason}".`); 37585 return; 37586 } 37587 throw reason; 37588 })); 37589 return; 37590 case OPS.setGState: 37591 isValidName = args[0] instanceof Name; 37592 name = args[0].name; 37593 if (isValidName && emptyGStateCache.getByName(name)) { 37594 break; 37595 } 37596 next(new Promise(function (resolveGState, rejectGState) { 37597 if (!isValidName) { 37598 throw new FormatError("GState must be referred to by name."); 37599 } 37600 const extGState = resources.get("ExtGState"); 37601 if (!(extGState instanceof Dict)) { 37602 throw new FormatError("ExtGState should be a dictionary."); 37603 } 37604 const gState = extGState.get(name); 37605 if (!(gState instanceof Dict)) { 37606 throw new FormatError("GState should be a dictionary."); 37607 } 37608 const gStateFont = gState.get("Font"); 37609 if (!gStateFont) { 37610 emptyGStateCache.set(name, gState.objId, true); 37611 resolveGState(); 37612 return; 37613 } 37614 flushTextContentItem(); 37615 textState.fontName = null; 37616 textState.fontSize = gStateFont[1]; 37617 handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState); 37618 }).catch(function (reason) { 37619 if (reason instanceof AbortException) { 37620 return; 37621 } 37622 if (self.options.ignoreErrors) { 37623 warn(`getTextContent - ignoring ExtGState: "${reason}".`); 37624 return; 37625 } 37626 throw reason; 37627 })); 37628 return; 37629 case OPS.beginMarkedContent: 37630 flushTextContentItem(); 37631 if (includeMarkedContent) { 37632 markedContentData.level++; 37633 textContent.items.push({ 37634 type: "beginMarkedContent", 37635 tag: args[0] instanceof Name ? args[0].name : null 37636 }); 37637 } 37638 break; 37639 case OPS.beginMarkedContentProps: 37640 flushTextContentItem(); 37641 if (includeMarkedContent) { 37642 markedContentData.level++; 37643 let mcid = null; 37644 if (args[1] instanceof Dict) { 37645 mcid = args[1].get("MCID"); 37646 } 37647 textContent.items.push({ 37648 type: "beginMarkedContentProps", 37649 id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null, 37650 tag: args[0] instanceof Name ? args[0].name : null 37651 }); 37652 } 37653 break; 37654 case OPS.endMarkedContent: 37655 flushTextContentItem(); 37656 if (includeMarkedContent) { 37657 if (markedContentData.level === 0) { 37658 break; 37659 } 37660 markedContentData.level--; 37661 textContent.items.push({ 37662 type: "endMarkedContent" 37663 }); 37664 } 37665 break; 37666 case OPS.restore: 37667 if (previousState && (previousState.font !== textState.font || previousState.fontSize !== textState.fontSize || previousState.fontName !== textState.fontName)) { 37668 flushTextContentItem(); 37669 } 37670 break; 37671 } 37672 if (textContent.items.length >= sink.desiredSize) { 37673 stop = true; 37674 break; 37675 } 37676 } 37677 if (stop) { 37678 next(deferred); 37679 return; 37680 } 37681 flushTextContentItem(); 37682 enqueueChunk(); 37683 resolve(); 37684 }).catch(reason => { 37685 if (reason instanceof AbortException) { 37686 return; 37687 } 37688 if (this.options.ignoreErrors) { 37689 warn(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`); 37690 flushTextContentItem(); 37691 enqueueChunk(); 37692 return; 37693 } 37694 throw reason; 37695 }); 37696 } 37697 async extractDataStructures(dict, properties) { 37698 const xref = this.xref; 37699 let cidToGidBytes; 37700 const toUnicodePromise = this.readToUnicode(properties.toUnicode); 37701 if (properties.composite) { 37702 const cidSystemInfo = dict.get("CIDSystemInfo"); 37703 if (cidSystemInfo instanceof Dict) { 37704 properties.cidSystemInfo = { 37705 registry: stringToPDFString(cidSystemInfo.get("Registry")), 37706 ordering: stringToPDFString(cidSystemInfo.get("Ordering")), 37707 supplement: cidSystemInfo.get("Supplement") 37708 }; 37709 } 37710 try { 37711 const cidToGidMap = dict.get("CIDToGIDMap"); 37712 if (cidToGidMap instanceof BaseStream) { 37713 cidToGidBytes = cidToGidMap.getBytes(); 37714 } 37715 } catch (ex) { 37716 if (!this.options.ignoreErrors) { 37717 throw ex; 37718 } 37719 warn(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`); 37720 } 37721 } 37722 const differences = []; 37723 let baseEncodingName = null; 37724 let encoding; 37725 if (dict.has("Encoding")) { 37726 encoding = dict.get("Encoding"); 37727 if (encoding instanceof Dict) { 37728 baseEncodingName = encoding.get("BaseEncoding"); 37729 baseEncodingName = baseEncodingName instanceof Name ? baseEncodingName.name : null; 37730 if (encoding.has("Differences")) { 37731 const diffEncoding = encoding.get("Differences"); 37732 let index = 0; 37733 for (const entry of diffEncoding) { 37734 const data = xref.fetchIfRef(entry); 37735 if (typeof data === "number") { 37736 index = data; 37737 } else if (data instanceof Name) { 37738 differences[index++] = data.name; 37739 } else { 37740 throw new FormatError(`Invalid entry in 'Differences' array: ${data}`); 37741 } 37742 } 37743 } 37744 } else if (encoding instanceof Name) { 37745 baseEncodingName = encoding.name; 37746 } else { 37747 const msg = "Encoding is not a Name nor a Dict"; 37748 if (!this.options.ignoreErrors) { 37749 throw new FormatError(msg); 37750 } 37751 warn(msg); 37752 } 37753 if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") { 37754 baseEncodingName = null; 37755 } 37756 } 37757 const nonEmbeddedFont = !properties.file || properties.isInternalFont, 37758 isSymbolsFontName = getSymbolsFonts()[properties.name]; 37759 if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { 37760 baseEncodingName = null; 37761 } 37762 if (baseEncodingName) { 37763 properties.defaultEncoding = getEncoding(baseEncodingName); 37764 } else {
vendor: 10,342 bytes, lines 37765-38096
37765 const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); 37766 const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); 37767 encoding = StandardEncoding; 37768 if (properties.type === "TrueType" && !isNonsymbolicFont) { 37769 encoding = WinAnsiEncoding; 37770 } 37771 if (isSymbolicFont || isSymbolsFontName) { 37772 encoding = MacRomanEncoding; 37773 if (nonEmbeddedFont) { 37774 if (/Symbol/i.test(properties.name)) { 37775 encoding = SymbolSetEncoding; 37776 } else if (/Dingbats/i.test(properties.name)) { 37777 encoding = ZapfDingbatsEncoding; 37778 } else if (/Wingdings/i.test(properties.name)) { 37779 encoding = WinAnsiEncoding; 37780 } 37781 } 37782 } 37783 properties.defaultEncoding = encoding; 37784 } 37785 properties.differences = differences; 37786 properties.baseEncodingName = baseEncodingName; 37787 properties.hasEncoding = !!baseEncodingName || differences.length > 0; 37788 properties.dict = dict; 37789 properties.toUnicode = await toUnicodePromise; 37790 const builtToUnicode = await this.buildToUnicode(properties); 37791 properties.toUnicode = builtToUnicode; 37792 if (cidToGidBytes) { 37793 properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode); 37794 } 37795 return properties; 37796 } 37797 _simpleFontToUnicode(properties, forceGlyphs = false) { 37798 assert(!properties.composite, "Must be a simple font."); 37799 const toUnicode = []; 37800 const encoding = properties.defaultEncoding.slice(); 37801 const baseEncodingName = properties.baseEncodingName; 37802 const differences = properties.differences; 37803 for (const charcode in differences) { 37804 const glyphName = differences[charcode]; 37805 if (glyphName === ".notdef") { 37806 continue; 37807 } 37808 encoding[charcode] = glyphName; 37809 } 37810 const glyphsUnicodeMap = getGlyphsUnicode(); 37811 for (const charcode in encoding) { 37812 let glyphName = encoding[charcode]; 37813 if (glyphName === "") { 37814 continue; 37815 } 37816 let unicode = glyphsUnicodeMap[glyphName]; 37817 if (unicode !== undefined) { 37818 toUnicode[charcode] = String.fromCharCode(unicode); 37819 continue; 37820 } 37821 let code = 0; 37822 switch (glyphName[0]) { 37823 case "G": 37824 if (glyphName.length === 3) { 37825 code = parseInt(glyphName.substring(1), 16); 37826 } 37827 break; 37828 case "g": 37829 if (glyphName.length === 5) { 37830 code = parseInt(glyphName.substring(1), 16); 37831 } 37832 break; 37833 case "C": 37834 case "c": 37835 if (glyphName.length >= 3 && glyphName.length <= 4) { 37836 const codeStr = glyphName.substring(1); 37837 if (forceGlyphs) { 37838 code = parseInt(codeStr, 16); 37839 break; 37840 } 37841 code = +codeStr; 37842 if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) { 37843 return this._simpleFontToUnicode(properties, true); 37844 } 37845 } 37846 break; 37847 case "u": 37848 unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); 37849 if (unicode !== -1) { 37850 code = unicode; 37851 } 37852 break; 37853 default: 37854 switch (glyphName) { 37855 case "f_h": 37856 case "f_t": 37857 case "T_h": 37858 toUnicode[charcode] = glyphName.replaceAll("_", ""); 37859 continue; 37860 } 37861 break; 37862 } 37863 if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { 37864 if (baseEncodingName && code === +charcode) { 37865 const baseEncoding = getEncoding(baseEncodingName); 37866 if (baseEncoding && (glyphName = baseEncoding[charcode])) { 37867 toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); 37868 continue; 37869 } 37870 } 37871 toUnicode[charcode] = String.fromCodePoint(code); 37872 } 37873 } 37874 return toUnicode; 37875 } 37876 async buildToUnicode(properties) { 37877 properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0; 37878 if (properties.hasIncludedToUnicodeMap) { 37879 if (!properties.composite && properties.hasEncoding) { 37880 properties.fallbackToUnicode = this._simpleFontToUnicode(properties); 37881 } 37882 return properties.toUnicode; 37883 } 37884 if (!properties.composite) { 37885 return new ToUnicodeMap(this._simpleFontToUnicode(properties)); 37886 } 37887 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"))) { 37888 const { 37889 registry, 37890 ordering 37891 } = properties.cidSystemInfo; 37892 const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`); 37893 const ucs2CMap = await CMapFactory.create({ 37894 encoding: ucs2CMapName, 37895 fetchBuiltInCMap: this._fetchBuiltInCMapBound, 37896 useCMap: null 37897 }); 37898 const toUnicode = [], 37899 buf = []; 37900 properties.cMap.forEach(function (charcode, cid) { 37901 if (cid > 0xffff) { 37902 throw new FormatError("Max size of CID is 65,535"); 37903 } 37904 const ucs2 = ucs2CMap.lookup(cid); 37905 if (ucs2) { 37906 buf.length = 0; 37907 for (let i = 0, ii = ucs2.length; i < ii; i += 2) { 37908 buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1)); 37909 } 37910 toUnicode[charcode] = String.fromCharCode(...buf); 37911 } 37912 }); 37913 return new ToUnicodeMap(toUnicode); 37914 } 37915 return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar); 37916 } 37917 async readToUnicode(cmapObj) { 37918 if (!cmapObj) { 37919 return null; 37920 } 37921 if (cmapObj instanceof Name) { 37922 const cmap = await CMapFactory.create({ 37923 encoding: cmapObj, 37924 fetchBuiltInCMap: this._fetchBuiltInCMapBound, 37925 useCMap: null 37926 }); 37927 if (cmap instanceof IdentityCMap) { 37928 return new IdentityToUnicodeMap(0, 0xffff); 37929 } 37930 return new ToUnicodeMap(cmap.getMap()); 37931 } 37932 if (cmapObj instanceof BaseStream) { 37933 try { 37934 const cmap = await CMapFactory.create({ 37935 encoding: cmapObj, 37936 fetchBuiltInCMap: this._fetchBuiltInCMapBound, 37937 useCMap: null 37938 }); 37939 if (cmap instanceof IdentityCMap) { 37940 return new IdentityToUnicodeMap(0, 0xffff); 37941 } 37942 const map = new Array(cmap.length); 37943 cmap.forEach(function (charCode, token) { 37944 if (typeof token === "number") { 37945 map[charCode] = String.fromCodePoint(token); 37946 return; 37947 } 37948 if (token.length % 2 !== 0) { 37949 token = "\u0000" + token; 37950 } 37951 const str = []; 37952 for (let k = 0; k < token.length; k += 2) { 37953 const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); 37954 if ((w1 & 0xf800) !== 0xd800) { 37955 str.push(w1); 37956 continue; 37957 } 37958 k += 2; 37959 const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); 37960 str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); 37961 } 37962 map[charCode] = String.fromCodePoint(...str); 37963 }); 37964 return new ToUnicodeMap(map); 37965 } catch (reason) { 37966 if (reason instanceof AbortException) { 37967 return null; 37968 } 37969 if (this.options.ignoreErrors) { 37970 warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); 37971 return null; 37972 } 37973 throw reason; 37974 } 37975 } 37976 return null; 37977 } 37978 readCidToGidMap(glyphsData, toUnicode) { 37979 const result = []; 37980 for (let j = 0, jj = glyphsData.length; j < jj; j++) { 37981 const glyphID = glyphsData[j++] << 8 | glyphsData[j]; 37982 const code = j >> 1; 37983 if (glyphID === 0 && !toUnicode.has(code)) { 37984 continue; 37985 } 37986 result[code] = glyphID; 37987 } 37988 return result; 37989 } 37990 extractWidths(dict, descriptor, properties) { 37991 const xref = this.xref; 37992 let glyphsWidths = []; 37993 let defaultWidth = 0; 37994 const glyphsVMetrics = []; 37995 let defaultVMetrics; 37996 if (properties.composite) { 37997 const dw = dict.get("DW"); 37998 defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000; 37999 const widths = dict.get("W"); 38000 if (Array.isArray(widths)) { 38001 for (let i = 0, ii = widths.length; i < ii; i++) { 38002 let start = xref.fetchIfRef(widths[i++]); 38003 if (!Number.isInteger(start)) { 38004 break; 38005 } 38006 const code = xref.fetchIfRef(widths[i]); 38007 if (Array.isArray(code)) { 38008 for (const c of code) { 38009 const width = xref.fetchIfRef(c); 38010 if (typeof width === "number") { 38011 glyphsWidths[start] = width; 38012 } 38013 start++; 38014 } 38015 } else if (Number.isInteger(code)) { 38016 const width = xref.fetchIfRef(widths[++i]); 38017 if (typeof width !== "number") { 38018 continue; 38019 } 38020 for (let j = start; j <= code; j++) { 38021 glyphsWidths[j] = width; 38022 } 38023 } else { 38024 break; 38025 } 38026 } 38027 } 38028 if (properties.vertical) { 38029 const dw2 = dict.getArray("DW2"); 38030 let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000]; 38031 defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; 38032 vmetrics = dict.get("W2"); 38033 if (Array.isArray(vmetrics)) { 38034 for (let i = 0, ii = vmetrics.length; i < ii; i++) { 38035 let start = xref.fetchIfRef(vmetrics[i++]); 38036 if (!Number.isInteger(start)) { 38037 break; 38038 } 38039 const code = xref.fetchIfRef(vmetrics[i]); 38040 if (Array.isArray(code)) { 38041 for (let j = 0, jj = code.length; j < jj; j++) { 38042 const vmetric = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])]; 38043 if (isNumberArray(vmetric, null)) { 38044 glyphsVMetrics[start] = vmetric; 38045 } 38046 start++; 38047 } 38048 } else if (Number.isInteger(code)) { 38049 const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])]; 38050 if (!isNumberArray(vmetric, null)) { 38051 continue; 38052 } 38053 for (let j = start; j <= code; j++) { 38054 glyphsVMetrics[j] = vmetric; 38055 } 38056 } else { 38057 break; 38058 } 38059 } 38060 } 38061 } 38062 } else { 38063 const widths = dict.get("Widths"); 38064 if (Array.isArray(widths)) { 38065 let j = properties.firstChar; 38066 for (const w of widths) { 38067 const width = xref.fetchIfRef(w); 38068 if (typeof width === "number") { 38069 glyphsWidths[j] = width; 38070 } 38071 j++; 38072 } 38073 const missingWidth = descriptor.get("MissingWidth"); 38074 defaultWidth = typeof missingWidth === "number" ? missingWidth : 0; 38075 } else { 38076 const baseFontName = dict.get("BaseFont"); 38077 if (baseFontName instanceof Name) { 38078 const metrics = this.getBaseFontMetrics(baseFontName.name); 38079 glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); 38080 defaultWidth = metrics.defaultWidth; 38081 } 38082 } 38083 } 38084 let isMonospace = true; 38085 let firstWidth = defaultWidth; 38086 for (const glyph in glyphsWidths) { 38087 const glyphWidth = glyphsWidths[glyph]; 38088 if (!glyphWidth) { 38089 continue; 38090 } 38091 if (!firstWidth) { 38092 firstWidth = glyphWidth; 38093 continue; 38094 } 38095 if (firstWidth !== glyphWidth) { 38096 isMonospace = false;
vendor: 13,764 bytes, lines 38097-38534
38097 break; 38098 } 38099 } 38100 if (isMonospace) { 38101 properties.flags |= FontFlags.FixedPitch; 38102 } else { 38103 properties.flags &= ~FontFlags.FixedPitch; 38104 } 38105 properties.defaultWidth = defaultWidth; 38106 properties.widths = glyphsWidths; 38107 properties.defaultVMetrics = defaultVMetrics; 38108 properties.vmetrics = glyphsVMetrics; 38109 } 38110 isSerifFont(baseFontName) { 38111 const fontNameWoStyle = baseFontName.split("-", 1)[0]; 38112 return fontNameWoStyle in getSerifFonts() || /serif/gi.test(fontNameWoStyle); 38113 } 38114 getBaseFontMetrics(name) { 38115 let defaultWidth = 0; 38116 let widths = Object.create(null); 38117 let monospace = false; 38118 const stdFontMap = getStdFontMap(); 38119 let lookupName = stdFontMap[name] || name; 38120 const Metrics = getMetrics(); 38121 if (!(lookupName in Metrics)) { 38122 lookupName = this.isSerifFont(name) ? "Times-Roman" : "Helvetica"; 38123 } 38124 const glyphWidths = Metrics[lookupName]; 38125 if (typeof glyphWidths === "number") { 38126 defaultWidth = glyphWidths; 38127 monospace = true; 38128 } else { 38129 widths = glyphWidths(); 38130 } 38131 return { 38132 defaultWidth, 38133 monospace, 38134 widths 38135 }; 38136 } 38137 buildCharCodeToWidth(widthsByGlyphName, properties) { 38138 const widths = Object.create(null); 38139 const differences = properties.differences; 38140 const encoding = properties.defaultEncoding; 38141 for (let charCode = 0; charCode < 256; charCode++) { 38142 if (charCode in differences && widthsByGlyphName[differences[charCode]]) { 38143 widths[charCode] = widthsByGlyphName[differences[charCode]]; 38144 continue; 38145 } 38146 if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { 38147 widths[charCode] = widthsByGlyphName[encoding[charCode]]; 38148 continue; 38149 } 38150 } 38151 return widths; 38152 } 38153 preEvaluateFont(dict) { 38154 const baseDict = dict; 38155 let type = dict.get("Subtype"); 38156 if (!(type instanceof Name)) { 38157 throw new FormatError("invalid font Subtype"); 38158 } 38159 let composite = false; 38160 let hash; 38161 if (type.name === "Type0") { 38162 const df = dict.get("DescendantFonts"); 38163 if (!df) { 38164 throw new FormatError("Descendant fonts are not specified"); 38165 } 38166 dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df; 38167 if (!(dict instanceof Dict)) { 38168 throw new FormatError("Descendant font is not a dictionary."); 38169 } 38170 type = dict.get("Subtype"); 38171 if (!(type instanceof Name)) { 38172 throw new FormatError("invalid font Subtype"); 38173 } 38174 composite = true; 38175 } 38176 let firstChar = dict.get("FirstChar"); 38177 if (!Number.isInteger(firstChar)) { 38178 firstChar = 0; 38179 } 38180 let lastChar = dict.get("LastChar"); 38181 if (!Number.isInteger(lastChar)) { 38182 lastChar = composite ? 0xffff : 0xff; 38183 } 38184 const descriptor = dict.get("FontDescriptor"); 38185 const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode"); 38186 if (descriptor) { 38187 hash = new MurmurHash3_64(); 38188 const encoding = baseDict.getRaw("Encoding"); 38189 if (encoding instanceof Name) { 38190 hash.update(encoding.name); 38191 } else if (encoding instanceof Ref) { 38192 hash.update(encoding.toString()); 38193 } else if (encoding instanceof Dict) { 38194 for (const entry of encoding.getRawValues()) { 38195 if (entry instanceof Name) { 38196 hash.update(entry.name); 38197 } else if (entry instanceof Ref) { 38198 hash.update(entry.toString()); 38199 } else if (Array.isArray(entry)) { 38200 const diffLength = entry.length, 38201 diffBuf = new Array(diffLength); 38202 for (let j = 0; j < diffLength; j++) { 38203 const diffEntry = entry[j]; 38204 if (diffEntry instanceof Name) { 38205 diffBuf[j] = diffEntry.name; 38206 } else if (typeof diffEntry === "number" || diffEntry instanceof Ref) { 38207 diffBuf[j] = diffEntry.toString(); 38208 } 38209 } 38210 hash.update(diffBuf.join()); 38211 } 38212 } 38213 } 38214 hash.update(`${firstChar}-${lastChar}`); 38215 if (toUnicode instanceof BaseStream) { 38216 const stream = toUnicode.str || toUnicode; 38217 const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); 38218 hash.update(uint8array); 38219 } else if (toUnicode instanceof Name) { 38220 hash.update(toUnicode.name); 38221 } 38222 const widths = dict.get("Widths") || baseDict.get("Widths"); 38223 if (Array.isArray(widths)) { 38224 const widthsBuf = []; 38225 for (const entry of widths) { 38226 if (typeof entry === "number" || entry instanceof Ref) { 38227 widthsBuf.push(entry.toString()); 38228 } 38229 } 38230 hash.update(widthsBuf.join()); 38231 } 38232 if (composite) { 38233 hash.update("compositeFont"); 38234 const compositeWidths = dict.get("W") || baseDict.get("W"); 38235 if (Array.isArray(compositeWidths)) { 38236 const widthsBuf = []; 38237 for (const entry of compositeWidths) { 38238 if (typeof entry === "number" || entry instanceof Ref) { 38239 widthsBuf.push(entry.toString()); 38240 } else if (Array.isArray(entry)) { 38241 const subWidthsBuf = []; 38242 for (const element of entry) { 38243 if (typeof element === "number" || element instanceof Ref) { 38244 subWidthsBuf.push(element.toString()); 38245 } 38246 } 38247 widthsBuf.push(`[${subWidthsBuf.join()}]`); 38248 } 38249 } 38250 hash.update(widthsBuf.join()); 38251 } 38252 const cidToGidMap = dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap"); 38253 if (cidToGidMap instanceof Name) { 38254 hash.update(cidToGidMap.name); 38255 } else if (cidToGidMap instanceof Ref) { 38256 hash.update(cidToGidMap.toString()); 38257 } else if (cidToGidMap instanceof BaseStream) { 38258 hash.update(cidToGidMap.peekBytes()); 38259 } 38260 } 38261 } 38262 return { 38263 descriptor, 38264 dict, 38265 baseDict, 38266 composite, 38267 type: type.name, 38268 firstChar, 38269 lastChar, 38270 toUnicode, 38271 hash: hash ? hash.hexdigest() : "" 38272 }; 38273 } 38274 async translateFont({ 38275 descriptor, 38276 dict, 38277 baseDict, 38278 composite, 38279 type, 38280 firstChar, 38281 lastChar, 38282 toUnicode, 38283 cssFontInfo 38284 }) { 38285 const isType3Font = type === "Type3"; 38286 if (!descriptor) { 38287 if (isType3Font) { 38288 const bbox = lookupNormalRect(dict.getArray("FontBBox"), [0, 0, 0, 0]); 38289 descriptor = new Dict(null); 38290 descriptor.set("FontName", Name.get(type)); 38291 descriptor.set("FontBBox", bbox); 38292 } else { 38293 let baseFontName = dict.get("BaseFont"); 38294 if (!(baseFontName instanceof Name)) { 38295 throw new FormatError("Base font is not specified"); 38296 } 38297 baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-"); 38298 const metrics = this.getBaseFontMetrics(baseFontName); 38299 const fontNameWoStyle = baseFontName.split("-", 1)[0]; 38300 const flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic); 38301 const properties = { 38302 type, 38303 name: baseFontName, 38304 loadedName: baseDict.loadedName, 38305 systemFontInfo: null, 38306 widths: metrics.widths, 38307 defaultWidth: metrics.defaultWidth, 38308 isSimulatedFlags: true, 38309 flags, 38310 firstChar, 38311 lastChar, 38312 toUnicode, 38313 xHeight: 0, 38314 capHeight: 0, 38315 italicAngle: 0, 38316 isType3Font 38317 }; 38318 const widths = dict.get("Widths"); 38319 const standardFontName = getStandardFontName(baseFontName); 38320 let file = null; 38321 if (standardFontName) { 38322 file = await this.fetchStandardFontData(standardFontName); 38323 properties.isInternalFont = !!file; 38324 } 38325 if (!properties.isInternalFont && this.options.useSystemFonts) { 38326 properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName, type); 38327 } 38328 const newProperties = await this.extractDataStructures(dict, properties); 38329 if (Array.isArray(widths)) { 38330 const glyphWidths = []; 38331 let j = firstChar; 38332 for (const w of widths) { 38333 const width = this.xref.fetchIfRef(w); 38334 if (typeof width === "number") { 38335 glyphWidths[j] = width; 38336 } 38337 j++; 38338 } 38339 newProperties.widths = glyphWidths; 38340 } else { 38341 newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties); 38342 } 38343 return new Font(baseFontName, file, newProperties); 38344 } 38345 } 38346 let fontName = descriptor.get("FontName"); 38347 let baseFont = dict.get("BaseFont"); 38348 if (typeof fontName === "string") { 38349 fontName = Name.get(fontName); 38350 } 38351 if (typeof baseFont === "string") { 38352 baseFont = Name.get(baseFont); 38353 } 38354 const fontNameStr = fontName?.name; 38355 const baseFontStr = baseFont?.name; 38356 if (!isType3Font && fontNameStr !== baseFontStr) { 38357 info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`); 38358 if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) { 38359 fontName = null; 38360 } 38361 } 38362 fontName ||= baseFont; 38363 if (!(fontName instanceof Name)) { 38364 throw new FormatError("invalid font name"); 38365 } 38366 let fontFile, subtype, length1, length2, length3; 38367 try { 38368 fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3"); 38369 if (fontFile) { 38370 if (!(fontFile instanceof BaseStream)) { 38371 throw new FormatError("FontFile should be a stream"); 38372 } else if (fontFile.isEmpty) { 38373 throw new FormatError("FontFile is empty"); 38374 } 38375 } 38376 } catch (ex) { 38377 if (!this.options.ignoreErrors) { 38378 throw ex; 38379 } 38380 warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`); 38381 fontFile = null; 38382 } 38383 let isInternalFont = false; 38384 let glyphScaleFactors = null; 38385 let systemFontInfo = null; 38386 if (fontFile) { 38387 if (fontFile.dict) { 38388 const subtypeEntry = fontFile.dict.get("Subtype"); 38389 if (subtypeEntry instanceof Name) { 38390 subtype = subtypeEntry.name; 38391 } 38392 length1 = fontFile.dict.get("Length1"); 38393 length2 = fontFile.dict.get("Length2"); 38394 length3 = fontFile.dict.get("Length3"); 38395 } 38396 } else if (cssFontInfo) { 38397 const standardFontName = getXfaFontName(fontName.name); 38398 if (standardFontName) { 38399 cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`; 38400 cssFontInfo.metrics = standardFontName.metrics || null; 38401 glyphScaleFactors = standardFontName.factors || null; 38402 fontFile = await this.fetchStandardFontData(standardFontName.name); 38403 isInternalFont = !!fontFile; 38404 baseDict = dict = getXfaFontDict(fontName.name); 38405 composite = true; 38406 } 38407 } else if (!isType3Font) { 38408 const standardFontName = getStandardFontName(fontName.name); 38409 if (standardFontName) { 38410 fontFile = await this.fetchStandardFontData(standardFontName); 38411 isInternalFont = !!fontFile; 38412 } 38413 if (!isInternalFont && this.options.useSystemFonts) { 38414 systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); 38415 } 38416 } 38417 const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX); 38418 const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), undefined); 38419 let ascent = descriptor.get("Ascent"); 38420 if (typeof ascent !== "number") { 38421 ascent = undefined; 38422 } 38423 let descent = descriptor.get("Descent"); 38424 if (typeof descent !== "number") { 38425 descent = undefined; 38426 } 38427 let xHeight = descriptor.get("XHeight"); 38428 if (typeof xHeight !== "number") { 38429 xHeight = 0; 38430 } 38431 let capHeight = descriptor.get("CapHeight"); 38432 if (typeof capHeight !== "number") { 38433 capHeight = 0; 38434 } 38435 let flags = descriptor.get("Flags"); 38436 if (!Number.isInteger(flags)) { 38437 flags = 0; 38438 } 38439 let italicAngle = descriptor.get("ItalicAngle"); 38440 if (typeof italicAngle !== "number") { 38441 italicAngle = 0; 38442 } 38443 const properties = { 38444 type, 38445 name: fontName.name, 38446 subtype, 38447 file: fontFile, 38448 length1, 38449 length2, 38450 length3, 38451 isInternalFont, 38452 loadedName: baseDict.loadedName, 38453 composite, 38454 fixedPitch: false, 38455 fontMatrix, 38456 firstChar, 38457 lastChar, 38458 toUnicode, 38459 bbox, 38460 ascent, 38461 descent, 38462 xHeight, 38463 capHeight, 38464 flags, 38465 italicAngle, 38466 isType3Font, 38467 cssFontInfo, 38468 scaleFactors: glyphScaleFactors, 38469 systemFontInfo 38470 }; 38471 if (composite) { 38472 const cidEncoding = baseDict.get("Encoding"); 38473 if (cidEncoding instanceof Name) { 38474 properties.cidEncoding = cidEncoding.name; 38475 } 38476 const cMap = await CMapFactory.create({ 38477 encoding: cidEncoding, 38478 fetchBuiltInCMap: this._fetchBuiltInCMapBound, 38479 useCMap: null 38480 }); 38481 properties.cMap = cMap; 38482 properties.vertical = properties.cMap.vertical; 38483 } 38484 const newProperties = await this.extractDataStructures(dict, properties); 38485 this.extractWidths(dict, descriptor, newProperties); 38486 return new Font(fontName.name, fontFile, newProperties); 38487 } 38488 static buildFontPaths(font, glyphs, handler, evaluatorOptions) { 38489 function buildPath(fontChar) { 38490 const glyphName = `${font.loadedName}_path_${fontChar}`; 38491 try { 38492 if (font.renderer.hasBuiltPath(fontChar)) { 38493 return; 38494 } 38495 handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); 38496 } catch (reason) { 38497 if (evaluatorOptions.ignoreErrors) { 38498 warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); 38499 return; 38500 } 38501 throw reason; 38502 } 38503 } 38504 for (const glyph of glyphs) { 38505 buildPath(glyph.fontChar); 38506 const accent = glyph.accent; 38507 if (accent?.fontChar) { 38508 buildPath(accent.fontChar); 38509 } 38510 } 38511 } 38512 static get fallbackFontDict() { 38513 const dict = new Dict(); 38514 dict.set("BaseFont", Name.get("Helvetica")); 38515 dict.set("Type", Name.get("FallbackType")); 38516 dict.set("Subtype", Name.get("FallbackType")); 38517 dict.set("Encoding", Name.get("WinAnsiEncoding")); 38518 return shadow(this, "fallbackFontDict", dict); 38519 } 38520} 38521class TranslatedFont { 38522 constructor({ 38523 loadedName, 38524 font, 38525 dict, 38526 evaluatorOptions 38527 }) { 38528 this.loadedName = loadedName; 38529 this.font = font; 38530 this.dict = dict; 38531 this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions; 38532 this.type3Loaded = null; 38533 this.type3Dependencies = font.isType3Font ? new Set() : null; 38534 this.sent = false;
vendor: 4,652 bytes, lines 38535-38684
38535 } 38536 send(handler) { 38537 if (this.sent) { 38538 return; 38539 } 38540 this.sent = true; 38541 handler.send("commonobj", [this.loadedName, "Font", this.font.exportData(this._evaluatorOptions.fontExtraProperties)]); 38542 } 38543 fallback(handler) { 38544 if (!this.font.data) { 38545 return; 38546 } 38547 this.font.disableFontFace = true; 38548 PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, this._evaluatorOptions); 38549 } 38550 loadType3Data(evaluator, resources, task) { 38551 if (this.type3Loaded) { 38552 return this.type3Loaded; 38553 } 38554 if (!this.font.isType3Font) { 38555 throw new Error("Must be a Type3 font."); 38556 } 38557 const type3Evaluator = evaluator.clone({ 38558 ignoreErrors: false 38559 }); 38560 const type3FontRefs = new RefSet(evaluator.type3FontRefs); 38561 if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) { 38562 type3FontRefs.put(this.dict.objId); 38563 } 38564 type3Evaluator.type3FontRefs = type3FontRefs; 38565 const translatedFont = this.font, 38566 type3Dependencies = this.type3Dependencies; 38567 let loadCharProcsPromise = Promise.resolve(); 38568 const charProcs = this.dict.get("CharProcs"); 38569 const fontResources = this.dict.get("Resources") || resources; 38570 const charProcOperatorList = Object.create(null); 38571 const fontBBox = Util.normalizeRect(translatedFont.bbox || [0, 0, 0, 0]), 38572 width = fontBBox[2] - fontBBox[0], 38573 height = fontBBox[3] - fontBBox[1]; 38574 const fontBBoxSize = Math.hypot(width, height); 38575 for (const key of charProcs.getKeys()) { 38576 loadCharProcsPromise = loadCharProcsPromise.then(() => { 38577 const glyphStream = charProcs.get(key); 38578 const operatorList = new OperatorList(); 38579 return type3Evaluator.getOperatorList({ 38580 stream: glyphStream, 38581 task, 38582 resources: fontResources, 38583 operatorList 38584 }).then(() => { 38585 if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) { 38586 this._removeType3ColorOperators(operatorList, fontBBoxSize); 38587 } 38588 charProcOperatorList[key] = operatorList.getIR(); 38589 for (const dependency of operatorList.dependencies) { 38590 type3Dependencies.add(dependency); 38591 } 38592 }).catch(function (reason) { 38593 warn(`Type3 font resource "${key}" is not available.`); 38594 const dummyOperatorList = new OperatorList(); 38595 charProcOperatorList[key] = dummyOperatorList.getIR(); 38596 }); 38597 }); 38598 } 38599 this.type3Loaded = loadCharProcsPromise.then(() => { 38600 translatedFont.charProcOperatorList = charProcOperatorList; 38601 if (this._bbox) { 38602 translatedFont.isCharBBox = true; 38603 translatedFont.bbox = this._bbox; 38604 } 38605 }); 38606 return this.type3Loaded; 38607 } 38608 _removeType3ColorOperators(operatorList, fontBBoxSize = NaN) { 38609 const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)), 38610 width = charBBox[2] - charBBox[0], 38611 height = charBBox[3] - charBBox[1]; 38612 const charBBoxSize = Math.hypot(width, height); 38613 if (width === 0 || height === 0) { 38614 operatorList.fnArray.splice(0, 1); 38615 operatorList.argsArray.splice(0, 1); 38616 } else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) { 38617 if (!this._bbox) { 38618 this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; 38619 } 38620 this._bbox[0] = Math.min(this._bbox[0], charBBox[0]); 38621 this._bbox[1] = Math.min(this._bbox[1], charBBox[1]); 38622 this._bbox[2] = Math.max(this._bbox[2], charBBox[2]); 38623 this._bbox[3] = Math.max(this._bbox[3], charBBox[3]); 38624 } 38625 let i = 0, 38626 ii = operatorList.length; 38627 while (i < ii) { 38628 switch (operatorList.fnArray[i]) { 38629 case OPS.setCharWidthAndBounds: 38630 break; 38631 case OPS.setStrokeColorSpace: 38632 case OPS.setFillColorSpace: 38633 case OPS.setStrokeColor: 38634 case OPS.setStrokeColorN: 38635 case OPS.setFillColor: 38636 case OPS.setFillColorN: 38637 case OPS.setStrokeGray: 38638 case OPS.setFillGray: 38639 case OPS.setStrokeRGBColor: 38640 case OPS.setFillRGBColor: 38641 case OPS.setStrokeCMYKColor: 38642 case OPS.setFillCMYKColor: 38643 case OPS.shadingFill: 38644 case OPS.setRenderingIntent: 38645 operatorList.fnArray.splice(i, 1); 38646 operatorList.argsArray.splice(i, 1); 38647 ii--; 38648 continue; 38649 case OPS.setGState: 38650 const [gStateObj] = operatorList.argsArray[i]; 38651 let j = 0, 38652 jj = gStateObj.length; 38653 while (j < jj) { 38654 const [gStateKey] = gStateObj[j]; 38655 switch (gStateKey) { 38656 case "TR": 38657 case "TR2": 38658 case "HT": 38659 case "BG": 38660 case "BG2": 38661 case "UCR": 38662 case "UCR2": 38663 gStateObj.splice(j, 1); 38664 jj--; 38665 continue; 38666 } 38667 j++; 38668 } 38669 break; 38670 } 38671 i++; 38672 } 38673 } 38674} 38675class StateManager { 38676 constructor(initialState = new EvalState()) { 38677 this.state = initialState; 38678 this.stateStack = []; 38679 } 38680 save() { 38681 const old = this.state; 38682 this.stateStack.push(this.state); 38683 this.state = old.clone(); 38684 }
vendor: 8,374 bytes, lines 38685-39156
38685 restore() { 38686 const prev = this.stateStack.pop(); 38687 if (prev) { 38688 this.state = prev; 38689 } 38690 } 38691 transform(args) { 38692 this.state.ctm = Util.transform(this.state.ctm, args); 38693 } 38694} 38695class TextState { 38696 constructor() { 38697 this.ctm = new Float32Array(IDENTITY_MATRIX); 38698 this.fontName = null; 38699 this.fontSize = 0; 38700 this.loadedName = null; 38701 this.font = null; 38702 this.fontMatrix = FONT_IDENTITY_MATRIX; 38703 this.textMatrix = IDENTITY_MATRIX.slice(); 38704 this.textLineMatrix = IDENTITY_MATRIX.slice(); 38705 this.charSpacing = 0; 38706 this.wordSpacing = 0; 38707 this.leading = 0; 38708 this.textHScale = 1; 38709 this.textRise = 0; 38710 } 38711 setTextMatrix(a, b, c, d, e, f) { 38712 const m = this.textMatrix; 38713 m[0] = a; 38714 m[1] = b; 38715 m[2] = c; 38716 m[3] = d; 38717 m[4] = e; 38718 m[5] = f; 38719 } 38720 setTextLineMatrix(a, b, c, d, e, f) { 38721 const m = this.textLineMatrix; 38722 m[0] = a; 38723 m[1] = b; 38724 m[2] = c; 38725 m[3] = d; 38726 m[4] = e; 38727 m[5] = f; 38728 } 38729 translateTextMatrix(x, y) { 38730 const m = this.textMatrix; 38731 m[4] = m[0] * x + m[2] * y + m[4]; 38732 m[5] = m[1] * x + m[3] * y + m[5]; 38733 } 38734 translateTextLineMatrix(x, y) { 38735 const m = this.textLineMatrix; 38736 m[4] = m[0] * x + m[2] * y + m[4]; 38737 m[5] = m[1] * x + m[3] * y + m[5]; 38738 } 38739 carriageReturn() { 38740 this.translateTextLineMatrix(0, -this.leading); 38741 this.textMatrix = this.textLineMatrix.slice(); 38742 } 38743 clone() { 38744 const clone = Object.create(this); 38745 clone.textMatrix = this.textMatrix.slice(); 38746 clone.textLineMatrix = this.textLineMatrix.slice(); 38747 clone.fontMatrix = this.fontMatrix.slice(); 38748 return clone; 38749 } 38750} 38751class EvalState { 38752 constructor() { 38753 this.ctm = new Float32Array(IDENTITY_MATRIX); 38754 this.font = null; 38755 this.textRenderingMode = TextRenderingMode.FILL; 38756 this._fillColorSpace = ColorSpace.singletons.gray; 38757 this._strokeColorSpace = ColorSpace.singletons.gray; 38758 this.patternFillColorSpace = null; 38759 this.patternStrokeColorSpace = null; 38760 } 38761 get fillColorSpace() { 38762 return this._fillColorSpace; 38763 } 38764 set fillColorSpace(colorSpace) { 38765 this._fillColorSpace = this.patternFillColorSpace = colorSpace; 38766 } 38767 get strokeColorSpace() { 38768 return this._strokeColorSpace; 38769 } 38770 set strokeColorSpace(colorSpace) { 38771 this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace; 38772 } 38773 clone() { 38774 return Object.create(this); 38775 } 38776} 38777class EvaluatorPreprocessor { 38778 static get opMap() { 38779 return shadow(this, "opMap", Object.assign(Object.create(null), { 38780 w: { 38781 id: OPS.setLineWidth, 38782 numArgs: 1, 38783 variableArgs: false 38784 }, 38785 J: { 38786 id: OPS.setLineCap, 38787 numArgs: 1, 38788 variableArgs: false 38789 }, 38790 j: { 38791 id: OPS.setLineJoin, 38792 numArgs: 1, 38793 variableArgs: false 38794 }, 38795 M: { 38796 id: OPS.setMiterLimit, 38797 numArgs: 1, 38798 variableArgs: false 38799 }, 38800 d: { 38801 id: OPS.setDash, 38802 numArgs: 2, 38803 variableArgs: false 38804 }, 38805 ri: { 38806 id: OPS.setRenderingIntent, 38807 numArgs: 1, 38808 variableArgs: false 38809 }, 38810 i: { 38811 id: OPS.setFlatness, 38812 numArgs: 1, 38813 variableArgs: false 38814 }, 38815 gs: { 38816 id: OPS.setGState, 38817 numArgs: 1, 38818 variableArgs: false 38819 }, 38820 q: { 38821 id: OPS.save, 38822 numArgs: 0, 38823 variableArgs: false 38824 }, 38825 Q: { 38826 id: OPS.restore, 38827 numArgs: 0, 38828 variableArgs: false 38829 }, 38830 cm: { 38831 id: OPS.transform, 38832 numArgs: 6, 38833 variableArgs: false 38834 }, 38835 m: { 38836 id: OPS.moveTo, 38837 numArgs: 2, 38838 variableArgs: false 38839 }, 38840 l: { 38841 id: OPS.lineTo, 38842 numArgs: 2, 38843 variableArgs: false 38844 }, 38845 c: { 38846 id: OPS.curveTo, 38847 numArgs: 6, 38848 variableArgs: false 38849 }, 38850 v: { 38851 id: OPS.curveTo2, 38852 numArgs: 4, 38853 variableArgs: false 38854 }, 38855 y: { 38856 id: OPS.curveTo3, 38857 numArgs: 4, 38858 variableArgs: false 38859 }, 38860 h: { 38861 id: OPS.closePath, 38862 numArgs: 0, 38863 variableArgs: false 38864 }, 38865 re: { 38866 id: OPS.rectangle, 38867 numArgs: 4, 38868 variableArgs: false 38869 }, 38870 S: { 38871 id: OPS.stroke, 38872 numArgs: 0, 38873 variableArgs: false 38874 }, 38875 s: { 38876 id: OPS.closeStroke, 38877 numArgs: 0, 38878 variableArgs: false 38879 }, 38880 f: { 38881 id: OPS.fill, 38882 numArgs: 0, 38883 variableArgs: false 38884 }, 38885 F: { 38886 id: OPS.fill, 38887 numArgs: 0, 38888 variableArgs: false 38889 }, 38890 "f*": { 38891 id: OPS.eoFill, 38892 numArgs: 0, 38893 variableArgs: false 38894 }, 38895 B: { 38896 id: OPS.fillStroke, 38897 numArgs: 0, 38898 variableArgs: false 38899 }, 38900 "B*": { 38901 id: OPS.eoFillStroke, 38902 numArgs: 0, 38903 variableArgs: false 38904 }, 38905 b: { 38906 id: OPS.closeFillStroke, 38907 numArgs: 0, 38908 variableArgs: false 38909 }, 38910 "b*": { 38911 id: OPS.closeEOFillStroke, 38912 numArgs: 0, 38913 variableArgs: false 38914 }, 38915 n: { 38916 id: OPS.endPath, 38917 numArgs: 0, 38918 variableArgs: false 38919 }, 38920 W: { 38921 id: OPS.clip, 38922 numArgs: 0, 38923 variableArgs: false 38924 }, 38925 "W*": { 38926 id: OPS.eoClip, 38927 numArgs: 0, 38928 variableArgs: false 38929 }, 38930 BT: { 38931 id: OPS.beginText, 38932 numArgs: 0, 38933 variableArgs: false 38934 }, 38935 ET: { 38936 id: OPS.endText, 38937 numArgs: 0, 38938 variableArgs: false 38939 }, 38940 Tc: { 38941 id: OPS.setCharSpacing, 38942 numArgs: 1, 38943 variableArgs: false 38944 }, 38945 Tw: { 38946 id: OPS.setWordSpacing, 38947 numArgs: 1, 38948 variableArgs: false 38949 }, 38950 Tz: { 38951 id: OPS.setHScale, 38952 numArgs: 1, 38953 variableArgs: false 38954 }, 38955 TL: { 38956 id: OPS.setLeading, 38957 numArgs: 1, 38958 variableArgs: false 38959 }, 38960 Tf: { 38961 id: OPS.setFont, 38962 numArgs: 2, 38963 variableArgs: false 38964 }, 38965 Tr: { 38966 id: OPS.setTextRenderingMode, 38967 numArgs: 1, 38968 variableArgs: false 38969 }, 38970 Ts: { 38971 id: OPS.setTextRise, 38972 numArgs: 1, 38973 variableArgs: false 38974 }, 38975 Td: { 38976 id: OPS.moveText, 38977 numArgs: 2, 38978 variableArgs: false 38979 }, 38980 TD: { 38981 id: OPS.setLeadingMoveText, 38982 numArgs: 2, 38983 variableArgs: false 38984 }, 38985 Tm: { 38986 id: OPS.setTextMatrix, 38987 numArgs: 6, 38988 variableArgs: false 38989 }, 38990 "T*": { 38991 id: OPS.nextLine, 38992 numArgs: 0, 38993 variableArgs: false 38994 }, 38995 Tj: { 38996 id: OPS.showText, 38997 numArgs: 1, 38998 variableArgs: false 38999 }, 39000 TJ: { 39001 id: OPS.showSpacedText, 39002 numArgs: 1, 39003 variableArgs: false 39004 }, 39005 "'": { 39006 id: OPS.nextLineShowText, 39007 numArgs: 1, 39008 variableArgs: false 39009 }, 39010 '"': { 39011 id: OPS.nextLineSetSpacingShowText, 39012 numArgs: 3, 39013 variableArgs: false 39014 }, 39015 d0: { 39016 id: OPS.setCharWidth, 39017 numArgs: 2, 39018 variableArgs: false 39019 }, 39020 d1: { 39021 id: OPS.setCharWidthAndBounds, 39022 numArgs: 6, 39023 variableArgs: false 39024 }, 39025 CS: { 39026 id: OPS.setStrokeColorSpace, 39027 numArgs: 1, 39028 variableArgs: false 39029 }, 39030 cs: { 39031 id: OPS.setFillColorSpace, 39032 numArgs: 1, 39033 variableArgs: false 39034 }, 39035 SC: { 39036 id: OPS.setStrokeColor, 39037 numArgs: 4, 39038 variableArgs: true 39039 }, 39040 SCN: { 39041 id: OPS.setStrokeColorN, 39042 numArgs: 33, 39043 variableArgs: true 39044 }, 39045 sc: { 39046 id: OPS.setFillColor, 39047 numArgs: 4, 39048 variableArgs: true 39049 }, 39050 scn: { 39051 id: OPS.setFillColorN, 39052 numArgs: 33, 39053 variableArgs: true 39054 }, 39055 G: { 39056 id: OPS.setStrokeGray, 39057 numArgs: 1, 39058 variableArgs: false 39059 }, 39060 g: { 39061 id: OPS.setFillGray, 39062 numArgs: 1, 39063 variableArgs: false 39064 }, 39065 RG: { 39066 id: OPS.setStrokeRGBColor, 39067 numArgs: 3, 39068 variableArgs: false 39069 }, 39070 rg: { 39071 id: OPS.setFillRGBColor, 39072 numArgs: 3, 39073 variableArgs: false 39074 }, 39075 K: { 39076 id: OPS.setStrokeCMYKColor, 39077 numArgs: 4, 39078 variableArgs: false 39079 }, 39080 k: { 39081 id: OPS.setFillCMYKColor, 39082 numArgs: 4, 39083 variableArgs: false 39084 }, 39085 sh: { 39086 id: OPS.shadingFill, 39087 numArgs: 1, 39088 variableArgs: false 39089 }, 39090 BI: { 39091 id: OPS.beginInlineImage, 39092 numArgs: 0, 39093 variableArgs: false 39094 }, 39095 ID: { 39096 id: OPS.beginImageData, 39097 numArgs: 0, 39098 variableArgs: false 39099 }, 39100 EI: { 39101 id: OPS.endInlineImage, 39102 numArgs: 1, 39103 variableArgs: false 39104 }, 39105 Do: { 39106 id: OPS.paintXObject, 39107 numArgs: 1, 39108 variableArgs: false 39109 }, 39110 MP: { 39111 id: OPS.markPoint, 39112 numArgs: 1, 39113 variableArgs: false 39114 }, 39115 DP: { 39116 id: OPS.markPointProps, 39117 numArgs: 2, 39118 variableArgs: false 39119 }, 39120 BMC: { 39121 id: OPS.beginMarkedContent, 39122 numArgs: 1, 39123 variableArgs: false 39124 }, 39125 BDC: { 39126 id: OPS.beginMarkedContentProps, 39127 numArgs: 2, 39128 variableArgs: false 39129 }, 39130 EMC: { 39131 id: OPS.endMarkedContent, 39132 numArgs: 0, 39133 variableArgs: false 39134 }, 39135 BX: { 39136 id: OPS.beginCompat, 39137 numArgs: 0, 39138 variableArgs: false 39139 }, 39140 EX: { 39141 id: OPS.endCompat, 39142 numArgs: 0, 39143 variableArgs: false 39144 }, 39145 BM: null, 39146 BD: null, 39147 true: null, 39148 fa: null, 39149 fal: null, 39150 fals: null, 39151 false: null, 39152 nu: null, 39153 nul: null, 39154 null: null 39155 })); 39156 }
vendor: 4,458 bytes, lines 39157-39345
39157 static MAX_INVALID_PATH_OPS = 10; 39158 constructor(stream, xref, stateManager = new StateManager()) { 39159 this.parser = new Parser({ 39160 lexer: new Lexer(stream, EvaluatorPreprocessor.opMap), 39161 xref 39162 }); 39163 this.stateManager = stateManager; 39164 this.nonProcessedArgs = []; 39165 this._isPathOp = false; 39166 this._numInvalidPathOPS = 0; 39167 } 39168 get savedStatesDepth() { 39169 return this.stateManager.stateStack.length; 39170 } 39171 read(operation) { 39172 let args = operation.args; 39173 while (true) { 39174 const obj = this.parser.getObj(); 39175 if (obj instanceof Cmd) { 39176 const cmd = obj.cmd; 39177 const opSpec = EvaluatorPreprocessor.opMap[cmd]; 39178 if (!opSpec) { 39179 warn(`Unknown command "${cmd}".`); 39180 continue; 39181 } 39182 const fn = opSpec.id; 39183 const numArgs = opSpec.numArgs; 39184 let argsLength = args !== null ? args.length : 0; 39185 if (!this._isPathOp) { 39186 this._numInvalidPathOPS = 0; 39187 } 39188 this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath; 39189 if (!opSpec.variableArgs) { 39190 if (argsLength !== numArgs) { 39191 const nonProcessedArgs = this.nonProcessedArgs; 39192 while (argsLength > numArgs) { 39193 nonProcessedArgs.push(args.shift()); 39194 argsLength--; 39195 } 39196 while (argsLength < numArgs && nonProcessedArgs.length !== 0) { 39197 if (args === null) { 39198 args = []; 39199 } 39200 args.unshift(nonProcessedArgs.pop()); 39201 argsLength++; 39202 } 39203 } 39204 if (argsLength < numArgs) { 39205 const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`; 39206 if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) { 39207 throw new FormatError(`Invalid ${partialMsg}`); 39208 } 39209 warn(`Skipping ${partialMsg}`); 39210 if (args !== null) { 39211 args.length = 0; 39212 } 39213 continue; 39214 } 39215 } else if (argsLength > numArgs) { 39216 info(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`); 39217 } 39218 this.preprocessCommand(fn, args); 39219 operation.fn = fn; 39220 operation.args = args; 39221 return true; 39222 } 39223 if (obj === EOF) { 39224 return false; 39225 } 39226 if (obj !== null) { 39227 if (args === null) { 39228 args = []; 39229 } 39230 args.push(obj); 39231 if (args.length > 33) { 39232 throw new FormatError("Too many arguments"); 39233 } 39234 } 39235 } 39236 } 39237 preprocessCommand(fn, args) { 39238 switch (fn | 0) { 39239 case OPS.save: 39240 this.stateManager.save(); 39241 break; 39242 case OPS.restore: 39243 this.stateManager.restore(); 39244 break; 39245 case OPS.transform: 39246 this.stateManager.transform(args); 39247 break; 39248 } 39249 } 39250} 39251 39252;// ./src/core/default_appearance.js 39253 39254 39255 39256 39257 39258 39259 39260 39261 39262 39263 39264 39265 39266 39267 39268class DefaultAppearanceEvaluator extends EvaluatorPreprocessor { 39269 constructor(str) { 39270 super(new StringStream(str)); 39271 } 39272 parse() { 39273 const operation = { 39274 fn: 0, 39275 args: [] 39276 }; 39277 const result = { 39278 fontSize: 0, 39279 fontName: "", 39280 fontColor: new Uint8ClampedArray(3) 39281 }; 39282 try { 39283 while (true) { 39284 operation.args.length = 0; 39285 if (!this.read(operation)) { 39286 break; 39287 } 39288 if (this.savedStatesDepth !== 0) { 39289 continue; 39290 } 39291 const { 39292 fn, 39293 args 39294 } = operation; 39295 switch (fn | 0) { 39296 case OPS.setFont: 39297 const [fontName, fontSize] = args; 39298 if (fontName instanceof Name) { 39299 result.fontName = fontName.name; 39300 } 39301 if (typeof fontSize === "number" && fontSize > 0) { 39302 result.fontSize = fontSize; 39303 } 39304 break; 39305 case OPS.setFillRGBColor: 39306 ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); 39307 break; 39308 case OPS.setFillGray: 39309 ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); 39310 break; 39311 case OPS.setFillCMYKColor: 39312 ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); 39313 break; 39314 } 39315 } 39316 } catch (reason) { 39317 warn(`parseDefaultAppearance - ignoring errors: "${reason}".`); 39318 } 39319 return result; 39320 } 39321} 39322function parseDefaultAppearance(str) { 39323 return new DefaultAppearanceEvaluator(str).parse(); 39324} 39325class AppearanceStreamEvaluator extends EvaluatorPreprocessor { 39326 constructor(stream, evaluatorOptions, xref) { 39327 super(stream); 39328 this.stream = stream; 39329 this.evaluatorOptions = evaluatorOptions; 39330 this.xref = xref; 39331 this.resources = stream.dict?.get("Resources"); 39332 } 39333 parse() { 39334 const operation = { 39335 fn: 0, 39336 args: [] 39337 }; 39338 let result = { 39339 scaleFactor: 1, 39340 fontSize: 0, 39341 fontName: "", 39342 fontColor: new Uint8ClampedArray(3), 39343 fillColorSpace: ColorSpace.singletons.gray 39344 }; 39345 let breakLoop = false;
vendor: 70,986 bytes, lines 39346-42112
39346 const stack = []; 39347 try { 39348 while (true) { 39349 operation.args.length = 0; 39350 if (breakLoop || !this.read(operation)) { 39351 break; 39352 } 39353 const { 39354 fn, 39355 args 39356 } = operation; 39357 switch (fn | 0) { 39358 case OPS.save: 39359 stack.push({ 39360 scaleFactor: result.scaleFactor, 39361 fontSize: result.fontSize, 39362 fontName: result.fontName, 39363 fontColor: result.fontColor.slice(), 39364 fillColorSpace: result.fillColorSpace 39365 }); 39366 break; 39367 case OPS.restore: 39368 result = stack.pop() || result; 39369 break; 39370 case OPS.setTextMatrix: 39371 result.scaleFactor *= Math.hypot(args[0], args[1]); 39372 break; 39373 case OPS.setFont: 39374 const [fontName, fontSize] = args; 39375 if (fontName instanceof Name) { 39376 result.fontName = fontName.name; 39377 } 39378 if (typeof fontSize === "number" && fontSize > 0) { 39379 result.fontSize = fontSize * result.scaleFactor; 39380 } 39381 break; 39382 case OPS.setFillColorSpace: 39383 result.fillColorSpace = ColorSpace.parse({ 39384 cs: args[0], 39385 xref: this.xref, 39386 resources: this.resources, 39387 pdfFunctionFactory: this._pdfFunctionFactory, 39388 localColorSpaceCache: this._localColorSpaceCache 39389 }); 39390 break; 39391 case OPS.setFillColor: 39392 const cs = result.fillColorSpace; 39393 cs.getRgbItem(args, 0, result.fontColor, 0); 39394 break; 39395 case OPS.setFillRGBColor: 39396 ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); 39397 break; 39398 case OPS.setFillGray: 39399 ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); 39400 break; 39401 case OPS.setFillCMYKColor: 39402 ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); 39403 break; 39404 case OPS.showText: 39405 case OPS.showSpacedText: 39406 case OPS.nextLineShowText: 39407 case OPS.nextLineSetSpacingShowText: 39408 breakLoop = true; 39409 break; 39410 } 39411 } 39412 } catch (reason) { 39413 warn(`parseAppearanceStream - ignoring errors: "${reason}".`); 39414 } 39415 this.stream.reset(); 39416 delete result.scaleFactor; 39417 delete result.fillColorSpace; 39418 return result; 39419 } 39420 get _localColorSpaceCache() { 39421 return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache()); 39422 } 39423 get _pdfFunctionFactory() { 39424 const pdfFunctionFactory = new PDFFunctionFactory({ 39425 xref: this.xref, 39426 isEvalSupported: this.evaluatorOptions.isEvalSupported 39427 }); 39428 return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); 39429 } 39430} 39431function parseAppearanceStream(stream, evaluatorOptions, xref) { 39432 return new AppearanceStreamEvaluator(stream, evaluatorOptions, xref).parse(); 39433} 39434function getPdfColor(color, isFill) { 39435 if (color[0] === color[1] && color[1] === color[2]) { 39436 const gray = color[0] / 255; 39437 return `${numberToString(gray)} ${isFill ? "g" : "G"}`; 39438 } 39439 return Array.from(color, c => numberToString(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`; 39440} 39441function createDefaultAppearance({ 39442 fontSize, 39443 fontName, 39444 fontColor 39445}) { 39446 return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; 39447} 39448class FakeUnicodeFont { 39449 constructor(xref, fontFamily) { 39450 this.xref = xref; 39451 this.widths = null; 39452 this.firstChar = Infinity; 39453 this.lastChar = -Infinity; 39454 this.fontFamily = fontFamily; 39455 const canvas = new OffscreenCanvas(1, 1); 39456 this.ctxMeasure = canvas.getContext("2d", { 39457 willReadFrequently: true 39458 }); 39459 if (!FakeUnicodeFont._fontNameId) { 39460 FakeUnicodeFont._fontNameId = 1; 39461 } 39462 this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`); 39463 } 39464 get fontDescriptorRef() { 39465 if (!FakeUnicodeFont._fontDescriptorRef) { 39466 const fontDescriptor = new Dict(this.xref); 39467 fontDescriptor.set("Type", Name.get("FontDescriptor")); 39468 fontDescriptor.set("FontName", this.fontName); 39469 fontDescriptor.set("FontFamily", "MyriadPro Regular"); 39470 fontDescriptor.set("FontBBox", [0, 0, 0, 0]); 39471 fontDescriptor.set("FontStretch", Name.get("Normal")); 39472 fontDescriptor.set("FontWeight", 400); 39473 fontDescriptor.set("ItalicAngle", 0); 39474 FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor); 39475 } 39476 return FakeUnicodeFont._fontDescriptorRef; 39477 } 39478 get descendantFontRef() { 39479 const descendantFont = new Dict(this.xref); 39480 descendantFont.set("BaseFont", this.fontName); 39481 descendantFont.set("Type", Name.get("Font")); 39482 descendantFont.set("Subtype", Name.get("CIDFontType0")); 39483 descendantFont.set("CIDToGIDMap", Name.get("Identity")); 39484 descendantFont.set("FirstChar", this.firstChar); 39485 descendantFont.set("LastChar", this.lastChar); 39486 descendantFont.set("FontDescriptor", this.fontDescriptorRef); 39487 descendantFont.set("DW", 1000); 39488 const widths = []; 39489 const chars = [...this.widths.entries()].sort(); 39490 let currentChar = null; 39491 let currentWidths = null; 39492 for (const [char, width] of chars) { 39493 if (!currentChar) { 39494 currentChar = char; 39495 currentWidths = [width]; 39496 continue; 39497 } 39498 if (char === currentChar + currentWidths.length) { 39499 currentWidths.push(width); 39500 } else { 39501 widths.push(currentChar, currentWidths); 39502 currentChar = char; 39503 currentWidths = [width]; 39504 } 39505 } 39506 if (currentChar) { 39507 widths.push(currentChar, currentWidths); 39508 } 39509 descendantFont.set("W", widths); 39510 const cidSystemInfo = new Dict(this.xref); 39511 cidSystemInfo.set("Ordering", "Identity"); 39512 cidSystemInfo.set("Registry", "Adobe"); 39513 cidSystemInfo.set("Supplement", 0); 39514 descendantFont.set("CIDSystemInfo", cidSystemInfo); 39515 return this.xref.getNewPersistentRef(descendantFont); 39516 } 39517 get baseFontRef() { 39518 const baseFont = new Dict(this.xref); 39519 baseFont.set("BaseFont", this.fontName); 39520 baseFont.set("Type", Name.get("Font")); 39521 baseFont.set("Subtype", Name.get("Type0")); 39522 baseFont.set("Encoding", Name.get("Identity-H")); 39523 baseFont.set("DescendantFonts", [this.descendantFontRef]); 39524 baseFont.set("ToUnicode", Name.get("Identity-H")); 39525 return this.xref.getNewPersistentRef(baseFont); 39526 } 39527 get resources() { 39528 const resources = new Dict(this.xref); 39529 const font = new Dict(this.xref); 39530 font.set(this.fontName.name, this.baseFontRef); 39531 resources.set("Font", font); 39532 return resources; 39533 } 39534 _createContext() { 39535 this.widths = new Map(); 39536 this.ctxMeasure.font = `1000px ${this.fontFamily}`; 39537 return this.ctxMeasure; 39538 } 39539 createFontResources(text) { 39540 const ctx = this._createContext(); 39541 for (const line of text.split(/\r\n?|\n/)) { 39542 for (const char of line.split("")) { 39543 const code = char.charCodeAt(0); 39544 if (this.widths.has(code)) { 39545 continue; 39546 } 39547 const metrics = ctx.measureText(char); 39548 const width = Math.ceil(metrics.width); 39549 this.widths.set(code, width); 39550 this.firstChar = Math.min(code, this.firstChar); 39551 this.lastChar = Math.max(code, this.lastChar); 39552 } 39553 } 39554 return this.resources; 39555 } 39556 static getFirstPositionInfo(rect, rotation, fontSize) { 39557 const [x1, y1, x2, y2] = rect; 39558 let w = x2 - x1; 39559 let h = y2 - y1; 39560 if (rotation % 180 !== 0) { 39561 [w, h] = [h, w]; 39562 } 39563 const lineHeight = LINE_FACTOR * fontSize; 39564 const lineDescent = LINE_DESCENT_FACTOR * fontSize; 39565 return { 39566 coords: [0, h + lineDescent - lineHeight], 39567 bbox: [0, 0, w, h], 39568 matrix: rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined 39569 }; 39570 } 39571 createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) { 39572 const ctx = this._createContext(); 39573 const lines = []; 39574 let maxWidth = -Infinity; 39575 for (const line of text.split(/\r\n?|\n/)) { 39576 lines.push(line); 39577 const lineWidth = ctx.measureText(line).width; 39578 maxWidth = Math.max(maxWidth, lineWidth); 39579 for (const code of codePointIter(line)) { 39580 const char = String.fromCodePoint(code); 39581 let width = this.widths.get(code); 39582 if (width === undefined) { 39583 const metrics = ctx.measureText(char); 39584 width = Math.ceil(metrics.width); 39585 this.widths.set(code, width); 39586 this.firstChar = Math.min(code, this.firstChar); 39587 this.lastChar = Math.max(code, this.lastChar); 39588 } 39589 } 39590 } 39591 maxWidth *= fontSize / 1000; 39592 const [x1, y1, x2, y2] = rect; 39593 let w = x2 - x1; 39594 let h = y2 - y1; 39595 if (rotation % 180 !== 0) { 39596 [w, h] = [h, w]; 39597 } 39598 let hscale = 1; 39599 if (maxWidth > w) { 39600 hscale = w / maxWidth; 39601 } 39602 let vscale = 1; 39603 const lineHeight = LINE_FACTOR * fontSize; 39604 const lineDescent = LINE_DESCENT_FACTOR * fontSize; 39605 const maxHeight = lineHeight * lines.length; 39606 if (maxHeight > h) { 39607 vscale = h / maxHeight; 39608 } 39609 const fscale = Math.min(hscale, vscale); 39610 const newFontSize = fontSize * fscale; 39611 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`]; 39612 const { 39613 resources 39614 } = this; 39615 strokeAlpha = typeof strokeAlpha === "number" && strokeAlpha >= 0 && strokeAlpha <= 1 ? strokeAlpha : 1; 39616 if (strokeAlpha !== 1) { 39617 buffer.push("/R0 gs"); 39618 const extGState = new Dict(this.xref); 39619 const r0 = new Dict(this.xref); 39620 r0.set("ca", strokeAlpha); 39621 r0.set("CA", strokeAlpha); 39622 r0.set("Type", Name.get("ExtGState")); 39623 extGState.set("R0", r0); 39624 resources.set("ExtGState", extGState); 39625 } 39626 const vShift = numberToString(lineHeight); 39627 for (const line of lines) { 39628 buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`); 39629 } 39630 buffer.push("ET", "Q"); 39631 const appearance = buffer.join("\n"); 39632 const appearanceStreamDict = new Dict(this.xref); 39633 appearanceStreamDict.set("Subtype", Name.get("Form")); 39634 appearanceStreamDict.set("Type", Name.get("XObject")); 39635 appearanceStreamDict.set("BBox", [0, 0, w, h]); 39636 appearanceStreamDict.set("Length", appearance.length); 39637 appearanceStreamDict.set("Resources", resources); 39638 if (rotation) { 39639 const matrix = getRotationMatrix(rotation, w, h); 39640 appearanceStreamDict.set("Matrix", matrix); 39641 } 39642 const ap = new StringStream(appearance); 39643 ap.dict = appearanceStreamDict; 39644 return ap; 39645 } 39646} 39647 39648;// ./src/core/name_number_tree.js 39649 39650 39651 39652class NameOrNumberTree { 39653 constructor(root, xref, type) { 39654 this.root = root; 39655 this.xref = xref; 39656 this._type = type; 39657 } 39658 getAll() { 39659 const map = new Map(); 39660 if (!this.root) { 39661 return map; 39662 } 39663 const xref = this.xref; 39664 const processed = new RefSet(); 39665 processed.put(this.root); 39666 const queue = [this.root]; 39667 while (queue.length > 0) { 39668 const obj = xref.fetchIfRef(queue.shift()); 39669 if (!(obj instanceof Dict)) { 39670 continue; 39671 } 39672 if (obj.has("Kids")) { 39673 const kids = obj.get("Kids"); 39674 if (!Array.isArray(kids)) { 39675 continue; 39676 } 39677 for (const kid of kids) { 39678 if (processed.has(kid)) { 39679 throw new FormatError(`Duplicate entry in "${this._type}" tree.`); 39680 } 39681 queue.push(kid); 39682 processed.put(kid); 39683 } 39684 continue; 39685 } 39686 const entries = obj.get(this._type); 39687 if (!Array.isArray(entries)) { 39688 continue; 39689 } 39690 for (let i = 0, ii = entries.length; i < ii; i += 2) { 39691 map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); 39692 } 39693 } 39694 return map; 39695 } 39696 getRaw(key) { 39697 if (!this.root) { 39698 return null; 39699 } 39700 const xref = this.xref; 39701 let kidsOrEntries = xref.fetchIfRef(this.root); 39702 let loopCount = 0; 39703 const MAX_LEVELS = 10; 39704 while (kidsOrEntries.has("Kids")) { 39705 if (++loopCount > MAX_LEVELS) { 39706 warn(`Search depth limit reached for "${this._type}" tree.`); 39707 return null; 39708 } 39709 const kids = kidsOrEntries.get("Kids"); 39710 if (!Array.isArray(kids)) { 39711 return null; 39712 } 39713 let l = 0, 39714 r = kids.length - 1; 39715 while (l <= r) { 39716 const m = l + r >> 1; 39717 const kid = xref.fetchIfRef(kids[m]); 39718 const limits = kid.get("Limits"); 39719 if (key < xref.fetchIfRef(limits[0])) { 39720 r = m - 1; 39721 } else if (key > xref.fetchIfRef(limits[1])) { 39722 l = m + 1; 39723 } else { 39724 kidsOrEntries = kid; 39725 break; 39726 } 39727 } 39728 if (l > r) { 39729 return null; 39730 } 39731 } 39732 const entries = kidsOrEntries.get(this._type); 39733 if (Array.isArray(entries)) { 39734 let l = 0, 39735 r = entries.length - 2; 39736 while (l <= r) { 39737 const tmp = l + r >> 1, 39738 m = tmp + (tmp & 1); 39739 const currentKey = xref.fetchIfRef(entries[m]); 39740 if (key < currentKey) { 39741 r = m - 2; 39742 } else if (key > currentKey) { 39743 l = m + 2; 39744 } else { 39745 return entries[m + 1]; 39746 } 39747 } 39748 } 39749 return null; 39750 } 39751 get(key) { 39752 return this.xref.fetchIfRef(this.getRaw(key)); 39753 } 39754} 39755class NameTree extends NameOrNumberTree { 39756 constructor(root, xref) { 39757 super(root, xref, "Names"); 39758 } 39759} 39760class NumberTree extends NameOrNumberTree { 39761 constructor(root, xref) { 39762 super(root, xref, "Nums"); 39763 } 39764} 39765 39766;// ./src/core/cleanup_helper.js 39767 39768 39769 39770 39771function clearGlobalCaches() { 39772 clearPatternCaches(); 39773 clearPrimitiveCaches(); 39774 clearUnicodeCaches(); 39775 JpxImage.cleanup(); 39776} 39777 39778;// ./src/core/file_spec.js 39779 39780 39781 39782function pickPlatformItem(dict) { 39783 if (!(dict instanceof Dict)) { 39784 return null; 39785 } 39786 if (dict.has("UF")) { 39787 return dict.get("UF"); 39788 } else if (dict.has("F")) { 39789 return dict.get("F"); 39790 } else if (dict.has("Unix")) { 39791 return dict.get("Unix"); 39792 } else if (dict.has("Mac")) { 39793 return dict.get("Mac"); 39794 } else if (dict.has("DOS")) { 39795 return dict.get("DOS"); 39796 } 39797 return null; 39798} 39799function stripPath(str) { 39800 return str.substring(str.lastIndexOf("/") + 1); 39801} 39802class FileSpec { 39803 #contentAvailable = false; 39804 constructor(root, xref, skipContent = false) { 39805 if (!(root instanceof Dict)) { 39806 return; 39807 } 39808 this.xref = xref; 39809 this.root = root; 39810 if (root.has("FS")) { 39811 this.fs = root.get("FS"); 39812 } 39813 if (root.has("RF")) { 39814 warn("Related file specifications are not supported"); 39815 } 39816 if (!skipContent) { 39817 if (root.has("EF")) { 39818 this.#contentAvailable = true; 39819 } else { 39820 warn("Non-embedded file specifications are not supported"); 39821 } 39822 } 39823 } 39824 get filename() { 39825 let filename = ""; 39826 const item = pickPlatformItem(this.root); 39827 if (item && typeof item === "string") { 39828 filename = stringToPDFString(item).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); 39829 } 39830 return shadow(this, "filename", filename || "unnamed"); 39831 } 39832 get content() { 39833 if (!this.#contentAvailable) { 39834 return null; 39835 } 39836 this._contentRef ||= pickPlatformItem(this.root?.get("EF")); 39837 let content = null; 39838 if (this._contentRef) { 39839 const fileObj = this.xref.fetchIfRef(this._contentRef); 39840 if (fileObj instanceof BaseStream) { 39841 content = fileObj.getBytes(); 39842 } else { 39843 warn("Embedded file specification points to non-existing/invalid content"); 39844 } 39845 } else { 39846 warn("Embedded file specification does not have any content"); 39847 } 39848 return content; 39849 } 39850 get description() { 39851 let description = ""; 39852 const desc = this.root?.get("Desc"); 39853 if (desc && typeof desc === "string") { 39854 description = stringToPDFString(desc); 39855 } 39856 return shadow(this, "description", description); 39857 } 39858 get serializable() { 39859 return { 39860 rawFilename: this.filename, 39861 filename: stripPath(this.filename), 39862 content: this.content, 39863 description: this.description 39864 }; 39865 } 39866} 39867 39868;// ./src/core/xml_parser.js 39869 39870 39871 39872const XMLParserErrorCode = { 39873 NoError: 0, 39874 EndOfDocument: -1, 39875 UnterminatedCdat: -2, 39876 UnterminatedXmlDeclaration: -3, 39877 UnterminatedDoctypeDeclaration: -4, 39878 UnterminatedComment: -5, 39879 MalformedElement: -6, 39880 OutOfMemory: -7, 39881 UnterminatedAttributeValue: -8, 39882 UnterminatedElement: -9, 39883 ElementNeverBegun: -10 39884}; 39885function isWhitespace(s, index) { 39886 const ch = s[index]; 39887 return ch === " " || ch === "\n" || ch === "\r" || ch === "\t"; 39888} 39889function isWhitespaceString(s) { 39890 for (let i = 0, ii = s.length; i < ii; i++) { 39891 if (!isWhitespace(s, i)) { 39892 return false; 39893 } 39894 } 39895 return true; 39896} 39897class XMLParserBase { 39898 _resolveEntities(s) { 39899 return s.replaceAll(/&([^;]+);/g, (all, entity) => { 39900 if (entity.substring(0, 2) === "#x") { 39901 return String.fromCodePoint(parseInt(entity.substring(2), 16)); 39902 } else if (entity.substring(0, 1) === "#") { 39903 return String.fromCodePoint(parseInt(entity.substring(1), 10)); 39904 } 39905 switch (entity) { 39906 case "lt": 39907 return "<"; 39908 case "gt": 39909 return ">"; 39910 case "amp": 39911 return "&"; 39912 case "quot": 39913 return '"'; 39914 case "apos": 39915 return "'"; 39916 } 39917 return this.onResolveEntity(entity); 39918 }); 39919 } 39920 _parseContent(s, start) { 39921 const attributes = []; 39922 let pos = start; 39923 function skipWs() { 39924 while (pos < s.length && isWhitespace(s, pos)) { 39925 ++pos; 39926 } 39927 } 39928 while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") { 39929 ++pos; 39930 } 39931 const name = s.substring(start, pos); 39932 skipWs(); 39933 while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") { 39934 skipWs(); 39935 let attrName = "", 39936 attrValue = ""; 39937 while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") { 39938 attrName += s[pos]; 39939 ++pos; 39940 } 39941 skipWs(); 39942 if (s[pos] !== "=") { 39943 return null; 39944 } 39945 ++pos; 39946 skipWs(); 39947 const attrEndChar = s[pos]; 39948 if (attrEndChar !== '"' && attrEndChar !== "'") { 39949 return null; 39950 } 39951 const attrEndIndex = s.indexOf(attrEndChar, ++pos); 39952 if (attrEndIndex < 0) { 39953 return null; 39954 } 39955 attrValue = s.substring(pos, attrEndIndex); 39956 attributes.push({ 39957 name: attrName, 39958 value: this._resolveEntities(attrValue) 39959 }); 39960 pos = attrEndIndex + 1; 39961 skipWs(); 39962 } 39963 return { 39964 name, 39965 attributes, 39966 parsed: pos - start 39967 }; 39968 } 39969 _parseProcessingInstruction(s, start) { 39970 let pos = start; 39971 function skipWs() { 39972 while (pos < s.length && isWhitespace(s, pos)) { 39973 ++pos; 39974 } 39975 } 39976 while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") { 39977 ++pos; 39978 } 39979 const name = s.substring(start, pos); 39980 skipWs(); 39981 const attrStart = pos; 39982 while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) { 39983 ++pos; 39984 } 39985 const value = s.substring(attrStart, pos); 39986 return { 39987 name, 39988 value, 39989 parsed: pos - start 39990 }; 39991 } 39992 parseXml(s) { 39993 let i = 0; 39994 while (i < s.length) { 39995 const ch = s[i]; 39996 let j = i; 39997 if (ch === "<") { 39998 ++j; 39999 const ch2 = s[j]; 40000 let q; 40001 switch (ch2) { 40002 case "/": 40003 ++j; 40004 q = s.indexOf(">", j); 40005 if (q < 0) { 40006 this.onError(XMLParserErrorCode.UnterminatedElement); 40007 return; 40008 } 40009 this.onEndElement(s.substring(j, q)); 40010 j = q + 1; 40011 break; 40012 case "?": 40013 ++j; 40014 const pi = this._parseProcessingInstruction(s, j); 40015 if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") { 40016 this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration); 40017 return; 40018 } 40019 this.onPi(pi.name, pi.value); 40020 j += pi.parsed + 2; 40021 break; 40022 case "!": 40023 if (s.substring(j + 1, j + 3) === "--") { 40024 q = s.indexOf("-->", j + 3); 40025 if (q < 0) { 40026 this.onError(XMLParserErrorCode.UnterminatedComment); 40027 return; 40028 } 40029 this.onComment(s.substring(j + 3, q)); 40030 j = q + 3; 40031 } else if (s.substring(j + 1, j + 8) === "[CDATA[") { 40032 q = s.indexOf("]]>", j + 8); 40033 if (q < 0) { 40034 this.onError(XMLParserErrorCode.UnterminatedCdat); 40035 return; 40036 } 40037 this.onCdata(s.substring(j + 8, q)); 40038 j = q + 3; 40039 } else if (s.substring(j + 1, j + 8) === "DOCTYPE") { 40040 const q2 = s.indexOf("[", j + 8); 40041 let complexDoctype = false; 40042 q = s.indexOf(">", j + 8); 40043 if (q < 0) { 40044 this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); 40045 return; 40046 } 40047 if (q2 > 0 && q > q2) { 40048 q = s.indexOf("]>", j + 8); 40049 if (q < 0) { 40050 this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); 40051 return; 40052 } 40053 complexDoctype = true; 40054 } 40055 const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); 40056 this.onDoctype(doctypeContent); 40057 j = q + (complexDoctype ? 2 : 1); 40058 } else { 40059 this.onError(XMLParserErrorCode.MalformedElement); 40060 return; 40061 } 40062 break; 40063 default: 40064 const content = this._parseContent(s, j); 40065 if (content === null) { 40066 this.onError(XMLParserErrorCode.MalformedElement); 40067 return; 40068 } 40069 let isClosed = false; 40070 if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { 40071 isClosed = true; 40072 } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { 40073 this.onError(XMLParserErrorCode.UnterminatedElement); 40074 return; 40075 } 40076 this.onBeginElement(content.name, content.attributes, isClosed); 40077 j += content.parsed + (isClosed ? 2 : 1); 40078 break; 40079 } 40080 } else { 40081 while (j < s.length && s[j] !== "<") { 40082 j++; 40083 } 40084 const text = s.substring(i, j); 40085 this.onText(this._resolveEntities(text)); 40086 } 40087 i = j; 40088 } 40089 } 40090 onResolveEntity(name) { 40091 return `&${name};`; 40092 } 40093 onPi(name, value) {} 40094 onComment(text) {} 40095 onCdata(text) {} 40096 onDoctype(doctypeContent) {} 40097 onText(text) {} 40098 onBeginElement(name, attributes, isEmpty) {} 40099 onEndElement(name) {} 40100 onError(code) {} 40101} 40102class SimpleDOMNode { 40103 constructor(nodeName, nodeValue) { 40104 this.nodeName = nodeName; 40105 this.nodeValue = nodeValue; 40106 Object.defineProperty(this, "parentNode", { 40107 value: null, 40108 writable: true 40109 }); 40110 } 40111 get firstChild() { 40112 return this.childNodes?.[0]; 40113 } 40114 get nextSibling() { 40115 const childNodes = this.parentNode.childNodes; 40116 if (!childNodes) { 40117 return undefined; 40118 } 40119 const index = childNodes.indexOf(this); 40120 if (index === -1) { 40121 return undefined; 40122 } 40123 return childNodes[index + 1]; 40124 } 40125 get textContent() { 40126 if (!this.childNodes) { 40127 return this.nodeValue || ""; 40128 } 40129 return this.childNodes.map(function (child) { 40130 return child.textContent; 40131 }).join(""); 40132 } 40133 get children() { 40134 return this.childNodes || []; 40135 } 40136 hasChildNodes() { 40137 return this.childNodes?.length > 0; 40138 } 40139 searchNode(paths, pos) { 40140 if (pos >= paths.length) { 40141 return this; 40142 } 40143 const component = paths[pos]; 40144 if (component.name.startsWith("#") && pos < paths.length - 1) { 40145 return this.searchNode(paths, pos + 1); 40146 } 40147 const stack = []; 40148 let node = this; 40149 while (true) { 40150 if (component.name === node.nodeName) { 40151 if (component.pos === 0) { 40152 const res = node.searchNode(paths, pos + 1); 40153 if (res !== null) { 40154 return res; 40155 } 40156 } else if (stack.length === 0) { 40157 return null; 40158 } else { 40159 const [parent] = stack.pop(); 40160 let siblingPos = 0; 40161 for (const child of parent.childNodes) { 40162 if (component.name === child.nodeName) { 40163 if (siblingPos === component.pos) { 40164 return child.searchNode(paths, pos + 1); 40165 } 40166 siblingPos++; 40167 } 40168 } 40169 return node.searchNode(paths, pos + 1); 40170 } 40171 } 40172 if (node.childNodes?.length > 0) { 40173 stack.push([node, 0]); 40174 node = node.childNodes[0]; 40175 } else if (stack.length === 0) { 40176 return null; 40177 } else { 40178 while (stack.length !== 0) { 40179 const [parent, currentPos] = stack.pop(); 40180 const newPos = currentPos + 1; 40181 if (newPos < parent.childNodes.length) { 40182 stack.push([parent, newPos]); 40183 node = parent.childNodes[newPos]; 40184 break; 40185 } 40186 } 40187 if (stack.length === 0) { 40188 return null; 40189 } 40190 } 40191 } 40192 } 40193 dump(buffer) { 40194 if (this.nodeName === "#text") { 40195 buffer.push(encodeToXmlString(this.nodeValue)); 40196 return; 40197 } 40198 buffer.push(`<${this.nodeName}`); 40199 if (this.attributes) { 40200 for (const attribute of this.attributes) { 40201 buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`); 40202 } 40203 } 40204 if (this.hasChildNodes()) { 40205 buffer.push(">"); 40206 for (const child of this.childNodes) { 40207 child.dump(buffer); 40208 } 40209 buffer.push(`</${this.nodeName}>`); 40210 } else if (this.nodeValue) { 40211 buffer.push(`>${encodeToXmlString(this.nodeValue)}</${this.nodeName}>`); 40212 } else { 40213 buffer.push("/>"); 40214 } 40215 } 40216} 40217class SimpleXMLParser extends XMLParserBase { 40218 constructor({ 40219 hasAttributes = false, 40220 lowerCaseName = false 40221 }) { 40222 super(); 40223 this._currentFragment = null; 40224 this._stack = null; 40225 this._errorCode = XMLParserErrorCode.NoError; 40226 this._hasAttributes = hasAttributes; 40227 this._lowerCaseName = lowerCaseName; 40228 } 40229 parseFromString(data) { 40230 this._currentFragment = []; 40231 this._stack = []; 40232 this._errorCode = XMLParserErrorCode.NoError; 40233 this.parseXml(data); 40234 if (this._errorCode !== XMLParserErrorCode.NoError) { 40235 return undefined; 40236 } 40237 const [documentElement] = this._currentFragment; 40238 if (!documentElement) { 40239 return undefined; 40240 } 40241 return { 40242 documentElement 40243 }; 40244 } 40245 onText(text) { 40246 if (isWhitespaceString(text)) { 40247 return; 40248 } 40249 const node = new SimpleDOMNode("#text", text); 40250 this._currentFragment.push(node); 40251 } 40252 onCdata(text) { 40253 const node = new SimpleDOMNode("#text", text); 40254 this._currentFragment.push(node); 40255 } 40256 onBeginElement(name, attributes, isEmpty) { 40257 if (this._lowerCaseName) { 40258 name = name.toLowerCase(); 40259 } 40260 const node = new SimpleDOMNode(name); 40261 node.childNodes = []; 40262 if (this._hasAttributes) { 40263 node.attributes = attributes; 40264 } 40265 this._currentFragment.push(node); 40266 if (isEmpty) { 40267 return; 40268 } 40269 this._stack.push(this._currentFragment); 40270 this._currentFragment = node.childNodes; 40271 } 40272 onEndElement(name) { 40273 this._currentFragment = this._stack.pop() || []; 40274 const lastElement = this._currentFragment.at(-1); 40275 if (!lastElement) { 40276 return null; 40277 } 40278 for (const childNode of lastElement.childNodes) { 40279 childNode.parentNode = lastElement; 40280 } 40281 return lastElement; 40282 } 40283 onError(code) { 40284 this._errorCode = code; 40285 } 40286} 40287 40288;// ./src/core/metadata_parser.js 40289 40290 40291 40292 40293 40294class MetadataParser { 40295 constructor(data) { 40296 data = this._repair(data); 40297 const parser = new SimpleXMLParser({ 40298 lowerCaseName: true 40299 }); 40300 const xmlDocument = parser.parseFromString(data); 40301 this._metadataMap = new Map(); 40302 this._data = data; 40303 if (xmlDocument) { 40304 this._parse(xmlDocument); 40305 } 40306 } 40307 _repair(data) { 40308 return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { 40309 const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { 40310 return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); 40311 }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) { 40312 switch (name) { 40313 case "amp": 40314 return "&"; 40315 case "apos": 40316 return "'"; 40317 case "gt": 40318 return ">"; 40319 case "lt": 40320 return "<"; 40321 case "quot": 40322 return '"'; 40323 } 40324 throw new Error(`_repair: ${name} isn't defined.`); 40325 }); 40326 const charBuf = [">"]; 40327 for (let i = 0, ii = bytes.length; i < ii; i += 2) { 40328 const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); 40329 if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) { 40330 charBuf.push(String.fromCharCode(code)); 40331 } else { 40332 charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";"); 40333 } 40334 } 40335 return charBuf.join(""); 40336 }); 40337 } 40338 _getSequence(entry) { 40339 const name = entry.nodeName; 40340 if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { 40341 return null; 40342 } 40343 return entry.childNodes.filter(node => node.nodeName === "rdf:li"); 40344 } 40345 _parseArray(entry) { 40346 if (!entry.hasChildNodes()) { 40347 return; 40348 } 40349 const [seqNode] = entry.childNodes; 40350 const sequence = this._getSequence(seqNode) || []; 40351 this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); 40352 } 40353 _parse(xmlDocument) { 40354 let rdf = xmlDocument.documentElement; 40355 if (rdf.nodeName !== "rdf:rdf") { 40356 rdf = rdf.firstChild; 40357 while (rdf && rdf.nodeName !== "rdf:rdf") { 40358 rdf = rdf.nextSibling; 40359 } 40360 } 40361 if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { 40362 return; 40363 } 40364 for (const desc of rdf.childNodes) { 40365 if (desc.nodeName !== "rdf:description") { 40366 continue; 40367 } 40368 for (const entry of desc.childNodes) { 40369 const name = entry.nodeName; 40370 switch (name) { 40371 case "#text": 40372 continue; 40373 case "dc:creator": 40374 case "dc:subject": 40375 this._parseArray(entry); 40376 continue; 40377 } 40378 this._metadataMap.set(name, entry.textContent.trim()); 40379 } 40380 } 40381 } 40382 get serializable() { 40383 return { 40384 parsedData: this._metadataMap, 40385 rawData: this._data 40386 }; 40387 } 40388} 40389 40390;// ./src/core/struct_tree.js 40391 40392 40393 40394 40395 40396const MAX_DEPTH = 40; 40397const StructElementType = { 40398 PAGE_CONTENT: 1, 40399 STREAM_CONTENT: 2, 40400 OBJECT: 3, 40401 ANNOTATION: 4, 40402 ELEMENT: 5 40403}; 40404class StructTreeRoot { 40405 constructor(rootDict, rootRef) { 40406 this.dict = rootDict; 40407 this.ref = rootRef instanceof Ref ? rootRef : null; 40408 this.roleMap = new Map(); 40409 this.structParentIds = null; 40410 } 40411 init() { 40412 this.readRoleMap(); 40413 } 40414 #addIdToPage(pageRef, id, type) { 40415 if (!(pageRef instanceof Ref) || id < 0) { 40416 return; 40417 } 40418 this.structParentIds ||= new RefSetCache(); 40419 let ids = this.structParentIds.get(pageRef); 40420 if (!ids) { 40421 ids = []; 40422 this.structParentIds.put(pageRef, ids); 40423 } 40424 ids.push([id, type]); 40425 } 40426 addAnnotationIdToPage(pageRef, id) { 40427 this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION); 40428 } 40429 readRoleMap() { 40430 const roleMapDict = this.dict.get("RoleMap"); 40431 if (!(roleMapDict instanceof Dict)) { 40432 return; 40433 } 40434 for (const [key, value] of roleMapDict) { 40435 if (value instanceof Name) { 40436 this.roleMap.set(key, value.name); 40437 } 40438 } 40439 } 40440 static async canCreateStructureTree({ 40441 catalogRef, 40442 pdfManager, 40443 newAnnotationsByPage 40444 }) { 40445 if (!(catalogRef instanceof Ref)) { 40446 warn("Cannot save the struct tree: no catalog reference."); 40447 return false; 40448 } 40449 let nextKey = 0; 40450 let hasNothingToUpdate = true; 40451 for (const [pageIndex, elements] of newAnnotationsByPage) { 40452 const { 40453 ref: pageRef 40454 } = await pdfManager.getPage(pageIndex); 40455 if (!(pageRef instanceof Ref)) { 40456 warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`); 40457 hasNothingToUpdate = true; 40458 break; 40459 } 40460 for (const element of elements) { 40461 if (element.accessibilityData?.type) { 40462 element.parentTreeId = nextKey++; 40463 hasNothingToUpdate = false; 40464 } 40465 } 40466 } 40467 if (hasNothingToUpdate) { 40468 for (const elements of newAnnotationsByPage.values()) { 40469 for (const element of elements) { 40470 delete element.parentTreeId; 40471 } 40472 } 40473 return false; 40474 } 40475 return true; 40476 } 40477 static async createStructureTree({ 40478 newAnnotationsByPage, 40479 xref, 40480 catalogRef, 40481 pdfManager, 40482 changes 40483 }) { 40484 const root = pdfManager.catalog.cloneDict(); 40485 const cache = new RefSetCache(); 40486 cache.put(catalogRef, root); 40487 const structTreeRootRef = xref.getNewTemporaryRef(); 40488 root.set("StructTreeRoot", structTreeRootRef); 40489 const structTreeRoot = new Dict(xref); 40490 structTreeRoot.set("Type", Name.get("StructTreeRoot")); 40491 const parentTreeRef = xref.getNewTemporaryRef(); 40492 structTreeRoot.set("ParentTree", parentTreeRef); 40493 const kids = []; 40494 structTreeRoot.set("K", kids); 40495 cache.put(structTreeRootRef, structTreeRoot); 40496 const parentTree = new Dict(xref); 40497 const nums = []; 40498 parentTree.set("Nums", nums); 40499 const nextKey = await this.#writeKids({ 40500 newAnnotationsByPage, 40501 structTreeRootRef, 40502 structTreeRoot: null, 40503 kids, 40504 nums, 40505 xref, 40506 pdfManager, 40507 changes, 40508 cache 40509 }); 40510 structTreeRoot.set("ParentTreeNextKey", nextKey); 40511 cache.put(parentTreeRef, parentTree); 40512 for (const [ref, obj] of cache.items()) { 40513 changes.put(ref, { 40514 data: obj 40515 }); 40516 } 40517 } 40518 async canUpdateStructTree({ 40519 pdfManager, 40520 xref, 40521 newAnnotationsByPage 40522 }) { 40523 if (!this.ref) { 40524 warn("Cannot update the struct tree: no root reference."); 40525 return false; 40526 } 40527 let nextKey = this.dict.get("ParentTreeNextKey"); 40528 if (!Number.isInteger(nextKey) || nextKey < 0) { 40529 warn("Cannot update the struct tree: invalid next key."); 40530 return false; 40531 } 40532 const parentTree = this.dict.get("ParentTree"); 40533 if (!(parentTree instanceof Dict)) { 40534 warn("Cannot update the struct tree: ParentTree isn't a dict."); 40535 return false; 40536 } 40537 const nums = parentTree.get("Nums"); 40538 if (!Array.isArray(nums)) { 40539 warn("Cannot update the struct tree: nums isn't an array."); 40540 return false; 40541 } 40542 const numberTree = new NumberTree(parentTree, xref); 40543 for (const pageIndex of newAnnotationsByPage.keys()) { 40544 const { 40545 pageDict 40546 } = await pdfManager.getPage(pageIndex); 40547 if (!pageDict.has("StructParents")) { 40548 continue; 40549 } 40550 const id = pageDict.get("StructParents"); 40551 if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) { 40552 warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`); 40553 return false; 40554 } 40555 } 40556 let hasNothingToUpdate = true; 40557 for (const [pageIndex, elements] of newAnnotationsByPage) { 40558 const { 40559 pageDict 40560 } = await pdfManager.getPage(pageIndex); 40561 StructTreeRoot.#collectParents({ 40562 elements, 40563 xref: this.dict.xref, 40564 pageDict, 40565 numberTree 40566 }); 40567 for (const element of elements) { 40568 if (element.accessibilityData?.type) { 40569 if (!(element.accessibilityData.structParent >= 0)) { 40570 element.parentTreeId = nextKey++; 40571 } 40572 hasNothingToUpdate = false; 40573 } 40574 } 40575 } 40576 if (hasNothingToUpdate) { 40577 for (const elements of newAnnotationsByPage.values()) { 40578 for (const element of elements) { 40579 delete element.parentTreeId; 40580 delete element.structTreeParent; 40581 } 40582 } 40583 return false; 40584 } 40585 return true; 40586 } 40587 async updateStructureTree({ 40588 newAnnotationsByPage, 40589 pdfManager, 40590 changes 40591 }) { 40592 const xref = this.dict.xref; 40593 const structTreeRoot = this.dict.clone(); 40594 const structTreeRootRef = this.ref; 40595 const cache = new RefSetCache(); 40596 cache.put(structTreeRootRef, structTreeRoot); 40597 let parentTreeRef = structTreeRoot.getRaw("ParentTree"); 40598 let parentTree; 40599 if (parentTreeRef instanceof Ref) { 40600 parentTree = xref.fetch(parentTreeRef); 40601 } else { 40602 parentTree = parentTreeRef; 40603 parentTreeRef = xref.getNewTemporaryRef(); 40604 structTreeRoot.set("ParentTree", parentTreeRef); 40605 } 40606 parentTree = parentTree.clone(); 40607 cache.put(parentTreeRef, parentTree); 40608 let nums = parentTree.getRaw("Nums"); 40609 let numsRef = null; 40610 if (nums instanceof Ref) { 40611 numsRef = nums; 40612 nums = xref.fetch(numsRef); 40613 } 40614 nums = nums.slice(); 40615 if (!numsRef) { 40616 parentTree.set("Nums", nums); 40617 } 40618 const newNextKey = await StructTreeRoot.#writeKids({ 40619 newAnnotationsByPage, 40620 structTreeRootRef, 40621 structTreeRoot: this, 40622 kids: null, 40623 nums, 40624 xref, 40625 pdfManager, 40626 changes, 40627 cache 40628 }); 40629 if (newNextKey === -1) { 40630 return; 40631 } 40632 structTreeRoot.set("ParentTreeNextKey", newNextKey); 40633 if (numsRef) { 40634 cache.put(numsRef, nums); 40635 } 40636 for (const [ref, obj] of cache.items()) { 40637 changes.put(ref, { 40638 data: obj 40639 }); 40640 } 40641 } 40642 static async #writeKids({ 40643 newAnnotationsByPage, 40644 structTreeRootRef, 40645 structTreeRoot, 40646 kids, 40647 nums, 40648 xref, 40649 pdfManager, 40650 changes, 40651 cache 40652 }) { 40653 const objr = Name.get("OBJR"); 40654 let nextKey = -1; 40655 let structTreePageObjs; 40656 for (const [pageIndex, elements] of newAnnotationsByPage) { 40657 const page = await pdfManager.getPage(pageIndex); 40658 const { 40659 ref: pageRef 40660 } = page; 40661 const isPageRef = pageRef instanceof Ref; 40662 for (const { 40663 accessibilityData, 40664 ref, 40665 parentTreeId, 40666 structTreeParent 40667 } of elements) { 40668 if (!accessibilityData?.type) { 40669 continue; 40670 } 40671 const { 40672 structParent 40673 } = accessibilityData; 40674 if (structTreeRoot && Number.isInteger(structParent) && structParent >= 0) { 40675 let objs = (structTreePageObjs ||= new Map()).get(pageIndex); 40676 if (objs === undefined) { 40677 const structTreePage = new StructTreePage(structTreeRoot, page.pageDict); 40678 objs = structTreePage.collectObjects(pageRef); 40679 structTreePageObjs.set(pageIndex, objs); 40680 } 40681 const objRef = objs?.get(structParent); 40682 if (objRef) { 40683 const tagDict = xref.fetch(objRef).clone(); 40684 StructTreeRoot.#writeProperties(tagDict, accessibilityData); 40685 changes.put(objRef, { 40686 data: tagDict 40687 }); 40688 continue; 40689 } 40690 } 40691 nextKey = Math.max(nextKey, parentTreeId); 40692 const tagRef = xref.getNewTemporaryRef(); 40693 const tagDict = new Dict(xref); 40694 StructTreeRoot.#writeProperties(tagDict, accessibilityData); 40695 await this.#updateParentTag({ 40696 structTreeParent, 40697 tagDict, 40698 newTagRef: tagRef, 40699 structTreeRootRef, 40700 fallbackKids: kids, 40701 xref, 40702 cache 40703 }); 40704 const objDict = new Dict(xref); 40705 tagDict.set("K", objDict); 40706 objDict.set("Type", objr); 40707 if (isPageRef) { 40708 objDict.set("Pg", pageRef); 40709 } 40710 objDict.set("Obj", ref); 40711 cache.put(tagRef, tagDict); 40712 nums.push(parentTreeId, tagRef); 40713 } 40714 } 40715 return nextKey + 1; 40716 } 40717 static #writeProperties(tagDict, { 40718 type, 40719 title, 40720 lang, 40721 alt, 40722 expanded, 40723 actualText 40724 }) { 40725 tagDict.set("S", Name.get(type)); 40726 if (title) { 40727 tagDict.set("T", stringToAsciiOrUTF16BE(title)); 40728 } 40729 if (lang) { 40730 tagDict.set("Lang", stringToAsciiOrUTF16BE(lang)); 40731 } 40732 if (alt) { 40733 tagDict.set("Alt", stringToAsciiOrUTF16BE(alt)); 40734 } 40735 if (expanded) { 40736 tagDict.set("E", stringToAsciiOrUTF16BE(expanded)); 40737 } 40738 if (actualText) { 40739 tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText)); 40740 } 40741 } 40742 static #collectParents({ 40743 elements, 40744 xref, 40745 pageDict, 40746 numberTree 40747 }) { 40748 const idToElements = new Map(); 40749 for (const element of elements) { 40750 if (element.structTreeParentId) { 40751 const id = parseInt(element.structTreeParentId.split("_mc")[1], 10); 40752 let elems = idToElements.get(id); 40753 if (!elems) { 40754 elems = []; 40755 idToElements.set(id, elems); 40756 } 40757 elems.push(element); 40758 } 40759 } 40760 const id = pageDict.get("StructParents"); 40761 if (!Number.isInteger(id)) { 40762 return; 40763 } 40764 const parentArray = numberTree.get(id); 40765 const updateElement = (kid, pageKid, kidRef) => { 40766 const elems = idToElements.get(kid); 40767 if (elems) { 40768 const parentRef = pageKid.getRaw("P"); 40769 const parentDict = xref.fetchIfRef(parentRef); 40770 if (parentRef instanceof Ref && parentDict instanceof Dict) { 40771 const params = { 40772 ref: kidRef, 40773 dict: pageKid 40774 }; 40775 for (const element of elems) { 40776 element.structTreeParent = params; 40777 } 40778 } 40779 return true; 40780 } 40781 return false; 40782 }; 40783 for (const kidRef of parentArray) { 40784 if (!(kidRef instanceof Ref)) { 40785 continue; 40786 } 40787 const pageKid = xref.fetch(kidRef); 40788 const k = pageKid.get("K"); 40789 if (Number.isInteger(k)) { 40790 updateElement(k, pageKid, kidRef); 40791 continue; 40792 } 40793 if (!Array.isArray(k)) { 40794 continue; 40795 } 40796 for (let kid of k) { 40797 kid = xref.fetchIfRef(kid); 40798 if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) { 40799 break; 40800 } 40801 if (!(kid instanceof Dict)) { 40802 continue; 40803 } 40804 if (!isName(kid.get("Type"), "MCR")) { 40805 break; 40806 } 40807 const mcid = kid.get("MCID"); 40808 if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) { 40809 break; 40810 } 40811 } 40812 } 40813 } 40814 static async #updateParentTag({ 40815 structTreeParent, 40816 tagDict, 40817 newTagRef, 40818 structTreeRootRef, 40819 fallbackKids, 40820 xref, 40821 cache 40822 }) { 40823 let ref = null; 40824 let parentRef; 40825 if (structTreeParent) { 40826 ({ 40827 ref 40828 } = structTreeParent); 40829 parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef; 40830 } else { 40831 parentRef = structTreeRootRef; 40832 } 40833 tagDict.set("P", parentRef); 40834 const parentDict = xref.fetchIfRef(parentRef); 40835 if (!parentDict) { 40836 fallbackKids.push(newTagRef); 40837 return; 40838 } 40839 let cachedParentDict = cache.get(parentRef); 40840 if (!cachedParentDict) { 40841 cachedParentDict = parentDict.clone(); 40842 cache.put(parentRef, cachedParentDict); 40843 } 40844 const parentKidsRaw = cachedParentDict.getRaw("K"); 40845 let cachedParentKids = parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null; 40846 if (!cachedParentKids) { 40847 cachedParentKids = xref.fetchIfRef(parentKidsRaw); 40848 cachedParentKids = Array.isArray(cachedParentKids) ? cachedParentKids.slice() : [parentKidsRaw]; 40849 const parentKidsRef = xref.getNewTemporaryRef(); 40850 cachedParentDict.set("K", parentKidsRef); 40851 cache.put(parentKidsRef, cachedParentKids); 40852 } 40853 const index = cachedParentKids.indexOf(ref); 40854 cachedParentKids.splice(index >= 0 ? index + 1 : cachedParentKids.length, 0, newTagRef); 40855 } 40856} 40857class StructElementNode { 40858 constructor(tree, dict) { 40859 this.tree = tree; 40860 this.dict = dict; 40861 this.kids = []; 40862 this.parseKids(); 40863 } 40864 get role() { 40865 const nameObj = this.dict.get("S"); 40866 const name = nameObj instanceof Name ? nameObj.name : ""; 40867 const { 40868 root 40869 } = this.tree; 40870 if (root.roleMap.has(name)) { 40871 return root.roleMap.get(name); 40872 } 40873 return name; 40874 } 40875 parseKids() { 40876 let pageObjId = null; 40877 const objRef = this.dict.getRaw("Pg"); 40878 if (objRef instanceof Ref) { 40879 pageObjId = objRef.toString(); 40880 } 40881 const kids = this.dict.get("K"); 40882 if (Array.isArray(kids)) { 40883 for (const kid of kids) { 40884 const element = this.parseKid(pageObjId, kid); 40885 if (element) { 40886 this.kids.push(element); 40887 } 40888 } 40889 } else { 40890 const element = this.parseKid(pageObjId, kids); 40891 if (element) { 40892 this.kids.push(element); 40893 } 40894 } 40895 } 40896 parseKid(pageObjId, kid) { 40897 if (Number.isInteger(kid)) { 40898 if (this.tree.pageDict.objId !== pageObjId) { 40899 return null; 40900 } 40901 return new StructElement({ 40902 type: StructElementType.PAGE_CONTENT, 40903 mcid: kid, 40904 pageObjId 40905 }); 40906 } 40907 let kidDict = null; 40908 if (kid instanceof Ref) { 40909 kidDict = this.dict.xref.fetch(kid); 40910 } else if (kid instanceof Dict) { 40911 kidDict = kid; 40912 } 40913 if (!kidDict) { 40914 return null; 40915 } 40916 const pageRef = kidDict.getRaw("Pg"); 40917 if (pageRef instanceof Ref) { 40918 pageObjId = pageRef.toString(); 40919 } 40920 const type = kidDict.get("Type") instanceof Name ? kidDict.get("Type").name : null; 40921 if (type === "MCR") { 40922 if (this.tree.pageDict.objId !== pageObjId) { 40923 return null; 40924 } 40925 const kidRef = kidDict.getRaw("Stm"); 40926 return new StructElement({ 40927 type: StructElementType.STREAM_CONTENT, 40928 refObjId: kidRef instanceof Ref ? kidRef.toString() : null, 40929 pageObjId, 40930 mcid: kidDict.get("MCID") 40931 }); 40932 } 40933 if (type === "OBJR") { 40934 if (this.tree.pageDict.objId !== pageObjId) { 40935 return null; 40936 } 40937 const kidRef = kidDict.getRaw("Obj"); 40938 return new StructElement({ 40939 type: StructElementType.OBJECT, 40940 refObjId: kidRef instanceof Ref ? kidRef.toString() : null, 40941 pageObjId 40942 }); 40943 } 40944 return new StructElement({ 40945 type: StructElementType.ELEMENT, 40946 dict: kidDict 40947 }); 40948 } 40949} 40950class StructElement { 40951 constructor({ 40952 type, 40953 dict = null, 40954 mcid = null, 40955 pageObjId = null, 40956 refObjId = null 40957 }) { 40958 this.type = type; 40959 this.dict = dict; 40960 this.mcid = mcid; 40961 this.pageObjId = pageObjId; 40962 this.refObjId = refObjId; 40963 this.parentNode = null; 40964 } 40965} 40966class StructTreePage { 40967 constructor(structTreeRoot, pageDict) { 40968 this.root = structTreeRoot; 40969 this.rootDict = structTreeRoot ? structTreeRoot.dict : null; 40970 this.pageDict = pageDict; 40971 this.nodes = []; 40972 } 40973 collectObjects(pageRef) { 40974 if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { 40975 return null; 40976 } 40977 const parentTree = this.rootDict.get("ParentTree"); 40978 if (!parentTree) { 40979 return null; 40980 } 40981 const ids = this.root.structParentIds?.get(pageRef); 40982 if (!ids) { 40983 return null; 40984 } 40985 const map = new Map(); 40986 const numberTree = new NumberTree(parentTree, this.rootDict.xref); 40987 for (const [elemId] of ids) { 40988 const obj = numberTree.getRaw(elemId); 40989 if (obj instanceof Ref) { 40990 map.set(elemId, obj); 40991 } 40992 } 40993 return map; 40994 } 40995 parse(pageRef) { 40996 if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { 40997 return; 40998 } 40999 const parentTree = this.rootDict.get("ParentTree"); 41000 if (!parentTree) { 41001 return; 41002 } 41003 const id = this.pageDict.get("StructParents"); 41004 const ids = this.root.structParentIds?.get(pageRef); 41005 if (!Number.isInteger(id) && !ids) { 41006 return; 41007 } 41008 const map = new Map(); 41009 const numberTree = new NumberTree(parentTree, this.rootDict.xref); 41010 if (Number.isInteger(id)) { 41011 const parentArray = numberTree.get(id); 41012 if (Array.isArray(parentArray)) { 41013 for (const ref of parentArray) { 41014 if (ref instanceof Ref) { 41015 this.addNode(this.rootDict.xref.fetch(ref), map); 41016 } 41017 } 41018 } 41019 } 41020 if (!ids) { 41021 return; 41022 } 41023 for (const [elemId, type] of ids) { 41024 const obj = numberTree.get(elemId); 41025 if (obj) { 41026 const elem = this.addNode(this.rootDict.xref.fetchIfRef(obj), map); 41027 if (elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT) { 41028 elem.kids[0].type = type; 41029 } 41030 } 41031 } 41032 } 41033 addNode(dict, map, level = 0) { 41034 if (level > MAX_DEPTH) { 41035 warn("StructTree MAX_DEPTH reached."); 41036 return null; 41037 } 41038 if (!(dict instanceof Dict)) { 41039 return null; 41040 } 41041 if (map.has(dict)) { 41042 return map.get(dict); 41043 } 41044 const element = new StructElementNode(this, dict); 41045 map.set(dict, element); 41046 const parent = dict.get("P"); 41047 if (!parent || isName(parent.get("Type"), "StructTreeRoot")) { 41048 if (!this.addTopLevelNode(dict, element)) { 41049 map.delete(dict); 41050 } 41051 return element; 41052 } 41053 const parentNode = this.addNode(parent, map, level + 1); 41054 if (!parentNode) { 41055 return element; 41056 } 41057 let save = false; 41058 for (const kid of parentNode.kids) { 41059 if (kid.type === StructElementType.ELEMENT && kid.dict === dict) { 41060 kid.parentNode = element; 41061 save = true; 41062 } 41063 } 41064 if (!save) { 41065 map.delete(dict); 41066 } 41067 return element; 41068 } 41069 addTopLevelNode(dict, element) { 41070 const obj = this.rootDict.get("K"); 41071 if (!obj) { 41072 return false; 41073 } 41074 if (obj instanceof Dict) { 41075 if (obj.objId !== dict.objId) { 41076 return false; 41077 } 41078 this.nodes[0] = element; 41079 return true; 41080 } 41081 if (!Array.isArray(obj)) { 41082 return true; 41083 } 41084 let save = false; 41085 for (let i = 0; i < obj.length; i++) { 41086 const kidRef = obj[i]; 41087 if (kidRef?.toString() === dict.objId) { 41088 this.nodes[i] = element; 41089 save = true; 41090 } 41091 } 41092 return save; 41093 } 41094 get serializable() { 41095 function nodeToSerializable(node, parent, level = 0) { 41096 if (level > MAX_DEPTH) { 41097 warn("StructTree too deep to be fully serialized."); 41098 return; 41099 } 41100 const obj = Object.create(null); 41101 obj.role = node.role; 41102 obj.children = []; 41103 parent.children.push(obj); 41104 let alt = node.dict.get("Alt"); 41105 if (typeof alt !== "string") { 41106 alt = node.dict.get("ActualText"); 41107 } 41108 if (typeof alt === "string") { 41109 obj.alt = stringToPDFString(alt); 41110 } 41111 const a = node.dict.get("A"); 41112 if (a instanceof Dict) { 41113 const bbox = lookupNormalRect(a.getArray("BBox"), null); 41114 if (bbox) { 41115 obj.bbox = bbox; 41116 } else { 41117 const width = a.get("Width"); 41118 const height = a.get("Height"); 41119 if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) { 41120 obj.bbox = [0, 0, width, height]; 41121 } 41122 } 41123 } 41124 const lang = node.dict.get("Lang"); 41125 if (typeof lang === "string") { 41126 obj.lang = stringToPDFString(lang); 41127 } 41128 for (const kid of node.kids) { 41129 const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null; 41130 if (kidElement) { 41131 nodeToSerializable(kidElement, obj, level + 1); 41132 continue; 41133 } else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === StructElementType.STREAM_CONTENT) { 41134 obj.children.push({ 41135 type: "content", 41136 id: `p${kid.pageObjId}_mc${kid.mcid}` 41137 }); 41138 } else if (kid.type === StructElementType.OBJECT) { 41139 obj.children.push({ 41140 type: "object", 41141 id: kid.refObjId 41142 }); 41143 } else if (kid.type === StructElementType.ANNOTATION) { 41144 obj.children.push({ 41145 type: "annotation", 41146 id: `${AnnotationPrefix}${kid.refObjId}` 41147 }); 41148 } 41149 } 41150 } 41151 const root = Object.create(null); 41152 root.children = []; 41153 root.role = "Root"; 41154 for (const child of this.nodes) { 41155 if (!child) { 41156 continue; 41157 } 41158 nodeToSerializable(child, root); 41159 } 41160 return root; 41161 } 41162} 41163 41164;// ./src/core/catalog.js 41165 41166 41167 41168 41169 41170 41171 41172 41173 41174 41175 41176 41177 41178 41179 41180 41181 41182 41183 41184 41185 41186 41187 41188 41189 41190 41191 41192 41193function isValidExplicitDest(dest) { 41194 if (!Array.isArray(dest) || dest.length < 2) { 41195 return false; 41196 } 41197 const [page, zoom, ...args] = dest; 41198 if (!(page instanceof Ref) && !Number.isInteger(page)) { 41199 return false; 41200 } 41201 if (!(zoom instanceof Name)) { 41202 return false; 41203 } 41204 const argsLen = args.length; 41205 let allowNull = true; 41206 switch (zoom.name) { 41207 case "XYZ": 41208 if (argsLen < 2 || argsLen > 3) { 41209 return false; 41210 } 41211 break; 41212 case "Fit": 41213 case "FitB": 41214 return argsLen === 0; 41215 case "FitH": 41216 case "FitBH": 41217 case "FitV": 41218 case "FitBV": 41219 if (argsLen > 1) { 41220 return false; 41221 } 41222 break; 41223 case "FitR": 41224 if (argsLen !== 4) { 41225 return false; 41226 } 41227 allowNull = false; 41228 break; 41229 default: 41230 return false; 41231 } 41232 for (const arg of args) { 41233 if (!(typeof arg === "number" || allowNull && arg === null)) { 41234 return false; 41235 } 41236 } 41237 return true; 41238} 41239function fetchDest(dest) { 41240 if (dest instanceof Dict) { 41241 dest = dest.get("D"); 41242 } 41243 return isValidExplicitDest(dest) ? dest : null; 41244} 41245function fetchRemoteDest(action) { 41246 let dest = action.get("D"); 41247 if (dest) { 41248 if (dest instanceof Name) { 41249 dest = dest.name; 41250 } 41251 if (typeof dest === "string") { 41252 return stringToPDFString(dest); 41253 } else if (isValidExplicitDest(dest)) { 41254 return JSON.stringify(dest); 41255 } 41256 } 41257 return null; 41258} 41259class Catalog { 41260 constructor(pdfManager, xref) { 41261 this.pdfManager = pdfManager; 41262 this.xref = xref; 41263 this._catDict = xref.getCatalogObj(); 41264 if (!(this._catDict instanceof Dict)) { 41265 throw new FormatError("Catalog object is not a dictionary."); 41266 } 41267 this.toplevelPagesDict; 41268 this._actualNumPages = null; 41269 this.fontCache = new RefSetCache(); 41270 this.builtInCMapCache = new Map(); 41271 this.standardFontDataCache = new Map(); 41272 this.globalImageCache = new GlobalImageCache(); 41273 this.pageKidsCountCache = new RefSetCache(); 41274 this.pageIndexCache = new RefSetCache(); 41275 this.pageDictCache = new RefSetCache(); 41276 this.nonBlendModesSet = new RefSet(); 41277 this.systemFontCache = new Map(); 41278 } 41279 cloneDict() { 41280 return this._catDict.clone(); 41281 } 41282 get version() { 41283 const version = this._catDict.get("Version"); 41284 if (version instanceof Name) { 41285 if (PDF_VERSION_REGEXP.test(version.name)) { 41286 return shadow(this, "version", version.name); 41287 } 41288 warn(`Invalid PDF catalog version: ${version.name}`); 41289 } 41290 return shadow(this, "version", null); 41291 } 41292 get lang() { 41293 const lang = this._catDict.get("Lang"); 41294 return shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null); 41295 } 41296 get needsRendering() { 41297 const needsRendering = this._catDict.get("NeedsRendering"); 41298 return shadow(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false); 41299 } 41300 get collection() { 41301 let collection = null; 41302 try { 41303 const obj = this._catDict.get("Collection"); 41304 if (obj instanceof Dict && obj.size > 0) { 41305 collection = obj; 41306 } 41307 } catch (ex) { 41308 if (ex instanceof MissingDataException) { 41309 throw ex; 41310 } 41311 info("Cannot fetch Collection entry; assuming no collection is present."); 41312 } 41313 return shadow(this, "collection", collection); 41314 } 41315 get acroForm() { 41316 let acroForm = null; 41317 try { 41318 const obj = this._catDict.get("AcroForm"); 41319 if (obj instanceof Dict && obj.size > 0) { 41320 acroForm = obj; 41321 } 41322 } catch (ex) { 41323 if (ex instanceof MissingDataException) { 41324 throw ex; 41325 } 41326 info("Cannot fetch AcroForm entry; assuming no forms are present."); 41327 } 41328 return shadow(this, "acroForm", acroForm); 41329 } 41330 get acroFormRef() { 41331 const value = this._catDict.getRaw("AcroForm"); 41332 return shadow(this, "acroFormRef", value instanceof Ref ? value : null); 41333 } 41334 get metadata() { 41335 const streamRef = this._catDict.getRaw("Metadata"); 41336 if (!(streamRef instanceof Ref)) { 41337 return shadow(this, "metadata", null); 41338 } 41339 let metadata = null; 41340 try { 41341 const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata); 41342 if (stream instanceof BaseStream && stream.dict instanceof Dict) { 41343 const type = stream.dict.get("Type"); 41344 const subtype = stream.dict.get("Subtype"); 41345 if (isName(type, "Metadata") && isName(subtype, "XML")) { 41346 const data = stringToUTF8String(stream.getString()); 41347 if (data) { 41348 metadata = new MetadataParser(data).serializable; 41349 } 41350 } 41351 } 41352 } catch (ex) { 41353 if (ex instanceof MissingDataException) { 41354 throw ex; 41355 } 41356 info(`Skipping invalid Metadata: "${ex}".`); 41357 } 41358 return shadow(this, "metadata", metadata); 41359 } 41360 get markInfo() { 41361 let markInfo = null; 41362 try { 41363 markInfo = this._readMarkInfo(); 41364 } catch (ex) { 41365 if (ex instanceof MissingDataException) { 41366 throw ex; 41367 } 41368 warn("Unable to read mark info."); 41369 } 41370 return shadow(this, "markInfo", markInfo); 41371 } 41372 _readMarkInfo() { 41373 const obj = this._catDict.get("MarkInfo"); 41374 if (!(obj instanceof Dict)) { 41375 return null; 41376 } 41377 const markInfo = { 41378 Marked: false, 41379 UserProperties: false, 41380 Suspects: false 41381 }; 41382 for (const key in markInfo) { 41383 const value = obj.get(key); 41384 if (typeof value === "boolean") { 41385 markInfo[key] = value; 41386 } 41387 } 41388 return markInfo; 41389 } 41390 get structTreeRoot() { 41391 let structTree = null; 41392 try { 41393 structTree = this._readStructTreeRoot(); 41394 } catch (ex) { 41395 if (ex instanceof MissingDataException) { 41396 throw ex; 41397 } 41398 warn("Unable read to structTreeRoot info."); 41399 } 41400 return shadow(this, "structTreeRoot", structTree); 41401 } 41402 _readStructTreeRoot() { 41403 const rawObj = this._catDict.getRaw("StructTreeRoot"); 41404 const obj = this.xref.fetchIfRef(rawObj); 41405 if (!(obj instanceof Dict)) { 41406 return null; 41407 } 41408 const root = new StructTreeRoot(obj, rawObj); 41409 root.init(); 41410 return root; 41411 } 41412 get toplevelPagesDict() { 41413 const pagesObj = this._catDict.get("Pages"); 41414 if (!(pagesObj instanceof Dict)) { 41415 throw new FormatError("Invalid top-level pages dictionary."); 41416 } 41417 return shadow(this, "toplevelPagesDict", pagesObj); 41418 } 41419 get documentOutline() { 41420 let obj = null; 41421 try { 41422 obj = this._readDocumentOutline(); 41423 } catch (ex) { 41424 if (ex instanceof MissingDataException) { 41425 throw ex; 41426 } 41427 warn("Unable to read document outline."); 41428 } 41429 return shadow(this, "documentOutline", obj); 41430 } 41431 _readDocumentOutline() { 41432 let obj = this._catDict.get("Outlines"); 41433 if (!(obj instanceof Dict)) { 41434 return null; 41435 } 41436 obj = obj.getRaw("First"); 41437 if (!(obj instanceof Ref)) { 41438 return null; 41439 } 41440 const root = { 41441 items: [] 41442 }; 41443 const queue = [{ 41444 obj, 41445 parent: root 41446 }]; 41447 const processed = new RefSet(); 41448 processed.put(obj); 41449 const xref = this.xref, 41450 blackColor = new Uint8ClampedArray(3); 41451 while (queue.length > 0) { 41452 const i = queue.shift(); 41453 const outlineDict = xref.fetchIfRef(i.obj); 41454 if (outlineDict === null) { 41455 continue; 41456 } 41457 if (!outlineDict.has("Title")) { 41458 warn("Invalid outline item encountered."); 41459 } 41460 const data = { 41461 url: null, 41462 dest: null, 41463 action: null 41464 }; 41465 Catalog.parseDestDictionary({ 41466 destDict: outlineDict, 41467 resultObj: data, 41468 docBaseUrl: this.baseUrl, 41469 docAttachments: this.attachments 41470 }); 41471 const title = outlineDict.get("Title"); 41472 const flags = outlineDict.get("F") || 0; 41473 const color = outlineDict.getArray("C"); 41474 const count = outlineDict.get("Count"); 41475 let rgbColor = blackColor; 41476 if (isNumberArray(color, 3) && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { 41477 rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); 41478 } 41479 const outlineItem = { 41480 action: data.action, 41481 attachment: data.attachment, 41482 dest: data.dest, 41483 url: data.url, 41484 unsafeUrl: data.unsafeUrl, 41485 newWindow: data.newWindow, 41486 setOCGState: data.setOCGState, 41487 title: typeof title === "string" ? stringToPDFString(title) : "", 41488 color: rgbColor, 41489 count: Number.isInteger(count) ? count : undefined, 41490 bold: !!(flags & 2), 41491 italic: !!(flags & 1), 41492 items: [] 41493 }; 41494 i.parent.items.push(outlineItem); 41495 obj = outlineDict.getRaw("First"); 41496 if (obj instanceof Ref && !processed.has(obj)) { 41497 queue.push({ 41498 obj, 41499 parent: outlineItem 41500 }); 41501 processed.put(obj); 41502 } 41503 obj = outlineDict.getRaw("Next"); 41504 if (obj instanceof Ref && !processed.has(obj)) { 41505 queue.push({ 41506 obj, 41507 parent: i.parent 41508 }); 41509 processed.put(obj); 41510 } 41511 } 41512 return root.items.length > 0 ? root.items : null; 41513 } 41514 get permissions() { 41515 let permissions = null; 41516 try { 41517 permissions = this._readPermissions(); 41518 } catch (ex) { 41519 if (ex instanceof MissingDataException) { 41520 throw ex; 41521 } 41522 warn("Unable to read permissions."); 41523 } 41524 return shadow(this, "permissions", permissions); 41525 } 41526 _readPermissions() { 41527 const encrypt = this.xref.trailer.get("Encrypt"); 41528 if (!(encrypt instanceof Dict)) { 41529 return null; 41530 } 41531 let flags = encrypt.get("P"); 41532 if (typeof flags !== "number") { 41533 return null; 41534 } 41535 flags += 2 ** 32; 41536 const permissions = []; 41537 for (const key in PermissionFlag) { 41538 const value = PermissionFlag[key]; 41539 if (flags & value) { 41540 permissions.push(value); 41541 } 41542 } 41543 return permissions; 41544 } 41545 get optionalContentConfig() { 41546 let config = null; 41547 try { 41548 const properties = this._catDict.get("OCProperties"); 41549 if (!properties) { 41550 return shadow(this, "optionalContentConfig", null); 41551 } 41552 const defaultConfig = properties.get("D"); 41553 if (!defaultConfig) { 41554 return shadow(this, "optionalContentConfig", null); 41555 } 41556 const groupsData = properties.get("OCGs"); 41557 if (!Array.isArray(groupsData)) { 41558 return shadow(this, "optionalContentConfig", null); 41559 } 41560 const groupRefCache = new RefSetCache(); 41561 for (const groupRef of groupsData) { 41562 if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) { 41563 continue; 41564 } 41565 groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef)); 41566 } 41567 config = this.#readOptionalContentConfig(defaultConfig, groupRefCache); 41568 } catch (ex) { 41569 if (ex instanceof MissingDataException) { 41570 throw ex; 41571 } 41572 warn(`Unable to read optional content config: ${ex}`); 41573 } 41574 return shadow(this, "optionalContentConfig", config); 41575 } 41576 #readOptionalContentGroup(groupRef) { 41577 const group = this.xref.fetch(groupRef); 41578 const obj = { 41579 id: groupRef.toString(), 41580 name: null, 41581 intent: null, 41582 usage: { 41583 print: null, 41584 view: null 41585 }, 41586 rbGroups: [] 41587 }; 41588 const name = group.get("Name"); 41589 if (typeof name === "string") { 41590 obj.name = stringToPDFString(name); 41591 } 41592 let intent = group.getArray("Intent"); 41593 if (!Array.isArray(intent)) { 41594 intent = [intent]; 41595 } 41596 if (intent.every(i => i instanceof Name)) { 41597 obj.intent = intent.map(i => i.name); 41598 } 41599 const usage = group.get("Usage"); 41600 if (!(usage instanceof Dict)) { 41601 return obj; 41602 } 41603 const usageObj = obj.usage; 41604 const print = usage.get("Print"); 41605 if (print instanceof Dict) { 41606 const printState = print.get("PrintState"); 41607 if (printState instanceof Name) { 41608 switch (printState.name) { 41609 case "ON": 41610 case "OFF": 41611 usageObj.print = { 41612 printState: printState.name 41613 }; 41614 } 41615 } 41616 } 41617 const view = usage.get("View"); 41618 if (view instanceof Dict) { 41619 const viewState = view.get("ViewState"); 41620 if (viewState instanceof Name) { 41621 switch (viewState.name) { 41622 case "ON": 41623 case "OFF": 41624 usageObj.view = { 41625 viewState: viewState.name 41626 }; 41627 } 41628 } 41629 } 41630 return obj; 41631 } 41632 #readOptionalContentConfig(config, groupRefCache) { 41633 function parseOnOff(refs) { 41634 const onParsed = []; 41635 if (Array.isArray(refs)) { 41636 for (const value of refs) { 41637 if (value instanceof Ref && groupRefCache.has(value)) { 41638 onParsed.push(value.toString()); 41639 } 41640 } 41641 } 41642 return onParsed; 41643 } 41644 function parseOrder(refs, nestedLevels = 0) { 41645 if (!Array.isArray(refs)) { 41646 return null; 41647 } 41648 const order = []; 41649 for (const value of refs) { 41650 if (value instanceof Ref && groupRefCache.has(value)) { 41651 parsedOrderRefs.put(value); 41652 order.push(value.toString()); 41653 continue; 41654 } 41655 const nestedOrder = parseNestedOrder(value, nestedLevels); 41656 if (nestedOrder) { 41657 order.push(nestedOrder); 41658 } 41659 } 41660 if (nestedLevels > 0) { 41661 return order; 41662 } 41663 const hiddenGroups = []; 41664 for (const [groupRef] of groupRefCache.items()) { 41665 if (parsedOrderRefs.has(groupRef)) { 41666 continue; 41667 } 41668 hiddenGroups.push(groupRef.toString()); 41669 } 41670 if (hiddenGroups.length) { 41671 order.push({ 41672 name: null, 41673 order: hiddenGroups 41674 }); 41675 } 41676 return order; 41677 } 41678 function parseNestedOrder(ref, nestedLevels) { 41679 if (++nestedLevels > MAX_NESTED_LEVELS) { 41680 warn("parseNestedOrder - reached MAX_NESTED_LEVELS."); 41681 return null; 41682 } 41683 const value = xref.fetchIfRef(ref); 41684 if (!Array.isArray(value)) { 41685 return null; 41686 } 41687 const nestedName = xref.fetchIfRef(value[0]); 41688 if (typeof nestedName !== "string") { 41689 return null; 41690 } 41691 const nestedOrder = parseOrder(value.slice(1), nestedLevels); 41692 if (!nestedOrder?.length) { 41693 return null; 41694 } 41695 return { 41696 name: stringToPDFString(nestedName), 41697 order: nestedOrder 41698 }; 41699 } 41700 function parseRBGroups(rbGroups) { 41701 if (!Array.isArray(rbGroups)) { 41702 return; 41703 } 41704 for (const value of rbGroups) { 41705 const rbGroup = xref.fetchIfRef(value); 41706 if (!Array.isArray(rbGroup) || !rbGroup.length) { 41707 continue; 41708 } 41709 const parsedRbGroup = new Set(); 41710 for (const ref of rbGroup) { 41711 if (ref instanceof Ref && groupRefCache.has(ref) && !parsedRbGroup.has(ref.toString())) { 41712 parsedRbGroup.add(ref.toString()); 41713 groupRefCache.get(ref).rbGroups.push(parsedRbGroup); 41714 } 41715 } 41716 } 41717 } 41718 const xref = this.xref, 41719 parsedOrderRefs = new RefSet(), 41720 MAX_NESTED_LEVELS = 10; 41721 parseRBGroups(config.get("RBGroups")); 41722 return { 41723 name: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null, 41724 creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null, 41725 baseState: config.get("BaseState") instanceof Name ? config.get("BaseState").name : null, 41726 on: parseOnOff(config.get("ON")), 41727 off: parseOnOff(config.get("OFF")), 41728 order: parseOrder(config.get("Order")), 41729 groups: [...groupRefCache] 41730 }; 41731 } 41732 setActualNumPages(num = null) { 41733 this._actualNumPages = num; 41734 } 41735 get hasActualNumPages() { 41736 return this._actualNumPages !== null; 41737 } 41738 get _pagesCount() { 41739 const obj = this.toplevelPagesDict.get("Count"); 41740 if (!Number.isInteger(obj)) { 41741 throw new FormatError("Page count in top-level pages dictionary is not an integer."); 41742 } 41743 return shadow(this, "_pagesCount", obj); 41744 } 41745 get numPages() { 41746 return this.hasActualNumPages ? this._actualNumPages : this._pagesCount; 41747 } 41748 get destinations() { 41749 const obj = this._readDests(), 41750 dests = Object.create(null); 41751 if (obj instanceof NameTree) { 41752 for (const [key, value] of obj.getAll()) { 41753 const dest = fetchDest(value); 41754 if (dest) { 41755 dests[stringToPDFString(key)] = dest; 41756 } 41757 } 41758 } else if (obj instanceof Dict) { 41759 for (const [key, value] of obj) { 41760 const dest = fetchDest(value); 41761 if (dest) { 41762 dests[key] = dest; 41763 } 41764 } 41765 } 41766 return shadow(this, "destinations", dests); 41767 } 41768 getDestination(id) { 41769 const obj = this._readDests(); 41770 if (obj instanceof NameTree) { 41771 const dest = fetchDest(obj.get(id)); 41772 if (dest) { 41773 return dest; 41774 } 41775 const allDest = this.destinations[id]; 41776 if (allDest) { 41777 warn(`Found "${id}" at an incorrect position in the NameTree.`); 41778 return allDest; 41779 } 41780 } else if (obj instanceof Dict) { 41781 const dest = fetchDest(obj.get(id)); 41782 if (dest) { 41783 return dest; 41784 } 41785 } 41786 return null; 41787 } 41788 _readDests() { 41789 const obj = this._catDict.get("Names"); 41790 if (obj?.has("Dests")) { 41791 return new NameTree(obj.getRaw("Dests"), this.xref); 41792 } else if (this._catDict.has("Dests")) { 41793 return this._catDict.get("Dests"); 41794 } 41795 return undefined; 41796 } 41797 get pageLabels() { 41798 let obj = null; 41799 try { 41800 obj = this._readPageLabels(); 41801 } catch (ex) { 41802 if (ex instanceof MissingDataException) { 41803 throw ex; 41804 } 41805 warn("Unable to read page labels."); 41806 } 41807 return shadow(this, "pageLabels", obj); 41808 } 41809 _readPageLabels() { 41810 const obj = this._catDict.getRaw("PageLabels"); 41811 if (!obj) { 41812 return null; 41813 } 41814 const pageLabels = new Array(this.numPages); 41815 let style = null, 41816 prefix = ""; 41817 const numberTree = new NumberTree(obj, this.xref); 41818 const nums = numberTree.getAll(); 41819 let currentLabel = "", 41820 currentIndex = 1; 41821 for (let i = 0, ii = this.numPages; i < ii; i++) { 41822 const labelDict = nums.get(i); 41823 if (labelDict !== undefined) { 41824 if (!(labelDict instanceof Dict)) { 41825 throw new FormatError("PageLabel is not a dictionary."); 41826 } 41827 if (labelDict.has("Type") && !isName(labelDict.get("Type"), "PageLabel")) { 41828 throw new FormatError("Invalid type in PageLabel dictionary."); 41829 } 41830 if (labelDict.has("S")) { 41831 const s = labelDict.get("S"); 41832 if (!(s instanceof Name)) { 41833 throw new FormatError("Invalid style in PageLabel dictionary."); 41834 } 41835 style = s.name; 41836 } else { 41837 style = null; 41838 } 41839 if (labelDict.has("P")) { 41840 const p = labelDict.get("P"); 41841 if (typeof p !== "string") { 41842 throw new FormatError("Invalid prefix in PageLabel dictionary."); 41843 } 41844 prefix = stringToPDFString(p); 41845 } else { 41846 prefix = ""; 41847 } 41848 if (labelDict.has("St")) { 41849 const st = labelDict.get("St"); 41850 if (!(Number.isInteger(st) && st >= 1)) { 41851 throw new FormatError("Invalid start in PageLabel dictionary."); 41852 } 41853 currentIndex = st; 41854 } else { 41855 currentIndex = 1; 41856 } 41857 } 41858 switch (style) { 41859 case "D": 41860 currentLabel = currentIndex; 41861 break; 41862 case "R": 41863 case "r": 41864 currentLabel = toRomanNumerals(currentIndex, style === "r"); 41865 break; 41866 case "A": 41867 case "a": 41868 const LIMIT = 26; 41869 const A_UPPER_CASE = 0x41, 41870 A_LOWER_CASE = 0x61; 41871 const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE; 41872 const letterIndex = currentIndex - 1; 41873 const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT); 41874 currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1); 41875 break; 41876 default: 41877 if (style) { 41878 throw new FormatError(`Invalid style "${style}" in PageLabel dictionary.`); 41879 } 41880 currentLabel = ""; 41881 } 41882 pageLabels[i] = prefix + currentLabel; 41883 currentIndex++; 41884 } 41885 return pageLabels; 41886 } 41887 get pageLayout() { 41888 const obj = this._catDict.get("PageLayout"); 41889 let pageLayout = ""; 41890 if (obj instanceof Name) { 41891 switch (obj.name) { 41892 case "SinglePage": 41893 case "OneColumn": 41894 case "TwoColumnLeft": 41895 case "TwoColumnRight": 41896 case "TwoPageLeft": 41897 case "TwoPageRight": 41898 pageLayout = obj.name; 41899 } 41900 } 41901 return shadow(this, "pageLayout", pageLayout); 41902 } 41903 get pageMode() { 41904 const obj = this._catDict.get("PageMode"); 41905 let pageMode = "UseNone"; 41906 if (obj instanceof Name) { 41907 switch (obj.name) { 41908 case "UseNone": 41909 case "UseOutlines": 41910 case "UseThumbs": 41911 case "FullScreen": 41912 case "UseOC": 41913 case "UseAttachments": 41914 pageMode = obj.name; 41915 } 41916 } 41917 return shadow(this, "pageMode", pageMode); 41918 } 41919 get viewerPreferences() { 41920 const obj = this._catDict.get("ViewerPreferences"); 41921 if (!(obj instanceof Dict)) { 41922 return shadow(this, "viewerPreferences", null); 41923 } 41924 let prefs = null; 41925 for (const key of obj.getKeys()) { 41926 const value = obj.get(key); 41927 let prefValue; 41928 switch (key) { 41929 case "HideToolbar": 41930 case "HideMenubar": 41931 case "HideWindowUI": 41932 case "FitWindow": 41933 case "CenterWindow": 41934 case "DisplayDocTitle": 41935 case "PickTrayByPDFSize": 41936 if (typeof value === "boolean") { 41937 prefValue = value; 41938 } 41939 break; 41940 case "NonFullScreenPageMode": 41941 if (value instanceof Name) { 41942 switch (value.name) { 41943 case "UseNone": 41944 case "UseOutlines": 41945 case "UseThumbs": 41946 case "UseOC": 41947 prefValue = value.name; 41948 break; 41949 default: 41950 prefValue = "UseNone"; 41951 } 41952 } 41953 break; 41954 case "Direction": 41955 if (value instanceof Name) { 41956 switch (value.name) { 41957 case "L2R": 41958 case "R2L": 41959 prefValue = value.name; 41960 break; 41961 default: 41962 prefValue = "L2R"; 41963 } 41964 } 41965 break; 41966 case "ViewArea": 41967 case "ViewClip": 41968 case "PrintArea": 41969 case "PrintClip": 41970 if (value instanceof Name) { 41971 switch (value.name) { 41972 case "MediaBox": 41973 case "CropBox": 41974 case "BleedBox": 41975 case "TrimBox": 41976 case "ArtBox": 41977 prefValue = value.name; 41978 break; 41979 default: 41980 prefValue = "CropBox"; 41981 } 41982 } 41983 break; 41984 case "PrintScaling": 41985 if (value instanceof Name) { 41986 switch (value.name) { 41987 case "None": 41988 case "AppDefault": 41989 prefValue = value.name; 41990 break; 41991 default: 41992 prefValue = "AppDefault"; 41993 } 41994 } 41995 break; 41996 case "Duplex": 41997 if (value instanceof Name) { 41998 switch (value.name) { 41999 case "Simplex": 42000 case "DuplexFlipShortEdge": 42001 case "DuplexFlipLongEdge": 42002 prefValue = value.name; 42003 break; 42004 default: 42005 prefValue = "None"; 42006 } 42007 } 42008 break; 42009 case "PrintPageRange": 42010 if (Array.isArray(value) && value.length % 2 === 0) { 42011 const isValid = value.every((page, i, arr) => Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages); 42012 if (isValid) { 42013 prefValue = value; 42014 } 42015 } 42016 break; 42017 case "NumCopies": 42018 if (Number.isInteger(value) && value > 0) { 42019 prefValue = value; 42020 } 42021 break; 42022 default: 42023 warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`); 42024 continue; 42025 } 42026 if (prefValue === undefined) { 42027 warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); 42028 continue; 42029 } 42030 if (!prefs) { 42031 prefs = Object.create(null); 42032 } 42033 prefs[key] = prefValue; 42034 } 42035 return shadow(this, "viewerPreferences", prefs); 42036 } 42037 get openAction() { 42038 const obj = this._catDict.get("OpenAction"); 42039 const openAction = Object.create(null); 42040 if (obj instanceof Dict) { 42041 const destDict = new Dict(this.xref); 42042 destDict.set("A", obj); 42043 const resultObj = { 42044 url: null, 42045 dest: null, 42046 action: null 42047 }; 42048 Catalog.parseDestDictionary({ 42049 destDict, 42050 resultObj 42051 }); 42052 if (Array.isArray(resultObj.dest)) { 42053 openAction.dest = resultObj.dest; 42054 } else if (resultObj.action) { 42055 openAction.action = resultObj.action; 42056 } 42057 } else if (Array.isArray(obj)) { 42058 openAction.dest = obj; 42059 } 42060 return shadow(this, "openAction", objectSize(openAction) > 0 ? openAction : null); 42061 } 42062 get attachments() { 42063 const obj = this._catDict.get("Names"); 42064 let attachments = null; 42065 if (obj instanceof Dict && obj.has("EmbeddedFiles")) { 42066 const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); 42067 for (const [key, value] of nameTree.getAll()) { 42068 const fs = new FileSpec(value, this.xref); 42069 if (!attachments) { 42070 attachments = Object.create(null); 42071 } 42072 attachments[stringToPDFString(key)] = fs.serializable; 42073 } 42074 } 42075 return shadow(this, "attachments", attachments); 42076 } 42077 get xfaImages() { 42078 const obj = this._catDict.get("Names"); 42079 let xfaImages = null; 42080 if (obj instanceof Dict && obj.has("XFAImages")) { 42081 const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref); 42082 for (const [key, value] of nameTree.getAll()) { 42083 if (!xfaImages) { 42084 xfaImages = new Dict(this.xref); 42085 } 42086 xfaImages.set(stringToPDFString(key), value); 42087 } 42088 } 42089 return shadow(this, "xfaImages", xfaImages); 42090 } 42091 _collectJavaScript() { 42092 const obj = this._catDict.get("Names"); 42093 let javaScript = null; 42094 function appendIfJavaScriptDict(name, jsDict) { 42095 if (!(jsDict instanceof Dict)) { 42096 return; 42097 } 42098 if (!isName(jsDict.get("S"), "JavaScript")) { 42099 return; 42100 } 42101 let js = jsDict.get("JS"); 42102 if (js instanceof BaseStream) { 42103 js = js.getString(); 42104 } else if (typeof js !== "string") { 42105 return; 42106 } 42107 js = stringToPDFString(js).replaceAll("\x00", ""); 42108 if (js) { 42109 (javaScript ||= new Map()).set(name, js); 42110 } 42111 } 42112 if (obj instanceof Dict && obj.has("JavaScript")) {
42113 const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref); 42114 for (const [key, value] of nameTree.getAll()) { 42115 appendIfJavaScriptDict(stringToPDFString(key), value); 42116 } 42117 } 42118 const openAction = this._catDict.get("OpenAction"); 42119 if (openAction) { 42120 appendIfJavaScriptDict("OpenAction", openAction); 42121 } 42122 return javaScript; 42123 } 42124 get jsActions() { 42125 const javaScript = this._collectJavaScript(); 42126 let actions = collectActions(this.xref, this._catDict, DocumentActionEventType); 42127 if (javaScript) { 42128 actions ||= Object.create(null); 42129 for (const [key, val] of javaScript) { 42130 if (key in actions) { 42131 actions[key].push(val); 42132 } else { 42133 actions[key] = [val]; 42134 } 42135 } 42136 } 42137 return shadow(this, "jsActions", actions); 42138 } 42139 async fontFallback(id, handler) { 42140 const translatedFonts = await Promise.all(this.fontCache); 42141 for (const translatedFont of translatedFonts) { 42142 if (translatedFont.loadedName === id) { 42143 translatedFont.fallback(handler); 42144 return; 42145 } 42146 } 42147 } 42148 async cleanup(manuallyTriggered = false) { 42149 clearGlobalCaches(); 42150 this.globalImageCache.clear(manuallyTriggered); 42151 this.pageKidsCountCache.clear(); 42152 this.pageIndexCache.clear(); 42153 this.pageDictCache.clear(); 42154 this.nonBlendModesSet.clear(); 42155 const translatedFonts = await Promise.all(this.fontCache); 42156 for (const { 42157 dict 42158 } of translatedFonts) { 42159 delete dict.cacheKey; 42160 } 42161 this.fontCache.clear(); 42162 this.builtInCMapCache.clear(); 42163 this.standardFontDataCache.clear(); 42164 this.systemFontCache.clear(); 42165 } 42166 async getPageDict(pageIndex) { 42167 const nodesToVisit = [this.toplevelPagesDict]; 42168 const visitedNodes = new RefSet(); 42169 const pagesRef = this._catDict.getRaw("Pages"); 42170 if (pagesRef instanceof Ref) { 42171 visitedNodes.put(pagesRef); 42172 } 42173 const xref = this.xref, 42174 pageKidsCountCache = this.pageKidsCountCache, 42175 pageIndexCache = this.pageIndexCache, 42176 pageDictCache = this.pageDictCache; 42177 let currentPageIndex = 0; 42178 while (nodesToVisit.length) { 42179 const currentNode = nodesToVisit.pop(); 42180 if (currentNode instanceof Ref) { 42181 const count = pageKidsCountCache.get(currentNode); 42182 if (count >= 0 && currentPageIndex + count <= pageIndex) { 42183 currentPageIndex += count; 42184 continue; 42185 } 42186 if (visitedNodes.has(currentNode)) { 42187 throw new FormatError("Pages tree contains circular reference."); 42188 } 42189 visitedNodes.put(currentNode); 42190 const obj = await (pageDictCache.get(currentNode) || xref.fetchAsync(currentNode)); 42191 if (obj instanceof Dict) { 42192 let type = obj.getRaw("Type"); 42193 if (type instanceof Ref) { 42194 type = await xref.fetchAsync(type); 42195 } 42196 if (isName(type, "Page") || !obj.has("Kids")) { 42197 if (!pageKidsCountCache.has(currentNode)) { 42198 pageKidsCountCache.put(currentNode, 1); 42199 } 42200 if (!pageIndexCache.has(currentNode)) { 42201 pageIndexCache.put(currentNode, currentPageIndex); 42202 } 42203 if (currentPageIndex === pageIndex) { 42204 return [obj, currentNode]; 42205 } 42206 currentPageIndex++; 42207 continue; 42208 } 42209 } 42210 nodesToVisit.push(obj); 42211 continue; 42212 } 42213 if (!(currentNode instanceof Dict)) { 42214 throw new FormatError("Page dictionary kid reference points to wrong type of object."); 42215 } 42216 const { 42217 objId 42218 } = currentNode; 42219 let count = currentNode.getRaw("Count"); 42220 if (count instanceof Ref) { 42221 count = await xref.fetchAsync(count); 42222 } 42223 if (Number.isInteger(count) && count >= 0) { 42224 if (objId && !pageKidsCountCache.has(objId)) { 42225 pageKidsCountCache.put(objId, count); 42226 } 42227 if (currentPageIndex + count <= pageIndex) { 42228 currentPageIndex += count; 42229 continue; 42230 } 42231 } 42232 let kids = currentNode.getRaw("Kids"); 42233 if (kids instanceof Ref) { 42234 kids = await xref.fetchAsync(kids); 42235 } 42236 if (!Array.isArray(kids)) { 42237 let type = currentNode.getRaw("Type"); 42238 if (type instanceof Ref) { 42239 type = await xref.fetchAsync(type); 42240 } 42241 if (isName(type, "Page") || !currentNode.has("Kids")) { 42242 if (currentPageIndex === pageIndex) { 42243 return [currentNode, null]; 42244 } 42245 currentPageIndex++; 42246 continue; 42247 } 42248 throw new FormatError("Page dictionary kids object is not an array."); 42249 } 42250 for (let last = kids.length - 1; last >= 0; last--) { 42251 const lastKid = kids[last]; 42252 nodesToVisit.push(lastKid); 42253 if (currentNode === this.toplevelPagesDict && lastKid instanceof Ref && !pageDictCache.has(lastKid)) { 42254 pageDictCache.put(lastKid, xref.fetchAsync(lastKid)); 42255 } 42256 } 42257 } 42258 throw new Error(`Page index ${pageIndex} not found.`); 42259 }
vendor: 1,484 bytes, lines 42260-42315
42260 async getAllPageDicts(recoveryMode = false) { 42261 const { 42262 ignoreErrors 42263 } = this.pdfManager.evaluatorOptions; 42264 const queue = [{ 42265 currentNode: this.toplevelPagesDict, 42266 posInKids: 0 42267 }]; 42268 const visitedNodes = new RefSet(); 42269 const pagesRef = this._catDict.getRaw("Pages"); 42270 if (pagesRef instanceof Ref) { 42271 visitedNodes.put(pagesRef); 42272 } 42273 const map = new Map(), 42274 xref = this.xref, 42275 pageIndexCache = this.pageIndexCache; 42276 let pageIndex = 0; 42277 function addPageDict(pageDict, pageRef) { 42278 if (pageRef && !pageIndexCache.has(pageRef)) { 42279 pageIndexCache.put(pageRef, pageIndex); 42280 } 42281 map.set(pageIndex++, [pageDict, pageRef]); 42282 } 42283 function addPageError(error) { 42284 if (error instanceof XRefEntryException && !recoveryMode) { 42285 throw error; 42286 } 42287 if (recoveryMode && ignoreErrors && pageIndex === 0) { 42288 warn(`getAllPageDicts - Skipping invalid first page: "${error}".`); 42289 error = Dict.empty; 42290 } 42291 map.set(pageIndex++, [error, null]); 42292 } 42293 while (queue.length > 0) { 42294 const queueItem = queue.at(-1); 42295 const { 42296 currentNode, 42297 posInKids 42298 } = queueItem; 42299 let kids = currentNode.getRaw("Kids"); 42300 if (kids instanceof Ref) { 42301 try { 42302 kids = await xref.fetchAsync(kids); 42303 } catch (ex) { 42304 addPageError(ex); 42305 break; 42306 } 42307 } 42308 if (!Array.isArray(kids)) { 42309 addPageError(new FormatError("Page dictionary kids object is not an array.")); 42310 break; 42311 } 42312 if (posInKids >= kids.length) { 42313 queue.pop(); 42314 continue; 42315 }
vendor: 26,492 bytes, lines 42316-43390
42316 const kidObj = kids[posInKids]; 42317 let obj; 42318 if (kidObj instanceof Ref) { 42319 if (visitedNodes.has(kidObj)) { 42320 addPageError(new FormatError("Pages tree contains circular reference.")); 42321 break; 42322 } 42323 visitedNodes.put(kidObj); 42324 try { 42325 obj = await xref.fetchAsync(kidObj); 42326 } catch (ex) { 42327 addPageError(ex); 42328 break; 42329 } 42330 } else { 42331 obj = kidObj; 42332 } 42333 if (!(obj instanceof Dict)) { 42334 addPageError(new FormatError("Page dictionary kid reference points to wrong type of object.")); 42335 break; 42336 } 42337 let type = obj.getRaw("Type"); 42338 if (type instanceof Ref) { 42339 try { 42340 type = await xref.fetchAsync(type); 42341 } catch (ex) { 42342 addPageError(ex); 42343 break; 42344 } 42345 } 42346 if (isName(type, "Page") || !obj.has("Kids")) { 42347 addPageDict(obj, kidObj instanceof Ref ? kidObj : null); 42348 } else { 42349 queue.push({ 42350 currentNode: obj, 42351 posInKids: 0 42352 }); 42353 } 42354 queueItem.posInKids++; 42355 } 42356 return map; 42357 } 42358 getPageIndex(pageRef) { 42359 const cachedPageIndex = this.pageIndexCache.get(pageRef); 42360 if (cachedPageIndex !== undefined) { 42361 return Promise.resolve(cachedPageIndex); 42362 } 42363 const xref = this.xref; 42364 function pagesBeforeRef(kidRef) { 42365 let total = 0, 42366 parentRef; 42367 return xref.fetchAsync(kidRef).then(function (node) { 42368 if (isRefsEqual(kidRef, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) { 42369 throw new FormatError("The reference does not point to a /Page dictionary."); 42370 } 42371 if (!node) { 42372 return null; 42373 } 42374 if (!(node instanceof Dict)) { 42375 throw new FormatError("Node must be a dictionary."); 42376 } 42377 parentRef = node.getRaw("Parent"); 42378 return node.getAsync("Parent"); 42379 }).then(function (parent) { 42380 if (!parent) { 42381 return null; 42382 } 42383 if (!(parent instanceof Dict)) { 42384 throw new FormatError("Parent must be a dictionary."); 42385 } 42386 return parent.getAsync("Kids"); 42387 }).then(function (kids) { 42388 if (!kids) { 42389 return null; 42390 } 42391 const kidPromises = []; 42392 let found = false; 42393 for (const kid of kids) { 42394 if (!(kid instanceof Ref)) { 42395 throw new FormatError("Kid must be a reference."); 42396 } 42397 if (isRefsEqual(kid, kidRef)) { 42398 found = true; 42399 break; 42400 } 42401 kidPromises.push(xref.fetchAsync(kid).then(function (obj) { 42402 if (!(obj instanceof Dict)) { 42403 throw new FormatError("Kid node must be a dictionary."); 42404 } 42405 if (obj.has("Count")) { 42406 total += obj.get("Count"); 42407 } else { 42408 total++; 42409 } 42410 })); 42411 } 42412 if (!found) { 42413 throw new FormatError("Kid reference not found in parent's kids."); 42414 } 42415 return Promise.all(kidPromises).then(function () { 42416 return [total, parentRef]; 42417 }); 42418 }); 42419 } 42420 let total = 0; 42421 const next = ref => pagesBeforeRef(ref).then(args => { 42422 if (!args) { 42423 this.pageIndexCache.put(pageRef, total); 42424 return total; 42425 } 42426 const [count, parentRef] = args; 42427 total += count; 42428 return next(parentRef); 42429 }); 42430 return next(pageRef); 42431 } 42432 get baseUrl() { 42433 const uri = this._catDict.get("URI"); 42434 if (uri instanceof Dict) { 42435 const base = uri.get("Base"); 42436 if (typeof base === "string") { 42437 const absoluteUrl = createValidAbsoluteUrl(base, null, { 42438 tryConvertEncoding: true 42439 }); 42440 if (absoluteUrl) { 42441 return shadow(this, "baseUrl", absoluteUrl.href); 42442 } 42443 } 42444 } 42445 return shadow(this, "baseUrl", this.pdfManager.docBaseUrl); 42446 } 42447 static parseDestDictionary({ 42448 destDict, 42449 resultObj, 42450 docBaseUrl = null, 42451 docAttachments = null 42452 }) { 42453 if (!(destDict instanceof Dict)) { 42454 warn("parseDestDictionary: `destDict` must be a dictionary."); 42455 return; 42456 } 42457 let action = destDict.get("A"), 42458 url, 42459 dest; 42460 if (!(action instanceof Dict)) { 42461 if (destDict.has("Dest")) { 42462 action = destDict.get("Dest"); 42463 } else { 42464 action = destDict.get("AA"); 42465 if (action instanceof Dict) { 42466 if (action.has("D")) { 42467 action = action.get("D"); 42468 } else if (action.has("U")) { 42469 action = action.get("U"); 42470 } 42471 } 42472 } 42473 } 42474 if (action instanceof Dict) { 42475 const actionType = action.get("S"); 42476 if (!(actionType instanceof Name)) { 42477 warn("parseDestDictionary: Invalid type in Action dictionary."); 42478 return; 42479 } 42480 const actionName = actionType.name; 42481 switch (actionName) { 42482 case "ResetForm": 42483 const flags = action.get("Flags"); 42484 const include = ((typeof flags === "number" ? flags : 0) & 1) === 0; 42485 const fields = []; 42486 const refs = []; 42487 for (const obj of action.get("Fields") || []) { 42488 if (obj instanceof Ref) { 42489 refs.push(obj.toString()); 42490 } else if (typeof obj === "string") { 42491 fields.push(stringToPDFString(obj)); 42492 } 42493 } 42494 resultObj.resetForm = { 42495 fields, 42496 refs, 42497 include 42498 }; 42499 break; 42500 case "URI": 42501 url = action.get("URI"); 42502 if (url instanceof Name) { 42503 url = "/" + url.name; 42504 } 42505 break; 42506 case "GoTo": 42507 dest = action.get("D"); 42508 break; 42509 case "Launch": 42510 case "GoToR": 42511 const urlDict = action.get("F"); 42512 if (urlDict instanceof Dict) { 42513 const fs = new FileSpec(urlDict, null, true); 42514 const { 42515 rawFilename 42516 } = fs.serializable; 42517 url = rawFilename; 42518 } else if (typeof urlDict === "string") { 42519 url = urlDict; 42520 } 42521 const remoteDest = fetchRemoteDest(action); 42522 if (remoteDest && typeof url === "string") { 42523 url = url.split("#", 1)[0] + "#" + remoteDest; 42524 } 42525 const newWindow = action.get("NewWindow"); 42526 if (typeof newWindow === "boolean") { 42527 resultObj.newWindow = newWindow; 42528 } 42529 break; 42530 case "GoToE": 42531 const target = action.get("T"); 42532 let attachment; 42533 if (docAttachments && target instanceof Dict) { 42534 const relationship = target.get("R"); 42535 const name = target.get("N"); 42536 if (isName(relationship, "C") && typeof name === "string") { 42537 attachment = docAttachments[stringToPDFString(name)]; 42538 } 42539 } 42540 if (attachment) { 42541 resultObj.attachment = attachment; 42542 const attachmentDest = fetchRemoteDest(action); 42543 if (attachmentDest) { 42544 resultObj.attachmentDest = attachmentDest; 42545 } 42546 } else { 42547 warn(`parseDestDictionary - unimplemented "GoToE" action.`); 42548 } 42549 break; 42550 case "Named": 42551 const namedAction = action.get("N"); 42552 if (namedAction instanceof Name) { 42553 resultObj.action = namedAction.name; 42554 } 42555 break; 42556 case "SetOCGState": 42557 const state = action.get("State"); 42558 const preserveRB = action.get("PreserveRB"); 42559 if (!Array.isArray(state) || state.length === 0) { 42560 break; 42561 } 42562 const stateArr = []; 42563 for (const elem of state) { 42564 if (elem instanceof Name) { 42565 switch (elem.name) { 42566 case "ON": 42567 case "OFF": 42568 case "Toggle": 42569 stateArr.push(elem.name); 42570 break; 42571 } 42572 } else if (elem instanceof Ref) { 42573 stateArr.push(elem.toString()); 42574 } 42575 } 42576 if (stateArr.length !== state.length) { 42577 break; 42578 } 42579 resultObj.setOCGState = { 42580 state: stateArr, 42581 preserveRB: typeof preserveRB === "boolean" ? preserveRB : true 42582 }; 42583 break; 42584 case "JavaScript": 42585 const jsAction = action.get("JS"); 42586 let js; 42587 if (jsAction instanceof BaseStream) { 42588 js = jsAction.getString(); 42589 } else if (typeof jsAction === "string") { 42590 js = jsAction; 42591 } 42592 const jsURL = js && recoverJsURL(stringToPDFString(js)); 42593 if (jsURL) { 42594 url = jsURL.url; 42595 resultObj.newWindow = jsURL.newWindow; 42596 break; 42597 } 42598 default: 42599 if (actionName === "JavaScript" || actionName === "SubmitForm") { 42600 break; 42601 } 42602 warn(`parseDestDictionary - unsupported action: "${actionName}".`); 42603 break; 42604 } 42605 } else if (destDict.has("Dest")) { 42606 dest = destDict.get("Dest"); 42607 } 42608 if (typeof url === "string") { 42609 const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, { 42610 addDefaultProtocol: true, 42611 tryConvertEncoding: true 42612 }); 42613 if (absoluteUrl) { 42614 resultObj.url = absoluteUrl.href; 42615 } 42616 resultObj.unsafeUrl = url; 42617 } 42618 if (dest) { 42619 if (dest instanceof Name) { 42620 dest = dest.name; 42621 } 42622 if (typeof dest === "string") { 42623 resultObj.dest = stringToPDFString(dest); 42624 } else if (isValidExplicitDest(dest)) { 42625 resultObj.dest = dest; 42626 } 42627 } 42628 } 42629} 42630 42631;// ./src/core/object_loader.js 42632 42633 42634 42635 42636 42637function mayHaveChildren(value) { 42638 return value instanceof Ref || value instanceof Dict || value instanceof BaseStream || Array.isArray(value); 42639} 42640function addChildren(node, nodesToVisit) { 42641 if (node instanceof Dict) { 42642 node = node.getRawValues(); 42643 } else if (node instanceof BaseStream) { 42644 node = node.dict.getRawValues(); 42645 } else if (!Array.isArray(node)) { 42646 return; 42647 } 42648 for (const rawValue of node) { 42649 if (mayHaveChildren(rawValue)) { 42650 nodesToVisit.push(rawValue); 42651 } 42652 } 42653} 42654class ObjectLoader { 42655 constructor(dict, keys, xref) { 42656 this.dict = dict; 42657 this.keys = keys; 42658 this.xref = xref; 42659 this.refSet = null; 42660 } 42661 async load() { 42662 if (this.xref.stream.isDataLoaded) { 42663 return undefined; 42664 } 42665 const { 42666 keys, 42667 dict 42668 } = this; 42669 this.refSet = new RefSet(); 42670 const nodesToVisit = []; 42671 for (const key of keys) { 42672 const rawValue = dict.getRaw(key); 42673 if (rawValue !== undefined) { 42674 nodesToVisit.push(rawValue); 42675 } 42676 } 42677 return this._walk(nodesToVisit); 42678 } 42679 async _walk(nodesToVisit) { 42680 const nodesToRevisit = []; 42681 const pendingRequests = []; 42682 while (nodesToVisit.length) { 42683 let currentNode = nodesToVisit.pop(); 42684 if (currentNode instanceof Ref) { 42685 if (this.refSet.has(currentNode)) { 42686 continue; 42687 } 42688 try { 42689 this.refSet.put(currentNode); 42690 currentNode = this.xref.fetch(currentNode); 42691 } catch (ex) { 42692 if (!(ex instanceof MissingDataException)) { 42693 warn(`ObjectLoader._walk - requesting all data: "${ex}".`); 42694 this.refSet = null; 42695 const { 42696 manager 42697 } = this.xref.stream; 42698 return manager.requestAllChunks(); 42699 } 42700 nodesToRevisit.push(currentNode); 42701 pendingRequests.push({ 42702 begin: ex.begin, 42703 end: ex.end 42704 }); 42705 } 42706 } 42707 if (currentNode instanceof BaseStream) { 42708 const baseStreams = currentNode.getBaseStreams(); 42709 if (baseStreams) { 42710 let foundMissingData = false; 42711 for (const stream of baseStreams) { 42712 if (stream.isDataLoaded) { 42713 continue; 42714 } 42715 foundMissingData = true; 42716 pendingRequests.push({ 42717 begin: stream.start, 42718 end: stream.end 42719 }); 42720 } 42721 if (foundMissingData) { 42722 nodesToRevisit.push(currentNode); 42723 } 42724 } 42725 } 42726 addChildren(currentNode, nodesToVisit); 42727 } 42728 if (pendingRequests.length) { 42729 await this.xref.stream.manager.requestRanges(pendingRequests); 42730 for (const node of nodesToRevisit) { 42731 if (node instanceof Ref) { 42732 this.refSet.remove(node); 42733 } 42734 } 42735 return this._walk(nodesToRevisit); 42736 } 42737 this.refSet = null; 42738 return undefined; 42739 } 42740} 42741 42742;// ./src/core/xfa/symbol_utils.js 42743const $acceptWhitespace = Symbol(); 42744const $addHTML = Symbol(); 42745const $appendChild = Symbol(); 42746const $childrenToHTML = Symbol(); 42747const $clean = Symbol(); 42748const $cleanPage = Symbol(); 42749const $cleanup = Symbol(); 42750const $clone = Symbol(); 42751const $consumed = Symbol(); 42752const $content = Symbol("content"); 42753const $data = Symbol("data"); 42754const $dump = Symbol(); 42755const $extra = Symbol("extra"); 42756const $finalize = Symbol(); 42757const $flushHTML = Symbol(); 42758const $getAttributeIt = Symbol(); 42759const $getAttributes = Symbol(); 42760const $getAvailableSpace = Symbol(); 42761const $getChildrenByClass = Symbol(); 42762const $getChildrenByName = Symbol(); 42763const $getChildrenByNameIt = Symbol(); 42764const $getDataValue = Symbol(); 42765const $getExtra = Symbol(); 42766const $getRealChildrenByNameIt = Symbol(); 42767const $getChildren = Symbol(); 42768const $getContainedChildren = Symbol(); 42769const $getNextPage = Symbol(); 42770const $getSubformParent = Symbol(); 42771const $getParent = Symbol(); 42772const $getTemplateRoot = Symbol(); 42773const $globalData = Symbol(); 42774const $hasSettableValue = Symbol(); 42775const $ids = Symbol(); 42776const $indexOf = Symbol(); 42777const $insertAt = Symbol(); 42778const $isCDATAXml = Symbol(); 42779const $isBindable = Symbol(); 42780const $isDataValue = Symbol(); 42781const $isDescendent = Symbol(); 42782const $isNsAgnostic = Symbol(); 42783const $isSplittable = Symbol(); 42784const $isThereMoreWidth = Symbol(); 42785const $isTransparent = Symbol(); 42786const $isUsable = Symbol(); 42787const $lastAttribute = Symbol(); 42788const $namespaceId = Symbol("namespaceId"); 42789const $nodeName = Symbol("nodeName"); 42790const $nsAttributes = Symbol(); 42791const $onChild = Symbol(); 42792const $onChildCheck = Symbol(); 42793const $onText = Symbol(); 42794const $pushGlyphs = Symbol(); 42795const $popPara = Symbol(); 42796const $pushPara = Symbol(); 42797const $removeChild = Symbol(); 42798const $root = Symbol("root"); 42799const $resolvePrototypes = Symbol(); 42800const $searchNode = Symbol(); 42801const $setId = Symbol(); 42802const $setSetAttributes = Symbol(); 42803const $setValue = Symbol(); 42804const $tabIndex = Symbol(); 42805const $text = Symbol(); 42806const $toPages = Symbol(); 42807const $toHTML = Symbol(); 42808const $toString = Symbol(); 42809const $toStyle = Symbol(); 42810const $uid = Symbol("uid"); 42811 42812;// ./src/core/xfa/namespaces.js 42813const $buildXFAObject = Symbol(); 42814const NamespaceIds = { 42815 config: { 42816 id: 0, 42817 check: ns => ns.startsWith("http://www.xfa.org/schema/xci/") 42818 }, 42819 connectionSet: { 42820 id: 1, 42821 check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/") 42822 }, 42823 datasets: { 42824 id: 2, 42825 check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/") 42826 }, 42827 form: { 42828 id: 3, 42829 check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/") 42830 }, 42831 localeSet: { 42832 id: 4, 42833 check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/") 42834 }, 42835 pdf: { 42836 id: 5, 42837 check: ns => ns === "http://ns.adobe.com/xdp/pdf/" 42838 }, 42839 signature: { 42840 id: 6, 42841 check: ns => ns === "http://www.w3.org/2000/09/xmldsig#" 42842 }, 42843 sourceSet: { 42844 id: 7, 42845 check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/") 42846 }, 42847 stylesheet: { 42848 id: 8, 42849 check: ns => ns === "http://www.w3.org/1999/XSL/Transform" 42850 }, 42851 template: { 42852 id: 9, 42853 check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/") 42854 }, 42855 xdc: { 42856 id: 10, 42857 check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/") 42858 }, 42859 xdp: { 42860 id: 11, 42861 check: ns => ns === "http://ns.adobe.com/xdp/" 42862 }, 42863 xfdf: { 42864 id: 12, 42865 check: ns => ns === "http://ns.adobe.com/xfdf/" 42866 }, 42867 xhtml: { 42868 id: 13, 42869 check: ns => ns === "http://www.w3.org/1999/xhtml" 42870 }, 42871 xmpmeta: { 42872 id: 14, 42873 check: ns => ns === "http://ns.adobe.com/xmpmeta/" 42874 } 42875}; 42876 42877;// ./src/core/xfa/utils.js 42878 42879 42880 42881 42882 42883const dimConverters = { 42884 pt: x => x, 42885 cm: x => x / 2.54 * 72, 42886 mm: x => x / (10 * 2.54) * 72, 42887 in: x => x * 72, 42888 px: x => x 42889}; 42890const measurementPattern = /([+-]?\d+\.?\d*)(.*)/; 42891function stripQuotes(str) { 42892 if (str.startsWith("'") || str.startsWith('"')) { 42893 return str.slice(1, -1); 42894 } 42895 return str; 42896} 42897function getInteger({ 42898 data, 42899 defaultValue, 42900 validate 42901}) { 42902 if (!data) { 42903 return defaultValue; 42904 } 42905 data = data.trim(); 42906 const n = parseInt(data, 10); 42907 if (!isNaN(n) && validate(n)) { 42908 return n; 42909 } 42910 return defaultValue; 42911} 42912function getFloat({ 42913 data, 42914 defaultValue, 42915 validate 42916}) { 42917 if (!data) { 42918 return defaultValue; 42919 } 42920 data = data.trim(); 42921 const n = parseFloat(data); 42922 if (!isNaN(n) && validate(n)) { 42923 return n; 42924 } 42925 return defaultValue; 42926} 42927function getKeyword({ 42928 data, 42929 defaultValue, 42930 validate 42931}) { 42932 if (!data) { 42933 return defaultValue; 42934 } 42935 data = data.trim(); 42936 if (validate(data)) { 42937 return data; 42938 } 42939 return defaultValue; 42940} 42941function getStringOption(data, options) { 42942 return getKeyword({ 42943 data, 42944 defaultValue: options[0], 42945 validate: k => options.includes(k) 42946 }); 42947} 42948function getMeasurement(str, def = "0") { 42949 def ||= "0"; 42950 if (!str) { 42951 return getMeasurement(def); 42952 } 42953 const match = str.trim().match(measurementPattern); 42954 if (!match) { 42955 return getMeasurement(def); 42956 } 42957 const [, valueStr, unit] = match; 42958 const value = parseFloat(valueStr); 42959 if (isNaN(value)) { 42960 return getMeasurement(def); 42961 } 42962 if (value === 0) { 42963 return 0; 42964 } 42965 const conv = dimConverters[unit]; 42966 if (conv) { 42967 return conv(value); 42968 } 42969 return value; 42970} 42971function getRatio(data) { 42972 if (!data) { 42973 return { 42974 num: 1, 42975 den: 1 42976 }; 42977 } 42978 const ratio = data.trim().split(/\s*:\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x)); 42979 if (ratio.length === 1) { 42980 ratio.push(1); 42981 } 42982 if (ratio.length === 0) { 42983 return { 42984 num: 1, 42985 den: 1 42986 }; 42987 } 42988 const [num, den] = ratio; 42989 return { 42990 num, 42991 den 42992 }; 42993} 42994function getRelevant(data) { 42995 if (!data) { 42996 return []; 42997 } 42998 return data.trim().split(/\s+/).map(e => ({ 42999 excluded: e[0] === "-", 43000 viewname: e.substring(1) 43001 })); 43002} 43003function getColor(data, def = [0, 0, 0]) { 43004 let [r, g, b] = def; 43005 if (!data) { 43006 return { 43007 r, 43008 g, 43009 b 43010 }; 43011 } 43012 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); 43013 if (color.length < 3) { 43014 return { 43015 r, 43016 g, 43017 b 43018 }; 43019 } 43020 [r, g, b] = color; 43021 return { 43022 r, 43023 g, 43024 b 43025 }; 43026} 43027function getBBox(data) { 43028 const def = -1; 43029 if (!data) { 43030 return { 43031 x: def, 43032 y: def, 43033 width: def, 43034 height: def 43035 }; 43036 } 43037 const bbox = data.trim().split(/\s*,\s*/).map(m => getMeasurement(m, "-1")); 43038 if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) { 43039 return { 43040 x: def, 43041 y: def, 43042 width: def, 43043 height: def 43044 }; 43045 } 43046 const [x, y, width, height] = bbox; 43047 return { 43048 x, 43049 y, 43050 width, 43051 height 43052 }; 43053} 43054class HTMLResult { 43055 static get FAILURE() { 43056 return shadow(this, "FAILURE", new HTMLResult(false, null, null, null)); 43057 } 43058 static get EMPTY() { 43059 return shadow(this, "EMPTY", new HTMLResult(true, null, null, null)); 43060 } 43061 constructor(success, html, bbox, breakNode) { 43062 this.success = success; 43063 this.html = html; 43064 this.bbox = bbox; 43065 this.breakNode = breakNode; 43066 } 43067 isBreak() { 43068 return !!this.breakNode; 43069 } 43070 static breakNode(node) { 43071 return new HTMLResult(false, null, null, node); 43072 } 43073 static success(html, bbox = null) { 43074 return new HTMLResult(true, html, bbox, null); 43075 } 43076} 43077 43078;// ./src/core/xfa/fonts.js 43079 43080 43081 43082 43083 43084 43085 43086 43087 43088 43089 43090 43091 43092class FontFinder { 43093 constructor(pdfFonts) { 43094 this.fonts = new Map(); 43095 this.cache = new Map(); 43096 this.warned = new Set(); 43097 this.defaultFont = null; 43098 this.add(pdfFonts); 43099 } 43100 add(pdfFonts, reallyMissingFonts = null) { 43101 for (const pdfFont of pdfFonts) { 43102 this.addPdfFont(pdfFont); 43103 } 43104 for (const pdfFont of this.fonts.values()) { 43105 if (!pdfFont.regular) { 43106 pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic; 43107 } 43108 } 43109 if (!reallyMissingFonts || reallyMissingFonts.size === 0) { 43110 return; 43111 } 43112 const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA"); 43113 for (const missing of reallyMissingFonts) { 43114 this.fonts.set(missing, myriad); 43115 } 43116 } 43117 addPdfFont(pdfFont) { 43118 const cssFontInfo = pdfFont.cssFontInfo; 43119 const name = cssFontInfo.fontFamily; 43120 let font = this.fonts.get(name); 43121 if (!font) { 43122 font = Object.create(null); 43123 this.fonts.set(name, font); 43124 if (!this.defaultFont) { 43125 this.defaultFont = font; 43126 } 43127 } 43128 let property = ""; 43129 const fontWeight = parseFloat(cssFontInfo.fontWeight); 43130 if (parseFloat(cssFontInfo.italicAngle) !== 0) { 43131 property = fontWeight >= 700 ? "bolditalic" : "italic"; 43132 } else if (fontWeight >= 700) { 43133 property = "bold"; 43134 } 43135 if (!property) { 43136 if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) { 43137 property = "bold"; 43138 } 43139 if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName?.includes("Italic") || pdfFont.psName?.endsWith("It")) { 43140 property += "italic"; 43141 } 43142 } 43143 if (!property) { 43144 property = "regular"; 43145 } 43146 font[property] = pdfFont; 43147 } 43148 getDefault() { 43149 return this.defaultFont; 43150 } 43151 find(fontName, mustWarn = true) { 43152 let font = this.fonts.get(fontName) || this.cache.get(fontName); 43153 if (font) { 43154 return font; 43155 } 43156 const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; 43157 let name = fontName.replaceAll(pattern, ""); 43158 font = this.fonts.get(name); 43159 if (font) { 43160 this.cache.set(fontName, font); 43161 return font; 43162 } 43163 name = name.toLowerCase(); 43164 const maybe = []; 43165 for (const [family, pdfFont] of this.fonts.entries()) { 43166 if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { 43167 maybe.push(pdfFont); 43168 } 43169 } 43170 if (maybe.length === 0) { 43171 for (const [, pdfFont] of this.fonts.entries()) { 43172 if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { 43173 maybe.push(pdfFont); 43174 } 43175 } 43176 } 43177 if (maybe.length === 0) { 43178 name = name.replaceAll(/psmt|mt/gi, ""); 43179 for (const [family, pdfFont] of this.fonts.entries()) { 43180 if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { 43181 maybe.push(pdfFont); 43182 } 43183 } 43184 } 43185 if (maybe.length === 0) { 43186 for (const pdfFont of this.fonts.values()) { 43187 if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { 43188 maybe.push(pdfFont); 43189 } 43190 } 43191 } 43192 if (maybe.length >= 1) { 43193 if (maybe.length !== 1 && mustWarn) { 43194 warn(`XFA - Too many choices to guess the correct font: ${fontName}`); 43195 } 43196 this.cache.set(fontName, maybe[0]); 43197 return maybe[0]; 43198 } 43199 if (mustWarn && !this.warned.has(fontName)) { 43200 this.warned.add(fontName); 43201 warn(`XFA - Cannot find the font: ${fontName}`); 43202 } 43203 return null; 43204 } 43205} 43206function selectFont(xfaFont, typeface) { 43207 if (xfaFont.posture === "italic") { 43208 if (xfaFont.weight === "bold") { 43209 return typeface.bolditalic; 43210 } 43211 return typeface.italic; 43212 } else if (xfaFont.weight === "bold") { 43213 return typeface.bold; 43214 } 43215 return typeface.regular; 43216} 43217function fonts_getMetrics(xfaFont, real = false) { 43218 let pdfFont = null; 43219 if (xfaFont) { 43220 const name = stripQuotes(xfaFont.typeface); 43221 const typeface = xfaFont[$globalData].fontFinder.find(name); 43222 pdfFont = selectFont(xfaFont, typeface); 43223 } 43224 if (!pdfFont) { 43225 return { 43226 lineHeight: 12, 43227 lineGap: 2, 43228 lineNoGap: 10 43229 }; 43230 } 43231 const size = xfaFont.size || 10; 43232 const lineHeight = pdfFont.lineHeight ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) : 1.2; 43233 const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; 43234 return { 43235 lineHeight: lineHeight * size, 43236 lineGap: lineGap * size, 43237 lineNoGap: Math.max(1, lineHeight - lineGap) * size 43238 }; 43239} 43240 43241;// ./src/core/xfa/text.js 43242 43243 43244 43245 43246const WIDTH_FACTOR = 1.02; 43247class FontInfo { 43248 constructor(xfaFont, margin, lineHeight, fontFinder) { 43249 this.lineHeight = lineHeight; 43250 this.paraMargin = margin || { 43251 top: 0, 43252 bottom: 0, 43253 left: 0, 43254 right: 0 43255 }; 43256 if (!xfaFont) { 43257 [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); 43258 return; 43259 } 43260 this.xfaFont = { 43261 typeface: xfaFont.typeface, 43262 posture: xfaFont.posture, 43263 weight: xfaFont.weight, 43264 size: xfaFont.size, 43265 letterSpacing: xfaFont.letterSpacing 43266 }; 43267 const typeface = fontFinder.find(xfaFont.typeface); 43268 if (!typeface) { 43269 [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); 43270 return; 43271 } 43272 this.pdfFont = selectFont(xfaFont, typeface); 43273 if (!this.pdfFont) { 43274 [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); 43275 } 43276 } 43277 defaultFont(fontFinder) { 43278 const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || fontFinder.find("Arial", false) || fontFinder.getDefault(); 43279 if (font?.regular) { 43280 const pdfFont = font.regular; 43281 const info = pdfFont.cssFontInfo; 43282 const xfaFont = { 43283 typeface: info.fontFamily, 43284 posture: "normal", 43285 weight: "normal", 43286 size: 10, 43287 letterSpacing: 0 43288 }; 43289 return [pdfFont, xfaFont]; 43290 } 43291 const xfaFont = { 43292 typeface: "Courier", 43293 posture: "normal", 43294 weight: "normal", 43295 size: 10, 43296 letterSpacing: 0 43297 }; 43298 return [null, xfaFont]; 43299 } 43300} 43301class FontSelector { 43302 constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) { 43303 this.fontFinder = fontFinder; 43304 this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)]; 43305 } 43306 pushData(xfaFont, margin, lineHeight) { 43307 const lastFont = this.stack.at(-1); 43308 for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) { 43309 if (!xfaFont[name]) { 43310 xfaFont[name] = lastFont.xfaFont[name]; 43311 } 43312 } 43313 for (const name of ["top", "bottom", "left", "right"]) { 43314 if (isNaN(margin[name])) { 43315 margin[name] = lastFont.paraMargin[name]; 43316 } 43317 } 43318 const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder); 43319 if (!fontInfo.pdfFont) { 43320 fontInfo.pdfFont = lastFont.pdfFont; 43321 } 43322 this.stack.push(fontInfo); 43323 } 43324 popFont() { 43325 this.stack.pop(); 43326 } 43327 topFont() { 43328 return this.stack.at(-1); 43329 } 43330} 43331class TextMeasure { 43332 constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) { 43333 this.glyphs = []; 43334 this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts); 43335 this.extraHeight = 0; 43336 } 43337 pushData(xfaFont, margin, lineHeight) { 43338 this.fontSelector.pushData(xfaFont, margin, lineHeight); 43339 } 43340 popFont(xfaFont) { 43341 return this.fontSelector.popFont(); 43342 } 43343 addPara() { 43344 const lastFont = this.fontSelector.topFont(); 43345 this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom; 43346 } 43347 addString(str) { 43348 if (!str) { 43349 return; 43350 } 43351 const lastFont = this.fontSelector.topFont(); 43352 const fontSize = lastFont.xfaFont.size; 43353 if (lastFont.pdfFont) { 43354 const letterSpacing = lastFont.xfaFont.letterSpacing; 43355 const pdfFont = lastFont.pdfFont; 43356 const fontLineHeight = pdfFont.lineHeight || 1.2; 43357 const lineHeight = lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize; 43358 const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; 43359 const noGap = fontLineHeight - lineGap; 43360 const firstLineHeight = Math.max(1, noGap) * fontSize; 43361 const scale = fontSize / 1000; 43362 const fallbackWidth = pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width; 43363 for (const line of str.split(/[\u2029\n]/)) { 43364 const encodedLine = pdfFont.encodeString(line).join(""); 43365 const glyphs = pdfFont.charsToGlyphs(encodedLine); 43366 for (const glyph of glyphs) { 43367 const width = glyph.width || fallbackWidth; 43368 this.glyphs.push([width * scale + letterSpacing, lineHeight, firstLineHeight, glyph.unicode, false]); 43369 } 43370 this.glyphs.push([0, 0, 0, "\n", true]); 43371 } 43372 this.glyphs.pop(); 43373 return; 43374 } 43375 for (const line of str.split(/[\u2029\n]/)) { 43376 for (const char of line.split("")) { 43377 this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]); 43378 } 43379 this.glyphs.push([0, 0, 0, "\n", true]); 43380 } 43381 this.glyphs.pop(); 43382 } 43383 compute(maxWidth) { 43384 let lastSpacePos = -1, 43385 lastSpaceWidth = 0, 43386 width = 0, 43387 height = 0, 43388 currentLineWidth = 0, 43389 currentLineHeight = 0; 43390 let isBroken = false;
vendor: 5,009 bytes, lines 43391-43582
43391 let isFirstLine = true; 43392 for (let i = 0, ii = this.glyphs.length; i < ii; i++) { 43393 const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = this.glyphs[i]; 43394 const isSpace = char === " "; 43395 const glyphHeight = isFirstLine ? firstLineHeight : lineHeight; 43396 if (isEOL) { 43397 width = Math.max(width, currentLineWidth); 43398 currentLineWidth = 0; 43399 height += currentLineHeight; 43400 currentLineHeight = glyphHeight; 43401 lastSpacePos = -1; 43402 lastSpaceWidth = 0; 43403 isFirstLine = false; 43404 continue; 43405 } 43406 if (isSpace) { 43407 if (currentLineWidth + glyphWidth > maxWidth) { 43408 width = Math.max(width, currentLineWidth); 43409 currentLineWidth = 0; 43410 height += currentLineHeight; 43411 currentLineHeight = glyphHeight; 43412 lastSpacePos = -1; 43413 lastSpaceWidth = 0; 43414 isBroken = true; 43415 isFirstLine = false; 43416 } else { 43417 currentLineHeight = Math.max(glyphHeight, currentLineHeight); 43418 lastSpaceWidth = currentLineWidth; 43419 currentLineWidth += glyphWidth; 43420 lastSpacePos = i; 43421 } 43422 continue; 43423 } 43424 if (currentLineWidth + glyphWidth > maxWidth) { 43425 height += currentLineHeight; 43426 currentLineHeight = glyphHeight; 43427 if (lastSpacePos !== -1) { 43428 i = lastSpacePos; 43429 width = Math.max(width, lastSpaceWidth); 43430 currentLineWidth = 0; 43431 lastSpacePos = -1; 43432 lastSpaceWidth = 0; 43433 } else { 43434 width = Math.max(width, currentLineWidth); 43435 currentLineWidth = glyphWidth; 43436 } 43437 isBroken = true; 43438 isFirstLine = false; 43439 continue; 43440 } 43441 currentLineWidth += glyphWidth; 43442 currentLineHeight = Math.max(glyphHeight, currentLineHeight); 43443 } 43444 width = Math.max(width, currentLineWidth); 43445 height += currentLineHeight + this.extraHeight; 43446 return { 43447 width: WIDTH_FACTOR * width, 43448 height, 43449 isBroken 43450 }; 43451 } 43452} 43453 43454;// ./src/core/xfa/som.js 43455 43456 43457 43458 43459 43460 43461const namePattern = /^[^.[]+/; 43462const indexPattern = /^[^\]]+/; 43463const operators = { 43464 dot: 0, 43465 dotDot: 1, 43466 dotHash: 2, 43467 dotBracket: 3, 43468 dotParen: 4 43469}; 43470const 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]]); 43471const somCache = new WeakMap(); 43472function parseIndex(index) { 43473 index = index.trim(); 43474 if (index === "*") { 43475 return Infinity; 43476 } 43477 return parseInt(index, 10) || 0; 43478} 43479function parseExpression(expr, dotDotAllowed, noExpr = true) { 43480 let match = expr.match(namePattern); 43481 if (!match) { 43482 return null; 43483 } 43484 let [name] = match; 43485 const parsed = [{ 43486 name, 43487 cacheName: "." + name, 43488 index: 0, 43489 js: null, 43490 formCalc: null, 43491 operator: operators.dot 43492 }]; 43493 let pos = name.length; 43494 while (pos < expr.length) { 43495 const spos = pos; 43496 const char = expr.charAt(pos++); 43497 if (char === "[") { 43498 match = expr.slice(pos).match(indexPattern); 43499 if (!match) { 43500 warn("XFA - Invalid index in SOM expression"); 43501 return null; 43502 } 43503 parsed.at(-1).index = parseIndex(match[0]); 43504 pos += match[0].length + 1; 43505 continue; 43506 } 43507 let operator; 43508 switch (expr.charAt(pos)) { 43509 case ".": 43510 if (!dotDotAllowed) { 43511 return null; 43512 } 43513 pos++; 43514 operator = operators.dotDot; 43515 break; 43516 case "#": 43517 pos++; 43518 operator = operators.dotHash; 43519 break; 43520 case "[": 43521 if (noExpr) { 43522 warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now."); 43523 return null; 43524 } 43525 operator = operators.dotBracket; 43526 break; 43527 case "(": 43528 if (noExpr) { 43529 warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now."); 43530 return null; 43531 } 43532 operator = operators.dotParen; 43533 break; 43534 default: 43535 operator = operators.dot; 43536 break; 43537 } 43538 match = expr.slice(pos).match(namePattern); 43539 if (!match) { 43540 break; 43541 } 43542 [name] = match; 43543 pos += name.length; 43544 parsed.push({ 43545 name, 43546 cacheName: expr.slice(spos, pos), 43547 operator, 43548 index: 0, 43549 js: null, 43550 formCalc: null 43551 }); 43552 } 43553 return parsed; 43554} 43555function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) { 43556 const parsed = parseExpression(expr, dotDotAllowed); 43557 if (!parsed) { 43558 return null; 43559 } 43560 const fn = shortcuts.get(parsed[0].name); 43561 let i = 0; 43562 let isQualified; 43563 if (fn) { 43564 isQualified = true; 43565 root = [fn(root, container)]; 43566 i = 1; 43567 } else { 43568 isQualified = container === null; 43569 root = [container || root]; 43570 } 43571 for (let ii = parsed.length; i < ii; i++) { 43572 const { 43573 name, 43574 cacheName, 43575 operator, 43576 index 43577 } = parsed[i]; 43578 const nodes = []; 43579 for (const node of root) { 43580 if (!node.isXFAObject) { 43581 continue; 43582 }
vendor: 14,594 bytes, lines 43583-44188
43583 let children, cached; 43584 if (useCache) { 43585 cached = somCache.get(node); 43586 if (!cached) { 43587 cached = new Map(); 43588 somCache.set(node, cached); 43589 } 43590 children = cached.get(cacheName); 43591 } 43592 if (!children) { 43593 switch (operator) { 43594 case operators.dot: 43595 children = node[$getChildrenByName](name, false); 43596 break; 43597 case operators.dotDot: 43598 children = node[$getChildrenByName](name, true); 43599 break; 43600 case operators.dotHash: 43601 children = node[$getChildrenByClass](name); 43602 children = children.isXFAObjectArray ? children.children : [children]; 43603 break; 43604 default: 43605 break; 43606 } 43607 if (useCache) { 43608 cached.set(cacheName, children); 43609 } 43610 } 43611 if (children.length > 0) { 43612 nodes.push(children); 43613 } 43614 } 43615 if (nodes.length === 0 && !isQualified && i === 0) { 43616 const parent = container[$getParent](); 43617 container = parent; 43618 if (!container) { 43619 return null; 43620 } 43621 i = -1; 43622 root = [container]; 43623 continue; 43624 } 43625 root = isFinite(index) ? nodes.filter(node => index < node.length).map(node => node[index]) : nodes.flat(); 43626 } 43627 if (root.length === 0) { 43628 return null; 43629 } 43630 return root; 43631} 43632function createDataNode(root, container, expr) { 43633 const parsed = parseExpression(expr); 43634 if (!parsed) { 43635 return null; 43636 } 43637 if (parsed.some(x => x.operator === operators.dotDot)) { 43638 return null; 43639 } 43640 const fn = shortcuts.get(parsed[0].name); 43641 let i = 0; 43642 if (fn) { 43643 root = fn(root, container); 43644 i = 1; 43645 } else { 43646 root = container || root; 43647 } 43648 for (let ii = parsed.length; i < ii; i++) { 43649 const { 43650 name, 43651 operator, 43652 index 43653 } = parsed[i]; 43654 if (!isFinite(index)) { 43655 parsed[i].index = 0; 43656 return root.createNodes(parsed.slice(i)); 43657 } 43658 let children; 43659 switch (operator) { 43660 case operators.dot: 43661 children = root[$getChildrenByName](name, false); 43662 break; 43663 case operators.dotDot: 43664 children = root[$getChildrenByName](name, true); 43665 break; 43666 case operators.dotHash: 43667 children = root[$getChildrenByClass](name); 43668 children = children.isXFAObjectArray ? children.children : [children]; 43669 break; 43670 default: 43671 break; 43672 } 43673 if (children.length === 0) { 43674 return root.createNodes(parsed.slice(i)); 43675 } 43676 if (index < children.length) { 43677 const child = children[index]; 43678 if (!child.isXFAObject) { 43679 warn(`XFA - Cannot create a node.`); 43680 return null; 43681 } 43682 root = child; 43683 } else { 43684 parsed[i].index = index - children.length; 43685 return root.createNodes(parsed.slice(i)); 43686 } 43687 } 43688 return null; 43689} 43690 43691;// ./src/core/xfa/xfa_object.js 43692 43693 43694 43695 43696 43697 43698 43699 43700 43701 43702 43703 43704 43705 43706 43707 43708 43709const _applyPrototype = Symbol(); 43710const _attributes = Symbol(); 43711const _attributeNames = Symbol(); 43712const _children = Symbol("_children"); 43713const _cloneAttribute = Symbol(); 43714const _dataValue = Symbol(); 43715const _defaultValue = Symbol(); 43716const _filteredChildrenGenerator = Symbol(); 43717const _getPrototype = Symbol(); 43718const _getUnsetAttributes = Symbol(); 43719const _hasChildren = Symbol(); 43720const _max = Symbol(); 43721const _options = Symbol(); 43722const _parent = Symbol("parent"); 43723const _resolvePrototypesHelper = Symbol(); 43724const _setAttributes = Symbol(); 43725const _validator = Symbol(); 43726let uid = 0; 43727const NS_DATASETS = NamespaceIds.datasets.id; 43728class XFAObject { 43729 constructor(nsId, name, hasChildren = false) { 43730 this[$namespaceId] = nsId; 43731 this[$nodeName] = name; 43732 this[_hasChildren] = hasChildren; 43733 this[_parent] = null; 43734 this[_children] = []; 43735 this[$uid] = `${name}${uid++}`; 43736 this[$globalData] = null; 43737 } 43738 get isXFAObject() { 43739 return true; 43740 } 43741 get isXFAObjectArray() { 43742 return false; 43743 } 43744 createNodes(path) { 43745 let root = this, 43746 node = null; 43747 for (const { 43748 name, 43749 index 43750 } of path) { 43751 for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) { 43752 const nsId = root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId]; 43753 node = new XmlObject(nsId, name); 43754 root[$appendChild](node); 43755 } 43756 root = node; 43757 } 43758 return node; 43759 } 43760 [$onChild](child) { 43761 if (!this[_hasChildren] || !this[$onChildCheck](child)) { 43762 return false; 43763 } 43764 const name = child[$nodeName]; 43765 const node = this[name]; 43766 if (node instanceof XFAObjectArray) { 43767 if (node.push(child)) { 43768 this[$appendChild](child); 43769 return true; 43770 } 43771 } else { 43772 if (node !== null) { 43773 this[$removeChild](node); 43774 } 43775 this[name] = child; 43776 this[$appendChild](child); 43777 return true; 43778 } 43779 let id = ""; 43780 if (this.id) { 43781 id = ` (id: ${this.id})`; 43782 } else if (this.name) { 43783 id = ` (name: ${this.name} ${this.h.value})`; 43784 } 43785 warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`); 43786 return false; 43787 } 43788 [$onChildCheck](child) { 43789 return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; 43790 } 43791 [$isNsAgnostic]() { 43792 return false; 43793 } 43794 [$acceptWhitespace]() { 43795 return false; 43796 } 43797 [$isCDATAXml]() { 43798 return false; 43799 } 43800 [$isBindable]() { 43801 return false; 43802 } 43803 [$popPara]() { 43804 if (this.para) { 43805 this[$getTemplateRoot]()[$extra].paraStack.pop(); 43806 } 43807 } 43808 [$pushPara]() { 43809 this[$getTemplateRoot]()[$extra].paraStack.push(this.para); 43810 } 43811 [$setId](ids) { 43812 if (this.id && this[$namespaceId] === NamespaceIds.template.id) { 43813 ids.set(this.id, this); 43814 } 43815 } 43816 [$getTemplateRoot]() { 43817 return this[$globalData].template; 43818 } 43819 [$isSplittable]() { 43820 return false; 43821 } 43822 [$isThereMoreWidth]() { 43823 return false; 43824 } 43825 [$appendChild](child) { 43826 child[_parent] = this; 43827 this[_children].push(child); 43828 if (!child[$globalData] && this[$globalData]) { 43829 child[$globalData] = this[$globalData]; 43830 } 43831 } 43832 [$removeChild](child) { 43833 const i = this[_children].indexOf(child); 43834 this[_children].splice(i, 1); 43835 } 43836 [$hasSettableValue]() { 43837 return this.hasOwnProperty("value"); 43838 } 43839 [$setValue](_) {} 43840 [$onText](_) {} 43841 [$finalize]() {} 43842 [$clean](builder) { 43843 delete this[_hasChildren]; 43844 if (this[$cleanup]) { 43845 builder.clean(this[$cleanup]); 43846 delete this[$cleanup]; 43847 } 43848 } 43849 [$indexOf](child) { 43850 return this[_children].indexOf(child); 43851 } 43852 [$insertAt](i, child) { 43853 child[_parent] = this; 43854 this[_children].splice(i, 0, child); 43855 if (!child[$globalData] && this[$globalData]) { 43856 child[$globalData] = this[$globalData]; 43857 } 43858 } 43859 [$isTransparent]() { 43860 return !this.name; 43861 } 43862 [$lastAttribute]() { 43863 return ""; 43864 } 43865 [$text]() { 43866 if (this[_children].length === 0) { 43867 return this[$content]; 43868 } 43869 return this[_children].map(c => c[$text]()).join(""); 43870 } 43871 get [_attributeNames]() { 43872 const proto = Object.getPrototypeOf(this); 43873 if (!proto._attributes) { 43874 const attributes = proto._attributes = new Set(); 43875 for (const name of Object.getOwnPropertyNames(this)) { 43876 if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) { 43877 break; 43878 } 43879 attributes.add(name); 43880 } 43881 } 43882 return shadow(this, _attributeNames, proto._attributes); 43883 } 43884 [$isDescendent](parent) { 43885 let node = this; 43886 while (node) { 43887 if (node === parent) { 43888 return true; 43889 } 43890 node = node[$getParent](); 43891 } 43892 return false; 43893 } 43894 [$getParent]() { 43895 return this[_parent]; 43896 } 43897 [$getSubformParent]() { 43898 return this[$getParent](); 43899 } 43900 [$getChildren](name = null) { 43901 if (!name) { 43902 return this[_children]; 43903 } 43904 return this[name]; 43905 } 43906 [$dump]() { 43907 const dumped = Object.create(null); 43908 if (this[$content]) { 43909 dumped.$content = this[$content]; 43910 } 43911 for (const name of Object.getOwnPropertyNames(this)) { 43912 const value = this[name]; 43913 if (value === null) { 43914 continue; 43915 } 43916 if (value instanceof XFAObject) { 43917 dumped[name] = value[$dump](); 43918 } else if (value instanceof XFAObjectArray) { 43919 if (!value.isEmpty()) { 43920 dumped[name] = value.dump(); 43921 } 43922 } else { 43923 dumped[name] = value; 43924 } 43925 } 43926 return dumped; 43927 } 43928 [$toStyle]() { 43929 return null; 43930 } 43931 [$toHTML]() { 43932 return HTMLResult.EMPTY; 43933 } 43934 *[$getContainedChildren]() { 43935 for (const node of this[$getChildren]()) { 43936 yield node; 43937 } 43938 } 43939 *[_filteredChildrenGenerator](filter, include) { 43940 for (const node of this[$getContainedChildren]()) { 43941 if (!filter || include === filter.has(node[$nodeName])) { 43942 const availableSpace = this[$getAvailableSpace](); 43943 const res = node[$toHTML](availableSpace); 43944 if (!res.success) { 43945 this[$extra].failingNode = node; 43946 } 43947 yield res; 43948 } 43949 } 43950 } 43951 [$flushHTML]() { 43952 return null; 43953 } 43954 [$addHTML](html, bbox) { 43955 this[$extra].children.push(html); 43956 } 43957 [$getAvailableSpace]() {} 43958 [$childrenToHTML]({ 43959 filter = null, 43960 include = true 43961 }) { 43962 if (!this[$extra].generator) { 43963 this[$extra].generator = this[_filteredChildrenGenerator](filter, include); 43964 } else { 43965 const availableSpace = this[$getAvailableSpace](); 43966 const res = this[$extra].failingNode[$toHTML](availableSpace); 43967 if (!res.success) { 43968 return res; 43969 } 43970 if (res.html) { 43971 this[$addHTML](res.html, res.bbox); 43972 } 43973 delete this[$extra].failingNode; 43974 } 43975 while (true) { 43976 const gen = this[$extra].generator.next(); 43977 if (gen.done) { 43978 break; 43979 } 43980 const res = gen.value; 43981 if (!res.success) { 43982 return res; 43983 } 43984 if (res.html) { 43985 this[$addHTML](res.html, res.bbox); 43986 } 43987 } 43988 this[$extra].generator = null; 43989 return HTMLResult.EMPTY; 43990 } 43991 [$setSetAttributes](attributes) { 43992 this[_setAttributes] = new Set(Object.keys(attributes)); 43993 } 43994 [_getUnsetAttributes](protoAttributes) { 43995 const allAttr = this[_attributeNames]; 43996 const setAttr = this[_setAttributes]; 43997 return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x)); 43998 } 43999 [$resolvePrototypes](ids, ancestors = new Set()) { 44000 for (const child of this[_children]) { 44001 child[_resolvePrototypesHelper](ids, ancestors); 44002 } 44003 } 44004 [_resolvePrototypesHelper](ids, ancestors) { 44005 const proto = this[_getPrototype](ids, ancestors); 44006 if (proto) { 44007 this[_applyPrototype](proto, ids, ancestors); 44008 } else { 44009 this[$resolvePrototypes](ids, ancestors); 44010 } 44011 } 44012 [_getPrototype](ids, ancestors) { 44013 const { 44014 use, 44015 usehref 44016 } = this; 44017 if (!use && !usehref) { 44018 return null; 44019 } 44020 let proto = null; 44021 let somExpression = null; 44022 let id = null; 44023 let ref = use; 44024 if (usehref) { 44025 ref = usehref; 44026 if (usehref.startsWith("#som(") && usehref.endsWith(")")) { 44027 somExpression = usehref.slice("#som(".length, -1); 44028 } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) { 44029 somExpression = usehref.slice(".#som(".length, -1); 44030 } else if (usehref.startsWith("#")) { 44031 id = usehref.slice(1); 44032 } else if (usehref.startsWith(".#")) { 44033 id = usehref.slice(2); 44034 } 44035 } else if (use.startsWith("#")) { 44036 id = use.slice(1); 44037 } else { 44038 somExpression = use; 44039 } 44040 this.use = this.usehref = ""; 44041 if (id) { 44042 proto = ids.get(id); 44043 } else { 44044 proto = searchNode(ids.get($root), this, somExpression, true, false); 44045 if (proto) { 44046 proto = proto[0]; 44047 } 44048 } 44049 if (!proto) { 44050 warn(`XFA - Invalid prototype reference: ${ref}.`); 44051 return null; 44052 } 44053 if (proto[$nodeName] !== this[$nodeName]) { 44054 warn(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`); 44055 return null; 44056 } 44057 if (ancestors.has(proto)) { 44058 warn(`XFA - Cycle detected in prototypes use.`); 44059 return null; 44060 } 44061 ancestors.add(proto); 44062 const protoProto = proto[_getPrototype](ids, ancestors); 44063 if (protoProto) { 44064 proto[_applyPrototype](protoProto, ids, ancestors); 44065 } 44066 proto[$resolvePrototypes](ids, ancestors); 44067 ancestors.delete(proto); 44068 return proto; 44069 } 44070 [_applyPrototype](proto, ids, ancestors) { 44071 if (ancestors.has(proto)) { 44072 warn(`XFA - Cycle detected in prototypes use.`); 44073 return; 44074 } 44075 if (!this[$content] && proto[$content]) { 44076 this[$content] = proto[$content]; 44077 } 44078 const newAncestors = new Set(ancestors); 44079 newAncestors.add(proto); 44080 for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) { 44081 this[unsetAttrName] = proto[unsetAttrName]; 44082 if (this[_setAttributes]) { 44083 this[_setAttributes].add(unsetAttrName); 44084 } 44085 } 44086 for (const name of Object.getOwnPropertyNames(this)) { 44087 if (this[_attributeNames].has(name)) { 44088 continue; 44089 } 44090 const value = this[name]; 44091 const protoValue = proto[name]; 44092 if (value instanceof XFAObjectArray) { 44093 for (const child of value[_children]) { 44094 child[_resolvePrototypesHelper](ids, ancestors); 44095 } 44096 for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) { 44097 const child = proto[_children][i][$clone](); 44098 if (value.push(child)) { 44099 child[_parent] = this; 44100 this[_children].push(child); 44101 child[_resolvePrototypesHelper](ids, ancestors); 44102 } else { 44103 break; 44104 } 44105 } 44106 continue; 44107 } 44108 if (value !== null) { 44109 value[$resolvePrototypes](ids, ancestors); 44110 if (protoValue) { 44111 value[_applyPrototype](protoValue, ids, ancestors); 44112 } 44113 continue; 44114 } 44115 if (protoValue !== null) { 44116 const child = protoValue[$clone](); 44117 child[_parent] = this; 44118 this[name] = child; 44119 this[_children].push(child); 44120 child[_resolvePrototypesHelper](ids, ancestors); 44121 } 44122 } 44123 } 44124 static [_cloneAttribute](obj) { 44125 if (Array.isArray(obj)) { 44126 return obj.map(x => XFAObject[_cloneAttribute](x)); 44127 } 44128 if (typeof obj === "object" && obj !== null) { 44129 return Object.assign({}, obj); 44130 } 44131 return obj; 44132 } 44133 [$clone]() { 44134 const clone = Object.create(Object.getPrototypeOf(this)); 44135 for (const $symbol of Object.getOwnPropertySymbols(this)) { 44136 try { 44137 clone[$symbol] = this[$symbol]; 44138 } catch { 44139 shadow(clone, $symbol, this[$symbol]); 44140 } 44141 } 44142 clone[$uid] = `${clone[$nodeName]}${uid++}`; 44143 clone[_children] = []; 44144 for (const name of Object.getOwnPropertyNames(this)) { 44145 if (this[_attributeNames].has(name)) { 44146 clone[name] = XFAObject[_cloneAttribute](this[name]); 44147 continue; 44148 } 44149 const value = this[name]; 44150 clone[name] = value instanceof XFAObjectArray ? new XFAObjectArray(value[_max]) : null; 44151 } 44152 for (const child of this[_children]) { 44153 const name = child[$nodeName]; 44154 const clonedChild = child[$clone](); 44155 clone[_children].push(clonedChild); 44156 clonedChild[_parent] = clone; 44157 if (clone[name] === null) { 44158 clone[name] = clonedChild; 44159 } else { 44160 clone[name][_children].push(clonedChild); 44161 } 44162 } 44163 return clone; 44164 } 44165 [$getChildren](name = null) { 44166 if (!name) { 44167 return this[_children]; 44168 } 44169 return this[_children].filter(c => c[$nodeName] === name); 44170 } 44171 [$getChildrenByClass](name) { 44172 return this[name]; 44173 } 44174 [$getChildrenByName](name, allTransparent, first = true) { 44175 return Array.from(this[$getChildrenByNameIt](name, allTransparent, first)); 44176 } 44177 *[$getChildrenByNameIt](name, allTransparent, first = true) { 44178 if (name === "parent") { 44179 yield this[_parent]; 44180 return; 44181 } 44182 for (const child of this[_children]) { 44183 if (child[$nodeName] === name) { 44184 yield child; 44185 } 44186 if (child.name === name) { 44187 yield child; 44188 }
vendor: 2,014 bytes, lines 44189-44274
44189 if (allTransparent || child[$isTransparent]()) { 44190 yield* child[$getChildrenByNameIt](name, allTransparent, false); 44191 } 44192 } 44193 if (first && this[_attributeNames].has(name)) { 44194 yield new XFAAttribute(this, name, this[name]); 44195 } 44196 } 44197} 44198class XFAObjectArray { 44199 constructor(max = Infinity) { 44200 this[_max] = max; 44201 this[_children] = []; 44202 } 44203 get isXFAObject() { 44204 return false; 44205 } 44206 get isXFAObjectArray() { 44207 return true; 44208 } 44209 push(child) { 44210 const len = this[_children].length; 44211 if (len <= this[_max]) { 44212 this[_children].push(child); 44213 return true; 44214 } 44215 warn(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`); 44216 return false; 44217 } 44218 isEmpty() { 44219 return this[_children].length === 0; 44220 } 44221 dump() { 44222 return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]()); 44223 } 44224 [$clone]() { 44225 const clone = new XFAObjectArray(this[_max]); 44226 clone[_children] = this[_children].map(c => c[$clone]()); 44227 return clone; 44228 } 44229 get children() { 44230 return this[_children]; 44231 } 44232 clear() { 44233 this[_children].length = 0; 44234 } 44235} 44236class XFAAttribute { 44237 constructor(node, name, value) { 44238 this[_parent] = node; 44239 this[$nodeName] = name; 44240 this[$content] = value; 44241 this[$consumed] = false; 44242 this[$uid] = `attribute${uid++}`; 44243 } 44244 [$getParent]() { 44245 return this[_parent]; 44246 } 44247 [$isDataValue]() { 44248 return true; 44249 } 44250 [$getDataValue]() { 44251 return this[$content].trim(); 44252 } 44253 [$setValue](value) { 44254 value = value.value || ""; 44255 this[$content] = value.toString(); 44256 } 44257 [$text]() { 44258 return this[$content]; 44259 } 44260 [$isDescendent](parent) { 44261 return this[_parent] === parent || this[_parent][$isDescendent](parent); 44262 } 44263} 44264class XmlObject extends XFAObject { 44265 constructor(nsId, name, attributes = {}) { 44266 super(nsId, name); 44267 this[$content] = ""; 44268 this[_dataValue] = null; 44269 if (name !== "#text") { 44270 const map = new Map(); 44271 this[_attributes] = map; 44272 for (const [attrName, value] of Object.entries(attributes)) { 44273 map.set(attrName, new XFAAttribute(this, attrName, value)); 44274 }
vendor: 2,684 bytes, lines 44275-44380
44275 if (attributes.hasOwnProperty($nsAttributes)) { 44276 const dataNode = attributes[$nsAttributes].xfa.dataNode; 44277 if (dataNode !== undefined) { 44278 if (dataNode === "dataGroup") { 44279 this[_dataValue] = false; 44280 } else if (dataNode === "dataValue") { 44281 this[_dataValue] = true; 44282 } 44283 } 44284 } 44285 } 44286 this[$consumed] = false; 44287 } 44288 [$toString](buf) { 44289 const tagName = this[$nodeName]; 44290 if (tagName === "#text") { 44291 buf.push(encodeToXmlString(this[$content])); 44292 return; 44293 } 44294 const utf8TagName = utf8StringToString(tagName); 44295 const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; 44296 buf.push(`<${prefix}${utf8TagName}`); 44297 for (const [name, value] of this[_attributes].entries()) { 44298 const utf8Name = utf8StringToString(name); 44299 buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`); 44300 } 44301 if (this[_dataValue] !== null) { 44302 if (this[_dataValue]) { 44303 buf.push(` xfa:dataNode="dataValue"`); 44304 } else { 44305 buf.push(` xfa:dataNode="dataGroup"`); 44306 } 44307 } 44308 if (!this[$content] && this[_children].length === 0) { 44309 buf.push("/>"); 44310 return; 44311 } 44312 buf.push(">"); 44313 if (this[$content]) { 44314 if (typeof this[$content] === "string") { 44315 buf.push(encodeToXmlString(this[$content])); 44316 } else { 44317 this[$content][$toString](buf); 44318 } 44319 } else { 44320 for (const child of this[_children]) { 44321 child[$toString](buf); 44322 } 44323 } 44324 buf.push(`</${prefix}${utf8TagName}>`); 44325 } 44326 [$onChild](child) { 44327 if (this[$content]) { 44328 const node = new XmlObject(this[$namespaceId], "#text"); 44329 this[$appendChild](node); 44330 node[$content] = this[$content]; 44331 this[$content] = ""; 44332 } 44333 this[$appendChild](child); 44334 return true; 44335 } 44336 [$onText](str) { 44337 this[$content] += str; 44338 } 44339 [$finalize]() { 44340 if (this[$content] && this[_children].length > 0) { 44341 const node = new XmlObject(this[$namespaceId], "#text"); 44342 this[$appendChild](node); 44343 node[$content] = this[$content]; 44344 delete this[$content]; 44345 } 44346 } 44347 [$toHTML]() { 44348 if (this[$nodeName] === "#text") { 44349 return HTMLResult.success({ 44350 name: "#text", 44351 value: this[$content] 44352 }); 44353 } 44354 return HTMLResult.EMPTY; 44355 } 44356 [$getChildren](name = null) { 44357 if (!name) { 44358 return this[_children]; 44359 } 44360 return this[_children].filter(c => c[$nodeName] === name); 44361 } 44362 [$getAttributes]() { 44363 return this[_attributes]; 44364 } 44365 [$getChildrenByClass](name) { 44366 const value = this[_attributes].get(name); 44367 if (value !== undefined) { 44368 return value; 44369 } 44370 return this[$getChildren](name); 44371 } 44372 *[$getChildrenByNameIt](name, allTransparent) { 44373 const value = this[_attributes].get(name); 44374 if (value) { 44375 yield value; 44376 } 44377 for (const child of this[_children]) { 44378 if (child[$nodeName] === name) { 44379 yield child; 44380 }
vendor: 5,957 bytes, lines 44381-44626
44381 if (allTransparent) { 44382 yield* child[$getChildrenByNameIt](name, allTransparent); 44383 } 44384 } 44385 } 44386 *[$getAttributeIt](name, skipConsumed) { 44387 const value = this[_attributes].get(name); 44388 if (value && (!skipConsumed || !value[$consumed])) { 44389 yield value; 44390 } 44391 for (const child of this[_children]) { 44392 yield* child[$getAttributeIt](name, skipConsumed); 44393 } 44394 } 44395 *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) { 44396 for (const child of this[_children]) { 44397 if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) { 44398 yield child; 44399 } 44400 if (allTransparent) { 44401 yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed); 44402 } 44403 } 44404 } 44405 [$isDataValue]() { 44406 if (this[_dataValue] === null) { 44407 return this[_children].length === 0 || this[_children][0][$namespaceId] === NamespaceIds.xhtml.id; 44408 } 44409 return this[_dataValue]; 44410 } 44411 [$getDataValue]() { 44412 if (this[_dataValue] === null) { 44413 if (this[_children].length === 0) { 44414 return this[$content].trim(); 44415 } 44416 if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) { 44417 return this[_children][0][$text]().trim(); 44418 } 44419 return null; 44420 } 44421 return this[$content].trim(); 44422 } 44423 [$setValue](value) { 44424 value = value.value || ""; 44425 this[$content] = value.toString(); 44426 } 44427 [$dump](hasNS = false) { 44428 const dumped = Object.create(null); 44429 if (hasNS) { 44430 dumped.$ns = this[$namespaceId]; 44431 } 44432 if (this[$content]) { 44433 dumped.$content = this[$content]; 44434 } 44435 dumped.$name = this[$nodeName]; 44436 dumped.children = []; 44437 for (const child of this[_children]) { 44438 dumped.children.push(child[$dump](hasNS)); 44439 } 44440 dumped.attributes = Object.create(null); 44441 for (const [name, value] of this[_attributes]) { 44442 dumped.attributes[name] = value[$content]; 44443 } 44444 return dumped; 44445 } 44446} 44447class ContentObject extends XFAObject { 44448 constructor(nsId, name) { 44449 super(nsId, name); 44450 this[$content] = ""; 44451 } 44452 [$onText](text) { 44453 this[$content] += text; 44454 } 44455 [$finalize]() {} 44456} 44457class OptionObject extends ContentObject { 44458 constructor(nsId, name, options) { 44459 super(nsId, name); 44460 this[_options] = options; 44461 } 44462 [$finalize]() { 44463 this[$content] = getKeyword({ 44464 data: this[$content], 44465 defaultValue: this[_options][0], 44466 validate: k => this[_options].includes(k) 44467 }); 44468 } 44469 [$clean](builder) { 44470 super[$clean](builder); 44471 delete this[_options]; 44472 } 44473} 44474class StringObject extends ContentObject { 44475 [$finalize]() { 44476 this[$content] = this[$content].trim(); 44477 } 44478} 44479class IntegerObject extends ContentObject { 44480 constructor(nsId, name, defaultValue, validator) { 44481 super(nsId, name); 44482 this[_defaultValue] = defaultValue; 44483 this[_validator] = validator; 44484 } 44485 [$finalize]() { 44486 this[$content] = getInteger({ 44487 data: this[$content], 44488 defaultValue: this[_defaultValue], 44489 validate: this[_validator] 44490 }); 44491 } 44492 [$clean](builder) { 44493 super[$clean](builder); 44494 delete this[_defaultValue]; 44495 delete this[_validator]; 44496 } 44497} 44498class Option01 extends IntegerObject { 44499 constructor(nsId, name) { 44500 super(nsId, name, 0, n => n === 1); 44501 } 44502} 44503class Option10 extends IntegerObject { 44504 constructor(nsId, name) { 44505 super(nsId, name, 1, n => n === 0); 44506 } 44507} 44508 44509;// ./src/core/xfa/html_utils.js 44510 44511 44512 44513 44514 44515 44516 44517 44518 44519 44520function measureToString(m) { 44521 if (typeof m === "string") { 44522 return "0px"; 44523 } 44524 return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`; 44525} 44526const converters = { 44527 anchorType(node, style) { 44528 const parent = node[$getSubformParent](); 44529 if (!parent || parent.layout && parent.layout !== "position") { 44530 return; 44531 } 44532 if (!("transform" in style)) { 44533 style.transform = ""; 44534 } 44535 switch (node.anchorType) { 44536 case "bottomCenter": 44537 style.transform += "translate(-50%, -100%)"; 44538 break; 44539 case "bottomLeft": 44540 style.transform += "translate(0,-100%)"; 44541 break; 44542 case "bottomRight": 44543 style.transform += "translate(-100%,-100%)"; 44544 break; 44545 case "middleCenter": 44546 style.transform += "translate(-50%,-50%)"; 44547 break; 44548 case "middleLeft": 44549 style.transform += "translate(0,-50%)"; 44550 break; 44551 case "middleRight": 44552 style.transform += "translate(-100%,-50%)"; 44553 break; 44554 case "topCenter": 44555 style.transform += "translate(-50%,0)"; 44556 break; 44557 case "topRight": 44558 style.transform += "translate(-100%,0)"; 44559 break; 44560 } 44561 }, 44562 dimensions(node, style) { 44563 const parent = node[$getSubformParent](); 44564 let width = node.w; 44565 const height = node.h; 44566 if (parent.layout?.includes("row")) { 44567 const extra = parent[$extra]; 44568 const colSpan = node.colSpan; 44569 let w; 44570 if (colSpan === -1) { 44571 w = extra.columnWidths.slice(extra.currentColumn).reduce((a, x) => a + x, 0); 44572 extra.currentColumn = 0; 44573 } else { 44574 w = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, x) => a + x, 0); 44575 extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length; 44576 } 44577 if (!isNaN(w)) { 44578 width = node.w = w; 44579 } 44580 } 44581 style.width = width !== "" ? measureToString(width) : "auto"; 44582 style.height = height !== "" ? measureToString(height) : "auto"; 44583 }, 44584 position(node, style) { 44585 const parent = node[$getSubformParent](); 44586 if (parent?.layout && parent.layout !== "position") { 44587 return; 44588 } 44589 style.position = "absolute"; 44590 style.left = measureToString(node.x); 44591 style.top = measureToString(node.y); 44592 }, 44593 rotate(node, style) { 44594 if (node.rotate) { 44595 if (!("transform" in style)) { 44596 style.transform = ""; 44597 } 44598 style.transform += `rotate(-${node.rotate}deg)`; 44599 style.transformOrigin = "top left"; 44600 } 44601 }, 44602 presence(node, style) { 44603 switch (node.presence) { 44604 case "invisible": 44605 style.visibility = "hidden"; 44606 break; 44607 case "hidden": 44608 case "inactive": 44609 style.display = "none"; 44610 break; 44611 } 44612 }, 44613 hAlign(node, style) { 44614 if (node[$nodeName] === "para") { 44615 switch (node.hAlign) { 44616 case "justifyAll": 44617 style.textAlign = "justify-all"; 44618 break; 44619 case "radix": 44620 style.textAlign = "left"; 44621 break; 44622 default: 44623 style.textAlign = node.hAlign; 44624 } 44625 } else { 44626 switch (node.hAlign) {
vendor: 13,121 bytes, lines 44627-45133
44627 case "left": 44628 style.alignSelf = "start"; 44629 break; 44630 case "center": 44631 style.alignSelf = "center"; 44632 break; 44633 case "right": 44634 style.alignSelf = "end"; 44635 break; 44636 } 44637 } 44638 }, 44639 margin(node, style) { 44640 if (node.margin) { 44641 style.margin = node.margin[$toStyle]().margin; 44642 } 44643 } 44644}; 44645function setMinMaxDimensions(node, style) { 44646 const parent = node[$getSubformParent](); 44647 if (parent.layout === "position") { 44648 if (node.minW > 0) { 44649 style.minWidth = measureToString(node.minW); 44650 } 44651 if (node.maxW > 0) { 44652 style.maxWidth = measureToString(node.maxW); 44653 } 44654 if (node.minH > 0) { 44655 style.minHeight = measureToString(node.minH); 44656 } 44657 if (node.maxH > 0) { 44658 style.maxHeight = measureToString(node.maxH); 44659 } 44660 } 44661} 44662function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) { 44663 const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder); 44664 if (typeof text === "string") { 44665 measure.addString(text); 44666 } else { 44667 text[$pushGlyphs](measure); 44668 } 44669 return measure.compute(width); 44670} 44671function layoutNode(node, availableSpace) { 44672 let height = null; 44673 let width = null; 44674 let isBroken = false; 44675 if ((!node.w || !node.h) && node.value) { 44676 let marginH = 0; 44677 let marginV = 0; 44678 if (node.margin) { 44679 marginH = node.margin.leftInset + node.margin.rightInset; 44680 marginV = node.margin.topInset + node.margin.bottomInset; 44681 } 44682 let lineHeight = null; 44683 let margin = null; 44684 if (node.para) { 44685 margin = Object.create(null); 44686 lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight; 44687 margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove; 44688 margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow; 44689 margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft; 44690 margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight; 44691 } 44692 let font = node.font; 44693 if (!font) { 44694 const root = node[$getTemplateRoot](); 44695 let parent = node[$getParent](); 44696 while (parent && parent !== root) { 44697 if (parent.font) { 44698 font = parent.font; 44699 break; 44700 } 44701 parent = parent[$getParent](); 44702 } 44703 } 44704 const maxWidth = (node.w || availableSpace.width) - marginH; 44705 const fontFinder = node[$globalData].fontFinder; 44706 if (node.value.exData && node.value.exData[$content] && node.value.exData.contentType === "text/html") { 44707 const res = layoutText(node.value.exData[$content], font, margin, lineHeight, fontFinder, maxWidth); 44708 width = res.width; 44709 height = res.height; 44710 isBroken = res.isBroken; 44711 } else { 44712 const text = node.value[$text](); 44713 if (text) { 44714 const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth); 44715 width = res.width; 44716 height = res.height; 44717 isBroken = res.isBroken; 44718 } 44719 } 44720 if (width !== null && !node.w) { 44721 width += marginH; 44722 } 44723 if (height !== null && !node.h) { 44724 height += marginV; 44725 } 44726 } 44727 return { 44728 w: width, 44729 h: height, 44730 isBroken 44731 }; 44732} 44733function computeBbox(node, html, availableSpace) { 44734 let bbox; 44735 if (node.w !== "" && node.h !== "") { 44736 bbox = [node.x, node.y, node.w, node.h]; 44737 } else { 44738 if (!availableSpace) { 44739 return null; 44740 } 44741 let width = node.w; 44742 if (width === "") { 44743 if (node.maxW === 0) { 44744 const parent = node[$getSubformParent](); 44745 width = parent.layout === "position" && parent.w !== "" ? 0 : node.minW; 44746 } else { 44747 width = Math.min(node.maxW, availableSpace.width); 44748 } 44749 html.attributes.style.width = measureToString(width); 44750 } 44751 let height = node.h; 44752 if (height === "") { 44753 if (node.maxH === 0) { 44754 const parent = node[$getSubformParent](); 44755 height = parent.layout === "position" && parent.h !== "" ? 0 : node.minH; 44756 } else { 44757 height = Math.min(node.maxH, availableSpace.height); 44758 } 44759 html.attributes.style.height = measureToString(height); 44760 } 44761 bbox = [node.x, node.y, width, height]; 44762 } 44763 return bbox; 44764} 44765function fixDimensions(node) { 44766 const parent = node[$getSubformParent](); 44767 if (parent.layout?.includes("row")) { 44768 const extra = parent[$extra]; 44769 const colSpan = node.colSpan; 44770 let width; 44771 if (colSpan === -1) { 44772 width = extra.columnWidths.slice(extra.currentColumn).reduce((a, w) => a + w, 0); 44773 } else { 44774 width = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, w) => a + w, 0); 44775 } 44776 if (!isNaN(width)) { 44777 node.w = width; 44778 } 44779 } 44780 if (parent.layout && parent.layout !== "position") { 44781 node.x = node.y = 0; 44782 } 44783 if (node.layout === "table") { 44784 if (node.w === "" && Array.isArray(node.columnWidths)) { 44785 node.w = node.columnWidths.reduce((a, x) => a + x, 0); 44786 } 44787 } 44788} 44789function layoutClass(node) { 44790 switch (node.layout) { 44791 case "position": 44792 return "xfaPosition"; 44793 case "lr-tb": 44794 return "xfaLrTb"; 44795 case "rl-row": 44796 return "xfaRlRow"; 44797 case "rl-tb": 44798 return "xfaRlTb"; 44799 case "row": 44800 return "xfaRow"; 44801 case "table": 44802 return "xfaTable"; 44803 case "tb": 44804 return "xfaTb"; 44805 default: 44806 return "xfaPosition"; 44807 } 44808} 44809function toStyle(node, ...names) { 44810 const style = Object.create(null); 44811 for (const name of names) { 44812 const value = node[name]; 44813 if (value === null) { 44814 continue; 44815 } 44816 if (converters.hasOwnProperty(name)) { 44817 converters[name](node, style); 44818 continue; 44819 } 44820 if (value instanceof XFAObject) { 44821 const newStyle = value[$toStyle](); 44822 if (newStyle) { 44823 Object.assign(style, newStyle); 44824 } else { 44825 warn(`(DEBUG) - XFA - style for ${name} not implemented yet`); 44826 } 44827 } 44828 } 44829 return style; 44830} 44831function createWrapper(node, html) { 44832 const { 44833 attributes 44834 } = html; 44835 const { 44836 style 44837 } = attributes; 44838 const wrapper = { 44839 name: "div", 44840 attributes: { 44841 class: ["xfaWrapper"], 44842 style: Object.create(null) 44843 }, 44844 children: [] 44845 }; 44846 attributes.class.push("xfaWrapped"); 44847 if (node.border) { 44848 const { 44849 widths, 44850 insets 44851 } = node.border[$extra]; 44852 let width, height; 44853 let top = insets[0]; 44854 let left = insets[3]; 44855 const insetsH = insets[0] + insets[2]; 44856 const insetsW = insets[1] + insets[3]; 44857 switch (node.border.hand) { 44858 case "even": 44859 top -= widths[0] / 2; 44860 left -= widths[3] / 2; 44861 width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`; 44862 height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`; 44863 break; 44864 case "left": 44865 top -= widths[0]; 44866 left -= widths[3]; 44867 width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`; 44868 height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`; 44869 break; 44870 case "right": 44871 width = insetsW ? `calc(100% - ${insetsW}px)` : "100%"; 44872 height = insetsH ? `calc(100% - ${insetsH}px)` : "100%"; 44873 break; 44874 } 44875 const classNames = ["xfaBorder"]; 44876 if (isPrintOnly(node.border)) { 44877 classNames.push("xfaPrintOnly"); 44878 } 44879 const border = { 44880 name: "div", 44881 attributes: { 44882 class: classNames, 44883 style: { 44884 top: `${top}px`, 44885 left: `${left}px`, 44886 width, 44887 height 44888 } 44889 }, 44890 children: [] 44891 }; 44892 for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) { 44893 if (style[key] !== undefined) { 44894 border.attributes.style[key] = style[key]; 44895 delete style[key]; 44896 } 44897 } 44898 wrapper.children.push(border, html); 44899 } else { 44900 wrapper.children.push(html); 44901 } 44902 for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) { 44903 if (style[key] !== undefined) { 44904 wrapper.attributes.style[key] = style[key]; 44905 delete style[key]; 44906 } 44907 } 44908 wrapper.attributes.style.position = style.position === "absolute" ? "absolute" : "relative"; 44909 delete style.position; 44910 if (style.alignSelf) { 44911 wrapper.attributes.style.alignSelf = style.alignSelf; 44912 delete style.alignSelf; 44913 } 44914 return wrapper; 44915} 44916function fixTextIndent(styles) { 44917 const indent = getMeasurement(styles.textIndent, "0px"); 44918 if (indent >= 0) { 44919 return; 44920 } 44921 const align = styles.textAlign === "right" ? "right" : "left"; 44922 const name = "padding" + (align === "left" ? "Left" : "Right"); 44923 const padding = getMeasurement(styles[name], "0px"); 44924 styles[name] = `${padding - indent}px`; 44925} 44926function setAccess(node, classNames) { 44927 switch (node.access) { 44928 case "nonInteractive": 44929 classNames.push("xfaNonInteractive"); 44930 break; 44931 case "readOnly": 44932 classNames.push("xfaReadOnly"); 44933 break; 44934 case "protected": 44935 classNames.push("xfaDisabled"); 44936 break; 44937 } 44938} 44939function isPrintOnly(node) { 44940 return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print"; 44941} 44942function getCurrentPara(node) { 44943 const stack = node[$getTemplateRoot]()[$extra].paraStack; 44944 return stack.length ? stack.at(-1) : null; 44945} 44946function setPara(node, nodeStyle, value) { 44947 if (value.attributes.class?.includes("xfaRich")) { 44948 if (nodeStyle) { 44949 if (node.h === "") { 44950 nodeStyle.height = "auto"; 44951 } 44952 if (node.w === "") { 44953 nodeStyle.width = "auto"; 44954 } 44955 } 44956 const para = getCurrentPara(node); 44957 if (para) { 44958 const valueStyle = value.attributes.style; 44959 valueStyle.display = "flex"; 44960 valueStyle.flexDirection = "column"; 44961 switch (para.vAlign) { 44962 case "top": 44963 valueStyle.justifyContent = "start"; 44964 break; 44965 case "bottom": 44966 valueStyle.justifyContent = "end"; 44967 break; 44968 case "middle": 44969 valueStyle.justifyContent = "center"; 44970 break; 44971 } 44972 const paraStyle = para[$toStyle](); 44973 for (const [key, val] of Object.entries(paraStyle)) { 44974 if (!(key in valueStyle)) { 44975 valueStyle[key] = val; 44976 } 44977 } 44978 } 44979 } 44980} 44981function setFontFamily(xfaFont, node, fontFinder, style) { 44982 if (!fontFinder) { 44983 delete style.fontFamily; 44984 return; 44985 } 44986 const name = stripQuotes(xfaFont.typeface); 44987 style.fontFamily = `"${name}"`; 44988 const typeface = fontFinder.find(name); 44989 if (typeface) { 44990 const { 44991 fontFamily 44992 } = typeface.regular.cssFontInfo; 44993 if (fontFamily !== name) { 44994 style.fontFamily = `"${fontFamily}"`; 44995 } 44996 const para = getCurrentPara(node); 44997 if (para && para.lineHeight !== "") { 44998 return; 44999 } 45000 if (style.lineHeight) { 45001 return; 45002 } 45003 const pdfFont = selectFont(xfaFont, typeface); 45004 if (pdfFont) { 45005 style.lineHeight = Math.max(1.2, pdfFont.lineHeight); 45006 } 45007 } 45008} 45009function fixURL(str) { 45010 const absoluteUrl = createValidAbsoluteUrl(str, null, { 45011 addDefaultProtocol: true, 45012 tryConvertEncoding: true 45013 }); 45014 return absoluteUrl ? absoluteUrl.href : null; 45015} 45016 45017;// ./src/core/xfa/layout.js 45018 45019 45020 45021 45022 45023function createLine(node, children) { 45024 return { 45025 name: "div", 45026 attributes: { 45027 class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"] 45028 }, 45029 children 45030 }; 45031} 45032function flushHTML(node) { 45033 if (!node[$extra]) { 45034 return null; 45035 } 45036 const attributes = node[$extra].attributes; 45037 const html = { 45038 name: "div", 45039 attributes, 45040 children: node[$extra].children 45041 }; 45042 if (node[$extra].failingNode) { 45043 const htmlFromFailing = node[$extra].failingNode[$flushHTML](); 45044 if (htmlFromFailing) { 45045 if (node.layout.endsWith("-tb")) { 45046 html.children.push(createLine(node, [htmlFromFailing])); 45047 } else { 45048 html.children.push(htmlFromFailing); 45049 } 45050 } 45051 } 45052 if (html.children.length === 0) { 45053 return null; 45054 } 45055 return html; 45056} 45057function addHTML(node, html, bbox) { 45058 const extra = node[$extra]; 45059 const availableSpace = extra.availableSpace; 45060 const [x, y, w, h] = bbox; 45061 switch (node.layout) { 45062 case "position": 45063 { 45064 extra.width = Math.max(extra.width, x + w); 45065 extra.height = Math.max(extra.height, y + h); 45066 extra.children.push(html); 45067 break; 45068 } 45069 case "lr-tb": 45070 case "rl-tb": 45071 if (!extra.line || extra.attempt === 1) { 45072 extra.line = createLine(node, []); 45073 extra.children.push(extra.line); 45074 extra.numberInLine = 0; 45075 } 45076 extra.numberInLine += 1; 45077 extra.line.children.push(html); 45078 if (extra.attempt === 0) { 45079 extra.currentWidth += w; 45080 extra.height = Math.max(extra.height, extra.prevHeight + h); 45081 } else { 45082 extra.currentWidth = w; 45083 extra.prevHeight = extra.height; 45084 extra.height += h; 45085 extra.attempt = 0; 45086 } 45087 extra.width = Math.max(extra.width, extra.currentWidth); 45088 break; 45089 case "rl-row": 45090 case "row": 45091 { 45092 extra.children.push(html); 45093 extra.width += w; 45094 extra.height = Math.max(extra.height, h); 45095 const height = measureToString(extra.height); 45096 for (const child of extra.children) { 45097 child.attributes.style.height = height; 45098 } 45099 break; 45100 } 45101 case "table": 45102 { 45103 extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); 45104 extra.height += h; 45105 extra.children.push(html); 45106 break; 45107 } 45108 case "tb": 45109 { 45110 extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); 45111 extra.height += h; 45112 extra.children.push(html); 45113 break; 45114 } 45115 } 45116} 45117function getAvailableSpace(node) { 45118 const availableSpace = node[$extra].availableSpace; 45119 const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0; 45120 const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0; 45121 switch (node.layout) { 45122 case "lr-tb": 45123 case "rl-tb": 45124 if (node[$extra].attempt === 0) { 45125 return { 45126 width: availableSpace.width - marginH - node[$extra].currentWidth, 45127 height: availableSpace.height - marginV - node[$extra].prevHeight 45128 }; 45129 } 45130 return { 45131 width: availableSpace.width - marginH, 45132 height: availableSpace.height - marginV - node[$extra].height 45133 };
vendor: 3,569 bytes, lines 45134-45273
45134 case "rl-row": 45135 case "row": 45136 const width = node[$extra].columnWidths.slice(node[$extra].currentColumn).reduce((a, x) => a + x); 45137 return { 45138 width, 45139 height: availableSpace.height - marginH 45140 }; 45141 case "table": 45142 case "tb": 45143 return { 45144 width: availableSpace.width - marginH, 45145 height: availableSpace.height - marginV - node[$extra].height 45146 }; 45147 case "position": 45148 default: 45149 return availableSpace; 45150 } 45151} 45152function getTransformedBBox(node) { 45153 let w = node.w === "" ? NaN : node.w; 45154 let h = node.h === "" ? NaN : node.h; 45155 let [centerX, centerY] = [0, 0]; 45156 switch (node.anchorType || "") { 45157 case "bottomCenter": 45158 [centerX, centerY] = [w / 2, h]; 45159 break; 45160 case "bottomLeft": 45161 [centerX, centerY] = [0, h]; 45162 break; 45163 case "bottomRight": 45164 [centerX, centerY] = [w, h]; 45165 break; 45166 case "middleCenter": 45167 [centerX, centerY] = [w / 2, h / 2]; 45168 break; 45169 case "middleLeft": 45170 [centerX, centerY] = [0, h / 2]; 45171 break; 45172 case "middleRight": 45173 [centerX, centerY] = [w, h / 2]; 45174 break; 45175 case "topCenter": 45176 [centerX, centerY] = [w / 2, 0]; 45177 break; 45178 case "topRight": 45179 [centerX, centerY] = [w, 0]; 45180 break; 45181 } 45182 let x, y; 45183 switch (node.rotate || 0) { 45184 case 0: 45185 [x, y] = [-centerX, -centerY]; 45186 break; 45187 case 90: 45188 [x, y] = [-centerY, centerX]; 45189 [w, h] = [h, -w]; 45190 break; 45191 case 180: 45192 [x, y] = [centerX, centerY]; 45193 [w, h] = [-w, -h]; 45194 break; 45195 case 270: 45196 [x, y] = [centerY, -centerX]; 45197 [w, h] = [-h, w]; 45198 break; 45199 } 45200 return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)]; 45201} 45202function checkDimensions(node, space) { 45203 if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null) { 45204 return true; 45205 } 45206 if (node.w === 0 || node.h === 0) { 45207 return true; 45208 } 45209 const ERROR = 2; 45210 const parent = node[$getSubformParent](); 45211 const attempt = parent[$extra]?.attempt || 0; 45212 const [, y, w, h] = getTransformedBBox(node); 45213 switch (parent.layout) { 45214 case "lr-tb": 45215 case "rl-tb": 45216 if (attempt === 0) { 45217 if (!node[$getTemplateRoot]()[$extra].noLayoutFailure) { 45218 if (node.h !== "" && Math.round(h - space.height) > ERROR) { 45219 return false; 45220 } 45221 if (node.w !== "") { 45222 if (Math.round(w - space.width) <= ERROR) { 45223 return true; 45224 } 45225 if (parent[$extra].numberInLine === 0) { 45226 return space.height > ERROR; 45227 } 45228 return false; 45229 } 45230 return space.width > ERROR; 45231 } 45232 if (node.w !== "") { 45233 return Math.round(w - space.width) <= ERROR; 45234 } 45235 return space.width > ERROR; 45236 } 45237 if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { 45238 return true; 45239 } 45240 if (node.h !== "" && Math.round(h - space.height) > ERROR) { 45241 return false; 45242 } 45243 if (node.w === "" || Math.round(w - space.width) <= ERROR) { 45244 return space.height > ERROR; 45245 } 45246 if (parent[$isThereMoreWidth]()) { 45247 return false; 45248 } 45249 return space.height > ERROR; 45250 case "table": 45251 case "tb": 45252 if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { 45253 return true; 45254 } 45255 if (node.h !== "" && !node[$isSplittable]()) { 45256 return Math.round(h - space.height) <= ERROR; 45257 } 45258 if (node.w === "" || Math.round(w - space.width) <= ERROR) { 45259 return space.height > ERROR; 45260 } 45261 if (parent[$isThereMoreWidth]()) { 45262 return false; 45263 } 45264 return space.height > ERROR; 45265 case "position": 45266 if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { 45267 return true; 45268 } 45269 if (node.h === "" || Math.round(h + y - space.height) <= ERROR) { 45270 return true; 45271 } 45272 const area = node[$getTemplateRoot]()[$extra].currentContentArea; 45273 return h + y > area.h;
vendor: 4,294 bytes, lines 45274-45463
45274 case "rl-row": 45275 case "row": 45276 if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { 45277 return true; 45278 } 45279 if (node.h !== "") { 45280 return Math.round(h - space.height) <= ERROR; 45281 } 45282 return true; 45283 default: 45284 return true; 45285 } 45286} 45287 45288;// ./src/core/xfa/template.js 45289 45290 45291 45292 45293 45294 45295 45296 45297 45298 45299 45300 45301 45302 45303 45304 45305 45306 45307 45308 45309 45310 45311 45312 45313 45314 45315 45316 45317 45318const TEMPLATE_NS_ID = NamespaceIds.template.id; 45319const SVG_NS = "http://www.w3.org/2000/svg"; 45320const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; 45321const MAX_EMPTY_PAGES = 3; 45322const DEFAULT_TAB_INDEX = 5000; 45323const HEADING_PATTERN = /^H(\d+)$/; 45324const 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"]); 45325const 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"]]; 45326function getBorderDims(node) { 45327 if (!node || !node.border) { 45328 return { 45329 w: 0, 45330 h: 0 45331 }; 45332 } 45333 const borderExtra = node.border[$getExtra](); 45334 if (!borderExtra) { 45335 return { 45336 w: 0, 45337 h: 0 45338 }; 45339 } 45340 return { 45341 w: borderExtra.widths[0] + borderExtra.widths[2] + borderExtra.insets[0] + borderExtra.insets[2], 45342 h: borderExtra.widths[1] + borderExtra.widths[3] + borderExtra.insets[1] + borderExtra.insets[3] 45343 }; 45344} 45345function hasMargin(node) { 45346 return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset); 45347} 45348function _setValue(templateNode, value) { 45349 if (!templateNode.value) { 45350 const nodeValue = new Value({}); 45351 templateNode[$appendChild](nodeValue); 45352 templateNode.value = nodeValue; 45353 } 45354 templateNode.value[$setValue](value); 45355} 45356function* getContainedChildren(node) { 45357 for (const child of node[$getChildren]()) { 45358 if (child instanceof SubformSet) { 45359 yield* child[$getContainedChildren](); 45360 continue; 45361 } 45362 yield child; 45363 } 45364} 45365function isRequired(node) { 45366 return node.validate?.nullTest === "error"; 45367} 45368function setTabIndex(node) { 45369 while (node) { 45370 if (!node.traversal) { 45371 node[$tabIndex] = node[$getParent]()[$tabIndex]; 45372 return; 45373 } 45374 if (node[$tabIndex]) { 45375 return; 45376 } 45377 let next = null; 45378 for (const child of node.traversal[$getChildren]()) { 45379 if (child.operation === "next") { 45380 next = child; 45381 break; 45382 } 45383 } 45384 if (!next || !next.ref) { 45385 node[$tabIndex] = node[$getParent]()[$tabIndex]; 45386 return; 45387 } 45388 const root = node[$getTemplateRoot](); 45389 node[$tabIndex] = ++root[$tabIndex]; 45390 const ref = root[$searchNode](next.ref, node); 45391 if (!ref) { 45392 return; 45393 } 45394 node = ref[0]; 45395 } 45396} 45397function applyAssist(obj, attributes) { 45398 const assist = obj.assist; 45399 if (assist) { 45400 const assistTitle = assist[$toHTML](); 45401 if (assistTitle) { 45402 attributes.title = assistTitle; 45403 } 45404 const role = assist.role; 45405 const match = role.match(HEADING_PATTERN); 45406 if (match) { 45407 const ariaRole = "heading"; 45408 const ariaLevel = match[1]; 45409 attributes.role = ariaRole; 45410 attributes["aria-level"] = ariaLevel; 45411 } 45412 } 45413 if (obj.layout === "table") { 45414 attributes.role = "table"; 45415 } else if (obj.layout === "row") { 45416 attributes.role = "row"; 45417 } else { 45418 const parent = obj[$getParent](); 45419 if (parent.layout === "row") { 45420 attributes.role = parent.assist?.role === "TH" ? "columnheader" : "cell"; 45421 } 45422 } 45423} 45424function ariaLabel(obj) { 45425 if (!obj.assist) { 45426 return null; 45427 } 45428 const assist = obj.assist; 45429 if (assist.speak && assist.speak[$content] !== "") { 45430 return assist.speak[$content]; 45431 } 45432 if (assist.toolTip) { 45433 return assist.toolTip[$content]; 45434 } 45435 return null; 45436} 45437function valueToHtml(value) { 45438 return HTMLResult.success({ 45439 name: "div", 45440 attributes: { 45441 class: ["xfaRich"], 45442 style: Object.create(null) 45443 }, 45444 children: [{ 45445 name: "span", 45446 attributes: { 45447 style: Object.create(null) 45448 }, 45449 value 45450 }] 45451 }); 45452} 45453function setFirstUnsplittable(node) { 45454 const root = node[$getTemplateRoot](); 45455 if (root[$extra].firstUnsplittable === null) { 45456 root[$extra].firstUnsplittable = node; 45457 root[$extra].noLayoutFailure = true; 45458 } 45459} 45460function unsetFirstUnsplittable(node) { 45461 const root = node[$getTemplateRoot](); 45462 if (root[$extra].firstUnsplittable === node) { 45463 root[$extra].noLayoutFailure = false;
vendor: 53,740 bytes, lines 45464-47248
45464 } 45465} 45466function handleBreak(node) { 45467 if (node[$extra]) { 45468 return false; 45469 } 45470 node[$extra] = Object.create(null); 45471 if (node.targetType === "auto") { 45472 return false; 45473 } 45474 const root = node[$getTemplateRoot](); 45475 let target = null; 45476 if (node.target) { 45477 target = root[$searchNode](node.target, node[$getParent]()); 45478 if (!target) { 45479 return false; 45480 } 45481 target = target[0]; 45482 } 45483 const { 45484 currentPageArea, 45485 currentContentArea 45486 } = root[$extra]; 45487 if (node.targetType === "pageArea") { 45488 if (!(target instanceof PageArea)) { 45489 target = null; 45490 } 45491 if (node.startNew) { 45492 node[$extra].target = target || currentPageArea; 45493 return true; 45494 } else if (target && target !== currentPageArea) { 45495 node[$extra].target = target; 45496 return true; 45497 } 45498 return false; 45499 } 45500 if (!(target instanceof ContentArea)) { 45501 target = null; 45502 } 45503 const pageArea = target && target[$getParent](); 45504 let index; 45505 let nextPageArea = pageArea; 45506 if (node.startNew) { 45507 if (target) { 45508 const contentAreas = pageArea.contentArea.children; 45509 const indexForCurrent = contentAreas.indexOf(currentContentArea); 45510 const indexForTarget = contentAreas.indexOf(target); 45511 if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) { 45512 nextPageArea = null; 45513 } 45514 index = indexForTarget - 1; 45515 } else { 45516 index = currentPageArea.contentArea.children.indexOf(currentContentArea); 45517 } 45518 } else if (target && target !== currentContentArea) { 45519 const contentAreas = pageArea.contentArea.children; 45520 index = contentAreas.indexOf(target) - 1; 45521 nextPageArea = pageArea === currentPageArea ? null : pageArea; 45522 } else { 45523 return false; 45524 } 45525 node[$extra].target = nextPageArea; 45526 node[$extra].index = index; 45527 return true; 45528} 45529function handleOverflow(node, extraNode, space) { 45530 const root = node[$getTemplateRoot](); 45531 const saved = root[$extra].noLayoutFailure; 45532 const savedMethod = extraNode[$getSubformParent]; 45533 extraNode[$getSubformParent] = () => node; 45534 root[$extra].noLayoutFailure = true; 45535 const res = extraNode[$toHTML](space); 45536 node[$addHTML](res.html, res.bbox); 45537 root[$extra].noLayoutFailure = saved; 45538 extraNode[$getSubformParent] = savedMethod; 45539} 45540class AppearanceFilter extends StringObject { 45541 constructor(attributes) { 45542 super(TEMPLATE_NS_ID, "appearanceFilter"); 45543 this.id = attributes.id || ""; 45544 this.type = getStringOption(attributes.type, ["optional", "required"]); 45545 this.use = attributes.use || ""; 45546 this.usehref = attributes.usehref || ""; 45547 } 45548} 45549class Arc extends XFAObject { 45550 constructor(attributes) { 45551 super(TEMPLATE_NS_ID, "arc", true); 45552 this.circular = getInteger({ 45553 data: attributes.circular, 45554 defaultValue: 0, 45555 validate: x => x === 1 45556 }); 45557 this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); 45558 this.id = attributes.id || ""; 45559 this.startAngle = getFloat({ 45560 data: attributes.startAngle, 45561 defaultValue: 0, 45562 validate: x => true 45563 }); 45564 this.sweepAngle = getFloat({ 45565 data: attributes.sweepAngle, 45566 defaultValue: 360, 45567 validate: x => true 45568 }); 45569 this.use = attributes.use || ""; 45570 this.usehref = attributes.usehref || ""; 45571 this.edge = null; 45572 this.fill = null; 45573 } 45574 [$toHTML]() { 45575 const edge = this.edge || new Edge({}); 45576 const edgeStyle = edge[$toStyle](); 45577 const style = Object.create(null); 45578 if (this.fill?.presence === "visible") { 45579 Object.assign(style, this.fill[$toStyle]()); 45580 } else { 45581 style.fill = "transparent"; 45582 } 45583 style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); 45584 style.stroke = edgeStyle.color; 45585 let arc; 45586 const attributes = { 45587 xmlns: SVG_NS, 45588 style: { 45589 width: "100%", 45590 height: "100%", 45591 overflow: "visible" 45592 } 45593 }; 45594 if (this.sweepAngle === 360) { 45595 arc = { 45596 name: "ellipse", 45597 attributes: { 45598 xmlns: SVG_NS, 45599 cx: "50%", 45600 cy: "50%", 45601 rx: "50%", 45602 ry: "50%", 45603 style 45604 } 45605 }; 45606 } else { 45607 const startAngle = this.startAngle * Math.PI / 180; 45608 const sweepAngle = this.sweepAngle * Math.PI / 180; 45609 const largeArc = this.sweepAngle > 180 ? 1 : 0; 45610 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))]; 45611 arc = { 45612 name: "path", 45613 attributes: { 45614 xmlns: SVG_NS, 45615 d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`, 45616 vectorEffect: "non-scaling-stroke", 45617 style 45618 } 45619 }; 45620 Object.assign(attributes, { 45621 viewBox: "0 0 100 100", 45622 preserveAspectRatio: "none" 45623 }); 45624 } 45625 const svg = { 45626 name: "svg", 45627 children: [arc], 45628 attributes 45629 }; 45630 const parent = this[$getParent]()[$getParent](); 45631 if (hasMargin(parent)) { 45632 return HTMLResult.success({ 45633 name: "div", 45634 attributes: { 45635 style: { 45636 display: "inline", 45637 width: "100%", 45638 height: "100%" 45639 } 45640 }, 45641 children: [svg] 45642 }); 45643 } 45644 svg.attributes.style.position = "absolute"; 45645 return HTMLResult.success(svg); 45646 } 45647} 45648class Area extends XFAObject { 45649 constructor(attributes) { 45650 super(TEMPLATE_NS_ID, "area", true); 45651 this.colSpan = getInteger({ 45652 data: attributes.colSpan, 45653 defaultValue: 1, 45654 validate: n => n >= 1 || n === -1 45655 }); 45656 this.id = attributes.id || ""; 45657 this.name = attributes.name || ""; 45658 this.relevant = getRelevant(attributes.relevant); 45659 this.use = attributes.use || ""; 45660 this.usehref = attributes.usehref || ""; 45661 this.x = getMeasurement(attributes.x, "0pt"); 45662 this.y = getMeasurement(attributes.y, "0pt"); 45663 this.desc = null; 45664 this.extras = null; 45665 this.area = new XFAObjectArray(); 45666 this.draw = new XFAObjectArray(); 45667 this.exObject = new XFAObjectArray(); 45668 this.exclGroup = new XFAObjectArray(); 45669 this.field = new XFAObjectArray(); 45670 this.subform = new XFAObjectArray(); 45671 this.subformSet = new XFAObjectArray(); 45672 } 45673 *[$getContainedChildren]() { 45674 yield* getContainedChildren(this); 45675 } 45676 [$isTransparent]() { 45677 return true; 45678 } 45679 [$isBindable]() { 45680 return true; 45681 } 45682 [$addHTML](html, bbox) { 45683 const [x, y, w, h] = bbox; 45684 this[$extra].width = Math.max(this[$extra].width, x + w); 45685 this[$extra].height = Math.max(this[$extra].height, y + h); 45686 this[$extra].children.push(html); 45687 } 45688 [$getAvailableSpace]() { 45689 return this[$extra].availableSpace; 45690 } 45691 [$toHTML](availableSpace) { 45692 const style = toStyle(this, "position"); 45693 const attributes = { 45694 style, 45695 id: this[$uid], 45696 class: ["xfaArea"] 45697 }; 45698 if (isPrintOnly(this)) { 45699 attributes.class.push("xfaPrintOnly"); 45700 } 45701 if (this.name) { 45702 attributes.xfaName = this.name; 45703 } 45704 const children = []; 45705 this[$extra] = { 45706 children, 45707 width: 0, 45708 height: 0, 45709 availableSpace 45710 }; 45711 const result = this[$childrenToHTML]({ 45712 filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]), 45713 include: true 45714 }); 45715 if (!result.success) { 45716 if (result.isBreak()) { 45717 return result; 45718 } 45719 delete this[$extra]; 45720 return HTMLResult.FAILURE; 45721 } 45722 style.width = measureToString(this[$extra].width); 45723 style.height = measureToString(this[$extra].height); 45724 const html = { 45725 name: "div", 45726 attributes, 45727 children 45728 }; 45729 const bbox = [this.x, this.y, this[$extra].width, this[$extra].height]; 45730 delete this[$extra]; 45731 return HTMLResult.success(html, bbox); 45732 } 45733} 45734class Assist extends XFAObject { 45735 constructor(attributes) { 45736 super(TEMPLATE_NS_ID, "assist", true); 45737 this.id = attributes.id || ""; 45738 this.role = attributes.role || ""; 45739 this.use = attributes.use || ""; 45740 this.usehref = attributes.usehref || ""; 45741 this.speak = null; 45742 this.toolTip = null; 45743 } 45744 [$toHTML]() { 45745 return this.toolTip?.[$content] || null; 45746 } 45747} 45748class Barcode extends XFAObject { 45749 constructor(attributes) { 45750 super(TEMPLATE_NS_ID, "barcode", true); 45751 this.charEncoding = getKeyword({ 45752 data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "", 45753 defaultValue: "", 45754 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}/) 45755 }); 45756 this.checksum = getStringOption(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]); 45757 this.dataColumnCount = getInteger({ 45758 data: attributes.dataColumnCount, 45759 defaultValue: -1, 45760 validate: x => x >= 0 45761 }); 45762 this.dataLength = getInteger({ 45763 data: attributes.dataLength, 45764 defaultValue: -1, 45765 validate: x => x >= 0 45766 }); 45767 this.dataPrep = getStringOption(attributes.dataPrep, ["none", "flateCompress"]); 45768 this.dataRowCount = getInteger({ 45769 data: attributes.dataRowCount, 45770 defaultValue: -1, 45771 validate: x => x >= 0 45772 }); 45773 this.endChar = attributes.endChar || ""; 45774 this.errorCorrectionLevel = getInteger({ 45775 data: attributes.errorCorrectionLevel, 45776 defaultValue: -1, 45777 validate: x => x >= 0 && x <= 8 45778 }); 45779 this.id = attributes.id || ""; 45780 this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm"); 45781 this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm"); 45782 this.printCheckDigit = getInteger({ 45783 data: attributes.printCheckDigit, 45784 defaultValue: 0, 45785 validate: x => x === 1 45786 }); 45787 this.rowColumnRatio = getRatio(attributes.rowColumnRatio); 45788 this.startChar = attributes.startChar || ""; 45789 this.textLocation = getStringOption(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]); 45790 this.truncate = getInteger({ 45791 data: attributes.truncate, 45792 defaultValue: 0, 45793 validate: x => x === 1 45794 }); 45795 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"]); 45796 this.upsMode = getStringOption(attributes.upsMode, ["usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol"]); 45797 this.use = attributes.use || ""; 45798 this.usehref = attributes.usehref || ""; 45799 this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio); 45800 this.encrypt = null; 45801 this.extras = null; 45802 } 45803} 45804class Bind extends XFAObject { 45805 constructor(attributes) { 45806 super(TEMPLATE_NS_ID, "bind", true); 45807 this.match = getStringOption(attributes.match, ["once", "dataRef", "global", "none"]); 45808 this.ref = attributes.ref || ""; 45809 this.picture = null; 45810 } 45811} 45812class BindItems extends XFAObject { 45813 constructor(attributes) { 45814 super(TEMPLATE_NS_ID, "bindItems"); 45815 this.connection = attributes.connection || ""; 45816 this.labelRef = attributes.labelRef || ""; 45817 this.ref = attributes.ref || ""; 45818 this.valueRef = attributes.valueRef || ""; 45819 } 45820} 45821class Bookend extends XFAObject { 45822 constructor(attributes) { 45823 super(TEMPLATE_NS_ID, "bookend"); 45824 this.id = attributes.id || ""; 45825 this.leader = attributes.leader || ""; 45826 this.trailer = attributes.trailer || ""; 45827 this.use = attributes.use || ""; 45828 this.usehref = attributes.usehref || ""; 45829 } 45830} 45831class BooleanElement extends Option01 { 45832 constructor(attributes) { 45833 super(TEMPLATE_NS_ID, "boolean"); 45834 this.id = attributes.id || ""; 45835 this.name = attributes.name || ""; 45836 this.use = attributes.use || ""; 45837 this.usehref = attributes.usehref || ""; 45838 } 45839 [$toHTML](availableSpace) { 45840 return valueToHtml(this[$content] === 1 ? "1" : "0"); 45841 } 45842} 45843class Border extends XFAObject { 45844 constructor(attributes) { 45845 super(TEMPLATE_NS_ID, "border", true); 45846 this.break = getStringOption(attributes.break, ["close", "open"]); 45847 this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); 45848 this.id = attributes.id || ""; 45849 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 45850 this.relevant = getRelevant(attributes.relevant); 45851 this.use = attributes.use || ""; 45852 this.usehref = attributes.usehref || ""; 45853 this.corner = new XFAObjectArray(4); 45854 this.edge = new XFAObjectArray(4); 45855 this.extras = null; 45856 this.fill = null; 45857 this.margin = null; 45858 } 45859 [$getExtra]() { 45860 if (!this[$extra]) { 45861 const edges = this.edge.children.slice(); 45862 if (edges.length < 4) { 45863 const defaultEdge = edges.at(-1) || new Edge({}); 45864 for (let i = edges.length; i < 4; i++) { 45865 edges.push(defaultEdge); 45866 } 45867 } 45868 const widths = edges.map(edge => edge.thickness); 45869 const insets = [0, 0, 0, 0]; 45870 if (this.margin) { 45871 insets[0] = this.margin.topInset; 45872 insets[1] = this.margin.rightInset; 45873 insets[2] = this.margin.bottomInset; 45874 insets[3] = this.margin.leftInset; 45875 } 45876 this[$extra] = { 45877 widths, 45878 insets, 45879 edges 45880 }; 45881 } 45882 return this[$extra]; 45883 } 45884 [$toStyle]() { 45885 const { 45886 edges 45887 } = this[$getExtra](); 45888 const edgeStyles = edges.map(node => { 45889 const style = node[$toStyle](); 45890 style.color ||= "#000000"; 45891 return style; 45892 }); 45893 const style = Object.create(null); 45894 if (this.margin) { 45895 Object.assign(style, this.margin[$toStyle]()); 45896 } 45897 if (this.fill?.presence === "visible") { 45898 Object.assign(style, this.fill[$toStyle]()); 45899 } 45900 if (this.corner.children.some(node => node.radius !== 0)) { 45901 const cornerStyles = this.corner.children.map(node => node[$toStyle]()); 45902 if (cornerStyles.length === 2 || cornerStyles.length === 3) { 45903 const last = cornerStyles.at(-1); 45904 for (let i = cornerStyles.length; i < 4; i++) { 45905 cornerStyles.push(last); 45906 } 45907 } 45908 style.borderRadius = cornerStyles.map(s => s.radius).join(" "); 45909 } 45910 switch (this.presence) { 45911 case "invisible": 45912 case "hidden": 45913 style.borderStyle = ""; 45914 break; 45915 case "inactive": 45916 style.borderStyle = "none"; 45917 break; 45918 default: 45919 style.borderStyle = edgeStyles.map(s => s.style).join(" "); 45920 break; 45921 } 45922 style.borderWidth = edgeStyles.map(s => s.width).join(" "); 45923 style.borderColor = edgeStyles.map(s => s.color).join(" "); 45924 return style; 45925 } 45926} 45927class Break extends XFAObject { 45928 constructor(attributes) { 45929 super(TEMPLATE_NS_ID, "break", true); 45930 this.after = getStringOption(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); 45931 this.afterTarget = attributes.afterTarget || ""; 45932 this.before = getStringOption(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); 45933 this.beforeTarget = attributes.beforeTarget || ""; 45934 this.bookendLeader = attributes.bookendLeader || ""; 45935 this.bookendTrailer = attributes.bookendTrailer || ""; 45936 this.id = attributes.id || ""; 45937 this.overflowLeader = attributes.overflowLeader || ""; 45938 this.overflowTarget = attributes.overflowTarget || ""; 45939 this.overflowTrailer = attributes.overflowTrailer || ""; 45940 this.startNew = getInteger({ 45941 data: attributes.startNew, 45942 defaultValue: 0, 45943 validate: x => x === 1 45944 }); 45945 this.use = attributes.use || ""; 45946 this.usehref = attributes.usehref || ""; 45947 this.extras = null; 45948 } 45949} 45950class BreakAfter extends XFAObject { 45951 constructor(attributes) { 45952 super(TEMPLATE_NS_ID, "breakAfter", true); 45953 this.id = attributes.id || ""; 45954 this.leader = attributes.leader || ""; 45955 this.startNew = getInteger({ 45956 data: attributes.startNew, 45957 defaultValue: 0, 45958 validate: x => x === 1 45959 }); 45960 this.target = attributes.target || ""; 45961 this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); 45962 this.trailer = attributes.trailer || ""; 45963 this.use = attributes.use || ""; 45964 this.usehref = attributes.usehref || ""; 45965 this.script = null; 45966 } 45967} 45968class BreakBefore extends XFAObject { 45969 constructor(attributes) { 45970 super(TEMPLATE_NS_ID, "breakBefore", true); 45971 this.id = attributes.id || ""; 45972 this.leader = attributes.leader || ""; 45973 this.startNew = getInteger({ 45974 data: attributes.startNew, 45975 defaultValue: 0, 45976 validate: x => x === 1 45977 }); 45978 this.target = attributes.target || ""; 45979 this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); 45980 this.trailer = attributes.trailer || ""; 45981 this.use = attributes.use || ""; 45982 this.usehref = attributes.usehref || ""; 45983 this.script = null; 45984 } 45985 [$toHTML](availableSpace) { 45986 this[$extra] = {}; 45987 return HTMLResult.FAILURE; 45988 } 45989} 45990class Button extends XFAObject { 45991 constructor(attributes) { 45992 super(TEMPLATE_NS_ID, "button", true); 45993 this.highlight = getStringOption(attributes.highlight, ["inverted", "none", "outline", "push"]); 45994 this.id = attributes.id || ""; 45995 this.use = attributes.use || ""; 45996 this.usehref = attributes.usehref || ""; 45997 this.extras = null; 45998 } 45999 [$toHTML](availableSpace) { 46000 const parent = this[$getParent](); 46001 const grandpa = parent[$getParent](); 46002 const htmlButton = { 46003 name: "button", 46004 attributes: { 46005 id: this[$uid], 46006 class: ["xfaButton"], 46007 style: {} 46008 }, 46009 children: [] 46010 }; 46011 for (const event of grandpa.event.children) { 46012 if (event.activity !== "click" || !event.script) { 46013 continue; 46014 } 46015 const jsURL = recoverJsURL(event.script[$content]); 46016 if (!jsURL) { 46017 continue; 46018 } 46019 const href = fixURL(jsURL.url); 46020 if (!href) { 46021 continue; 46022 } 46023 htmlButton.children.push({ 46024 name: "a", 46025 attributes: { 46026 id: "link" + this[$uid], 46027 href, 46028 newWindow: jsURL.newWindow, 46029 class: ["xfaLink"], 46030 style: {} 46031 }, 46032 children: [] 46033 }); 46034 } 46035 return HTMLResult.success(htmlButton); 46036 } 46037} 46038class Calculate extends XFAObject { 46039 constructor(attributes) { 46040 super(TEMPLATE_NS_ID, "calculate", true); 46041 this.id = attributes.id || ""; 46042 this.override = getStringOption(attributes.override, ["disabled", "error", "ignore", "warning"]); 46043 this.use = attributes.use || ""; 46044 this.usehref = attributes.usehref || ""; 46045 this.extras = null; 46046 this.message = null; 46047 this.script = null; 46048 } 46049} 46050class Caption extends XFAObject { 46051 constructor(attributes) { 46052 super(TEMPLATE_NS_ID, "caption", true); 46053 this.id = attributes.id || ""; 46054 this.placement = getStringOption(attributes.placement, ["left", "bottom", "inline", "right", "top"]); 46055 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 46056 this.reserve = Math.ceil(getMeasurement(attributes.reserve)); 46057 this.use = attributes.use || ""; 46058 this.usehref = attributes.usehref || ""; 46059 this.extras = null; 46060 this.font = null; 46061 this.margin = null; 46062 this.para = null; 46063 this.value = null; 46064 } 46065 [$setValue](value) { 46066 _setValue(this, value); 46067 } 46068 [$getExtra](availableSpace) { 46069 if (!this[$extra]) { 46070 let { 46071 width, 46072 height 46073 } = availableSpace; 46074 switch (this.placement) { 46075 case "left": 46076 case "right": 46077 case "inline": 46078 width = this.reserve <= 0 ? width : this.reserve; 46079 break; 46080 case "top": 46081 case "bottom": 46082 height = this.reserve <= 0 ? height : this.reserve; 46083 break; 46084 } 46085 this[$extra] = layoutNode(this, { 46086 width, 46087 height 46088 }); 46089 } 46090 return this[$extra]; 46091 } 46092 [$toHTML](availableSpace) { 46093 if (!this.value) { 46094 return HTMLResult.EMPTY; 46095 } 46096 this[$pushPara](); 46097 const value = this.value[$toHTML](availableSpace).html; 46098 if (!value) { 46099 this[$popPara](); 46100 return HTMLResult.EMPTY; 46101 } 46102 const savedReserve = this.reserve; 46103 if (this.reserve <= 0) { 46104 const { 46105 w, 46106 h 46107 } = this[$getExtra](availableSpace); 46108 switch (this.placement) { 46109 case "left": 46110 case "right": 46111 case "inline": 46112 this.reserve = w; 46113 break; 46114 case "top": 46115 case "bottom": 46116 this.reserve = h; 46117 break; 46118 } 46119 } 46120 const children = []; 46121 if (typeof value === "string") { 46122 children.push({ 46123 name: "#text", 46124 value 46125 }); 46126 } else { 46127 children.push(value); 46128 } 46129 const style = toStyle(this, "font", "margin", "visibility"); 46130 switch (this.placement) { 46131 case "left": 46132 case "right": 46133 if (this.reserve > 0) { 46134 style.width = measureToString(this.reserve); 46135 } 46136 break; 46137 case "top": 46138 case "bottom": 46139 if (this.reserve > 0) { 46140 style.height = measureToString(this.reserve); 46141 } 46142 break; 46143 } 46144 setPara(this, null, value); 46145 this[$popPara](); 46146 this.reserve = savedReserve; 46147 return HTMLResult.success({ 46148 name: "div", 46149 attributes: { 46150 style, 46151 class: ["xfaCaption"] 46152 }, 46153 children 46154 }); 46155 } 46156} 46157class Certificate extends StringObject { 46158 constructor(attributes) { 46159 super(TEMPLATE_NS_ID, "certificate"); 46160 this.id = attributes.id || ""; 46161 this.name = attributes.name || ""; 46162 this.use = attributes.use || ""; 46163 this.usehref = attributes.usehref || ""; 46164 } 46165} 46166class Certificates extends XFAObject { 46167 constructor(attributes) { 46168 super(TEMPLATE_NS_ID, "certificates", true); 46169 this.credentialServerPolicy = getStringOption(attributes.credentialServerPolicy, ["optional", "required"]); 46170 this.id = attributes.id || ""; 46171 this.url = attributes.url || ""; 46172 this.urlPolicy = attributes.urlPolicy || ""; 46173 this.use = attributes.use || ""; 46174 this.usehref = attributes.usehref || ""; 46175 this.encryption = null; 46176 this.issuers = null; 46177 this.keyUsage = null; 46178 this.oids = null; 46179 this.signing = null; 46180 this.subjectDNs = null; 46181 } 46182} 46183class CheckButton extends XFAObject { 46184 constructor(attributes) { 46185 super(TEMPLATE_NS_ID, "checkButton", true); 46186 this.id = attributes.id || ""; 46187 this.mark = getStringOption(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]); 46188 this.shape = getStringOption(attributes.shape, ["square", "round"]); 46189 this.size = getMeasurement(attributes.size, "10pt"); 46190 this.use = attributes.use || ""; 46191 this.usehref = attributes.usehref || ""; 46192 this.border = null; 46193 this.extras = null; 46194 this.margin = null; 46195 } 46196 [$toHTML](availableSpace) { 46197 const style = toStyle("margin"); 46198 const size = measureToString(this.size); 46199 style.width = style.height = size; 46200 let type; 46201 let className; 46202 let groupId; 46203 const field = this[$getParent]()[$getParent](); 46204 const items = field.items.children.length && field.items.children[0][$toHTML]().html || []; 46205 const exportedValue = { 46206 on: (items[0] !== undefined ? items[0] : "on").toString(), 46207 off: (items[1] !== undefined ? items[1] : "off").toString() 46208 }; 46209 const value = field.value?.[$text]() || "off"; 46210 const checked = value === exportedValue.on || undefined; 46211 const container = field[$getSubformParent](); 46212 const fieldId = field[$uid]; 46213 let dataId; 46214 if (container instanceof ExclGroup) { 46215 groupId = container[$uid]; 46216 type = "radio"; 46217 className = "xfaRadio"; 46218 dataId = container[$data]?.[$uid] || container[$uid]; 46219 } else { 46220 type = "checkbox"; 46221 className = "xfaCheckbox"; 46222 dataId = field[$data]?.[$uid] || field[$uid]; 46223 } 46224 const input = { 46225 name: "input", 46226 attributes: { 46227 class: [className], 46228 style, 46229 fieldId, 46230 dataId, 46231 type, 46232 checked, 46233 xfaOn: exportedValue.on, 46234 xfaOff: exportedValue.off, 46235 "aria-label": ariaLabel(field), 46236 "aria-required": false 46237 } 46238 }; 46239 if (groupId) { 46240 input.attributes.name = groupId; 46241 } 46242 if (isRequired(field)) { 46243 input.attributes["aria-required"] = true; 46244 input.attributes.required = true; 46245 } 46246 return HTMLResult.success({ 46247 name: "label", 46248 attributes: { 46249 class: ["xfaLabel"] 46250 }, 46251 children: [input] 46252 }); 46253 } 46254} 46255class ChoiceList extends XFAObject { 46256 constructor(attributes) { 46257 super(TEMPLATE_NS_ID, "choiceList", true); 46258 this.commitOn = getStringOption(attributes.commitOn, ["select", "exit"]); 46259 this.id = attributes.id || ""; 46260 this.open = getStringOption(attributes.open, ["userControl", "always", "multiSelect", "onEntry"]); 46261 this.textEntry = getInteger({ 46262 data: attributes.textEntry, 46263 defaultValue: 0, 46264 validate: x => x === 1 46265 }); 46266 this.use = attributes.use || ""; 46267 this.usehref = attributes.usehref || ""; 46268 this.border = null; 46269 this.extras = null; 46270 this.margin = null; 46271 } 46272 [$toHTML](availableSpace) { 46273 const style = toStyle(this, "border", "margin"); 46274 const ui = this[$getParent](); 46275 const field = ui[$getParent](); 46276 const fontSize = field.font?.size || 10; 46277 const optionStyle = { 46278 fontSize: `calc(${fontSize}px * var(--scale-factor))` 46279 }; 46280 const children = []; 46281 if (field.items.children.length > 0) { 46282 const items = field.items; 46283 let displayedIndex = 0; 46284 let saveIndex = 0; 46285 if (items.children.length === 2) { 46286 displayedIndex = items.children[0].save; 46287 saveIndex = 1 - displayedIndex; 46288 } 46289 const displayed = items.children[displayedIndex][$toHTML]().html; 46290 const values = items.children[saveIndex][$toHTML]().html; 46291 let selected = false; 46292 const value = field.value?.[$text]() || ""; 46293 for (let i = 0, ii = displayed.length; i < ii; i++) { 46294 const option = { 46295 name: "option", 46296 attributes: { 46297 value: values[i] || displayed[i], 46298 style: optionStyle 46299 }, 46300 value: displayed[i] 46301 }; 46302 if (values[i] === value) { 46303 option.attributes.selected = selected = true; 46304 } 46305 children.push(option); 46306 } 46307 if (!selected) { 46308 children.splice(0, 0, { 46309 name: "option", 46310 attributes: { 46311 hidden: true, 46312 selected: true 46313 }, 46314 value: " " 46315 }); 46316 } 46317 } 46318 const selectAttributes = { 46319 class: ["xfaSelect"], 46320 fieldId: field[$uid], 46321 dataId: field[$data]?.[$uid] || field[$uid], 46322 style, 46323 "aria-label": ariaLabel(field), 46324 "aria-required": false 46325 }; 46326 if (isRequired(field)) { 46327 selectAttributes["aria-required"] = true; 46328 selectAttributes.required = true; 46329 } 46330 if (this.open === "multiSelect") { 46331 selectAttributes.multiple = true; 46332 } 46333 return HTMLResult.success({ 46334 name: "label", 46335 attributes: { 46336 class: ["xfaLabel"] 46337 }, 46338 children: [{ 46339 name: "select", 46340 children, 46341 attributes: selectAttributes 46342 }] 46343 }); 46344 } 46345} 46346class Color extends XFAObject { 46347 constructor(attributes) { 46348 super(TEMPLATE_NS_ID, "color", true); 46349 this.cSpace = getStringOption(attributes.cSpace, ["SRGB"]); 46350 this.id = attributes.id || ""; 46351 this.use = attributes.use || ""; 46352 this.usehref = attributes.usehref || ""; 46353 this.value = attributes.value ? getColor(attributes.value) : ""; 46354 this.extras = null; 46355 } 46356 [$hasSettableValue]() { 46357 return false; 46358 } 46359 [$toStyle]() { 46360 return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null; 46361 } 46362} 46363class Comb extends XFAObject { 46364 constructor(attributes) { 46365 super(TEMPLATE_NS_ID, "comb"); 46366 this.id = attributes.id || ""; 46367 this.numberOfCells = getInteger({ 46368 data: attributes.numberOfCells, 46369 defaultValue: 0, 46370 validate: x => x >= 0 46371 }); 46372 this.use = attributes.use || ""; 46373 this.usehref = attributes.usehref || ""; 46374 } 46375} 46376class Connect extends XFAObject { 46377 constructor(attributes) { 46378 super(TEMPLATE_NS_ID, "connect", true); 46379 this.connection = attributes.connection || ""; 46380 this.id = attributes.id || ""; 46381 this.ref = attributes.ref || ""; 46382 this.usage = getStringOption(attributes.usage, ["exportAndImport", "exportOnly", "importOnly"]); 46383 this.use = attributes.use || ""; 46384 this.usehref = attributes.usehref || ""; 46385 this.picture = null; 46386 } 46387} 46388class ContentArea extends XFAObject { 46389 constructor(attributes) { 46390 super(TEMPLATE_NS_ID, "contentArea", true); 46391 this.h = getMeasurement(attributes.h); 46392 this.id = attributes.id || ""; 46393 this.name = attributes.name || ""; 46394 this.relevant = getRelevant(attributes.relevant); 46395 this.use = attributes.use || ""; 46396 this.usehref = attributes.usehref || ""; 46397 this.w = getMeasurement(attributes.w); 46398 this.x = getMeasurement(attributes.x, "0pt"); 46399 this.y = getMeasurement(attributes.y, "0pt"); 46400 this.desc = null; 46401 this.extras = null; 46402 } 46403 [$toHTML](availableSpace) { 46404 const left = measureToString(this.x); 46405 const top = measureToString(this.y); 46406 const style = { 46407 left, 46408 top, 46409 width: measureToString(this.w), 46410 height: measureToString(this.h) 46411 }; 46412 const classNames = ["xfaContentarea"]; 46413 if (isPrintOnly(this)) { 46414 classNames.push("xfaPrintOnly"); 46415 } 46416 return HTMLResult.success({ 46417 name: "div", 46418 children: [], 46419 attributes: { 46420 style, 46421 class: classNames, 46422 id: this[$uid] 46423 } 46424 }); 46425 } 46426} 46427class Corner extends XFAObject { 46428 constructor(attributes) { 46429 super(TEMPLATE_NS_ID, "corner", true); 46430 this.id = attributes.id || ""; 46431 this.inverted = getInteger({ 46432 data: attributes.inverted, 46433 defaultValue: 0, 46434 validate: x => x === 1 46435 }); 46436 this.join = getStringOption(attributes.join, ["square", "round"]); 46437 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 46438 this.radius = getMeasurement(attributes.radius); 46439 this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); 46440 this.thickness = getMeasurement(attributes.thickness, "0.5pt"); 46441 this.use = attributes.use || ""; 46442 this.usehref = attributes.usehref || ""; 46443 this.color = null; 46444 this.extras = null; 46445 } 46446 [$toStyle]() { 46447 const style = toStyle(this, "visibility"); 46448 style.radius = measureToString(this.join === "square" ? 0 : this.radius); 46449 return style; 46450 } 46451} 46452class DateElement extends ContentObject { 46453 constructor(attributes) { 46454 super(TEMPLATE_NS_ID, "date"); 46455 this.id = attributes.id || ""; 46456 this.name = attributes.name || ""; 46457 this.use = attributes.use || ""; 46458 this.usehref = attributes.usehref || ""; 46459 } 46460 [$finalize]() { 46461 const date = this[$content].trim(); 46462 this[$content] = date ? new Date(date) : null; 46463 } 46464 [$toHTML](availableSpace) { 46465 return valueToHtml(this[$content] ? this[$content].toString() : ""); 46466 } 46467} 46468class DateTime extends ContentObject { 46469 constructor(attributes) { 46470 super(TEMPLATE_NS_ID, "dateTime"); 46471 this.id = attributes.id || ""; 46472 this.name = attributes.name || ""; 46473 this.use = attributes.use || ""; 46474 this.usehref = attributes.usehref || ""; 46475 } 46476 [$finalize]() { 46477 const date = this[$content].trim(); 46478 this[$content] = date ? new Date(date) : null; 46479 } 46480 [$toHTML](availableSpace) { 46481 return valueToHtml(this[$content] ? this[$content].toString() : ""); 46482 } 46483} 46484class DateTimeEdit extends XFAObject { 46485 constructor(attributes) { 46486 super(TEMPLATE_NS_ID, "dateTimeEdit", true); 46487 this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); 46488 this.id = attributes.id || ""; 46489 this.picker = getStringOption(attributes.picker, ["host", "none"]); 46490 this.use = attributes.use || ""; 46491 this.usehref = attributes.usehref || ""; 46492 this.border = null; 46493 this.comb = null; 46494 this.extras = null; 46495 this.margin = null; 46496 } 46497 [$toHTML](availableSpace) { 46498 const style = toStyle(this, "border", "font", "margin"); 46499 const field = this[$getParent]()[$getParent](); 46500 const html = { 46501 name: "input", 46502 attributes: { 46503 type: "text", 46504 fieldId: field[$uid], 46505 dataId: field[$data]?.[$uid] || field[$uid], 46506 class: ["xfaTextfield"], 46507 style, 46508 "aria-label": ariaLabel(field), 46509 "aria-required": false 46510 } 46511 }; 46512 if (isRequired(field)) { 46513 html.attributes["aria-required"] = true; 46514 html.attributes.required = true; 46515 } 46516 return HTMLResult.success({ 46517 name: "label", 46518 attributes: { 46519 class: ["xfaLabel"] 46520 }, 46521 children: [html] 46522 }); 46523 } 46524} 46525class Decimal extends ContentObject { 46526 constructor(attributes) { 46527 super(TEMPLATE_NS_ID, "decimal"); 46528 this.fracDigits = getInteger({ 46529 data: attributes.fracDigits, 46530 defaultValue: 2, 46531 validate: x => true 46532 }); 46533 this.id = attributes.id || ""; 46534 this.leadDigits = getInteger({ 46535 data: attributes.leadDigits, 46536 defaultValue: -1, 46537 validate: x => true 46538 }); 46539 this.name = attributes.name || ""; 46540 this.use = attributes.use || ""; 46541 this.usehref = attributes.usehref || ""; 46542 } 46543 [$finalize]() { 46544 const number = parseFloat(this[$content].trim()); 46545 this[$content] = isNaN(number) ? null : number; 46546 } 46547 [$toHTML](availableSpace) { 46548 return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); 46549 } 46550} 46551class DefaultUi extends XFAObject { 46552 constructor(attributes) { 46553 super(TEMPLATE_NS_ID, "defaultUi", true); 46554 this.id = attributes.id || ""; 46555 this.use = attributes.use || ""; 46556 this.usehref = attributes.usehref || ""; 46557 this.extras = null; 46558 } 46559} 46560class Desc extends XFAObject { 46561 constructor(attributes) { 46562 super(TEMPLATE_NS_ID, "desc", true); 46563 this.id = attributes.id || ""; 46564 this.use = attributes.use || ""; 46565 this.usehref = attributes.usehref || ""; 46566 this.boolean = new XFAObjectArray(); 46567 this.date = new XFAObjectArray(); 46568 this.dateTime = new XFAObjectArray(); 46569 this.decimal = new XFAObjectArray(); 46570 this.exData = new XFAObjectArray(); 46571 this.float = new XFAObjectArray(); 46572 this.image = new XFAObjectArray(); 46573 this.integer = new XFAObjectArray(); 46574 this.text = new XFAObjectArray(); 46575 this.time = new XFAObjectArray(); 46576 } 46577} 46578class DigestMethod extends OptionObject { 46579 constructor(attributes) { 46580 super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]); 46581 this.id = attributes.id || ""; 46582 this.use = attributes.use || ""; 46583 this.usehref = attributes.usehref || ""; 46584 } 46585} 46586class DigestMethods extends XFAObject { 46587 constructor(attributes) { 46588 super(TEMPLATE_NS_ID, "digestMethods", true); 46589 this.id = attributes.id || ""; 46590 this.type = getStringOption(attributes.type, ["optional", "required"]); 46591 this.use = attributes.use || ""; 46592 this.usehref = attributes.usehref || ""; 46593 this.digestMethod = new XFAObjectArray(); 46594 } 46595} 46596class Draw extends XFAObject { 46597 constructor(attributes) { 46598 super(TEMPLATE_NS_ID, "draw", true); 46599 this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); 46600 this.colSpan = getInteger({ 46601 data: attributes.colSpan, 46602 defaultValue: 1, 46603 validate: n => n >= 1 || n === -1 46604 }); 46605 this.h = attributes.h ? getMeasurement(attributes.h) : ""; 46606 this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); 46607 this.id = attributes.id || ""; 46608 this.locale = attributes.locale || ""; 46609 this.maxH = getMeasurement(attributes.maxH, "0pt"); 46610 this.maxW = getMeasurement(attributes.maxW, "0pt"); 46611 this.minH = getMeasurement(attributes.minH, "0pt"); 46612 this.minW = getMeasurement(attributes.minW, "0pt"); 46613 this.name = attributes.name || ""; 46614 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 46615 this.relevant = getRelevant(attributes.relevant); 46616 this.rotate = getInteger({ 46617 data: attributes.rotate, 46618 defaultValue: 0, 46619 validate: x => x % 90 === 0 46620 }); 46621 this.use = attributes.use || ""; 46622 this.usehref = attributes.usehref || ""; 46623 this.w = attributes.w ? getMeasurement(attributes.w) : ""; 46624 this.x = getMeasurement(attributes.x, "0pt"); 46625 this.y = getMeasurement(attributes.y, "0pt"); 46626 this.assist = null; 46627 this.border = null; 46628 this.caption = null; 46629 this.desc = null; 46630 this.extras = null; 46631 this.font = null; 46632 this.keep = null; 46633 this.margin = null; 46634 this.para = null; 46635 this.traversal = null; 46636 this.ui = null; 46637 this.value = null; 46638 this.setProperty = new XFAObjectArray(); 46639 } 46640 [$setValue](value) { 46641 _setValue(this, value); 46642 } 46643 [$toHTML](availableSpace) { 46644 setTabIndex(this); 46645 if (this.presence === "hidden" || this.presence === "inactive") { 46646 return HTMLResult.EMPTY; 46647 } 46648 fixDimensions(this); 46649 this[$pushPara](); 46650 const savedW = this.w; 46651 const savedH = this.h; 46652 const { 46653 w, 46654 h, 46655 isBroken 46656 } = layoutNode(this, availableSpace); 46657 if (w && this.w === "") { 46658 if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { 46659 this[$popPara](); 46660 return HTMLResult.FAILURE; 46661 } 46662 this.w = w; 46663 } 46664 if (h && this.h === "") { 46665 this.h = h; 46666 } 46667 setFirstUnsplittable(this); 46668 if (!checkDimensions(this, availableSpace)) { 46669 this.w = savedW; 46670 this.h = savedH; 46671 this[$popPara](); 46672 return HTMLResult.FAILURE; 46673 } 46674 unsetFirstUnsplittable(this); 46675 const style = toStyle(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin"); 46676 setMinMaxDimensions(this, style); 46677 if (style.margin) { 46678 style.padding = style.margin; 46679 delete style.margin; 46680 } 46681 const classNames = ["xfaDraw"]; 46682 if (this.font) { 46683 classNames.push("xfaFont"); 46684 } 46685 if (isPrintOnly(this)) { 46686 classNames.push("xfaPrintOnly"); 46687 } 46688 const attributes = { 46689 style, 46690 id: this[$uid], 46691 class: classNames 46692 }; 46693 if (this.name) { 46694 attributes.xfaName = this.name; 46695 } 46696 const html = { 46697 name: "div", 46698 attributes, 46699 children: [] 46700 }; 46701 applyAssist(this, attributes); 46702 const bbox = computeBbox(this, html, availableSpace); 46703 const value = this.value ? this.value[$toHTML](availableSpace).html : null; 46704 if (value === null) { 46705 this.w = savedW; 46706 this.h = savedH; 46707 this[$popPara](); 46708 return HTMLResult.success(createWrapper(this, html), bbox); 46709 } 46710 html.children.push(value); 46711 setPara(this, style, value); 46712 this.w = savedW; 46713 this.h = savedH; 46714 this[$popPara](); 46715 return HTMLResult.success(createWrapper(this, html), bbox); 46716 } 46717} 46718class Edge extends XFAObject { 46719 constructor(attributes) { 46720 super(TEMPLATE_NS_ID, "edge", true); 46721 this.cap = getStringOption(attributes.cap, ["square", "butt", "round"]); 46722 this.id = attributes.id || ""; 46723 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 46724 this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); 46725 this.thickness = getMeasurement(attributes.thickness, "0.5pt"); 46726 this.use = attributes.use || ""; 46727 this.usehref = attributes.usehref || ""; 46728 this.color = null; 46729 this.extras = null; 46730 } 46731 [$toStyle]() { 46732 const style = toStyle(this, "visibility"); 46733 Object.assign(style, { 46734 linecap: this.cap, 46735 width: measureToString(this.thickness), 46736 color: this.color ? this.color[$toStyle]() : "#000000", 46737 style: "" 46738 }); 46739 if (this.presence !== "visible") { 46740 style.style = "none"; 46741 } else { 46742 switch (this.stroke) { 46743 case "solid": 46744 style.style = "solid"; 46745 break; 46746 case "dashDot": 46747 style.style = "dashed"; 46748 break; 46749 case "dashDotDot": 46750 style.style = "dashed"; 46751 break; 46752 case "dashed": 46753 style.style = "dashed"; 46754 break; 46755 case "dotted": 46756 style.style = "dotted"; 46757 break; 46758 case "embossed": 46759 style.style = "ridge"; 46760 break; 46761 case "etched": 46762 style.style = "groove"; 46763 break; 46764 case "lowered": 46765 style.style = "inset"; 46766 break; 46767 case "raised": 46768 style.style = "outset"; 46769 break; 46770 } 46771 } 46772 return style; 46773 } 46774} 46775class Encoding extends OptionObject { 46776 constructor(attributes) { 46777 super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]); 46778 this.id = attributes.id || ""; 46779 this.use = attributes.use || ""; 46780 this.usehref = attributes.usehref || ""; 46781 } 46782} 46783class Encodings extends XFAObject { 46784 constructor(attributes) { 46785 super(TEMPLATE_NS_ID, "encodings", true); 46786 this.id = attributes.id || ""; 46787 this.type = getStringOption(attributes.type, ["optional", "required"]); 46788 this.use = attributes.use || ""; 46789 this.usehref = attributes.usehref || ""; 46790 this.encoding = new XFAObjectArray(); 46791 } 46792} 46793class Encrypt extends XFAObject { 46794 constructor(attributes) { 46795 super(TEMPLATE_NS_ID, "encrypt", true); 46796 this.id = attributes.id || ""; 46797 this.use = attributes.use || ""; 46798 this.usehref = attributes.usehref || ""; 46799 this.certificate = null; 46800 } 46801} 46802class EncryptData extends XFAObject { 46803 constructor(attributes) { 46804 super(TEMPLATE_NS_ID, "encryptData", true); 46805 this.id = attributes.id || ""; 46806 this.operation = getStringOption(attributes.operation, ["encrypt", "decrypt"]); 46807 this.target = attributes.target || ""; 46808 this.use = attributes.use || ""; 46809 this.usehref = attributes.usehref || ""; 46810 this.filter = null; 46811 this.manifest = null; 46812 } 46813} 46814class Encryption extends XFAObject { 46815 constructor(attributes) { 46816 super(TEMPLATE_NS_ID, "encryption", true); 46817 this.id = attributes.id || ""; 46818 this.type = getStringOption(attributes.type, ["optional", "required"]); 46819 this.use = attributes.use || ""; 46820 this.usehref = attributes.usehref || ""; 46821 this.certificate = new XFAObjectArray(); 46822 } 46823} 46824class EncryptionMethod extends OptionObject { 46825 constructor(attributes) { 46826 super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]); 46827 this.id = attributes.id || ""; 46828 this.use = attributes.use || ""; 46829 this.usehref = attributes.usehref || ""; 46830 } 46831} 46832class EncryptionMethods extends XFAObject { 46833 constructor(attributes) { 46834 super(TEMPLATE_NS_ID, "encryptionMethods", true); 46835 this.id = attributes.id || ""; 46836 this.type = getStringOption(attributes.type, ["optional", "required"]); 46837 this.use = attributes.use || ""; 46838 this.usehref = attributes.usehref || ""; 46839 this.encryptionMethod = new XFAObjectArray(); 46840 } 46841} 46842class Event extends XFAObject { 46843 constructor(attributes) { 46844 super(TEMPLATE_NS_ID, "event", true); 46845 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"]); 46846 this.id = attributes.id || ""; 46847 this.listen = getStringOption(attributes.listen, ["refOnly", "refAndDescendents"]); 46848 this.name = attributes.name || ""; 46849 this.ref = attributes.ref || ""; 46850 this.use = attributes.use || ""; 46851 this.usehref = attributes.usehref || ""; 46852 this.extras = null; 46853 this.encryptData = null; 46854 this.execute = null; 46855 this.script = null; 46856 this.signData = null; 46857 this.submit = null; 46858 } 46859} 46860class ExData extends ContentObject { 46861 constructor(attributes) { 46862 super(TEMPLATE_NS_ID, "exData"); 46863 this.contentType = attributes.contentType || ""; 46864 this.href = attributes.href || ""; 46865 this.id = attributes.id || ""; 46866 this.maxLength = getInteger({ 46867 data: attributes.maxLength, 46868 defaultValue: -1, 46869 validate: x => x >= -1 46870 }); 46871 this.name = attributes.name || ""; 46872 this.rid = attributes.rid || ""; 46873 this.transferEncoding = getStringOption(attributes.transferEncoding, ["none", "base64", "package"]); 46874 this.use = attributes.use || ""; 46875 this.usehref = attributes.usehref || ""; 46876 } 46877 [$isCDATAXml]() { 46878 return this.contentType === "text/html"; 46879 } 46880 [$onChild](child) { 46881 if (this.contentType === "text/html" && child[$namespaceId] === NamespaceIds.xhtml.id) { 46882 this[$content] = child; 46883 return true; 46884 } 46885 if (this.contentType === "text/xml") { 46886 this[$content] = child; 46887 return true; 46888 } 46889 return false; 46890 } 46891 [$toHTML](availableSpace) { 46892 if (this.contentType !== "text/html" || !this[$content]) { 46893 return HTMLResult.EMPTY; 46894 } 46895 return this[$content][$toHTML](availableSpace); 46896 } 46897} 46898class ExObject extends XFAObject { 46899 constructor(attributes) { 46900 super(TEMPLATE_NS_ID, "exObject", true); 46901 this.archive = attributes.archive || ""; 46902 this.classId = attributes.classId || ""; 46903 this.codeBase = attributes.codeBase || ""; 46904 this.codeType = attributes.codeType || ""; 46905 this.id = attributes.id || ""; 46906 this.name = attributes.name || ""; 46907 this.use = attributes.use || ""; 46908 this.usehref = attributes.usehref || ""; 46909 this.extras = null; 46910 this.boolean = new XFAObjectArray(); 46911 this.date = new XFAObjectArray(); 46912 this.dateTime = new XFAObjectArray(); 46913 this.decimal = new XFAObjectArray(); 46914 this.exData = new XFAObjectArray(); 46915 this.exObject = new XFAObjectArray(); 46916 this.float = new XFAObjectArray(); 46917 this.image = new XFAObjectArray(); 46918 this.integer = new XFAObjectArray(); 46919 this.text = new XFAObjectArray(); 46920 this.time = new XFAObjectArray(); 46921 } 46922} 46923class ExclGroup extends XFAObject { 46924 constructor(attributes) { 46925 super(TEMPLATE_NS_ID, "exclGroup", true); 46926 this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); 46927 this.accessKey = attributes.accessKey || ""; 46928 this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); 46929 this.colSpan = getInteger({ 46930 data: attributes.colSpan, 46931 defaultValue: 1, 46932 validate: n => n >= 1 || n === -1 46933 }); 46934 this.h = attributes.h ? getMeasurement(attributes.h) : ""; 46935 this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); 46936 this.id = attributes.id || ""; 46937 this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); 46938 this.maxH = getMeasurement(attributes.maxH, "0pt"); 46939 this.maxW = getMeasurement(attributes.maxW, "0pt"); 46940 this.minH = getMeasurement(attributes.minH, "0pt"); 46941 this.minW = getMeasurement(attributes.minW, "0pt"); 46942 this.name = attributes.name || ""; 46943 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 46944 this.relevant = getRelevant(attributes.relevant); 46945 this.use = attributes.use || ""; 46946 this.usehref = attributes.usehref || ""; 46947 this.w = attributes.w ? getMeasurement(attributes.w) : ""; 46948 this.x = getMeasurement(attributes.x, "0pt"); 46949 this.y = getMeasurement(attributes.y, "0pt"); 46950 this.assist = null; 46951 this.bind = null; 46952 this.border = null; 46953 this.calculate = null; 46954 this.caption = null; 46955 this.desc = null; 46956 this.extras = null; 46957 this.margin = null; 46958 this.para = null; 46959 this.traversal = null; 46960 this.validate = null; 46961 this.connect = new XFAObjectArray(); 46962 this.event = new XFAObjectArray(); 46963 this.field = new XFAObjectArray(); 46964 this.setProperty = new XFAObjectArray(); 46965 } 46966 [$isBindable]() { 46967 return true; 46968 } 46969 [$hasSettableValue]() { 46970 return true; 46971 } 46972 [$setValue](value) { 46973 for (const field of this.field.children) { 46974 if (!field.value) { 46975 const nodeValue = new Value({}); 46976 field[$appendChild](nodeValue); 46977 field.value = nodeValue; 46978 } 46979 field.value[$setValue](value); 46980 } 46981 } 46982 [$isThereMoreWidth]() { 46983 return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); 46984 } 46985 [$isSplittable]() { 46986 const parent = this[$getSubformParent](); 46987 if (!parent[$isSplittable]()) { 46988 return false; 46989 } 46990 if (this[$extra]._isSplittable !== undefined) { 46991 return this[$extra]._isSplittable; 46992 } 46993 if (this.layout === "position" || this.layout.includes("row")) { 46994 this[$extra]._isSplittable = false; 46995 return false; 46996 } 46997 if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { 46998 return false; 46999 } 47000 this[$extra]._isSplittable = true; 47001 return true; 47002 } 47003 [$flushHTML]() { 47004 return flushHTML(this); 47005 } 47006 [$addHTML](html, bbox) { 47007 addHTML(this, html, bbox); 47008 } 47009 [$getAvailableSpace]() { 47010 return getAvailableSpace(this); 47011 } 47012 [$toHTML](availableSpace) { 47013 setTabIndex(this); 47014 if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { 47015 return HTMLResult.EMPTY; 47016 } 47017 fixDimensions(this); 47018 const children = []; 47019 const attributes = { 47020 id: this[$uid], 47021 class: [] 47022 }; 47023 setAccess(this, attributes.class); 47024 if (!this[$extra]) { 47025 this[$extra] = Object.create(null); 47026 } 47027 Object.assign(this[$extra], { 47028 children, 47029 attributes, 47030 attempt: 0, 47031 line: null, 47032 numberInLine: 0, 47033 availableSpace: { 47034 width: Math.min(this.w || Infinity, availableSpace.width), 47035 height: Math.min(this.h || Infinity, availableSpace.height) 47036 }, 47037 width: 0, 47038 height: 0, 47039 prevHeight: 0, 47040 currentWidth: 0 47041 }); 47042 const isSplittable = this[$isSplittable](); 47043 if (!isSplittable) { 47044 setFirstUnsplittable(this); 47045 } 47046 if (!checkDimensions(this, availableSpace)) { 47047 return HTMLResult.FAILURE; 47048 } 47049 const filter = new Set(["field"]); 47050 if (this.layout.includes("row")) { 47051 const columnWidths = this[$getSubformParent]().columnWidths; 47052 if (Array.isArray(columnWidths) && columnWidths.length > 0) { 47053 this[$extra].columnWidths = columnWidths; 47054 this[$extra].currentColumn = 0; 47055 } 47056 } 47057 const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); 47058 const classNames = ["xfaExclgroup"]; 47059 const cl = layoutClass(this); 47060 if (cl) { 47061 classNames.push(cl); 47062 } 47063 if (isPrintOnly(this)) { 47064 classNames.push("xfaPrintOnly"); 47065 } 47066 attributes.style = style; 47067 attributes.class = classNames; 47068 if (this.name) { 47069 attributes.xfaName = this.name; 47070 } 47071 this[$pushPara](); 47072 const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; 47073 const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; 47074 for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { 47075 if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { 47076 this[$extra].numberInLine = 0; 47077 } 47078 const result = this[$childrenToHTML]({ 47079 filter, 47080 include: true 47081 }); 47082 if (result.success) { 47083 break; 47084 } 47085 if (result.isBreak()) { 47086 this[$popPara](); 47087 return result; 47088 } 47089 if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !this[$getTemplateRoot]()[$extra].noLayoutFailure) { 47090 this[$extra].attempt = maxRun; 47091 break; 47092 } 47093 } 47094 this[$popPara](); 47095 if (!isSplittable) { 47096 unsetFirstUnsplittable(this); 47097 } 47098 if (this[$extra].attempt === maxRun) { 47099 if (!isSplittable) { 47100 delete this[$extra]; 47101 } 47102 return HTMLResult.FAILURE; 47103 } 47104 let marginH = 0; 47105 let marginV = 0; 47106 if (this.margin) { 47107 marginH = this.margin.leftInset + this.margin.rightInset; 47108 marginV = this.margin.topInset + this.margin.bottomInset; 47109 } 47110 const width = Math.max(this[$extra].width + marginH, this.w || 0); 47111 const height = Math.max(this[$extra].height + marginV, this.h || 0); 47112 const bbox = [this.x, this.y, width, height]; 47113 if (this.w === "") { 47114 style.width = measureToString(width); 47115 } 47116 if (this.h === "") { 47117 style.height = measureToString(height); 47118 } 47119 const html = { 47120 name: "div", 47121 attributes, 47122 children 47123 }; 47124 applyAssist(this, attributes); 47125 delete this[$extra]; 47126 return HTMLResult.success(createWrapper(this, html), bbox); 47127 } 47128} 47129class Execute extends XFAObject { 47130 constructor(attributes) { 47131 super(TEMPLATE_NS_ID, "execute"); 47132 this.connection = attributes.connection || ""; 47133 this.executeType = getStringOption(attributes.executeType, ["import", "remerge"]); 47134 this.id = attributes.id || ""; 47135 this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); 47136 this.use = attributes.use || ""; 47137 this.usehref = attributes.usehref || ""; 47138 } 47139} 47140class Extras extends XFAObject { 47141 constructor(attributes) { 47142 super(TEMPLATE_NS_ID, "extras", true); 47143 this.id = attributes.id || ""; 47144 this.name = attributes.name || ""; 47145 this.use = attributes.use || ""; 47146 this.usehref = attributes.usehref || ""; 47147 this.boolean = new XFAObjectArray(); 47148 this.date = new XFAObjectArray(); 47149 this.dateTime = new XFAObjectArray(); 47150 this.decimal = new XFAObjectArray(); 47151 this.exData = new XFAObjectArray(); 47152 this.extras = new XFAObjectArray(); 47153 this.float = new XFAObjectArray(); 47154 this.image = new XFAObjectArray(); 47155 this.integer = new XFAObjectArray(); 47156 this.text = new XFAObjectArray(); 47157 this.time = new XFAObjectArray(); 47158 } 47159} 47160class Field extends XFAObject { 47161 constructor(attributes) { 47162 super(TEMPLATE_NS_ID, "field", true); 47163 this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); 47164 this.accessKey = attributes.accessKey || ""; 47165 this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); 47166 this.colSpan = getInteger({ 47167 data: attributes.colSpan, 47168 defaultValue: 1, 47169 validate: n => n >= 1 || n === -1 47170 }); 47171 this.h = attributes.h ? getMeasurement(attributes.h) : ""; 47172 this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); 47173 this.id = attributes.id || ""; 47174 this.locale = attributes.locale || ""; 47175 this.maxH = getMeasurement(attributes.maxH, "0pt"); 47176 this.maxW = getMeasurement(attributes.maxW, "0pt"); 47177 this.minH = getMeasurement(attributes.minH, "0pt"); 47178 this.minW = getMeasurement(attributes.minW, "0pt"); 47179 this.name = attributes.name || ""; 47180 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 47181 this.relevant = getRelevant(attributes.relevant); 47182 this.rotate = getInteger({ 47183 data: attributes.rotate, 47184 defaultValue: 0, 47185 validate: x => x % 90 === 0 47186 }); 47187 this.use = attributes.use || ""; 47188 this.usehref = attributes.usehref || ""; 47189 this.w = attributes.w ? getMeasurement(attributes.w) : ""; 47190 this.x = getMeasurement(attributes.x, "0pt"); 47191 this.y = getMeasurement(attributes.y, "0pt"); 47192 this.assist = null; 47193 this.bind = null; 47194 this.border = null; 47195 this.calculate = null; 47196 this.caption = null; 47197 this.desc = null; 47198 this.extras = null; 47199 this.font = null; 47200 this.format = null; 47201 this.items = new XFAObjectArray(2); 47202 this.keep = null; 47203 this.margin = null; 47204 this.para = null; 47205 this.traversal = null; 47206 this.ui = null; 47207 this.validate = null; 47208 this.value = null; 47209 this.bindItems = new XFAObjectArray(); 47210 this.connect = new XFAObjectArray(); 47211 this.event = new XFAObjectArray(); 47212 this.setProperty = new XFAObjectArray(); 47213 } 47214 [$isBindable]() { 47215 return true; 47216 } 47217 [$setValue](value) { 47218 _setValue(this, value); 47219 } 47220 [$toHTML](availableSpace) { 47221 setTabIndex(this); 47222 if (!this.ui) { 47223 this.ui = new Ui({}); 47224 this.ui[$globalData] = this[$globalData]; 47225 this[$appendChild](this.ui); 47226 let node; 47227 switch (this.items.children.length) { 47228 case 0: 47229 node = new TextEdit({}); 47230 this.ui.textEdit = node; 47231 break; 47232 case 1: 47233 node = new CheckButton({}); 47234 this.ui.checkButton = node; 47235 break; 47236 case 2: 47237 node = new ChoiceList({}); 47238 this.ui.choiceList = node; 47239 break; 47240 } 47241 this.ui[$appendChild](node); 47242 } 47243 if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { 47244 return HTMLResult.EMPTY; 47245 } 47246 if (this.caption) { 47247 delete this.caption[$extra]; 47248 }
vendor: 5,664 bytes, lines 47249-47456
47249 this[$pushPara](); 47250 const caption = this.caption ? this.caption[$toHTML](availableSpace).html : null; 47251 const savedW = this.w; 47252 const savedH = this.h; 47253 let marginH = 0; 47254 let marginV = 0; 47255 if (this.margin) { 47256 marginH = this.margin.leftInset + this.margin.rightInset; 47257 marginV = this.margin.topInset + this.margin.bottomInset; 47258 } 47259 let borderDims = null; 47260 if (this.w === "" || this.h === "") { 47261 let width = null; 47262 let height = null; 47263 let uiW = 0; 47264 let uiH = 0; 47265 if (this.ui.checkButton) { 47266 uiW = uiH = this.ui.checkButton.size; 47267 } else { 47268 const { 47269 w, 47270 h 47271 } = layoutNode(this, availableSpace); 47272 if (w !== null) { 47273 uiW = w; 47274 uiH = h; 47275 } else { 47276 uiH = fonts_getMetrics(this.font, true).lineNoGap; 47277 } 47278 } 47279 borderDims = getBorderDims(this.ui[$getExtra]()); 47280 uiW += borderDims.w; 47281 uiH += borderDims.h; 47282 if (this.caption) { 47283 const { 47284 w, 47285 h, 47286 isBroken 47287 } = this.caption[$getExtra](availableSpace); 47288 if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { 47289 this[$popPara](); 47290 return HTMLResult.FAILURE; 47291 } 47292 width = w; 47293 height = h; 47294 switch (this.caption.placement) { 47295 case "left": 47296 case "right": 47297 case "inline": 47298 width += uiW; 47299 break; 47300 case "top": 47301 case "bottom": 47302 height += uiH; 47303 break; 47304 } 47305 } else { 47306 width = uiW; 47307 height = uiH; 47308 } 47309 if (width && this.w === "") { 47310 width += marginH; 47311 this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW); 47312 } 47313 if (height && this.h === "") { 47314 height += marginV; 47315 this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH); 47316 } 47317 } 47318 this[$popPara](); 47319 fixDimensions(this); 47320 setFirstUnsplittable(this); 47321 if (!checkDimensions(this, availableSpace)) { 47322 this.w = savedW; 47323 this.h = savedH; 47324 this[$popPara](); 47325 return HTMLResult.FAILURE; 47326 } 47327 unsetFirstUnsplittable(this); 47328 const style = toStyle(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign"); 47329 setMinMaxDimensions(this, style); 47330 const classNames = ["xfaField"]; 47331 if (this.font) { 47332 classNames.push("xfaFont"); 47333 } 47334 if (isPrintOnly(this)) { 47335 classNames.push("xfaPrintOnly"); 47336 } 47337 const attributes = { 47338 style, 47339 id: this[$uid], 47340 class: classNames 47341 }; 47342 if (style.margin) { 47343 style.padding = style.margin; 47344 delete style.margin; 47345 } 47346 setAccess(this, classNames); 47347 if (this.name) { 47348 attributes.xfaName = this.name; 47349 } 47350 const children = []; 47351 const html = { 47352 name: "div", 47353 attributes, 47354 children 47355 }; 47356 applyAssist(this, attributes); 47357 const borderStyle = this.border ? this.border[$toStyle]() : null; 47358 const bbox = computeBbox(this, html, availableSpace); 47359 const ui = this.ui[$toHTML]().html; 47360 if (!ui) { 47361 Object.assign(style, borderStyle); 47362 return HTMLResult.success(createWrapper(this, html), bbox); 47363 } 47364 if (this[$tabIndex]) { 47365 if (ui.children?.[0]) { 47366 ui.children[0].attributes.tabindex = this[$tabIndex]; 47367 } else { 47368 ui.attributes.tabindex = this[$tabIndex]; 47369 } 47370 } 47371 if (!ui.attributes.style) { 47372 ui.attributes.style = Object.create(null); 47373 } 47374 let aElement = null; 47375 if (this.ui.button) { 47376 if (ui.children.length === 1) { 47377 [aElement] = ui.children.splice(0, 1); 47378 } 47379 Object.assign(ui.attributes.style, borderStyle); 47380 } else { 47381 Object.assign(style, borderStyle); 47382 } 47383 children.push(ui); 47384 if (this.value) { 47385 if (this.ui.imageEdit) { 47386 ui.children.push(this.value[$toHTML]().html); 47387 } else if (!this.ui.button) { 47388 let value = ""; 47389 if (this.value.exData) { 47390 value = this.value.exData[$text](); 47391 } else if (this.value.text) { 47392 value = this.value.text[$getExtra](); 47393 } else { 47394 const htmlValue = this.value[$toHTML]().html; 47395 if (htmlValue !== null) { 47396 value = htmlValue.children[0].value; 47397 } 47398 } 47399 if (this.ui.textEdit && this.value.text?.maxChars) { 47400 ui.children[0].attributes.maxLength = this.value.text.maxChars; 47401 } 47402 if (value) { 47403 if (this.ui.numericEdit) { 47404 value = parseFloat(value); 47405 value = isNaN(value) ? "" : value.toString(); 47406 } 47407 if (ui.children[0].name === "textarea") { 47408 ui.children[0].attributes.textContent = value; 47409 } else { 47410 ui.children[0].attributes.value = value; 47411 } 47412 } 47413 } 47414 } 47415 if (!this.ui.imageEdit && ui.children?.[0] && this.h) { 47416 borderDims = borderDims || getBorderDims(this.ui[$getExtra]()); 47417 let captionHeight = 0; 47418 if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { 47419 captionHeight = this.caption.reserve; 47420 if (captionHeight <= 0) { 47421 captionHeight = this.caption[$getExtra](availableSpace).h; 47422 } 47423 const inputHeight = this.h - captionHeight - marginV - borderDims.h; 47424 ui.children[0].attributes.style.height = measureToString(inputHeight); 47425 } else { 47426 ui.children[0].attributes.style.height = "100%"; 47427 } 47428 } 47429 if (aElement) { 47430 ui.children.push(aElement); 47431 } 47432 if (!caption) { 47433 if (ui.attributes.class) { 47434 ui.attributes.class.push("xfaLeft"); 47435 } 47436 this.w = savedW; 47437 this.h = savedH; 47438 return HTMLResult.success(createWrapper(this, html), bbox); 47439 } 47440 if (this.ui.button) { 47441 if (style.padding) { 47442 delete style.padding; 47443 } 47444 if (caption.name === "div") { 47445 caption.name = "span"; 47446 } 47447 ui.children.push(caption); 47448 return HTMLResult.success(html, bbox); 47449 } else if (this.ui.checkButton) { 47450 caption.attributes.class[0] = "xfaCaptionForCheckButton"; 47451 } 47452 if (!ui.attributes.class) { 47453 ui.attributes.class = []; 47454 } 47455 ui.children.splice(0, 0, caption); 47456 switch (this.caption.placement) {
vendor: 5,240 bytes, lines 47457-47630
47457 case "left": 47458 ui.attributes.class.push("xfaLeft"); 47459 break; 47460 case "right": 47461 ui.attributes.class.push("xfaRight"); 47462 break; 47463 case "top": 47464 ui.attributes.class.push("xfaTop"); 47465 break; 47466 case "bottom": 47467 ui.attributes.class.push("xfaBottom"); 47468 break; 47469 case "inline": 47470 ui.attributes.class.push("xfaLeft"); 47471 break; 47472 } 47473 this.w = savedW; 47474 this.h = savedH; 47475 return HTMLResult.success(createWrapper(this, html), bbox); 47476 } 47477} 47478class Fill extends XFAObject { 47479 constructor(attributes) { 47480 super(TEMPLATE_NS_ID, "fill", true); 47481 this.id = attributes.id || ""; 47482 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 47483 this.use = attributes.use || ""; 47484 this.usehref = attributes.usehref || ""; 47485 this.color = null; 47486 this.extras = null; 47487 this.linear = null; 47488 this.pattern = null; 47489 this.radial = null; 47490 this.solid = null; 47491 this.stipple = null; 47492 } 47493 [$toStyle]() { 47494 const parent = this[$getParent](); 47495 const grandpa = parent[$getParent](); 47496 const ggrandpa = grandpa[$getParent](); 47497 const style = Object.create(null); 47498 let propName = "color"; 47499 let altPropName = propName; 47500 if (parent instanceof Border) { 47501 propName = "background-color"; 47502 altPropName = "background"; 47503 if (ggrandpa instanceof Ui) { 47504 style.backgroundColor = "white"; 47505 } 47506 } 47507 if (parent instanceof Rectangle || parent instanceof Arc) { 47508 propName = altPropName = "fill"; 47509 style.fill = "white"; 47510 } 47511 for (const name of Object.getOwnPropertyNames(this)) { 47512 if (name === "extras" || name === "color") { 47513 continue; 47514 } 47515 const obj = this[name]; 47516 if (!(obj instanceof XFAObject)) { 47517 continue; 47518 } 47519 const color = obj[$toStyle](this.color); 47520 if (color) { 47521 style[color.startsWith("#") ? propName : altPropName] = color; 47522 } 47523 return style; 47524 } 47525 if (this.color?.value) { 47526 const color = this.color[$toStyle](); 47527 style[color.startsWith("#") ? propName : altPropName] = color; 47528 } 47529 return style; 47530 } 47531} 47532class Filter extends XFAObject { 47533 constructor(attributes) { 47534 super(TEMPLATE_NS_ID, "filter", true); 47535 this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, ["", "required", "optional", "none"]); 47536 this.id = attributes.id || ""; 47537 this.name = attributes.name || ""; 47538 this.use = attributes.use || ""; 47539 this.usehref = attributes.usehref || ""; 47540 this.version = getInteger({ 47541 data: this.version, 47542 defaultValue: 5, 47543 validate: x => x >= 1 && x <= 5 47544 }); 47545 this.appearanceFilter = null; 47546 this.certificates = null; 47547 this.digestMethods = null; 47548 this.encodings = null; 47549 this.encryptionMethods = null; 47550 this.handler = null; 47551 this.lockDocument = null; 47552 this.mdp = null; 47553 this.reasons = null; 47554 this.timeStamp = null; 47555 } 47556} 47557class Float extends ContentObject { 47558 constructor(attributes) { 47559 super(TEMPLATE_NS_ID, "float"); 47560 this.id = attributes.id || ""; 47561 this.name = attributes.name || ""; 47562 this.use = attributes.use || ""; 47563 this.usehref = attributes.usehref || ""; 47564 } 47565 [$finalize]() { 47566 const number = parseFloat(this[$content].trim()); 47567 this[$content] = isNaN(number) ? null : number; 47568 } 47569 [$toHTML](availableSpace) { 47570 return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); 47571 } 47572} 47573class template_Font extends XFAObject { 47574 constructor(attributes) { 47575 super(TEMPLATE_NS_ID, "font", true); 47576 this.baselineShift = getMeasurement(attributes.baselineShift); 47577 this.fontHorizontalScale = getFloat({ 47578 data: attributes.fontHorizontalScale, 47579 defaultValue: 100, 47580 validate: x => x >= 0 47581 }); 47582 this.fontVerticalScale = getFloat({ 47583 data: attributes.fontVerticalScale, 47584 defaultValue: 100, 47585 validate: x => x >= 0 47586 }); 47587 this.id = attributes.id || ""; 47588 this.kerningMode = getStringOption(attributes.kerningMode, ["none", "pair"]); 47589 this.letterSpacing = getMeasurement(attributes.letterSpacing, "0"); 47590 this.lineThrough = getInteger({ 47591 data: attributes.lineThrough, 47592 defaultValue: 0, 47593 validate: x => x === 1 || x === 2 47594 }); 47595 this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, ["all", "word"]); 47596 this.overline = getInteger({ 47597 data: attributes.overline, 47598 defaultValue: 0, 47599 validate: x => x === 1 || x === 2 47600 }); 47601 this.overlinePeriod = getStringOption(attributes.overlinePeriod, ["all", "word"]); 47602 this.posture = getStringOption(attributes.posture, ["normal", "italic"]); 47603 this.size = getMeasurement(attributes.size, "10pt"); 47604 this.typeface = attributes.typeface || "Courier"; 47605 this.underline = getInteger({ 47606 data: attributes.underline, 47607 defaultValue: 0, 47608 validate: x => x === 1 || x === 2 47609 }); 47610 this.underlinePeriod = getStringOption(attributes.underlinePeriod, ["all", "word"]); 47611 this.use = attributes.use || ""; 47612 this.usehref = attributes.usehref || ""; 47613 this.weight = getStringOption(attributes.weight, ["normal", "bold"]); 47614 this.extras = null; 47615 this.fill = null; 47616 } 47617 [$clean](builder) { 47618 super[$clean](builder); 47619 this[$globalData].usedTypefaces.add(this.typeface); 47620 } 47621 [$toStyle]() { 47622 const style = toStyle(this, "fill"); 47623 const color = style.color; 47624 if (color) { 47625 if (color === "#000000") { 47626 delete style.color; 47627 } else if (!color.startsWith("#")) { 47628 style.background = color; 47629 style.backgroundClip = "text"; 47630 style.color = "transparent";
vendor: 7,367 bytes, lines 47631-47893
47631 } 47632 } 47633 if (this.baselineShift) { 47634 style.verticalAlign = measureToString(this.baselineShift); 47635 } 47636 style.fontKerning = this.kerningMode === "none" ? "none" : "normal"; 47637 style.letterSpacing = measureToString(this.letterSpacing); 47638 if (this.lineThrough !== 0) { 47639 style.textDecoration = "line-through"; 47640 if (this.lineThrough === 2) { 47641 style.textDecorationStyle = "double"; 47642 } 47643 } 47644 if (this.overline !== 0) { 47645 style.textDecoration = "overline"; 47646 if (this.overline === 2) { 47647 style.textDecorationStyle = "double"; 47648 } 47649 } 47650 style.fontStyle = this.posture; 47651 style.fontSize = measureToString(0.99 * this.size); 47652 setFontFamily(this, this, this[$globalData].fontFinder, style); 47653 if (this.underline !== 0) { 47654 style.textDecoration = "underline"; 47655 if (this.underline === 2) { 47656 style.textDecorationStyle = "double"; 47657 } 47658 } 47659 style.fontWeight = this.weight; 47660 return style; 47661 } 47662} 47663class Format extends XFAObject { 47664 constructor(attributes) { 47665 super(TEMPLATE_NS_ID, "format", true); 47666 this.id = attributes.id || ""; 47667 this.use = attributes.use || ""; 47668 this.usehref = attributes.usehref || ""; 47669 this.extras = null; 47670 this.picture = null; 47671 } 47672} 47673class Handler extends StringObject { 47674 constructor(attributes) { 47675 super(TEMPLATE_NS_ID, "handler"); 47676 this.id = attributes.id || ""; 47677 this.type = getStringOption(attributes.type, ["optional", "required"]); 47678 this.use = attributes.use || ""; 47679 this.usehref = attributes.usehref || ""; 47680 } 47681} 47682class Hyphenation extends XFAObject { 47683 constructor(attributes) { 47684 super(TEMPLATE_NS_ID, "hyphenation"); 47685 this.excludeAllCaps = getInteger({ 47686 data: attributes.excludeAllCaps, 47687 defaultValue: 0, 47688 validate: x => x === 1 47689 }); 47690 this.excludeInitialCap = getInteger({ 47691 data: attributes.excludeInitialCap, 47692 defaultValue: 0, 47693 validate: x => x === 1 47694 }); 47695 this.hyphenate = getInteger({ 47696 data: attributes.hyphenate, 47697 defaultValue: 0, 47698 validate: x => x === 1 47699 }); 47700 this.id = attributes.id || ""; 47701 this.pushCharacterCount = getInteger({ 47702 data: attributes.pushCharacterCount, 47703 defaultValue: 3, 47704 validate: x => x >= 0 47705 }); 47706 this.remainCharacterCount = getInteger({ 47707 data: attributes.remainCharacterCount, 47708 defaultValue: 3, 47709 validate: x => x >= 0 47710 }); 47711 this.use = attributes.use || ""; 47712 this.usehref = attributes.usehref || ""; 47713 this.wordCharacterCount = getInteger({ 47714 data: attributes.wordCharacterCount, 47715 defaultValue: 7, 47716 validate: x => x >= 0 47717 }); 47718 } 47719} 47720class Image extends StringObject { 47721 constructor(attributes) { 47722 super(TEMPLATE_NS_ID, "image"); 47723 this.aspect = getStringOption(attributes.aspect, ["fit", "actual", "height", "none", "width"]); 47724 this.contentType = attributes.contentType || ""; 47725 this.href = attributes.href || ""; 47726 this.id = attributes.id || ""; 47727 this.name = attributes.name || ""; 47728 this.transferEncoding = getStringOption(attributes.transferEncoding, ["base64", "none", "package"]); 47729 this.use = attributes.use || ""; 47730 this.usehref = attributes.usehref || ""; 47731 } 47732 [$toHTML]() { 47733 if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { 47734 return HTMLResult.EMPTY; 47735 } 47736 let buffer = this[$globalData].images && this[$globalData].images.get(this.href); 47737 if (!buffer && (this.href || !this[$content])) { 47738 return HTMLResult.EMPTY; 47739 } 47740 if (!buffer && this.transferEncoding === "base64") { 47741 buffer = fromBase64Util(this[$content]); 47742 } 47743 if (!buffer) { 47744 return HTMLResult.EMPTY; 47745 } 47746 if (!this.contentType) { 47747 for (const [header, type] of IMAGES_HEADERS) { 47748 if (buffer.length > header.length && header.every((x, i) => x === buffer[i])) { 47749 this.contentType = type; 47750 break; 47751 } 47752 } 47753 if (!this.contentType) { 47754 return HTMLResult.EMPTY; 47755 } 47756 } 47757 const blob = new Blob([buffer], { 47758 type: this.contentType 47759 }); 47760 let style; 47761 switch (this.aspect) { 47762 case "fit": 47763 case "actual": 47764 break; 47765 case "height": 47766 style = { 47767 height: "100%", 47768 objectFit: "fill" 47769 }; 47770 break; 47771 case "none": 47772 style = { 47773 width: "100%", 47774 height: "100%", 47775 objectFit: "fill" 47776 }; 47777 break; 47778 case "width": 47779 style = { 47780 width: "100%", 47781 objectFit: "fill" 47782 }; 47783 break; 47784 } 47785 const parent = this[$getParent](); 47786 return HTMLResult.success({ 47787 name: "img", 47788 attributes: { 47789 class: ["xfaImage"], 47790 style, 47791 src: URL.createObjectURL(blob), 47792 alt: parent ? ariaLabel(parent[$getParent]()) : null 47793 } 47794 }); 47795 } 47796} 47797class ImageEdit extends XFAObject { 47798 constructor(attributes) { 47799 super(TEMPLATE_NS_ID, "imageEdit", true); 47800 this.data = getStringOption(attributes.data, ["link", "embed"]); 47801 this.id = attributes.id || ""; 47802 this.use = attributes.use || ""; 47803 this.usehref = attributes.usehref || ""; 47804 this.border = null; 47805 this.extras = null; 47806 this.margin = null; 47807 } 47808 [$toHTML](availableSpace) { 47809 if (this.data === "embed") { 47810 return HTMLResult.success({ 47811 name: "div", 47812 children: [], 47813 attributes: {} 47814 }); 47815 } 47816 return HTMLResult.EMPTY; 47817 } 47818} 47819class Integer extends ContentObject { 47820 constructor(attributes) { 47821 super(TEMPLATE_NS_ID, "integer"); 47822 this.id = attributes.id || ""; 47823 this.name = attributes.name || ""; 47824 this.use = attributes.use || ""; 47825 this.usehref = attributes.usehref || ""; 47826 } 47827 [$finalize]() { 47828 const number = parseInt(this[$content].trim(), 10); 47829 this[$content] = isNaN(number) ? null : number; 47830 } 47831 [$toHTML](availableSpace) { 47832 return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); 47833 } 47834} 47835class Issuers extends XFAObject { 47836 constructor(attributes) { 47837 super(TEMPLATE_NS_ID, "issuers", true); 47838 this.id = attributes.id || ""; 47839 this.type = getStringOption(attributes.type, ["optional", "required"]); 47840 this.use = attributes.use || ""; 47841 this.usehref = attributes.usehref || ""; 47842 this.certificate = new XFAObjectArray(); 47843 } 47844} 47845class Items extends XFAObject { 47846 constructor(attributes) { 47847 super(TEMPLATE_NS_ID, "items", true); 47848 this.id = attributes.id || ""; 47849 this.name = attributes.name || ""; 47850 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 47851 this.ref = attributes.ref || ""; 47852 this.save = getInteger({ 47853 data: attributes.save, 47854 defaultValue: 0, 47855 validate: x => x === 1 47856 }); 47857 this.use = attributes.use || ""; 47858 this.usehref = attributes.usehref || ""; 47859 this.boolean = new XFAObjectArray(); 47860 this.date = new XFAObjectArray(); 47861 this.dateTime = new XFAObjectArray(); 47862 this.decimal = new XFAObjectArray(); 47863 this.exData = new XFAObjectArray(); 47864 this.float = new XFAObjectArray(); 47865 this.image = new XFAObjectArray(); 47866 this.integer = new XFAObjectArray(); 47867 this.text = new XFAObjectArray(); 47868 this.time = new XFAObjectArray(); 47869 } 47870 [$toHTML]() { 47871 const output = []; 47872 for (const child of this[$getChildren]()) { 47873 output.push(child[$text]()); 47874 } 47875 return HTMLResult.success(output); 47876 } 47877} 47878class Keep extends XFAObject { 47879 constructor(attributes) { 47880 super(TEMPLATE_NS_ID, "keep", true); 47881 this.id = attributes.id || ""; 47882 const options = ["none", "contentArea", "pageArea"]; 47883 this.intact = getStringOption(attributes.intact, options); 47884 this.next = getStringOption(attributes.next, options); 47885 this.previous = getStringOption(attributes.previous, options); 47886 this.use = attributes.use || ""; 47887 this.usehref = attributes.usehref || ""; 47888 this.extras = null; 47889 } 47890} 47891class KeyUsage extends XFAObject { 47892 constructor(attributes) { 47893 super(TEMPLATE_NS_ID, "keyUsage");
vendor: 18,762 bytes, lines 47894-48490
47894 const options = ["", "yes", "no"]; 47895 this.crlSign = getStringOption(attributes.crlSign, options); 47896 this.dataEncipherment = getStringOption(attributes.dataEncipherment, options); 47897 this.decipherOnly = getStringOption(attributes.decipherOnly, options); 47898 this.digitalSignature = getStringOption(attributes.digitalSignature, options); 47899 this.encipherOnly = getStringOption(attributes.encipherOnly, options); 47900 this.id = attributes.id || ""; 47901 this.keyAgreement = getStringOption(attributes.keyAgreement, options); 47902 this.keyCertSign = getStringOption(attributes.keyCertSign, options); 47903 this.keyEncipherment = getStringOption(attributes.keyEncipherment, options); 47904 this.nonRepudiation = getStringOption(attributes.nonRepudiation, options); 47905 this.type = getStringOption(attributes.type, ["optional", "required"]); 47906 this.use = attributes.use || ""; 47907 this.usehref = attributes.usehref || ""; 47908 } 47909} 47910class Line extends XFAObject { 47911 constructor(attributes) { 47912 super(TEMPLATE_NS_ID, "line", true); 47913 this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); 47914 this.id = attributes.id || ""; 47915 this.slope = getStringOption(attributes.slope, ["\\", "/"]); 47916 this.use = attributes.use || ""; 47917 this.usehref = attributes.usehref || ""; 47918 this.edge = null; 47919 } 47920 [$toHTML]() { 47921 const parent = this[$getParent]()[$getParent](); 47922 const edge = this.edge || new Edge({}); 47923 const edgeStyle = edge[$toStyle](); 47924 const style = Object.create(null); 47925 const thickness = edge.presence === "visible" ? edge.thickness : 0; 47926 style.strokeWidth = measureToString(thickness); 47927 style.stroke = edgeStyle.color; 47928 let x1, y1, x2, y2; 47929 let width = "100%"; 47930 let height = "100%"; 47931 if (parent.w <= thickness) { 47932 [x1, y1, x2, y2] = ["50%", 0, "50%", "100%"]; 47933 width = style.strokeWidth; 47934 } else if (parent.h <= thickness) { 47935 [x1, y1, x2, y2] = [0, "50%", "100%", "50%"]; 47936 height = style.strokeWidth; 47937 } else if (this.slope === "\\") { 47938 [x1, y1, x2, y2] = [0, 0, "100%", "100%"]; 47939 } else { 47940 [x1, y1, x2, y2] = [0, "100%", "100%", 0]; 47941 } 47942 const line = { 47943 name: "line", 47944 attributes: { 47945 xmlns: SVG_NS, 47946 x1, 47947 y1, 47948 x2, 47949 y2, 47950 style 47951 } 47952 }; 47953 const svg = { 47954 name: "svg", 47955 children: [line], 47956 attributes: { 47957 xmlns: SVG_NS, 47958 width, 47959 height, 47960 style: { 47961 overflow: "visible" 47962 } 47963 } 47964 }; 47965 if (hasMargin(parent)) { 47966 return HTMLResult.success({ 47967 name: "div", 47968 attributes: { 47969 style: { 47970 display: "inline", 47971 width: "100%", 47972 height: "100%" 47973 } 47974 }, 47975 children: [svg] 47976 }); 47977 } 47978 svg.attributes.style.position = "absolute"; 47979 return HTMLResult.success(svg); 47980 } 47981} 47982class Linear extends XFAObject { 47983 constructor(attributes) { 47984 super(TEMPLATE_NS_ID, "linear", true); 47985 this.id = attributes.id || ""; 47986 this.type = getStringOption(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]); 47987 this.use = attributes.use || ""; 47988 this.usehref = attributes.usehref || ""; 47989 this.color = null; 47990 this.extras = null; 47991 } 47992 [$toStyle](startColor) { 47993 startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; 47994 const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase(); 47995 const endColor = this.color ? this.color[$toStyle]() : "#000000"; 47996 return `linear-gradient(${transf}, ${startColor}, ${endColor})`; 47997 } 47998} 47999class LockDocument extends ContentObject { 48000 constructor(attributes) { 48001 super(TEMPLATE_NS_ID, "lockDocument"); 48002 this.id = attributes.id || ""; 48003 this.type = getStringOption(attributes.type, ["optional", "required"]); 48004 this.use = attributes.use || ""; 48005 this.usehref = attributes.usehref || ""; 48006 } 48007 [$finalize]() { 48008 this[$content] = getStringOption(this[$content], ["auto", "0", "1"]); 48009 } 48010} 48011class Manifest extends XFAObject { 48012 constructor(attributes) { 48013 super(TEMPLATE_NS_ID, "manifest", true); 48014 this.action = getStringOption(attributes.action, ["include", "all", "exclude"]); 48015 this.id = attributes.id || ""; 48016 this.name = attributes.name || ""; 48017 this.use = attributes.use || ""; 48018 this.usehref = attributes.usehref || ""; 48019 this.extras = null; 48020 this.ref = new XFAObjectArray(); 48021 } 48022} 48023class Margin extends XFAObject { 48024 constructor(attributes) { 48025 super(TEMPLATE_NS_ID, "margin", true); 48026 this.bottomInset = getMeasurement(attributes.bottomInset, "0"); 48027 this.id = attributes.id || ""; 48028 this.leftInset = getMeasurement(attributes.leftInset, "0"); 48029 this.rightInset = getMeasurement(attributes.rightInset, "0"); 48030 this.topInset = getMeasurement(attributes.topInset, "0"); 48031 this.use = attributes.use || ""; 48032 this.usehref = attributes.usehref || ""; 48033 this.extras = null; 48034 } 48035 [$toStyle]() { 48036 return { 48037 margin: measureToString(this.topInset) + " " + measureToString(this.rightInset) + " " + measureToString(this.bottomInset) + " " + measureToString(this.leftInset) 48038 }; 48039 } 48040} 48041class Mdp extends XFAObject { 48042 constructor(attributes) { 48043 super(TEMPLATE_NS_ID, "mdp"); 48044 this.id = attributes.id || ""; 48045 this.permissions = getInteger({ 48046 data: attributes.permissions, 48047 defaultValue: 2, 48048 validate: x => x === 1 || x === 3 48049 }); 48050 this.signatureType = getStringOption(attributes.signatureType, ["filler", "author"]); 48051 this.use = attributes.use || ""; 48052 this.usehref = attributes.usehref || ""; 48053 } 48054} 48055class Medium extends XFAObject { 48056 constructor(attributes) { 48057 super(TEMPLATE_NS_ID, "medium"); 48058 this.id = attributes.id || ""; 48059 this.imagingBBox = getBBox(attributes.imagingBBox); 48060 this.long = getMeasurement(attributes.long); 48061 this.orientation = getStringOption(attributes.orientation, ["portrait", "landscape"]); 48062 this.short = getMeasurement(attributes.short); 48063 this.stock = attributes.stock || ""; 48064 this.trayIn = getStringOption(attributes.trayIn, ["auto", "delegate", "pageFront"]); 48065 this.trayOut = getStringOption(attributes.trayOut, ["auto", "delegate"]); 48066 this.use = attributes.use || ""; 48067 this.usehref = attributes.usehref || ""; 48068 } 48069} 48070class Message extends XFAObject { 48071 constructor(attributes) { 48072 super(TEMPLATE_NS_ID, "message", true); 48073 this.id = attributes.id || ""; 48074 this.use = attributes.use || ""; 48075 this.usehref = attributes.usehref || ""; 48076 this.text = new XFAObjectArray(); 48077 } 48078} 48079class NumericEdit extends XFAObject { 48080 constructor(attributes) { 48081 super(TEMPLATE_NS_ID, "numericEdit", true); 48082 this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); 48083 this.id = attributes.id || ""; 48084 this.use = attributes.use || ""; 48085 this.usehref = attributes.usehref || ""; 48086 this.border = null; 48087 this.comb = null; 48088 this.extras = null; 48089 this.margin = null; 48090 } 48091 [$toHTML](availableSpace) { 48092 const style = toStyle(this, "border", "font", "margin"); 48093 const field = this[$getParent]()[$getParent](); 48094 const html = { 48095 name: "input", 48096 attributes: { 48097 type: "text", 48098 fieldId: field[$uid], 48099 dataId: field[$data]?.[$uid] || field[$uid], 48100 class: ["xfaTextfield"], 48101 style, 48102 "aria-label": ariaLabel(field), 48103 "aria-required": false 48104 } 48105 }; 48106 if (isRequired(field)) { 48107 html.attributes["aria-required"] = true; 48108 html.attributes.required = true; 48109 } 48110 return HTMLResult.success({ 48111 name: "label", 48112 attributes: { 48113 class: ["xfaLabel"] 48114 }, 48115 children: [html] 48116 }); 48117 } 48118} 48119class Occur extends XFAObject { 48120 constructor(attributes) { 48121 super(TEMPLATE_NS_ID, "occur", true); 48122 this.id = attributes.id || ""; 48123 this.initial = attributes.initial !== "" ? getInteger({ 48124 data: attributes.initial, 48125 defaultValue: "", 48126 validate: x => true 48127 }) : ""; 48128 this.max = attributes.max !== "" ? getInteger({ 48129 data: attributes.max, 48130 defaultValue: 1, 48131 validate: x => true 48132 }) : ""; 48133 this.min = attributes.min !== "" ? getInteger({ 48134 data: attributes.min, 48135 defaultValue: 1, 48136 validate: x => true 48137 }) : ""; 48138 this.use = attributes.use || ""; 48139 this.usehref = attributes.usehref || ""; 48140 this.extras = null; 48141 } 48142 [$clean]() { 48143 const parent = this[$getParent](); 48144 const originalMin = this.min; 48145 if (this.min === "") { 48146 this.min = parent instanceof PageArea || parent instanceof PageSet ? 0 : 1; 48147 } 48148 if (this.max === "") { 48149 if (originalMin === "") { 48150 this.max = parent instanceof PageArea || parent instanceof PageSet ? -1 : 1; 48151 } else { 48152 this.max = this.min; 48153 } 48154 } 48155 if (this.max !== -1 && this.max < this.min) { 48156 this.max = this.min; 48157 } 48158 if (this.initial === "") { 48159 this.initial = parent instanceof Template ? 1 : this.min; 48160 } 48161 } 48162} 48163class Oid extends StringObject { 48164 constructor(attributes) { 48165 super(TEMPLATE_NS_ID, "oid"); 48166 this.id = attributes.id || ""; 48167 this.name = attributes.name || ""; 48168 this.use = attributes.use || ""; 48169 this.usehref = attributes.usehref || ""; 48170 } 48171} 48172class Oids extends XFAObject { 48173 constructor(attributes) { 48174 super(TEMPLATE_NS_ID, "oids", true); 48175 this.id = attributes.id || ""; 48176 this.type = getStringOption(attributes.type, ["optional", "required"]); 48177 this.use = attributes.use || ""; 48178 this.usehref = attributes.usehref || ""; 48179 this.oid = new XFAObjectArray(); 48180 } 48181} 48182class Overflow extends XFAObject { 48183 constructor(attributes) { 48184 super(TEMPLATE_NS_ID, "overflow"); 48185 this.id = attributes.id || ""; 48186 this.leader = attributes.leader || ""; 48187 this.target = attributes.target || ""; 48188 this.trailer = attributes.trailer || ""; 48189 this.use = attributes.use || ""; 48190 this.usehref = attributes.usehref || ""; 48191 } 48192 [$getExtra]() { 48193 if (!this[$extra]) { 48194 const parent = this[$getParent](); 48195 const root = this[$getTemplateRoot](); 48196 const target = root[$searchNode](this.target, parent); 48197 const leader = root[$searchNode](this.leader, parent); 48198 const trailer = root[$searchNode](this.trailer, parent); 48199 this[$extra] = { 48200 target: target?.[0] || null, 48201 leader: leader?.[0] || null, 48202 trailer: trailer?.[0] || null, 48203 addLeader: false, 48204 addTrailer: false 48205 }; 48206 } 48207 return this[$extra]; 48208 } 48209} 48210class PageArea extends XFAObject { 48211 constructor(attributes) { 48212 super(TEMPLATE_NS_ID, "pageArea", true); 48213 this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]); 48214 this.id = attributes.id || ""; 48215 this.initialNumber = getInteger({ 48216 data: attributes.initialNumber, 48217 defaultValue: 1, 48218 validate: x => true 48219 }); 48220 this.name = attributes.name || ""; 48221 this.numbered = getInteger({ 48222 data: attributes.numbered, 48223 defaultValue: 1, 48224 validate: x => true 48225 }); 48226 this.oddOrEven = getStringOption(attributes.oddOrEven, ["any", "even", "odd"]); 48227 this.pagePosition = getStringOption(attributes.pagePosition, ["any", "first", "last", "only", "rest"]); 48228 this.relevant = getRelevant(attributes.relevant); 48229 this.use = attributes.use || ""; 48230 this.usehref = attributes.usehref || ""; 48231 this.desc = null; 48232 this.extras = null; 48233 this.medium = null; 48234 this.occur = null; 48235 this.area = new XFAObjectArray(); 48236 this.contentArea = new XFAObjectArray(); 48237 this.draw = new XFAObjectArray(); 48238 this.exclGroup = new XFAObjectArray(); 48239 this.field = new XFAObjectArray(); 48240 this.subform = new XFAObjectArray(); 48241 } 48242 [$isUsable]() { 48243 if (!this[$extra]) { 48244 this[$extra] = { 48245 numberOfUse: 0 48246 }; 48247 return true; 48248 } 48249 return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; 48250 } 48251 [$cleanPage]() { 48252 delete this[$extra]; 48253 } 48254 [$getNextPage]() { 48255 if (!this[$extra]) { 48256 this[$extra] = { 48257 numberOfUse: 0 48258 }; 48259 } 48260 const parent = this[$getParent](); 48261 if (parent.relation === "orderedOccurrence") { 48262 if (this[$isUsable]()) { 48263 this[$extra].numberOfUse += 1; 48264 return this; 48265 } 48266 } 48267 return parent[$getNextPage](); 48268 } 48269 [$getAvailableSpace]() { 48270 return this[$extra].space || { 48271 width: 0, 48272 height: 0 48273 }; 48274 } 48275 [$toHTML]() { 48276 if (!this[$extra]) { 48277 this[$extra] = { 48278 numberOfUse: 1 48279 }; 48280 } 48281 const children = []; 48282 this[$extra].children = children; 48283 const style = Object.create(null); 48284 if (this.medium && this.medium.short && this.medium.long) { 48285 style.width = measureToString(this.medium.short); 48286 style.height = measureToString(this.medium.long); 48287 this[$extra].space = { 48288 width: this.medium.short, 48289 height: this.medium.long 48290 }; 48291 if (this.medium.orientation === "landscape") { 48292 const x = style.width; 48293 style.width = style.height; 48294 style.height = x; 48295 this[$extra].space = { 48296 width: this.medium.long, 48297 height: this.medium.short 48298 }; 48299 } 48300 } else { 48301 warn("XFA - No medium specified in pageArea: please file a bug."); 48302 } 48303 this[$childrenToHTML]({ 48304 filter: new Set(["area", "draw", "field", "subform"]), 48305 include: true 48306 }); 48307 this[$childrenToHTML]({ 48308 filter: new Set(["contentArea"]), 48309 include: true 48310 }); 48311 return HTMLResult.success({ 48312 name: "div", 48313 children, 48314 attributes: { 48315 class: ["xfaPage"], 48316 id: this[$uid], 48317 style, 48318 xfaName: this.name 48319 } 48320 }); 48321 } 48322} 48323class PageSet extends XFAObject { 48324 constructor(attributes) { 48325 super(TEMPLATE_NS_ID, "pageSet", true); 48326 this.duplexImposition = getStringOption(attributes.duplexImposition, ["longEdge", "shortEdge"]); 48327 this.id = attributes.id || ""; 48328 this.name = attributes.name || ""; 48329 this.relation = getStringOption(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]); 48330 this.relevant = getRelevant(attributes.relevant); 48331 this.use = attributes.use || ""; 48332 this.usehref = attributes.usehref || ""; 48333 this.extras = null; 48334 this.occur = null; 48335 this.pageArea = new XFAObjectArray(); 48336 this.pageSet = new XFAObjectArray(); 48337 } 48338 [$cleanPage]() { 48339 for (const page of this.pageArea.children) { 48340 page[$cleanPage](); 48341 } 48342 for (const page of this.pageSet.children) { 48343 page[$cleanPage](); 48344 } 48345 } 48346 [$isUsable]() { 48347 return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; 48348 } 48349 [$getNextPage]() { 48350 if (!this[$extra]) { 48351 this[$extra] = { 48352 numberOfUse: 1, 48353 pageIndex: -1, 48354 pageSetIndex: -1 48355 }; 48356 } 48357 if (this.relation === "orderedOccurrence") { 48358 if (this[$extra].pageIndex + 1 < this.pageArea.children.length) { 48359 this[$extra].pageIndex += 1; 48360 const pageArea = this.pageArea.children[this[$extra].pageIndex]; 48361 return pageArea[$getNextPage](); 48362 } 48363 if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) { 48364 this[$extra].pageSetIndex += 1; 48365 return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage](); 48366 } 48367 if (this[$isUsable]()) { 48368 this[$extra].numberOfUse += 1; 48369 this[$extra].pageIndex = -1; 48370 this[$extra].pageSetIndex = -1; 48371 return this[$getNextPage](); 48372 } 48373 const parent = this[$getParent](); 48374 if (parent instanceof PageSet) { 48375 return parent[$getNextPage](); 48376 } 48377 this[$cleanPage](); 48378 return this[$getNextPage](); 48379 } 48380 const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber; 48381 const parity = pageNumber % 2 === 0 ? "even" : "odd"; 48382 const position = pageNumber === 0 ? "first" : "rest"; 48383 let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position); 48384 if (page) { 48385 return page; 48386 } 48387 page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position); 48388 if (page) { 48389 return page; 48390 } 48391 page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any"); 48392 if (page) { 48393 return page; 48394 } 48395 return this.pageArea.children[0]; 48396 } 48397} 48398class Para extends XFAObject { 48399 constructor(attributes) { 48400 super(TEMPLATE_NS_ID, "para", true); 48401 this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); 48402 this.id = attributes.id || ""; 48403 this.lineHeight = attributes.lineHeight ? getMeasurement(attributes.lineHeight, "0pt") : ""; 48404 this.marginLeft = attributes.marginLeft ? getMeasurement(attributes.marginLeft, "0pt") : ""; 48405 this.marginRight = attributes.marginRight ? getMeasurement(attributes.marginRight, "0pt") : ""; 48406 this.orphans = getInteger({ 48407 data: attributes.orphans, 48408 defaultValue: 0, 48409 validate: x => x >= 0 48410 }); 48411 this.preserve = attributes.preserve || ""; 48412 this.radixOffset = attributes.radixOffset ? getMeasurement(attributes.radixOffset, "0pt") : ""; 48413 this.spaceAbove = attributes.spaceAbove ? getMeasurement(attributes.spaceAbove, "0pt") : ""; 48414 this.spaceBelow = attributes.spaceBelow ? getMeasurement(attributes.spaceBelow, "0pt") : ""; 48415 this.tabDefault = attributes.tabDefault ? getMeasurement(this.tabDefault) : ""; 48416 this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? getMeasurement(x) : x); 48417 this.textIndent = attributes.textIndent ? getMeasurement(attributes.textIndent, "0pt") : ""; 48418 this.use = attributes.use || ""; 48419 this.usehref = attributes.usehref || ""; 48420 this.vAlign = getStringOption(attributes.vAlign, ["top", "bottom", "middle"]); 48421 this.widows = getInteger({ 48422 data: attributes.widows, 48423 defaultValue: 0, 48424 validate: x => x >= 0 48425 }); 48426 this.hyphenation = null; 48427 } 48428 [$toStyle]() { 48429 const style = toStyle(this, "hAlign"); 48430 if (this.marginLeft !== "") { 48431 style.paddingLeft = measureToString(this.marginLeft); 48432 } 48433 if (this.marginRight !== "") { 48434 style.paddingRight = measureToString(this.marginRight); 48435 } 48436 if (this.spaceAbove !== "") { 48437 style.paddingTop = measureToString(this.spaceAbove); 48438 } 48439 if (this.spaceBelow !== "") { 48440 style.paddingBottom = measureToString(this.spaceBelow); 48441 } 48442 if (this.textIndent !== "") { 48443 style.textIndent = measureToString(this.textIndent); 48444 fixTextIndent(style); 48445 } 48446 if (this.lineHeight > 0) { 48447 style.lineHeight = measureToString(this.lineHeight); 48448 } 48449 if (this.tabDefault !== "") { 48450 style.tabSize = measureToString(this.tabDefault); 48451 } 48452 if (this.tabStops.length > 0) {} 48453 if (this.hyphenatation) { 48454 Object.assign(style, this.hyphenatation[$toStyle]()); 48455 } 48456 return style; 48457 } 48458} 48459class PasswordEdit extends XFAObject { 48460 constructor(attributes) { 48461 super(TEMPLATE_NS_ID, "passwordEdit", true); 48462 this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); 48463 this.id = attributes.id || ""; 48464 this.passwordChar = attributes.passwordChar || "*"; 48465 this.use = attributes.use || ""; 48466 this.usehref = attributes.usehref || ""; 48467 this.border = null; 48468 this.extras = null; 48469 this.margin = null; 48470 } 48471} 48472class template_Pattern extends XFAObject { 48473 constructor(attributes) { 48474 super(TEMPLATE_NS_ID, "pattern", true); 48475 this.id = attributes.id || ""; 48476 this.type = getStringOption(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]); 48477 this.use = attributes.use || ""; 48478 this.usehref = attributes.usehref || ""; 48479 this.color = null; 48480 this.extras = null; 48481 } 48482 [$toStyle](startColor) { 48483 startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; 48484 const endColor = this.color ? this.color[$toStyle]() : "#000000"; 48485 const width = 5; 48486 const cmd = "repeating-linear-gradient"; 48487 const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`; 48488 switch (this.type) { 48489 case "crossHatch": 48490 return `${cmd}
48490(to top,${colors}) ${cmd}(to right,${colors})`; 48491 case "crossDiagonal": 48492 return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`; 48493 case "diagonalLeft": 48494 return `${cmd}(45deg,${colors})`; 48495 case "diagonalRight": 48496 return `${cmd}(-45deg,${colors})`; 48497 case "horizontal": 48498 return `${cmd}(to top,${colors})`; 48499 case "vertical": 48500 return `${cmd}(to right,${colors})`; 48501 } 48502 return ""; 48503 } 48504} 48505class Picture extends StringObject { 48506 constructor(attributes) { 48507 super(TEMPLATE_NS_ID, "picture"); 48508 this.id = attributes.id || ""; 48509 this.use = attributes.use || ""; 48510 this.usehref = attributes.usehref || ""; 48511 } 48512} 48513class Proto extends XFAObject { 48514 constructor(attributes) { 48515 super(TEMPLATE_NS_ID, "proto", true); 48516 this.appearanceFilter = new XFAObjectArray(); 48517 this.arc = new XFAObjectArray(); 48518 this.area = new XFAObjectArray(); 48519 this.assist = new XFAObjectArray(); 48520 this.barcode = new XFAObjectArray(); 48521 this.bindItems = new XFAObjectArray(); 48522 this.bookend = new XFAObjectArray(); 48523 this.boolean = new XFAObjectArray(); 48524 this.border = new XFAObjectArray(); 48525 this.break = new XFAObjectArray(); 48526 this.breakAfter = new XFAObjectArray(); 48527 this.breakBefore = new XFAObjectArray(); 48528 this.button = new XFAObjectArray(); 48529 this.calculate = new XFAObjectArray(); 48530 this.caption = new XFAObjectArray(); 48531 this.certificate = new XFAObjectArray(); 48532 this.certificates = new XFAObjectArray(); 48533 this.checkButton = new XFAObjectArray(); 48534 this.choiceList = new XFAObjectArray(); 48535 this.color = new XFAObjectArray(); 48536 this.comb = new XFAObjectArray(); 48537 this.connect = new XFAObjectArray(); 48538 this.contentArea = new XFAObjectArray(); 48539 this.corner = new XFAObjectArray(); 48540 this.date = new XFAObjectArray(); 48541 this.dateTime = new XFAObjectArray(); 48542 this.dateTimeEdit = new XFAObjectArray(); 48543 this.decimal = new XFAObjectArray(); 48544 this.defaultUi = new XFAObjectArray(); 48545 this.desc = new XFAObjectArray(); 48546 this.digestMethod = new XFAObjectArray(); 48547 this.digestMethods = new XFAObjectArray(); 48548 this.draw = new XFAObjectArray(); 48549 this.edge = new XFAObjectArray(); 48550 this.encoding = new XFAObjectArray(); 48551 this.encodings = new XFAObjectArray(); 48552 this.encrypt = new XFAObjectArray(); 48553 this.encryptData = new XFAObjectArray(); 48554 this.encryption = new XFAObjectArray(); 48555 this.encryptionMethod = new XFAObjectArray(); 48556 this.encryptionMethods = new XFAObjectArray(); 48557 this.event = new XFAObjectArray(); 48558 this.exData = new XFAObjectArray(); 48559 this.exObject = new XFAObjectArray(); 48560 this.exclGroup = new XFAObjectArray(); 48561 this.execute = new XFAObjectArray(); 48562 this.extras = new XFAObjectArray(); 48563 this.field = new XFAObjectArray(); 48564 this.fill = new XFAObjectArray(); 48565 this.filter = new XFAObjectArray(); 48566 this.float = new XFAObjectArray(); 48567 this.font = new XFAObjectArray(); 48568 this.format = new XFAObjectArray(); 48569 this.handler = new XFAObjectArray(); 48570 this.hyphenation = new XFAObjectArray(); 48571 this.image = new XFAObjectArray(); 48572 this.imageEdit = new XFAObjectArray(); 48573 this.integer = new XFAObjectArray(); 48574 this.issuers = new XFAObjectArray(); 48575 this.items = new XFAObjectArray(); 48576 this.keep = new XFAObjectArray(); 48577 this.keyUsage = new XFAObjectArray(); 48578 this.line = new XFAObjectArray(); 48579 this.linear = new XFAObjectArray(); 48580 this.lockDocument = new XFAObjectArray(); 48581 this.manifest = new XFAObjectArray(); 48582 this.margin = new XFAObjectArray(); 48583 this.mdp = new XFAObjectArray(); 48584 this.medium = new XFAObjectArray(); 48585 this.message = new XFAObjectArray(); 48586 this.numericEdit = new XFAObjectArray(); 48587 this.occur = new XFAObjectArray(); 48588 this.oid = new XFAObjectArray(); 48589 this.oids = new XFAObjectArray(); 48590 this.overflow = new XFAObjectArray(); 48591 this.pageArea = new XFAObjectArray(); 48592 this.pageSet = new XFAObjectArray(); 48593 this.para = new XFAObjectArray(); 48594 this.passwordEdit = new XFAObjectArray(); 48595 this.pattern = new XFAObjectArray(); 48596 this.picture = new XFAObjectArray(); 48597 this.radial = new XFAObjectArray(); 48598 this.reason = new XFAObjectArray(); 48599 this.reasons = new XFAObjectArray(); 48600 this.rectangle = new XFAObjectArray(); 48601 this.ref = new XFAObjectArray(); 48602 this.script = new XFAObjectArray(); 48603 this.setProperty = new XFAObjectArray(); 48604 this.signData = new XFAObjectArray(); 48605 this.signature = new XFAObjectArray(); 48606 this.signing = new XFAObjectArray(); 48607 this.solid = new XFAObjectArray(); 48608 this.speak = new XFAObjectArray(); 48609 this.stipple = new XFAObjectArray(); 48610 this.subform = new XFAObjectArray(); 48611 this.subformSet = new XFAObjectArray(); 48612 this.subjectDN = new XFAObjectArray(); 48613 this.subjectDNs = new XFAObjectArray(); 48614 this.submit = new XFAObjectArray(); 48615 this.text = new XFAObjectArray(); 48616 this.textEdit = new XFAObjectArray(); 48617 this.time = new XFAObjectArray(); 48618 this.timeStamp = new XFAObjectArray(); 48619 this.toolTip = new XFAObjectArray(); 48620 this.traversal = new XFAObjectArray(); 48621 this.traverse = new XFAObjectArray(); 48622 this.ui = new XFAObjectArray(); 48623 this.validate = new XFAObjectArray(); 48624 this.value = new XFAObjectArray(); 48625 this.variables = new XFAObjectArray(); 48626 } 48627} 48628class Radial extends XFAObject { 48629 constructor(attributes) { 48630 super(TEMPLATE_NS_ID, "radial", true); 48631 this.id = attributes.id || ""; 48632 this.type = getStringOption(attributes.type, ["toEdge", "toCenter"]); 48633 this.use = attributes.use || ""; 48634 this.usehref = attributes.usehref || ""; 48635 this.color = null; 48636 this.extras = null; 48637 } 48638 [$toStyle](startColor) { 48639 startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; 48640 const endColor = this.color ? this.color[$toStyle]() : "#000000"; 48641 const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`; 48642 return `radial-gradient(circle at center, ${colors})`; 48643 } 48644} 48645class Reason extends StringObject { 48646 constructor(attributes) { 48647 super(TEMPLATE_NS_ID, "reason"); 48648 this.id = attributes.id || ""; 48649 this.name = attributes.name || ""; 48650 this.use = attributes.use || ""; 48651 this.usehref = attributes.usehref || ""; 48652 } 48653} 48654class Reasons extends XFAObject { 48655 constructor(attributes) { 48656 super(TEMPLATE_NS_ID, "reasons", true); 48657 this.id = attributes.id || ""; 48658 this.type = getStringOption(attributes.type, ["optional", "required"]); 48659 this.use = attributes.use || ""; 48660 this.usehref = attributes.usehref || ""; 48661 this.reason = new XFAObjectArray(); 48662 } 48663} 48664class Rectangle extends XFAObject { 48665 constructor(attributes) { 48666 super(TEMPLATE_NS_ID, "rectangle", true); 48667 this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); 48668 this.id = attributes.id || ""; 48669 this.use = attributes.use || ""; 48670 this.usehref = attributes.usehref || ""; 48671 this.corner = new XFAObjectArray(4); 48672 this.edge = new XFAObjectArray(4); 48673 this.fill = null; 48674 } 48675 [$toHTML]() { 48676 const edge = this.edge.children.length ? this.edge.children[0] : new Edge({}); 48677 const edgeStyle = edge[$toStyle](); 48678 const style = Object.create(null); 48679 if (this.fill?.presence === "visible") { 48680 Object.assign(style, this.fill[$toStyle]()); 48681 } else { 48682 style.fill = "transparent";
vendor: 29,310 bytes, lines 48683-49666
48683 } 48684 style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); 48685 style.stroke = edgeStyle.color; 48686 const corner = this.corner.children.length ? this.corner.children[0] : new Corner({}); 48687 const cornerStyle = corner[$toStyle](); 48688 const rect = { 48689 name: "rect", 48690 attributes: { 48691 xmlns: SVG_NS, 48692 width: "100%", 48693 height: "100%", 48694 x: 0, 48695 y: 0, 48696 rx: cornerStyle.radius, 48697 ry: cornerStyle.radius, 48698 style 48699 } 48700 }; 48701 const svg = { 48702 name: "svg", 48703 children: [rect], 48704 attributes: { 48705 xmlns: SVG_NS, 48706 style: { 48707 overflow: "visible" 48708 }, 48709 width: "100%", 48710 height: "100%" 48711 } 48712 }; 48713 const parent = this[$getParent]()[$getParent](); 48714 if (hasMargin(parent)) { 48715 return HTMLResult.success({ 48716 name: "div", 48717 attributes: { 48718 style: { 48719 display: "inline", 48720 width: "100%", 48721 height: "100%" 48722 } 48723 }, 48724 children: [svg] 48725 }); 48726 } 48727 svg.attributes.style.position = "absolute"; 48728 return HTMLResult.success(svg); 48729 } 48730} 48731class RefElement extends StringObject { 48732 constructor(attributes) { 48733 super(TEMPLATE_NS_ID, "ref"); 48734 this.id = attributes.id || ""; 48735 this.use = attributes.use || ""; 48736 this.usehref = attributes.usehref || ""; 48737 } 48738} 48739class Script extends StringObject { 48740 constructor(attributes) { 48741 super(TEMPLATE_NS_ID, "script"); 48742 this.binding = attributes.binding || ""; 48743 this.contentType = attributes.contentType || ""; 48744 this.id = attributes.id || ""; 48745 this.name = attributes.name || ""; 48746 this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); 48747 this.use = attributes.use || ""; 48748 this.usehref = attributes.usehref || ""; 48749 } 48750} 48751class SetProperty extends XFAObject { 48752 constructor(attributes) { 48753 super(TEMPLATE_NS_ID, "setProperty"); 48754 this.connection = attributes.connection || ""; 48755 this.ref = attributes.ref || ""; 48756 this.target = attributes.target || ""; 48757 } 48758} 48759class SignData extends XFAObject { 48760 constructor(attributes) { 48761 super(TEMPLATE_NS_ID, "signData", true); 48762 this.id = attributes.id || ""; 48763 this.operation = getStringOption(attributes.operation, ["sign", "clear", "verify"]); 48764 this.ref = attributes.ref || ""; 48765 this.target = attributes.target || ""; 48766 this.use = attributes.use || ""; 48767 this.usehref = attributes.usehref || ""; 48768 this.filter = null; 48769 this.manifest = null; 48770 } 48771} 48772class Signature extends XFAObject { 48773 constructor(attributes) { 48774 super(TEMPLATE_NS_ID, "signature", true); 48775 this.id = attributes.id || ""; 48776 this.type = getStringOption(attributes.type, ["PDF1.3", "PDF1.6"]); 48777 this.use = attributes.use || ""; 48778 this.usehref = attributes.usehref || ""; 48779 this.border = null; 48780 this.extras = null; 48781 this.filter = null; 48782 this.manifest = null; 48783 this.margin = null; 48784 } 48785} 48786class Signing extends XFAObject { 48787 constructor(attributes) { 48788 super(TEMPLATE_NS_ID, "signing", true); 48789 this.id = attributes.id || ""; 48790 this.type = getStringOption(attributes.type, ["optional", "required"]); 48791 this.use = attributes.use || ""; 48792 this.usehref = attributes.usehref || ""; 48793 this.certificate = new XFAObjectArray(); 48794 } 48795} 48796class Solid extends XFAObject { 48797 constructor(attributes) { 48798 super(TEMPLATE_NS_ID, "solid", true); 48799 this.id = attributes.id || ""; 48800 this.use = attributes.use || ""; 48801 this.usehref = attributes.usehref || ""; 48802 this.extras = null; 48803 } 48804 [$toStyle](startColor) { 48805 return startColor ? startColor[$toStyle]() : "#FFFFFF"; 48806 } 48807} 48808class Speak extends StringObject { 48809 constructor(attributes) { 48810 super(TEMPLATE_NS_ID, "speak"); 48811 this.disable = getInteger({ 48812 data: attributes.disable, 48813 defaultValue: 0, 48814 validate: x => x === 1 48815 }); 48816 this.id = attributes.id || ""; 48817 this.priority = getStringOption(attributes.priority, ["custom", "caption", "name", "toolTip"]); 48818 this.rid = attributes.rid || ""; 48819 this.use = attributes.use || ""; 48820 this.usehref = attributes.usehref || ""; 48821 } 48822} 48823class Stipple extends XFAObject { 48824 constructor(attributes) { 48825 super(TEMPLATE_NS_ID, "stipple", true); 48826 this.id = attributes.id || ""; 48827 this.rate = getInteger({ 48828 data: attributes.rate, 48829 defaultValue: 50, 48830 validate: x => x >= 0 && x <= 100 48831 }); 48832 this.use = attributes.use || ""; 48833 this.usehref = attributes.usehref || ""; 48834 this.color = null; 48835 this.extras = null; 48836 } 48837 [$toStyle](bgColor) { 48838 const alpha = this.rate / 100; 48839 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)); 48840 } 48841} 48842class Subform extends XFAObject { 48843 constructor(attributes) { 48844 super(TEMPLATE_NS_ID, "subform", true); 48845 this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); 48846 this.allowMacro = getInteger({ 48847 data: attributes.allowMacro, 48848 defaultValue: 0, 48849 validate: x => x === 1 48850 }); 48851 this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); 48852 this.colSpan = getInteger({ 48853 data: attributes.colSpan, 48854 defaultValue: 1, 48855 validate: n => n >= 1 || n === -1 48856 }); 48857 this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : getMeasurement(x)); 48858 this.h = attributes.h ? getMeasurement(attributes.h) : ""; 48859 this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); 48860 this.id = attributes.id || ""; 48861 this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); 48862 this.locale = attributes.locale || ""; 48863 this.maxH = getMeasurement(attributes.maxH, "0pt"); 48864 this.maxW = getMeasurement(attributes.maxW, "0pt"); 48865 this.mergeMode = getStringOption(attributes.mergeMode, ["consumeData", "matchTemplate"]); 48866 this.minH = getMeasurement(attributes.minH, "0pt"); 48867 this.minW = getMeasurement(attributes.minW, "0pt"); 48868 this.name = attributes.name || ""; 48869 this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); 48870 this.relevant = getRelevant(attributes.relevant); 48871 this.restoreState = getStringOption(attributes.restoreState, ["manual", "auto"]); 48872 this.scope = getStringOption(attributes.scope, ["name", "none"]); 48873 this.use = attributes.use || ""; 48874 this.usehref = attributes.usehref || ""; 48875 this.w = attributes.w ? getMeasurement(attributes.w) : ""; 48876 this.x = getMeasurement(attributes.x, "0pt"); 48877 this.y = getMeasurement(attributes.y, "0pt"); 48878 this.assist = null; 48879 this.bind = null; 48880 this.bookend = null; 48881 this.border = null; 48882 this.break = null; 48883 this.calculate = null; 48884 this.desc = null; 48885 this.extras = null; 48886 this.keep = null; 48887 this.margin = null; 48888 this.occur = null; 48889 this.overflow = null; 48890 this.pageSet = null; 48891 this.para = null; 48892 this.traversal = null; 48893 this.validate = null; 48894 this.variables = null; 48895 this.area = new XFAObjectArray(); 48896 this.breakAfter = new XFAObjectArray(); 48897 this.breakBefore = new XFAObjectArray(); 48898 this.connect = new XFAObjectArray(); 48899 this.draw = new XFAObjectArray(); 48900 this.event = new XFAObjectArray(); 48901 this.exObject = new XFAObjectArray(); 48902 this.exclGroup = new XFAObjectArray(); 48903 this.field = new XFAObjectArray(); 48904 this.proto = new XFAObjectArray(); 48905 this.setProperty = new XFAObjectArray(); 48906 this.subform = new XFAObjectArray(); 48907 this.subformSet = new XFAObjectArray(); 48908 } 48909 [$getSubformParent]() { 48910 const parent = this[$getParent](); 48911 if (parent instanceof SubformSet) { 48912 return parent[$getSubformParent](); 48913 } 48914 return parent; 48915 } 48916 [$isBindable]() { 48917 return true; 48918 } 48919 [$isThereMoreWidth]() { 48920 return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); 48921 } 48922 *[$getContainedChildren]() { 48923 yield* getContainedChildren(this); 48924 } 48925 [$flushHTML]() { 48926 return flushHTML(this); 48927 } 48928 [$addHTML](html, bbox) { 48929 addHTML(this, html, bbox); 48930 } 48931 [$getAvailableSpace]() { 48932 return getAvailableSpace(this); 48933 } 48934 [$isSplittable]() { 48935 const parent = this[$getSubformParent](); 48936 if (!parent[$isSplittable]()) { 48937 return false; 48938 } 48939 if (this[$extra]._isSplittable !== undefined) { 48940 return this[$extra]._isSplittable; 48941 } 48942 if (this.layout === "position" || this.layout.includes("row")) { 48943 this[$extra]._isSplittable = false; 48944 return false; 48945 } 48946 if (this.keep && this.keep.intact !== "none") { 48947 this[$extra]._isSplittable = false; 48948 return false; 48949 } 48950 if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { 48951 return false; 48952 } 48953 this[$extra]._isSplittable = true; 48954 return true; 48955 } 48956 [$toHTML](availableSpace) { 48957 setTabIndex(this); 48958 if (this.break) { 48959 if (this.break.after !== "auto" || this.break.afterTarget !== "") { 48960 const node = new BreakAfter({ 48961 targetType: this.break.after, 48962 target: this.break.afterTarget, 48963 startNew: this.break.startNew.toString() 48964 }); 48965 node[$globalData] = this[$globalData]; 48966 this[$appendChild](node); 48967 this.breakAfter.push(node); 48968 } 48969 if (this.break.before !== "auto" || this.break.beforeTarget !== "") { 48970 const node = new BreakBefore({ 48971 targetType: this.break.before, 48972 target: this.break.beforeTarget, 48973 startNew: this.break.startNew.toString() 48974 }); 48975 node[$globalData] = this[$globalData]; 48976 this[$appendChild](node); 48977 this.breakBefore.push(node); 48978 } 48979 if (this.break.overflowTarget !== "") { 48980 const node = new Overflow({ 48981 target: this.break.overflowTarget, 48982 leader: this.break.overflowLeader, 48983 trailer: this.break.overflowTrailer 48984 }); 48985 node[$globalData] = this[$globalData]; 48986 this[$appendChild](node); 48987 this.overflow.push(node); 48988 } 48989 this[$removeChild](this.break); 48990 this.break = null; 48991 } 48992 if (this.presence === "hidden" || this.presence === "inactive") { 48993 return HTMLResult.EMPTY; 48994 } 48995 if (this.breakBefore.children.length > 1 || this.breakAfter.children.length > 1) { 48996 warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug."); 48997 } 48998 if (this.breakBefore.children.length >= 1) { 48999 const breakBefore = this.breakBefore.children[0]; 49000 if (handleBreak(breakBefore)) { 49001 return HTMLResult.breakNode(breakBefore); 49002 } 49003 } 49004 if (this[$extra]?.afterBreakAfter) { 49005 return HTMLResult.EMPTY; 49006 } 49007 fixDimensions(this); 49008 const children = []; 49009 const attributes = { 49010 id: this[$uid], 49011 class: [] 49012 }; 49013 setAccess(this, attributes.class); 49014 if (!this[$extra]) { 49015 this[$extra] = Object.create(null); 49016 } 49017 Object.assign(this[$extra], { 49018 children, 49019 line: null, 49020 attributes, 49021 attempt: 0, 49022 numberInLine: 0, 49023 availableSpace: { 49024 width: Math.min(this.w || Infinity, availableSpace.width), 49025 height: Math.min(this.h || Infinity, availableSpace.height) 49026 }, 49027 width: 0, 49028 height: 0, 49029 prevHeight: 0, 49030 currentWidth: 0 49031 }); 49032 const root = this[$getTemplateRoot](); 49033 const savedNoLayoutFailure = root[$extra].noLayoutFailure; 49034 const isSplittable = this[$isSplittable](); 49035 if (!isSplittable) { 49036 setFirstUnsplittable(this); 49037 } 49038 if (!checkDimensions(this, availableSpace)) { 49039 return HTMLResult.FAILURE; 49040 } 49041 const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]); 49042 if (this.layout.includes("row")) { 49043 const columnWidths = this[$getSubformParent]().columnWidths; 49044 if (Array.isArray(columnWidths) && columnWidths.length > 0) { 49045 this[$extra].columnWidths = columnWidths; 49046 this[$extra].currentColumn = 0; 49047 } 49048 } 49049 const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); 49050 const classNames = ["xfaSubform"]; 49051 const cl = layoutClass(this); 49052 if (cl) { 49053 classNames.push(cl); 49054 } 49055 attributes.style = style; 49056 attributes.class = classNames; 49057 if (this.name) { 49058 attributes.xfaName = this.name; 49059 } 49060 if (this.overflow) { 49061 const overflowExtra = this.overflow[$getExtra](); 49062 if (overflowExtra.addLeader) { 49063 overflowExtra.addLeader = false; 49064 handleOverflow(this, overflowExtra.leader, availableSpace); 49065 } 49066 } 49067 this[$pushPara](); 49068 const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; 49069 const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; 49070 for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { 49071 if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { 49072 this[$extra].numberInLine = 0; 49073 } 49074 const result = this[$childrenToHTML]({ 49075 filter, 49076 include: true 49077 }); 49078 if (result.success) { 49079 break; 49080 } 49081 if (result.isBreak()) { 49082 this[$popPara](); 49083 return result; 49084 } 49085 if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !root[$extra].noLayoutFailure) { 49086 this[$extra].attempt = maxRun; 49087 break; 49088 } 49089 } 49090 this[$popPara](); 49091 if (!isSplittable) { 49092 unsetFirstUnsplittable(this); 49093 } 49094 root[$extra].noLayoutFailure = savedNoLayoutFailure; 49095 if (this[$extra].attempt === maxRun) { 49096 if (this.overflow) { 49097 this[$getTemplateRoot]()[$extra].overflowNode = this.overflow; 49098 } 49099 if (!isSplittable) { 49100 delete this[$extra]; 49101 } 49102 return HTMLResult.FAILURE; 49103 } 49104 if (this.overflow) { 49105 const overflowExtra = this.overflow[$getExtra](); 49106 if (overflowExtra.addTrailer) { 49107 overflowExtra.addTrailer = false; 49108 handleOverflow(this, overflowExtra.trailer, availableSpace); 49109 } 49110 } 49111 let marginH = 0; 49112 let marginV = 0; 49113 if (this.margin) { 49114 marginH = this.margin.leftInset + this.margin.rightInset; 49115 marginV = this.margin.topInset + this.margin.bottomInset; 49116 } 49117 const width = Math.max(this[$extra].width + marginH, this.w || 0); 49118 const height = Math.max(this[$extra].height + marginV, this.h || 0); 49119 const bbox = [this.x, this.y, width, height]; 49120 if (this.w === "") { 49121 style.width = measureToString(width); 49122 } 49123 if (this.h === "") { 49124 style.height = measureToString(height); 49125 } 49126 if ((style.width === "0px" || style.height === "0px") && children.length === 0) { 49127 return HTMLResult.EMPTY; 49128 } 49129 const html = { 49130 name: "div", 49131 attributes, 49132 children 49133 }; 49134 applyAssist(this, attributes); 49135 const result = HTMLResult.success(createWrapper(this, html), bbox); 49136 if (this.breakAfter.children.length >= 1) { 49137 const breakAfter = this.breakAfter.children[0]; 49138 if (handleBreak(breakAfter)) { 49139 this[$extra].afterBreakAfter = result; 49140 return HTMLResult.breakNode(breakAfter); 49141 } 49142 } 49143 delete this[$extra]; 49144 return result; 49145 } 49146} 49147class SubformSet extends XFAObject { 49148 constructor(attributes) { 49149 super(TEMPLATE_NS_ID, "subformSet", true); 49150 this.id = attributes.id || ""; 49151 this.name = attributes.name || ""; 49152 this.relation = getStringOption(attributes.relation, ["ordered", "choice", "unordered"]); 49153 this.relevant = getRelevant(attributes.relevant); 49154 this.use = attributes.use || ""; 49155 this.usehref = attributes.usehref || ""; 49156 this.bookend = null; 49157 this.break = null; 49158 this.desc = null; 49159 this.extras = null; 49160 this.occur = null; 49161 this.overflow = null; 49162 this.breakAfter = new XFAObjectArray(); 49163 this.breakBefore = new XFAObjectArray(); 49164 this.subform = new XFAObjectArray(); 49165 this.subformSet = new XFAObjectArray(); 49166 } 49167 *[$getContainedChildren]() { 49168 yield* getContainedChildren(this); 49169 } 49170 [$getSubformParent]() { 49171 let parent = this[$getParent](); 49172 while (!(parent instanceof Subform)) { 49173 parent = parent[$getParent](); 49174 } 49175 return parent; 49176 } 49177 [$isBindable]() { 49178 return true; 49179 } 49180} 49181class SubjectDN extends ContentObject { 49182 constructor(attributes) { 49183 super(TEMPLATE_NS_ID, "subjectDN"); 49184 this.delimiter = attributes.delimiter || ","; 49185 this.id = attributes.id || ""; 49186 this.name = attributes.name || ""; 49187 this.use = attributes.use || ""; 49188 this.usehref = attributes.usehref || ""; 49189 } 49190 [$finalize]() { 49191 this[$content] = new Map(this[$content].split(this.delimiter).map(kv => { 49192 kv = kv.split("=", 2); 49193 kv[0] = kv[0].trim(); 49194 return kv; 49195 })); 49196 } 49197} 49198class SubjectDNs extends XFAObject { 49199 constructor(attributes) { 49200 super(TEMPLATE_NS_ID, "subjectDNs", true); 49201 this.id = attributes.id || ""; 49202 this.type = getStringOption(attributes.type, ["optional", "required"]); 49203 this.use = attributes.use || ""; 49204 this.usehref = attributes.usehref || ""; 49205 this.subjectDN = new XFAObjectArray(); 49206 } 49207} 49208class Submit extends XFAObject { 49209 constructor(attributes) { 49210 super(TEMPLATE_NS_ID, "submit", true); 49211 this.embedPDF = getInteger({ 49212 data: attributes.embedPDF, 49213 defaultValue: 0, 49214 validate: x => x === 1 49215 }); 49216 this.format = getStringOption(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]); 49217 this.id = attributes.id || ""; 49218 this.target = attributes.target || ""; 49219 this.textEncoding = getKeyword({ 49220 data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "", 49221 defaultValue: "", 49222 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}/) 49223 }); 49224 this.use = attributes.use || ""; 49225 this.usehref = attributes.usehref || ""; 49226 this.xdpContent = attributes.xdpContent || ""; 49227 this.encrypt = null; 49228 this.encryptData = new XFAObjectArray(); 49229 this.signData = new XFAObjectArray(); 49230 } 49231} 49232class Template extends XFAObject { 49233 constructor(attributes) { 49234 super(TEMPLATE_NS_ID, "template", true); 49235 this.baseProfile = getStringOption(attributes.baseProfile, ["full", "interactiveForms"]); 49236 this.extras = null; 49237 this.subform = new XFAObjectArray(); 49238 } 49239 [$finalize]() { 49240 if (this.subform.children.length === 0) { 49241 warn("XFA - No subforms in template node."); 49242 } 49243 if (this.subform.children.length >= 2) { 49244 warn("XFA - Several subforms in template node: please file a bug."); 49245 } 49246 this[$tabIndex] = DEFAULT_TAB_INDEX; 49247 } 49248 [$isSplittable]() { 49249 return true; 49250 } 49251 [$searchNode](expr, container) { 49252 if (expr.startsWith("#")) { 49253 return [this[$ids].get(expr.slice(1))]; 49254 } 49255 return searchNode(this, container, expr, true, true); 49256 } 49257 *[$toPages]() { 49258 if (!this.subform.children.length) { 49259 return HTMLResult.success({ 49260 name: "div", 49261 children: [] 49262 }); 49263 } 49264 this[$extra] = { 49265 overflowNode: null, 49266 firstUnsplittable: null, 49267 currentContentArea: null, 49268 currentPageArea: null, 49269 noLayoutFailure: false, 49270 pageNumber: 1, 49271 pagePosition: "first", 49272 oddOrEven: "odd", 49273 blankOrNotBlank: "nonBlank", 49274 paraStack: [] 49275 }; 49276 const root = this.subform.children[0]; 49277 root.pageSet[$cleanPage](); 49278 const pageAreas = root.pageSet.pageArea.children; 49279 const mainHtml = { 49280 name: "div", 49281 children: [] 49282 }; 49283 let pageArea = null; 49284 let breakBefore = null; 49285 let breakBeforeTarget = null; 49286 if (root.breakBefore.children.length >= 1) { 49287 breakBefore = root.breakBefore.children[0]; 49288 breakBeforeTarget = breakBefore.target; 49289 } else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) { 49290 breakBefore = root.subform.children[0].breakBefore.children[0]; 49291 breakBeforeTarget = breakBefore.target; 49292 } else if (root.break?.beforeTarget) { 49293 breakBefore = root.break; 49294 breakBeforeTarget = breakBefore.beforeTarget; 49295 } else if (root.subform.children.length >= 1 && root.subform.children[0].break?.beforeTarget) { 49296 breakBefore = root.subform.children[0].break; 49297 breakBeforeTarget = breakBefore.beforeTarget; 49298 } 49299 if (breakBefore) { 49300 const target = this[$searchNode](breakBeforeTarget, breakBefore[$getParent]()); 49301 if (target instanceof PageArea) { 49302 pageArea = target; 49303 breakBefore[$extra] = {}; 49304 } 49305 } 49306 if (!pageArea) { 49307 pageArea = pageAreas[0]; 49308 } 49309 pageArea[$extra] = { 49310 numberOfUse: 1 49311 }; 49312 const pageAreaParent = pageArea[$getParent](); 49313 pageAreaParent[$extra] = { 49314 numberOfUse: 1, 49315 pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea), 49316 pageSetIndex: 0 49317 }; 49318 let targetPageArea; 49319 let leader = null; 49320 let trailer = null; 49321 let hasSomething = true; 49322 let hasSomethingCounter = 0; 49323 let startIndex = 0; 49324 while (true) { 49325 if (!hasSomething) { 49326 mainHtml.children.pop(); 49327 if (++hasSomethingCounter === MAX_EMPTY_PAGES) { 49328 warn("XFA - Something goes wrong: please file a bug."); 49329 return mainHtml; 49330 } 49331 } else { 49332 hasSomethingCounter = 0; 49333 } 49334 targetPageArea = null; 49335 this[$extra].currentPageArea = pageArea; 49336 const page = pageArea[$toHTML]().html; 49337 mainHtml.children.push(page); 49338 if (leader) { 49339 this[$extra].noLayoutFailure = true; 49340 page.children.push(leader[$toHTML](pageArea[$extra].space).html); 49341 leader = null; 49342 } 49343 if (trailer) { 49344 this[$extra].noLayoutFailure = true; 49345 page.children.push(trailer[$toHTML](pageArea[$extra].space).html); 49346 trailer = null; 49347 } 49348 const contentAreas = pageArea.contentArea.children; 49349 const htmlContentAreas = page.children.filter(node => node.attributes.class.includes("xfaContentarea")); 49350 hasSomething = false; 49351 this[$extra].firstUnsplittable = null; 49352 this[$extra].noLayoutFailure = false; 49353 const flush = index => { 49354 const html = root[$flushHTML](); 49355 if (html) { 49356 hasSomething ||= html.children?.length > 0; 49357 htmlContentAreas[index].children.push(html); 49358 } 49359 }; 49360 for (let i = startIndex, ii = contentAreas.length; i < ii; i++) { 49361 const contentArea = this[$extra].currentContentArea = contentAreas[i]; 49362 const space = { 49363 width: contentArea.w, 49364 height: contentArea.h 49365 }; 49366 startIndex = 0; 49367 if (leader) { 49368 htmlContentAreas[i].children.push(leader[$toHTML](space).html); 49369 leader = null; 49370 } 49371 if (trailer) { 49372 htmlContentAreas[i].children.push(trailer[$toHTML](space).html); 49373 trailer = null; 49374 } 49375 const html = root[$toHTML](space); 49376 if (html.success) { 49377 if (html.html) { 49378 hasSomething ||= html.html.children?.length > 0; 49379 htmlContentAreas[i].children.push(html.html); 49380 } else if (!hasSomething && mainHtml.children.length > 1) { 49381 mainHtml.children.pop(); 49382 } 49383 return mainHtml; 49384 } 49385 if (html.isBreak()) { 49386 const node = html.breakNode; 49387 flush(i); 49388 if (node.targetType === "auto") { 49389 continue; 49390 } 49391 if (node.leader) { 49392 leader = this[$searchNode](node.leader, node[$getParent]()); 49393 leader = leader ? leader[0] : null; 49394 } 49395 if (node.trailer) { 49396 trailer = this[$searchNode](node.trailer, node[$getParent]()); 49397 trailer = trailer ? trailer[0] : null; 49398 } 49399 if (node.targetType === "pageArea") { 49400 targetPageArea = node[$extra].target; 49401 i = Infinity; 49402 } else if (!node[$extra].target) { 49403 i = node[$extra].index; 49404 } else { 49405 targetPageArea = node[$extra].target; 49406 startIndex = node[$extra].index + 1; 49407 i = Infinity; 49408 } 49409 continue; 49410 } 49411 if (this[$extra].overflowNode) { 49412 const node = this[$extra].overflowNode; 49413 this[$extra].overflowNode = null; 49414 const overflowExtra = node[$getExtra](); 49415 const target = overflowExtra.target; 49416 overflowExtra.addLeader = overflowExtra.leader !== null; 49417 overflowExtra.addTrailer = overflowExtra.trailer !== null; 49418 flush(i); 49419 const currentIndex = i; 49420 i = Infinity; 49421 if (target instanceof PageArea) { 49422 targetPageArea = target; 49423 } else if (target instanceof ContentArea) { 49424 const index = contentAreas.indexOf(target); 49425 if (index !== -1) { 49426 if (index > currentIndex) { 49427 i = index - 1; 49428 } else { 49429 startIndex = index; 49430 } 49431 } else { 49432 targetPageArea = target[$getParent](); 49433 startIndex = targetPageArea.contentArea.children.indexOf(target); 49434 } 49435 } 49436 continue; 49437 } 49438 flush(i); 49439 } 49440 this[$extra].pageNumber += 1; 49441 if (targetPageArea) { 49442 if (targetPageArea[$isUsable]()) { 49443 targetPageArea[$extra].numberOfUse += 1; 49444 } else { 49445 targetPageArea = null; 49446 } 49447 } 49448 pageArea = targetPageArea || pageArea[$getNextPage](); 49449 yield null; 49450 } 49451 } 49452} 49453class Text extends ContentObject { 49454 constructor(attributes) { 49455 super(TEMPLATE_NS_ID, "text"); 49456 this.id = attributes.id || ""; 49457 this.maxChars = getInteger({ 49458 data: attributes.maxChars, 49459 defaultValue: 0, 49460 validate: x => x >= 0 49461 }); 49462 this.name = attributes.name || ""; 49463 this.rid = attributes.rid || ""; 49464 this.use = attributes.use || ""; 49465 this.usehref = attributes.usehref || ""; 49466 } 49467 [$acceptWhitespace]() { 49468 return true; 49469 } 49470 [$onChild](child) { 49471 if (child[$namespaceId] === NamespaceIds.xhtml.id) { 49472 this[$content] = child; 49473 return true; 49474 } 49475 warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`); 49476 return false; 49477 } 49478 [$onText](str) { 49479 if (this[$content] instanceof XFAObject) { 49480 return; 49481 } 49482 super[$onText](str); 49483 } 49484 [$finalize]() { 49485 if (typeof this[$content] === "string") { 49486 this[$content] = this[$content].replaceAll("\r\n", "\n"); 49487 } 49488 } 49489 [$getExtra]() { 49490 if (typeof this[$content] === "string") { 49491 return this[$content].split(/[\u2029\u2028\n]/).reduce((acc, line) => { 49492 if (line) { 49493 acc.push(line); 49494 } 49495 return acc; 49496 }, []).join("\n"); 49497 } 49498 return this[$content][$text](); 49499 } 49500 [$toHTML](availableSpace) { 49501 if (typeof this[$content] === "string") { 49502 const html = valueToHtml(this[$content]).html; 49503 if (this[$content].includes("\u2029")) { 49504 html.name = "div"; 49505 html.children = []; 49506 this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).reduce((acc, line) => { 49507 acc.push({ 49508 name: "span", 49509 value: line 49510 }, { 49511 name: "br" 49512 }); 49513 return acc; 49514 }, [])).forEach(lines => { 49515 html.children.push({ 49516 name: "p", 49517 children: lines 49518 }); 49519 }); 49520 } else if (/[\u2028\n]/.test(this[$content])) { 49521 html.name = "div"; 49522 html.children = []; 49523 this[$content].split(/[\u2028\n]/).forEach(line => { 49524 html.children.push({ 49525 name: "span", 49526 value: line 49527 }, { 49528 name: "br" 49529 }); 49530 }); 49531 } 49532 return HTMLResult.success(html); 49533 } 49534 return this[$content][$toHTML](availableSpace); 49535 } 49536} 49537class TextEdit extends XFAObject { 49538 constructor(attributes) { 49539 super(TEMPLATE_NS_ID, "textEdit", true); 49540 this.allowRichText = getInteger({ 49541 data: attributes.allowRichText, 49542 defaultValue: 0, 49543 validate: x => x === 1 49544 }); 49545 this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); 49546 this.id = attributes.id || ""; 49547 this.multiLine = getInteger({ 49548 data: attributes.multiLine, 49549 defaultValue: "", 49550 validate: x => x === 0 || x === 1 49551 }); 49552 this.use = attributes.use || ""; 49553 this.usehref = attributes.usehref || ""; 49554 this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, ["auto", "off", "on"]); 49555 this.border = null; 49556 this.comb = null; 49557 this.extras = null; 49558 this.margin = null; 49559 } 49560 [$toHTML](availableSpace) { 49561 const style = toStyle(this, "border", "font", "margin"); 49562 let html; 49563 const field = this[$getParent]()[$getParent](); 49564 if (this.multiLine === "") { 49565 this.multiLine = field instanceof Draw ? 1 : 0; 49566 } 49567 if (this.multiLine === 1) { 49568 html = { 49569 name: "textarea", 49570 attributes: { 49571 dataId: field[$data]?.[$uid] || field[$uid], 49572 fieldId: field[$uid], 49573 class: ["xfaTextfield"], 49574 style, 49575 "aria-label": ariaLabel(field), 49576 "aria-required": false 49577 } 49578 }; 49579 } else { 49580 html = { 49581 name: "input", 49582 attributes: { 49583 type: "text", 49584 dataId: field[$data]?.[$uid] || field[$uid], 49585 fieldId: field[$uid], 49586 class: ["xfaTextfield"], 49587 style, 49588 "aria-label": ariaLabel(field), 49589 "aria-required": false 49590 } 49591 }; 49592 } 49593 if (isRequired(field)) { 49594 html.attributes["aria-required"] = true; 49595 html.attributes.required = true; 49596 } 49597 return HTMLResult.success({ 49598 name: "label", 49599 attributes: { 49600 class: ["xfaLabel"] 49601 }, 49602 children: [html] 49603 }); 49604 } 49605} 49606class Time extends StringObject { 49607 constructor(attributes) { 49608 super(TEMPLATE_NS_ID, "time"); 49609 this.id = attributes.id || ""; 49610 this.name = attributes.name || ""; 49611 this.use = attributes.use || ""; 49612 this.usehref = attributes.usehref || ""; 49613 } 49614 [$finalize]() { 49615 const date = this[$content].trim(); 49616 this[$content] = date ? new Date(date) : null; 49617 } 49618 [$toHTML](availableSpace) { 49619 return valueToHtml(this[$content] ? this[$content].toString() : ""); 49620 } 49621} 49622class TimeStamp extends XFAObject { 49623 constructor(attributes) { 49624 super(TEMPLATE_NS_ID, "timeStamp"); 49625 this.id = attributes.id || ""; 49626 this.server = attributes.server || ""; 49627 this.type = getStringOption(attributes.type, ["optional", "required"]); 49628 this.use = attributes.use || ""; 49629 this.usehref = attributes.usehref || ""; 49630 } 49631} 49632class ToolTip extends StringObject { 49633 constructor(attributes) { 49634 super(TEMPLATE_NS_ID, "toolTip"); 49635 this.id = attributes.id || ""; 49636 this.rid = attributes.rid || ""; 49637 this.use = attributes.use || ""; 49638 this.usehref = attributes.usehref || ""; 49639 } 49640} 49641class Traversal extends XFAObject { 49642 constructor(attributes) { 49643 super(TEMPLATE_NS_ID, "traversal", true); 49644 this.id = attributes.id || ""; 49645 this.use = attributes.use || ""; 49646 this.usehref = attributes.usehref || ""; 49647 this.extras = null; 49648 this.traverse = new XFAObjectArray(); 49649 } 49650} 49651class Traverse extends XFAObject { 49652 constructor(attributes) { 49653 super(TEMPLATE_NS_ID, "traverse", true); 49654 this.id = attributes.id || ""; 49655 this.operation = getStringOption(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]); 49656 this.ref = attributes.ref || ""; 49657 this.use = attributes.use || ""; 49658 this.usehref = attributes.usehref || ""; 49659 this.extras = null; 49660 this.script = null; 49661 } 49662 get name() { 49663 return this.operation; 49664 } 49665 [$isTransparent]() { 49666 return false;
vendor: 18,386 bytes, lines 49667-50446
49667 } 49668} 49669class Ui extends XFAObject { 49670 constructor(attributes) { 49671 super(TEMPLATE_NS_ID, "ui", true); 49672 this.id = attributes.id || ""; 49673 this.use = attributes.use || ""; 49674 this.usehref = attributes.usehref || ""; 49675 this.extras = null; 49676 this.picture = null; 49677 this.barcode = null; 49678 this.button = null; 49679 this.checkButton = null; 49680 this.choiceList = null; 49681 this.dateTimeEdit = null; 49682 this.defaultUi = null; 49683 this.imageEdit = null; 49684 this.numericEdit = null; 49685 this.passwordEdit = null; 49686 this.signature = null; 49687 this.textEdit = null; 49688 } 49689 [$getExtra]() { 49690 if (this[$extra] === undefined) { 49691 for (const name of Object.getOwnPropertyNames(this)) { 49692 if (name === "extras" || name === "picture") { 49693 continue; 49694 } 49695 const obj = this[name]; 49696 if (!(obj instanceof XFAObject)) { 49697 continue; 49698 } 49699 this[$extra] = obj; 49700 return obj; 49701 } 49702 this[$extra] = null; 49703 } 49704 return this[$extra]; 49705 } 49706 [$toHTML](availableSpace) { 49707 const obj = this[$getExtra](); 49708 if (obj) { 49709 return obj[$toHTML](availableSpace); 49710 } 49711 return HTMLResult.EMPTY; 49712 } 49713} 49714class Validate extends XFAObject { 49715 constructor(attributes) { 49716 super(TEMPLATE_NS_ID, "validate", true); 49717 this.formatTest = getStringOption(attributes.formatTest, ["warning", "disabled", "error"]); 49718 this.id = attributes.id || ""; 49719 this.nullTest = getStringOption(attributes.nullTest, ["disabled", "error", "warning"]); 49720 this.scriptTest = getStringOption(attributes.scriptTest, ["error", "disabled", "warning"]); 49721 this.use = attributes.use || ""; 49722 this.usehref = attributes.usehref || ""; 49723 this.extras = null; 49724 this.message = null; 49725 this.picture = null; 49726 this.script = null; 49727 } 49728} 49729class Value extends XFAObject { 49730 constructor(attributes) { 49731 super(TEMPLATE_NS_ID, "value", true); 49732 this.id = attributes.id || ""; 49733 this.override = getInteger({ 49734 data: attributes.override, 49735 defaultValue: 0, 49736 validate: x => x === 1 49737 }); 49738 this.relevant = getRelevant(attributes.relevant); 49739 this.use = attributes.use || ""; 49740 this.usehref = attributes.usehref || ""; 49741 this.arc = null; 49742 this.boolean = null; 49743 this.date = null; 49744 this.dateTime = null; 49745 this.decimal = null; 49746 this.exData = null; 49747 this.float = null; 49748 this.image = null; 49749 this.integer = null; 49750 this.line = null; 49751 this.rectangle = null; 49752 this.text = null; 49753 this.time = null; 49754 } 49755 [$setValue](value) { 49756 const parent = this[$getParent](); 49757 if (parent instanceof Field) { 49758 if (parent.ui?.imageEdit) { 49759 if (!this.image) { 49760 this.image = new Image({}); 49761 this[$appendChild](this.image); 49762 } 49763 this.image[$content] = value[$content]; 49764 return; 49765 } 49766 } 49767 const valueName = value[$nodeName]; 49768 if (this[valueName] !== null) { 49769 this[valueName][$content] = value[$content]; 49770 return; 49771 } 49772 for (const name of Object.getOwnPropertyNames(this)) { 49773 const obj = this[name]; 49774 if (obj instanceof XFAObject) { 49775 this[name] = null; 49776 this[$removeChild](obj); 49777 } 49778 } 49779 this[value[$nodeName]] = value; 49780 this[$appendChild](value); 49781 } 49782 [$text]() { 49783 if (this.exData) { 49784 if (typeof this.exData[$content] === "string") { 49785 return this.exData[$content].trim(); 49786 } 49787 return this.exData[$content][$text]().trim(); 49788 } 49789 for (const name of Object.getOwnPropertyNames(this)) { 49790 if (name === "image") { 49791 continue; 49792 } 49793 const obj = this[name]; 49794 if (obj instanceof XFAObject) { 49795 return (obj[$content] || "").toString().trim(); 49796 } 49797 } 49798 return null; 49799 } 49800 [$toHTML](availableSpace) { 49801 for (const name of Object.getOwnPropertyNames(this)) { 49802 const obj = this[name]; 49803 if (!(obj instanceof XFAObject)) { 49804 continue; 49805 } 49806 return obj[$toHTML](availableSpace); 49807 } 49808 return HTMLResult.EMPTY; 49809 } 49810} 49811class Variables extends XFAObject { 49812 constructor(attributes) { 49813 super(TEMPLATE_NS_ID, "variables", true); 49814 this.id = attributes.id || ""; 49815 this.use = attributes.use || ""; 49816 this.usehref = attributes.usehref || ""; 49817 this.boolean = new XFAObjectArray(); 49818 this.date = new XFAObjectArray(); 49819 this.dateTime = new XFAObjectArray(); 49820 this.decimal = new XFAObjectArray(); 49821 this.exData = new XFAObjectArray(); 49822 this.float = new XFAObjectArray(); 49823 this.image = new XFAObjectArray(); 49824 this.integer = new XFAObjectArray(); 49825 this.manifest = new XFAObjectArray(); 49826 this.script = new XFAObjectArray(); 49827 this.text = new XFAObjectArray(); 49828 this.time = new XFAObjectArray(); 49829 } 49830 [$isTransparent]() { 49831 return true; 49832 } 49833} 49834class TemplateNamespace { 49835 static [$buildXFAObject](name, attributes) { 49836 if (TemplateNamespace.hasOwnProperty(name)) { 49837 const node = TemplateNamespace[name](attributes); 49838 node[$setSetAttributes](attributes); 49839 return node; 49840 } 49841 return undefined; 49842 } 49843 static appearanceFilter(attrs) { 49844 return new AppearanceFilter(attrs); 49845 } 49846 static arc(attrs) { 49847 return new Arc(attrs); 49848 } 49849 static area(attrs) { 49850 return new Area(attrs); 49851 } 49852 static assist(attrs) { 49853 return new Assist(attrs); 49854 } 49855 static barcode(attrs) { 49856 return new Barcode(attrs); 49857 } 49858 static bind(attrs) { 49859 return new Bind(attrs); 49860 } 49861 static bindItems(attrs) { 49862 return new BindItems(attrs); 49863 } 49864 static bookend(attrs) { 49865 return new Bookend(attrs); 49866 } 49867 static boolean(attrs) { 49868 return new BooleanElement(attrs); 49869 } 49870 static border(attrs) { 49871 return new Border(attrs); 49872 } 49873 static break(attrs) { 49874 return new Break(attrs); 49875 } 49876 static breakAfter(attrs) { 49877 return new BreakAfter(attrs); 49878 } 49879 static breakBefore(attrs) { 49880 return new BreakBefore(attrs); 49881 } 49882 static button(attrs) { 49883 return new Button(attrs); 49884 } 49885 static calculate(attrs) { 49886 return new Calculate(attrs); 49887 } 49888 static caption(attrs) { 49889 return new Caption(attrs); 49890 } 49891 static certificate(attrs) { 49892 return new Certificate(attrs); 49893 } 49894 static certificates(attrs) { 49895 return new Certificates(attrs); 49896 } 49897 static checkButton(attrs) { 49898 return new CheckButton(attrs); 49899 } 49900 static choiceList(attrs) { 49901 return new ChoiceList(attrs); 49902 } 49903 static color(attrs) { 49904 return new Color(attrs); 49905 } 49906 static comb(attrs) { 49907 return new Comb(attrs); 49908 } 49909 static connect(attrs) { 49910 return new Connect(attrs); 49911 } 49912 static contentArea(attrs) { 49913 return new ContentArea(attrs); 49914 } 49915 static corner(attrs) { 49916 return new Corner(attrs); 49917 } 49918 static date(attrs) { 49919 return new DateElement(attrs); 49920 } 49921 static dateTime(attrs) { 49922 return new DateTime(attrs); 49923 } 49924 static dateTimeEdit(attrs) { 49925 return new DateTimeEdit(attrs); 49926 } 49927 static decimal(attrs) { 49928 return new Decimal(attrs); 49929 } 49930 static defaultUi(attrs) { 49931 return new DefaultUi(attrs); 49932 } 49933 static desc(attrs) { 49934 return new Desc(attrs); 49935 } 49936 static digestMethod(attrs) { 49937 return new DigestMethod(attrs); 49938 } 49939 static digestMethods(attrs) { 49940 return new DigestMethods(attrs); 49941 } 49942 static draw(attrs) { 49943 return new Draw(attrs); 49944 } 49945 static edge(attrs) { 49946 return new Edge(attrs); 49947 } 49948 static encoding(attrs) { 49949 return new Encoding(attrs); 49950 } 49951 static encodings(attrs) { 49952 return new Encodings(attrs); 49953 } 49954 static encrypt(attrs) { 49955 return new Encrypt(attrs); 49956 } 49957 static encryptData(attrs) { 49958 return new EncryptData(attrs); 49959 } 49960 static encryption(attrs) { 49961 return new Encryption(attrs); 49962 } 49963 static encryptionMethod(attrs) { 49964 return new EncryptionMethod(attrs); 49965 } 49966 static encryptionMethods(attrs) { 49967 return new EncryptionMethods(attrs); 49968 } 49969 static event(attrs) { 49970 return new Event(attrs); 49971 } 49972 static exData(attrs) { 49973 return new ExData(attrs); 49974 } 49975 static exObject(attrs) { 49976 return new ExObject(attrs); 49977 } 49978 static exclGroup(attrs) { 49979 return new ExclGroup(attrs); 49980 } 49981 static execute(attrs) { 49982 return new Execute(attrs); 49983 } 49984 static extras(attrs) { 49985 return new Extras(attrs); 49986 } 49987 static field(attrs) { 49988 return new Field(attrs); 49989 } 49990 static fill(attrs) { 49991 return new Fill(attrs); 49992 } 49993 static filter(attrs) { 49994 return new Filter(attrs); 49995 } 49996 static float(attrs) { 49997 return new Float(attrs); 49998 } 49999 static font(attrs) { 50000 return new template_Font(attrs); 50001 } 50002 static format(attrs) { 50003 return new Format(attrs); 50004 } 50005 static handler(attrs) { 50006 return new Handler(attrs); 50007 } 50008 static hyphenation(attrs) { 50009 return new Hyphenation(attrs); 50010 } 50011 static image(attrs) { 50012 return new Image(attrs); 50013 } 50014 static imageEdit(attrs) { 50015 return new ImageEdit(attrs); 50016 } 50017 static integer(attrs) { 50018 return new Integer(attrs); 50019 } 50020 static issuers(attrs) { 50021 return new Issuers(attrs); 50022 } 50023 static items(attrs) { 50024 return new Items(attrs); 50025 } 50026 static keep(attrs) { 50027 return new Keep(attrs); 50028 } 50029 static keyUsage(attrs) { 50030 return new KeyUsage(attrs); 50031 } 50032 static line(attrs) { 50033 return new Line(attrs); 50034 } 50035 static linear(attrs) { 50036 return new Linear(attrs); 50037 } 50038 static lockDocument(attrs) { 50039 return new LockDocument(attrs); 50040 } 50041 static manifest(attrs) { 50042 return new Manifest(attrs); 50043 } 50044 static margin(attrs) { 50045 return new Margin(attrs); 50046 } 50047 static mdp(attrs) { 50048 return new Mdp(attrs); 50049 } 50050 static medium(attrs) { 50051 return new Medium(attrs); 50052 } 50053 static message(attrs) { 50054 return new Message(attrs); 50055 } 50056 static numericEdit(attrs) { 50057 return new NumericEdit(attrs); 50058 } 50059 static occur(attrs) { 50060 return new Occur(attrs); 50061 } 50062 static oid(attrs) { 50063 return new Oid(attrs); 50064 } 50065 static oids(attrs) { 50066 return new Oids(attrs); 50067 } 50068 static overflow(attrs) { 50069 return new Overflow(attrs); 50070 } 50071 static pageArea(attrs) { 50072 return new PageArea(attrs); 50073 } 50074 static pageSet(attrs) { 50075 return new PageSet(attrs); 50076 } 50077 static para(attrs) { 50078 return new Para(attrs); 50079 } 50080 static passwordEdit(attrs) { 50081 return new PasswordEdit(attrs); 50082 } 50083 static pattern(attrs) { 50084 return new template_Pattern(attrs); 50085 } 50086 static picture(attrs) { 50087 return new Picture(attrs); 50088 } 50089 static proto(attrs) { 50090 return new Proto(attrs); 50091 } 50092 static radial(attrs) { 50093 return new Radial(attrs); 50094 } 50095 static reason(attrs) { 50096 return new Reason(attrs); 50097 } 50098 static reasons(attrs) { 50099 return new Reasons(attrs); 50100 } 50101 static rectangle(attrs) { 50102 return new Rectangle(attrs); 50103 } 50104 static ref(attrs) { 50105 return new RefElement(attrs); 50106 } 50107 static script(attrs) { 50108 return new Script(attrs); 50109 } 50110 static setProperty(attrs) { 50111 return new SetProperty(attrs); 50112 } 50113 static signData(attrs) { 50114 return new SignData(attrs); 50115 } 50116 static signature(attrs) { 50117 return new Signature(attrs); 50118 } 50119 static signing(attrs) { 50120 return new Signing(attrs); 50121 } 50122 static solid(attrs) { 50123 return new Solid(attrs); 50124 } 50125 static speak(attrs) { 50126 return new Speak(attrs); 50127 } 50128 static stipple(attrs) { 50129 return new Stipple(attrs); 50130 } 50131 static subform(attrs) { 50132 return new Subform(attrs); 50133 } 50134 static subformSet(attrs) { 50135 return new SubformSet(attrs); 50136 } 50137 static subjectDN(attrs) { 50138 return new SubjectDN(attrs); 50139 } 50140 static subjectDNs(attrs) { 50141 return new SubjectDNs(attrs); 50142 } 50143 static submit(attrs) { 50144 return new Submit(attrs); 50145 } 50146 static template(attrs) { 50147 return new Template(attrs); 50148 } 50149 static text(attrs) { 50150 return new Text(attrs); 50151 } 50152 static textEdit(attrs) { 50153 return new TextEdit(attrs); 50154 } 50155 static time(attrs) { 50156 return new Time(attrs); 50157 } 50158 static timeStamp(attrs) { 50159 return new TimeStamp(attrs); 50160 } 50161 static toolTip(attrs) { 50162 return new ToolTip(attrs); 50163 } 50164 static traversal(attrs) { 50165 return new Traversal(attrs); 50166 } 50167 static traverse(attrs) { 50168 return new Traverse(attrs); 50169 } 50170 static ui(attrs) { 50171 return new Ui(attrs); 50172 } 50173 static validate(attrs) { 50174 return new Validate(attrs); 50175 } 50176 static value(attrs) { 50177 return new Value(attrs); 50178 } 50179 static variables(attrs) { 50180 return new Variables(attrs); 50181 } 50182} 50183 50184;// ./src/core/xfa/bind.js 50185 50186 50187 50188 50189 50190 50191 50192 50193 50194 50195 50196const bind_NS_DATASETS = NamespaceIds.datasets.id; 50197function createText(content) { 50198 const node = new Text({}); 50199 node[$content] = content; 50200 return node; 50201} 50202class Binder { 50203 constructor(root) { 50204 this.root = root; 50205 this.datasets = root.datasets; 50206 this.data = root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, "data"); 50207 this.emptyMerge = this.data[$getChildren]().length === 0; 50208 this.root.form = this.form = root.template[$clone](); 50209 } 50210 _isConsumeData() { 50211 return !this.emptyMerge && this._mergeMode; 50212 } 50213 _isMatchTemplate() { 50214 return !this._isConsumeData(); 50215 } 50216 bind() { 50217 this._bindElement(this.form, this.data); 50218 return this.form; 50219 } 50220 getData() { 50221 return this.data; 50222 } 50223 _bindValue(formNode, data, picture) { 50224 formNode[$data] = data; 50225 if (formNode[$hasSettableValue]()) { 50226 if (data[$isDataValue]()) { 50227 const value = data[$getDataValue](); 50228 formNode[$setValue](createText(value)); 50229 } else if (formNode instanceof Field && formNode.ui?.choiceList?.open === "multiSelect") { 50230 const value = data[$getChildren]().map(child => child[$content].trim()).join("\n"); 50231 formNode[$setValue](createText(value)); 50232 } else if (this._isConsumeData()) { 50233 warn(`XFA - Nodes haven't the same type.`); 50234 } 50235 } else if (!data[$isDataValue]() || this._isMatchTemplate()) { 50236 this._bindElement(formNode, data); 50237 } else { 50238 warn(`XFA - Nodes haven't the same type.`); 50239 } 50240 } 50241 _findDataByNameToConsume(name, isValue, dataNode, global) { 50242 if (!name) { 50243 return null; 50244 } 50245 let generator, match; 50246 for (let i = 0; i < 3; i++) { 50247 generator = dataNode[$getRealChildrenByNameIt](name, false, true); 50248 while (true) { 50249 match = generator.next().value; 50250 if (!match) { 50251 break; 50252 } 50253 if (isValue === match[$isDataValue]()) { 50254 return match; 50255 } 50256 } 50257 if (dataNode[$namespaceId] === NamespaceIds.datasets.id && dataNode[$nodeName] === "data") { 50258 break; 50259 } 50260 dataNode = dataNode[$getParent](); 50261 } 50262 if (!global) { 50263 return null; 50264 } 50265 generator = this.data[$getRealChildrenByNameIt](name, true, false); 50266 match = generator.next().value; 50267 if (match) { 50268 return match; 50269 } 50270 generator = this.data[$getAttributeIt](name, true); 50271 match = generator.next().value; 50272 if (match?.[$isDataValue]()) { 50273 return match; 50274 } 50275 return null; 50276 } 50277 _setProperties(formNode, dataNode) { 50278 if (!formNode.hasOwnProperty("setProperty")) { 50279 return; 50280 } 50281 for (const { 50282 ref, 50283 target, 50284 connection 50285 } of formNode.setProperty.children) { 50286 if (connection) { 50287 continue; 50288 } 50289 if (!ref) { 50290 continue; 50291 } 50292 const nodes = searchNode(this.root, dataNode, ref, false, false); 50293 if (!nodes) { 50294 warn(`XFA - Invalid reference: ${ref}.`); 50295 continue; 50296 } 50297 const [node] = nodes; 50298 if (!node[$isDescendent](this.data)) { 50299 warn(`XFA - Invalid node: must be a data node.`); 50300 continue; 50301 } 50302 const targetNodes = searchNode(this.root, formNode, target, false, false); 50303 if (!targetNodes) { 50304 warn(`XFA - Invalid target: ${target}.`); 50305 continue; 50306 } 50307 const [targetNode] = targetNodes; 50308 if (!targetNode[$isDescendent](formNode)) { 50309 warn(`XFA - Invalid target: must be a property or subproperty.`); 50310 continue; 50311 } 50312 const targetParent = targetNode[$getParent](); 50313 if (targetNode instanceof SetProperty || targetParent instanceof SetProperty) { 50314 warn(`XFA - Invalid target: cannot be a setProperty or one of its properties.`); 50315 continue; 50316 } 50317 if (targetNode instanceof BindItems || targetParent instanceof BindItems) { 50318 warn(`XFA - Invalid target: cannot be a bindItems or one of its properties.`); 50319 continue; 50320 } 50321 const content = node[$text](); 50322 const name = targetNode[$nodeName]; 50323 if (targetNode instanceof XFAAttribute) { 50324 const attrs = Object.create(null); 50325 attrs[name] = content; 50326 const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]); 50327 targetParent[name] = obj[name]; 50328 continue; 50329 } 50330 if (!targetNode.hasOwnProperty($content)) { 50331 warn(`XFA - Invalid node to use in setProperty`); 50332 continue; 50333 } 50334 targetNode[$data] = node; 50335 targetNode[$content] = content; 50336 targetNode[$finalize](); 50337 } 50338 } 50339 _bindItems(formNode, dataNode) { 50340 if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || formNode.bindItems.isEmpty()) { 50341 return; 50342 } 50343 for (const item of formNode.items.children) { 50344 formNode[$removeChild](item); 50345 } 50346 formNode.items.clear(); 50347 const labels = new Items({}); 50348 const values = new Items({}); 50349 formNode[$appendChild](labels); 50350 formNode.items.push(labels); 50351 formNode[$appendChild](values); 50352 formNode.items.push(values); 50353 for (const { 50354 ref, 50355 labelRef, 50356 valueRef, 50357 connection 50358 } of formNode.bindItems.children) { 50359 if (connection) { 50360 continue; 50361 } 50362 if (!ref) { 50363 continue; 50364 } 50365 const nodes = searchNode(this.root, dataNode, ref, false, false); 50366 if (!nodes) { 50367 warn(`XFA - Invalid reference: ${ref}.`); 50368 continue; 50369 } 50370 for (const node of nodes) { 50371 if (!node[$isDescendent](this.datasets)) { 50372 warn(`XFA - Invalid ref (${ref}): must be a datasets child.`); 50373 continue; 50374 } 50375 const labelNodes = searchNode(this.root, node, labelRef, true, false); 50376 if (!labelNodes) { 50377 warn(`XFA - Invalid label: ${labelRef}.`); 50378 continue; 50379 } 50380 const [labelNode] = labelNodes; 50381 if (!labelNode[$isDescendent](this.datasets)) { 50382 warn(`XFA - Invalid label: must be a datasets child.`); 50383 continue; 50384 } 50385 const valueNodes = searchNode(this.root, node, valueRef, true, false); 50386 if (!valueNodes) { 50387 warn(`XFA - Invalid value: ${valueRef}.`); 50388 continue; 50389 } 50390 const [valueNode] = valueNodes; 50391 if (!valueNode[$isDescendent](this.datasets)) { 50392 warn(`XFA - Invalid value: must be a datasets child.`); 50393 continue; 50394 } 50395 const label = createText(labelNode[$text]()); 50396 const value = createText(valueNode[$text]()); 50397 labels[$appendChild](label); 50398 labels.text.push(label); 50399 values[$appendChild](value); 50400 values.text.push(value); 50401 } 50402 } 50403 } 50404 _bindOccurrences(formNode, matches, picture) { 50405 let baseClone; 50406 if (matches.length > 1) { 50407 baseClone = formNode[$clone](); 50408 baseClone[$removeChild](baseClone.occur); 50409 baseClone.occur = null; 50410 } 50411 this._bindValue(formNode, matches[0], picture); 50412 this._setProperties(formNode, matches[0]); 50413 this._bindItems(formNode, matches[0]); 50414 if (matches.length === 1) { 50415 return; 50416 } 50417 const parent = formNode[$getParent](); 50418 const name = formNode[$nodeName]; 50419 const pos = parent[$indexOf](formNode); 50420 for (let i = 1, ii = matches.length; i < ii; i++) { 50421 const match = matches[i]; 50422 const clone = baseClone[$clone](); 50423 parent[name].push(clone); 50424 parent[$insertAt](pos + i, clone); 50425 this._bindValue(clone, match, picture); 50426 this._setProperties(clone, match); 50427 this._bindItems(clone, match); 50428 } 50429 } 50430 _createOccurrences(formNode) { 50431 if (!this.emptyMerge) { 50432 return; 50433 } 50434 const { 50435 occur 50436 } = formNode; 50437 if (!occur || occur.initial <= 1) { 50438 return; 50439 } 50440 const parent = formNode[$getParent](); 50441 const name = formNode[$nodeName]; 50442 if (!(parent[name] instanceof XFAObjectArray)) { 50443 return; 50444 } 50445 let currentNumber; 50446 if (formNode.name) {
vendor: 4,408 bytes, lines 50447-50605
50447 currentNumber = parent[name].children.filter(e => e.name === formNode.name).length; 50448 } else { 50449 currentNumber = parent[name].children.length; 50450 } 50451 const pos = parent[$indexOf](formNode) + 1; 50452 const ii = occur.initial - currentNumber; 50453 if (ii) { 50454 const nodeClone = formNode[$clone](); 50455 nodeClone[$removeChild](nodeClone.occur); 50456 nodeClone.occur = null; 50457 parent[name].push(nodeClone); 50458 parent[$insertAt](pos, nodeClone); 50459 for (let i = 1; i < ii; i++) { 50460 const clone = nodeClone[$clone](); 50461 parent[name].push(clone); 50462 parent[$insertAt](pos + i, clone); 50463 } 50464 } 50465 } 50466 _getOccurInfo(formNode) { 50467 const { 50468 name, 50469 occur 50470 } = formNode; 50471 if (!occur || !name) { 50472 return [1, 1]; 50473 } 50474 const max = occur.max === -1 ? Infinity : occur.max; 50475 return [occur.min, max]; 50476 } 50477 _setAndBind(formNode, dataNode) { 50478 this._setProperties(formNode, dataNode); 50479 this._bindItems(formNode, dataNode); 50480 this._bindElement(formNode, dataNode); 50481 } 50482 _bindElement(formNode, dataNode) { 50483 const uselessNodes = []; 50484 this._createOccurrences(formNode); 50485 for (const child of formNode[$getChildren]()) { 50486 if (child[$data]) { 50487 continue; 50488 } 50489 if (this._mergeMode === undefined && child[$nodeName] === "subform") { 50490 this._mergeMode = child.mergeMode === "consumeData"; 50491 const dataChildren = dataNode[$getChildren](); 50492 if (dataChildren.length > 0) { 50493 this._bindOccurrences(child, [dataChildren[0]], null); 50494 } else if (this.emptyMerge) { 50495 const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; 50496 const dataChild = child[$data] = new XmlObject(nsId, child.name || "root"); 50497 dataNode[$appendChild](dataChild); 50498 this._bindElement(child, dataChild); 50499 } 50500 continue; 50501 } 50502 if (!child[$isBindable]()) { 50503 continue; 50504 } 50505 let global = false; 50506 let picture = null; 50507 let ref = null; 50508 let match = null; 50509 if (child.bind) { 50510 switch (child.bind.match) { 50511 case "none": 50512 this._setAndBind(child, dataNode); 50513 continue; 50514 case "global": 50515 global = true; 50516 break; 50517 case "dataRef": 50518 if (!child.bind.ref) { 50519 warn(`XFA - ref is empty in node ${child[$nodeName]}.`); 50520 this._setAndBind(child, dataNode); 50521 continue; 50522 } 50523 ref = child.bind.ref; 50524 break; 50525 default: 50526 break; 50527 } 50528 if (child.bind.picture) { 50529 picture = child.bind.picture[$content]; 50530 } 50531 } 50532 const [min, max] = this._getOccurInfo(child); 50533 if (ref) { 50534 match = searchNode(this.root, dataNode, ref, true, false); 50535 if (match === null) { 50536 match = createDataNode(this.data, dataNode, ref); 50537 if (!match) { 50538 continue; 50539 } 50540 if (this._isConsumeData()) { 50541 match[$consumed] = true; 50542 } 50543 this._setAndBind(child, match); 50544 continue; 50545 } else { 50546 if (this._isConsumeData()) { 50547 match = match.filter(node => !node[$consumed]); 50548 } 50549 if (match.length > max) { 50550 match = match.slice(0, max); 50551 } else if (match.length === 0) { 50552 match = null; 50553 } 50554 if (match && this._isConsumeData()) { 50555 match.forEach(node => { 50556 node[$consumed] = true; 50557 }); 50558 } 50559 } 50560 } else { 50561 if (!child.name) { 50562 this._setAndBind(child, dataNode); 50563 continue; 50564 } 50565 if (this._isConsumeData()) { 50566 const matches = []; 50567 while (matches.length < max) { 50568 const found = this._findDataByNameToConsume(child.name, child[$hasSettableValue](), dataNode, global); 50569 if (!found) { 50570 break; 50571 } 50572 found[$consumed] = true; 50573 matches.push(found); 50574 } 50575 match = matches.length > 0 ? matches : null; 50576 } else { 50577 match = dataNode[$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value; 50578 if (!match) { 50579 if (min === 0) { 50580 uselessNodes.push(child); 50581 continue; 50582 } 50583 const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; 50584 match = child[$data] = new XmlObject(nsId, child.name); 50585 if (this.emptyMerge) { 50586 match[$consumed] = true; 50587 } 50588 dataNode[$appendChild](match); 50589 this._setAndBind(child, match); 50590 continue; 50591 } 50592 if (this.emptyMerge) { 50593 match[$consumed] = true; 50594 } 50595 match = [match]; 50596 } 50597 } 50598 if (match) { 50599 this._bindOccurrences(child, match, picture); 50600 } else if (min > 0) { 50601 this._setAndBind(child, dataNode); 50602 } else { 50603 uselessNodes.push(child); 50604 } 50605 }
vendor: 30,521 bytes, lines 50606-51821
50606 uselessNodes.forEach(node => node[$getParent]()[$removeChild](node)); 50607 } 50608} 50609 50610;// ./src/core/xfa/data.js 50611 50612 50613class DataHandler { 50614 constructor(root, data) { 50615 this.data = data; 50616 this.dataset = root.datasets || null; 50617 } 50618 serialize(storage) { 50619 const stack = [[-1, this.data[$getChildren]()]]; 50620 while (stack.length > 0) { 50621 const last = stack.at(-1); 50622 const [i, children] = last; 50623 if (i + 1 === children.length) { 50624 stack.pop(); 50625 continue; 50626 } 50627 const child = children[++last[0]]; 50628 const storageEntry = storage.get(child[$uid]); 50629 if (storageEntry) { 50630 child[$setValue](storageEntry); 50631 } else { 50632 const attributes = child[$getAttributes](); 50633 for (const value of attributes.values()) { 50634 const entry = storage.get(value[$uid]); 50635 if (entry) { 50636 value[$setValue](entry); 50637 break; 50638 } 50639 } 50640 } 50641 const nodes = child[$getChildren](); 50642 if (nodes.length > 0) { 50643 stack.push([-1, nodes]); 50644 } 50645 } 50646 const buf = [`<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">`]; 50647 if (this.dataset) { 50648 for (const child of this.dataset[$getChildren]()) { 50649 if (child[$nodeName] !== "data") { 50650 child[$toString](buf); 50651 } 50652 } 50653 } 50654 this.data[$toString](buf); 50655 buf.push("</xfa:datasets>"); 50656 return buf.join(""); 50657 } 50658} 50659 50660;// ./src/core/xfa/config.js 50661 50662 50663 50664 50665 50666 50667 50668 50669 50670 50671 50672const CONFIG_NS_ID = NamespaceIds.config.id; 50673class Acrobat extends XFAObject { 50674 constructor(attributes) { 50675 super(CONFIG_NS_ID, "acrobat", true); 50676 this.acrobat7 = null; 50677 this.autoSave = null; 50678 this.common = null; 50679 this.validate = null; 50680 this.validateApprovalSignatures = null; 50681 this.submitUrl = new XFAObjectArray(); 50682 } 50683} 50684class Acrobat7 extends XFAObject { 50685 constructor(attributes) { 50686 super(CONFIG_NS_ID, "acrobat7", true); 50687 this.dynamicRender = null; 50688 } 50689} 50690class ADBE_JSConsole extends OptionObject { 50691 constructor(attributes) { 50692 super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); 50693 } 50694} 50695class ADBE_JSDebugger extends OptionObject { 50696 constructor(attributes) { 50697 super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); 50698 } 50699} 50700class AddSilentPrint extends Option01 { 50701 constructor(attributes) { 50702 super(CONFIG_NS_ID, "addSilentPrint"); 50703 } 50704} 50705class AddViewerPreferences extends Option01 { 50706 constructor(attributes) { 50707 super(CONFIG_NS_ID, "addViewerPreferences"); 50708 } 50709} 50710class AdjustData extends Option10 { 50711 constructor(attributes) { 50712 super(CONFIG_NS_ID, "adjustData"); 50713 } 50714} 50715class AdobeExtensionLevel extends IntegerObject { 50716 constructor(attributes) { 50717 super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8); 50718 } 50719} 50720class Agent extends XFAObject { 50721 constructor(attributes) { 50722 super(CONFIG_NS_ID, "agent", true); 50723 this.name = attributes.name ? attributes.name.trim() : ""; 50724 this.common = new XFAObjectArray(); 50725 } 50726} 50727class AlwaysEmbed extends ContentObject { 50728 constructor(attributes) { 50729 super(CONFIG_NS_ID, "alwaysEmbed"); 50730 } 50731} 50732class Amd extends StringObject { 50733 constructor(attributes) { 50734 super(CONFIG_NS_ID, "amd"); 50735 } 50736} 50737class config_Area extends XFAObject { 50738 constructor(attributes) { 50739 super(CONFIG_NS_ID, "area"); 50740 this.level = getInteger({ 50741 data: attributes.level, 50742 defaultValue: 0, 50743 validate: n => n >= 1 && n <= 3 50744 }); 50745 this.name = getStringOption(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]); 50746 } 50747} 50748class Attributes extends OptionObject { 50749 constructor(attributes) { 50750 super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]); 50751 } 50752} 50753class AutoSave extends OptionObject { 50754 constructor(attributes) { 50755 super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]); 50756 } 50757} 50758class Base extends StringObject { 50759 constructor(attributes) { 50760 super(CONFIG_NS_ID, "base"); 50761 } 50762} 50763class BatchOutput extends XFAObject { 50764 constructor(attributes) { 50765 super(CONFIG_NS_ID, "batchOutput"); 50766 this.format = getStringOption(attributes.format, ["none", "concat", "zip", "zipCompress"]); 50767 } 50768} 50769class BehaviorOverride extends ContentObject { 50770 constructor(attributes) { 50771 super(CONFIG_NS_ID, "behaviorOverride"); 50772 } 50773 [$finalize]() { 50774 this[$content] = new Map(this[$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2))); 50775 } 50776} 50777class Cache extends XFAObject { 50778 constructor(attributes) { 50779 super(CONFIG_NS_ID, "cache", true); 50780 this.templateCache = null; 50781 } 50782} 50783class Change extends Option01 { 50784 constructor(attributes) { 50785 super(CONFIG_NS_ID, "change"); 50786 } 50787} 50788class Common extends XFAObject { 50789 constructor(attributes) { 50790 super(CONFIG_NS_ID, "common", true); 50791 this.data = null; 50792 this.locale = null; 50793 this.localeSet = null; 50794 this.messaging = null; 50795 this.suppressBanner = null; 50796 this.template = null; 50797 this.validationMessaging = null; 50798 this.versionControl = null; 50799 this.log = new XFAObjectArray(); 50800 } 50801} 50802class Compress extends XFAObject { 50803 constructor(attributes) { 50804 super(CONFIG_NS_ID, "compress"); 50805 this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]); 50806 } 50807} 50808class CompressLogicalStructure extends Option01 { 50809 constructor(attributes) { 50810 super(CONFIG_NS_ID, "compressLogicalStructure"); 50811 } 50812} 50813class CompressObjectStream extends Option10 { 50814 constructor(attributes) { 50815 super(CONFIG_NS_ID, "compressObjectStream"); 50816 } 50817} 50818class Compression extends XFAObject { 50819 constructor(attributes) { 50820 super(CONFIG_NS_ID, "compression", true); 50821 this.compressLogicalStructure = null; 50822 this.compressObjectStream = null; 50823 this.level = null; 50824 this.type = null; 50825 } 50826} 50827class Config extends XFAObject { 50828 constructor(attributes) { 50829 super(CONFIG_NS_ID, "config", true); 50830 this.acrobat = null; 50831 this.present = null; 50832 this.trace = null; 50833 this.agent = new XFAObjectArray(); 50834 } 50835} 50836class Conformance extends OptionObject { 50837 constructor(attributes) { 50838 super(CONFIG_NS_ID, "conformance", ["A", "B"]); 50839 } 50840} 50841class ContentCopy extends Option01 { 50842 constructor(attributes) { 50843 super(CONFIG_NS_ID, "contentCopy"); 50844 } 50845} 50846class Copies extends IntegerObject { 50847 constructor(attributes) { 50848 super(CONFIG_NS_ID, "copies", 1, n => n >= 1); 50849 } 50850} 50851class Creator extends StringObject { 50852 constructor(attributes) { 50853 super(CONFIG_NS_ID, "creator"); 50854 } 50855} 50856class CurrentPage extends IntegerObject { 50857 constructor(attributes) { 50858 super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0); 50859 } 50860} 50861class Data extends XFAObject { 50862 constructor(attributes) { 50863 super(CONFIG_NS_ID, "data", true); 50864 this.adjustData = null; 50865 this.attributes = null; 50866 this.incrementalLoad = null; 50867 this.outputXSL = null; 50868 this.range = null; 50869 this.record = null; 50870 this.startNode = null; 50871 this.uri = null; 50872 this.window = null; 50873 this.xsl = null; 50874 this.excludeNS = new XFAObjectArray(); 50875 this.transform = new XFAObjectArray(); 50876 } 50877} 50878class Debug extends XFAObject { 50879 constructor(attributes) { 50880 super(CONFIG_NS_ID, "debug", true); 50881 this.uri = null; 50882 } 50883} 50884class DefaultTypeface extends ContentObject { 50885 constructor(attributes) { 50886 super(CONFIG_NS_ID, "defaultTypeface"); 50887 this.writingScript = getStringOption(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]); 50888 } 50889} 50890class Destination extends OptionObject { 50891 constructor(attributes) { 50892 super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]); 50893 } 50894} 50895class DocumentAssembly extends Option01 { 50896 constructor(attributes) { 50897 super(CONFIG_NS_ID, "documentAssembly"); 50898 } 50899} 50900class Driver extends XFAObject { 50901 constructor(attributes) { 50902 super(CONFIG_NS_ID, "driver", true); 50903 this.name = attributes.name ? attributes.name.trim() : ""; 50904 this.fontInfo = null; 50905 this.xdc = null; 50906 } 50907} 50908class DuplexOption extends OptionObject { 50909 constructor(attributes) { 50910 super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]); 50911 } 50912} 50913class DynamicRender extends OptionObject { 50914 constructor(attributes) { 50915 super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]); 50916 } 50917} 50918class Embed extends Option01 { 50919 constructor(attributes) { 50920 super(CONFIG_NS_ID, "embed"); 50921 } 50922} 50923class config_Encrypt extends Option01 { 50924 constructor(attributes) { 50925 super(CONFIG_NS_ID, "encrypt"); 50926 } 50927} 50928class config_Encryption extends XFAObject { 50929 constructor(attributes) { 50930 super(CONFIG_NS_ID, "encryption", true); 50931 this.encrypt = null; 50932 this.encryptionLevel = null; 50933 this.permissions = null; 50934 } 50935} 50936class EncryptionLevel extends OptionObject { 50937 constructor(attributes) { 50938 super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]); 50939 } 50940} 50941class Enforce extends StringObject { 50942 constructor(attributes) { 50943 super(CONFIG_NS_ID, "enforce"); 50944 } 50945} 50946class Equate extends XFAObject { 50947 constructor(attributes) { 50948 super(CONFIG_NS_ID, "equate"); 50949 this.force = getInteger({ 50950 data: attributes.force, 50951 defaultValue: 1, 50952 validate: n => n === 0 50953 }); 50954 this.from = attributes.from || ""; 50955 this.to = attributes.to || ""; 50956 } 50957} 50958class EquateRange extends XFAObject { 50959 constructor(attributes) { 50960 super(CONFIG_NS_ID, "equateRange"); 50961 this.from = attributes.from || ""; 50962 this.to = attributes.to || ""; 50963 this._unicodeRange = attributes.unicodeRange || ""; 50964 } 50965 get unicodeRange() { 50966 const ranges = []; 50967 const unicodeRegex = /U\+([0-9a-fA-F]+)/; 50968 const unicodeRange = this._unicodeRange; 50969 for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) { 50970 range = range.split("-", 2).map(x => { 50971 const found = x.match(unicodeRegex); 50972 if (!found) { 50973 return 0; 50974 } 50975 return parseInt(found[1], 16); 50976 }); 50977 if (range.length === 1) { 50978 range.push(range[0]); 50979 } 50980 ranges.push(range); 50981 } 50982 return shadow(this, "unicodeRange", ranges); 50983 } 50984} 50985class Exclude extends ContentObject { 50986 constructor(attributes) { 50987 super(CONFIG_NS_ID, "exclude"); 50988 } 50989 [$finalize]() { 50990 this[$content] = this[$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x)); 50991 } 50992} 50993class ExcludeNS extends StringObject { 50994 constructor(attributes) { 50995 super(CONFIG_NS_ID, "excludeNS"); 50996 } 50997} 50998class FlipLabel extends OptionObject { 50999 constructor(attributes) { 51000 super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]); 51001 } 51002} 51003class config_FontInfo extends XFAObject { 51004 constructor(attributes) { 51005 super(CONFIG_NS_ID, "fontInfo", true); 51006 this.embed = null; 51007 this.map = null; 51008 this.subsetBelow = null; 51009 this.alwaysEmbed = new XFAObjectArray(); 51010 this.defaultTypeface = new XFAObjectArray(); 51011 this.neverEmbed = new XFAObjectArray(); 51012 } 51013} 51014class FormFieldFilling extends Option01 { 51015 constructor(attributes) { 51016 super(CONFIG_NS_ID, "formFieldFilling"); 51017 } 51018} 51019class GroupParent extends StringObject { 51020 constructor(attributes) { 51021 super(CONFIG_NS_ID, "groupParent"); 51022 } 51023} 51024class IfEmpty extends OptionObject { 51025 constructor(attributes) { 51026 super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]); 51027 } 51028} 51029class IncludeXDPContent extends StringObject { 51030 constructor(attributes) { 51031 super(CONFIG_NS_ID, "includeXDPContent"); 51032 } 51033} 51034class IncrementalLoad extends OptionObject { 51035 constructor(attributes) { 51036 super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]); 51037 } 51038} 51039class IncrementalMerge extends Option01 { 51040 constructor(attributes) { 51041 super(CONFIG_NS_ID, "incrementalMerge"); 51042 } 51043} 51044class Interactive extends Option01 { 51045 constructor(attributes) { 51046 super(CONFIG_NS_ID, "interactive"); 51047 } 51048} 51049class Jog extends OptionObject { 51050 constructor(attributes) { 51051 super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]); 51052 } 51053} 51054class LabelPrinter extends XFAObject { 51055 constructor(attributes) { 51056 super(CONFIG_NS_ID, "labelPrinter", true); 51057 this.name = getStringOption(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]); 51058 this.batchOutput = null; 51059 this.flipLabel = null; 51060 this.fontInfo = null; 51061 this.xdc = null; 51062 } 51063} 51064class Layout extends OptionObject { 51065 constructor(attributes) { 51066 super(CONFIG_NS_ID, "layout", ["paginate", "panel"]); 51067 } 51068} 51069class Level extends IntegerObject { 51070 constructor(attributes) { 51071 super(CONFIG_NS_ID, "level", 0, n => n > 0); 51072 } 51073} 51074class Linearized extends Option01 { 51075 constructor(attributes) { 51076 super(CONFIG_NS_ID, "linearized"); 51077 } 51078} 51079class Locale extends StringObject { 51080 constructor(attributes) { 51081 super(CONFIG_NS_ID, "locale"); 51082 } 51083} 51084class LocaleSet extends StringObject { 51085 constructor(attributes) { 51086 super(CONFIG_NS_ID, "localeSet"); 51087 } 51088} 51089class Log extends XFAObject { 51090 constructor(attributes) { 51091 super(CONFIG_NS_ID, "log", true); 51092 this.mode = null; 51093 this.threshold = null; 51094 this.to = null; 51095 this.uri = null; 51096 } 51097} 51098class MapElement extends XFAObject { 51099 constructor(attributes) { 51100 super(CONFIG_NS_ID, "map", true); 51101 this.equate = new XFAObjectArray(); 51102 this.equateRange = new XFAObjectArray(); 51103 } 51104} 51105class MediumInfo extends XFAObject { 51106 constructor(attributes) { 51107 super(CONFIG_NS_ID, "mediumInfo", true); 51108 this.map = null; 51109 } 51110} 51111class config_Message extends XFAObject { 51112 constructor(attributes) { 51113 super(CONFIG_NS_ID, "message", true); 51114 this.msgId = null; 51115 this.severity = null; 51116 } 51117} 51118class Messaging extends XFAObject { 51119 constructor(attributes) { 51120 super(CONFIG_NS_ID, "messaging", true); 51121 this.message = new XFAObjectArray(); 51122 } 51123} 51124class Mode extends OptionObject { 51125 constructor(attributes) { 51126 super(CONFIG_NS_ID, "mode", ["append", "overwrite"]); 51127 } 51128} 51129class ModifyAnnots extends Option01 { 51130 constructor(attributes) { 51131 super(CONFIG_NS_ID, "modifyAnnots"); 51132 } 51133} 51134class MsgId extends IntegerObject { 51135 constructor(attributes) { 51136 super(CONFIG_NS_ID, "msgId", 1, n => n >= 1); 51137 } 51138} 51139class NameAttr extends StringObject { 51140 constructor(attributes) { 51141 super(CONFIG_NS_ID, "nameAttr"); 51142 } 51143} 51144class NeverEmbed extends ContentObject { 51145 constructor(attributes) { 51146 super(CONFIG_NS_ID, "neverEmbed"); 51147 } 51148} 51149class NumberOfCopies extends IntegerObject { 51150 constructor(attributes) { 51151 super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5); 51152 } 51153} 51154class OpenAction extends XFAObject { 51155 constructor(attributes) { 51156 super(CONFIG_NS_ID, "openAction", true); 51157 this.destination = null; 51158 } 51159} 51160class Output extends XFAObject { 51161 constructor(attributes) { 51162 super(CONFIG_NS_ID, "output", true); 51163 this.to = null; 51164 this.type = null; 51165 this.uri = null; 51166 } 51167} 51168class OutputBin extends StringObject { 51169 constructor(attributes) { 51170 super(CONFIG_NS_ID, "outputBin"); 51171 } 51172} 51173class OutputXSL extends XFAObject { 51174 constructor(attributes) { 51175 super(CONFIG_NS_ID, "outputXSL", true); 51176 this.uri = null; 51177 } 51178} 51179class Overprint extends OptionObject { 51180 constructor(attributes) { 51181 super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]); 51182 } 51183} 51184class Packets extends StringObject { 51185 constructor(attributes) { 51186 super(CONFIG_NS_ID, "packets"); 51187 } 51188 [$finalize]() { 51189 if (this[$content] === "*") { 51190 return; 51191 } 51192 this[$content] = this[$content].trim().split(/\s+/).filter(x => ["config", "datasets", "template", "xfdf", "xslt"].includes(x)); 51193 } 51194} 51195class PageOffset extends XFAObject { 51196 constructor(attributes) { 51197 super(CONFIG_NS_ID, "pageOffset"); 51198 this.x = getInteger({ 51199 data: attributes.x, 51200 defaultValue: "useXDCSetting", 51201 validate: n => true 51202 }); 51203 this.y = getInteger({ 51204 data: attributes.y, 51205 defaultValue: "useXDCSetting", 51206 validate: n => true 51207 }); 51208 } 51209} 51210class PageRange extends StringObject { 51211 constructor(attributes) { 51212 super(CONFIG_NS_ID, "pageRange"); 51213 } 51214 [$finalize]() { 51215 const numbers = this[$content].trim().split(/\s+/).map(x => parseInt(x, 10)); 51216 const ranges = []; 51217 for (let i = 0, ii = numbers.length; i < ii; i += 2) { 51218 ranges.push(numbers.slice(i, i + 2)); 51219 } 51220 this[$content] = ranges; 51221 } 51222} 51223class Pagination extends OptionObject { 51224 constructor(attributes) { 51225 super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]); 51226 } 51227} 51228class PaginationOverride extends OptionObject { 51229 constructor(attributes) { 51230 super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]); 51231 } 51232} 51233class Part extends IntegerObject { 51234 constructor(attributes) { 51235 super(CONFIG_NS_ID, "part", 1, n => false); 51236 } 51237} 51238class Pcl extends XFAObject { 51239 constructor(attributes) { 51240 super(CONFIG_NS_ID, "pcl", true); 51241 this.name = attributes.name || ""; 51242 this.batchOutput = null; 51243 this.fontInfo = null; 51244 this.jog = null; 51245 this.mediumInfo = null; 51246 this.outputBin = null; 51247 this.pageOffset = null; 51248 this.staple = null; 51249 this.xdc = null; 51250 } 51251} 51252class Pdf extends XFAObject { 51253 constructor(attributes) { 51254 super(CONFIG_NS_ID, "pdf", true); 51255 this.name = attributes.name || ""; 51256 this.adobeExtensionLevel = null; 51257 this.batchOutput = null; 51258 this.compression = null; 51259 this.creator = null; 51260 this.encryption = null; 51261 this.fontInfo = null; 51262 this.interactive = null; 51263 this.linearized = null; 51264 this.openAction = null; 51265 this.pdfa = null; 51266 this.producer = null; 51267 this.renderPolicy = null; 51268 this.scriptModel = null; 51269 this.silentPrint = null; 51270 this.submitFormat = null; 51271 this.tagged = null; 51272 this.version = null; 51273 this.viewerPreferences = null; 51274 this.xdc = null; 51275 } 51276} 51277class Pdfa extends XFAObject { 51278 constructor(attributes) { 51279 super(CONFIG_NS_ID, "pdfa", true); 51280 this.amd = null; 51281 this.conformance = null; 51282 this.includeXDPContent = null; 51283 this.part = null; 51284 } 51285} 51286class Permissions extends XFAObject { 51287 constructor(attributes) { 51288 super(CONFIG_NS_ID, "permissions", true); 51289 this.accessibleContent = null; 51290 this.change = null; 51291 this.contentCopy = null; 51292 this.documentAssembly = null; 51293 this.formFieldFilling = null; 51294 this.modifyAnnots = null; 51295 this.plaintextMetadata = null; 51296 this.print = null; 51297 this.printHighQuality = null; 51298 } 51299} 51300class PickTrayByPDFSize extends Option01 { 51301 constructor(attributes) { 51302 super(CONFIG_NS_ID, "pickTrayByPDFSize"); 51303 } 51304} 51305class config_Picture extends StringObject { 51306 constructor(attributes) { 51307 super(CONFIG_NS_ID, "picture"); 51308 } 51309} 51310class PlaintextMetadata extends Option01 { 51311 constructor(attributes) { 51312 super(CONFIG_NS_ID, "plaintextMetadata"); 51313 } 51314} 51315class Presence extends OptionObject { 51316 constructor(attributes) { 51317 super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]); 51318 } 51319} 51320class Present extends XFAObject { 51321 constructor(attributes) { 51322 super(CONFIG_NS_ID, "present", true); 51323 this.behaviorOverride = null; 51324 this.cache = null; 51325 this.common = null; 51326 this.copies = null; 51327 this.destination = null; 51328 this.incrementalMerge = null; 51329 this.layout = null; 51330 this.output = null; 51331 this.overprint = null; 51332 this.pagination = null; 51333 this.paginationOverride = null; 51334 this.script = null; 51335 this.validate = null; 51336 this.xdp = null; 51337 this.driver = new XFAObjectArray(); 51338 this.labelPrinter = new XFAObjectArray(); 51339 this.pcl = new XFAObjectArray(); 51340 this.pdf = new XFAObjectArray(); 51341 this.ps = new XFAObjectArray(); 51342 this.submitUrl = new XFAObjectArray(); 51343 this.webClient = new XFAObjectArray(); 51344 this.zpl = new XFAObjectArray(); 51345 } 51346} 51347class Print extends Option01 { 51348 constructor(attributes) { 51349 super(CONFIG_NS_ID, "print"); 51350 } 51351} 51352class PrintHighQuality extends Option01 { 51353 constructor(attributes) { 51354 super(CONFIG_NS_ID, "printHighQuality"); 51355 } 51356} 51357class PrintScaling extends OptionObject { 51358 constructor(attributes) { 51359 super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]); 51360 } 51361} 51362class PrinterName extends StringObject { 51363 constructor(attributes) { 51364 super(CONFIG_NS_ID, "printerName"); 51365 } 51366} 51367class Producer extends StringObject { 51368 constructor(attributes) { 51369 super(CONFIG_NS_ID, "producer"); 51370 } 51371} 51372class Ps extends XFAObject { 51373 constructor(attributes) { 51374 super(CONFIG_NS_ID, "ps", true); 51375 this.name = attributes.name || ""; 51376 this.batchOutput = null; 51377 this.fontInfo = null; 51378 this.jog = null; 51379 this.mediumInfo = null; 51380 this.outputBin = null; 51381 this.staple = null; 51382 this.xdc = null; 51383 } 51384} 51385class Range extends ContentObject { 51386 constructor(attributes) { 51387 super(CONFIG_NS_ID, "range"); 51388 } 51389 [$finalize]() { 51390 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 => { 51391 if (range.length === 1) { 51392 range.push(range[0]); 51393 } 51394 return range; 51395 }); 51396 } 51397} 51398class Record extends ContentObject { 51399 constructor(attributes) { 51400 super(CONFIG_NS_ID, "record"); 51401 } 51402 [$finalize]() { 51403 this[$content] = this[$content].trim(); 51404 const n = parseInt(this[$content], 10); 51405 if (!isNaN(n) && n >= 0) { 51406 this[$content] = n; 51407 } 51408 } 51409} 51410class Relevant extends ContentObject { 51411 constructor(attributes) { 51412 super(CONFIG_NS_ID, "relevant"); 51413 } 51414 [$finalize]() { 51415 this[$content] = this[$content].trim().split(/\s+/); 51416 } 51417} 51418class Rename extends ContentObject { 51419 constructor(attributes) { 51420 super(CONFIG_NS_ID, "rename"); 51421 } 51422 [$finalize]() { 51423 this[$content] = this[$content].trim(); 51424 if (this[$content].toLowerCase().startsWith("xml") || new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[$content])) { 51425 warn("XFA - Rename: invalid XFA name"); 51426 } 51427 } 51428} 51429class RenderPolicy extends OptionObject { 51430 constructor(attributes) { 51431 super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]); 51432 } 51433} 51434class RunScripts extends OptionObject { 51435 constructor(attributes) { 51436 super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]); 51437 } 51438} 51439class config_Script extends XFAObject { 51440 constructor(attributes) { 51441 super(CONFIG_NS_ID, "script", true); 51442 this.currentPage = null; 51443 this.exclude = null; 51444 this.runScripts = null; 51445 } 51446} 51447class ScriptModel extends OptionObject { 51448 constructor(attributes) { 51449 super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]); 51450 } 51451} 51452class Severity extends OptionObject { 51453 constructor(attributes) { 51454 super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]); 51455 } 51456} 51457class SilentPrint extends XFAObject { 51458 constructor(attributes) { 51459 super(CONFIG_NS_ID, "silentPrint", true); 51460 this.addSilentPrint = null; 51461 this.printerName = null; 51462 } 51463} 51464class Staple extends XFAObject { 51465 constructor(attributes) { 51466 super(CONFIG_NS_ID, "staple"); 51467 this.mode = getStringOption(attributes.mode, ["usePrinterSetting", "on", "off"]); 51468 } 51469} 51470class StartNode extends StringObject { 51471 constructor(attributes) { 51472 super(CONFIG_NS_ID, "startNode"); 51473 } 51474} 51475class StartPage extends IntegerObject { 51476 constructor(attributes) { 51477 super(CONFIG_NS_ID, "startPage", 0, n => true); 51478 } 51479} 51480class SubmitFormat extends OptionObject { 51481 constructor(attributes) { 51482 super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]); 51483 } 51484} 51485class SubmitUrl extends StringObject { 51486 constructor(attributes) { 51487 super(CONFIG_NS_ID, "submitUrl"); 51488 } 51489} 51490class SubsetBelow extends IntegerObject { 51491 constructor(attributes) { 51492 super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100); 51493 } 51494} 51495class SuppressBanner extends Option01 { 51496 constructor(attributes) { 51497 super(CONFIG_NS_ID, "suppressBanner"); 51498 } 51499} 51500class Tagged extends Option01 { 51501 constructor(attributes) { 51502 super(CONFIG_NS_ID, "tagged"); 51503 } 51504} 51505class config_Template extends XFAObject { 51506 constructor(attributes) { 51507 super(CONFIG_NS_ID, "template", true); 51508 this.base = null; 51509 this.relevant = null; 51510 this.startPage = null; 51511 this.uri = null; 51512 this.xsl = null; 51513 } 51514} 51515class Threshold extends OptionObject { 51516 constructor(attributes) { 51517 super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]); 51518 } 51519} 51520class To extends OptionObject { 51521 constructor(attributes) { 51522 super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]); 51523 } 51524} 51525class TemplateCache extends XFAObject { 51526 constructor(attributes) { 51527 super(CONFIG_NS_ID, "templateCache"); 51528 this.maxEntries = getInteger({ 51529 data: attributes.maxEntries, 51530 defaultValue: 5, 51531 validate: n => n >= 0 51532 }); 51533 } 51534} 51535class Trace extends XFAObject { 51536 constructor(attributes) { 51537 super(CONFIG_NS_ID, "trace", true); 51538 this.area = new XFAObjectArray(); 51539 } 51540} 51541class Transform extends XFAObject { 51542 constructor(attributes) { 51543 super(CONFIG_NS_ID, "transform", true); 51544 this.groupParent = null; 51545 this.ifEmpty = null; 51546 this.nameAttr = null; 51547 this.picture = null; 51548 this.presence = null; 51549 this.rename = null; 51550 this.whitespace = null; 51551 } 51552} 51553class Type extends OptionObject { 51554 constructor(attributes) { 51555 super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]); 51556 } 51557} 51558class Uri extends StringObject { 51559 constructor(attributes) { 51560 super(CONFIG_NS_ID, "uri"); 51561 } 51562} 51563class config_Validate extends OptionObject { 51564 constructor(attributes) { 51565 super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]); 51566 } 51567} 51568class ValidateApprovalSignatures extends ContentObject { 51569 constructor(attributes) { 51570 super(CONFIG_NS_ID, "validateApprovalSignatures"); 51571 } 51572 [$finalize]() { 51573 this[$content] = this[$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x)); 51574 } 51575} 51576class ValidationMessaging extends OptionObject { 51577 constructor(attributes) { 51578 super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]); 51579 } 51580} 51581class Version extends OptionObject { 51582 constructor(attributes) { 51583 super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); 51584 } 51585} 51586class VersionControl extends XFAObject { 51587 constructor(attributes) { 51588 super(CONFIG_NS_ID, "VersionControl"); 51589 this.outputBelow = getStringOption(attributes.outputBelow, ["warn", "error", "update"]); 51590 this.sourceAbove = getStringOption(attributes.sourceAbove, ["warn", "error"]); 51591 this.sourceBelow = getStringOption(attributes.sourceBelow, ["update", "maintain"]); 51592 } 51593} 51594class ViewerPreferences extends XFAObject { 51595 constructor(attributes) { 51596 super(CONFIG_NS_ID, "viewerPreferences", true); 51597 this.ADBE_JSConsole = null; 51598 this.ADBE_JSDebugger = null; 51599 this.addViewerPreferences = null; 51600 this.duplexOption = null; 51601 this.enforce = null; 51602 this.numberOfCopies = null; 51603 this.pageRange = null; 51604 this.pickTrayByPDFSize = null; 51605 this.printScaling = null; 51606 } 51607} 51608class WebClient extends XFAObject { 51609 constructor(attributes) { 51610 super(CONFIG_NS_ID, "webClient", true); 51611 this.name = attributes.name ? attributes.name.trim() : ""; 51612 this.fontInfo = null; 51613 this.xdc = null; 51614 } 51615} 51616class Whitespace extends OptionObject { 51617 constructor(attributes) { 51618 super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]); 51619 } 51620} 51621class Window extends ContentObject { 51622 constructor(attributes) { 51623 super(CONFIG_NS_ID, "window"); 51624 } 51625 [$finalize]() { 51626 const pair = this[$content].trim().split(/\s*,\s*/, 2).map(x => parseInt(x, 10)); 51627 if (pair.some(x => isNaN(x))) { 51628 this[$content] = [0, 0]; 51629 return; 51630 } 51631 if (pair.length === 1) { 51632 pair.push(pair[0]); 51633 } 51634 this[$content] = pair; 51635 } 51636} 51637class Xdc extends XFAObject { 51638 constructor(attributes) { 51639 super(CONFIG_NS_ID, "xdc", true); 51640 this.uri = new XFAObjectArray(); 51641 this.xsl = new XFAObjectArray(); 51642 } 51643} 51644class Xdp extends XFAObject { 51645 constructor(attributes) { 51646 super(CONFIG_NS_ID, "xdp", true); 51647 this.packets = null; 51648 } 51649} 51650class Xsl extends XFAObject { 51651 constructor(attributes) { 51652 super(CONFIG_NS_ID, "xsl", true); 51653 this.debug = null; 51654 this.uri = null; 51655 } 51656} 51657class Zpl extends XFAObject { 51658 constructor(attributes) { 51659 super(CONFIG_NS_ID, "zpl", true); 51660 this.name = attributes.name ? attributes.name.trim() : ""; 51661 this.batchOutput = null; 51662 this.flipLabel = null; 51663 this.fontInfo = null; 51664 this.xdc = null; 51665 } 51666} 51667class ConfigNamespace { 51668 static [$buildXFAObject](name, attributes) { 51669 if (ConfigNamespace.hasOwnProperty(name)) { 51670 return ConfigNamespace[name](attributes); 51671 } 51672 return undefined; 51673 } 51674 static acrobat(attrs) { 51675 return new Acrobat(attrs); 51676 } 51677 static acrobat7(attrs) { 51678 return new Acrobat7(attrs); 51679 } 51680 static ADBE_JSConsole(attrs) { 51681 return new ADBE_JSConsole(attrs); 51682 } 51683 static ADBE_JSDebugger(attrs) { 51684 return new ADBE_JSDebugger(attrs); 51685 } 51686 static addSilentPrint(attrs) { 51687 return new AddSilentPrint(attrs); 51688 } 51689 static addViewerPreferences(attrs) { 51690 return new AddViewerPreferences(attrs); 51691 } 51692 static adjustData(attrs) { 51693 return new AdjustData(attrs); 51694 } 51695 static adobeExtensionLevel(attrs) { 51696 return new AdobeExtensionLevel(attrs); 51697 } 51698 static agent(attrs) { 51699 return new Agent(attrs); 51700 } 51701 static alwaysEmbed(attrs) { 51702 return new AlwaysEmbed(attrs); 51703 } 51704 static amd(attrs) { 51705 return new Amd(attrs); 51706 } 51707 static area(attrs) { 51708 return new config_Area(attrs); 51709 } 51710 static attributes(attrs) { 51711 return new Attributes(attrs); 51712 } 51713 static autoSave(attrs) { 51714 return new AutoSave(attrs); 51715 } 51716 static base(attrs) { 51717 return new Base(attrs); 51718 } 51719 static batchOutput(attrs) { 51720 return new BatchOutput(attrs); 51721 } 51722 static behaviorOverride(attrs) { 51723 return new BehaviorOverride(attrs); 51724 } 51725 static cache(attrs) { 51726 return new Cache(attrs); 51727 } 51728 static change(attrs) { 51729 return new Change(attrs); 51730 } 51731 static common(attrs) { 51732 return new Common(attrs); 51733 } 51734 static compress(attrs) { 51735 return new Compress(attrs); 51736 } 51737 static compressLogicalStructure(attrs) { 51738 return new CompressLogicalStructure(attrs); 51739 } 51740 static compressObjectStream(attrs) { 51741 return new CompressObjectStream(attrs); 51742 } 51743 static compression(attrs) { 51744 return new Compression(attrs); 51745 } 51746 static config(attrs) { 51747 return new Config(attrs); 51748 } 51749 static conformance(attrs) { 51750 return new Conformance(attrs); 51751 } 51752 static contentCopy(attrs) { 51753 return new ContentCopy(attrs); 51754 } 51755 static copies(attrs) { 51756 return new Copies(attrs); 51757 } 51758 static creator(attrs) { 51759 return new Creator(attrs); 51760 } 51761 static currentPage(attrs) { 51762 return new CurrentPage(attrs); 51763 } 51764 static data(attrs) { 51765 return new Data(attrs); 51766 } 51767 static debug(attrs) { 51768 return new Debug(attrs); 51769 } 51770 static defaultTypeface(attrs) { 51771 return new DefaultTypeface(attrs); 51772 } 51773 static destination(attrs) { 51774 return new Destination(attrs); 51775 } 51776 static documentAssembly(attrs) { 51777 return new DocumentAssembly(attrs); 51778 } 51779 static driver(attrs) { 51780 return new Driver(attrs); 51781 } 51782 static duplexOption(attrs) { 51783 return new DuplexOption(attrs); 51784 } 51785 static dynamicRender(attrs) { 51786 return new DynamicRender(attrs); 51787 } 51788 static embed(attrs) { 51789 return new Embed(attrs); 51790 } 51791 static encrypt(attrs) { 51792 return new config_Encrypt(attrs); 51793 } 51794 static encryption(attrs) { 51795 return new config_Encryption(attrs); 51796 } 51797 static encryptionLevel(attrs) { 51798 return new EncryptionLevel(attrs); 51799 } 51800 static enforce(attrs) { 51801 return new Enforce(attrs); 51802 } 51803 static equate(attrs) { 51804 return new Equate(attrs); 51805 } 51806 static equateRange(attrs) { 51807 return new EquateRange(attrs); 51808 } 51809 static exclude(attrs) { 51810 return new Exclude(attrs); 51811 } 51812 static excludeNS(attrs) { 51813 return new ExcludeNS(attrs); 51814 } 51815 static flipLabel(attrs) { 51816 return new FlipLabel(attrs); 51817 } 51818 static fontInfo(attrs) { 51819 return new config_FontInfo(attrs); 51820 } 51821 static formFieldFilling(attrs) {
51822 return new FormFieldFilling(attrs); 51823 } 51824 static groupParent(attrs) { 51825 return new GroupParent(attrs); 51826 } 51827 static ifEmpty(attrs) { 51828 return new IfEmpty(attrs); 51829 } 51830 static includeXDPContent(attrs) { 51831 return new IncludeXDPContent(attrs); 51832 } 51833 static incrementalLoad(attrs) { 51834 return new IncrementalLoad(attrs); 51835 } 51836 static incrementalMerge(attrs) { 51837 return new IncrementalMerge(attrs); 51838 } 51839 static interactive(attrs) { 51840 return new Interactive(attrs); 51841 } 51842 static jog(attrs) { 51843 return new Jog(attrs); 51844 } 51845 static labelPrinter(attrs) { 51846 return new LabelPrinter(attrs); 51847 } 51848 static layout(attrs) { 51849 return new Layout(attrs); 51850 } 51851 static level(attrs) { 51852 return new Level(attrs); 51853 } 51854 static linearized(attrs) { 51855 return new Linearized(attrs); 51856 } 51857 static locale(attrs) { 51858 return new Locale(attrs); 51859 } 51860 static localeSet(attrs) { 51861 return new LocaleSet(attrs); 51862 } 51863 static log(attrs) { 51864 return new Log(attrs); 51865 } 51866 static map(attrs) { 51867 return new MapElement(attrs); 51868 } 51869 static mediumInfo(attrs) { 51870 return new MediumInfo(attrs); 51871 } 51872 static message(attrs) { 51873 return new config_Message(attrs); 51874 } 51875 static messaging(attrs) { 51876 return new Messaging(attrs); 51877 } 51878 static mode(attrs) { 51879 return new Mode(attrs); 51880 } 51881 static modifyAnnots(attrs) { 51882 return new ModifyAnnots(attrs); 51883 } 51884 static msgId(attrs) { 51885 return new MsgId(attrs); 51886 } 51887 static nameAttr(attrs) { 51888 return new NameAttr(attrs); 51889 } 51890 static neverEmbed(attrs) { 51891 return new NeverEmbed(attrs); 51892 } 51893 static numberOfCopies(attrs) { 51894 return new NumberOfCopies(attrs); 51895 } 51896 static openAction(attrs) { 51897 return new OpenAction(attrs); 51898 } 51899 static output(attrs) { 51900 return new Output(attrs); 51901 } 51902 static outputBin(attrs) { 51903 return new OutputBin(attrs); 51904 } 51905 static outputXSL(attrs) { 51906 return new OutputXSL(attrs); 51907 } 51908 static overprint(attrs) { 51909 return new Overprint(attrs); 51910 } 51911 static packets(attrs) { 51912 return new Packets(attrs); 51913 } 51914 static pageOffset(attrs) { 51915 return new PageOffset(attrs); 51916 } 51917 static pageRange(attrs) { 51918 return new PageRange(attrs); 51919 } 51920 static pagination(attrs) { 51921 return new Pagination(attrs); 51922 } 51923 static paginationOverride(attrs) { 51924 return new PaginationOverride(attrs); 51925 } 51926 static part(attrs) { 51927 return new Part(attrs); 51928 } 51929 static pcl(attrs) { 51930 return new Pcl(attrs); 51931 } 51932 static pdf(attrs) { 51933 return new Pdf(attrs); 51934 } 51935 static pdfa(attrs) { 51936 return new Pdfa(attrs); 51937 } 51938 static permissions(attrs) { 51939 return new Permissions(attrs); 51940 } 51941 static pickTrayByPDFSize(attrs) { 51942 return new PickTrayByPDFSize(attrs); 51943 } 51944 static picture(attrs) { 51945 return new config_Picture(attrs); 51946 } 51947 static plaintextMetadata(attrs) { 51948 return new PlaintextMetadata(attrs); 51949 } 51950 static presence(attrs) { 51951 return new Presence(attrs); 51952 } 51953 static present(attrs) { 51954 return new Present(attrs); 51955 } 51956 static print(attrs) { 51957 return new Print(attrs); 51958 } 51959 static printHighQuality(attrs) { 51960 return new PrintHighQuality(attrs); 51961 } 51962 static printScaling(attrs) { 51963 return new PrintScaling(attrs); 51964 } 51965 static printerName(attrs) { 51966 return new PrinterName(attrs); 51967 } 51968 static producer(attrs) { 51969 return new Producer(attrs); 51970 } 51971 static ps(attrs) { 51972 return new Ps(attrs); 51973 } 51974 static range(attrs) { 51975 return new Range(attrs); 51976 } 51977 static record(attrs) { 51978 return new Record(attrs); 51979 } 51980 static relevant(attrs) { 51981 return new Relevant(attrs); 51982 } 51983 static rename(attrs) { 51984 return new Rename(attrs); 51985 } 51986 static renderPolicy(attrs) { 51987 return new RenderPolicy(attrs); 51988 } 51989 static runScripts(attrs) { 51990 return new RunScripts(attrs); 51991 } 51992 static script(attrs) { 51993 return new config_Script(attrs); 51994 } 51995 static scriptModel(attrs) { 51996 return new ScriptModel(attrs); 51997 } 51998 static severity(attrs) { 51999 return new Severity(attrs); 52000 } 52001 static silentPrint(attrs) { 52002 return new SilentPrint(attrs); 52003 } 52004 static staple(attrs) { 52005 return new Staple(attrs); 52006 } 52007 static startNode(attrs) { 52008 return new StartNode(attrs); 52009 } 52010 static startPage(attrs) { 52011 return new StartPage(attrs); 52012 } 52013 static submitFormat(attrs) { 52014 return new SubmitFormat(attrs); 52015 } 52016 static submitUrl(attrs) { 52017 return new SubmitUrl(attrs); 52018 } 52019 static subsetBelow(attrs) { 52020 return new SubsetBelow(attrs); 52021 } 52022 static suppressBanner(attrs) { 52023 return new SuppressBanner(attrs); 52024 } 52025 static tagged(attrs) { 52026 return new Tagged(attrs); 52027 } 52028 static template(attrs) { 52029 return new config_Template(attrs); 52030 } 52031 static templateCache(attrs) { 52032 return new TemplateCache(attrs); 52033 } 52034 static threshold(attrs) { 52035 return new Threshold(attrs); 52036 } 52037 static to(attrs) { 52038 return new To(attrs); 52039 } 52040 static trace(attrs) { 52041 return new Trace(attrs); 52042 } 52043 static transform(attrs) { 52044 return new Transform(attrs); 52045 } 52046 static type(attrs) { 52047 return new Type(attrs); 52048 } 52049 static uri(attrs) { 52050 return new Uri(attrs); 52051 } 52052 static validate(attrs) {
vendor: 51,059 bytes, lines 52053-54028
52053 return new config_Validate(attrs); 52054 } 52055 static validateApprovalSignatures(attrs) { 52056 return new ValidateApprovalSignatures(attrs); 52057 } 52058 static validationMessaging(attrs) { 52059 return new ValidationMessaging(attrs); 52060 } 52061 static version(attrs) { 52062 return new Version(attrs); 52063 } 52064 static versionControl(attrs) { 52065 return new VersionControl(attrs); 52066 } 52067 static viewerPreferences(attrs) { 52068 return new ViewerPreferences(attrs); 52069 } 52070 static webClient(attrs) { 52071 return new WebClient(attrs); 52072 } 52073 static whitespace(attrs) { 52074 return new Whitespace(attrs); 52075 } 52076 static window(attrs) { 52077 return new Window(attrs); 52078 } 52079 static xdc(attrs) { 52080 return new Xdc(attrs); 52081 } 52082 static xdp(attrs) { 52083 return new Xdp(attrs); 52084 } 52085 static xsl(attrs) { 52086 return new Xsl(attrs); 52087 } 52088 static zpl(attrs) { 52089 return new Zpl(attrs); 52090 } 52091} 52092 52093;// ./src/core/xfa/connection_set.js 52094 52095 52096const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id; 52097class ConnectionSet extends XFAObject { 52098 constructor(attributes) { 52099 super(CONNECTION_SET_NS_ID, "connectionSet", true); 52100 this.wsdlConnection = new XFAObjectArray(); 52101 this.xmlConnection = new XFAObjectArray(); 52102 this.xsdConnection = new XFAObjectArray(); 52103 } 52104} 52105class EffectiveInputPolicy extends XFAObject { 52106 constructor(attributes) { 52107 super(CONNECTION_SET_NS_ID, "effectiveInputPolicy"); 52108 this.id = attributes.id || ""; 52109 this.name = attributes.name || ""; 52110 this.use = attributes.use || ""; 52111 this.usehref = attributes.usehref || ""; 52112 } 52113} 52114class EffectiveOutputPolicy extends XFAObject { 52115 constructor(attributes) { 52116 super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy"); 52117 this.id = attributes.id || ""; 52118 this.name = attributes.name || ""; 52119 this.use = attributes.use || ""; 52120 this.usehref = attributes.usehref || ""; 52121 } 52122} 52123class Operation extends StringObject { 52124 constructor(attributes) { 52125 super(CONNECTION_SET_NS_ID, "operation"); 52126 this.id = attributes.id || ""; 52127 this.input = attributes.input || ""; 52128 this.name = attributes.name || ""; 52129 this.output = attributes.output || ""; 52130 this.use = attributes.use || ""; 52131 this.usehref = attributes.usehref || ""; 52132 } 52133} 52134class RootElement extends StringObject { 52135 constructor(attributes) { 52136 super(CONNECTION_SET_NS_ID, "rootElement"); 52137 this.id = attributes.id || ""; 52138 this.name = attributes.name || ""; 52139 this.use = attributes.use || ""; 52140 this.usehref = attributes.usehref || ""; 52141 } 52142} 52143class SoapAction extends StringObject { 52144 constructor(attributes) { 52145 super(CONNECTION_SET_NS_ID, "soapAction"); 52146 this.id = attributes.id || ""; 52147 this.name = attributes.name || ""; 52148 this.use = attributes.use || ""; 52149 this.usehref = attributes.usehref || ""; 52150 } 52151} 52152class SoapAddress extends StringObject { 52153 constructor(attributes) { 52154 super(CONNECTION_SET_NS_ID, "soapAddress"); 52155 this.id = attributes.id || ""; 52156 this.name = attributes.name || ""; 52157 this.use = attributes.use || ""; 52158 this.usehref = attributes.usehref || ""; 52159 } 52160} 52161class connection_set_Uri extends StringObject { 52162 constructor(attributes) { 52163 super(CONNECTION_SET_NS_ID, "uri"); 52164 this.id = attributes.id || ""; 52165 this.name = attributes.name || ""; 52166 this.use = attributes.use || ""; 52167 this.usehref = attributes.usehref || ""; 52168 } 52169} 52170class WsdlAddress extends StringObject { 52171 constructor(attributes) { 52172 super(CONNECTION_SET_NS_ID, "wsdlAddress"); 52173 this.id = attributes.id || ""; 52174 this.name = attributes.name || ""; 52175 this.use = attributes.use || ""; 52176 this.usehref = attributes.usehref || ""; 52177 } 52178} 52179class WsdlConnection extends XFAObject { 52180 constructor(attributes) { 52181 super(CONNECTION_SET_NS_ID, "wsdlConnection", true); 52182 this.dataDescription = attributes.dataDescription || ""; 52183 this.name = attributes.name || ""; 52184 this.effectiveInputPolicy = null; 52185 this.effectiveOutputPolicy = null; 52186 this.operation = null; 52187 this.soapAction = null; 52188 this.soapAddress = null; 52189 this.wsdlAddress = null; 52190 } 52191} 52192class XmlConnection extends XFAObject { 52193 constructor(attributes) { 52194 super(CONNECTION_SET_NS_ID, "xmlConnection", true); 52195 this.dataDescription = attributes.dataDescription || ""; 52196 this.name = attributes.name || ""; 52197 this.uri = null; 52198 } 52199} 52200class XsdConnection extends XFAObject { 52201 constructor(attributes) { 52202 super(CONNECTION_SET_NS_ID, "xsdConnection", true); 52203 this.dataDescription = attributes.dataDescription || ""; 52204 this.name = attributes.name || ""; 52205 this.rootElement = null; 52206 this.uri = null; 52207 } 52208} 52209class ConnectionSetNamespace { 52210 static [$buildXFAObject](name, attributes) { 52211 if (ConnectionSetNamespace.hasOwnProperty(name)) { 52212 return ConnectionSetNamespace[name](attributes); 52213 } 52214 return undefined; 52215 } 52216 static connectionSet(attrs) { 52217 return new ConnectionSet(attrs); 52218 } 52219 static effectiveInputPolicy(attrs) { 52220 return new EffectiveInputPolicy(attrs); 52221 } 52222 static effectiveOutputPolicy(attrs) { 52223 return new EffectiveOutputPolicy(attrs); 52224 } 52225 static operation(attrs) { 52226 return new Operation(attrs); 52227 } 52228 static rootElement(attrs) { 52229 return new RootElement(attrs); 52230 } 52231 static soapAction(attrs) { 52232 return new SoapAction(attrs); 52233 } 52234 static soapAddress(attrs) { 52235 return new SoapAddress(attrs); 52236 } 52237 static uri(attrs) { 52238 return new connection_set_Uri(attrs); 52239 } 52240 static wsdlAddress(attrs) { 52241 return new WsdlAddress(attrs); 52242 } 52243 static wsdlConnection(attrs) { 52244 return new WsdlConnection(attrs); 52245 } 52246 static xmlConnection(attrs) { 52247 return new XmlConnection(attrs); 52248 } 52249 static xsdConnection(attrs) { 52250 return new XsdConnection(attrs); 52251 } 52252} 52253 52254;// ./src/core/xfa/datasets.js 52255 52256 52257 52258const DATASETS_NS_ID = NamespaceIds.datasets.id; 52259class datasets_Data extends XmlObject { 52260 constructor(attributes) { 52261 super(DATASETS_NS_ID, "data", attributes); 52262 } 52263 [$isNsAgnostic]() { 52264 return true; 52265 } 52266} 52267class Datasets extends XFAObject { 52268 constructor(attributes) { 52269 super(DATASETS_NS_ID, "datasets", true); 52270 this.data = null; 52271 this.Signature = null; 52272 } 52273 [$onChild](child) { 52274 const name = child[$nodeName]; 52275 if (name === "data" && child[$namespaceId] === DATASETS_NS_ID || name === "Signature" && child[$namespaceId] === NamespaceIds.signature.id) { 52276 this[name] = child; 52277 } 52278 this[$appendChild](child); 52279 } 52280} 52281class DatasetsNamespace { 52282 static [$buildXFAObject](name, attributes) { 52283 if (DatasetsNamespace.hasOwnProperty(name)) { 52284 return DatasetsNamespace[name](attributes); 52285 } 52286 return undefined; 52287 } 52288 static datasets(attributes) { 52289 return new Datasets(attributes); 52290 } 52291 static data(attributes) { 52292 return new datasets_Data(attributes); 52293 } 52294} 52295 52296;// ./src/core/xfa/locale_set.js 52297 52298 52299 52300const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id; 52301class CalendarSymbols extends XFAObject { 52302 constructor(attributes) { 52303 super(LOCALE_SET_NS_ID, "calendarSymbols", true); 52304 this.name = "gregorian"; 52305 this.dayNames = new XFAObjectArray(2); 52306 this.eraNames = null; 52307 this.meridiemNames = null; 52308 this.monthNames = new XFAObjectArray(2); 52309 } 52310} 52311class CurrencySymbol extends StringObject { 52312 constructor(attributes) { 52313 super(LOCALE_SET_NS_ID, "currencySymbol"); 52314 this.name = getStringOption(attributes.name, ["symbol", "isoname", "decimal"]); 52315 } 52316} 52317class CurrencySymbols extends XFAObject { 52318 constructor(attributes) { 52319 super(LOCALE_SET_NS_ID, "currencySymbols", true); 52320 this.currencySymbol = new XFAObjectArray(3); 52321 } 52322} 52323class DatePattern extends StringObject { 52324 constructor(attributes) { 52325 super(LOCALE_SET_NS_ID, "datePattern"); 52326 this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); 52327 } 52328} 52329class DatePatterns extends XFAObject { 52330 constructor(attributes) { 52331 super(LOCALE_SET_NS_ID, "datePatterns", true); 52332 this.datePattern = new XFAObjectArray(4); 52333 } 52334} 52335class DateTimeSymbols extends ContentObject { 52336 constructor(attributes) { 52337 super(LOCALE_SET_NS_ID, "dateTimeSymbols"); 52338 } 52339} 52340class Day extends StringObject { 52341 constructor(attributes) { 52342 super(LOCALE_SET_NS_ID, "day"); 52343 } 52344} 52345class DayNames extends XFAObject { 52346 constructor(attributes) { 52347 super(LOCALE_SET_NS_ID, "dayNames", true); 52348 this.abbr = getInteger({ 52349 data: attributes.abbr, 52350 defaultValue: 0, 52351 validate: x => x === 1 52352 }); 52353 this.day = new XFAObjectArray(7); 52354 } 52355} 52356class Era extends StringObject { 52357 constructor(attributes) { 52358 super(LOCALE_SET_NS_ID, "era"); 52359 } 52360} 52361class EraNames extends XFAObject { 52362 constructor(attributes) { 52363 super(LOCALE_SET_NS_ID, "eraNames", true); 52364 this.era = new XFAObjectArray(2); 52365 } 52366} 52367class locale_set_Locale extends XFAObject { 52368 constructor(attributes) { 52369 super(LOCALE_SET_NS_ID, "locale", true); 52370 this.desc = attributes.desc || ""; 52371 this.name = "isoname"; 52372 this.calendarSymbols = null; 52373 this.currencySymbols = null; 52374 this.datePatterns = null; 52375 this.dateTimeSymbols = null; 52376 this.numberPatterns = null; 52377 this.numberSymbols = null; 52378 this.timePatterns = null; 52379 this.typeFaces = null; 52380 } 52381} 52382class locale_set_LocaleSet extends XFAObject { 52383 constructor(attributes) { 52384 super(LOCALE_SET_NS_ID, "localeSet", true); 52385 this.locale = new XFAObjectArray(); 52386 } 52387} 52388class Meridiem extends StringObject { 52389 constructor(attributes) { 52390 super(LOCALE_SET_NS_ID, "meridiem"); 52391 } 52392} 52393class MeridiemNames extends XFAObject { 52394 constructor(attributes) { 52395 super(LOCALE_SET_NS_ID, "meridiemNames", true); 52396 this.meridiem = new XFAObjectArray(2); 52397 } 52398} 52399class Month extends StringObject { 52400 constructor(attributes) { 52401 super(LOCALE_SET_NS_ID, "month"); 52402 } 52403} 52404class MonthNames extends XFAObject { 52405 constructor(attributes) { 52406 super(LOCALE_SET_NS_ID, "monthNames", true); 52407 this.abbr = getInteger({ 52408 data: attributes.abbr, 52409 defaultValue: 0, 52410 validate: x => x === 1 52411 }); 52412 this.month = new XFAObjectArray(12); 52413 } 52414} 52415class NumberPattern extends StringObject { 52416 constructor(attributes) { 52417 super(LOCALE_SET_NS_ID, "numberPattern"); 52418 this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); 52419 } 52420} 52421class NumberPatterns extends XFAObject { 52422 constructor(attributes) { 52423 super(LOCALE_SET_NS_ID, "numberPatterns", true); 52424 this.numberPattern = new XFAObjectArray(4); 52425 } 52426} 52427class NumberSymbol extends StringObject { 52428 constructor(attributes) { 52429 super(LOCALE_SET_NS_ID, "numberSymbol"); 52430 this.name = getStringOption(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]); 52431 } 52432} 52433class NumberSymbols extends XFAObject { 52434 constructor(attributes) { 52435 super(LOCALE_SET_NS_ID, "numberSymbols", true); 52436 this.numberSymbol = new XFAObjectArray(5); 52437 } 52438} 52439class TimePattern extends StringObject { 52440 constructor(attributes) { 52441 super(LOCALE_SET_NS_ID, "timePattern"); 52442 this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); 52443 } 52444} 52445class TimePatterns extends XFAObject { 52446 constructor(attributes) { 52447 super(LOCALE_SET_NS_ID, "timePatterns", true); 52448 this.timePattern = new XFAObjectArray(4); 52449 } 52450} 52451class TypeFace extends XFAObject { 52452 constructor(attributes) { 52453 super(LOCALE_SET_NS_ID, "typeFace", true); 52454 this.name = attributes.name | ""; 52455 } 52456} 52457class TypeFaces extends XFAObject { 52458 constructor(attributes) { 52459 super(LOCALE_SET_NS_ID, "typeFaces", true); 52460 this.typeFace = new XFAObjectArray(); 52461 } 52462} 52463class LocaleSetNamespace { 52464 static [$buildXFAObject](name, attributes) { 52465 if (LocaleSetNamespace.hasOwnProperty(name)) { 52466 return LocaleSetNamespace[name](attributes); 52467 } 52468 return undefined; 52469 } 52470 static calendarSymbols(attrs) { 52471 return new CalendarSymbols(attrs); 52472 } 52473 static currencySymbol(attrs) { 52474 return new CurrencySymbol(attrs); 52475 } 52476 static currencySymbols(attrs) { 52477 return new CurrencySymbols(attrs); 52478 } 52479 static datePattern(attrs) { 52480 return new DatePattern(attrs); 52481 } 52482 static datePatterns(attrs) { 52483 return new DatePatterns(attrs); 52484 } 52485 static dateTimeSymbols(attrs) { 52486 return new DateTimeSymbols(attrs); 52487 } 52488 static day(attrs) { 52489 return new Day(attrs); 52490 } 52491 static dayNames(attrs) { 52492 return new DayNames(attrs); 52493 } 52494 static era(attrs) { 52495 return new Era(attrs); 52496 } 52497 static eraNames(attrs) { 52498 return new EraNames(attrs); 52499 } 52500 static locale(attrs) { 52501 return new locale_set_Locale(attrs); 52502 } 52503 static localeSet(attrs) { 52504 return new locale_set_LocaleSet(attrs); 52505 } 52506 static meridiem(attrs) { 52507 return new Meridiem(attrs); 52508 } 52509 static meridiemNames(attrs) { 52510 return new MeridiemNames(attrs); 52511 } 52512 static month(attrs) { 52513 return new Month(attrs); 52514 } 52515 static monthNames(attrs) { 52516 return new MonthNames(attrs); 52517 } 52518 static numberPattern(attrs) { 52519 return new NumberPattern(attrs); 52520 } 52521 static numberPatterns(attrs) { 52522 return new NumberPatterns(attrs); 52523 } 52524 static numberSymbol(attrs) { 52525 return new NumberSymbol(attrs); 52526 } 52527 static numberSymbols(attrs) { 52528 return new NumberSymbols(attrs); 52529 } 52530 static timePattern(attrs) { 52531 return new TimePattern(attrs); 52532 } 52533 static timePatterns(attrs) { 52534 return new TimePatterns(attrs); 52535 } 52536 static typeFace(attrs) { 52537 return new TypeFace(attrs); 52538 } 52539 static typeFaces(attrs) { 52540 return new TypeFaces(attrs); 52541 } 52542} 52543 52544;// ./src/core/xfa/signature.js 52545 52546 52547const SIGNATURE_NS_ID = NamespaceIds.signature.id; 52548class signature_Signature extends XFAObject { 52549 constructor(attributes) { 52550 super(SIGNATURE_NS_ID, "signature", true); 52551 } 52552} 52553class SignatureNamespace { 52554 static [$buildXFAObject](name, attributes) { 52555 if (SignatureNamespace.hasOwnProperty(name)) { 52556 return SignatureNamespace[name](attributes); 52557 } 52558 return undefined; 52559 } 52560 static signature(attributes) { 52561 return new signature_Signature(attributes); 52562 } 52563} 52564 52565;// ./src/core/xfa/stylesheet.js 52566 52567 52568const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id; 52569class Stylesheet extends XFAObject { 52570 constructor(attributes) { 52571 super(STYLESHEET_NS_ID, "stylesheet", true); 52572 } 52573} 52574class StylesheetNamespace { 52575 static [$buildXFAObject](name, attributes) { 52576 if (StylesheetNamespace.hasOwnProperty(name)) { 52577 return StylesheetNamespace[name](attributes); 52578 } 52579 return undefined; 52580 } 52581 static stylesheet(attributes) { 52582 return new Stylesheet(attributes); 52583 } 52584} 52585 52586;// ./src/core/xfa/xdp.js 52587 52588 52589 52590const XDP_NS_ID = NamespaceIds.xdp.id; 52591class xdp_Xdp extends XFAObject { 52592 constructor(attributes) { 52593 super(XDP_NS_ID, "xdp", true); 52594 this.uuid = attributes.uuid || ""; 52595 this.timeStamp = attributes.timeStamp || ""; 52596 this.config = null; 52597 this.connectionSet = null; 52598 this.datasets = null; 52599 this.localeSet = null; 52600 this.stylesheet = new XFAObjectArray(); 52601 this.template = null; 52602 } 52603 [$onChildCheck](child) { 52604 const ns = NamespaceIds[child[$nodeName]]; 52605 return ns && child[$namespaceId] === ns.id; 52606 } 52607} 52608class XdpNamespace { 52609 static [$buildXFAObject](name, attributes) { 52610 if (XdpNamespace.hasOwnProperty(name)) { 52611 return XdpNamespace[name](attributes); 52612 } 52613 return undefined; 52614 } 52615 static xdp(attributes) { 52616 return new xdp_Xdp(attributes); 52617 } 52618} 52619 52620;// ./src/core/xfa/xhtml.js 52621 52622 52623 52624 52625 52626 52627 52628 52629 52630 52631 52632 52633 52634 52635 52636const XHTML_NS_ID = NamespaceIds.xhtml.id; 52637const $richText = Symbol(); 52638const 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"]); 52639const 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) => { 52640 value = original.fontSize = Math.abs(getMeasurement(value)); 52641 return measureToString(0.99 * value); 52642}], ["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))]]); 52643const spacesRegExp = /\s+/g; 52644const crlfRegExp = /[\r\n]+/g; 52645const crlfForRichTextRegExp = /\r\n?/g; 52646function mapStyle(styleStr, node, richText) { 52647 const style = Object.create(null); 52648 if (!styleStr) { 52649 return style; 52650 } 52651 const original = Object.create(null); 52652 for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) { 52653 const mapping = StyleMapping.get(key); 52654 if (mapping === "") { 52655 continue; 52656 } 52657 let newValue = value; 52658 if (mapping) { 52659 newValue = typeof mapping === "string" ? mapping : mapping(value, original); 52660 } 52661 if (key.endsWith("scale")) { 52662 style.transform = style.transform ? `${style[key]} ${newValue}` : newValue; 52663 } else { 52664 style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue; 52665 } 52666 } 52667 if (style.fontFamily) { 52668 setFontFamily({ 52669 typeface: style.fontFamily, 52670 weight: style.fontWeight || "normal", 52671 posture: style.fontStyle || "normal", 52672 size: original.fontSize || 0 52673 }, node, node[$globalData].fontFinder, style); 52674 } 52675 if (richText && style.verticalAlign && style.verticalAlign !== "0px" && style.fontSize) { 52676 const SUB_SUPER_SCRIPT_FACTOR = 0.583; 52677 const VERTICAL_FACTOR = 0.333; 52678 const fontSize = getMeasurement(style.fontSize); 52679 style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR); 52680 style.verticalAlign = measureToString(Math.sign(getMeasurement(style.verticalAlign)) * fontSize * VERTICAL_FACTOR); 52681 } 52682 if (richText && style.fontSize) { 52683 style.fontSize = `calc(${style.fontSize} * var(--scale-factor))`; 52684 } 52685 fixTextIndent(style); 52686 return style; 52687} 52688function checkStyle(node) { 52689 if (!node.style) { 52690 return ""; 52691 } 52692 return node.style.trim().split(/\s*;\s*/).filter(s => !!s).map(s => s.split(/\s*:\s*/, 2)).filter(([key, value]) => { 52693 if (key === "font-family") { 52694 node[$globalData].usedTypefaces.add(value); 52695 } 52696 return VALID_STYLES.has(key); 52697 }).map(kv => kv.join(":")).join(";"); 52698} 52699const NoWhites = new Set(["body", "html"]); 52700class XhtmlObject extends XmlObject { 52701 constructor(attributes, name) { 52702 super(XHTML_NS_ID, name); 52703 this[$richText] = false; 52704 this.style = attributes.style || ""; 52705 } 52706 [$clean](builder) { 52707 super[$clean](builder); 52708 this.style = checkStyle(this); 52709 } 52710 [$acceptWhitespace]() { 52711 return !NoWhites.has(this[$nodeName]); 52712 } 52713 [$onText](str, richText = false) { 52714 if (!richText) { 52715 str = str.replaceAll(crlfRegExp, ""); 52716 if (!this.style.includes("xfa-spacerun:yes")) { 52717 str = str.replaceAll(spacesRegExp, " "); 52718 } 52719 } else { 52720 this[$richText] = true; 52721 } 52722 if (str) { 52723 this[$content] += str; 52724 } 52725 } 52726 [$pushGlyphs](measure, mustPop = true) { 52727 const xfaFont = Object.create(null); 52728 const margin = { 52729 top: NaN, 52730 bottom: NaN, 52731 left: NaN, 52732 right: NaN 52733 }; 52734 let lineHeight = null; 52735 for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) { 52736 switch (key) { 52737 case "font-family": 52738 xfaFont.typeface = stripQuotes(value); 52739 break; 52740 case "font-size": 52741 xfaFont.size = getMeasurement(value); 52742 break; 52743 case "font-weight": 52744 xfaFont.weight = value; 52745 break; 52746 case "font-style": 52747 xfaFont.posture = value; 52748 break; 52749 case "letter-spacing": 52750 xfaFont.letterSpacing = getMeasurement(value); 52751 break; 52752 case "margin": 52753 const values = value.split(/ \t/).map(x => getMeasurement(x)); 52754 switch (values.length) { 52755 case 1: 52756 margin.top = margin.bottom = margin.left = margin.right = values[0]; 52757 break; 52758 case 2: 52759 margin.top = margin.bottom = values[0]; 52760 margin.left = margin.right = values[1]; 52761 break; 52762 case 3: 52763 margin.top = values[0]; 52764 margin.bottom = values[2]; 52765 margin.left = margin.right = values[1]; 52766 break; 52767 case 4: 52768 margin.top = values[0]; 52769 margin.left = values[1]; 52770 margin.bottom = values[2]; 52771 margin.right = values[3]; 52772 break; 52773 } 52774 break; 52775 case "margin-top": 52776 margin.top = getMeasurement(value); 52777 break; 52778 case "margin-bottom": 52779 margin.bottom = getMeasurement(value); 52780 break; 52781 case "margin-left": 52782 margin.left = getMeasurement(value); 52783 break; 52784 case "margin-right": 52785 margin.right = getMeasurement(value); 52786 break; 52787 case "line-height": 52788 lineHeight = getMeasurement(value); 52789 break; 52790 } 52791 } 52792 measure.pushData(xfaFont, margin, lineHeight); 52793 if (this[$content]) { 52794 measure.addString(this[$content]); 52795 } else { 52796 for (const child of this[$getChildren]()) { 52797 if (child[$nodeName] === "#text") { 52798 measure.addString(child[$content]); 52799 continue; 52800 } 52801 child[$pushGlyphs](measure); 52802 } 52803 } 52804 if (mustPop) { 52805 measure.popFont(); 52806 } 52807 } 52808 [$toHTML](availableSpace) { 52809 const children = []; 52810 this[$extra] = { 52811 children 52812 }; 52813 this[$childrenToHTML]({}); 52814 if (children.length === 0 && !this[$content]) { 52815 return HTMLResult.EMPTY; 52816 } 52817 let value; 52818 if (this[$richText]) { 52819 value = this[$content] ? this[$content].replaceAll(crlfForRichTextRegExp, "\n") : undefined; 52820 } else { 52821 value = this[$content] || undefined; 52822 } 52823 return HTMLResult.success({ 52824 name: this[$nodeName], 52825 attributes: { 52826 href: this.href, 52827 style: mapStyle(this.style, this, this[$richText]) 52828 }, 52829 children, 52830 value 52831 }); 52832 } 52833} 52834class A extends XhtmlObject { 52835 constructor(attributes) { 52836 super(attributes, "a"); 52837 this.href = fixURL(attributes.href) || ""; 52838 } 52839} 52840class B extends XhtmlObject { 52841 constructor(attributes) { 52842 super(attributes, "b"); 52843 } 52844 [$pushGlyphs](measure) { 52845 measure.pushFont({ 52846 weight: "bold" 52847 }); 52848 super[$pushGlyphs](measure); 52849 measure.popFont(); 52850 } 52851} 52852class Body extends XhtmlObject { 52853 constructor(attributes) { 52854 super(attributes, "body"); 52855 } 52856 [$toHTML](availableSpace) { 52857 const res = super[$toHTML](availableSpace); 52858 const { 52859 html 52860 } = res; 52861 if (!html) { 52862 return HTMLResult.EMPTY; 52863 } 52864 html.name = "div"; 52865 html.attributes.class = ["xfaRich"]; 52866 return res; 52867 } 52868} 52869class Br extends XhtmlObject { 52870 constructor(attributes) { 52871 super(attributes, "br"); 52872 } 52873 [$text]() { 52874 return "\n"; 52875 } 52876 [$pushGlyphs](measure) { 52877 measure.addString("\n"); 52878 } 52879 [$toHTML](availableSpace) { 52880 return HTMLResult.success({ 52881 name: "br" 52882 }); 52883 } 52884} 52885class Html extends XhtmlObject { 52886 constructor(attributes) { 52887 super(attributes, "html"); 52888 } 52889 [$toHTML](availableSpace) { 52890 const children = []; 52891 this[$extra] = { 52892 children 52893 }; 52894 this[$childrenToHTML]({}); 52895 if (children.length === 0) { 52896 return HTMLResult.success({ 52897 name: "div", 52898 attributes: { 52899 class: ["xfaRich"], 52900 style: {} 52901 }, 52902 value: this[$content] || "" 52903 }); 52904 } 52905 if (children.length === 1) { 52906 const child = children[0]; 52907 if (child.attributes?.class.includes("xfaRich")) { 52908 return HTMLResult.success(child); 52909 } 52910 } 52911 return HTMLResult.success({ 52912 name: "div", 52913 attributes: { 52914 class: ["xfaRich"], 52915 style: {} 52916 }, 52917 children 52918 }); 52919 } 52920} 52921class I extends XhtmlObject { 52922 constructor(attributes) { 52923 super(attributes, "i"); 52924 } 52925 [$pushGlyphs](measure) { 52926 measure.pushFont({ 52927 posture: "italic" 52928 }); 52929 super[$pushGlyphs](measure); 52930 measure.popFont(); 52931 } 52932} 52933class Li extends XhtmlObject { 52934 constructor(attributes) { 52935 super(attributes, "li"); 52936 } 52937} 52938class Ol extends XhtmlObject { 52939 constructor(attributes) { 52940 super(attributes, "ol"); 52941 } 52942} 52943class P extends XhtmlObject { 52944 constructor(attributes) { 52945 super(attributes, "p"); 52946 } 52947 [$pushGlyphs](measure) { 52948 super[$pushGlyphs](measure, false); 52949 measure.addString("\n"); 52950 measure.addPara(); 52951 measure.popFont(); 52952 } 52953 [$text]() { 52954 const siblings = this[$getParent]()[$getChildren](); 52955 if (siblings.at(-1) === this) { 52956 return super[$text](); 52957 } 52958 return super[$text]() + "\n"; 52959 } 52960} 52961class Span extends XhtmlObject { 52962 constructor(attributes) { 52963 super(attributes, "span"); 52964 } 52965} 52966class Sub extends XhtmlObject { 52967 constructor(attributes) { 52968 super(attributes, "sub"); 52969 } 52970} 52971class Sup extends XhtmlObject { 52972 constructor(attributes) { 52973 super(attributes, "sup"); 52974 } 52975} 52976class Ul extends XhtmlObject { 52977 constructor(attributes) { 52978 super(attributes, "ul"); 52979 } 52980} 52981class XhtmlNamespace { 52982 static [$buildXFAObject](name, attributes) { 52983 if (XhtmlNamespace.hasOwnProperty(name)) { 52984 return XhtmlNamespace[name](attributes); 52985 } 52986 return undefined; 52987 } 52988 static a(attributes) { 52989 return new A(attributes); 52990 } 52991 static b(attributes) { 52992 return new B(attributes); 52993 } 52994 static body(attributes) { 52995 return new Body(attributes); 52996 } 52997 static br(attributes) { 52998 return new Br(attributes); 52999 } 53000 static html(attributes) { 53001 return new Html(attributes); 53002 } 53003 static i(attributes) { 53004 return new I(attributes); 53005 } 53006 static li(attributes) { 53007 return new Li(attributes); 53008 } 53009 static ol(attributes) { 53010 return new Ol(attributes); 53011 } 53012 static p(attributes) { 53013 return new P(attributes); 53014 } 53015 static span(attributes) { 53016 return new Span(attributes); 53017 } 53018 static sub(attributes) { 53019 return new Sub(attributes); 53020 } 53021 static sup(attributes) { 53022 return new Sup(attributes); 53023 } 53024 static ul(attributes) { 53025 return new Ul(attributes); 53026 } 53027} 53028 53029;// ./src/core/xfa/setup.js 53030 53031 53032 53033 53034 53035 53036 53037 53038 53039const NamespaceSetUp = { 53040 config: ConfigNamespace, 53041 connection: ConnectionSetNamespace, 53042 datasets: DatasetsNamespace, 53043 localeSet: LocaleSetNamespace, 53044 signature: SignatureNamespace, 53045 stylesheet: StylesheetNamespace, 53046 template: TemplateNamespace, 53047 xdp: XdpNamespace, 53048 xhtml: XhtmlNamespace 53049}; 53050 53051;// ./src/core/xfa/unknown.js 53052 53053 53054class UnknownNamespace { 53055 constructor(nsId) { 53056 this.namespaceId = nsId; 53057 } 53058 [$buildXFAObject](name, attributes) { 53059 return new XmlObject(this.namespaceId, name, attributes); 53060 } 53061} 53062 53063;// ./src/core/xfa/builder.js 53064 53065 53066 53067 53068 53069 53070 53071 53072 53073 53074 53075class Root extends XFAObject { 53076 constructor(ids) { 53077 super(-1, "root", Object.create(null)); 53078 this.element = null; 53079 this[$ids] = ids; 53080 } 53081 [$onChild](child) { 53082 this.element = child; 53083 return true; 53084 } 53085 [$finalize]() { 53086 super[$finalize](); 53087 if (this.element.template instanceof Template) { 53088 this[$ids].set($root, this.element); 53089 this.element.template[$resolvePrototypes](this[$ids]); 53090 this.element.template[$ids] = this[$ids]; 53091 } 53092 } 53093} 53094class Empty extends XFAObject { 53095 constructor() { 53096 super(-1, "", Object.create(null)); 53097 } 53098 [$onChild](_) { 53099 return false; 53100 } 53101} 53102class Builder { 53103 constructor(rootNameSpace = null) { 53104 this._namespaceStack = []; 53105 this._nsAgnosticLevel = 0; 53106 this._namespacePrefixes = new Map(); 53107 this._namespaces = new Map(); 53108 this._nextNsId = Math.max(...Object.values(NamespaceIds).map(({ 53109 id 53110 }) => id)); 53111 this._currentNamespace = rootNameSpace || new UnknownNamespace(++this._nextNsId); 53112 } 53113 buildRoot(ids) { 53114 return new Root(ids); 53115 } 53116 build({ 53117 nsPrefix, 53118 name, 53119 attributes, 53120 namespace, 53121 prefixes 53122 }) { 53123 const hasNamespaceDef = namespace !== null; 53124 if (hasNamespaceDef) { 53125 this._namespaceStack.push(this._currentNamespace); 53126 this._currentNamespace = this._searchNamespace(namespace); 53127 } 53128 if (prefixes) { 53129 this._addNamespacePrefix(prefixes); 53130 } 53131 if (attributes.hasOwnProperty($nsAttributes)) { 53132 const dataTemplate = NamespaceSetUp.datasets; 53133 const nsAttrs = attributes[$nsAttributes]; 53134 let xfaAttrs = null; 53135 for (const [ns, attrs] of Object.entries(nsAttrs)) { 53136 const nsToUse = this._getNamespaceToUse(ns); 53137 if (nsToUse === dataTemplate) { 53138 xfaAttrs = { 53139 xfa: attrs 53140 }; 53141 break; 53142 } 53143 } 53144 if (xfaAttrs) { 53145 attributes[$nsAttributes] = xfaAttrs; 53146 } else { 53147 delete attributes[$nsAttributes]; 53148 } 53149 } 53150 const namespaceToUse = this._getNamespaceToUse(nsPrefix); 53151 const node = namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty(); 53152 if (node[$isNsAgnostic]()) { 53153 this._nsAgnosticLevel++; 53154 } 53155 if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) { 53156 node[$cleanup] = { 53157 hasNamespace: hasNamespaceDef, 53158 prefixes, 53159 nsAgnostic: node[$isNsAgnostic]() 53160 }; 53161 } 53162 return node; 53163 } 53164 isNsAgnostic() { 53165 return this._nsAgnosticLevel > 0; 53166 } 53167 _searchNamespace(nsName) { 53168 let ns = this._namespaces.get(nsName); 53169 if (ns) { 53170 return ns; 53171 } 53172 for (const [name, { 53173 check 53174 }] of Object.entries(NamespaceIds)) { 53175 if (check(nsName)) { 53176 ns = NamespaceSetUp[name]; 53177 if (ns) { 53178 this._namespaces.set(nsName, ns); 53179 return ns; 53180 } 53181 break; 53182 } 53183 } 53184 ns = new UnknownNamespace(++this._nextNsId); 53185 this._namespaces.set(nsName, ns); 53186 return ns; 53187 } 53188 _addNamespacePrefix(prefixes) { 53189 for (const { 53190 prefix, 53191 value 53192 } of prefixes) { 53193 const namespace = this._searchNamespace(value); 53194 let prefixStack = this._namespacePrefixes.get(prefix); 53195 if (!prefixStack) { 53196 prefixStack = []; 53197 this._namespacePrefixes.set(prefix, prefixStack); 53198 } 53199 prefixStack.push(namespace); 53200 } 53201 } 53202 _getNamespaceToUse(prefix) { 53203 if (!prefix) { 53204 return this._currentNamespace; 53205 } 53206 const prefixStack = this._namespacePrefixes.get(prefix); 53207 if (prefixStack?.length > 0) { 53208 return prefixStack.at(-1); 53209 } 53210 warn(`Unknown namespace prefix: ${prefix}.`); 53211 return null; 53212 } 53213 clean(data) { 53214 const { 53215 hasNamespace, 53216 prefixes, 53217 nsAgnostic 53218 } = data; 53219 if (hasNamespace) { 53220 this._currentNamespace = this._namespaceStack.pop(); 53221 } 53222 if (prefixes) { 53223 prefixes.forEach(({ 53224 prefix 53225 }) => { 53226 this._namespacePrefixes.get(prefix).pop(); 53227 }); 53228 } 53229 if (nsAgnostic) { 53230 this._nsAgnosticLevel--; 53231 } 53232 } 53233} 53234 53235;// ./src/core/xfa/parser.js 53236 53237 53238 53239 53240 53241 53242 53243 53244 53245 53246 53247 53248class XFAParser extends XMLParserBase { 53249 constructor(rootNameSpace = null, richText = false) { 53250 super(); 53251 this._builder = new Builder(rootNameSpace); 53252 this._stack = []; 53253 this._globalData = { 53254 usedTypefaces: new Set() 53255 }; 53256 this._ids = new Map(); 53257 this._current = this._builder.buildRoot(this._ids); 53258 this._errorCode = XMLParserErrorCode.NoError; 53259 this._whiteRegex = /^\s+$/; 53260 this._nbsps = /\xa0+/g; 53261 this._richText = richText; 53262 } 53263 parse(data) { 53264 this.parseXml(data); 53265 if (this._errorCode !== XMLParserErrorCode.NoError) { 53266 return undefined; 53267 } 53268 this._current[$finalize](); 53269 return this._current.element; 53270 } 53271 onText(text) { 53272 text = text.replace(this._nbsps, match => match.slice(1) + " "); 53273 if (this._richText || this._current[$acceptWhitespace]()) { 53274 this._current[$onText](text, this._richText); 53275 return; 53276 } 53277 if (this._whiteRegex.test(text)) { 53278 return; 53279 } 53280 this._current[$onText](text.trim()); 53281 } 53282 onCdata(text) { 53283 this._current[$onText](text); 53284 } 53285 _mkAttributes(attributes, tagName) { 53286 let namespace = null; 53287 let prefixes = null; 53288 const attributeObj = Object.create({}); 53289 for (const { 53290 name, 53291 value 53292 } of attributes) { 53293 if (name === "xmlns") { 53294 if (!namespace) { 53295 namespace = value; 53296 } else { 53297 warn(`XFA - multiple namespace definition in <${tagName}>`); 53298 } 53299 } else if (name.startsWith("xmlns:")) { 53300 const prefix = name.substring("xmlns:".length); 53301 if (!prefixes) { 53302 prefixes = []; 53303 } 53304 prefixes.push({ 53305 prefix, 53306 value 53307 }); 53308 } else { 53309 const i = name.indexOf(":"); 53310 if (i === -1) { 53311 attributeObj[name] = value; 53312 } else { 53313 let nsAttrs = attributeObj[$nsAttributes]; 53314 if (!nsAttrs) { 53315 nsAttrs = attributeObj[$nsAttributes] = Object.create(null); 53316 } 53317 const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)]; 53318 const attrs = nsAttrs[ns] ||= Object.create(null); 53319 attrs[attrName] = value; 53320 } 53321 } 53322 } 53323 return [namespace, prefixes, attributeObj]; 53324 } 53325 _getNameAndPrefix(name, nsAgnostic) { 53326 const i = name.indexOf(":"); 53327 if (i === -1) { 53328 return [name, null]; 53329 } 53330 return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)]; 53331 } 53332 onBeginElement(tagName, attributes, isEmpty) { 53333 const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName); 53334 const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic()); 53335 const node = this._builder.build({ 53336 nsPrefix, 53337 name, 53338 attributes: attributesObj, 53339 namespace, 53340 prefixes 53341 }); 53342 node[$globalData] = this._globalData; 53343 if (isEmpty) { 53344 node[$finalize](); 53345 if (this._current[$onChild](node)) { 53346 node[$setId](this._ids); 53347 } 53348 node[$clean](this._builder); 53349 return; 53350 } 53351 this._stack.push(this._current); 53352 this._current = node; 53353 } 53354 onEndElement(name) { 53355 const node = this._current; 53356 if (node[$isCDATAXml]() && typeof node[$content] === "string") { 53357 const parser = new XFAParser(); 53358 parser._globalData = this._globalData; 53359 const root = parser.parse(node[$content]); 53360 node[$content] = null; 53361 node[$onChild](root); 53362 } 53363 node[$finalize](); 53364 this._current = this._stack.pop(); 53365 if (this._current[$onChild](node)) { 53366 node[$setId](this._ids); 53367 } 53368 node[$clean](this._builder); 53369 } 53370 onError(code) { 53371 this._errorCode = code; 53372 } 53373} 53374 53375;// ./src/core/xfa/factory.js 53376 53377 53378 53379 53380 53381 53382 53383 53384 53385 53386 53387 53388 53389class XFAFactory { 53390 constructor(data) { 53391 try { 53392 this.root = new XFAParser().parse(XFAFactory._createDocument(data)); 53393 const binder = new Binder(this.root); 53394 this.form = binder.bind(); 53395 this.dataHandler = new DataHandler(this.root, binder.getData()); 53396 this.form[$globalData].template = this.form; 53397 } catch (e) { 53398 warn(`XFA - an error occurred during parsing and binding: ${e}`); 53399 } 53400 } 53401 isValid() { 53402 return this.root && this.form; 53403 } 53404 _createPagesHelper() { 53405 const iterator = this.form[$toPages](); 53406 return new Promise((resolve, reject) => { 53407 const nextIteration = () => { 53408 try { 53409 const value = iterator.next(); 53410 if (value.done) { 53411 resolve(value.value); 53412 } else { 53413 setTimeout(nextIteration, 0); 53414 } 53415 } catch (e) { 53416 reject(e); 53417 } 53418 }; 53419 setTimeout(nextIteration, 0); 53420 }); 53421 } 53422 async _createPages() { 53423 try { 53424 this.pages = await this._createPagesHelper(); 53425 this.dims = this.pages.children.map(c => { 53426 const { 53427 width, 53428 height 53429 } = c.attributes.style; 53430 return [0, 0, parseInt(width), parseInt(height)]; 53431 }); 53432 } catch (e) { 53433 warn(`XFA - an error occurred during layout: ${e}`); 53434 } 53435 } 53436 getBoundingBox(pageIndex) { 53437 return this.dims[pageIndex]; 53438 } 53439 async getNumPages() { 53440 if (!this.pages) { 53441 await this._createPages(); 53442 } 53443 return this.dims.length; 53444 } 53445 setImages(images) { 53446 this.form[$globalData].images = images; 53447 } 53448 setFonts(fonts) { 53449 this.form[$globalData].fontFinder = new FontFinder(fonts); 53450 const missingFonts = []; 53451 for (let typeface of this.form[$globalData].usedTypefaces) { 53452 typeface = stripQuotes(typeface); 53453 const font = this.form[$globalData].fontFinder.find(typeface); 53454 if (!font) { 53455 missingFonts.push(typeface); 53456 } 53457 } 53458 if (missingFonts.length > 0) { 53459 return missingFonts; 53460 } 53461 return null; 53462 } 53463 appendFonts(fonts, reallyMissingFonts) { 53464 this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts); 53465 } 53466 async getPages() { 53467 if (!this.pages) { 53468 await this._createPages(); 53469 } 53470 const pages = this.pages; 53471 this.pages = null; 53472 return pages; 53473 } 53474 serializeData(storage) { 53475 return this.dataHandler.serialize(storage); 53476 } 53477 static _createDocument(data) { 53478 if (!data["/xdp:xdp"]) { 53479 return data["xdp:xdp"]; 53480 } 53481 return Object.values(data).join(""); 53482 } 53483 static getRichTextAsHtml(rc) { 53484 if (!rc || typeof rc !== "string") { 53485 return null; 53486 } 53487 try { 53488 let root = new XFAParser(XhtmlNamespace, true).parse(rc); 53489 if (!["body", "xhtml"].includes(root[$nodeName])) { 53490 const newRoot = XhtmlNamespace.body({}); 53491 newRoot[$appendChild](root); 53492 root = newRoot; 53493 } 53494 const result = root[$toHTML](); 53495 if (!result.success) { 53496 return null; 53497 } 53498 const { 53499 html 53500 } = result; 53501 const { 53502 attributes 53503 } = html; 53504 if (attributes) { 53505 if (attributes.class) { 53506 attributes.class = attributes.class.filter(attr => !attr.startsWith("xfa")); 53507 } 53508 attributes.dir = "auto"; 53509 } 53510 return { 53511 html, 53512 str: root[$text]() 53513 }; 53514 } catch (e) { 53515 warn(`XFA - an error occurred during parsing of rich text: ${e}`); 53516 } 53517 return null; 53518 } 53519} 53520 53521;// ./src/core/annotation.js 53522 53523 53524 53525 53526 53527 53528 53529 53530 53531 53532 53533 53534 53535 53536 53537 53538 53539 53540 53541 53542 53543 53544 53545 53546 53547 53548 53549 53550class AnnotationFactory { 53551 static createGlobals(pdfManager) { 53552 return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments]) => { 53553 return { 53554 pdfManager, 53555 acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, 53556 xfaDatasets, 53557 structTreeRoot, 53558 baseUrl, 53559 attachments 53560 }; 53561 }, reason => { 53562 warn(`createGlobals: "${reason}".`); 53563 return null; 53564 }); 53565 } 53566 static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageRef) { 53567 const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null; 53568 return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageIndex, pageRef]); 53569 } 53570 static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, pageIndex = null, pageRef = null) { 53571 const dict = xref.fetchIfRef(ref); 53572 if (!(dict instanceof Dict)) { 53573 return undefined; 53574 } 53575 const { 53576 acroForm, 53577 pdfManager 53578 } = annotationGlobals; 53579 const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; 53580 let subtype = dict.get("Subtype"); 53581 subtype = subtype instanceof Name ? subtype.name : null; 53582 const parameters = { 53583 xref, 53584 ref, 53585 dict, 53586 subtype, 53587 id, 53588 annotationGlobals, 53589 collectFields, 53590 orphanFields, 53591 needAppearances: !collectFields && acroForm.get("NeedAppearances") === true, 53592 pageIndex, 53593 evaluatorOptions: pdfManager.evaluatorOptions, 53594 pageRef 53595 }; 53596 switch (subtype) { 53597 case "Link": 53598 return new LinkAnnotation(parameters); 53599 case "Text": 53600 return new TextAnnotation(parameters); 53601 case "Widget": 53602 let fieldType = getInheritableProperty({ 53603 dict, 53604 key: "FT" 53605 }); 53606 fieldType = fieldType instanceof Name ? fieldType.name : null; 53607 switch (fieldType) { 53608 case "Tx": 53609 return new TextWidgetAnnotation(parameters); 53610 case "Btn": 53611 return new ButtonWidgetAnnotation(parameters); 53612 case "Ch": 53613 return new ChoiceWidgetAnnotation(parameters); 53614 case "Sig": 53615 return new SignatureWidgetAnnotation(parameters); 53616 } 53617 warn(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type."); 53618 return new WidgetAnnotation(parameters); 53619 case "Popup": 53620 return new PopupAnnotation(parameters); 53621 case "FreeText": 53622 return new FreeTextAnnotation(parameters); 53623 case "Line": 53624 return new LineAnnotation(parameters); 53625 case "Square": 53626 return new SquareAnnotation(parameters); 53627 case "Circle": 53628 return new CircleAnnotation(parameters); 53629 case "PolyLine": 53630 return new PolylineAnnotation(parameters); 53631 case "Polygon": 53632 return new PolygonAnnotation(parameters); 53633 case "Caret": 53634 return new CaretAnnotation(parameters); 53635 case "Ink": 53636 return new InkAnnotation(parameters); 53637 case "Highlight": 53638 return new HighlightAnnotation(parameters); 53639 case "Underline": 53640 return new UnderlineAnnotation(parameters); 53641 case "Squiggly": 53642 return new SquigglyAnnotation(parameters); 53643 case "StrikeOut": 53644 return new StrikeOutAnnotation(parameters); 53645 case "Stamp": 53646 return new StampAnnotation(parameters); 53647 case "FileAttachment": 53648 return new FileAttachmentAnnotation(parameters); 53649 default: 53650 if (!collectFields) { 53651 if (!subtype) { 53652 warn("Annotation is missing the required /Subtype."); 53653 } else { 53654 warn(`Unimplemented annotation type "${subtype}", ` + "falling back to base annotation."); 53655 } 53656 } 53657 return new Annotation(parameters); 53658 } 53659 } 53660 static async _getPageIndex(xref, ref, pdfManager) { 53661 try { 53662 const annotDict = await xref.fetchIfRefAsync(ref); 53663 if (!(annotDict instanceof Dict)) { 53664 return -1; 53665 } 53666 const pageRef = annotDict.getRaw("P"); 53667 if (pageRef instanceof Ref) { 53668 try { 53669 const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]); 53670 return pageIndex; 53671 } catch (ex) { 53672 info(`_getPageIndex -- not a valid page reference: "${ex}".`); 53673 } 53674 } 53675 if (annotDict.has("Kids")) { 53676 return -1; 53677 } 53678 const numPages = await pdfManager.ensureDoc("numPages"); 53679 for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { 53680 const page = await pdfManager.getPage(pageIndex); 53681 const annotations = await pdfManager.ensure(page, "annotations"); 53682 for (const annotRef of annotations) { 53683 if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) { 53684 return pageIndex; 53685 } 53686 } 53687 } 53688 } catch (ex) { 53689 warn(`_getPageIndex: "${ex}".`); 53690 } 53691 return -1; 53692 } 53693 static generateImages(annotations, xref, isOffscreenCanvasSupported) { 53694 if (!isOffscreenCanvasSupported) { 53695 warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images."); 53696 return null; 53697 } 53698 let imagePromises; 53699 for (const { 53700 bitmapId, 53701 bitmap 53702 } of annotations) { 53703 if (!bitmap) { 53704 continue; 53705 } 53706 imagePromises ||= new Map(); 53707 imagePromises.set(bitmapId, StampAnnotation.createImage(bitmap, xref)); 53708 } 53709 return imagePromises; 53710 } 53711 static async saveNewAnnotations(evaluator, task, annotations, imagePromises, changes) { 53712 const xref = evaluator.xref; 53713 let baseFontRef; 53714 const promises = []; 53715 const { 53716 isOffscreenCanvasSupported 53717 } = evaluator.options; 53718 for (const annotation of annotations) { 53719 if (annotation.deleted) { 53720 continue; 53721 } 53722 switch (annotation.annotationType) { 53723 case AnnotationEditorType.FREETEXT: 53724 if (!baseFontRef) { 53725 const baseFont = new Dict(xref); 53726 baseFont.set("BaseFont", Name.get("Helvetica")); 53727 baseFont.set("Type", Name.get("Font")); 53728 baseFont.set("Subtype", Name.get("Type1")); 53729 baseFont.set("Encoding", Name.get("WinAnsiEncoding")); 53730 baseFontRef = xref.getNewTemporaryRef(); 53731 changes.put(baseFontRef, { 53732 data: baseFont 53733 }); 53734 } 53735 promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, { 53736 evaluator, 53737 task, 53738 baseFontRef 53739 })); 53740 break; 53741 case AnnotationEditorType.HIGHLIGHT: 53742 if (annotation.quadPoints) { 53743 promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes)); 53744 } else { 53745 promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); 53746 } 53747 break; 53748 case AnnotationEditorType.INK: 53749 promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); 53750 break; 53751 case AnnotationEditorType.STAMP: 53752 const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; 53753 if (image?.imageStream) { 53754 const { 53755 imageStream, 53756 smaskStream 53757 } = image; 53758 if (smaskStream) { 53759 const smaskRef = xref.getNewTemporaryRef(); 53760 changes.put(smaskRef, { 53761 data: smaskStream 53762 }); 53763 imageStream.dict.set("SMask", smaskRef); 53764 } 53765 const imageRef = image.imageRef = xref.getNewTemporaryRef(); 53766 changes.put(imageRef, { 53767 data: imageStream 53768 }); 53769 image.imageStream = image.smaskStream = null; 53770 } 53771 promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, { 53772 image 53773 })); 53774 break; 53775 } 53776 } 53777 return { 53778 annotations: await Promise.all(promises) 53779 }; 53780 } 53781 static async printNewAnnotations(annotationGlobals, evaluator, task, annotations, imagePromises) { 53782 if (!annotations) { 53783 return null; 53784 } 53785 const { 53786 options, 53787 xref 53788 } = evaluator; 53789 const promises = []; 53790 for (const annotation of annotations) { 53791 if (annotation.deleted) { 53792 continue; 53793 } 53794 switch (annotation.annotationType) { 53795 case AnnotationEditorType.FREETEXT: 53796 promises.push(FreeTextAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { 53797 evaluator, 53798 task, 53799 evaluatorOptions: options 53800 })); 53801 break; 53802 case AnnotationEditorType.HIGHLIGHT: 53803 if (annotation.quadPoints) { 53804 promises.push(HighlightAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { 53805 evaluatorOptions: options 53806 })); 53807 } else { 53808 promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { 53809 evaluatorOptions: options 53810 })); 53811 } 53812 break; 53813 case AnnotationEditorType.INK: 53814 promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { 53815 evaluatorOptions: options 53816 })); 53817 break; 53818 case AnnotationEditorType.STAMP: 53819 const image = options.isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; 53820 if (image?.imageStream) { 53821 const { 53822 imageStream, 53823 smaskStream 53824 } = image; 53825 if (smaskStream) { 53826 imageStream.dict.set("SMask", smaskStream); 53827 } 53828 image.imageRef = new JpegStream(imageStream, imageStream.length); 53829 image.imageStream = image.smaskStream = null; 53830 } 53831 promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { 53832 image, 53833 evaluatorOptions: options 53834 })); 53835 break; 53836 } 53837 } 53838 return Promise.all(promises); 53839 } 53840} 53841function getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) { 53842 if (!Array.isArray(color)) { 53843 return defaultColor; 53844 } 53845 const rgbColor = defaultColor || new Uint8ClampedArray(3); 53846 switch (color.length) { 53847 case 0: 53848 return null; 53849 case 1: 53850 ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); 53851 return rgbColor; 53852 case 3: 53853 ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); 53854 return rgbColor; 53855 case 4: 53856 ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); 53857 return rgbColor; 53858 default: 53859 return defaultColor; 53860 } 53861} 53862function getPdfColorArray(color) { 53863 return Array.from(color, c => c / 255); 53864} 53865function getQuadPoints(dict, rect) { 53866 const quadPoints = dict.getArray("QuadPoints"); 53867 if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { 53868 return null; 53869 } 53870 const newQuadPoints = new Float32Array(quadPoints.length); 53871 for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { 53872 const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8); 53873 const minX = Math.min(x1, x2, x3, x4); 53874 const maxX = Math.max(x1, x2, x3, x4); 53875 const minY = Math.min(y1, y2, y3, y4); 53876 const maxY = Math.max(y1, y2, y3, y4); 53877 if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) { 53878 return null; 53879 } 53880 newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i); 53881 } 53882 return newQuadPoints; 53883} 53884function getTransformMatrix(rect, bbox, matrix) { 53885 const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(bbox, matrix); 53886 if (minX === maxX || minY === maxY) { 53887 return [1, 0, 0, 1, rect[0], rect[1]]; 53888 } 53889 const xRatio = (rect[2] - rect[0]) / (maxX - minX); 53890 const yRatio = (rect[3] - rect[1]) / (maxY - minY); 53891 return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio]; 53892} 53893class Annotation { 53894 constructor(params) { 53895 const { 53896 dict, 53897 xref, 53898 annotationGlobals, 53899 ref, 53900 orphanFields 53901 } = params; 53902 const parentRef = orphanFields?.get(ref); 53903 if (parentRef) { 53904 dict.set("Parent", parentRef); 53905 } 53906 this.setTitle(dict.get("T")); 53907 this.setContents(dict.get("Contents")); 53908 this.setModificationDate(dict.get("M")); 53909 this.setFlags(dict.get("F")); 53910 this.setRectangle(dict.getArray("Rect")); 53911 this.setColor(dict.getArray("C")); 53912 this.setBorderStyle(dict); 53913 this.setAppearance(dict); 53914 this.setOptionalContent(dict); 53915 const MK = dict.get("MK"); 53916 this.setBorderAndBackgroundColors(MK); 53917 this.setRotation(MK, dict); 53918 this.ref = params.ref instanceof Ref ? params.ref : null; 53919 this._streams = []; 53920 if (this.appearance) { 53921 this._streams.push(this.appearance); 53922 } 53923 const isLocked = !!(this.flags & AnnotationFlag.LOCKED); 53924 const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS); 53925 this.data = { 53926 annotationFlags: this.flags, 53927 borderStyle: this.borderStyle, 53928 color: this.color, 53929 backgroundColor: this.backgroundColor, 53930 borderColor: this.borderColor, 53931 rotation: this.rotation, 53932 contentsObj: this._contents, 53933 hasAppearance: !!this.appearance, 53934 id: params.id, 53935 modificationDate: this.modificationDate, 53936 rect: this.rectangle, 53937 subtype: params.subtype, 53938 hasOwnCanvas: false, 53939 noRotate: !!(this.flags & AnnotationFlag.NOROTATE), 53940 noHTML: isLocked && isContentLocked, 53941 isEditable: false, 53942 structParent: -1 53943 }; 53944 if (annotationGlobals.structTreeRoot) { 53945 let structParent = dict.get("StructParent"); 53946 this.data.structParent = structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1; 53947 annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent); 53948 } 53949 if (params.collectFields) { 53950 const kids = dict.get("Kids"); 53951 if (Array.isArray(kids)) { 53952 const kidIds = []; 53953 for (const kid of kids) { 53954 if (kid instanceof Ref) { 53955 kidIds.push(kid.toString()); 53956 } 53957 } 53958 if (kidIds.length !== 0) { 53959 this.data.kidIds = kidIds; 53960 } 53961 } 53962 this.data.actions = collectActions(xref, dict, AnnotationActionEventType); 53963 this.data.fieldName = this._constructFieldName(dict); 53964 this.data.pageIndex = params.pageIndex; 53965 } 53966 const it = dict.get("IT"); 53967 if (it instanceof Name) { 53968 this.data.it = it.name; 53969 } 53970 this._isOffscreenCanvasSupported = params.evaluatorOptions.isOffscreenCanvasSupported; 53971 this._fallbackFontDict = null; 53972 this._needAppearances = false; 53973 } 53974 _hasFlag(flags, flag) { 53975 return !!(flags & flag); 53976 } 53977 _buildFlags(noView, noPrint) { 53978 let { 53979 flags 53980 } = this; 53981 if (noView === undefined) { 53982 if (noPrint === undefined) { 53983 return undefined; 53984 } 53985 if (noPrint) { 53986 return flags & ~AnnotationFlag.PRINT; 53987 } 53988 return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.PRINT; 53989 } 53990 if (noView) { 53991 flags |= AnnotationFlag.PRINT; 53992 if (noPrint) { 53993 return flags & ~AnnotationFlag.NOVIEW | AnnotationFlag.HIDDEN; 53994 } 53995 return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW; 53996 } 53997 flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW); 53998 if (noPrint) { 53999 return flags & ~AnnotationFlag.PRINT; 54000 } 54001 return flags | AnnotationFlag.PRINT; 54002 } 54003 _isViewable(flags) { 54004 return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW); 54005 } 54006 _isPrintable(flags) { 54007 return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE); 54008 } 54009 mustBeViewed(annotationStorage, _renderForms) { 54010 const noView = annotationStorage?.get(this.data.id)?.noView; 54011 if (noView !== undefined) { 54012 return !noView; 54013 } 54014 return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN); 54015 } 54016 mustBePrinted(annotationStorage) { 54017 const noPrint = annotationStorage?.get(this.data.id)?.noPrint; 54018 if (noPrint !== undefined) { 54019 return !noPrint; 54020 } 54021 return this.printable; 54022 } 54023 mustBeViewedWhenEditing(isEditing, modifiedIds = null) { 54024 return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); 54025 } 54026 get viewable() { 54027 if (this.data.quadPoints === null) { 54028 return false;
vendor: 2,422 bytes, lines 54029-54121
54029 } 54030 if (this.flags === 0) { 54031 return true; 54032 } 54033 return this._isViewable(this.flags); 54034 } 54035 get printable() { 54036 if (this.data.quadPoints === null) { 54037 return false; 54038 } 54039 if (this.flags === 0) { 54040 return false; 54041 } 54042 return this._isPrintable(this.flags); 54043 } 54044 _parseStringHelper(data) { 54045 const str = typeof data === "string" ? stringToPDFString(data) : ""; 54046 const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr"; 54047 return { 54048 str, 54049 dir 54050 }; 54051 } 54052 setDefaultAppearance(params) { 54053 const { 54054 dict, 54055 annotationGlobals 54056 } = params; 54057 const defaultAppearance = getInheritableProperty({ 54058 dict, 54059 key: "DA" 54060 }) || annotationGlobals.acroForm.get("DA"); 54061 this._defaultAppearance = typeof defaultAppearance === "string" ? defaultAppearance : ""; 54062 this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance); 54063 } 54064 setTitle(title) { 54065 this._title = this._parseStringHelper(title); 54066 } 54067 setContents(contents) { 54068 this._contents = this._parseStringHelper(contents); 54069 } 54070 setModificationDate(modificationDate) { 54071 this.modificationDate = typeof modificationDate === "string" ? modificationDate : null; 54072 } 54073 setFlags(flags) { 54074 this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0; 54075 if (this.flags & AnnotationFlag.INVISIBLE && this.constructor.name !== "Annotation") { 54076 this.flags ^= AnnotationFlag.INVISIBLE; 54077 } 54078 } 54079 hasFlag(flag) { 54080 return this._hasFlag(this.flags, flag); 54081 } 54082 setRectangle(rectangle) { 54083 this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]); 54084 } 54085 setColor(color) { 54086 this.color = getRgbColor(color); 54087 } 54088 setLineEndings(lineEndings) { 54089 this.lineEndings = ["None", "None"]; 54090 if (Array.isArray(lineEndings) && lineEndings.length === 2) { 54091 for (let i = 0; i < 2; i++) { 54092 const obj = lineEndings[i]; 54093 if (obj instanceof Name) { 54094 switch (obj.name) { 54095 case "None": 54096 continue; 54097 case "Square": 54098 case "Circle": 54099 case "Diamond": 54100 case "OpenArrow": 54101 case "ClosedArrow": 54102 case "Butt": 54103 case "ROpenArrow": 54104 case "RClosedArrow": 54105 case "Slash": 54106 this.lineEndings[i] = obj.name; 54107 continue; 54108 } 54109 } 54110 warn(`Ignoring invalid lineEnding: ${obj}`); 54111 } 54112 } 54113 } 54114 setRotation(mk, dict) { 54115 this.rotation = 0; 54116 let angle = mk instanceof Dict ? mk.get("R") || 0 : dict.get("Rotate") || 0; 54117 if (Number.isInteger(angle) && angle !== 0) { 54118 angle %= 360; 54119 if (angle < 0) { 54120 angle += 360; 54121 }
vendor: 58,371 bytes, lines 54122-55941
54122 if (angle % 90 === 0) { 54123 this.rotation = angle; 54124 } 54125 } 54126 } 54127 setBorderAndBackgroundColors(mk) { 54128 if (mk instanceof Dict) { 54129 this.borderColor = getRgbColor(mk.getArray("BC"), null); 54130 this.backgroundColor = getRgbColor(mk.getArray("BG"), null); 54131 } else { 54132 this.borderColor = this.backgroundColor = null; 54133 } 54134 } 54135 setBorderStyle(borderStyle) { 54136 this.borderStyle = new AnnotationBorderStyle(); 54137 if (!(borderStyle instanceof Dict)) { 54138 return; 54139 } 54140 if (borderStyle.has("BS")) { 54141 const dict = borderStyle.get("BS"); 54142 if (dict instanceof Dict) { 54143 const dictType = dict.get("Type"); 54144 if (!dictType || isName(dictType, "Border")) { 54145 this.borderStyle.setWidth(dict.get("W"), this.rectangle); 54146 this.borderStyle.setStyle(dict.get("S")); 54147 this.borderStyle.setDashArray(dict.getArray("D")); 54148 } 54149 } 54150 } else if (borderStyle.has("Border")) { 54151 const array = borderStyle.getArray("Border"); 54152 if (Array.isArray(array) && array.length >= 3) { 54153 this.borderStyle.setHorizontalCornerRadius(array[0]); 54154 this.borderStyle.setVerticalCornerRadius(array[1]); 54155 this.borderStyle.setWidth(array[2], this.rectangle); 54156 if (array.length === 4) { 54157 this.borderStyle.setDashArray(array[3], true); 54158 } 54159 } 54160 } else { 54161 this.borderStyle.setWidth(0); 54162 } 54163 } 54164 setAppearance(dict) { 54165 this.appearance = null; 54166 const appearanceStates = dict.get("AP"); 54167 if (!(appearanceStates instanceof Dict)) { 54168 return; 54169 } 54170 const normalAppearanceState = appearanceStates.get("N"); 54171 if (normalAppearanceState instanceof BaseStream) { 54172 this.appearance = normalAppearanceState; 54173 return; 54174 } 54175 if (!(normalAppearanceState instanceof Dict)) { 54176 return; 54177 } 54178 const as = dict.get("AS"); 54179 if (!(as instanceof Name) || !normalAppearanceState.has(as.name)) { 54180 return; 54181 } 54182 const appearance = normalAppearanceState.get(as.name); 54183 if (appearance instanceof BaseStream) { 54184 this.appearance = appearance; 54185 } 54186 } 54187 setOptionalContent(dict) { 54188 this.oc = null; 54189 const oc = dict.get("OC"); 54190 if (oc instanceof Name) { 54191 warn("setOptionalContent: Support for /Name-entry is not implemented."); 54192 } else if (oc instanceof Dict) { 54193 this.oc = oc; 54194 } 54195 } 54196 loadResources(keys, appearance) { 54197 return appearance.dict.getAsync("Resources").then(resources => { 54198 if (!resources) { 54199 return undefined; 54200 } 54201 const objectLoader = new ObjectLoader(resources, keys, resources.xref); 54202 return objectLoader.load().then(function () { 54203 return resources; 54204 }); 54205 }); 54206 } 54207 async getOperatorList(evaluator, task, intent, annotationStorage) { 54208 const { 54209 hasOwnCanvas, 54210 id, 54211 rect 54212 } = this.data; 54213 let appearance = this.appearance; 54214 const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); 54215 if (isUsingOwnCanvas && (rect[0] === rect[2] || rect[1] === rect[3])) { 54216 this.data.hasOwnCanvas = false; 54217 return { 54218 opList: new OperatorList(), 54219 separateForm: false, 54220 separateCanvas: false 54221 }; 54222 } 54223 if (!appearance) { 54224 if (!isUsingOwnCanvas) { 54225 return { 54226 opList: new OperatorList(), 54227 separateForm: false, 54228 separateCanvas: false 54229 }; 54230 } 54231 appearance = new StringStream(""); 54232 appearance.dict = new Dict(); 54233 } 54234 const appearanceDict = appearance.dict; 54235 const resources = await this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], appearance); 54236 const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, 1, 1]); 54237 const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX); 54238 const transform = getTransformMatrix(rect, bbox, matrix); 54239 const opList = new OperatorList(); 54240 let optionalContent; 54241 if (this.oc) { 54242 optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); 54243 } 54244 if (optionalContent !== undefined) { 54245 opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); 54246 } 54247 opList.addOp(OPS.beginAnnotation, [id, rect, transform, matrix, isUsingOwnCanvas]); 54248 await evaluator.getOperatorList({ 54249 stream: appearance, 54250 task, 54251 resources, 54252 operatorList: opList, 54253 fallbackFontDict: this._fallbackFontDict 54254 }); 54255 opList.addOp(OPS.endAnnotation, []); 54256 if (optionalContent !== undefined) { 54257 opList.addOp(OPS.endMarkedContent, []); 54258 } 54259 this.reset(); 54260 return { 54261 opList, 54262 separateForm: false, 54263 separateCanvas: isUsingOwnCanvas 54264 }; 54265 } 54266 async save(evaluator, task, annotationStorage, changes) { 54267 return null; 54268 } 54269 get hasTextContent() { 54270 return false; 54271 } 54272 async extractTextContent(evaluator, task, viewBox) { 54273 if (!this.appearance) { 54274 return; 54275 } 54276 const resources = await this.loadResources(["ExtGState", "Font", "Properties", "XObject"], this.appearance); 54277 const text = []; 54278 const buffer = []; 54279 let firstPosition = null; 54280 const sink = { 54281 desiredSize: Math.Infinity, 54282 ready: true, 54283 enqueue(chunk, size) { 54284 for (const item of chunk.items) { 54285 if (item.str === undefined) { 54286 continue; 54287 } 54288 firstPosition ||= item.transform.slice(-2); 54289 buffer.push(item.str); 54290 if (item.hasEOL) { 54291 text.push(buffer.join("").trimEnd()); 54292 buffer.length = 0; 54293 } 54294 } 54295 } 54296 }; 54297 await evaluator.getTextContent({ 54298 stream: this.appearance, 54299 task, 54300 resources, 54301 includeMarkedContent: true, 54302 keepWhiteSpace: true, 54303 sink, 54304 viewBox 54305 }); 54306 this.reset(); 54307 if (buffer.length) { 54308 text.push(buffer.join("").trimEnd()); 54309 } 54310 if (text.length > 1 || text[0]) { 54311 const appearanceDict = this.appearance.dict; 54312 const bbox = lookupRect(appearanceDict.getArray("BBox"), null); 54313 const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null); 54314 this.data.textPosition = this._transformPoint(firstPosition, bbox, matrix); 54315 this.data.textContent = text; 54316 } 54317 } 54318 _transformPoint(coords, bbox, matrix) { 54319 const { 54320 rect 54321 } = this.data; 54322 bbox ||= [0, 0, 1, 1]; 54323 matrix ||= [1, 0, 0, 1, 0, 0]; 54324 const transform = getTransformMatrix(rect, bbox, matrix); 54325 transform[4] -= rect[0]; 54326 transform[5] -= rect[1]; 54327 coords = Util.applyTransform(coords, transform); 54328 return Util.applyTransform(coords, matrix); 54329 } 54330 getFieldObject() { 54331 if (this.data.kidIds) { 54332 return { 54333 id: this.data.id, 54334 actions: this.data.actions, 54335 name: this.data.fieldName, 54336 strokeColor: this.data.borderColor, 54337 fillColor: this.data.backgroundColor, 54338 type: "", 54339 kidIds: this.data.kidIds, 54340 page: this.data.pageIndex, 54341 rotation: this.rotation 54342 }; 54343 } 54344 return null; 54345 } 54346 reset() { 54347 for (const stream of this._streams) { 54348 stream.reset(); 54349 } 54350 } 54351 _constructFieldName(dict) { 54352 if (!dict.has("T") && !dict.has("Parent")) { 54353 warn("Unknown field name, falling back to empty field name."); 54354 return ""; 54355 } 54356 if (!dict.has("Parent")) { 54357 return stringToPDFString(dict.get("T")); 54358 } 54359 const fieldName = []; 54360 if (dict.has("T")) { 54361 fieldName.unshift(stringToPDFString(dict.get("T"))); 54362 } 54363 let loopDict = dict; 54364 const visited = new RefSet(); 54365 if (dict.objId) { 54366 visited.put(dict.objId); 54367 } 54368 while (loopDict.has("Parent")) { 54369 loopDict = loopDict.get("Parent"); 54370 if (!(loopDict instanceof Dict) || loopDict.objId && visited.has(loopDict.objId)) { 54371 break; 54372 } 54373 if (loopDict.objId) { 54374 visited.put(loopDict.objId); 54375 } 54376 if (loopDict.has("T")) { 54377 fieldName.unshift(stringToPDFString(loopDict.get("T"))); 54378 } 54379 } 54380 return fieldName.join("."); 54381 } 54382} 54383class AnnotationBorderStyle { 54384 constructor() { 54385 this.width = 1; 54386 this.rawWidth = 1; 54387 this.style = AnnotationBorderStyleType.SOLID; 54388 this.dashArray = [3]; 54389 this.horizontalCornerRadius = 0; 54390 this.verticalCornerRadius = 0; 54391 } 54392 setWidth(width, rect = [0, 0, 0, 0]) { 54393 if (width instanceof Name) { 54394 this.width = 0; 54395 return; 54396 } 54397 if (typeof width === "number") { 54398 if (width > 0) { 54399 this.rawWidth = width; 54400 const maxWidth = (rect[2] - rect[0]) / 2; 54401 const maxHeight = (rect[3] - rect[1]) / 2; 54402 if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) { 54403 warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`); 54404 width = 1; 54405 } 54406 } 54407 this.width = width; 54408 } 54409 } 54410 setStyle(style) { 54411 if (!(style instanceof Name)) { 54412 return; 54413 } 54414 switch (style.name) { 54415 case "S": 54416 this.style = AnnotationBorderStyleType.SOLID; 54417 break; 54418 case "D": 54419 this.style = AnnotationBorderStyleType.DASHED; 54420 break; 54421 case "B": 54422 this.style = AnnotationBorderStyleType.BEVELED; 54423 break; 54424 case "I": 54425 this.style = AnnotationBorderStyleType.INSET; 54426 break; 54427 case "U": 54428 this.style = AnnotationBorderStyleType.UNDERLINE; 54429 break; 54430 default: 54431 break; 54432 } 54433 } 54434 setDashArray(dashArray, forceStyle = false) { 54435 if (Array.isArray(dashArray)) { 54436 let isValid = true; 54437 let allZeros = true; 54438 for (const element of dashArray) { 54439 const validNumber = +element >= 0; 54440 if (!validNumber) { 54441 isValid = false; 54442 break; 54443 } else if (element > 0) { 54444 allZeros = false; 54445 } 54446 } 54447 if (dashArray.length === 0 || isValid && !allZeros) { 54448 this.dashArray = dashArray; 54449 if (forceStyle) { 54450 this.setStyle(Name.get("D")); 54451 } 54452 } else { 54453 this.width = 0; 54454 } 54455 } else if (dashArray) { 54456 this.width = 0; 54457 } 54458 } 54459 setHorizontalCornerRadius(radius) { 54460 if (Number.isInteger(radius)) { 54461 this.horizontalCornerRadius = radius; 54462 } 54463 } 54464 setVerticalCornerRadius(radius) { 54465 if (Number.isInteger(radius)) { 54466 this.verticalCornerRadius = radius; 54467 } 54468 } 54469} 54470class MarkupAnnotation extends Annotation { 54471 constructor(params) { 54472 super(params); 54473 const { 54474 dict 54475 } = params; 54476 if (dict.has("IRT")) { 54477 const rawIRT = dict.getRaw("IRT"); 54478 this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null; 54479 const rt = dict.get("RT"); 54480 this.data.replyType = rt instanceof Name ? rt.name : AnnotationReplyType.REPLY; 54481 } 54482 let popupRef = null; 54483 if (this.data.replyType === AnnotationReplyType.GROUP) { 54484 const parent = dict.get("IRT"); 54485 this.setTitle(parent.get("T")); 54486 this.data.titleObj = this._title; 54487 this.setContents(parent.get("Contents")); 54488 this.data.contentsObj = this._contents; 54489 if (!parent.has("CreationDate")) { 54490 this.data.creationDate = null; 54491 } else { 54492 this.setCreationDate(parent.get("CreationDate")); 54493 this.data.creationDate = this.creationDate; 54494 } 54495 if (!parent.has("M")) { 54496 this.data.modificationDate = null; 54497 } else { 54498 this.setModificationDate(parent.get("M")); 54499 this.data.modificationDate = this.modificationDate; 54500 } 54501 popupRef = parent.getRaw("Popup"); 54502 if (!parent.has("C")) { 54503 this.data.color = null; 54504 } else { 54505 this.setColor(parent.getArray("C")); 54506 this.data.color = this.color; 54507 } 54508 } else { 54509 this.data.titleObj = this._title; 54510 this.setCreationDate(dict.get("CreationDate")); 54511 this.data.creationDate = this.creationDate; 54512 popupRef = dict.getRaw("Popup"); 54513 if (!dict.has("C")) { 54514 this.data.color = null; 54515 } 54516 } 54517 this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null; 54518 if (dict.has("RC")) { 54519 this.data.richText = XFAFactory.getRichTextAsHtml(dict.get("RC")); 54520 } 54521 } 54522 setCreationDate(creationDate) { 54523 this.creationDate = typeof creationDate === "string" ? creationDate : null; 54524 } 54525 _setDefaultAppearance({ 54526 xref, 54527 extra, 54528 strokeColor, 54529 fillColor, 54530 blendMode, 54531 strokeAlpha, 54532 fillAlpha, 54533 pointsCallback 54534 }) { 54535 let minX = Number.MAX_VALUE; 54536 let minY = Number.MAX_VALUE; 54537 let maxX = Number.MIN_VALUE; 54538 let maxY = Number.MIN_VALUE; 54539 const buffer = ["q"]; 54540 if (extra) { 54541 buffer.push(extra); 54542 } 54543 if (strokeColor) { 54544 buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`); 54545 } 54546 if (fillColor) { 54547 buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); 54548 } 54549 const pointsArray = this.data.quadPoints || 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]]); 54550 for (let i = 0, ii = pointsArray.length; i < ii; i += 8) { 54551 const [mX, MX, mY, MY] = pointsCallback(buffer, pointsArray.subarray(i, i + 8)); 54552 minX = Math.min(minX, mX); 54553 maxX = Math.max(maxX, MX); 54554 minY = Math.min(minY, mY); 54555 maxY = Math.max(maxY, MY); 54556 } 54557 buffer.push("Q"); 54558 const formDict = new Dict(xref); 54559 const appearanceStreamDict = new Dict(xref); 54560 appearanceStreamDict.set("Subtype", Name.get("Form")); 54561 const appearanceStream = new StringStream(buffer.join(" ")); 54562 appearanceStream.dict = appearanceStreamDict; 54563 formDict.set("Fm0", appearanceStream); 54564 const gsDict = new Dict(xref); 54565 if (blendMode) { 54566 gsDict.set("BM", Name.get(blendMode)); 54567 } 54568 if (typeof strokeAlpha === "number") { 54569 gsDict.set("CA", strokeAlpha); 54570 } 54571 if (typeof fillAlpha === "number") { 54572 gsDict.set("ca", fillAlpha); 54573 } 54574 const stateDict = new Dict(xref); 54575 stateDict.set("GS0", gsDict); 54576 const resources = new Dict(xref); 54577 resources.set("ExtGState", stateDict); 54578 resources.set("XObject", formDict); 54579 const appearanceDict = new Dict(xref); 54580 appearanceDict.set("Resources", resources); 54581 const bbox = this.data.rect = [minX, minY, maxX, maxY]; 54582 appearanceDict.set("BBox", bbox); 54583 this.appearance = new StringStream("/GS0 gs /Fm0 Do"); 54584 this.appearance.dict = appearanceDict; 54585 this._streams.push(this.appearance, appearanceStream); 54586 } 54587 static async createNewAnnotation(xref, annotation, changes, params) { 54588 const annotationRef = annotation.ref ||= xref.getNewTemporaryRef(); 54589 const ap = await this.createNewAppearanceStream(annotation, xref, params); 54590 let annotationDict; 54591 if (ap) { 54592 const apRef = xref.getNewTemporaryRef(); 54593 annotationDict = this.createNewDict(annotation, xref, { 54594 apRef 54595 }); 54596 changes.put(apRef, { 54597 data: ap 54598 }); 54599 } else { 54600 annotationDict = this.createNewDict(annotation, xref, {}); 54601 } 54602 if (Number.isInteger(annotation.parentTreeId)) { 54603 annotationDict.set("StructParent", annotation.parentTreeId); 54604 } 54605 changes.put(annotationRef, { 54606 data: annotationDict 54607 }); 54608 return { 54609 ref: annotationRef 54610 }; 54611 } 54612 static async createNewPrintAnnotation(annotationGlobals, xref, annotation, params) { 54613 const ap = await this.createNewAppearanceStream(annotation, xref, params); 54614 const annotationDict = this.createNewDict(annotation, xref, ap ? { 54615 ap 54616 } : {}); 54617 const newAnnotation = new this.prototype.constructor({ 54618 dict: annotationDict, 54619 xref, 54620 annotationGlobals, 54621 evaluatorOptions: params.evaluatorOptions 54622 }); 54623 if (annotation.ref) { 54624 newAnnotation.ref = newAnnotation.refToReplace = annotation.ref; 54625 } 54626 return newAnnotation; 54627 } 54628} 54629class WidgetAnnotation extends Annotation { 54630 constructor(params) { 54631 super(params); 54632 const { 54633 dict, 54634 xref, 54635 annotationGlobals 54636 } = params; 54637 const data = this.data; 54638 this._needAppearances = params.needAppearances; 54639 data.annotationType = AnnotationType.WIDGET; 54640 if (data.fieldName === undefined) { 54641 data.fieldName = this._constructFieldName(dict); 54642 } 54643 if (data.actions === undefined) { 54644 data.actions = collectActions(xref, dict, AnnotationActionEventType); 54645 } 54646 let fieldValue = getInheritableProperty({ 54647 dict, 54648 key: "V", 54649 getArray: true 54650 }); 54651 data.fieldValue = this._decodeFormValue(fieldValue); 54652 const defaultFieldValue = getInheritableProperty({ 54653 dict, 54654 key: "DV", 54655 getArray: true 54656 }); 54657 data.defaultFieldValue = this._decodeFormValue(defaultFieldValue); 54658 if (fieldValue === undefined && annotationGlobals.xfaDatasets) { 54659 const path = this._title.str; 54660 if (path) { 54661 this._hasValueFromXFA = true; 54662 data.fieldValue = fieldValue = annotationGlobals.xfaDatasets.getValue(path); 54663 } 54664 } 54665 if (fieldValue === undefined && data.defaultFieldValue !== null) { 54666 data.fieldValue = data.defaultFieldValue; 54667 } 54668 data.alternativeText = stringToPDFString(dict.get("TU") || ""); 54669 this.setDefaultAppearance(params); 54670 data.hasAppearance ||= this._needAppearances && data.fieldValue !== undefined && data.fieldValue !== null; 54671 const fieldType = getInheritableProperty({ 54672 dict, 54673 key: "FT" 54674 }); 54675 data.fieldType = fieldType instanceof Name ? fieldType.name : null; 54676 const localResources = getInheritableProperty({ 54677 dict, 54678 key: "DR" 54679 }); 54680 const acroFormResources = annotationGlobals.acroForm.get("DR"); 54681 const appearanceResources = this.appearance?.dict.get("Resources"); 54682 this._fieldResources = { 54683 localResources, 54684 acroFormResources, 54685 appearanceResources, 54686 mergedResources: Dict.merge({ 54687 xref, 54688 dictArray: [localResources, appearanceResources, acroFormResources], 54689 mergeSubDicts: true 54690 }) 54691 }; 54692 data.fieldFlags = getInheritableProperty({ 54693 dict, 54694 key: "Ff" 54695 }); 54696 if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { 54697 data.fieldFlags = 0; 54698 } 54699 data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); 54700 data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED); 54701 data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW); 54702 } 54703 _decodeFormValue(formValue) { 54704 if (Array.isArray(formValue)) { 54705 return formValue.filter(item => typeof item === "string").map(item => stringToPDFString(item)); 54706 } else if (formValue instanceof Name) { 54707 return stringToPDFString(formValue.name); 54708 } else if (typeof formValue === "string") { 54709 return stringToPDFString(formValue); 54710 } 54711 return null; 54712 } 54713 hasFieldFlag(flag) { 54714 return !!(this.data.fieldFlags & flag); 54715 } 54716 _isViewable(flags) { 54717 return true; 54718 } 54719 mustBeViewed(annotationStorage, renderForms) { 54720 if (renderForms) { 54721 return this.viewable; 54722 } 54723 return super.mustBeViewed(annotationStorage, renderForms) && !this._hasFlag(this.flags, AnnotationFlag.NOVIEW); 54724 } 54725 getRotationMatrix(annotationStorage) { 54726 let rotation = annotationStorage?.get(this.data.id)?.rotation; 54727 if (rotation === undefined) { 54728 rotation = this.rotation; 54729 } 54730 if (rotation === 0) { 54731 return IDENTITY_MATRIX; 54732 } 54733 const width = this.data.rect[2] - this.data.rect[0]; 54734 const height = this.data.rect[3] - this.data.rect[1]; 54735 return getRotationMatrix(rotation, width, height); 54736 } 54737 getBorderAndBackgroundAppearances(annotationStorage) { 54738 let rotation = annotationStorage?.get(this.data.id)?.rotation; 54739 if (rotation === undefined) { 54740 rotation = this.rotation; 54741 } 54742 if (!this.backgroundColor && !this.borderColor) { 54743 return ""; 54744 } 54745 const width = this.data.rect[2] - this.data.rect[0]; 54746 const height = this.data.rect[3] - this.data.rect[1]; 54747 const rect = rotation === 0 || rotation === 180 ? `0 0 ${width} ${height} re` : `0 0 ${height} ${width} re`; 54748 let str = ""; 54749 if (this.backgroundColor) { 54750 str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `; 54751 } 54752 if (this.borderColor) { 54753 const borderWidth = this.borderStyle.width || 1; 54754 str += `${borderWidth} w ${getPdfColor(this.borderColor, false)} ${rect} S `; 54755 } 54756 return str; 54757 } 54758 async getOperatorList(evaluator, task, intent, annotationStorage) { 54759 if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { 54760 return { 54761 opList: new OperatorList(), 54762 separateForm: true, 54763 separateCanvas: false 54764 }; 54765 } 54766 if (!this._hasText) { 54767 return super.getOperatorList(evaluator, task, intent, annotationStorage); 54768 } 54769 const content = await this._getAppearance(evaluator, task, intent, annotationStorage); 54770 if (this.appearance && content === null) { 54771 return super.getOperatorList(evaluator, task, intent, annotationStorage); 54772 } 54773 const opList = new OperatorList(); 54774 if (!this._defaultAppearance || content === null) { 54775 return { 54776 opList, 54777 separateForm: false, 54778 separateCanvas: false 54779 }; 54780 } 54781 const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); 54782 const matrix = [1, 0, 0, 1, 0, 0]; 54783 const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]; 54784 const transform = getTransformMatrix(this.data.rect, bbox, matrix); 54785 let optionalContent; 54786 if (this.oc) { 54787 optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); 54788 } 54789 if (optionalContent !== undefined) { 54790 opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); 54791 } 54792 opList.addOp(OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), isUsingOwnCanvas]); 54793 const stream = new StringStream(content); 54794 await evaluator.getOperatorList({ 54795 stream, 54796 task, 54797 resources: this._fieldResources.mergedResources, 54798 operatorList: opList 54799 }); 54800 opList.addOp(OPS.endAnnotation, []); 54801 if (optionalContent !== undefined) { 54802 opList.addOp(OPS.endMarkedContent, []); 54803 } 54804 return { 54805 opList, 54806 separateForm: false, 54807 separateCanvas: isUsingOwnCanvas 54808 }; 54809 } 54810 _getMKDict(rotation) { 54811 const mk = new Dict(null); 54812 if (rotation) { 54813 mk.set("R", rotation); 54814 } 54815 if (this.borderColor) { 54816 mk.set("BC", getPdfColorArray(this.borderColor)); 54817 } 54818 if (this.backgroundColor) { 54819 mk.set("BG", getPdfColorArray(this.backgroundColor)); 54820 } 54821 return mk.size > 0 ? mk : null; 54822 } 54823 amendSavedDict(annotationStorage, dict) {} 54824 setValue(dict, value, xref, changes) { 54825 const { 54826 dict: parentDict, 54827 ref: parentRef 54828 } = getParentToUpdate(dict, this.ref, xref); 54829 if (!parentDict) { 54830 dict.set("V", value); 54831 } else if (!changes.has(parentRef)) { 54832 const newParentDict = parentDict.clone(); 54833 newParentDict.set("V", value); 54834 changes.put(parentRef, { 54835 data: newParentDict 54836 }); 54837 return newParentDict; 54838 } 54839 return null; 54840 } 54841 async save(evaluator, task, annotationStorage, changes) { 54842 const storageEntry = annotationStorage?.get(this.data.id); 54843 const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); 54844 let value = storageEntry?.value, 54845 rotation = storageEntry?.rotation; 54846 if (value === this.data.fieldValue || value === undefined) { 54847 if (!this._hasValueFromXFA && rotation === undefined && flags === undefined) { 54848 return; 54849 } 54850 value ||= this.data.fieldValue; 54851 } 54852 if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) { 54853 return; 54854 } 54855 if (rotation === undefined) { 54856 rotation = this.rotation; 54857 } 54858 let appearance = null; 54859 if (!this._needAppearances) { 54860 appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage); 54861 if (appearance === null && flags === undefined) { 54862 return; 54863 } 54864 } else {} 54865 let needAppearances = false; 54866 if (appearance?.needAppearances) { 54867 needAppearances = true; 54868 appearance = null; 54869 } 54870 const { 54871 xref 54872 } = evaluator; 54873 const originalDict = xref.fetchIfRef(this.ref); 54874 if (!(originalDict instanceof Dict)) { 54875 return; 54876 } 54877 const dict = new Dict(xref); 54878 for (const key of originalDict.getKeys()) { 54879 if (key !== "AP") { 54880 dict.set(key, originalDict.getRaw(key)); 54881 } 54882 } 54883 if (flags !== undefined) { 54884 dict.set("F", flags); 54885 if (appearance === null && !needAppearances) { 54886 const ap = originalDict.getRaw("AP"); 54887 if (ap) { 54888 dict.set("AP", ap); 54889 } 54890 } 54891 } 54892 const xfa = { 54893 path: this.data.fieldName, 54894 value 54895 }; 54896 const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes); 54897 this.amendSavedDict(annotationStorage, newParentDict || dict); 54898 const maybeMK = this._getMKDict(rotation); 54899 if (maybeMK) { 54900 dict.set("MK", maybeMK); 54901 } 54902 changes.put(this.ref, { 54903 data: dict, 54904 xfa, 54905 needAppearances 54906 }); 54907 if (appearance !== null) { 54908 const newRef = xref.getNewTemporaryRef(); 54909 const AP = new Dict(xref); 54910 dict.set("AP", AP); 54911 AP.set("N", newRef); 54912 const resources = this._getSaveFieldResources(xref); 54913 const appearanceStream = new StringStream(appearance); 54914 const appearanceDict = appearanceStream.dict = new Dict(xref); 54915 appearanceDict.set("Subtype", Name.get("Form")); 54916 appearanceDict.set("Resources", resources); 54917 appearanceDict.set("BBox", [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]); 54918 const rotationMatrix = this.getRotationMatrix(annotationStorage); 54919 if (rotationMatrix !== IDENTITY_MATRIX) { 54920 appearanceDict.set("Matrix", rotationMatrix); 54921 } 54922 changes.put(newRef, { 54923 data: appearanceStream, 54924 xfa: null, 54925 needAppearances: false 54926 }); 54927 } 54928 dict.set("M", `D:${getModificationDate()}`); 54929 } 54930 async _getAppearance(evaluator, task, intent, annotationStorage) { 54931 const isPassword = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); 54932 if (isPassword) { 54933 return null; 54934 } 54935 const storageEntry = annotationStorage?.get(this.data.id); 54936 let value, rotation; 54937 if (storageEntry) { 54938 value = storageEntry.formattedValue || storageEntry.value; 54939 rotation = storageEntry.rotation; 54940 } 54941 if (rotation === undefined && value === undefined && !this._needAppearances) { 54942 if (!this._hasValueFromXFA || this.appearance) { 54943 return null; 54944 } 54945 } 54946 const colors = this.getBorderAndBackgroundAppearances(annotationStorage); 54947 if (value === undefined) { 54948 value = this.data.fieldValue; 54949 if (!value) { 54950 return `/Tx BMC q ${colors}Q EMC`; 54951 } 54952 } 54953 if (Array.isArray(value) && value.length === 1) { 54954 value = value[0]; 54955 } 54956 assert(typeof value === "string", "Expected `value` to be a string."); 54957 value = value.trimEnd(); 54958 if (this.data.combo) { 54959 const option = this.data.options.find(({ 54960 exportValue 54961 }) => value === exportValue); 54962 value = option?.displayValue || value; 54963 } 54964 if (value === "") { 54965 return `/Tx BMC q ${colors}Q EMC`; 54966 } 54967 if (rotation === undefined) { 54968 rotation = this.rotation; 54969 } 54970 let lineCount = -1; 54971 let lines; 54972 if (this.data.multiLine) { 54973 lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC")); 54974 lineCount = lines.length; 54975 } else { 54976 lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")]; 54977 } 54978 const defaultPadding = 1; 54979 const defaultHPadding = 2; 54980 let totalHeight = this.data.rect[3] - this.data.rect[1]; 54981 let totalWidth = this.data.rect[2] - this.data.rect[0]; 54982 if (rotation === 90 || rotation === 270) { 54983 [totalWidth, totalHeight] = [totalHeight, totalWidth]; 54984 } 54985 if (!this._defaultAppearance) { 54986 this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); 54987 } 54988 let font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); 54989 let defaultAppearance, fontSize, lineHeight; 54990 const encodedLines = []; 54991 let encodingError = false; 54992 for (const line of lines) { 54993 const encodedString = font.encodeString(line); 54994 if (encodedString.length > 1) { 54995 encodingError = true; 54996 } 54997 encodedLines.push(encodedString.join("")); 54998 } 54999 if (encodingError && intent & RenderingIntentFlag.SAVE) { 55000 return { 55001 needAppearances: true 55002 }; 55003 } 55004 if (encodingError && this._isOffscreenCanvasSupported) { 55005 const fontFamily = this.data.comb ? "monospace" : "sans-serif"; 55006 const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily); 55007 const resources = fakeUnicodeFont.createFontResources(lines.join("")); 55008 const newFont = resources.getRaw("Font"); 55009 if (this._fieldResources.mergedResources.has("Font")) { 55010 const oldFont = this._fieldResources.mergedResources.get("Font"); 55011 for (const key of newFont.getKeys()) { 55012 oldFont.set(key, newFont.getRaw(key)); 55013 } 55014 } else { 55015 this._fieldResources.mergedResources.set("Font", newFont); 55016 } 55017 const fontName = fakeUnicodeFont.fontName.name; 55018 font = await WidgetAnnotation._getFontData(evaluator, task, { 55019 fontName, 55020 fontSize: 0 55021 }, resources); 55022 for (let i = 0, ii = encodedLines.length; i < ii; i++) { 55023 encodedLines[i] = stringToUTF16String(lines[i]); 55024 } 55025 const savedDefaultAppearance = Object.assign(Object.create(null), this.data.defaultAppearanceData); 55026 this.data.defaultAppearanceData.fontSize = 0; 55027 this.data.defaultAppearanceData.fontName = fontName; 55028 [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); 55029 this.data.defaultAppearanceData = savedDefaultAppearance; 55030 } else { 55031 if (!this._isOffscreenCanvasSupported) { 55032 warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly."); 55033 } 55034 [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); 55035 } 55036 let descent = font.descent; 55037 if (isNaN(descent)) { 55038 descent = BASELINE_FACTOR * lineHeight; 55039 } else { 55040 descent = Math.max(BASELINE_FACTOR * lineHeight, Math.abs(descent) * fontSize); 55041 } 55042 const defaultVPadding = Math.min(Math.floor((totalHeight - fontSize) / 2), defaultPadding); 55043 const alignment = this.data.textAlignment; 55044 if (this.data.multiLine) { 55045 return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); 55046 } 55047 if (this.data.comb) { 55048 return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); 55049 } 55050 const bottomPadding = defaultVPadding + descent; 55051 if (alignment === 0 || alignment > 2) { 55052 return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(bottomPadding)} Tm (${escapeString(encodedLines[0])}) Tj` + " ET Q EMC"; 55053 } 55054 const prevInfo = { 55055 shift: 0 55056 }; 55057 const renderedText = this._renderText(encodedLines[0], font, fontSize, totalWidth, alignment, prevInfo, defaultHPadding, bottomPadding); 55058 return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC"; 55059 } 55060 static async _getFontData(evaluator, task, appearanceData, resources) { 55061 const operatorList = new OperatorList(); 55062 const initialState = { 55063 font: null, 55064 clone() { 55065 return this; 55066 } 55067 }; 55068 const { 55069 fontName, 55070 fontSize 55071 } = appearanceData; 55072 await evaluator.handleSetFont(resources, [fontName && Name.get(fontName), fontSize], null, operatorList, task, initialState, null); 55073 return initialState.font; 55074 } 55075 _getTextWidth(text, font) { 55076 return font.charsToGlyphs(text).reduce((width, glyph) => width + glyph.width, 0) / 1000; 55077 } 55078 _computeFontSize(height, width, text, font, lineCount) { 55079 let { 55080 fontSize 55081 } = this.data.defaultAppearanceData; 55082 let lineHeight = (fontSize || 12) * LINE_FACTOR, 55083 numberOfLines = Math.round(height / lineHeight); 55084 if (!fontSize) { 55085 const roundWithTwoDigits = x => Math.floor(x * 100) / 100; 55086 if (lineCount === -1) { 55087 const textWidth = this._getTextWidth(text, font); 55088 fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, width / textWidth)); 55089 numberOfLines = 1; 55090 } else { 55091 const lines = text.split(/\r\n?|\n/); 55092 const cachedLines = []; 55093 for (const line of lines) { 55094 const encoded = font.encodeString(line).join(""); 55095 const glyphs = font.charsToGlyphs(encoded); 55096 const positions = font.getCharPositions(encoded); 55097 cachedLines.push({ 55098 line: encoded, 55099 glyphs, 55100 positions 55101 }); 55102 } 55103 const isTooBig = fsize => { 55104 let totalHeight = 0; 55105 for (const cache of cachedLines) { 55106 const chunks = this._splitLine(null, font, fsize, width, cache); 55107 totalHeight += chunks.length * fsize; 55108 if (totalHeight > height) { 55109 return true; 55110 } 55111 } 55112 return false; 55113 }; 55114 numberOfLines = Math.max(numberOfLines, lineCount); 55115 while (true) { 55116 lineHeight = height / numberOfLines; 55117 fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR); 55118 if (isTooBig(fontSize)) { 55119 numberOfLines++; 55120 continue; 55121 } 55122 break; 55123 } 55124 } 55125 const { 55126 fontName, 55127 fontColor 55128 } = this.data.defaultAppearanceData; 55129 this._defaultAppearance = createDefaultAppearance({ 55130 fontSize, 55131 fontName, 55132 fontColor 55133 }); 55134 } 55135 return [this._defaultAppearance, fontSize, height / numberOfLines]; 55136 } 55137 _renderText(text, font, fontSize, totalWidth, alignment, prevInfo, hPadding, vPadding) { 55138 let shift; 55139 if (alignment === 1) { 55140 const width = this._getTextWidth(text, font) * fontSize; 55141 shift = (totalWidth - width) / 2; 55142 } else if (alignment === 2) { 55143 const width = this._getTextWidth(text, font) * fontSize; 55144 shift = totalWidth - width - hPadding; 55145 } else { 55146 shift = hPadding; 55147 } 55148 const shiftStr = numberToString(shift - prevInfo.shift); 55149 prevInfo.shift = shift; 55150 vPadding = numberToString(vPadding); 55151 return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`; 55152 } 55153 _getSaveFieldResources(xref) { 55154 const { 55155 localResources, 55156 appearanceResources, 55157 acroFormResources 55158 } = this._fieldResources; 55159 const fontName = this.data.defaultAppearanceData?.fontName; 55160 if (!fontName) { 55161 return localResources || Dict.empty; 55162 } 55163 for (const resources of [localResources, appearanceResources]) { 55164 if (resources instanceof Dict) { 55165 const localFont = resources.get("Font"); 55166 if (localFont instanceof Dict && localFont.has(fontName)) { 55167 return resources; 55168 } 55169 } 55170 } 55171 if (acroFormResources instanceof Dict) { 55172 const acroFormFont = acroFormResources.get("Font"); 55173 if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) { 55174 const subFontDict = new Dict(xref); 55175 subFontDict.set(fontName, acroFormFont.getRaw(fontName)); 55176 const subResourcesDict = new Dict(xref); 55177 subResourcesDict.set("Font", subFontDict); 55178 return Dict.merge({ 55179 xref, 55180 dictArray: [subResourcesDict, localResources], 55181 mergeSubDicts: true 55182 }); 55183 } 55184 } 55185 return localResources || Dict.empty; 55186 } 55187 getFieldObject() { 55188 return null; 55189 } 55190} 55191class TextWidgetAnnotation extends WidgetAnnotation { 55192 constructor(params) { 55193 super(params); 55194 const { 55195 dict 55196 } = params; 55197 if (dict.has("PMD")) { 55198 this.flags |= AnnotationFlag.HIDDEN; 55199 this.data.hidden = true; 55200 warn("Barcodes are not supported"); 55201 } 55202 this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; 55203 this._hasText = true; 55204 if (typeof this.data.fieldValue !== "string") { 55205 this.data.fieldValue = ""; 55206 } 55207 let alignment = getInheritableProperty({ 55208 dict, 55209 key: "Q" 55210 }); 55211 if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) { 55212 alignment = null; 55213 } 55214 this.data.textAlignment = alignment; 55215 let maximumLength = getInheritableProperty({ 55216 dict, 55217 key: "MaxLen" 55218 }); 55219 if (!Number.isInteger(maximumLength) || maximumLength < 0) { 55220 maximumLength = 0; 55221 } 55222 this.data.maxLen = maximumLength; 55223 this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); 55224 this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; 55225 this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL); 55226 } 55227 get hasTextContent() { 55228 return !!this.appearance && !this._needAppearances; 55229 } 55230 _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, hPadding, vPadding, descent, lineHeight, annotationStorage) { 55231 const combWidth = width / this.data.maxLen; 55232 const colors = this.getBorderAndBackgroundAppearances(annotationStorage); 55233 const buf = []; 55234 const positions = font.getCharPositions(text); 55235 for (const [start, end] of positions) { 55236 buf.push(`(${escapeString(text.substring(start, end))}) Tj`); 55237 } 55238 const renderedComb = buf.join(` ${numberToString(combWidth)} 0 Td `); 55239 return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hPadding)} ${numberToString(vPadding + descent)} Tm ${renderedComb}` + " ET Q EMC"; 55240 } 55241 _getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) { 55242 const buf = []; 55243 const totalWidth = width - 2 * hPadding; 55244 const prevInfo = { 55245 shift: 0 55246 }; 55247 for (let i = 0, ii = lines.length; i < ii; i++) { 55248 const line = lines[i]; 55249 const chunks = this._splitLine(line, font, fontSize, totalWidth); 55250 for (let j = 0, jj = chunks.length; j < jj; j++) { 55251 const chunk = chunks[j]; 55252 const vShift = i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight; 55253 buf.push(this._renderText(chunk, font, fontSize, width, alignment, prevInfo, hPadding, vShift)); 55254 } 55255 } 55256 const colors = this.getBorderAndBackgroundAppearances(annotationStorage); 55257 const renderedText = buf.join("\n"); 55258 return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` + " ET Q EMC"; 55259 } 55260 _splitLine(line, font, fontSize, width, cache = {}) { 55261 line = cache.line || line; 55262 const glyphs = cache.glyphs || font.charsToGlyphs(line); 55263 if (glyphs.length <= 1) { 55264 return [line]; 55265 } 55266 const positions = cache.positions || font.getCharPositions(line); 55267 const scale = fontSize / 1000; 55268 const chunks = []; 55269 let lastSpacePosInStringStart = -1, 55270 lastSpacePosInStringEnd = -1, 55271 lastSpacePos = -1, 55272 startChunk = 0, 55273 currentWidth = 0; 55274 for (let i = 0, ii = glyphs.length; i < ii; i++) { 55275 const [start, end] = positions[i]; 55276 const glyph = glyphs[i]; 55277 const glyphWidth = glyph.width * scale; 55278 if (glyph.unicode === " ") { 55279 if (currentWidth + glyphWidth > width) { 55280 chunks.push(line.substring(startChunk, start)); 55281 startChunk = start; 55282 currentWidth = glyphWidth; 55283 lastSpacePosInStringStart = -1; 55284 lastSpacePos = -1; 55285 } else { 55286 currentWidth += glyphWidth; 55287 lastSpacePosInStringStart = start; 55288 lastSpacePosInStringEnd = end; 55289 lastSpacePos = i; 55290 } 55291 } else if (currentWidth + glyphWidth > width) { 55292 if (lastSpacePosInStringStart !== -1) { 55293 chunks.push(line.substring(startChunk, lastSpacePosInStringEnd)); 55294 startChunk = lastSpacePosInStringEnd; 55295 i = lastSpacePos + 1; 55296 lastSpacePosInStringStart = -1; 55297 currentWidth = 0; 55298 } else { 55299 chunks.push(line.substring(startChunk, start)); 55300 startChunk = start; 55301 currentWidth = glyphWidth; 55302 } 55303 } else { 55304 currentWidth += glyphWidth; 55305 } 55306 } 55307 if (startChunk < line.length) { 55308 chunks.push(line.substring(startChunk, line.length)); 55309 } 55310 return chunks; 55311 } 55312 async extractTextContent(evaluator, task, viewBox) { 55313 await super.extractTextContent(evaluator, task, viewBox); 55314 const text = this.data.textContent; 55315 if (!text) { 55316 return; 55317 } 55318 const allText = text.join("\n"); 55319 if (allText === this.data.fieldValue) { 55320 return; 55321 } 55322 const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => p1 ? `\\${p1}` : "\\s+"); 55323 if (new RegExp(`^\\s*${regex}\\s*$`).test(this.data.fieldValue)) { 55324 this.data.textContent = this.data.fieldValue.split("\n"); 55325 } 55326 } 55327 getFieldObject() { 55328 return { 55329 id: this.data.id, 55330 value: this.data.fieldValue, 55331 defaultValue: this.data.defaultFieldValue || "", 55332 multiline: this.data.multiLine, 55333 password: this.hasFieldFlag(AnnotationFieldFlag.PASSWORD), 55334 charLimit: this.data.maxLen, 55335 comb: this.data.comb, 55336 editable: !this.data.readOnly, 55337 hidden: this.data.hidden, 55338 name: this.data.fieldName, 55339 rect: this.data.rect, 55340 actions: this.data.actions, 55341 page: this.data.pageIndex, 55342 strokeColor: this.data.borderColor, 55343 fillColor: this.data.backgroundColor, 55344 rotation: this.rotation, 55345 type: "text" 55346 }; 55347 } 55348} 55349class ButtonWidgetAnnotation extends WidgetAnnotation { 55350 constructor(params) { 55351 super(params); 55352 this.checkedAppearance = null; 55353 this.uncheckedAppearance = null; 55354 this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); 55355 this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); 55356 this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); 55357 this.data.isTooltipOnly = false; 55358 if (this.data.checkBox) { 55359 this._processCheckBox(params); 55360 } else if (this.data.radioButton) { 55361 this._processRadioButton(params); 55362 } else if (this.data.pushButton) { 55363 this.data.hasOwnCanvas = true; 55364 this.data.noHTML = false; 55365 this._processPushButton(params); 55366 } else { 55367 warn("Invalid field flags for button widget annotation"); 55368 } 55369 } 55370 async getOperatorList(evaluator, task, intent, annotationStorage) { 55371 if (this.data.pushButton) { 55372 return super.getOperatorList(evaluator, task, intent, false, annotationStorage); 55373 } 55374 let value = null; 55375 let rotation = null; 55376 if (annotationStorage) { 55377 const storageEntry = annotationStorage.get(this.data.id); 55378 value = storageEntry ? storageEntry.value : null; 55379 rotation = storageEntry ? storageEntry.rotation : null; 55380 } 55381 if (value === null && this.appearance) { 55382 return super.getOperatorList(evaluator, task, intent, annotationStorage); 55383 } 55384 if (value === null || value === undefined) { 55385 value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue; 55386 } 55387 const appearance = value ? this.checkedAppearance : this.uncheckedAppearance; 55388 if (appearance) { 55389 const savedAppearance = this.appearance; 55390 const savedMatrix = lookupMatrix(appearance.dict.getArray("Matrix"), IDENTITY_MATRIX); 55391 if (rotation) { 55392 appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); 55393 } 55394 this.appearance = appearance; 55395 const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage); 55396 this.appearance = savedAppearance; 55397 appearance.dict.set("Matrix", savedMatrix); 55398 return operatorList; 55399 } 55400 return { 55401 opList: new OperatorList(), 55402 separateForm: false, 55403 separateCanvas: false 55404 }; 55405 } 55406 async save(evaluator, task, annotationStorage, changes) { 55407 if (this.data.checkBox) { 55408 this._saveCheckbox(evaluator, task, annotationStorage, changes); 55409 return; 55410 } 55411 if (this.data.radioButton) { 55412 this._saveRadioButton(evaluator, task, annotationStorage, changes); 55413 } 55414 } 55415 async _saveCheckbox(evaluator, task, annotationStorage, changes) { 55416 if (!annotationStorage) { 55417 return; 55418 } 55419 const storageEntry = annotationStorage.get(this.data.id); 55420 const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); 55421 let rotation = storageEntry?.rotation, 55422 value = storageEntry?.value; 55423 if (rotation === undefined && flags === undefined) { 55424 if (value === undefined) { 55425 return; 55426 } 55427 const defaultValue = this.data.fieldValue === this.data.exportValue; 55428 if (defaultValue === value) { 55429 return; 55430 } 55431 } 55432 let dict = evaluator.xref.fetchIfRef(this.ref); 55433 if (!(dict instanceof Dict)) { 55434 return; 55435 } 55436 dict = dict.clone(); 55437 if (rotation === undefined) { 55438 rotation = this.rotation; 55439 } 55440 if (value === undefined) { 55441 value = this.data.fieldValue === this.data.exportValue; 55442 } 55443 const xfa = { 55444 path: this.data.fieldName, 55445 value: value ? this.data.exportValue : "" 55446 }; 55447 const name = Name.get(value ? this.data.exportValue : "Off"); 55448 this.setValue(dict, name, evaluator.xref, changes); 55449 dict.set("AS", name); 55450 dict.set("M", `D:${getModificationDate()}`); 55451 if (flags !== undefined) { 55452 dict.set("F", flags); 55453 } 55454 const maybeMK = this._getMKDict(rotation); 55455 if (maybeMK) { 55456 dict.set("MK", maybeMK); 55457 } 55458 changes.put(this.ref, { 55459 data: dict, 55460 xfa, 55461 needAppearances: false 55462 }); 55463 } 55464 async _saveRadioButton(evaluator, task, annotationStorage, changes) { 55465 if (!annotationStorage) { 55466 return; 55467 } 55468 const storageEntry = annotationStorage.get(this.data.id); 55469 const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); 55470 let rotation = storageEntry?.rotation, 55471 value = storageEntry?.value; 55472 if (rotation === undefined && flags === undefined) { 55473 if (value === undefined) { 55474 return; 55475 } 55476 const defaultValue = this.data.fieldValue === this.data.buttonValue; 55477 if (defaultValue === value) { 55478 return; 55479 } 55480 } 55481 let dict = evaluator.xref.fetchIfRef(this.ref); 55482 if (!(dict instanceof Dict)) { 55483 return; 55484 } 55485 dict = dict.clone(); 55486 if (value === undefined) { 55487 value = this.data.fieldValue === this.data.buttonValue; 55488 } 55489 if (rotation === undefined) { 55490 rotation = this.rotation; 55491 } 55492 const xfa = { 55493 path: this.data.fieldName, 55494 value: value ? this.data.buttonValue : "" 55495 }; 55496 const name = Name.get(value ? this.data.buttonValue : "Off"); 55497 if (value) { 55498 this.setValue(dict, name, evaluator.xref, changes); 55499 } 55500 dict.set("AS", name); 55501 dict.set("M", `D:${getModificationDate()}`); 55502 if (flags !== undefined) { 55503 dict.set("F", flags); 55504 } 55505 const maybeMK = this._getMKDict(rotation); 55506 if (maybeMK) { 55507 dict.set("MK", maybeMK); 55508 } 55509 changes.put(this.ref, { 55510 data: dict, 55511 xfa, 55512 needAppearances: false 55513 }); 55514 } 55515 _getDefaultCheckedAppearance(params, type) { 55516 const width = this.data.rect[2] - this.data.rect[0]; 55517 const height = this.data.rect[3] - this.data.rect[1]; 55518 const bbox = [0, 0, width, height]; 55519 const FONT_RATIO = 0.8; 55520 const fontSize = Math.min(width, height) * FONT_RATIO; 55521 let metrics, char; 55522 if (type === "check") { 55523 metrics = { 55524 width: 0.755 * fontSize, 55525 height: 0.705 * fontSize 55526 }; 55527 char = "\x33"; 55528 } else if (type === "disc") { 55529 metrics = { 55530 width: 0.791 * fontSize, 55531 height: 0.705 * fontSize 55532 }; 55533 char = "\x6C"; 55534 } else { 55535 unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`); 55536 } 55537 const xShift = numberToString((width - metrics.width) / 2); 55538 const yShift = numberToString((height - metrics.height) / 2); 55539 const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; 55540 const appearanceStreamDict = new Dict(params.xref); 55541 appearanceStreamDict.set("FormType", 1); 55542 appearanceStreamDict.set("Subtype", Name.get("Form")); 55543 appearanceStreamDict.set("Type", Name.get("XObject")); 55544 appearanceStreamDict.set("BBox", bbox); 55545 appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]); 55546 appearanceStreamDict.set("Length", appearance.length); 55547 const resources = new Dict(params.xref); 55548 const font = new Dict(params.xref); 55549 font.set("PdfJsZaDb", this.fallbackFontDict); 55550 resources.set("Font", font); 55551 appearanceStreamDict.set("Resources", resources); 55552 this.checkedAppearance = new StringStream(appearance); 55553 this.checkedAppearance.dict = appearanceStreamDict; 55554 this._streams.push(this.checkedAppearance); 55555 } 55556 _processCheckBox(params) { 55557 const customAppearance = params.dict.get("AP"); 55558 if (!(customAppearance instanceof Dict)) { 55559 return; 55560 } 55561 const normalAppearance = customAppearance.get("N"); 55562 if (!(normalAppearance instanceof Dict)) { 55563 return; 55564 } 55565 const asValue = this._decodeFormValue(params.dict.get("AS")); 55566 if (typeof asValue === "string") { 55567 this.data.fieldValue = asValue; 55568 } 55569 const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes"; 55570 const exportValues = normalAppearance.getKeys(); 55571 if (exportValues.length === 0) { 55572 exportValues.push("Off", yes); 55573 } else if (exportValues.length === 1) { 55574 if (exportValues[0] === "Off") { 55575 exportValues.push(yes); 55576 } else { 55577 exportValues.unshift("Off"); 55578 } 55579 } else if (exportValues.includes(yes)) { 55580 exportValues.length = 0; 55581 exportValues.push("Off", yes); 55582 } else { 55583 const otherYes = exportValues.find(v => v !== "Off"); 55584 exportValues.length = 0; 55585 exportValues.push("Off", otherYes); 55586 } 55587 if (!exportValues.includes(this.data.fieldValue)) { 55588 this.data.fieldValue = "Off"; 55589 } 55590 this.data.exportValue = exportValues[1]; 55591 const checkedAppearance = normalAppearance.get(this.data.exportValue); 55592 this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; 55593 const uncheckedAppearance = normalAppearance.get("Off"); 55594 this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; 55595 if (this.checkedAppearance) { 55596 this._streams.push(this.checkedAppearance); 55597 } else { 55598 this._getDefaultCheckedAppearance(params, "check"); 55599 } 55600 if (this.uncheckedAppearance) { 55601 this._streams.push(this.uncheckedAppearance); 55602 } 55603 this._fallbackFontDict = this.fallbackFontDict; 55604 if (this.data.defaultFieldValue === null) { 55605 this.data.defaultFieldValue = "Off"; 55606 } 55607 } 55608 _processRadioButton(params) { 55609 this.data.buttonValue = null; 55610 const fieldParent = params.dict.get("Parent"); 55611 if (fieldParent instanceof Dict) { 55612 this.parent = params.dict.getRaw("Parent"); 55613 const fieldParentValue = fieldParent.get("V"); 55614 if (fieldParentValue instanceof Name) { 55615 this.data.fieldValue = this._decodeFormValue(fieldParentValue); 55616 } 55617 } 55618 const appearanceStates = params.dict.get("AP"); 55619 if (!(appearanceStates instanceof Dict)) { 55620 return; 55621 } 55622 const normalAppearance = appearanceStates.get("N"); 55623 if (!(normalAppearance instanceof Dict)) { 55624 return; 55625 } 55626 for (const key of normalAppearance.getKeys()) { 55627 if (key !== "Off") { 55628 this.data.buttonValue = this._decodeFormValue(key); 55629 break; 55630 } 55631 } 55632 const checkedAppearance = normalAppearance.get(this.data.buttonValue); 55633 this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; 55634 const uncheckedAppearance = normalAppearance.get("Off"); 55635 this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; 55636 if (this.checkedAppearance) { 55637 this._streams.push(this.checkedAppearance); 55638 } else { 55639 this._getDefaultCheckedAppearance(params, "disc"); 55640 } 55641 if (this.uncheckedAppearance) { 55642 this._streams.push(this.uncheckedAppearance); 55643 } 55644 this._fallbackFontDict = this.fallbackFontDict; 55645 if (this.data.defaultFieldValue === null) { 55646 this.data.defaultFieldValue = "Off"; 55647 } 55648 } 55649 _processPushButton(params) { 55650 const { 55651 dict, 55652 annotationGlobals 55653 } = params; 55654 if (!dict.has("A") && !dict.has("AA") && !this.data.alternativeText) { 55655 warn("Push buttons without action dictionaries are not supported"); 55656 return; 55657 } 55658 this.data.isTooltipOnly = !dict.has("A") && !dict.has("AA"); 55659 Catalog.parseDestDictionary({ 55660 destDict: dict, 55661 resultObj: this.data, 55662 docBaseUrl: annotationGlobals.baseUrl, 55663 docAttachments: annotationGlobals.attachments 55664 }); 55665 } 55666 getFieldObject() { 55667 let type = "button"; 55668 let exportValues; 55669 if (this.data.checkBox) { 55670 type = "checkbox"; 55671 exportValues = this.data.exportValue; 55672 } else if (this.data.radioButton) { 55673 type = "radiobutton"; 55674 exportValues = this.data.buttonValue; 55675 } 55676 return { 55677 id: this.data.id, 55678 value: this.data.fieldValue || "Off", 55679 defaultValue: this.data.defaultFieldValue, 55680 exportValues, 55681 editable: !this.data.readOnly, 55682 name: this.data.fieldName, 55683 rect: this.data.rect, 55684 hidden: this.data.hidden, 55685 actions: this.data.actions, 55686 page: this.data.pageIndex, 55687 strokeColor: this.data.borderColor, 55688 fillColor: this.data.backgroundColor, 55689 rotation: this.rotation, 55690 type 55691 }; 55692 } 55693 get fallbackFontDict() { 55694 const dict = new Dict(); 55695 dict.set("BaseFont", Name.get("ZapfDingbats")); 55696 dict.set("Type", Name.get("FallbackType")); 55697 dict.set("Subtype", Name.get("FallbackType")); 55698 dict.set("Encoding", Name.get("ZapfDingbatsEncoding")); 55699 return shadow(this, "fallbackFontDict", dict); 55700 } 55701} 55702class ChoiceWidgetAnnotation extends WidgetAnnotation { 55703 constructor(params) { 55704 super(params); 55705 const { 55706 dict, 55707 xref 55708 } = params; 55709 this.indices = dict.getArray("I"); 55710 this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0; 55711 this.data.options = []; 55712 const options = getInheritableProperty({ 55713 dict, 55714 key: "Opt" 55715 }); 55716 if (Array.isArray(options)) { 55717 for (let i = 0, ii = options.length; i < ii; i++) { 55718 const option = xref.fetchIfRef(options[i]); 55719 const isOptionArray = Array.isArray(option); 55720 this.data.options[i] = { 55721 exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option), 55722 displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option) 55723 }; 55724 } 55725 } 55726 if (!this.hasIndices) { 55727 if (typeof this.data.fieldValue === "string") { 55728 this.data.fieldValue = [this.data.fieldValue]; 55729 } else if (!this.data.fieldValue) { 55730 this.data.fieldValue = []; 55731 } 55732 } else { 55733 this.data.fieldValue = []; 55734 const ii = this.data.options.length; 55735 for (const i of this.indices) { 55736 if (Number.isInteger(i) && i >= 0 && i < ii) { 55737 this.data.fieldValue.push(this.data.options[i].exportValue); 55738 } 55739 } 55740 } 55741 if (this.data.options.length === 0 && this.data.fieldValue.length > 0) { 55742 this.data.options = this.data.fieldValue.map(value => ({ 55743 exportValue: value, 55744 displayValue: value 55745 })); 55746 } 55747 this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); 55748 this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); 55749 this._hasText = true; 55750 } 55751 getFieldObject() { 55752 const type = this.data.combo ? "combobox" : "listbox"; 55753 const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null; 55754 return { 55755 id: this.data.id, 55756 value, 55757 defaultValue: this.data.defaultFieldValue, 55758 editable: !this.data.readOnly, 55759 name: this.data.fieldName, 55760 rect: this.data.rect, 55761 numItems: this.data.fieldValue.length, 55762 multipleSelection: this.data.multiSelect, 55763 hidden: this.data.hidden, 55764 actions: this.data.actions, 55765 items: this.data.options, 55766 page: this.data.pageIndex, 55767 strokeColor: this.data.borderColor, 55768 fillColor: this.data.backgroundColor, 55769 rotation: this.rotation, 55770 type 55771 }; 55772 } 55773 amendSavedDict(annotationStorage, dict) { 55774 if (!this.hasIndices) { 55775 return; 55776 } 55777 let values = annotationStorage?.get(this.data.id)?.value; 55778 if (!Array.isArray(values)) { 55779 values = [values]; 55780 } 55781 const indices = []; 55782 const { 55783 options 55784 } = this.data; 55785 for (let i = 0, j = 0, ii = options.length; i < ii; i++) { 55786 if (options[i].exportValue === values[j]) { 55787 indices.push(i); 55788 j += 1; 55789 } 55790 } 55791 dict.set("I", indices); 55792 } 55793 async _getAppearance(evaluator, task, intent, annotationStorage) { 55794 if (this.data.combo) { 55795 return super._getAppearance(evaluator, task, intent, annotationStorage); 55796 } 55797 let exportedValue, rotation; 55798 const storageEntry = annotationStorage?.get(this.data.id); 55799 if (storageEntry) { 55800 rotation = storageEntry.rotation; 55801 exportedValue = storageEntry.value; 55802 } 55803 if (rotation === undefined && exportedValue === undefined && !this._needAppearances) { 55804 return null; 55805 } 55806 if (exportedValue === undefined) { 55807 exportedValue = this.data.fieldValue; 55808 } else if (!Array.isArray(exportedValue)) { 55809 exportedValue = [exportedValue]; 55810 } 55811 const defaultPadding = 1; 55812 const defaultHPadding = 2; 55813 let totalHeight = this.data.rect[3] - this.data.rect[1]; 55814 let totalWidth = this.data.rect[2] - this.data.rect[0]; 55815 if (rotation === 90 || rotation === 270) { 55816 [totalWidth, totalHeight] = [totalHeight, totalWidth]; 55817 } 55818 const lineCount = this.data.options.length; 55819 const valueIndices = []; 55820 for (let i = 0; i < lineCount; i++) { 55821 const { 55822 exportValue 55823 } = this.data.options[i]; 55824 if (exportedValue.includes(exportValue)) { 55825 valueIndices.push(i); 55826 } 55827 } 55828 if (!this._defaultAppearance) { 55829 this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); 55830 } 55831 const font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); 55832 let defaultAppearance; 55833 let { 55834 fontSize 55835 } = this.data.defaultAppearanceData; 55836 if (!fontSize) { 55837 const lineHeight = (totalHeight - defaultPadding) / lineCount; 55838 let lineWidth = -1; 55839 let value; 55840 for (const { 55841 displayValue 55842 } of this.data.options) { 55843 const width = this._getTextWidth(displayValue, font); 55844 if (width > lineWidth) { 55845 lineWidth = width; 55846 value = displayValue; 55847 } 55848 } 55849 [defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1); 55850 } else { 55851 defaultAppearance = this._defaultAppearance; 55852 } 55853 const lineHeight = fontSize * LINE_FACTOR; 55854 const vPadding = (lineHeight - fontSize) / 2; 55855 const numberOfVisibleLines = Math.floor(totalHeight / lineHeight); 55856 let firstIndex = 0; 55857 if (valueIndices.length > 0) { 55858 const minIndex = Math.min(...valueIndices); 55859 const maxIndex = Math.max(...valueIndices); 55860 firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1); 55861 if (firstIndex > minIndex) { 55862 firstIndex = minIndex; 55863 } 55864 } 55865 const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount); 55866 const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`]; 55867 if (valueIndices.length) { 55868 buf.push("0.600006 0.756866 0.854904 rg"); 55869 for (const index of valueIndices) { 55870 if (firstIndex <= index && index < end) { 55871 buf.push(`1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`); 55872 } 55873 } 55874 } 55875 buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`); 55876 const prevInfo = { 55877 shift: 0 55878 }; 55879 for (let i = firstIndex; i < end; i++) { 55880 const { 55881 displayValue 55882 } = this.data.options[i]; 55883 const vpadding = i === firstIndex ? vPadding : 0; 55884 buf.push(this._renderText(displayValue, font, fontSize, totalWidth, 0, prevInfo, defaultHPadding, -lineHeight + vpadding)); 55885 } 55886 buf.push("ET Q EMC"); 55887 return buf.join("\n"); 55888 } 55889} 55890class SignatureWidgetAnnotation extends WidgetAnnotation { 55891 constructor(params) { 55892 super(params); 55893 this.data.fieldValue = null; 55894 this.data.hasOwnCanvas = this.data.noRotate; 55895 this.data.noHTML = !this.data.hasOwnCanvas; 55896 } 55897 getFieldObject() { 55898 return { 55899 id: this.data.id, 55900 value: null, 55901 page: this.data.pageIndex, 55902 type: "signature" 55903 }; 55904 } 55905} 55906class TextAnnotation extends MarkupAnnotation { 55907 constructor(params) { 55908 const DEFAULT_ICON_SIZE = 22; 55909 super(params); 55910 this.data.noRotate = true; 55911 this.data.hasOwnCanvas = this.data.noRotate; 55912 this.data.noHTML = false; 55913 const { 55914 dict 55915 } = params; 55916 this.data.annotationType = AnnotationType.TEXT; 55917 if (this.data.hasAppearance) { 55918 this.data.name = "NoIcon"; 55919 } else { 55920 this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; 55921 this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; 55922 this.data.name = dict.has("Name") ? dict.get("Name").name : "Note"; 55923 } 55924 if (dict.has("State")) { 55925 this.data.state = dict.get("State") || null; 55926 this.data.stateModel = dict.get("StateModel") || null; 55927 } else { 55928 this.data.state = null; 55929 this.data.stateModel = null; 55930 } 55931 } 55932} 55933class LinkAnnotation extends Annotation { 55934 constructor(params) { 55935 super(params); 55936 const { 55937 dict, 55938 annotationGlobals 55939 } = params; 55940 this.data.annotationType = AnnotationType.LINK; 55941 this.data.noHTML = false;
vendor: 4,742 bytes, lines 55942-56108
55942 const quadPoints = getQuadPoints(dict, this.rectangle); 55943 if (quadPoints) { 55944 this.data.quadPoints = quadPoints; 55945 } 55946 this.data.borderColor ||= this.data.color; 55947 Catalog.parseDestDictionary({ 55948 destDict: dict, 55949 resultObj: this.data, 55950 docBaseUrl: annotationGlobals.baseUrl, 55951 docAttachments: annotationGlobals.attachments 55952 }); 55953 } 55954} 55955class PopupAnnotation extends Annotation { 55956 constructor(params) { 55957 super(params); 55958 const { 55959 dict 55960 } = params; 55961 this.data.annotationType = AnnotationType.POPUP; 55962 this.data.noHTML = false; 55963 if (this.data.rect[0] === this.data.rect[2] || this.data.rect[1] === this.data.rect[3]) { 55964 this.data.rect = null; 55965 } 55966 let parentItem = dict.get("Parent"); 55967 if (!parentItem) { 55968 warn("Popup annotation has a missing or invalid parent annotation."); 55969 return; 55970 } 55971 this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null); 55972 const rt = parentItem.get("RT"); 55973 if (isName(rt, AnnotationReplyType.GROUP)) { 55974 parentItem = parentItem.get("IRT"); 55975 } 55976 if (!parentItem.has("M")) { 55977 this.data.modificationDate = null; 55978 } else { 55979 this.setModificationDate(parentItem.get("M")); 55980 this.data.modificationDate = this.modificationDate; 55981 } 55982 if (!parentItem.has("C")) { 55983 this.data.color = null; 55984 } else { 55985 this.setColor(parentItem.getArray("C")); 55986 this.data.color = this.color; 55987 } 55988 if (!this.viewable) { 55989 const parentFlags = parentItem.get("F"); 55990 if (this._isViewable(parentFlags)) { 55991 this.setFlags(parentFlags); 55992 } 55993 } 55994 this.setTitle(parentItem.get("T")); 55995 this.data.titleObj = this._title; 55996 this.setContents(parentItem.get("Contents")); 55997 this.data.contentsObj = this._contents; 55998 if (parentItem.has("RC")) { 55999 this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC")); 56000 } 56001 this.data.open = !!dict.get("Open"); 56002 } 56003} 56004class FreeTextAnnotation extends MarkupAnnotation { 56005 constructor(params) { 56006 super(params); 56007 this.data.hasOwnCanvas = this.data.noRotate; 56008 this.data.isEditable = !this.data.noHTML; 56009 this.data.noHTML = false; 56010 const { 56011 evaluatorOptions, 56012 xref 56013 } = params; 56014 this.data.annotationType = AnnotationType.FREETEXT; 56015 this.setDefaultAppearance(params); 56016 this._hasAppearance = !!this.appearance; 56017 if (this._hasAppearance) { 56018 const { 56019 fontColor, 56020 fontSize 56021 } = parseAppearanceStream(this.appearance, evaluatorOptions, xref); 56022 this.data.defaultAppearanceData.fontColor = fontColor; 56023 this.data.defaultAppearanceData.fontSize = fontSize || 10; 56024 } else { 56025 this.data.defaultAppearanceData.fontSize ||= 10; 56026 const { 56027 fontColor, 56028 fontSize 56029 } = this.data.defaultAppearanceData; 56030 if (this._contents.str) { 56031 this.data.textContent = this._contents.str.split(/\r\n?|\n/).map(line => line.trimEnd()); 56032 const { 56033 coords, 56034 bbox, 56035 matrix 56036 } = FakeUnicodeFont.getFirstPositionInfo(this.rectangle, this.rotation, fontSize); 56037 this.data.textPosition = this._transformPoint(coords, bbox, matrix); 56038 } 56039 if (this._isOffscreenCanvasSupported) { 56040 const strokeAlpha = params.dict.get("CA"); 56041 const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif"); 56042 this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontSize, fontColor, strokeAlpha); 56043 this._streams.push(this.appearance); 56044 } else { 56045 warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly."); 56046 } 56047 } 56048 } 56049 get hasTextContent() { 56050 return this._hasAppearance; 56051 } 56052 static createNewDict(annotation, xref, { 56053 apRef, 56054 ap 56055 }) { 56056 const { 56057 color, 56058 fontSize, 56059 oldAnnotation, 56060 rect, 56061 rotation, 56062 user, 56063 value 56064 } = annotation; 56065 const freetext = oldAnnotation || new Dict(xref); 56066 freetext.set("Type", Name.get("Annot")); 56067 freetext.set("Subtype", Name.get("FreeText")); 56068 if (oldAnnotation) { 56069 freetext.set("M", `D:${getModificationDate()}`); 56070 freetext.delete("RC"); 56071 } else { 56072 freetext.set("CreationDate", `D:${getModificationDate()}`); 56073 } 56074 freetext.set("Rect", rect); 56075 const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; 56076 freetext.set("DA", da); 56077 freetext.set("Contents", stringToAsciiOrUTF16BE(value)); 56078 freetext.set("F", 4); 56079 freetext.set("Border", [0, 0, 0]); 56080 freetext.set("Rotate", rotation); 56081 if (user) { 56082 freetext.set("T", stringToAsciiOrUTF16BE(user)); 56083 } 56084 if (apRef || ap) { 56085 const n = new Dict(xref); 56086 freetext.set("AP", n); 56087 if (apRef) { 56088 n.set("N", apRef); 56089 } else { 56090 n.set("N", ap); 56091 } 56092 } 56093 return freetext; 56094 } 56095 static async createNewAppearanceStream(annotation, xref, params) { 56096 const { 56097 baseFontRef, 56098 evaluator, 56099 task 56100 } = params; 56101 const { 56102 color, 56103 fontSize, 56104 rect, 56105 rotation, 56106 value 56107 } = annotation; 56108 const resources = new Dict(xref);
vendor: 10,013 bytes, lines 56109-56403
56109 const font = new Dict(xref); 56110 if (baseFontRef) { 56111 font.set("Helv", baseFontRef); 56112 } else { 56113 const baseFont = new Dict(xref); 56114 baseFont.set("BaseFont", Name.get("Helvetica")); 56115 baseFont.set("Type", Name.get("Font")); 56116 baseFont.set("Subtype", Name.get("Type1")); 56117 baseFont.set("Encoding", Name.get("WinAnsiEncoding")); 56118 font.set("Helv", baseFont); 56119 } 56120 resources.set("Font", font); 56121 const helv = await WidgetAnnotation._getFontData(evaluator, task, { 56122 fontName: "Helv", 56123 fontSize 56124 }, resources); 56125 const [x1, y1, x2, y2] = rect; 56126 let w = x2 - x1; 56127 let h = y2 - y1; 56128 if (rotation % 180 !== 0) { 56129 [w, h] = [h, w]; 56130 } 56131 const lines = value.split("\n"); 56132 const scale = fontSize / 1000; 56133 let totalWidth = -Infinity; 56134 const encodedLines = []; 56135 for (let line of lines) { 56136 const encoded = helv.encodeString(line); 56137 if (encoded.length > 1) { 56138 return null; 56139 } 56140 line = encoded.join(""); 56141 encodedLines.push(line); 56142 let lineWidth = 0; 56143 const glyphs = helv.charsToGlyphs(line); 56144 for (const glyph of glyphs) { 56145 lineWidth += glyph.width * scale; 56146 } 56147 totalWidth = Math.max(totalWidth, lineWidth); 56148 } 56149 let hscale = 1; 56150 if (totalWidth > w) { 56151 hscale = w / totalWidth; 56152 } 56153 let vscale = 1; 56154 const lineHeight = LINE_FACTOR * fontSize; 56155 const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize; 56156 const totalHeight = lineHeight * lines.length; 56157 if (totalHeight > h) { 56158 vscale = h / totalHeight; 56159 } 56160 const fscale = Math.min(hscale, vscale); 56161 const newFontSize = fontSize * fscale; 56162 let firstPoint, clipBox, matrix; 56163 switch (rotation) { 56164 case 0: 56165 matrix = [1, 0, 0, 1]; 56166 clipBox = [rect[0], rect[1], w, h]; 56167 firstPoint = [rect[0], rect[3] - lineAscent]; 56168 break; 56169 case 90: 56170 matrix = [0, 1, -1, 0]; 56171 clipBox = [rect[1], -rect[2], w, h]; 56172 firstPoint = [rect[1], -rect[0] - lineAscent]; 56173 break; 56174 case 180: 56175 matrix = [-1, 0, 0, -1]; 56176 clipBox = [-rect[2], -rect[3], w, h]; 56177 firstPoint = [-rect[2], -rect[1] - lineAscent]; 56178 break; 56179 case 270: 56180 matrix = [0, -1, 1, 0]; 56181 clipBox = [-rect[3], rect[0], w, h]; 56182 firstPoint = [-rect[3], rect[2] - lineAscent]; 56183 break; 56184 } 56185 const buffer = ["q", `${matrix.join(" ")} 0 0 cm`, `${clipBox.join(" ")} re W n`, `BT`, `${getPdfColor(color, true)}`, `0 Tc /Helv ${numberToString(newFontSize)} Tf`]; 56186 buffer.push(`${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`); 56187 const vShift = numberToString(lineHeight); 56188 for (let i = 1, ii = encodedLines.length; i < ii; i++) { 56189 const line = encodedLines[i]; 56190 buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`); 56191 } 56192 buffer.push("ET", "Q"); 56193 const appearance = buffer.join("\n"); 56194 const appearanceStreamDict = new Dict(xref); 56195 appearanceStreamDict.set("FormType", 1); 56196 appearanceStreamDict.set("Subtype", Name.get("Form")); 56197 appearanceStreamDict.set("Type", Name.get("XObject")); 56198 appearanceStreamDict.set("BBox", rect); 56199 appearanceStreamDict.set("Resources", resources); 56200 appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]); 56201 const ap = new StringStream(appearance); 56202 ap.dict = appearanceStreamDict; 56203 return ap; 56204 } 56205} 56206class LineAnnotation extends MarkupAnnotation { 56207 constructor(params) { 56208 super(params); 56209 const { 56210 dict, 56211 xref 56212 } = params; 56213 this.data.annotationType = AnnotationType.LINE; 56214 this.data.hasOwnCanvas = this.data.noRotate; 56215 this.data.noHTML = false; 56216 const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]); 56217 this.data.lineCoordinates = Util.normalizeRect(lineCoordinates); 56218 this.setLineEndings(dict.getArray("LE")); 56219 this.data.lineEndings = this.lineEndings; 56220 if (!this.appearance) { 56221 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56222 const strokeAlpha = dict.get("CA"); 56223 const interiorColor = getRgbColor(dict.getArray("IC"), null); 56224 const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; 56225 const fillAlpha = fillColor ? strokeAlpha : null; 56226 const borderWidth = this.borderStyle.width || 1, 56227 borderAdjust = 2 * borderWidth; 56228 const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust]; 56229 if (!Util.intersect(this.rectangle, bbox)) { 56230 this.rectangle = bbox; 56231 } 56232 this._setDefaultAppearance({ 56233 xref, 56234 extra: `${borderWidth} w`, 56235 strokeColor, 56236 fillColor, 56237 strokeAlpha, 56238 fillAlpha, 56239 pointsCallback: (buffer, points) => { 56240 buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S"); 56241 return [points[0] - borderWidth, points[2] + borderWidth, points[7] - borderWidth, points[3] + borderWidth]; 56242 } 56243 }); 56244 } 56245 } 56246} 56247class SquareAnnotation extends MarkupAnnotation { 56248 constructor(params) { 56249 super(params); 56250 const { 56251 dict, 56252 xref 56253 } = params; 56254 this.data.annotationType = AnnotationType.SQUARE; 56255 this.data.hasOwnCanvas = this.data.noRotate; 56256 this.data.noHTML = false; 56257 if (!this.appearance) { 56258 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56259 const strokeAlpha = dict.get("CA"); 56260 const interiorColor = getRgbColor(dict.getArray("IC"), null); 56261 const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; 56262 const fillAlpha = fillColor ? strokeAlpha : null; 56263 if (this.borderStyle.width === 0 && !fillColor) { 56264 return; 56265 } 56266 this._setDefaultAppearance({ 56267 xref, 56268 extra: `${this.borderStyle.width} w`, 56269 strokeColor, 56270 fillColor, 56271 strokeAlpha, 56272 fillAlpha, 56273 pointsCallback: (buffer, points) => { 56274 const x = points[4] + this.borderStyle.width / 2; 56275 const y = points[5] + this.borderStyle.width / 2; 56276 const width = points[6] - points[4] - this.borderStyle.width; 56277 const height = points[3] - points[7] - this.borderStyle.width; 56278 buffer.push(`${x} ${y} ${width} ${height} re`); 56279 if (fillColor) { 56280 buffer.push("B"); 56281 } else { 56282 buffer.push("S"); 56283 } 56284 return [points[0], points[2], points[7], points[3]]; 56285 } 56286 }); 56287 } 56288 } 56289} 56290class CircleAnnotation extends MarkupAnnotation { 56291 constructor(params) { 56292 super(params); 56293 const { 56294 dict, 56295 xref 56296 } = params; 56297 this.data.annotationType = AnnotationType.CIRCLE; 56298 if (!this.appearance) { 56299 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56300 const strokeAlpha = dict.get("CA"); 56301 const interiorColor = getRgbColor(dict.getArray("IC"), null); 56302 const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; 56303 const fillAlpha = fillColor ? strokeAlpha : null; 56304 if (this.borderStyle.width === 0 && !fillColor) { 56305 return; 56306 } 56307 const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4)); 56308 this._setDefaultAppearance({ 56309 xref, 56310 extra: `${this.borderStyle.width} w`, 56311 strokeColor, 56312 fillColor, 56313 strokeAlpha, 56314 fillAlpha, 56315 pointsCallback: (buffer, points) => { 56316 const x0 = points[0] + this.borderStyle.width / 2; 56317 const y0 = points[1] - this.borderStyle.width / 2; 56318 const x1 = points[6] - this.borderStyle.width / 2; 56319 const y1 = points[7] + this.borderStyle.width / 2; 56320 const xMid = x0 + (x1 - x0) / 2; 56321 const yMid = y0 + (y1 - y0) / 2; 56322 const xOffset = (x1 - x0) / 2 * controlPointsDistance; 56323 const yOffset = (y1 - y0) / 2 * controlPointsDistance; 56324 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"); 56325 if (fillColor) { 56326 buffer.push("B"); 56327 } else { 56328 buffer.push("S"); 56329 } 56330 return [points[0], points[2], points[7], points[3]]; 56331 } 56332 }); 56333 } 56334 } 56335} 56336class PolylineAnnotation extends MarkupAnnotation { 56337 constructor(params) { 56338 super(params); 56339 const { 56340 dict, 56341 xref 56342 } = params; 56343 this.data.annotationType = AnnotationType.POLYLINE; 56344 this.data.hasOwnCanvas = this.data.noRotate; 56345 this.data.noHTML = false; 56346 this.data.vertices = null; 56347 if (!(this instanceof PolygonAnnotation)) { 56348 this.setLineEndings(dict.getArray("LE")); 56349 this.data.lineEndings = this.lineEndings; 56350 } 56351 const rawVertices = dict.getArray("Vertices"); 56352 if (!isNumberArray(rawVertices, null)) { 56353 return; 56354 } 56355 const vertices = this.data.vertices = Float32Array.from(rawVertices); 56356 if (!this.appearance) { 56357 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56358 const strokeAlpha = dict.get("CA"); 56359 const borderWidth = this.borderStyle.width || 1, 56360 borderAdjust = 2 * borderWidth; 56361 const bbox = [Infinity, Infinity, -Infinity, -Infinity]; 56362 for (let i = 0, ii = vertices.length; i < ii; i += 2) { 56363 bbox[0] = Math.min(bbox[0], vertices[i] - borderAdjust); 56364 bbox[1] = Math.min(bbox[1], vertices[i + 1] - borderAdjust); 56365 bbox[2] = Math.max(bbox[2], vertices[i] + borderAdjust); 56366 bbox[3] = Math.max(bbox[3], vertices[i + 1] + borderAdjust); 56367 } 56368 if (!Util.intersect(this.rectangle, bbox)) { 56369 this.rectangle = bbox; 56370 } 56371 this._setDefaultAppearance({ 56372 xref, 56373 extra: `${borderWidth} w`, 56374 strokeColor, 56375 strokeAlpha, 56376 pointsCallback: (buffer, points) => { 56377 for (let i = 0, ii = vertices.length; i < ii; i += 2) { 56378 buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`); 56379 } 56380 buffer.push("S"); 56381 return [points[0], points[2], points[7], points[3]]; 56382 } 56383 }); 56384 } 56385 } 56386} 56387class PolygonAnnotation extends PolylineAnnotation { 56388 constructor(params) { 56389 super(params); 56390 this.data.annotationType = AnnotationType.POLYGON; 56391 } 56392} 56393class CaretAnnotation extends MarkupAnnotation { 56394 constructor(params) { 56395 super(params); 56396 this.data.annotationType = AnnotationType.CARET; 56397 } 56398} 56399class InkAnnotation extends MarkupAnnotation { 56400 constructor(params) { 56401 super(params); 56402 this.data.hasOwnCanvas = this.data.noRotate; 56403 this.data.noHTML = false;
56404 const { 56405 dict, 56406 xref 56407 } = params; 56408 this.data.annotationType = AnnotationType.INK; 56409 this.data.inkLists = []; 56410 this.data.isEditable = !this.data.noHTML; 56411 this.data.noHTML = false; 56412 this.data.opacity = dict.get("CA") || 1; 56413 const rawInkLists = dict.getArray("InkList"); 56414 if (!Array.isArray(rawInkLists)) { 56415 return; 56416 } 56417 for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { 56418 if (!Array.isArray(rawInkLists[i])) { 56419 continue; 56420 } 56421 const inkList = new Float32Array(rawInkLists[i].length); 56422 this.data.inkLists.push(inkList); 56423 for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { 56424 const x = xref.fetchIfRef(rawInkLists[i][j]), 56425 y = xref.fetchIfRef(rawInkLists[i][j + 1]); 56426 if (typeof x === "number" && typeof y === "number") { 56427 inkList[j] = x; 56428 inkList[j + 1] = y; 56429 } 56430 } 56431 } 56432 if (!this.appearance) { 56433 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56434 const strokeAlpha = dict.get("CA"); 56435 const borderWidth = this.borderStyle.width || 1, 56436 borderAdjust = 2 * borderWidth; 56437 const bbox = [Infinity, Infinity, -Infinity, -Infinity]; 56438 for (const inkList of this.data.inkLists) { 56439 for (let i = 0, ii = inkList.length; i < ii; i += 2) { 56440 bbox[0] = Math.min(bbox[0], inkList[i] - borderAdjust); 56441 bbox[1] = Math.min(bbox[1], inkList[i + 1] - borderAdjust); 56442 bbox[2] = Math.max(bbox[2], inkList[i] + borderAdjust); 56443 bbox[3] = Math.max(bbox[3], inkList[i + 1] + borderAdjust); 56444 } 56445 } 56446 if (!Util.intersect(this.rectangle, bbox)) { 56447 this.rectangle = bbox; 56448 } 56449 this._setDefaultAppearance({ 56450 xref, 56451 extra: `${borderWidth} w`, 56452 strokeColor, 56453 strokeAlpha, 56454 pointsCallback: (buffer, points) => { 56455 for (const inkList of this.data.inkLists) { 56456 for (let i = 0, ii = inkList.length; i < ii; i += 2) { 56457 buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`); 56458 } 56459 buffer.push("S"); 56460 } 56461 return [points[0], points[2], points[7], points[3]]; 56462 } 56463 }); 56464 } 56465 } 56466 static createNewDict(annotation, xref, { 56467 apRef, 56468 ap 56469 }) { 56470 const { 56471 oldAnnotation, 56472 color, 56473 opacity, 56474 paths, 56475 outlines, 56476 rect, 56477 rotation, 56478 thickness, 56479 user 56480 } = annotation; 56481 const ink = oldAnnotation || new Dict(xref); 56482 ink.set("Type", Name.get("Annot")); 56483 ink.set("Subtype", Name.get("Ink")); 56484 ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); 56485 ink.set("Rect", rect); 56486 ink.set("InkList", outlines?.points || paths.points); 56487 ink.set("F", 4); 56488 ink.set("Rotate", rotation); 56489 if (user) { 56490 ink.set("T", stringToAsciiOrUTF16BE(user)); 56491 } 56492 if (outlines) { 56493 ink.set("IT", Name.get("InkHighlight")); 56494 } 56495 const bs = new Dict(xref); 56496 ink.set("BS", bs); 56497 bs.set("W", thickness); 56498 ink.set("C", Array.from(color, c => c / 255)); 56499 ink.set("CA", opacity); 56500 const n = new Dict(xref); 56501 ink.set("AP", n); 56502 if (apRef) { 56503 n.set("N", apRef); 56504 } else { 56505 n.set("N", ap); 56506 } 56507 return ink; 56508 } 56509 static async createNewAppearanceStream(annotation, xref, params) { 56510 if (annotation.outlines) { 56511 return this.createNewAppearanceStreamForHighlight(annotation, xref, params); 56512 } 56513 const { 56514 color, 56515 rect, 56516 paths, 56517 thickness, 56518 opacity 56519 } = annotation; 56520 const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`]; 56521 if (opacity !== 1) { 56522 appearanceBuffer.push("/R0 gs"); 56523 } 56524 for (const outline of paths.lines) { 56525 appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); 56526 for (let i = 6, ii = outline.length; i < ii; i += 6) { 56527 if (isNaN(outline[i])) { 56528 appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); 56529 } else { 56530 const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); 56531 appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); 56532 } 56533 } 56534 if (outline.length === 6) { 56535 appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} l`); 56536 } 56537 } 56538 appearanceBuffer.push("S"); 56539 const appearance = appearanceBuffer.join("\n"); 56540 const appearanceStreamDict = new Dict(xref); 56541 appearanceStreamDict.set("FormType", 1); 56542 appearanceStreamDict.set("Subtype", Name.get("Form")); 56543 appearanceStreamDict.set("Type", Name.get("XObject")); 56544 appearanceStreamDict.set("BBox", rect); 56545 appearanceStreamDict.set("Length", appearance.length); 56546 if (opacity !== 1) { 56547 const resources = new Dict(xref); 56548 const extGState = new Dict(xref); 56549 const r0 = new Dict(xref); 56550 r0.set("CA", opacity);
vendor: 4,890 bytes, lines 56551-56699
56551 r0.set("Type", Name.get("ExtGState")); 56552 extGState.set("R0", r0); 56553 resources.set("ExtGState", extGState); 56554 appearanceStreamDict.set("Resources", resources); 56555 } 56556 const ap = new StringStream(appearance); 56557 ap.dict = appearanceStreamDict; 56558 return ap; 56559 } 56560 static async createNewAppearanceStreamForHighlight(annotation, xref, params) { 56561 const { 56562 color, 56563 rect, 56564 outlines: { 56565 outline 56566 }, 56567 opacity 56568 } = annotation; 56569 const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; 56570 appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); 56571 for (let i = 6, ii = outline.length; i < ii; i += 6) { 56572 if (isNaN(outline[i])) { 56573 appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); 56574 } else { 56575 const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); 56576 appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); 56577 } 56578 } 56579 appearanceBuffer.push("h f"); 56580 const appearance = appearanceBuffer.join("\n"); 56581 const appearanceStreamDict = new Dict(xref); 56582 appearanceStreamDict.set("FormType", 1); 56583 appearanceStreamDict.set("Subtype", Name.get("Form")); 56584 appearanceStreamDict.set("Type", Name.get("XObject")); 56585 appearanceStreamDict.set("BBox", rect); 56586 appearanceStreamDict.set("Length", appearance.length); 56587 const resources = new Dict(xref); 56588 const extGState = new Dict(xref); 56589 resources.set("ExtGState", extGState); 56590 appearanceStreamDict.set("Resources", resources); 56591 const r0 = new Dict(xref); 56592 extGState.set("R0", r0); 56593 r0.set("BM", Name.get("Multiply")); 56594 if (opacity !== 1) { 56595 r0.set("ca", opacity); 56596 r0.set("Type", Name.get("ExtGState")); 56597 } 56598 const ap = new StringStream(appearance); 56599 ap.dict = appearanceStreamDict; 56600 return ap; 56601 } 56602} 56603class HighlightAnnotation extends MarkupAnnotation { 56604 constructor(params) { 56605 super(params); 56606 const { 56607 dict, 56608 xref 56609 } = params; 56610 this.data.annotationType = AnnotationType.HIGHLIGHT; 56611 this.data.isEditable = !this.data.noHTML; 56612 this.data.noHTML = false; 56613 this.data.opacity = dict.get("CA") || 1; 56614 const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); 56615 if (quadPoints) { 56616 const resources = this.appearance?.dict.get("Resources"); 56617 if (!this.appearance || !resources?.has("ExtGState")) { 56618 if (this.appearance) { 56619 warn("HighlightAnnotation - ignoring built-in appearance stream."); 56620 } 56621 const fillColor = this.color ? getPdfColorArray(this.color) : [1, 1, 0]; 56622 const fillAlpha = dict.get("CA"); 56623 this._setDefaultAppearance({ 56624 xref, 56625 fillColor, 56626 blendMode: "Multiply", 56627 fillAlpha, 56628 pointsCallback: (buffer, points) => { 56629 buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f"); 56630 return [points[0], points[2], points[7], points[3]]; 56631 } 56632 }); 56633 } 56634 } else { 56635 this.data.popupRef = null; 56636 } 56637 } 56638 static createNewDict(annotation, xref, { 56639 apRef, 56640 ap 56641 }) { 56642 const { 56643 color, 56644 oldAnnotation, 56645 opacity, 56646 rect, 56647 rotation, 56648 user, 56649 quadPoints 56650 } = annotation; 56651 const highlight = oldAnnotation || new Dict(xref); 56652 highlight.set("Type", Name.get("Annot")); 56653 highlight.set("Subtype", Name.get("Highlight")); 56654 highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); 56655 highlight.set("CreationDate", `D:${getModificationDate()}`); 56656 highlight.set("Rect", rect); 56657 highlight.set("F", 4); 56658 highlight.set("Border", [0, 0, 0]); 56659 highlight.set("Rotate", rotation); 56660 highlight.set("QuadPoints", quadPoints); 56661 highlight.set("C", Array.from(color, c => c / 255)); 56662 highlight.set("CA", opacity); 56663 if (user) { 56664 highlight.set("T", stringToAsciiOrUTF16BE(user)); 56665 } 56666 if (apRef || ap) { 56667 const n = new Dict(xref); 56668 highlight.set("AP", n); 56669 n.set("N", apRef || ap); 56670 } 56671 return highlight; 56672 } 56673 static async createNewAppearanceStream(annotation, xref, params) { 56674 const { 56675 color, 56676 rect, 56677 outlines, 56678 opacity 56679 } = annotation; 56680 const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; 56681 const buffer = []; 56682 for (const outline of outlines) { 56683 buffer.length = 0; 56684 buffer.push(`${numberToString(outline[0])} ${numberToString(outline[1])} m`); 56685 for (let i = 2, ii = outline.length; i < ii; i += 2) { 56686 buffer.push(`${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`); 56687 } 56688 buffer.push("h"); 56689 appearanceBuffer.push(buffer.join("\n")); 56690 } 56691 appearanceBuffer.push("f*"); 56692 const appearance = appearanceBuffer.join("\n"); 56693 const appearanceStreamDict = new Dict(xref); 56694 appearanceStreamDict.set("FormType", 1); 56695 appearanceStreamDict.set("Subtype", Name.get("Form")); 56696 appearanceStreamDict.set("Type", Name.get("XObject")); 56697 appearanceStreamDict.set("BBox", rect); 56698 appearanceStreamDict.set("Length", appearance.length); 56699 const resources = new Dict(xref);
56700 const extGState = new Dict(xref); 56701 resources.set("ExtGState", extGState); 56702 appearanceStreamDict.set("Resources", resources); 56703 const r0 = new Dict(xref); 56704 extGState.set("R0", r0); 56705 r0.set("BM", Name.get("Multiply")); 56706 if (opacity !== 1) { 56707 r0.set("ca", opacity); 56708 r0.set("Type", Name.get("ExtGState")); 56709 } 56710 const ap = new StringStream(appearance); 56711 ap.dict = appearanceStreamDict; 56712 return ap; 56713 } 56714} 56715class UnderlineAnnotation extends MarkupAnnotation { 56716 constructor(params) { 56717 super(params); 56718 const { 56719 dict, 56720 xref 56721 } = params; 56722 this.data.annotationType = AnnotationType.UNDERLINE; 56723 const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); 56724 if (quadPoints) { 56725 if (!this.appearance) { 56726 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56727 const strokeAlpha = dict.get("CA"); 56728 this._setDefaultAppearance({ 56729 xref, 56730 extra: "[] 0 d 0.571 w", 56731 strokeColor, 56732 strokeAlpha, 56733 pointsCallback: (buffer, points) => { 56734 buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S"); 56735 return [points[0], points[2], points[7], points[3]]; 56736 } 56737 }); 56738 } 56739 } else { 56740 this.data.popupRef = null; 56741 } 56742 } 56743} 56744class SquigglyAnnotation extends MarkupAnnotation { 56745 constructor(params) { 56746 super(params); 56747 const { 56748 dict, 56749 xref 56750 } = params; 56751 this.data.annotationType = AnnotationType.SQUIGGLY; 56752 const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); 56753 if (quadPoints) { 56754 if (!this.appearance) { 56755 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56756 const strokeAlpha = dict.get("CA"); 56757 this._setDefaultAppearance({ 56758 xref, 56759 extra: "[] 0 d 1 w", 56760 strokeColor, 56761 strokeAlpha, 56762 pointsCallback: (buffer, points) => { 56763 const dy = (points[1] - points[5]) / 6; 56764 let shift = dy; 56765 let x = points[4]; 56766 const y = points[5]; 56767 const xEnd = points[6]; 56768 buffer.push(`${x} ${y + shift} m`); 56769 do { 56770 x += 2; 56771 shift = shift === 0 ? dy : 0; 56772 buffer.push(`${x} ${y + shift} l`); 56773 } while (x < xEnd); 56774 buffer.push("S"); 56775 return [points[4], xEnd, y - 2 * dy, y + 2 * dy]; 56776 } 56777 }); 56778 } 56779 } else { 56780 this.data.popupRef = null; 56781 } 56782 } 56783} 56784class StrikeOutAnnotation extends MarkupAnnotation { 56785 constructor(params) { 56786 super(params); 56787 const { 56788 dict, 56789 xref 56790 } = params; 56791 this.data.annotationType = AnnotationType.STRIKEOUT; 56792 const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); 56793 if (quadPoints) { 56794 if (!this.appearance) { 56795 const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; 56796 const strokeAlpha = dict.get("CA"); 56797 this._setDefaultAppearance({ 56798 xref, 56799 extra: "[] 0 d 1 w", 56800 strokeColor, 56801 strokeAlpha, 56802 pointsCallback: (buffer, points) => { 56803 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"); 56804 return [points[0], points[2], points[7], points[3]]; 56805 } 56806 }); 56807 } 56808 } else { 56809 this.data.popupRef = null; 56810 } 56811 } 56812} 56813class StampAnnotation extends MarkupAnnotation { 56814 #savedHasOwnCanvas; 56815 constructor(params) { 56816 super(params); 56817 this.data.annotationType = AnnotationType.STAMP; 56818 this.#savedHasOwnCanvas = this.data.hasOwnCanvas = this.data.noRotate; 56819 this.data.isEditable = !this.data.noHTML; 56820 this.data.noHTML = false; 56821 } 56822 mustBeViewedWhenEditing(isEditing, modifiedIds = null) { 56823 if (isEditing) { 56824 if (!this.data.isEditable) { 56825 return false; 56826 } 56827 this.#savedHasOwnCanvas = this.data.hasOwnCanvas; 56828 this.data.hasOwnCanvas = true; 56829 return true; 56830 } 56831 this.data.hasOwnCanvas = this.#savedHasOwnCanvas; 56832 return !modifiedIds?.has(this.data.id); 56833 } 56834 static async createImage(bitmap, xref) { 56835 const { 56836 width, 56837 height 56838 } = bitmap; 56839 const canvas = new OffscreenCanvas(width, height); 56840 const ctx = canvas.getContext("2d", { 56841 alpha: true 56842 }); 56843 ctx.drawImage(bitmap, 0, 0); 56844 const data = ctx.getImageData(0, 0, width, height).data; 56845 const buf32 = new Uint32Array(data.buffer); 56846 const hasAlpha = buf32.some(FeatureTest.isLittleEndian ? x => x >>> 24 !== 0xff : x => (x & 0xff) !== 0xff); 56847 if (hasAlpha) { 56848 ctx.fillStyle = "white"; 56849 ctx.fillRect(0, 0, width, height); 56850 ctx.drawImage(bitmap, 0, 0); 56851 } 56852 const jpegBufferPromise = canvas.convertToBlob({ 56853 type: "image/jpeg", 56854 quality: 1 56855 }).then(blob => blob.arrayBuffer()); 56856 const xobjectName = Name.get("XObject"); 56857 const imageName = Name.get("Image");
vendor: 4,665 bytes, lines 56858-57039
56858 const image = new Dict(xref); 56859 image.set("Type", xobjectName); 56860 image.set("Subtype", imageName); 56861 image.set("BitsPerComponent", 8); 56862 image.set("ColorSpace", Name.get("DeviceRGB")); 56863 image.set("Filter", Name.get("DCTDecode")); 56864 image.set("BBox", [0, 0, width, height]); 56865 image.set("Width", width); 56866 image.set("Height", height); 56867 let smaskStream = null; 56868 if (hasAlpha) { 56869 const alphaBuffer = new Uint8Array(buf32.length); 56870 if (FeatureTest.isLittleEndian) { 56871 for (let i = 0, ii = buf32.length; i < ii; i++) { 56872 alphaBuffer[i] = buf32[i] >>> 24; 56873 } 56874 } else { 56875 for (let i = 0, ii = buf32.length; i < ii; i++) { 56876 alphaBuffer[i] = buf32[i] & 0xff; 56877 } 56878 } 56879 const smask = new Dict(xref); 56880 smask.set("Type", xobjectName); 56881 smask.set("Subtype", imageName); 56882 smask.set("BitsPerComponent", 8); 56883 smask.set("ColorSpace", Name.get("DeviceGray")); 56884 smask.set("Width", width); 56885 smask.set("Height", height); 56886 smaskStream = new Stream(alphaBuffer, 0, 0, smask); 56887 } 56888 const imageStream = new Stream(await jpegBufferPromise, 0, 0, image); 56889 return { 56890 imageStream, 56891 smaskStream, 56892 width, 56893 height 56894 }; 56895 } 56896 static createNewDict(annotation, xref, { 56897 apRef, 56898 ap 56899 }) { 56900 const { 56901 oldAnnotation, 56902 rect, 56903 rotation, 56904 user 56905 } = annotation; 56906 const stamp = oldAnnotation || new Dict(xref); 56907 stamp.set("Type", Name.get("Annot")); 56908 stamp.set("Subtype", Name.get("Stamp")); 56909 stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`); 56910 stamp.set("Rect", rect); 56911 stamp.set("F", 4); 56912 stamp.set("Border", [0, 0, 0]); 56913 stamp.set("Rotate", rotation); 56914 if (user) { 56915 stamp.set("T", stringToAsciiOrUTF16BE(user)); 56916 } 56917 if (apRef || ap) { 56918 const n = new Dict(xref); 56919 stamp.set("AP", n); 56920 if (apRef) { 56921 n.set("N", apRef); 56922 } else { 56923 n.set("N", ap); 56924 } 56925 } 56926 return stamp; 56927 } 56928 static async createNewAppearanceStream(annotation, xref, params) { 56929 if (annotation.oldAnnotation) { 56930 return null; 56931 } 56932 const { 56933 rotation 56934 } = annotation; 56935 const { 56936 imageRef, 56937 width, 56938 height 56939 } = params.image; 56940 const resources = new Dict(xref); 56941 const xobject = new Dict(xref); 56942 resources.set("XObject", xobject); 56943 xobject.set("Im0", imageRef); 56944 const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`; 56945 const appearanceStreamDict = new Dict(xref); 56946 appearanceStreamDict.set("FormType", 1); 56947 appearanceStreamDict.set("Subtype", Name.get("Form")); 56948 appearanceStreamDict.set("Type", Name.get("XObject")); 56949 appearanceStreamDict.set("BBox", [0, 0, width, height]); 56950 appearanceStreamDict.set("Resources", resources); 56951 if (rotation) { 56952 const matrix = getRotationMatrix(rotation, width, height); 56953 appearanceStreamDict.set("Matrix", matrix); 56954 } 56955 const ap = new StringStream(appearance); 56956 ap.dict = appearanceStreamDict; 56957 return ap; 56958 } 56959} 56960class FileAttachmentAnnotation extends MarkupAnnotation { 56961 constructor(params) { 56962 super(params); 56963 const { 56964 dict, 56965 xref 56966 } = params; 56967 const file = new FileSpec(dict.get("FS"), xref); 56968 this.data.annotationType = AnnotationType.FILEATTACHMENT; 56969 this.data.hasOwnCanvas = this.data.noRotate; 56970 this.data.noHTML = false; 56971 this.data.file = file.serializable; 56972 const name = dict.get("Name"); 56973 this.data.name = name instanceof Name ? stringToPDFString(name.name) : "PushPin"; 56974 const fillAlpha = dict.get("ca"); 56975 this.data.fillAlpha = typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 ? fillAlpha : null; 56976 } 56977} 56978 56979;// ./src/core/decrypt_stream.js 56980 56981const chunkSize = 512; 56982class DecryptStream extends DecodeStream { 56983 constructor(str, maybeLength, decrypt) { 56984 super(maybeLength); 56985 this.str = str; 56986 this.dict = str.dict; 56987 this.decrypt = decrypt; 56988 this.nextChunk = null; 56989 this.initialized = false; 56990 } 56991 readBlock() { 56992 let chunk; 56993 if (this.initialized) { 56994 chunk = this.nextChunk; 56995 } else { 56996 chunk = this.str.getBytes(chunkSize); 56997 this.initialized = true; 56998 } 56999 if (!chunk?.length) { 57000 this.eof = true; 57001 return; 57002 } 57003 this.nextChunk = this.str.getBytes(chunkSize); 57004 const hasMoreData = this.nextChunk?.length > 0; 57005 const decrypt = this.decrypt; 57006 chunk = decrypt(chunk, !hasMoreData); 57007 const bufferLength = this.bufferLength, 57008 newLength = bufferLength + chunk.length, 57009 buffer = this.ensureBuffer(newLength); 57010 buffer.set(chunk, bufferLength); 57011 this.bufferLength = newLength; 57012 } 57013} 57014 57015;// ./src/core/crypto.js 57016 57017 57018 57019 57020 57021 57022 57023 57024 57025 57026 57027 57028class ARCFourCipher { 57029 constructor(key) { 57030 this.a = 0; 57031 this.b = 0; 57032 const s = new Uint8Array(256); 57033 const keyLength = key.length; 57034 for (let i = 0; i < 256; ++i) { 57035 s[i] = i; 57036 } 57037 for (let i = 0, j = 0; i < 256; ++i) { 57038 const tmp = s[i]; 57039 j = j + tmp + key[i % keyLength] & 0xff;
vendor: 18,373 bytes, lines 57040-57529
57040 s[i] = s[j]; 57041 s[j] = tmp; 57042 } 57043 this.s = s; 57044 } 57045 encryptBlock(data) { 57046 let a = this.a, 57047 b = this.b; 57048 const s = this.s; 57049 const n = data.length; 57050 const output = new Uint8Array(n); 57051 for (let i = 0; i < n; ++i) { 57052 a = a + 1 & 0xff; 57053 const tmp = s[a]; 57054 b = b + tmp & 0xff; 57055 const tmp2 = s[b]; 57056 s[a] = tmp2; 57057 s[b] = tmp; 57058 output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; 57059 } 57060 this.a = a; 57061 this.b = b; 57062 return output; 57063 } 57064 decryptBlock(data) { 57065 return this.encryptBlock(data); 57066 } 57067 encrypt(data) { 57068 return this.encryptBlock(data); 57069 } 57070} 57071const calculateMD5 = function calculateMD5Closure() { 57072 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]); 57073 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]); 57074 function hash(data, offset, length) { 57075 let h0 = 1732584193, 57076 h1 = -271733879, 57077 h2 = -1732584194, 57078 h3 = 271733878; 57079 const paddedLength = length + 72 & ~63; 57080 const padded = new Uint8Array(paddedLength); 57081 let i, j; 57082 for (i = 0; i < length; ++i) { 57083 padded[i] = data[offset++]; 57084 } 57085 padded[i++] = 0x80; 57086 const n = paddedLength - 8; 57087 while (i < n) { 57088 padded[i++] = 0; 57089 } 57090 padded[i++] = length << 3 & 0xff; 57091 padded[i++] = length >> 5 & 0xff; 57092 padded[i++] = length >> 13 & 0xff; 57093 padded[i++] = length >> 21 & 0xff; 57094 padded[i++] = length >>> 29 & 0xff; 57095 padded[i++] = 0; 57096 padded[i++] = 0; 57097 padded[i++] = 0; 57098 const w = new Int32Array(16); 57099 for (i = 0; i < paddedLength;) { 57100 for (j = 0; j < 16; ++j, i += 4) { 57101 w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; 57102 } 57103 let a = h0, 57104 b = h1, 57105 c = h2, 57106 d = h3, 57107 f, 57108 g; 57109 for (j = 0; j < 64; ++j) { 57110 if (j < 16) { 57111 f = b & c | ~b & d; 57112 g = j; 57113 } else if (j < 32) { 57114 f = d & b | ~d & c; 57115 g = 5 * j + 1 & 15; 57116 } else if (j < 48) { 57117 f = b ^ c ^ d; 57118 g = 3 * j + 5 & 15; 57119 } else { 57120 f = c ^ (b | ~d); 57121 g = 7 * j & 15; 57122 } 57123 const tmp = d, 57124 rotateArg = a + f + k[j] + w[g] | 0, 57125 rotate = r[j]; 57126 d = c; 57127 c = b; 57128 b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; 57129 a = tmp; 57130 } 57131 h0 = h0 + a | 0; 57132 h1 = h1 + b | 0; 57133 h2 = h2 + c | 0; 57134 h3 = h3 + d | 0; 57135 } 57136 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]); 57137 } 57138 return hash; 57139}(); 57140class Word64 { 57141 constructor(highInteger, lowInteger) { 57142 this.high = highInteger | 0; 57143 this.low = lowInteger | 0; 57144 } 57145 and(word) { 57146 this.high &= word.high; 57147 this.low &= word.low; 57148 } 57149 xor(word) { 57150 this.high ^= word.high; 57151 this.low ^= word.low; 57152 } 57153 or(word) { 57154 this.high |= word.high; 57155 this.low |= word.low; 57156 } 57157 shiftRight(places) { 57158 if (places >= 32) { 57159 this.low = this.high >>> places - 32 | 0; 57160 this.high = 0; 57161 } else { 57162 this.low = this.low >>> places | this.high << 32 - places; 57163 this.high = this.high >>> places | 0; 57164 } 57165 } 57166 shiftLeft(places) { 57167 if (places >= 32) { 57168 this.high = this.low << places - 32; 57169 this.low = 0; 57170 } else { 57171 this.high = this.high << places | this.low >>> 32 - places; 57172 this.low <<= places; 57173 } 57174 } 57175 rotateRight(places) { 57176 let low, high; 57177 if (places & 32) { 57178 high = this.low; 57179 low = this.high; 57180 } else { 57181 low = this.low; 57182 high = this.high; 57183 } 57184 places &= 31; 57185 this.low = low >>> places | high << 32 - places; 57186 this.high = high >>> places | low << 32 - places; 57187 } 57188 not() { 57189 this.high = ~this.high; 57190 this.low = ~this.low; 57191 } 57192 add(word) { 57193 const lowAdd = (this.low >>> 0) + (word.low >>> 0); 57194 let highAdd = (this.high >>> 0) + (word.high >>> 0); 57195 if (lowAdd > 0xffffffff) { 57196 highAdd += 1; 57197 } 57198 this.low = lowAdd | 0; 57199 this.high = highAdd | 0; 57200 } 57201 copyTo(bytes, offset) { 57202 bytes[offset] = this.high >>> 24 & 0xff; 57203 bytes[offset + 1] = this.high >> 16 & 0xff; 57204 bytes[offset + 2] = this.high >> 8 & 0xff; 57205 bytes[offset + 3] = this.high & 0xff; 57206 bytes[offset + 4] = this.low >>> 24 & 0xff; 57207 bytes[offset + 5] = this.low >> 16 & 0xff; 57208 bytes[offset + 6] = this.low >> 8 & 0xff; 57209 bytes[offset + 7] = this.low & 0xff; 57210 } 57211 assign(word) { 57212 this.high = word.high; 57213 this.low = word.low; 57214 } 57215} 57216const calculateSHA256 = function calculateSHA256Closure() { 57217 function rotr(x, n) { 57218 return x >>> n | x << 32 - n; 57219 } 57220 function ch(x, y, z) { 57221 return x & y ^ ~x & z; 57222 } 57223 function maj(x, y, z) { 57224 return x & y ^ x & z ^ y & z; 57225 } 57226 function sigma(x) { 57227 return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); 57228 } 57229 function sigmaPrime(x) { 57230 return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); 57231 } 57232 function littleSigma(x) { 57233 return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; 57234 } 57235 function littleSigmaPrime(x) { 57236 return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; 57237 } 57238 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]; 57239 function hash(data, offset, length) { 57240 let h0 = 0x6a09e667, 57241 h1 = 0xbb67ae85, 57242 h2 = 0x3c6ef372, 57243 h3 = 0xa54ff53a, 57244 h4 = 0x510e527f, 57245 h5 = 0x9b05688c, 57246 h6 = 0x1f83d9ab, 57247 h7 = 0x5be0cd19; 57248 const paddedLength = Math.ceil((length + 9) / 64) * 64; 57249 const padded = new Uint8Array(paddedLength); 57250 let i, j; 57251 for (i = 0; i < length; ++i) { 57252 padded[i] = data[offset++]; 57253 } 57254 padded[i++] = 0x80; 57255 const n = paddedLength - 8; 57256 while (i < n) { 57257 padded[i++] = 0; 57258 } 57259 padded[i++] = 0; 57260 padded[i++] = 0; 57261 padded[i++] = 0; 57262 padded[i++] = length >>> 29 & 0xff; 57263 padded[i++] = length >> 21 & 0xff; 57264 padded[i++] = length >> 13 & 0xff; 57265 padded[i++] = length >> 5 & 0xff; 57266 padded[i++] = length << 3 & 0xff; 57267 const w = new Uint32Array(64); 57268 for (i = 0; i < paddedLength;) { 57269 for (j = 0; j < 16; ++j) { 57270 w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; 57271 i += 4; 57272 } 57273 for (j = 16; j < 64; ++j) { 57274 w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0; 57275 } 57276 let a = h0, 57277 b = h1, 57278 c = h2, 57279 d = h3, 57280 e = h4, 57281 f = h5, 57282 g = h6, 57283 h = h7, 57284 t1, 57285 t2; 57286 for (j = 0; j < 64; ++j) { 57287 t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; 57288 t2 = sigma(a) + maj(a, b, c); 57289 h = g; 57290 g = f; 57291 f = e; 57292 e = d + t1 | 0; 57293 d = c; 57294 c = b; 57295 b = a; 57296 a = t1 + t2 | 0; 57297 } 57298 h0 = h0 + a | 0; 57299 h1 = h1 + b | 0; 57300 h2 = h2 + c | 0; 57301 h3 = h3 + d | 0; 57302 h4 = h4 + e | 0; 57303 h5 = h5 + f | 0; 57304 h6 = h6 + g | 0; 57305 h7 = h7 + h | 0; 57306 } 57307 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]); 57308 } 57309 return hash; 57310}(); 57311const calculateSHA512 = function calculateSHA512Closure() { 57312 function ch(result, x, y, z, tmp) { 57313 result.assign(x); 57314 result.and(y); 57315 tmp.assign(x); 57316 tmp.not(); 57317 tmp.and(z); 57318 result.xor(tmp); 57319 } 57320 function maj(result, x, y, z, tmp) { 57321 result.assign(x); 57322 result.and(y); 57323 tmp.assign(x); 57324 tmp.and(z); 57325 result.xor(tmp); 57326 tmp.assign(y); 57327 tmp.and(z); 57328 result.xor(tmp); 57329 } 57330 function sigma(result, x, tmp) { 57331 result.assign(x); 57332 result.rotateRight(28); 57333 tmp.assign(x); 57334 tmp.rotateRight(34); 57335 result.xor(tmp); 57336 tmp.assign(x); 57337 tmp.rotateRight(39); 57338 result.xor(tmp); 57339 } 57340 function sigmaPrime(result, x, tmp) { 57341 result.assign(x); 57342 result.rotateRight(14); 57343 tmp.assign(x); 57344 tmp.rotateRight(18); 57345 result.xor(tmp); 57346 tmp.assign(x); 57347 tmp.rotateRight(41); 57348 result.xor(tmp); 57349 } 57350 function littleSigma(result, x, tmp) { 57351 result.assign(x); 57352 result.rotateRight(1); 57353 tmp.assign(x); 57354 tmp.rotateRight(8); 57355 result.xor(tmp); 57356 tmp.assign(x); 57357 tmp.shiftRight(7); 57358 result.xor(tmp); 57359 } 57360 function littleSigmaPrime(result, x, tmp) { 57361 result.assign(x); 57362 result.rotateRight(19); 57363 tmp.assign(x); 57364 tmp.rotateRight(61); 57365 result.xor(tmp); 57366 tmp.assign(x); 57367 tmp.shiftRight(6); 57368 result.xor(tmp); 57369 } 57370 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)]; 57371 function hash(data, offset, length, mode384 = false) { 57372 let h0, h1, h2, h3, h4, h5, h6, h7; 57373 if (!mode384) { 57374 h0 = new Word64(0x6a09e667, 0xf3bcc908); 57375 h1 = new Word64(0xbb67ae85, 0x84caa73b); 57376 h2 = new Word64(0x3c6ef372, 0xfe94f82b); 57377 h3 = new Word64(0xa54ff53a, 0x5f1d36f1); 57378 h4 = new Word64(0x510e527f, 0xade682d1); 57379 h5 = new Word64(0x9b05688c, 0x2b3e6c1f); 57380 h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); 57381 h7 = new Word64(0x5be0cd19, 0x137e2179); 57382 } else { 57383 h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); 57384 h1 = new Word64(0x629a292a, 0x367cd507); 57385 h2 = new Word64(0x9159015a, 0x3070dd17); 57386 h3 = new Word64(0x152fecd8, 0xf70e5939); 57387 h4 = new Word64(0x67332667, 0xffc00b31); 57388 h5 = new Word64(0x8eb44a87, 0x68581511); 57389 h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); 57390 h7 = new Word64(0x47b5481d, 0xbefa4fa4); 57391 } 57392 const paddedLength = Math.ceil((length + 17) / 128) * 128; 57393 const padded = new Uint8Array(paddedLength); 57394 let i, j; 57395 for (i = 0; i < length; ++i) { 57396 padded[i] = data[offset++]; 57397 } 57398 padded[i++] = 0x80; 57399 const n = paddedLength - 16; 57400 while (i < n) { 57401 padded[i++] = 0; 57402 } 57403 padded[i++] = 0; 57404 padded[i++] = 0; 57405 padded[i++] = 0; 57406 padded[i++] = 0; 57407 padded[i++] = 0; 57408 padded[i++] = 0; 57409 padded[i++] = 0; 57410 padded[i++] = 0; 57411 padded[i++] = 0; 57412 padded[i++] = 0; 57413 padded[i++] = 0; 57414 padded[i++] = length >>> 29 & 0xff; 57415 padded[i++] = length >> 21 & 0xff; 57416 padded[i++] = length >> 13 & 0xff; 57417 padded[i++] = length >> 5 & 0xff; 57418 padded[i++] = length << 3 & 0xff; 57419 const w = new Array(80); 57420 for (i = 0; i < 80; i++) { 57421 w[i] = new Word64(0, 0); 57422 } 57423 let a = new Word64(0, 0), 57424 b = new Word64(0, 0), 57425 c = new Word64(0, 0); 57426 let d = new Word64(0, 0), 57427 e = new Word64(0, 0), 57428 f = new Word64(0, 0); 57429 let g = new Word64(0, 0), 57430 h = new Word64(0, 0); 57431 const t1 = new Word64(0, 0), 57432 t2 = new Word64(0, 0); 57433 const tmp1 = new Word64(0, 0), 57434 tmp2 = new Word64(0, 0); 57435 let tmp3; 57436 for (i = 0; i < paddedLength;) { 57437 for (j = 0; j < 16; ++j) { 57438 w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; 57439 w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; 57440 i += 8; 57441 } 57442 for (j = 16; j < 80; ++j) { 57443 tmp3 = w[j]; 57444 littleSigmaPrime(tmp3, w[j - 2], tmp2); 57445 tmp3.add(w[j - 7]); 57446 littleSigma(tmp1, w[j - 15], tmp2); 57447 tmp3.add(tmp1); 57448 tmp3.add(w[j - 16]); 57449 } 57450 a.assign(h0); 57451 b.assign(h1); 57452 c.assign(h2); 57453 d.assign(h3); 57454 e.assign(h4); 57455 f.assign(h5); 57456 g.assign(h6); 57457 h.assign(h7); 57458 for (j = 0; j < 80; ++j) { 57459 t1.assign(h); 57460 sigmaPrime(tmp1, e, tmp2); 57461 t1.add(tmp1); 57462 ch(tmp1, e, f, g, tmp2); 57463 t1.add(tmp1); 57464 t1.add(k[j]); 57465 t1.add(w[j]); 57466 sigma(t2, a, tmp2); 57467 maj(tmp1, a, b, c, tmp2); 57468 t2.add(tmp1); 57469 tmp3 = h; 57470 h = g; 57471 g = f; 57472 f = e; 57473 d.add(t1); 57474 e = d; 57475 d = c; 57476 c = b; 57477 b = a; 57478 tmp3.assign(t1); 57479 tmp3.add(t2); 57480 a = tmp3; 57481 } 57482 h0.add(a); 57483 h1.add(b); 57484 h2.add(c); 57485 h3.add(d); 57486 h4.add(e); 57487 h5.add(f); 57488 h6.add(g); 57489 h7.add(h); 57490 } 57491 let result; 57492 if (!mode384) { 57493 result = new Uint8Array(64); 57494 h0.copyTo(result, 0); 57495 h1.copyTo(result, 8); 57496 h2.copyTo(result, 16); 57497 h3.copyTo(result, 24); 57498 h4.copyTo(result, 32); 57499 h5.copyTo(result, 40); 57500 h6.copyTo(result, 48); 57501 h7.copyTo(result, 56); 57502 } else { 57503 result = new Uint8Array(48); 57504 h0.copyTo(result, 0); 57505 h1.copyTo(result, 8); 57506 h2.copyTo(result, 16); 57507 h3.copyTo(result, 24); 57508 h4.copyTo(result, 32); 57509 h5.copyTo(result, 40); 57510 } 57511 return result; 57512 } 57513 return hash; 57514}(); 57515function calculateSHA384(data, offset, length) { 57516 return calculateSHA512(data, offset, length, true); 57517} 57518class NullCipher { 57519 decryptBlock(data) { 57520 return data; 57521 } 57522 encrypt(data) { 57523 return data; 57524 } 57525} 57526class AESBaseCipher { 57527 constructor() { 57528 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]); 57529 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,
575290xfa, 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]); 57530 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, 0xcb23
vendor: 5,927 bytes, lines 57530-57766
57530c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); 57531 this._mixCol = new Uint8Array(256); 57532 for (let i = 0; i < 256; i++) { 57533 this._mixCol[i] = i < 128 ? i << 1 : i << 1 ^ 0x1b; 57534 } 57535 this.buffer = new Uint8Array(16); 57536 this.bufferPosition = 0; 57537 } 57538 _expandKey(cipherKey) { 57539 unreachable("Cannot call `_expandKey` on the base class"); 57540 } 57541 _decrypt(input, key) { 57542 let t, u, v; 57543 const state = new Uint8Array(16); 57544 state.set(input); 57545 for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { 57546 state[j] ^= key[k]; 57547 } 57548 for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { 57549 t = state[13]; 57550 state[13] = state[9]; 57551 state[9] = state[5]; 57552 state[5] = state[1]; 57553 state[1] = t; 57554 t = state[14]; 57555 u = state[10]; 57556 state[14] = state[6]; 57557 state[10] = state[2]; 57558 state[6] = t; 57559 state[2] = u; 57560 t = state[15]; 57561 u = state[11]; 57562 v = state[7]; 57563 state[15] = state[3]; 57564 state[11] = t; 57565 state[7] = u; 57566 state[3] = v; 57567 for (let j = 0; j < 16; ++j) { 57568 state[j] = this._inv_s[state[j]]; 57569 } 57570 for (let j = 0, k = i * 16; j < 16; ++j, ++k) { 57571 state[j] ^= key[k]; 57572 } 57573 for (let j = 0; j < 16; j += 4) { 57574 const s0 = this._mix[state[j]]; 57575 const s1 = this._mix[state[j + 1]]; 57576 const s2 = this._mix[state[j + 2]]; 57577 const s3 = this._mix[state[j + 3]]; 57578 t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; 57579 state[j] = t >>> 24 & 0xff; 57580 state[j + 1] = t >> 16 & 0xff; 57581 state[j + 2] = t >> 8 & 0xff; 57582 state[j + 3] = t & 0xff; 57583 } 57584 } 57585 t = state[13]; 57586 state[13] = state[9]; 57587 state[9] = state[5]; 57588 state[5] = state[1]; 57589 state[1] = t; 57590 t = state[14]; 57591 u = state[10]; 57592 state[14] = state[6]; 57593 state[10] = state[2]; 57594 state[6] = t; 57595 state[2] = u; 57596 t = state[15]; 57597 u = state[11]; 57598 v = state[7]; 57599 state[15] = state[3]; 57600 state[11] = t; 57601 state[7] = u; 57602 state[3] = v; 57603 for (let j = 0; j < 16; ++j) { 57604 state[j] = this._inv_s[state[j]]; 57605 state[j] ^= key[j]; 57606 } 57607 return state; 57608 } 57609 _encrypt(input, key) { 57610 const s = this._s; 57611 let t, u, v; 57612 const state = new Uint8Array(16); 57613 state.set(input); 57614 for (let j = 0; j < 16; ++j) { 57615 state[j] ^= key[j]; 57616 } 57617 for (let i = 1; i < this._cyclesOfRepetition; i++) { 57618 for (let j = 0; j < 16; ++j) { 57619 state[j] = s[state[j]]; 57620 } 57621 v = state[1]; 57622 state[1] = state[5]; 57623 state[5] = state[9]; 57624 state[9] = state[13]; 57625 state[13] = v; 57626 v = state[2]; 57627 u = state[6]; 57628 state[2] = state[10]; 57629 state[6] = state[14]; 57630 state[10] = v; 57631 state[14] = u; 57632 v = state[3]; 57633 u = state[7]; 57634 t = state[11]; 57635 state[3] = state[15]; 57636 state[7] = v; 57637 state[11] = u; 57638 state[15] = t; 57639 for (let j = 0; j < 16; j += 4) { 57640 const s0 = state[j + 0]; 57641 const s1 = state[j + 1]; 57642 const s2 = state[j + 2]; 57643 const s3 = state[j + 3]; 57644 t = s0 ^ s1 ^ s2 ^ s3; 57645 state[j + 0] ^= t ^ this._mixCol[s0 ^ s1]; 57646 state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; 57647 state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; 57648 state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; 57649 } 57650 for (let j = 0, k = i * 16; j < 16; ++j, ++k) { 57651 state[j] ^= key[k]; 57652 } 57653 } 57654 for (let j = 0; j < 16; ++j) { 57655 state[j] = s[state[j]]; 57656 } 57657 v = state[1]; 57658 state[1] = state[5]; 57659 state[5] = state[9]; 57660 state[9] = state[13]; 57661 state[13] = v; 57662 v = state[2]; 57663 u = state[6]; 57664 state[2] = state[10]; 57665 state[6] = state[14]; 57666 state[10] = v; 57667 state[14] = u; 57668 v = state[3]; 57669 u = state[7]; 57670 t = state[11]; 57671 state[3] = state[15]; 57672 state[7] = v; 57673 state[11] = u; 57674 state[15] = t; 57675 for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { 57676 state[j] ^= key[k]; 57677 } 57678 return state; 57679 } 57680 _decryptBlock2(data, finalize) { 57681 const sourceLength = data.length; 57682 let buffer = this.buffer, 57683 bufferLength = this.bufferPosition; 57684 const result = []; 57685 let iv = this.iv; 57686 for (let i = 0; i < sourceLength; ++i) { 57687 buffer[bufferLength] = data[i]; 57688 ++bufferLength; 57689 if (bufferLength < 16) { 57690 continue; 57691 } 57692 const plain = this._decrypt(buffer, this._key); 57693 for (let j = 0; j < 16; ++j) { 57694 plain[j] ^= iv[j]; 57695 } 57696 iv = buffer; 57697 result.push(plain); 57698 buffer = new Uint8Array(16); 57699 bufferLength = 0; 57700 } 57701 this.buffer = buffer; 57702 this.bufferLength = bufferLength; 57703 this.iv = iv; 57704 if (result.length === 0) { 57705 return new Uint8Array(0); 57706 } 57707 let outputLength = 16 * result.length; 57708 if (finalize) { 57709 const lastBlock = result.at(-1); 57710 let psLen = lastBlock[15]; 57711 if (psLen <= 16) { 57712 for (let i = 15, ii = 16 - psLen; i >= ii; --i) { 57713 if (lastBlock[i] !== psLen) { 57714 psLen = 0; 57715 break; 57716 } 57717 } 57718 outputLength -= psLen; 57719 result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); 57720 } 57721 } 57722 const output = new Uint8Array(outputLength); 57723 for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { 57724 output.set(result[i], j); 57725 } 57726 return output; 57727 } 57728 decryptBlock(data, finalize, iv = null) { 57729 const sourceLength = data.length; 57730 const buffer = this.buffer; 57731 let bufferLength = this.bufferPosition; 57732 if (iv) { 57733 this.iv = iv; 57734 } else { 57735 for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { 57736 buffer[bufferLength] = data[i]; 57737 } 57738 if (bufferLength < 16) { 57739 this.bufferLength = bufferLength; 57740 return new Uint8Array(0); 57741 } 57742 this.iv = buffer; 57743 data = data.subarray(16); 57744 } 57745 this.buffer = new Uint8Array(16); 57746 this.bufferLength = 0; 57747 this.decryptBlock = this._decryptBlock2; 57748 return this.decryptBlock(data, finalize); 57749 } 57750 encrypt(data, iv) { 57751 const sourceLength = data.length; 57752 let buffer = this.buffer, 57753 bufferLength = this.bufferPosition; 57754 const result = []; 57755 if (!iv) { 57756 iv = new Uint8Array(16); 57757 } 57758 for (let i = 0; i < sourceLength; ++i) { 57759 buffer[bufferLength] = data[i]; 57760 ++bufferLength; 57761 if (bufferLength < 16) { 57762 continue; 57763 } 57764 for (let j = 0; j < 16; ++j) { 57765 buffer[j] ^= iv[j]; 57766 }
vendor: 4,580 bytes, lines 57767-57888
57767 const cipher = this._encrypt(buffer, this._key); 57768 iv = cipher; 57769 result.push(cipher); 57770 buffer = new Uint8Array(16); 57771 bufferLength = 0; 57772 } 57773 this.buffer = buffer; 57774 this.bufferLength = bufferLength; 57775 this.iv = iv; 57776 if (result.length === 0) { 57777 return new Uint8Array(0); 57778 } 57779 const outputLength = 16 * result.length; 57780 const output = new Uint8Array(outputLength); 57781 for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { 57782 output.set(result[i], j); 57783 } 57784 return output; 57785 } 57786} 57787class AES128Cipher extends AESBaseCipher { 57788 constructor(key) { 57789 super(); 57790 this._cyclesOfRepetition = 10; 57791 this._keySize = 160; 57792 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]); 57793 this._key = this._expandKey(key); 57794 } 57795 _expandKey(cipherKey) { 57796 const b = 176; 57797 const s = this._s; 57798 const rcon = this._rcon; 57799 const result = new Uint8Array(b); 57800 result.set(cipherKey); 57801 for (let j = 16, i = 1; j < b; ++i) { 57802 let t1 = result[j - 3]; 57803 let t2 = result[j - 2]; 57804 let t3 = result[j - 1]; 57805 let t4 = result[j - 4]; 57806 t1 = s[t1]; 57807 t2 = s[t2]; 57808 t3 = s[t3]; 57809 t4 = s[t4]; 57810 t1 ^= rcon[i]; 57811 for (let n = 0; n < 4; ++n) { 57812 result[j] = t1 ^= result[j - 16]; 57813 j++; 57814 result[j] = t2 ^= result[j - 16]; 57815 j++; 57816 result[j] = t3 ^= result[j - 16]; 57817 j++; 57818 result[j] = t4 ^= result[j - 16]; 57819 j++; 57820 } 57821 } 57822 return result; 57823 } 57824} 57825class AES256Cipher extends AESBaseCipher { 57826 constructor(key) { 57827 super(); 57828 this._cyclesOfRepetition = 14; 57829 this._keySize = 224; 57830 this._key = this._expandKey(key); 57831 } 57832 _expandKey(cipherKey) { 57833 const b = 240; 57834 const s = this._s; 57835 const result = new Uint8Array(b); 57836 result.set(cipherKey); 57837 let r = 1; 57838 let t1, t2, t3, t4; 57839 for (let j = 32, i = 1; j < b; ++i) { 57840 if (j % 32 === 16) { 57841 t1 = s[t1]; 57842 t2 = s[t2]; 57843 t3 = s[t3]; 57844 t4 = s[t4]; 57845 } else if (j % 32 === 0) { 57846 t1 = result[j - 3]; 57847 t2 = result[j - 2]; 57848 t3 = result[j - 1]; 57849 t4 = result[j - 4]; 57850 t1 = s[t1]; 57851 t2 = s[t2]; 57852 t3 = s[t3]; 57853 t4 = s[t4]; 57854 t1 ^= r; 57855 if ((r <<= 1) >= 256) { 57856 r = (r ^ 0x1b) & 0xff; 57857 } 57858 } 57859 for (let n = 0; n < 4; ++n) { 57860 result[j] = t1 ^= result[j - 32]; 57861 j++; 57862 result[j] = t2 ^= result[j - 32]; 57863 j++; 57864 result[j] = t3 ^= result[j - 32]; 57865 j++; 57866 result[j] = t4 ^= result[j - 32]; 57867 j++; 57868 } 57869 } 57870 return result; 57871 } 57872} 57873class PDF17 { 57874 checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { 57875 const hashData = new Uint8Array(password.length + 56); 57876 hashData.set(password, 0); 57877 hashData.set(ownerValidationSalt, password.length); 57878 hashData.set(userBytes, password.length + ownerValidationSalt.length); 57879 const result = calculateSHA256(hashData, 0, hashData.length); 57880 return isArrayEqual(result, ownerPassword); 57881 } 57882 checkUserPassword(password, userValidationSalt, userPassword) { 57883 const hashData = new Uint8Array(password.length + 8); 57884 hashData.set(password, 0); 57885 hashData.set(userValidationSalt, password.length); 57886 const result = calculateSHA256(hashData, 0, hashData.length); 57887 return isArrayEqual(result, userPassword); 57888 }
vendor: 39,431 bytes, lines 57889-59235
57889 getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { 57890 const hashData = new Uint8Array(password.length + 56); 57891 hashData.set(password, 0); 57892 hashData.set(ownerKeySalt, password.length); 57893 hashData.set(userBytes, password.length + ownerKeySalt.length); 57894 const key = calculateSHA256(hashData, 0, hashData.length); 57895 const cipher = new AES256Cipher(key); 57896 return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); 57897 } 57898 getUserKey(password, userKeySalt, userEncryption) { 57899 const hashData = new Uint8Array(password.length + 8); 57900 hashData.set(password, 0); 57901 hashData.set(userKeySalt, password.length); 57902 const key = calculateSHA256(hashData, 0, hashData.length); 57903 const cipher = new AES256Cipher(key); 57904 return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); 57905 } 57906} 57907class PDF20 { 57908 _hash(password, input, userBytes) { 57909 let k = calculateSHA256(input, 0, input.length).subarray(0, 32); 57910 let e = [0]; 57911 let i = 0; 57912 while (i < 64 || e.at(-1) > i - 32) { 57913 const combinedLength = password.length + k.length + userBytes.length, 57914 combinedArray = new Uint8Array(combinedLength); 57915 let writeOffset = 0; 57916 combinedArray.set(password, writeOffset); 57917 writeOffset += password.length; 57918 combinedArray.set(k, writeOffset); 57919 writeOffset += k.length; 57920 combinedArray.set(userBytes, writeOffset); 57921 const k1 = new Uint8Array(combinedLength * 64); 57922 for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) { 57923 k1.set(combinedArray, pos); 57924 } 57925 const cipher = new AES128Cipher(k.subarray(0, 16)); 57926 e = cipher.encrypt(k1, k.subarray(16, 32)); 57927 const remainder = e.slice(0, 16).reduce((a, b) => a + b, 0) % 3; 57928 if (remainder === 0) { 57929 k = calculateSHA256(e, 0, e.length); 57930 } else if (remainder === 1) { 57931 k = calculateSHA384(e, 0, e.length); 57932 } else if (remainder === 2) { 57933 k = calculateSHA512(e, 0, e.length); 57934 } 57935 i++; 57936 } 57937 return k.subarray(0, 32); 57938 } 57939 checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { 57940 const hashData = new Uint8Array(password.length + 56); 57941 hashData.set(password, 0); 57942 hashData.set(ownerValidationSalt, password.length); 57943 hashData.set(userBytes, password.length + ownerValidationSalt.length); 57944 const result = this._hash(password, hashData, userBytes); 57945 return isArrayEqual(result, ownerPassword); 57946 } 57947 checkUserPassword(password, userValidationSalt, userPassword) { 57948 const hashData = new Uint8Array(password.length + 8); 57949 hashData.set(password, 0); 57950 hashData.set(userValidationSalt, password.length); 57951 const result = this._hash(password, hashData, []); 57952 return isArrayEqual(result, userPassword); 57953 } 57954 getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { 57955 const hashData = new Uint8Array(password.length + 56); 57956 hashData.set(password, 0); 57957 hashData.set(ownerKeySalt, password.length); 57958 hashData.set(userBytes, password.length + ownerKeySalt.length); 57959 const key = this._hash(password, hashData, userBytes); 57960 const cipher = new AES256Cipher(key); 57961 return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); 57962 } 57963 getUserKey(password, userKeySalt, userEncryption) { 57964 const hashData = new Uint8Array(password.length + 8); 57965 hashData.set(password, 0); 57966 hashData.set(userKeySalt, password.length); 57967 const key = this._hash(password, hashData, []); 57968 const cipher = new AES256Cipher(key); 57969 return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); 57970 } 57971} 57972class CipherTransform { 57973 constructor(stringCipherConstructor, streamCipherConstructor) { 57974 this.StringCipherConstructor = stringCipherConstructor; 57975 this.StreamCipherConstructor = streamCipherConstructor; 57976 } 57977 createStream(stream, length) { 57978 const cipher = new this.StreamCipherConstructor(); 57979 return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { 57980 return cipher.decryptBlock(data, finalize); 57981 }); 57982 } 57983 decryptString(s) { 57984 const cipher = new this.StringCipherConstructor(); 57985 let data = stringToBytes(s); 57986 data = cipher.decryptBlock(data, true); 57987 return bytesToString(data); 57988 } 57989 encryptString(s) { 57990 const cipher = new this.StringCipherConstructor(); 57991 if (cipher instanceof AESBaseCipher) { 57992 const strLen = s.length; 57993 const pad = 16 - strLen % 16; 57994 s += String.fromCharCode(pad).repeat(pad); 57995 const iv = new Uint8Array(16); 57996 if (typeof crypto !== "undefined") { 57997 crypto.getRandomValues(iv); 57998 } else { 57999 for (let i = 0; i < 16; i++) { 58000 iv[i] = Math.floor(256 * Math.random()); 58001 } 58002 } 58003 let data = stringToBytes(s); 58004 data = cipher.encrypt(data, iv); 58005 const buf = new Uint8Array(16 + data.length); 58006 buf.set(iv); 58007 buf.set(data, 16); 58008 return bytesToString(buf); 58009 } 58010 let data = stringToBytes(s); 58011 data = cipher.encrypt(data); 58012 return bytesToString(data); 58013 } 58014} 58015class CipherTransformFactory { 58016 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]); 58017 #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { 58018 if (password) { 58019 const passwordLength = Math.min(127, password.length); 58020 password = password.subarray(0, passwordLength); 58021 } else { 58022 password = []; 58023 } 58024 const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17(); 58025 if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { 58026 return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); 58027 } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { 58028 return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); 58029 } 58030 return null; 58031 } 58032 #prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { 58033 const hashDataSize = 40 + ownerPassword.length + fileId.length; 58034 const hashData = new Uint8Array(hashDataSize); 58035 let i = 0, 58036 j, 58037 n; 58038 if (password) { 58039 n = Math.min(32, password.length); 58040 for (; i < n; ++i) { 58041 hashData[i] = password[i]; 58042 } 58043 } 58044 j = 0; 58045 while (i < 32) { 58046 hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; 58047 } 58048 for (j = 0, n = ownerPassword.length; j < n; ++j) { 58049 hashData[i++] = ownerPassword[j]; 58050 } 58051 hashData[i++] = flags & 0xff; 58052 hashData[i++] = flags >> 8 & 0xff; 58053 hashData[i++] = flags >> 16 & 0xff; 58054 hashData[i++] = flags >>> 24 & 0xff; 58055 for (j = 0, n = fileId.length; j < n; ++j) { 58056 hashData[i++] = fileId[j]; 58057 } 58058 if (revision >= 4 && !encryptMetadata) { 58059 hashData[i++] = 0xff; 58060 hashData[i++] = 0xff; 58061 hashData[i++] = 0xff; 58062 hashData[i++] = 0xff; 58063 } 58064 let hash = calculateMD5(hashData, 0, i); 58065 const keyLengthInBytes = keyLength >> 3; 58066 if (revision >= 3) { 58067 for (j = 0; j < 50; ++j) { 58068 hash = calculateMD5(hash, 0, keyLengthInBytes); 58069 } 58070 } 58071 const encryptionKey = hash.subarray(0, keyLengthInBytes); 58072 let cipher, checkData; 58073 if (revision >= 3) { 58074 for (i = 0; i < 32; ++i) { 58075 hashData[i] = CipherTransformFactory.#defaultPasswordBytes[i]; 58076 } 58077 for (j = 0, n = fileId.length; j < n; ++j) { 58078 hashData[i++] = fileId[j]; 58079 } 58080 cipher = new ARCFourCipher(encryptionKey); 58081 checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); 58082 n = encryptionKey.length; 58083 const derivedKey = new Uint8Array(n); 58084 for (j = 1; j <= 19; ++j) { 58085 for (let k = 0; k < n; ++k) { 58086 derivedKey[k] = encryptionKey[k] ^ j; 58087 } 58088 cipher = new ARCFourCipher(derivedKey); 58089 checkData = cipher.encryptBlock(checkData); 58090 } 58091 for (j = 0, n = checkData.length; j < n; ++j) { 58092 if (userPassword[j] !== checkData[j]) { 58093 return null; 58094 } 58095 } 58096 } else { 58097 cipher = new ARCFourCipher(encryptionKey); 58098 checkData = cipher.encryptBlock(CipherTransformFactory.#defaultPasswordBytes); 58099 for (j = 0, n = checkData.length; j < n; ++j) { 58100 if (userPassword[j] !== checkData[j]) { 58101 return null; 58102 } 58103 } 58104 } 58105 return encryptionKey; 58106 } 58107 #decodeUserPassword(password, ownerPassword, revision, keyLength) { 58108 const hashData = new Uint8Array(32); 58109 let i = 0; 58110 const n = Math.min(32, password.length); 58111 for (; i < n; ++i) { 58112 hashData[i] = password[i]; 58113 } 58114 let j = 0; 58115 while (i < 32) { 58116 hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; 58117 } 58118 let hash = calculateMD5(hashData, 0, i); 58119 const keyLengthInBytes = keyLength >> 3; 58120 if (revision >= 3) { 58121 for (j = 0; j < 50; ++j) { 58122 hash = calculateMD5(hash, 0, hash.length); 58123 } 58124 } 58125 let cipher, userPassword; 58126 if (revision >= 3) { 58127 userPassword = ownerPassword; 58128 const derivedKey = new Uint8Array(keyLengthInBytes); 58129 for (j = 19; j >= 0; j--) { 58130 for (let k = 0; k < keyLengthInBytes; ++k) { 58131 derivedKey[k] = hash[k] ^ j; 58132 } 58133 cipher = new ARCFourCipher(derivedKey); 58134 userPassword = cipher.encryptBlock(userPassword); 58135 } 58136 } else { 58137 cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); 58138 userPassword = cipher.encryptBlock(ownerPassword); 58139 } 58140 return userPassword; 58141 } 58142 #buildObjectKey(num, gen, encryptionKey, isAes = false) { 58143 const key = new Uint8Array(encryptionKey.length + 9); 58144 const n = encryptionKey.length; 58145 let i; 58146 for (i = 0; i < n; ++i) { 58147 key[i] = encryptionKey[i]; 58148 } 58149 key[i++] = num & 0xff; 58150 key[i++] = num >> 8 & 0xff; 58151 key[i++] = num >> 16 & 0xff; 58152 key[i++] = gen & 0xff; 58153 key[i++] = gen >> 8 & 0xff; 58154 if (isAes) { 58155 key[i++] = 0x73; 58156 key[i++] = 0x41; 58157 key[i++] = 0x6c; 58158 key[i++] = 0x54; 58159 } 58160 const hash = calculateMD5(key, 0, i); 58161 return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); 58162 } 58163 #buildCipherConstructor(cf, name, num, gen, key) { 58164 if (!(name instanceof Name)) { 58165 throw new FormatError("Invalid crypt filter name."); 58166 } 58167 const self = this; 58168 const cryptFilter = cf.get(name.name); 58169 const cfm = cryptFilter?.get("CFM"); 58170 if (!cfm || cfm.name === "None") { 58171 return function () { 58172 return new NullCipher(); 58173 }; 58174 } 58175 if (cfm.name === "V2") { 58176 return function () { 58177 return new ARCFourCipher(self.#buildObjectKey(num, gen, key, false)); 58178 }; 58179 } 58180 if (cfm.name === "AESV2") { 58181 return function () { 58182 return new AES128Cipher(self.#buildObjectKey(num, gen, key, true)); 58183 }; 58184 } 58185 if (cfm.name === "AESV3") { 58186 return function () { 58187 return new AES256Cipher(key); 58188 }; 58189 } 58190 throw new FormatError("Unknown crypto method"); 58191 } 58192 constructor(dict, fileId, password) { 58193 const filter = dict.get("Filter"); 58194 if (!isName(filter, "Standard")) { 58195 throw new FormatError("unknown encryption method"); 58196 } 58197 this.filterName = filter.name; 58198 this.dict = dict; 58199 const algorithm = dict.get("V"); 58200 if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { 58201 throw new FormatError("unsupported encryption algorithm"); 58202 } 58203 this.algorithm = algorithm; 58204 let keyLength = dict.get("Length"); 58205 if (!keyLength) { 58206 if (algorithm <= 3) { 58207 keyLength = 40; 58208 } else { 58209 const cfDict = dict.get("CF"); 58210 const streamCryptoName = dict.get("StmF"); 58211 if (cfDict instanceof Dict && streamCryptoName instanceof Name) { 58212 cfDict.suppressEncryption = true; 58213 const handlerDict = cfDict.get(streamCryptoName.name); 58214 keyLength = handlerDict?.get("Length") || 128; 58215 if (keyLength < 40) { 58216 keyLength <<= 3; 58217 } 58218 } 58219 } 58220 } 58221 if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { 58222 throw new FormatError("invalid key length"); 58223 } 58224 const ownerBytes = stringToBytes(dict.get("O")), 58225 userBytes = stringToBytes(dict.get("U")); 58226 const ownerPassword = ownerBytes.subarray(0, 32); 58227 const userPassword = userBytes.subarray(0, 32); 58228 const flags = dict.get("P"); 58229 const revision = dict.get("R"); 58230 const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false; 58231 this.encryptMetadata = encryptMetadata; 58232 const fileIdBytes = stringToBytes(fileId); 58233 let passwordBytes; 58234 if (password) { 58235 if (revision === 6) { 58236 try { 58237 password = utf8StringToString(password); 58238 } catch { 58239 warn("CipherTransformFactory: Unable to convert UTF8 encoded password."); 58240 } 58241 } 58242 passwordBytes = stringToBytes(password); 58243 } 58244 let encryptionKey; 58245 if (algorithm !== 5) { 58246 encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); 58247 } else { 58248 const ownerValidationSalt = ownerBytes.subarray(32, 40); 58249 const ownerKeySalt = ownerBytes.subarray(40, 48); 58250 const uBytes = userBytes.subarray(0, 48); 58251 const userValidationSalt = userBytes.subarray(32, 40); 58252 const userKeySalt = userBytes.subarray(40, 48); 58253 const ownerEncryption = stringToBytes(dict.get("OE")); 58254 const userEncryption = stringToBytes(dict.get("UE")); 58255 const perms = stringToBytes(dict.get("Perms")); 58256 encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); 58257 } 58258 if (!encryptionKey && !password) { 58259 throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); 58260 } else if (!encryptionKey && password) { 58261 const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); 58262 encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); 58263 } 58264 if (!encryptionKey) { 58265 throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD); 58266 } 58267 this.encryptionKey = encryptionKey; 58268 if (algorithm >= 4) { 58269 const cf = dict.get("CF"); 58270 if (cf instanceof Dict) { 58271 cf.suppressEncryption = true; 58272 } 58273 this.cf = cf; 58274 this.stmf = dict.get("StmF") || Name.get("Identity"); 58275 this.strf = dict.get("StrF") || Name.get("Identity"); 58276 this.eff = dict.get("EFF") || this.stmf; 58277 } 58278 } 58279 createCipherTransform(num, gen) { 58280 if (this.algorithm === 4 || this.algorithm === 5) { 58281 return new CipherTransform(this.#buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey), this.#buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey)); 58282 } 58283 const key = this.#buildObjectKey(num, gen, this.encryptionKey, false); 58284 const cipherConstructor = function () { 58285 return new ARCFourCipher(key); 58286 }; 58287 return new CipherTransform(cipherConstructor, cipherConstructor); 58288 } 58289} 58290 58291;// ./src/core/dataset_reader.js 58292 58293 58294 58295 58296function decodeString(str) { 58297 try { 58298 return stringToUTF8String(str); 58299 } catch (ex) { 58300 warn(`UTF-8 decoding failed: "${ex}".`); 58301 return str; 58302 } 58303} 58304class DatasetXMLParser extends SimpleXMLParser { 58305 constructor(options) { 58306 super(options); 58307 this.node = null; 58308 } 58309 onEndElement(name) { 58310 const node = super.onEndElement(name); 58311 if (node && name === "xfa:datasets") { 58312 this.node = node; 58313 throw new Error("Aborting DatasetXMLParser."); 58314 } 58315 } 58316} 58317class DatasetReader { 58318 constructor(data) { 58319 if (data.datasets) { 58320 this.node = new SimpleXMLParser({ 58321 hasAttributes: true 58322 }).parseFromString(data.datasets).documentElement; 58323 } else { 58324 const parser = new DatasetXMLParser({ 58325 hasAttributes: true 58326 }); 58327 try { 58328 parser.parseFromString(data["xdp:xdp"]); 58329 } catch {} 58330 this.node = parser.node; 58331 } 58332 } 58333 getValue(path) { 58334 if (!this.node || !path) { 58335 return ""; 58336 } 58337 const node = this.node.searchNode(parseXFAPath(path), 0); 58338 if (!node) { 58339 return ""; 58340 } 58341 const first = node.firstChild; 58342 if (first?.nodeName === "value") { 58343 return node.children.map(child => decodeString(child.textContent)); 58344 } 58345 return decodeString(node.textContent); 58346 } 58347} 58348 58349;// ./src/core/xref.js 58350 58351 58352 58353 58354 58355 58356 58357 58358 58359 58360 58361 58362 58363 58364 58365 58366 58367 58368 58369 58370class XRef { 58371 #firstXRefStmPos = null; 58372 constructor(stream, pdfManager) { 58373 this.stream = stream; 58374 this.pdfManager = pdfManager; 58375 this.entries = []; 58376 this._xrefStms = new Set(); 58377 this._cacheMap = new Map(); 58378 this._pendingRefs = new RefSet(); 58379 this._newPersistentRefNum = null; 58380 this._newTemporaryRefNum = null; 58381 this._persistentRefsCache = null; 58382 } 58383 getNewPersistentRef(obj) { 58384 if (this._newPersistentRefNum === null) { 58385 this._newPersistentRefNum = this.entries.length || 1; 58386 } 58387 const num = this._newPersistentRefNum++; 58388 this._cacheMap.set(num, obj); 58389 return Ref.get(num, 0); 58390 } 58391 getNewTemporaryRef() { 58392 if (this._newTemporaryRefNum === null) { 58393 this._newTemporaryRefNum = this.entries.length || 1; 58394 if (this._newPersistentRefNum) { 58395 this._persistentRefsCache = new Map(); 58396 for (let i = this._newTemporaryRefNum; i < this._newPersistentRefNum; i++) { 58397 this._persistentRefsCache.set(i, this._cacheMap.get(i)); 58398 this._cacheMap.delete(i); 58399 } 58400 } 58401 } 58402 return Ref.get(this._newTemporaryRefNum++, 0); 58403 } 58404 resetNewTemporaryRef() { 58405 this._newTemporaryRefNum = null; 58406 if (this._persistentRefsCache) { 58407 for (const [num, obj] of this._persistentRefsCache) { 58408 this._cacheMap.set(num, obj); 58409 } 58410 } 58411 this._persistentRefsCache = null; 58412 } 58413 setStartXRef(startXRef) { 58414 this.startXRefQueue = [startXRef]; 58415 } 58416 parse(recoveryMode = false) { 58417 let trailerDict; 58418 if (!recoveryMode) { 58419 trailerDict = this.readXRef(); 58420 } else { 58421 warn("Indexing all PDF objects"); 58422 trailerDict = this.indexObjects(); 58423 } 58424 trailerDict.assignXref(this); 58425 this.trailer = trailerDict; 58426 let encrypt; 58427 try { 58428 encrypt = trailerDict.get("Encrypt"); 58429 } catch (ex) { 58430 if (ex instanceof MissingDataException) { 58431 throw ex; 58432 } 58433 warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`); 58434 } 58435 if (encrypt instanceof Dict) { 58436 const ids = trailerDict.get("ID"); 58437 const fileId = ids?.length ? ids[0] : ""; 58438 encrypt.suppressEncryption = true; 58439 this.encrypt = new CipherTransformFactory(encrypt, fileId, this.pdfManager.password); 58440 } 58441 let root; 58442 try { 58443 root = trailerDict.get("Root"); 58444 } catch (ex) { 58445 if (ex instanceof MissingDataException) { 58446 throw ex; 58447 } 58448 warn(`XRef.parse - Invalid "Root" reference: "${ex}".`); 58449 } 58450 if (root instanceof Dict) { 58451 try { 58452 const pages = root.get("Pages"); 58453 if (pages instanceof Dict) { 58454 this.root = root; 58455 return; 58456 } 58457 } catch (ex) { 58458 if (ex instanceof MissingDataException) { 58459 throw ex; 58460 } 58461 warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`); 58462 } 58463 } 58464 if (!recoveryMode) { 58465 throw new XRefParseException(); 58466 } 58467 throw new InvalidPDFException("Invalid Root reference."); 58468 } 58469 processXRefTable(parser) { 58470 if (!("tableState" in this)) { 58471 this.tableState = { 58472 entryNum: 0, 58473 streamPos: parser.lexer.stream.pos, 58474 parserBuf1: parser.buf1, 58475 parserBuf2: parser.buf2 58476 }; 58477 } 58478 const obj = this.readXRefTable(parser); 58479 if (!isCmd(obj, "trailer")) { 58480 throw new FormatError("Invalid XRef table: could not find trailer dictionary"); 58481 } 58482 let dict = parser.getObj(); 58483 if (!(dict instanceof Dict) && dict.dict) { 58484 dict = dict.dict; 58485 } 58486 if (!(dict instanceof Dict)) { 58487 throw new FormatError("Invalid XRef table: could not parse trailer dictionary"); 58488 } 58489 delete this.tableState; 58490 return dict; 58491 } 58492 readXRefTable(parser) { 58493 const stream = parser.lexer.stream; 58494 const tableState = this.tableState; 58495 stream.pos = tableState.streamPos; 58496 parser.buf1 = tableState.parserBuf1; 58497 parser.buf2 = tableState.parserBuf2; 58498 let obj; 58499 while (true) { 58500 if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) { 58501 if (isCmd(obj = parser.getObj(), "trailer")) { 58502 break; 58503 } 58504 tableState.firstEntryNum = obj; 58505 tableState.entryCount = parser.getObj(); 58506 } 58507 let first = tableState.firstEntryNum; 58508 const count = tableState.entryCount; 58509 if (!Number.isInteger(first) || !Number.isInteger(count)) { 58510 throw new FormatError("Invalid XRef table: wrong types in subsection header"); 58511 } 58512 for (let i = tableState.entryNum; i < count; i++) { 58513 tableState.streamPos = stream.pos; 58514 tableState.entryNum = i; 58515 tableState.parserBuf1 = parser.buf1; 58516 tableState.parserBuf2 = parser.buf2; 58517 const entry = {}; 58518 entry.offset = parser.getObj(); 58519 entry.gen = parser.getObj(); 58520 const type = parser.getObj(); 58521 if (type instanceof Cmd) { 58522 switch (type.cmd) { 58523 case "f": 58524 entry.free = true; 58525 break; 58526 case "n": 58527 entry.uncompressed = true; 58528 break; 58529 } 58530 } 58531 if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) { 58532 throw new FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`); 58533 } 58534 if (i === 0 && entry.free && first === 1) { 58535 first = 0; 58536 } 58537 if (!this.entries[i + first]) { 58538 this.entries[i + first] = entry; 58539 } 58540 } 58541 tableState.entryNum = 0; 58542 tableState.streamPos = stream.pos; 58543 tableState.parserBuf1 = parser.buf1; 58544 tableState.parserBuf2 = parser.buf2; 58545 delete tableState.firstEntryNum; 58546 delete tableState.entryCount; 58547 } 58548 if (this.entries[0] && !this.entries[0].free) { 58549 throw new FormatError("Invalid XRef table: unexpected first object"); 58550 } 58551 return obj; 58552 } 58553 processXRefStream(stream) { 58554 if (!("streamState" in this)) { 58555 const { 58556 dict, 58557 pos 58558 } = stream; 58559 const byteWidths = dict.get("W"); 58560 const range = dict.get("Index") || [0, dict.get("Size")]; 58561 this.streamState = { 58562 entryRanges: range, 58563 byteWidths, 58564 entryNum: 0, 58565 streamPos: pos 58566 }; 58567 } 58568 this.readXRefStream(stream); 58569 delete this.streamState; 58570 return stream.dict; 58571 } 58572 readXRefStream(stream) { 58573 const streamState = this.streamState; 58574 stream.pos = streamState.streamPos; 58575 const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = streamState.byteWidths; 58576 const entryRanges = streamState.entryRanges; 58577 while (entryRanges.length > 0) { 58578 const [first, n] = entryRanges; 58579 if (!Number.isInteger(first) || !Number.isInteger(n)) { 58580 throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`); 58581 } 58582 if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) { 58583 throw new FormatError(`Invalid XRef entry fields length: ${first}, ${n}`); 58584 } 58585 for (let i = streamState.entryNum; i < n; ++i) { 58586 streamState.entryNum = i; 58587 streamState.streamPos = stream.pos; 58588 let type = 0, 58589 offset = 0, 58590 generation = 0; 58591 for (let j = 0; j < typeFieldWidth; ++j) { 58592 const typeByte = stream.getByte(); 58593 if (typeByte === -1) { 58594 throw new FormatError("Invalid XRef byteWidths 'type'."); 58595 } 58596 type = type << 8 | typeByte; 58597 } 58598 if (typeFieldWidth === 0) { 58599 type = 1; 58600 } 58601 for (let j = 0; j < offsetFieldWidth; ++j) { 58602 const offsetByte = stream.getByte(); 58603 if (offsetByte === -1) { 58604 throw new FormatError("Invalid XRef byteWidths 'offset'."); 58605 } 58606 offset = offset << 8 | offsetByte; 58607 } 58608 for (let j = 0; j < generationFieldWidth; ++j) { 58609 const generationByte = stream.getByte(); 58610 if (generationByte === -1) { 58611 throw new FormatError("Invalid XRef byteWidths 'generation'."); 58612 } 58613 generation = generation << 8 | generationByte; 58614 } 58615 const entry = {}; 58616 entry.offset = offset; 58617 entry.gen = generation; 58618 switch (type) { 58619 case 0: 58620 entry.free = true; 58621 break; 58622 case 1: 58623 entry.uncompressed = true; 58624 break; 58625 case 2: 58626 break; 58627 default: 58628 throw new FormatError(`Invalid XRef entry type: ${type}`); 58629 } 58630 if (!this.entries[first + i]) { 58631 this.entries[first + i] = entry; 58632 } 58633 } 58634 streamState.entryNum = 0; 58635 streamState.streamPos = stream.pos; 58636 entryRanges.splice(0, 2); 58637 } 58638 } 58639 indexObjects() { 58640 const TAB = 0x9, 58641 LF = 0xa, 58642 CR = 0xd, 58643 SPACE = 0x20; 58644 const PERCENT = 0x25, 58645 LT = 0x3c; 58646 function readToken(data, offset) { 58647 let token = "", 58648 ch = data[offset]; 58649 while (ch !== LF && ch !== CR && ch !== LT) { 58650 if (++offset >= data.length) { 58651 break; 58652 } 58653 token += String.fromCharCode(ch); 58654 ch = data[offset]; 58655 } 58656 return token; 58657 } 58658 function skipUntil(data, offset, what) { 58659 const length = what.length, 58660 dataLength = data.length; 58661 let skipped = 0; 58662 while (offset < dataLength) { 58663 let i = 0; 58664 while (i < length && data[offset + i] === what[i]) { 58665 ++i; 58666 } 58667 if (i >= length) { 58668 break; 58669 } 58670 offset++; 58671 skipped++; 58672 } 58673 return skipped; 58674 } 58675 const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g; 58676 const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g; 58677 const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; 58678 const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); 58679 const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]); 58680 const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); 58681 this.entries.length = 0; 58682 this._cacheMap.clear(); 58683 const stream = this.stream; 58684 stream.pos = 0; 58685 const buffer = stream.getBytes(), 58686 bufferStr = bytesToString(buffer), 58687 length = buffer.length; 58688 let position = stream.start; 58689 const trailers = [], 58690 xrefStms = []; 58691 while (position < length) { 58692 let ch = buffer[position]; 58693 if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { 58694 ++position; 58695 continue; 58696 } 58697 if (ch === PERCENT) { 58698 do { 58699 ++position; 58700 if (position >= length) { 58701 break; 58702 } 58703 ch = buffer[position]; 58704 } while (ch !== LF && ch !== CR); 58705 continue; 58706 } 58707 const token = readToken(buffer, position); 58708 let m; 58709 if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) { 58710 position += skipUntil(buffer, position, trailerBytes); 58711 trailers.push(position); 58712 position += skipUntil(buffer, position, startxrefBytes); 58713 } else if (m = objRegExp.exec(token)) { 58714 const num = m[1] | 0, 58715 gen = m[2] | 0; 58716 const startPos = position + token.length; 58717 let contentLength, 58718 updateEntries = false; 58719 if (!this.entries[num]) { 58720 updateEntries = true; 58721 } else if (this.entries[num].gen === gen) { 58722 try { 58723 const parser = new Parser({ 58724 lexer: new Lexer(stream.makeSubStream(startPos)) 58725 }); 58726 parser.getObj(); 58727 updateEntries = true; 58728 } catch (ex) { 58729 if (ex instanceof ParserEOFException) { 58730 warn(`indexObjects -- checking object (${token}): "${ex}".`); 58731 } else { 58732 updateEntries = true; 58733 } 58734 } 58735 } 58736 if (updateEntries) { 58737 this.entries[num] = { 58738 offset: position - stream.start, 58739 gen, 58740 uncompressed: true 58741 }; 58742 } 58743 gEndobjRegExp.lastIndex = startPos; 58744 const match = gEndobjRegExp.exec(bufferStr); 58745 if (match) { 58746 const endPos = gEndobjRegExp.lastIndex + 1; 58747 contentLength = endPos - position; 58748 if (match[1] !== "endobj") { 58749 warn(`indexObjects: Found "${match[1]}" inside of another "obj", ` + 'caused by missing "endobj" -- trying to recover.'); 58750 contentLength -= match[1].length + 1; 58751 } 58752 } else { 58753 contentLength = length - position; 58754 } 58755 const content = buffer.subarray(position, position + contentLength); 58756 const xrefTagOffset = skipUntil(content, 0, xrefBytes); 58757 if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { 58758 xrefStms.push(position - stream.start); 58759 this._xrefStms.add(position - stream.start); 58760 } 58761 position += contentLength; 58762 } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) { 58763 trailers.push(position); 58764 const startPos = position + token.length; 58765 let contentLength; 58766 gStartxrefRegExp.lastIndex = startPos; 58767 const match = gStartxrefRegExp.exec(bufferStr); 58768 if (match) { 58769 const endPos = gStartxrefRegExp.lastIndex + 1; 58770 contentLength = endPos - position; 58771 if (match[1] !== "startxref") { 58772 warn(`indexObjects: Found "${match[1]}" after "trailer", ` + 'caused by missing "startxref" -- trying to recover.'); 58773 contentLength -= match[1].length + 1; 58774 } 58775 } else { 58776 contentLength = length - position; 58777 } 58778 position += contentLength; 58779 } else { 58780 position += token.length + 1; 58781 } 58782 } 58783 for (const xrefStm of xrefStms) { 58784 this.startXRefQueue.push(xrefStm); 58785 this.readXRef(true); 58786 } 58787 const trailerDicts = []; 58788 let isEncrypted = false; 58789 for (const trailer of trailers) { 58790 stream.pos = trailer; 58791 const parser = new Parser({ 58792 lexer: new Lexer(stream), 58793 xref: this, 58794 allowStreams: true, 58795 recoveryMode: true 58796 }); 58797 const obj = parser.getObj(); 58798 if (!isCmd(obj, "trailer")) { 58799 continue; 58800 } 58801 const dict = parser.getObj(); 58802 if (!(dict instanceof Dict)) { 58803 continue; 58804 } 58805 trailerDicts.push(dict); 58806 if (dict.has("Encrypt")) { 58807 isEncrypted = true; 58808 } 58809 } 58810 let trailerDict, trailerError; 58811 for (const dict of [...trailerDicts, "genFallback", ...trailerDicts]) { 58812 if (dict === "genFallback") { 58813 if (!trailerError) { 58814 break; 58815 } 58816 this._generationFallback = true; 58817 continue; 58818 } 58819 let validPagesDict = false; 58820 try { 58821 const rootDict = dict.get("Root"); 58822 if (!(rootDict instanceof Dict)) { 58823 continue; 58824 } 58825 const pagesDict = rootDict.get("Pages"); 58826 if (!(pagesDict instanceof Dict)) { 58827 continue; 58828 } 58829 const pagesCount = pagesDict.get("Count"); 58830 if (Number.isInteger(pagesCount)) { 58831 validPagesDict = true; 58832 } 58833 } catch (ex) { 58834 trailerError = ex; 58835 continue; 58836 } 58837 if (validPagesDict && (!isEncrypted || dict.has("Encrypt")) && dict.has("ID")) { 58838 return dict; 58839 } 58840 trailerDict = dict; 58841 } 58842 if (trailerDict) { 58843 return trailerDict; 58844 } 58845 if (this.topDict) { 58846 return this.topDict; 58847 } 58848 if (!trailerDicts.length) { 58849 for (const [num, entry] of this.entries.entries()) { 58850 if (!entry) { 58851 continue; 58852 } 58853 const ref = Ref.get(num, entry.gen); 58854 let obj; 58855 try { 58856 obj = this.fetch(ref); 58857 } catch { 58858 continue; 58859 } 58860 if (obj instanceof BaseStream) { 58861 obj = obj.dict; 58862 } 58863 if (obj instanceof Dict && obj.has("Root")) { 58864 return obj; 58865 } 58866 } 58867 } 58868 throw new InvalidPDFException("Invalid PDF structure."); 58869 } 58870 readXRef(recoveryMode = false) { 58871 const stream = this.stream; 58872 const startXRefParsedCache = new Set(); 58873 while (this.startXRefQueue.length) { 58874 try { 58875 const startXRef = this.startXRefQueue[0]; 58876 if (startXRefParsedCache.has(startXRef)) { 58877 warn("readXRef - skipping XRef table since it was already parsed."); 58878 this.startXRefQueue.shift(); 58879 continue; 58880 } 58881 startXRefParsedCache.add(startXRef); 58882 stream.pos = startXRef + stream.start; 58883 const parser = new Parser({ 58884 lexer: new Lexer(stream), 58885 xref: this, 58886 allowStreams: true 58887 }); 58888 let obj = parser.getObj(); 58889 let dict; 58890 if (isCmd(obj, "xref")) { 58891 dict = this.processXRefTable(parser); 58892 if (!this.topDict) { 58893 this.topDict = dict; 58894 } 58895 obj = dict.get("XRefStm"); 58896 if (Number.isInteger(obj) && !this._xrefStms.has(obj)) { 58897 this._xrefStms.add(obj); 58898 this.startXRefQueue.push(obj); 58899 this.#firstXRefStmPos ??= obj; 58900 } 58901 } else if (Number.isInteger(obj)) { 58902 if (!Number.isInteger(parser.getObj()) || !isCmd(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof BaseStream)) { 58903 throw new FormatError("Invalid XRef stream"); 58904 } 58905 dict = this.processXRefStream(obj); 58906 if (!this.topDict) { 58907 this.topDict = dict; 58908 } 58909 if (!dict) { 58910 throw new FormatError("Failed to read XRef stream"); 58911 } 58912 } else { 58913 throw new FormatError("Invalid XRef stream header"); 58914 } 58915 obj = dict.get("Prev"); 58916 if (Number.isInteger(obj)) { 58917 this.startXRefQueue.push(obj); 58918 } else if (obj instanceof Ref) { 58919 this.startXRefQueue.push(obj.num); 58920 } 58921 } catch (e) { 58922 if (e instanceof MissingDataException) { 58923 throw e; 58924 } 58925 info("(while reading XRef): " + e); 58926 } 58927 this.startXRefQueue.shift(); 58928 } 58929 if (this.topDict) { 58930 return this.topDict; 58931 } 58932 if (recoveryMode) { 58933 return undefined; 58934 } 58935 throw new XRefParseException(); 58936 } 58937 get lastXRefStreamPos() { 58938 return this.#firstXRefStmPos ?? (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null); 58939 } 58940 getEntry(i) { 58941 const xrefEntry = this.entries[i]; 58942 if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { 58943 return xrefEntry; 58944 } 58945 return null; 58946 } 58947 fetchIfRef(obj, suppressEncryption = false) { 58948 if (obj instanceof Ref) { 58949 return this.fetch(obj, suppressEncryption); 58950 } 58951 return obj; 58952 } 58953 fetch(ref, suppressEncryption = false) { 58954 if (!(ref instanceof Ref)) { 58955 throw new Error("ref object is not a reference"); 58956 } 58957 const num = ref.num; 58958 const cacheEntry = this._cacheMap.get(num); 58959 if (cacheEntry !== undefined) { 58960 if (cacheEntry instanceof Dict && !cacheEntry.objId) { 58961 cacheEntry.objId = ref.toString(); 58962 } 58963 return cacheEntry; 58964 } 58965 let xrefEntry = this.getEntry(num); 58966 if (xrefEntry === null) { 58967 this._cacheMap.set(num, xrefEntry); 58968 return xrefEntry; 58969 } 58970 if (this._pendingRefs.has(ref)) { 58971 this._pendingRefs.remove(ref); 58972 warn(`Ignoring circular reference: ${ref}.`); 58973 return CIRCULAR_REF; 58974 } 58975 this._pendingRefs.put(ref); 58976 try { 58977 xrefEntry = xrefEntry.uncompressed ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption) : this.fetchCompressed(ref, xrefEntry, suppressEncryption); 58978 this._pendingRefs.remove(ref); 58979 } catch (ex) { 58980 this._pendingRefs.remove(ref); 58981 throw ex; 58982 } 58983 if (xrefEntry instanceof Dict) { 58984 xrefEntry.objId = ref.toString(); 58985 } else if (xrefEntry instanceof BaseStream) { 58986 xrefEntry.dict.objId = ref.toString(); 58987 } 58988 return xrefEntry; 58989 } 58990 fetchUncompressed(ref, xrefEntry, suppressEncryption = false) { 58991 const gen = ref.gen; 58992 let num = ref.num; 58993 if (xrefEntry.gen !== gen) { 58994 const msg = `Inconsistent generation in XRef: ${ref}`; 58995 if (this._generationFallback && xrefEntry.gen < gen) { 58996 warn(msg); 58997 return this.fetchUncompressed(Ref.get(num, xrefEntry.gen), xrefEntry, suppressEncryption); 58998 } 58999 throw new XRefEntryException(msg); 59000 } 59001 const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); 59002 const parser = new Parser({ 59003 lexer: new Lexer(stream), 59004 xref: this, 59005 allowStreams: true 59006 }); 59007 const obj1 = parser.getObj(); 59008 const obj2 = parser.getObj(); 59009 const obj3 = parser.getObj(); 59010 if (obj1 !== num || obj2 !== gen || !(obj3 instanceof Cmd)) { 59011 throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); 59012 } 59013 if (obj3.cmd !== "obj") { 59014 if (obj3.cmd.startsWith("obj")) { 59015 num = parseInt(obj3.cmd.substring(3), 10); 59016 if (!Number.isNaN(num)) { 59017 return num; 59018 } 59019 } 59020 throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); 59021 } 59022 xrefEntry = this.encrypt && !suppressEncryption ? parser.getObj(this.encrypt.createCipherTransform(num, gen)) : parser.getObj(); 59023 if (!(xrefEntry instanceof BaseStream)) { 59024 this._cacheMap.set(num, xrefEntry); 59025 } 59026 return xrefEntry; 59027 } 59028 fetchCompressed(ref, xrefEntry, suppressEncryption = false) { 59029 const tableOffset = xrefEntry.offset; 59030 const stream = this.fetch(Ref.get(tableOffset, 0)); 59031 if (!(stream instanceof BaseStream)) { 59032 throw new FormatError("bad ObjStm stream"); 59033 } 59034 const first = stream.dict.get("First"); 59035 const n = stream.dict.get("N"); 59036 if (!Number.isInteger(first) || !Number.isInteger(n)) { 59037 throw new FormatError("invalid first and n parameters for ObjStm stream"); 59038 } 59039 let parser = new Parser({ 59040 lexer: new Lexer(stream), 59041 xref: this, 59042 allowStreams: true 59043 }); 59044 const nums = new Array(n); 59045 const offsets = new Array(n); 59046 for (let i = 0; i < n; ++i) { 59047 const num = parser.getObj(); 59048 if (!Number.isInteger(num)) { 59049 throw new FormatError(`invalid object number in the ObjStm stream: ${num}`); 59050 } 59051 const offset = parser.getObj(); 59052 if (!Number.isInteger(offset)) { 59053 throw new FormatError(`invalid object offset in the ObjStm stream: ${offset}`); 59054 } 59055 nums[i] = num; 59056 offsets[i] = offset; 59057 } 59058 const start = (stream.start || 0) + first; 59059 const entries = new Array(n); 59060 for (let i = 0; i < n; ++i) { 59061 const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined; 59062 if (length < 0) { 59063 throw new FormatError("Invalid offset in the ObjStm stream."); 59064 } 59065 parser = new Parser({ 59066 lexer: new Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)), 59067 xref: this, 59068 allowStreams: true 59069 }); 59070 const obj = parser.getObj(); 59071 entries[i] = obj; 59072 if (obj instanceof BaseStream) { 59073 continue; 59074 } 59075 const num = nums[i], 59076 entry = this.entries[num]; 59077 if (entry && entry.offset === tableOffset && entry.gen === i) { 59078 this._cacheMap.set(num, obj); 59079 } 59080 } 59081 xrefEntry = entries[xrefEntry.gen]; 59082 if (xrefEntry === undefined) { 59083 throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`); 59084 } 59085 return xrefEntry; 59086 } 59087 async fetchIfRefAsync(obj, suppressEncryption) { 59088 if (obj instanceof Ref) { 59089 return this.fetchAsync(obj, suppressEncryption); 59090 } 59091 return obj; 59092 } 59093 async fetchAsync(ref, suppressEncryption) { 59094 try { 59095 return this.fetch(ref, suppressEncryption); 59096 } catch (ex) { 59097 if (!(ex instanceof MissingDataException)) { 59098 throw ex; 59099 } 59100 await this.pdfManager.requestRange(ex.begin, ex.end); 59101 return this.fetchAsync(ref, suppressEncryption); 59102 } 59103 } 59104 getCatalogObj() { 59105 return this.root; 59106 } 59107} 59108 59109;// ./src/core/document.js 59110 59111 59112 59113 59114 59115 59116 59117 59118 59119 59120 59121 59122 59123 59124 59125 59126 59127 59128 59129 59130 59131 59132 59133 59134 59135 59136 59137 59138 59139 59140 59141 59142 59143 59144 59145 59146 59147const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; 59148class Page { 59149 constructor({ 59150 pdfManager, 59151 xref, 59152 pageIndex, 59153 pageDict, 59154 ref, 59155 globalIdFactory, 59156 fontCache, 59157 builtInCMapCache, 59158 standardFontDataCache, 59159 globalImageCache, 59160 systemFontCache, 59161 nonBlendModesSet, 59162 xfaFactory 59163 }) { 59164 this.pdfManager = pdfManager; 59165 this.pageIndex = pageIndex; 59166 this.pageDict = pageDict; 59167 this.xref = xref; 59168 this.ref = ref; 59169 this.fontCache = fontCache; 59170 this.builtInCMapCache = builtInCMapCache; 59171 this.standardFontDataCache = standardFontDataCache; 59172 this.globalImageCache = globalImageCache; 59173 this.systemFontCache = systemFontCache; 59174 this.nonBlendModesSet = nonBlendModesSet; 59175 this.evaluatorOptions = pdfManager.evaluatorOptions; 59176 this.resourcesPromise = null; 59177 this.xfaFactory = xfaFactory; 59178 const idCounters = { 59179 obj: 0 59180 }; 59181 this._localIdFactory = class extends globalIdFactory { 59182 static createObjId() { 59183 return `p${pageIndex}_${++idCounters.obj}`; 59184 } 59185 static getPageObjId() { 59186 return `p${ref.toString()}`; 59187 } 59188 }; 59189 } 59190 _getInheritableProperty(key, getArray = false) { 59191 const value = getInheritableProperty({ 59192 dict: this.pageDict, 59193 key, 59194 getArray, 59195 stopWhenFound: false 59196 }); 59197 if (!Array.isArray(value)) { 59198 return value; 59199 } 59200 if (value.length === 1 || !(value[0] instanceof Dict)) { 59201 return value[0]; 59202 } 59203 return Dict.merge({ 59204 xref: this.xref, 59205 dictArray: value 59206 }); 59207 } 59208 get content() { 59209 return this.pageDict.getArray("Contents"); 59210 } 59211 get resources() { 59212 const resources = this._getInheritableProperty("Resources"); 59213 return shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty); 59214 } 59215 _getBoundingBox(name) { 59216 if (this.xfaData) { 59217 return this.xfaData.bbox; 59218 } 59219 const box = lookupNormalRect(this._getInheritableProperty(name, true), null); 59220 if (box) { 59221 if (box[2] - box[0] > 0 && box[3] - box[1] > 0) { 59222 return box; 59223 } 59224 warn(`Empty, or invalid, /${name} entry.`); 59225 } 59226 return null; 59227 } 59228 get mediaBox() { 59229 return shadow(this, "mediaBox", this._getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); 59230 } 59231 get cropBox() { 59232 return shadow(this, "cropBox", this._getBoundingBox("CropBox") || this.mediaBox); 59233 } 59234 get userUnit() { 59235 const obj = this.pageDict.get("UserUnit");
59236 return shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0); 59237 } 59238 get view() { 59239 const { 59240 cropBox, 59241 mediaBox 59242 } = this; 59243 if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) { 59244 const box = Util.intersect(cropBox, mediaBox); 59245 if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) { 59246 return shadow(this, "view", box); 59247 } 59248 warn("Empty /CropBox and /MediaBox intersection."); 59249 } 59250 return shadow(this, "view", mediaBox); 59251 } 59252 get rotate() { 59253 let rotate = this._getInheritableProperty("Rotate") || 0; 59254 if (rotate % 90 !== 0) { 59255 rotate = 0; 59256 } else if (rotate >= 360) { 59257 rotate %= 360; 59258 } else if (rotate < 0) { 59259 rotate = (rotate % 360 + 360) % 360; 59260 } 59261 return shadow(this, "rotate", rotate); 59262 } 59263 _onSubStreamError(reason, objId) { 59264 if (this.evaluatorOptions.ignoreErrors) { 59265 warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); 59266 return; 59267 } 59268 throw reason; 59269 } 59270 getContentStream() { 59271 return this.pdfManager.ensure(this, "content").then(content => { 59272 if (content instanceof BaseStream) { 59273 return content; 59274 } 59275 if (Array.isArray(content)) { 59276 return new StreamsSequenceStream(content, this._onSubStreamError.bind(this)); 59277 } 59278 return new NullStream(); 59279 }); 59280 } 59281 get xfaData() { 59282 return shadow(this, "xfaData", this.xfaFactory ? { 59283 bbox: this.xfaFactory.getBoundingBox(this.pageIndex) 59284 } : null); 59285 } 59286 async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { 59287 const promises = []; 59288 for (const annotation of annotations) { 59289 if (annotation.id) { 59290 const ref = Ref.fromString(annotation.id); 59291 if (!ref) { 59292 warn(`A non-linked annotation cannot be modified: ${annotation.id}`); 59293 continue; 59294 } 59295 if (annotation.deleted) { 59296 deletedAnnotations.put(ref, ref); 59297 if (annotation.popupRef) { 59298 const popupRef = Ref.fromString(annotation.popupRef); 59299 if (popupRef) { 59300 deletedAnnotations.put(popupRef, popupRef); 59301 } 59302 } 59303 continue; 59304 } 59305 existingAnnotations?.put(ref); 59306 annotation.ref = ref; 59307 promises.push(this.xref.fetchAsync(ref).then(obj => { 59308 if (obj instanceof Dict) { 59309 annotation.oldAnnotation = obj.clone(); 59310 } 59311 }, () => { 59312 warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`); 59313 })); 59314 delete annotation.id; 59315 } 59316 } 59317 await Promise.all(promises); 59318 } 59319 async saveNewAnnotations(handler, task, annotations, imagePromises, changes) { 59320 if (this.xfaFactory) { 59321 throw new Error("XFA: Cannot save new annotations."); 59322 } 59323 const partialEvaluator = new PartialEvaluator({ 59324 xref: this.xref, 59325 handler, 59326 pageIndex: this.pageIndex, 59327 idFactory: this._localIdFactory, 59328 fontCache: this.fontCache, 59329 builtInCMapCache: this.builtInCMapCache, 59330 standardFontDataCache: this.standardFontDataCache, 59331 globalImageCache: this.globalImageCache, 59332 systemFontCache: this.systemFontCache, 59333 options: this.evaluatorOptions 59334 }); 59335 const deletedAnnotations = new RefSetCache(); 59336 const existingAnnotations = new RefSet(); 59337 await this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations); 59338 const pageDict = this.pageDict; 59339 const annotationsArray = this.annotations.filter(a => !(a instanceof Ref && deletedAnnotations.has(a))); 59340 const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, task, annotations, imagePromises, changes); 59341 for (const { 59342 ref 59343 } of newData.annotations) { 59344 if (ref instanceof Ref && !existingAnnotations.has(ref)) { 59345 annotationsArray.push(ref); 59346 } 59347 } 59348 const dict = pageDict.clone(); 59349 dict.set("Annots", annotationsArray); 59350 changes.put(this.ref, { 59351 data: dict 59352 }); 59353 for (const deletedRef of deletedAnnotations) { 59354 changes.put(deletedRef, { 59355 data: null 59356 }); 59357 } 59358 } 59359 save(handler, task, annotationStorage, changes) { 59360 const partialEvaluator = new PartialEvaluator({ 59361 xref: this.xref, 59362 handler, 59363 pageIndex: this.pageIndex, 59364 idFactory: this._localIdFactory, 59365 fontCache: this.fontCache, 59366 builtInCMapCache: this.builtInCMapCache, 59367 standardFontDataCache: this.standardFontDataCache, 59368 globalImageCache: this.globalImageCache, 59369 systemFontCache: this.systemFontCache, 59370 options: this.evaluatorOptions 59371 }); 59372 return this._parsedAnnotations.then(function (annotations) { 59373 const promises = []; 59374 for (const annotation of annotations) { 59375 promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(function (reason) { 59376 warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); 59377 return null; 59378 })); 59379 } 59380 return Promise.all(promises); 59381 }); 59382 } 59383 loadResources(keys) { 59384 this.resourcesPromise ||= this.pdfManager.ensure(this, "resources"); 59385 return this.resourcesPromise.then(() => { 59386 const objectLoader = new ObjectLoader(this.resources, keys, this.xref); 59387 return objectLoader.load(); 59388 }); 59389 } 59390 getOperatorList({ 59391 handler, 59392 sink, 59393 task, 59394 intent, 59395 cacheKey, 59396 annotationStorage = null, 59397 modifiedIds = null 59398 }) { 59399 const contentStreamPromise = this.getContentStream(); 59400 const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]); 59401 const partialEvaluator = new PartialEvaluator({ 59402 xref: this.xref, 59403 handler, 59404 pageIndex: this.pageIndex, 59405 idFactory: this._localIdFactory, 59406 fontCache: this.fontCache, 59407 builtInCMapCache: this.builtInCMapCache, 59408 standardFontDataCache: this.standardFontDataCache, 59409 globalImageCache: this.globalImageCache, 59410 systemFontCache: this.systemFontCache, 59411 options: this.evaluatorOptions 59412 }); 59413 const newAnnotsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null; 59414 const newAnnots = newAnnotsByPage?.get(this.pageIndex);
59415 let newAnnotationsPromise = Promise.resolve(null); 59416 let deletedAnnotations = null; 59417 if (newAnnots) { 59418 const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals"); 59419 let imagePromises; 59420 const missingBitmaps = new Set(); 59421 for (const { 59422 bitmapId, 59423 bitmap 59424 } of newAnnots) { 59425 if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) { 59426 missingBitmaps.add(bitmapId); 59427 } 59428 } 59429 const { 59430 isOffscreenCanvasSupported 59431 } = this.evaluatorOptions; 59432 if (missingBitmaps.size > 0) { 59433 const annotationWithBitmaps = newAnnots.slice(); 59434 for (const [key, annotation] of annotationStorage) { 59435 if (!key.startsWith(AnnotationEditorPrefix)) { 59436 continue; 59437 } 59438 if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) { 59439 annotationWithBitmaps.push(annotation); 59440 } 59441 } 59442 imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported); 59443 } else { 59444 imagePromises = AnnotationFactory.generateImages(newAnnots, this.xref, isOffscreenCanvasSupported); 59445 } 59446 deletedAnnotations = new RefSet(); 59447 newAnnotationsPromise = Promise.all([annotationGlobalsPromise, this.#replaceIdByRef(newAnnots, deletedAnnotations, null)]).then(([annotationGlobals]) => { 59448 if (!annotationGlobals) { 59449 return null; 59450 } 59451 return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnots, imagePromises); 59452 }); 59453 } 59454 const pageListPromise = Promise.all([contentStreamPromise, resourcesPromise]).then(([contentStream]) => { 59455 const opList = new OperatorList(intent, sink); 59456 handler.send("StartRenderPage", { 59457 transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet), 59458 pageIndex: this.pageIndex, 59459 cacheKey 59460 }); 59461 return partialEvaluator.getOperatorList({ 59462 stream: contentStream, 59463 task, 59464 resources: this.resources, 59465 operatorList: opList 59466 }).then(function () { 59467 return opList; 59468 }); 59469 }); 59470 return Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]).then(function ([pageOpList, annotations, newAnnotations]) { 59471 if (newAnnotations) { 59472 annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref))); 59473 for (let i = 0, ii = newAnnotations.length; i < ii; i++) { 59474 const newAnnotation = newAnnotations[i]; 59475 if (newAnnotation.refToReplace) { 59476 const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace)); 59477 if (j >= 0) { 59478 annotations.splice(j, 1, newAnnotation); 59479 newAnnotations.splice(i--, 1); 59480 ii--; 59481 } 59482 } 59483 } 59484 annotations = annotations.concat(newAnnotations); 59485 }
59486 if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) { 59487 pageOpList.flush(true); 59488 return { 59489 length: pageOpList.totalLength 59490 }; 59491 } 59492 const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), 59493 isEditing = !!(intent & RenderingIntentFlag.IS_EDITING), 59494 intentAny = !!(intent & RenderingIntentFlag.ANY), 59495 intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), 59496 intentPrint = !!(intent & RenderingIntentFlag.PRINT); 59497 const opListPromises = []; 59498 for (const annotation of annotations) { 59499 if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) { 59500 opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) { 59501 warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); 59502 return { 59503 opList: null, 59504 separateForm: false, 59505 separateCanvas: false 59506 }; 59507 })); 59508 } 59509 } 59510 return Promise.all(opListPromises).then(function (opLists) { 59511 let form = false, 59512 canvas = false; 59513 for (const { 59514 opList, 59515 separateForm, 59516 separateCanvas 59517 } of opLists) { 59518 pageOpList.addOpList(opList); 59519 form ||= separateForm; 59520 canvas ||= separateCanvas; 59521 } 59522 pageOpList.flush(true, { 59523 form, 59524 canvas 59525 }); 59526 return { 59527 length: pageOpList.totalLength 59528 }; 59529 }); 59530 }); 59531 } 59532 async extractTextContent({ 59533 handler, 59534 task, 59535 includeMarkedContent, 59536 disableNormalization, 59537 sink 59538 }) { 59539 const contentStreamPromise = this.getContentStream(); 59540 const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]); 59541 const langPromise = this.pdfManager.ensureCatalog("lang"); 59542 const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]); 59543 const partialEvaluator = new PartialEvaluator({ 59544 xref: this.xref, 59545 handler, 59546 pageIndex: this.pageIndex, 59547 idFactory: this._localIdFactory, 59548 fontCache: this.fontCache, 59549 builtInCMapCache: this.builtInCMapCache, 59550 standardFontDataCache: this.standardFontDataCache, 59551 globalImageCache: this.globalImageCache, 59552 systemFontCache: this.systemFontCache, 59553 options: this.evaluatorOptions 59554 }); 59555 return partialEvaluator.getTextContent({ 59556 stream: contentStream, 59557 task, 59558 resources: this.resources, 59559 includeMarkedContent, 59560 disableNormalization, 59561 sink, 59562 viewBox: this.view, 59563 lang 59564 }); 59565 } 59566 async getStructTree() { 59567 const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot"); 59568 if (!structTreeRoot) { 59569 return null; 59570 } 59571 await this._parsedAnnotations; 59572 const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); 59573 return this.pdfManager.ensure(structTree, "serializable"); 59574 } 59575 _parseStructTree(structTreeRoot) { 59576 const tree = new StructTreePage(structTreeRoot, this.pageDict); 59577 tree.parse(this.ref); 59578 return tree; 59579 } 59580 async getAnnotationsData(handler, task, intent) { 59581 const annotations = await this._parsedAnnotations; 59582 if (annotations.length === 0) { 59583 return annotations; 59584 } 59585 const annotationsData = [], 59586 textContentPromises = []; 59587 let partialEvaluator; 59588 const intentAny = !!(intent & RenderingIntentFlag.ANY), 59589 intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), 59590 intentPrint = !!(intent & RenderingIntentFlag.PRINT); 59591 for (const annotation of annotations) { 59592 const isVisible = intentAny || intentDisplay && annotation.viewable; 59593 if (isVisible || intentPrint && annotation.printable) { 59594 annotationsData.push(annotation.data); 59595 }
vendor: 5,197 bytes, lines 59596-59767
59596 if (annotation.hasTextContent && isVisible) { 59597 partialEvaluator ||= new PartialEvaluator({ 59598 xref: this.xref, 59599 handler, 59600 pageIndex: this.pageIndex, 59601 idFactory: this._localIdFactory, 59602 fontCache: this.fontCache, 59603 builtInCMapCache: this.builtInCMapCache, 59604 standardFontDataCache: this.standardFontDataCache, 59605 globalImageCache: this.globalImageCache, 59606 systemFontCache: this.systemFontCache, 59607 options: this.evaluatorOptions 59608 }); 59609 textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(function (reason) { 59610 warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`); 59611 })); 59612 } 59613 } 59614 await Promise.all(textContentPromises); 59615 return annotationsData; 59616 } 59617 get annotations() { 59618 const annots = this._getInheritableProperty("Annots"); 59619 return shadow(this, "annotations", Array.isArray(annots) ? annots : []); 59620 } 59621 get _parsedAnnotations() { 59622 const promise = this.pdfManager.ensure(this, "annotations").then(async annots => { 59623 if (annots.length === 0) { 59624 return annots; 59625 } 59626 const [annotationGlobals, fieldObjects] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureDoc("fieldObjects")]); 59627 if (!annotationGlobals) { 59628 return []; 59629 } 59630 const orphanFields = fieldObjects?.orphanFields; 59631 const annotationPromises = []; 59632 for (const annotationRef of annots) { 59633 annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, this.ref).catch(function (reason) { 59634 warn(`_parsedAnnotations: "${reason}".`); 59635 return null; 59636 })); 59637 } 59638 const sortedAnnotations = []; 59639 let popupAnnotations, widgetAnnotations; 59640 for (const annotation of await Promise.all(annotationPromises)) { 59641 if (!annotation) { 59642 continue; 59643 } 59644 if (annotation instanceof WidgetAnnotation) { 59645 (widgetAnnotations ||= []).push(annotation); 59646 continue; 59647 } 59648 if (annotation instanceof PopupAnnotation) { 59649 (popupAnnotations ||= []).push(annotation); 59650 continue; 59651 } 59652 sortedAnnotations.push(annotation); 59653 } 59654 if (widgetAnnotations) { 59655 sortedAnnotations.push(...widgetAnnotations); 59656 } 59657 if (popupAnnotations) { 59658 sortedAnnotations.push(...popupAnnotations); 59659 } 59660 return sortedAnnotations; 59661 }); 59662 return shadow(this, "_parsedAnnotations", promise); 59663 } 59664 get jsActions() { 59665 const actions = collectActions(this.xref, this.pageDict, PageActionEventType); 59666 return shadow(this, "jsActions", actions); 59667 } 59668} 59669const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]); 59670const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]); 59671const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]); 59672function find(stream, signature, limit = 1024, backwards = false) { 59673 const signatureLength = signature.length; 59674 const scanBytes = stream.peekBytes(limit); 59675 const scanLength = scanBytes.length - signatureLength; 59676 if (scanLength <= 0) { 59677 return false; 59678 } 59679 if (backwards) { 59680 const signatureEnd = signatureLength - 1; 59681 let pos = scanBytes.length - 1; 59682 while (pos >= signatureEnd) { 59683 let j = 0; 59684 while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) { 59685 j++; 59686 } 59687 if (j >= signatureLength) { 59688 stream.pos += pos - signatureEnd; 59689 return true; 59690 } 59691 pos--; 59692 } 59693 } else { 59694 let pos = 0; 59695 while (pos <= scanLength) { 59696 let j = 0; 59697 while (j < signatureLength && scanBytes[pos + j] === signature[j]) { 59698 j++; 59699 } 59700 if (j >= signatureLength) { 59701 stream.pos += pos; 59702 return true; 59703 } 59704 pos++; 59705 } 59706 } 59707 return false; 59708} 59709class PDFDocument { 59710 constructor(pdfManager, stream) { 59711 if (stream.length <= 0) { 59712 throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes."); 59713 } 59714 this.pdfManager = pdfManager; 59715 this.stream = stream; 59716 this.xref = new XRef(stream, pdfManager); 59717 this._pagePromises = new Map(); 59718 this._version = null; 59719 const idCounters = { 59720 font: 0 59721 }; 59722 this._globalIdFactory = class { 59723 static getDocId() { 59724 return `g_${pdfManager.docId}`; 59725 } 59726 static createFontId() { 59727 return `f${++idCounters.font}`; 59728 } 59729 static createObjId() { 59730 unreachable("Abstract method `createObjId` called."); 59731 } 59732 static getPageObjId() { 59733 unreachable("Abstract method `getPageObjId` called."); 59734 } 59735 }; 59736 } 59737 parse(recoveryMode) { 59738 this.xref.parse(recoveryMode); 59739 this.catalog = new Catalog(this.pdfManager, this.xref); 59740 } 59741 get linearization() { 59742 let linearization = null; 59743 try { 59744 linearization = Linearization.create(this.stream); 59745 } catch (err) { 59746 if (err instanceof MissingDataException) { 59747 throw err; 59748 } 59749 info(err); 59750 } 59751 return shadow(this, "linearization", linearization); 59752 } 59753 get startXRef() { 59754 const stream = this.stream; 59755 let startXRef = 0; 59756 if (this.linearization) { 59757 stream.reset(); 59758 if (find(stream, ENDOBJ_SIGNATURE)) { 59759 stream.skip(6); 59760 let ch = stream.peekByte(); 59761 while (isWhiteSpace(ch)) { 59762 stream.pos++; 59763 ch = stream.peekByte(); 59764 } 59765 startXRef = stream.pos - stream.start; 59766 } 59767 } else {
vendor: 4,497 bytes, lines 59768-59950
59768 const step = 1024; 59769 const startXRefLength = STARTXREF_SIGNATURE.length; 59770 let found = false, 59771 pos = stream.end; 59772 while (!found && pos > 0) { 59773 pos -= step - startXRefLength; 59774 if (pos < 0) { 59775 pos = 0; 59776 } 59777 stream.pos = pos; 59778 found = find(stream, STARTXREF_SIGNATURE, step, true); 59779 } 59780 if (found) { 59781 stream.skip(9); 59782 let ch; 59783 do { 59784 ch = stream.getByte(); 59785 } while (isWhiteSpace(ch)); 59786 let str = ""; 59787 while (ch >= 0x20 && ch <= 0x39) { 59788 str += String.fromCharCode(ch); 59789 ch = stream.getByte(); 59790 } 59791 startXRef = parseInt(str, 10); 59792 if (isNaN(startXRef)) { 59793 startXRef = 0; 59794 } 59795 } 59796 } 59797 return shadow(this, "startXRef", startXRef); 59798 } 59799 checkHeader() { 59800 const stream = this.stream; 59801 stream.reset(); 59802 if (!find(stream, PDF_HEADER_SIGNATURE)) { 59803 return; 59804 } 59805 stream.moveStart(); 59806 stream.skip(PDF_HEADER_SIGNATURE.length); 59807 let version = "", 59808 ch; 59809 while ((ch = stream.getByte()) > 0x20 && version.length < 7) { 59810 version += String.fromCharCode(ch); 59811 } 59812 if (PDF_VERSION_REGEXP.test(version)) { 59813 this._version = version; 59814 } else { 59815 warn(`Invalid PDF header version: ${version}`); 59816 } 59817 } 59818 parseStartXRef() { 59819 this.xref.setStartXRef(this.startXRef); 59820 } 59821 get numPages() { 59822 let num = 0; 59823 if (this.catalog.hasActualNumPages) { 59824 num = this.catalog.numPages; 59825 } else if (this.xfaFactory) { 59826 num = this.xfaFactory.getNumPages(); 59827 } else if (this.linearization) { 59828 num = this.linearization.numPages; 59829 } else { 59830 num = this.catalog.numPages; 59831 } 59832 return shadow(this, "numPages", num); 59833 } 59834 _hasOnlyDocumentSignatures(fields, recursionDepth = 0) { 59835 const RECURSION_LIMIT = 10; 59836 if (!Array.isArray(fields)) { 59837 return false; 59838 } 59839 return fields.every(field => { 59840 field = this.xref.fetchIfRef(field); 59841 if (!(field instanceof Dict)) { 59842 return false; 59843 } 59844 if (field.has("Kids")) { 59845 if (++recursionDepth > RECURSION_LIMIT) { 59846 warn("_hasOnlyDocumentSignatures: maximum recursion depth reached"); 59847 return false; 59848 } 59849 return this._hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); 59850 } 59851 const isSignature = isName(field.get("FT"), "Sig"); 59852 const rectangle = field.get("Rect"); 59853 const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0); 59854 return isSignature && isInvisible; 59855 }); 59856 } 59857 get _xfaStreams() { 59858 const acroForm = this.catalog.acroForm; 59859 if (!acroForm) { 59860 return null; 59861 } 59862 const xfa = acroForm.get("XFA"); 59863 const entries = { 59864 "xdp:xdp": "", 59865 template: "", 59866 datasets: "", 59867 config: "", 59868 connectionSet: "", 59869 localeSet: "", 59870 stylesheet: "", 59871 "/xdp:xdp": "" 59872 }; 59873 if (xfa instanceof BaseStream && !xfa.isEmpty) { 59874 entries["xdp:xdp"] = xfa; 59875 return entries; 59876 } 59877 if (!Array.isArray(xfa) || xfa.length === 0) { 59878 return null; 59879 } 59880 for (let i = 0, ii = xfa.length; i < ii; i += 2) { 59881 let name; 59882 if (i === 0) { 59883 name = "xdp:xdp"; 59884 } else if (i === ii - 2) { 59885 name = "/xdp:xdp"; 59886 } else { 59887 name = xfa[i]; 59888 } 59889 if (!entries.hasOwnProperty(name)) { 59890 continue; 59891 } 59892 const data = this.xref.fetchIfRef(xfa[i + 1]); 59893 if (!(data instanceof BaseStream) || data.isEmpty) { 59894 continue; 59895 } 59896 entries[name] = data; 59897 } 59898 return entries; 59899 } 59900 get xfaDatasets() { 59901 const streams = this._xfaStreams; 59902 if (!streams) { 59903 return shadow(this, "xfaDatasets", null); 59904 } 59905 for (const key of ["datasets", "xdp:xdp"]) { 59906 const stream = streams[key]; 59907 if (!stream) { 59908 continue; 59909 } 59910 try { 59911 const str = stringToUTF8String(stream.getString()); 59912 const data = { 59913 [key]: str 59914 }; 59915 return shadow(this, "xfaDatasets", new DatasetReader(data)); 59916 } catch { 59917 warn("XFA - Invalid utf-8 string."); 59918 break; 59919 } 59920 } 59921 return shadow(this, "xfaDatasets", null); 59922 } 59923 get xfaData() { 59924 const streams = this._xfaStreams; 59925 if (!streams) { 59926 return null; 59927 } 59928 const data = Object.create(null); 59929 for (const [key, stream] of Object.entries(streams)) { 59930 if (!stream) { 59931 continue; 59932 } 59933 try { 59934 data[key] = stringToUTF8String(stream.getString()); 59935 } catch { 59936 warn("XFA - Invalid utf-8 string."); 59937 return null; 59938 } 59939 } 59940 return data; 59941 } 59942 get xfaFactory() { 59943 let data; 59944 if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) { 59945 data = this.xfaData; 59946 } 59947 return shadow(this, "xfaFactory", data ? new XFAFactory(data) : null); 59948 } 59949 get isPureXfa() { 59950 return this.xfaFactory ? this.xfaFactory.isValid() : false;
59951 } 59952 get htmlForXfa() { 59953 return this.xfaFactory ? this.xfaFactory.getPages() : null; 59954 } 59955 async loadXfaImages() { 59956 const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages"); 59957 if (!xfaImagesDict) { 59958 return; 59959 } 59960 const keys = xfaImagesDict.getKeys(); 59961 const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref); 59962 await objectLoader.load(); 59963 const xfaImages = new Map(); 59964 for (const key of keys) { 59965 const stream = xfaImagesDict.get(key); 59966 if (stream instanceof BaseStream) { 59967 xfaImages.set(key, stream.getBytes()); 59968 } 59969 } 59970 this.xfaFactory.setImages(xfaImages); 59971 } 59972 async loadXfaFonts(handler, task) { 59973 const acroForm = await this.pdfManager.ensureCatalog("acroForm"); 59974 if (!acroForm) { 59975 return; 59976 } 59977 const resources = await acroForm.getAsync("DR"); 59978 if (!(resources instanceof Dict)) { 59979 return; 59980 } 59981 const objectLoader = new ObjectLoader(resources, ["Font"], this.xref); 59982 await objectLoader.load(); 59983 const fontRes = resources.get("Font"); 59984 if (!(fontRes instanceof Dict)) { 59985 return; 59986 } 59987 const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions); 59988 options.useSystemFonts = false; 59989 const partialEvaluator = new PartialEvaluator({ 59990 xref: this.xref, 59991 handler, 59992 pageIndex: -1, 59993 idFactory: this._globalIdFactory, 59994 fontCache: this.catalog.fontCache, 59995 builtInCMapCache: this.catalog.builtInCMapCache, 59996 standardFontDataCache: this.catalog.standardFontDataCache, 59997 options 59998 }); 59999 const operatorList = new OperatorList(); 60000 const pdfFonts = []; 60001 const initialState = { 60002 get font() { 60003 return pdfFonts.at(-1); 60004 }, 60005 set font(font) { 60006 pdfFonts.push(font); 60007 }, 60008 clone() { 60009 return this; 60010 } 60011 }; 60012 const promises = []; 60013 for (const [fontName, font] of fontRes) { 60014 const descriptor = font.get("FontDescriptor"); 60015 if (!(descriptor instanceof Dict)) { 60016 continue; 60017 } 60018 let fontFamily = descriptor.get("FontFamily"); 60019 fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1"); 60020 const fontWeight = descriptor.get("FontWeight"); 60021 const italicAngle = -descriptor.get("ItalicAngle"); 60022 const cssFontInfo = { 60023 fontFamily, 60024 fontWeight, 60025 italicAngle 60026 }; 60027 if (!validateCSSFont(cssFontInfo)) { 60028 continue; 60029 } 60030 promises.push(partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, null, cssFontInfo).catch(function (reason) { 60031 warn(`loadXfaFonts: "${reason}".`); 60032 return null; 60033 })); 60034 } 60035 await Promise.all(promises); 60036 const missingFonts = this.xfaFactory.setFonts(pdfFonts); 60037 if (!missingFonts) { 60038 return; 60039 } 60040 options.ignoreErrors = true; 60041 promises.length = 0; 60042 pdfFonts.length = 0; 60043 const reallyMissingFonts = new Set(); 60044 for (const missing of missingFonts) { 60045 if (!getXfaFontName(`${missing}-Regular`)) { 60046 reallyMissingFonts.add(missing); 60047 } 60048 } 60049 if (reallyMissingFonts.size) { 60050 missingFonts.push("PdfJS-Fallback"); 60051 } 60052 for (const missing of missingFonts) { 60053 if (reallyMissingFonts.has(missing)) { 60054 continue; 60055 } 60056 for (const fontInfo of [{ 60057 name: "Regular", 60058 fontWeight: 400, 60059 italicAngle: 0 60060 }, { 60061 name: "Bold", 60062 fontWeight: 700, 60063 italicAngle: 0 60064 }, { 60065 name: "Italic", 60066 fontWeight: 400, 60067 italicAngle: 12 60068 }, { 60069 name: "BoldItalic", 60070 fontWeight: 700, 60071 italicAngle: 12 60072 }]) { 60073 const name = `${missing}-${fontInfo.name}`; 60074 const dict = getXfaFontDict(name); 60075 promises.push(partialEvaluator.handleSetFont(resources, [Name.get(name), 1], null, operatorList, task, initialState, dict, { 60076 fontFamily: missing, 60077 fontWeight: fontInfo.fontWeight, 60078 italicAngle: fontInfo.italicAngle 60079 }).catch(function (reason) { 60080 warn(`loadXfaFonts: "${reason}".`); 60081 return null; 60082 })); 60083 } 60084 } 60085 await Promise.all(promises); 60086 this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); 60087 } 60088 async serializeXfaData(annotationStorage) { 60089 return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null; 60090 } 60091 get version() {
60092 return this.catalog.version || this._version; 60093 } 60094 get formInfo() { 60095 const formInfo = { 60096 hasFields: false, 60097 hasAcroForm: false, 60098 hasXfa: false, 60099 hasSignatures: false 60100 }; 60101 const acroForm = this.catalog.acroForm; 60102 if (!acroForm) { 60103 return shadow(this, "formInfo", formInfo); 60104 } 60105 try { 60106 const fields = acroForm.get("Fields"); 60107 const hasFields = Array.isArray(fields) && fields.length > 0; 60108 formInfo.hasFields = hasFields; 60109 const xfa = acroForm.get("XFA"); 60110 formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof BaseStream && !xfa.isEmpty; 60111 const sigFlags = acroForm.get("SigFlags"); 60112 const hasSignatures = !!(sigFlags & 0x1); 60113 const hasOnlyDocumentSignatures = hasSignatures && this._hasOnlyDocumentSignatures(fields); 60114 formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; 60115 formInfo.hasSignatures = hasSignatures; 60116 } catch (ex) { 60117 if (ex instanceof MissingDataException) { 60118 throw ex; 60119 } 60120 warn(`Cannot fetch form information: "${ex}".`); 60121 } 60122 return shadow(this, "formInfo", formInfo); 60123 } 60124 get documentInfo() { 60125 const docInfo = { 60126 PDFFormatVersion: this.version, 60127 Language: this.catalog.lang, 60128 EncryptFilterName: this.xref.encrypt ? this.xref.encrypt.filterName : null, 60129 IsLinearized: !!this.linearization, 60130 IsAcroFormPresent: this.formInfo.hasAcroForm, 60131 IsXFAPresent: this.formInfo.hasXfa, 60132 IsCollectionPresent: !!this.catalog.collection, 60133 IsSignaturesPresent: this.formInfo.hasSignatures 60134 }; 60135 let infoDict; 60136 try { 60137 infoDict = this.xref.trailer.get("Info"); 60138 } catch (err) { 60139 if (err instanceof MissingDataException) { 60140 throw err; 60141 }
vendor: 56,017 bytes, lines 60142-62136
60142 info("The document information dictionary is invalid."); 60143 } 60144 if (!(infoDict instanceof Dict)) { 60145 return shadow(this, "documentInfo", docInfo); 60146 } 60147 for (const key of infoDict.getKeys()) { 60148 const value = infoDict.get(key); 60149 switch (key) { 60150 case "Title": 60151 case "Author": 60152 case "Subject": 60153 case "Keywords": 60154 case "Creator": 60155 case "Producer": 60156 case "CreationDate": 60157 case "ModDate": 60158 if (typeof value === "string") { 60159 docInfo[key] = stringToPDFString(value); 60160 continue; 60161 } 60162 break; 60163 case "Trapped": 60164 if (value instanceof Name) { 60165 docInfo[key] = value; 60166 continue; 60167 } 60168 break; 60169 default: 60170 let customValue; 60171 switch (typeof value) { 60172 case "string": 60173 customValue = stringToPDFString(value); 60174 break; 60175 case "number": 60176 case "boolean": 60177 customValue = value; 60178 break; 60179 default: 60180 if (value instanceof Name) { 60181 customValue = value; 60182 } 60183 break; 60184 } 60185 if (customValue === undefined) { 60186 warn(`Bad value, for custom key "${key}", in Info: ${value}.`); 60187 continue; 60188 } 60189 if (!docInfo.Custom) { 60190 docInfo.Custom = Object.create(null); 60191 } 60192 docInfo.Custom[key] = customValue; 60193 continue; 60194 } 60195 warn(`Bad value, for key "${key}", in Info: ${value}.`); 60196 } 60197 return shadow(this, "documentInfo", docInfo); 60198 } 60199 get fingerprints() { 60200 const FINGERPRINT_FIRST_BYTES = 1024; 60201 const EMPTY_FINGERPRINT = "\x00".repeat(16); 60202 function validate(data) { 60203 return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT; 60204 } 60205 const id = this.xref.trailer.get("ID"); 60206 let hashOriginal, hashModified; 60207 if (Array.isArray(id) && validate(id[0])) { 60208 hashOriginal = stringToBytes(id[0]); 60209 if (id[1] !== id[0] && validate(id[1])) { 60210 hashModified = stringToBytes(id[1]); 60211 } 60212 } else { 60213 hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); 60214 } 60215 return shadow(this, "fingerprints", [toHexUtil(hashOriginal), hashModified ? toHexUtil(hashModified) : null]); 60216 } 60217 async _getLinearizationPage(pageIndex) { 60218 const { 60219 catalog, 60220 linearization, 60221 xref 60222 } = this; 60223 const ref = Ref.get(linearization.objectNumberFirst, 0); 60224 try { 60225 const obj = await xref.fetchAsync(ref); 60226 if (obj instanceof Dict) { 60227 let type = obj.getRaw("Type"); 60228 if (type instanceof Ref) { 60229 type = await xref.fetchAsync(type); 60230 } 60231 if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) { 60232 if (!catalog.pageKidsCountCache.has(ref)) { 60233 catalog.pageKidsCountCache.put(ref, 1); 60234 } 60235 if (!catalog.pageIndexCache.has(ref)) { 60236 catalog.pageIndexCache.put(ref, 0); 60237 } 60238 return [obj, ref]; 60239 } 60240 } 60241 throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary."); 60242 } catch (reason) { 60243 warn(`_getLinearizationPage: "${reason.message}".`); 60244 return catalog.getPageDict(pageIndex); 60245 } 60246 } 60247 getPage(pageIndex) { 60248 const cachedPromise = this._pagePromises.get(pageIndex); 60249 if (cachedPromise) { 60250 return cachedPromise; 60251 } 60252 const { 60253 catalog, 60254 linearization, 60255 xfaFactory 60256 } = this; 60257 let promise; 60258 if (xfaFactory) { 60259 promise = Promise.resolve([Dict.empty, null]); 60260 } else if (linearization?.pageFirst === pageIndex) { 60261 promise = this._getLinearizationPage(pageIndex); 60262 } else { 60263 promise = catalog.getPageDict(pageIndex); 60264 } 60265 promise = promise.then(([pageDict, ref]) => { 60266 return new Page({ 60267 pdfManager: this.pdfManager, 60268 xref: this.xref, 60269 pageIndex, 60270 pageDict, 60271 ref, 60272 globalIdFactory: this._globalIdFactory, 60273 fontCache: catalog.fontCache, 60274 builtInCMapCache: catalog.builtInCMapCache, 60275 standardFontDataCache: catalog.standardFontDataCache, 60276 globalImageCache: catalog.globalImageCache, 60277 systemFontCache: catalog.systemFontCache, 60278 nonBlendModesSet: catalog.nonBlendModesSet, 60279 xfaFactory 60280 }); 60281 }); 60282 this._pagePromises.set(pageIndex, promise); 60283 return promise; 60284 } 60285 async checkFirstPage(recoveryMode = false) { 60286 if (recoveryMode) { 60287 return; 60288 } 60289 try { 60290 await this.getPage(0); 60291 } catch (reason) { 60292 if (reason instanceof XRefEntryException) { 60293 this._pagePromises.delete(0); 60294 await this.cleanup(); 60295 throw new XRefParseException(); 60296 } 60297 } 60298 } 60299 async checkLastPage(recoveryMode = false) { 60300 const { 60301 catalog, 60302 pdfManager 60303 } = this; 60304 catalog.setActualNumPages(); 60305 let numPages; 60306 try { 60307 await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]); 60308 if (this.xfaFactory) { 60309 return; 60310 } else if (this.linearization) { 60311 numPages = this.linearization.numPages; 60312 } else { 60313 numPages = catalog.numPages; 60314 } 60315 if (!Number.isInteger(numPages)) { 60316 throw new FormatError("Page count is not an integer."); 60317 } else if (numPages <= 1) { 60318 return; 60319 } 60320 await this.getPage(numPages - 1); 60321 } catch (reason) { 60322 this._pagePromises.delete(numPages - 1); 60323 await this.cleanup(); 60324 if (reason instanceof XRefEntryException && !recoveryMode) { 60325 throw new XRefParseException(); 60326 } 60327 warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`); 60328 let pagesTree; 60329 try { 60330 pagesTree = await catalog.getAllPageDicts(recoveryMode); 60331 } catch (reasonAll) { 60332 if (reasonAll instanceof XRefEntryException && !recoveryMode) { 60333 throw new XRefParseException(); 60334 } 60335 catalog.setActualNumPages(1); 60336 return; 60337 } 60338 for (const [pageIndex, [pageDict, ref]] of pagesTree) { 60339 let promise; 60340 if (pageDict instanceof Error) { 60341 promise = Promise.reject(pageDict); 60342 promise.catch(() => {}); 60343 } else { 60344 promise = Promise.resolve(new Page({ 60345 pdfManager, 60346 xref: this.xref, 60347 pageIndex, 60348 pageDict, 60349 ref, 60350 globalIdFactory: this._globalIdFactory, 60351 fontCache: catalog.fontCache, 60352 builtInCMapCache: catalog.builtInCMapCache, 60353 standardFontDataCache: catalog.standardFontDataCache, 60354 globalImageCache: catalog.globalImageCache, 60355 systemFontCache: catalog.systemFontCache, 60356 nonBlendModesSet: catalog.nonBlendModesSet, 60357 xfaFactory: null 60358 })); 60359 } 60360 this._pagePromises.set(pageIndex, promise); 60361 } 60362 catalog.setActualNumPages(pagesTree.size); 60363 } 60364 } 60365 fontFallback(id, handler) { 60366 return this.catalog.fontFallback(id, handler); 60367 } 60368 async cleanup(manuallyTriggered = false) { 60369 return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches(); 60370 } 60371 async #collectFieldObjects(name, parentRef, fieldRef, promises, annotationGlobals, visitedRefs, orphanFields) { 60372 const { 60373 xref 60374 } = this; 60375 if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) { 60376 return; 60377 } 60378 visitedRefs.put(fieldRef); 60379 const field = await xref.fetchAsync(fieldRef); 60380 if (!(field instanceof Dict)) { 60381 return; 60382 } 60383 if (field.has("T")) { 60384 const partName = stringToPDFString(await field.getAsync("T")); 60385 name = name === "" ? partName : `${name}.${partName}`; 60386 } else { 60387 let obj = field; 60388 while (true) { 60389 obj = obj.getRaw("Parent") || parentRef; 60390 if (obj instanceof Ref) { 60391 if (visitedRefs.has(obj)) { 60392 break; 60393 } 60394 obj = await xref.fetchAsync(obj); 60395 } 60396 if (!(obj instanceof Dict)) { 60397 break; 60398 } 60399 if (obj.has("T")) { 60400 const partName = stringToPDFString(await obj.getAsync("T")); 60401 name = name === "" ? partName : `${name}.${partName}`; 60402 break; 60403 } 60404 } 60405 } 60406 if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) { 60407 orphanFields.put(fieldRef, parentRef); 60408 } 60409 if (!promises.has(name)) { 60410 promises.set(name, []); 60411 } 60412 promises.get(name).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) { 60413 warn(`#collectFieldObjects: "${reason}".`); 60414 return null; 60415 })); 60416 if (!field.has("Kids")) { 60417 return; 60418 } 60419 const kids = await field.getAsync("Kids"); 60420 if (Array.isArray(kids)) { 60421 for (const kid of kids) { 60422 await this.#collectFieldObjects(name, fieldRef, kid, promises, annotationGlobals, visitedRefs, orphanFields); 60423 } 60424 } 60425 } 60426 get fieldObjects() { 60427 const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => { 60428 if (!formInfo.hasFields) { 60429 return null; 60430 } 60431 const [annotationGlobals, acroForm] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureCatalog("acroForm")]); 60432 if (!annotationGlobals) { 60433 return null; 60434 } 60435 const visitedRefs = new RefSet(); 60436 const allFields = Object.create(null); 60437 const fieldPromises = new Map(); 60438 const orphanFields = new RefSetCache(); 60439 for (const fieldRef of await acroForm.getAsync("Fields")) { 60440 await this.#collectFieldObjects("", null, fieldRef, fieldPromises, annotationGlobals, visitedRefs, orphanFields); 60441 } 60442 const allPromises = []; 60443 for (const [name, promises] of fieldPromises) { 60444 allPromises.push(Promise.all(promises).then(fields => { 60445 fields = fields.filter(field => !!field); 60446 if (fields.length > 0) { 60447 allFields[name] = fields; 60448 } 60449 })); 60450 } 60451 await Promise.all(allPromises); 60452 return { 60453 allFields, 60454 orphanFields 60455 }; 60456 }); 60457 return shadow(this, "fieldObjects", promise); 60458 } 60459 get hasJSActions() { 60460 const promise = this.pdfManager.ensureDoc("_parseHasJSActions"); 60461 return shadow(this, "hasJSActions", promise); 60462 } 60463 async _parseHasJSActions() { 60464 const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]); 60465 if (catalogJsActions) { 60466 return true; 60467 } 60468 if (fieldObjects) { 60469 return Object.values(fieldObjects.allFields).some(fieldObject => fieldObject.some(object => object.actions !== null)); 60470 } 60471 return false; 60472 } 60473 get calculationOrderIds() { 60474 const calculationOrder = this.catalog.acroForm?.get("CO"); 60475 if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { 60476 return shadow(this, "calculationOrderIds", null); 60477 } 60478 const ids = []; 60479 for (const id of calculationOrder) { 60480 if (id instanceof Ref) { 60481 ids.push(id.toString()); 60482 } 60483 } 60484 return shadow(this, "calculationOrderIds", ids.length ? ids : null); 60485 } 60486 get annotationGlobals() { 60487 return shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager)); 60488 } 60489} 60490 60491;// ./src/core/pdf_manager.js 60492 60493 60494 60495 60496 60497function parseDocBaseUrl(url) { 60498 if (url) { 60499 const absoluteUrl = createValidAbsoluteUrl(url); 60500 if (absoluteUrl) { 60501 return absoluteUrl.href; 60502 } 60503 warn(`Invalid absolute docBaseUrl: "${url}".`); 60504 } 60505 return null; 60506} 60507class BasePdfManager { 60508 constructor(args) { 60509 this._docBaseUrl = parseDocBaseUrl(args.docBaseUrl); 60510 this._docId = args.docId; 60511 this._password = args.password; 60512 this.enableXfa = args.enableXfa; 60513 args.evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; 60514 args.evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported; 60515 this.evaluatorOptions = Object.freeze(args.evaluatorOptions); 60516 } 60517 get docId() { 60518 return this._docId; 60519 } 60520 get password() { 60521 return this._password; 60522 } 60523 get docBaseUrl() { 60524 return this._docBaseUrl; 60525 } 60526 get catalog() { 60527 return this.pdfDocument.catalog; 60528 } 60529 ensureDoc(prop, args) { 60530 return this.ensure(this.pdfDocument, prop, args); 60531 } 60532 ensureXRef(prop, args) { 60533 return this.ensure(this.pdfDocument.xref, prop, args); 60534 } 60535 ensureCatalog(prop, args) { 60536 return this.ensure(this.pdfDocument.catalog, prop, args); 60537 } 60538 getPage(pageIndex) { 60539 return this.pdfDocument.getPage(pageIndex); 60540 } 60541 fontFallback(id, handler) { 60542 return this.pdfDocument.fontFallback(id, handler); 60543 } 60544 loadXfaFonts(handler, task) { 60545 return this.pdfDocument.loadXfaFonts(handler, task); 60546 } 60547 loadXfaImages() { 60548 return this.pdfDocument.loadXfaImages(); 60549 } 60550 serializeXfaData(annotationStorage) { 60551 return this.pdfDocument.serializeXfaData(annotationStorage); 60552 } 60553 cleanup(manuallyTriggered = false) { 60554 return this.pdfDocument.cleanup(manuallyTriggered); 60555 } 60556 async ensure(obj, prop, args) { 60557 unreachable("Abstract method `ensure` called"); 60558 } 60559 requestRange(begin, end) { 60560 unreachable("Abstract method `requestRange` called"); 60561 } 60562 requestLoadedStream(noFetch = false) { 60563 unreachable("Abstract method `requestLoadedStream` called"); 60564 } 60565 sendProgressiveData(chunk) { 60566 unreachable("Abstract method `sendProgressiveData` called"); 60567 } 60568 updatePassword(password) { 60569 this._password = password; 60570 } 60571 terminate(reason) { 60572 unreachable("Abstract method `terminate` called"); 60573 } 60574} 60575class LocalPdfManager extends BasePdfManager { 60576 constructor(args) { 60577 super(args); 60578 const stream = new Stream(args.source); 60579 this.pdfDocument = new PDFDocument(this, stream); 60580 this._loadedStreamPromise = Promise.resolve(stream); 60581 } 60582 async ensure(obj, prop, args) { 60583 const value = obj[prop]; 60584 if (typeof value === "function") { 60585 return value.apply(obj, args); 60586 } 60587 return value; 60588 } 60589 requestRange(begin, end) { 60590 return Promise.resolve(); 60591 } 60592 requestLoadedStream(noFetch = false) { 60593 return this._loadedStreamPromise; 60594 } 60595 terminate(reason) {} 60596} 60597class NetworkPdfManager extends BasePdfManager { 60598 constructor(args) { 60599 super(args); 60600 this.streamManager = new ChunkedStreamManager(args.source, { 60601 msgHandler: args.handler, 60602 length: args.length, 60603 disableAutoFetch: args.disableAutoFetch, 60604 rangeChunkSize: args.rangeChunkSize 60605 }); 60606 this.pdfDocument = new PDFDocument(this, this.streamManager.getStream()); 60607 } 60608 async ensure(obj, prop, args) { 60609 try { 60610 const value = obj[prop]; 60611 if (typeof value === "function") { 60612 return value.apply(obj, args); 60613 } 60614 return value; 60615 } catch (ex) { 60616 if (!(ex instanceof MissingDataException)) { 60617 throw ex; 60618 } 60619 await this.requestRange(ex.begin, ex.end); 60620 return this.ensure(obj, prop, args); 60621 } 60622 } 60623 requestRange(begin, end) { 60624 return this.streamManager.requestRange(begin, end); 60625 } 60626 requestLoadedStream(noFetch = false) { 60627 return this.streamManager.requestAllChunks(noFetch); 60628 } 60629 sendProgressiveData(chunk) { 60630 this.streamManager.onReceiveData({ 60631 chunk 60632 }); 60633 } 60634 terminate(reason) { 60635 this.streamManager.abort(reason); 60636 } 60637} 60638 60639;// ./src/shared/message_handler.js 60640 60641 60642 60643const CallbackKind = { 60644 DATA: 1, 60645 ERROR: 2 60646}; 60647const StreamKind = { 60648 CANCEL: 1, 60649 CANCEL_COMPLETE: 2, 60650 CLOSE: 3, 60651 ENQUEUE: 4, 60652 ERROR: 5, 60653 PULL: 6, 60654 PULL_COMPLETE: 7, 60655 START_COMPLETE: 8 60656}; 60657function onFn() {} 60658function wrapReason(ex) { 60659 if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof MissingPDFException || ex instanceof PasswordException || ex instanceof UnexpectedResponseException || ex instanceof UnknownErrorException) { 60660 return ex; 60661 } 60662 if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { 60663 unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); 60664 } 60665 switch (ex.name) { 60666 case "AbortException": 60667 return new AbortException(ex.message); 60668 case "InvalidPDFException": 60669 return new InvalidPDFException(ex.message); 60670 case "MissingPDFException": 60671 return new MissingPDFException(ex.message); 60672 case "PasswordException": 60673 return new PasswordException(ex.message, ex.code); 60674 case "UnexpectedResponseException": 60675 return new UnexpectedResponseException(ex.message, ex.status); 60676 case "UnknownErrorException": 60677 return new UnknownErrorException(ex.message, ex.details); 60678 } 60679 return new UnknownErrorException(ex.message, ex.toString()); 60680} 60681class MessageHandler { 60682 #messageAC = new AbortController(); 60683 constructor(sourceName, targetName, comObj) { 60684 this.sourceName = sourceName; 60685 this.targetName = targetName; 60686 this.comObj = comObj; 60687 this.callbackId = 1; 60688 this.streamId = 1; 60689 this.streamSinks = Object.create(null); 60690 this.streamControllers = Object.create(null); 60691 this.callbackCapabilities = Object.create(null); 60692 this.actionHandler = Object.create(null); 60693 comObj.addEventListener("message", this.#onMessage.bind(this), { 60694 signal: this.#messageAC.signal 60695 }); 60696 } 60697 #onMessage({ 60698 data 60699 }) { 60700 if (data.targetName !== this.sourceName) { 60701 return; 60702 } 60703 if (data.stream) { 60704 this.#processStreamMessage(data); 60705 return; 60706 } 60707 if (data.callback) { 60708 const callbackId = data.callbackId; 60709 const capability = this.callbackCapabilities[callbackId]; 60710 if (!capability) { 60711 throw new Error(`Cannot resolve callback ${callbackId}`); 60712 } 60713 delete this.callbackCapabilities[callbackId]; 60714 if (data.callback === CallbackKind.DATA) { 60715 capability.resolve(data.data); 60716 } else if (data.callback === CallbackKind.ERROR) { 60717 capability.reject(wrapReason(data.reason)); 60718 } else { 60719 throw new Error("Unexpected callback case"); 60720 } 60721 return; 60722 } 60723 const action = this.actionHandler[data.action]; 60724 if (!action) { 60725 throw new Error(`Unknown action from worker: ${data.action}`); 60726 } 60727 if (data.callbackId) { 60728 const sourceName = this.sourceName, 60729 targetName = data.sourceName, 60730 comObj = this.comObj; 60731 Promise.try(action, data.data).then(function (result) { 60732 comObj.postMessage({ 60733 sourceName, 60734 targetName, 60735 callback: CallbackKind.DATA, 60736 callbackId: data.callbackId, 60737 data: result 60738 }); 60739 }, function (reason) { 60740 comObj.postMessage({ 60741 sourceName, 60742 targetName, 60743 callback: CallbackKind.ERROR, 60744 callbackId: data.callbackId, 60745 reason: wrapReason(reason) 60746 }); 60747 }); 60748 return; 60749 } 60750 if (data.streamId) { 60751 this.#createStreamSink(data); 60752 return; 60753 } 60754 action(data.data); 60755 } 60756 on(actionName, handler) { 60757 const ah = this.actionHandler; 60758 if (ah[actionName]) { 60759 throw new Error(`There is already an actionName called "${actionName}"`); 60760 } 60761 ah[actionName] = handler; 60762 } 60763 send(actionName, data, transfers) { 60764 this.comObj.postMessage({ 60765 sourceName: this.sourceName, 60766 targetName: this.targetName, 60767 action: actionName, 60768 data 60769 }, transfers); 60770 } 60771 sendWithPromise(actionName, data, transfers) { 60772 const callbackId = this.callbackId++; 60773 const capability = Promise.withResolvers(); 60774 this.callbackCapabilities[callbackId] = capability; 60775 try { 60776 this.comObj.postMessage({ 60777 sourceName: this.sourceName, 60778 targetName: this.targetName, 60779 action: actionName, 60780 callbackId, 60781 data 60782 }, transfers); 60783 } catch (ex) { 60784 capability.reject(ex); 60785 } 60786 return capability.promise; 60787 } 60788 sendWithStream(actionName, data, queueingStrategy, transfers) { 60789 const streamId = this.streamId++, 60790 sourceName = this.sourceName, 60791 targetName = this.targetName, 60792 comObj = this.comObj; 60793 return new ReadableStream({ 60794 start: controller => { 60795 const startCapability = Promise.withResolvers(); 60796 this.streamControllers[streamId] = { 60797 controller, 60798 startCall: startCapability, 60799 pullCall: null, 60800 cancelCall: null, 60801 isClosed: false 60802 }; 60803 comObj.postMessage({ 60804 sourceName, 60805 targetName, 60806 action: actionName, 60807 streamId, 60808 data, 60809 desiredSize: controller.desiredSize 60810 }, transfers); 60811 return startCapability.promise; 60812 }, 60813 pull: controller => { 60814 const pullCapability = Promise.withResolvers(); 60815 this.streamControllers[streamId].pullCall = pullCapability; 60816 comObj.postMessage({ 60817 sourceName, 60818 targetName, 60819 stream: StreamKind.PULL, 60820 streamId, 60821 desiredSize: controller.desiredSize 60822 }); 60823 return pullCapability.promise; 60824 }, 60825 cancel: reason => { 60826 assert(reason instanceof Error, "cancel must have a valid reason"); 60827 const cancelCapability = Promise.withResolvers(); 60828 this.streamControllers[streamId].cancelCall = cancelCapability; 60829 this.streamControllers[streamId].isClosed = true; 60830 comObj.postMessage({ 60831 sourceName, 60832 targetName, 60833 stream: StreamKind.CANCEL, 60834 streamId, 60835 reason: wrapReason(reason) 60836 }); 60837 return cancelCapability.promise; 60838 } 60839 }, queueingStrategy); 60840 } 60841 #createStreamSink(data) { 60842 const streamId = data.streamId, 60843 sourceName = this.sourceName, 60844 targetName = data.sourceName, 60845 comObj = this.comObj; 60846 const self = this, 60847 action = this.actionHandler[data.action]; 60848 const streamSink = { 60849 enqueue(chunk, size = 1, transfers) { 60850 if (this.isCancelled) { 60851 return; 60852 } 60853 const lastDesiredSize = this.desiredSize; 60854 this.desiredSize -= size; 60855 if (lastDesiredSize > 0 && this.desiredSize <= 0) { 60856 this.sinkCapability = Promise.withResolvers(); 60857 this.ready = this.sinkCapability.promise; 60858 } 60859 comObj.postMessage({ 60860 sourceName, 60861 targetName, 60862 stream: StreamKind.ENQUEUE, 60863 streamId, 60864 chunk 60865 }, transfers); 60866 }, 60867 close() { 60868 if (this.isCancelled) { 60869 return; 60870 } 60871 this.isCancelled = true; 60872 comObj.postMessage({ 60873 sourceName, 60874 targetName, 60875 stream: StreamKind.CLOSE, 60876 streamId 60877 }); 60878 delete self.streamSinks[streamId]; 60879 }, 60880 error(reason) { 60881 assert(reason instanceof Error, "error must have a valid reason"); 60882 if (this.isCancelled) { 60883 return; 60884 } 60885 this.isCancelled = true; 60886 comObj.postMessage({ 60887 sourceName, 60888 targetName, 60889 stream: StreamKind.ERROR, 60890 streamId, 60891 reason: wrapReason(reason) 60892 }); 60893 }, 60894 sinkCapability: Promise.withResolvers(), 60895 onPull: null, 60896 onCancel: null, 60897 isCancelled: false, 60898 desiredSize: data.desiredSize, 60899 ready: null 60900 }; 60901 streamSink.sinkCapability.resolve(); 60902 streamSink.ready = streamSink.sinkCapability.promise; 60903 this.streamSinks[streamId] = streamSink; 60904 Promise.try(action, data.data, streamSink).then(function () { 60905 comObj.postMessage({ 60906 sourceName, 60907 targetName, 60908 stream: StreamKind.START_COMPLETE, 60909 streamId, 60910 success: true 60911 }); 60912 }, function (reason) { 60913 comObj.postMessage({ 60914 sourceName, 60915 targetName, 60916 stream: StreamKind.START_COMPLETE, 60917 streamId, 60918 reason: wrapReason(reason) 60919 }); 60920 }); 60921 } 60922 #processStreamMessage(data) { 60923 const streamId = data.streamId, 60924 sourceName = this.sourceName, 60925 targetName = data.sourceName, 60926 comObj = this.comObj; 60927 const streamController = this.streamControllers[streamId], 60928 streamSink = this.streamSinks[streamId]; 60929 switch (data.stream) { 60930 case StreamKind.START_COMPLETE: 60931 if (data.success) { 60932 streamController.startCall.resolve(); 60933 } else { 60934 streamController.startCall.reject(wrapReason(data.reason)); 60935 } 60936 break; 60937 case StreamKind.PULL_COMPLETE: 60938 if (data.success) { 60939 streamController.pullCall.resolve(); 60940 } else { 60941 streamController.pullCall.reject(wrapReason(data.reason)); 60942 } 60943 break; 60944 case StreamKind.PULL: 60945 if (!streamSink) { 60946 comObj.postMessage({ 60947 sourceName, 60948 targetName, 60949 stream: StreamKind.PULL_COMPLETE, 60950 streamId, 60951 success: true 60952 }); 60953 break; 60954 } 60955 if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { 60956 streamSink.sinkCapability.resolve(); 60957 } 60958 streamSink.desiredSize = data.desiredSize; 60959 Promise.try(streamSink.onPull || onFn).then(function () { 60960 comObj.postMessage({ 60961 sourceName, 60962 targetName, 60963 stream: StreamKind.PULL_COMPLETE, 60964 streamId, 60965 success: true 60966 }); 60967 }, function (reason) { 60968 comObj.postMessage({ 60969 sourceName, 60970 targetName, 60971 stream: StreamKind.PULL_COMPLETE, 60972 streamId, 60973 reason: wrapReason(reason) 60974 }); 60975 }); 60976 break; 60977 case StreamKind.ENQUEUE: 60978 assert(streamController, "enqueue should have stream controller"); 60979 if (streamController.isClosed) { 60980 break; 60981 } 60982 streamController.controller.enqueue(data.chunk); 60983 break; 60984 case StreamKind.CLOSE: 60985 assert(streamController, "close should have stream controller"); 60986 if (streamController.isClosed) { 60987 break; 60988 } 60989 streamController.isClosed = true; 60990 streamController.controller.close(); 60991 this.#deleteStreamController(streamController, streamId); 60992 break; 60993 case StreamKind.ERROR: 60994 assert(streamController, "error should have stream controller"); 60995 streamController.controller.error(wrapReason(data.reason)); 60996 this.#deleteStreamController(streamController, streamId); 60997 break; 60998 case StreamKind.CANCEL_COMPLETE: 60999 if (data.success) { 61000 streamController.cancelCall.resolve(); 61001 } else { 61002 streamController.cancelCall.reject(wrapReason(data.reason)); 61003 } 61004 this.#deleteStreamController(streamController, streamId); 61005 break; 61006 case StreamKind.CANCEL: 61007 if (!streamSink) { 61008 break; 61009 } 61010 const dataReason = wrapReason(data.reason); 61011 Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { 61012 comObj.postMessage({ 61013 sourceName, 61014 targetName, 61015 stream: StreamKind.CANCEL_COMPLETE, 61016 streamId, 61017 success: true 61018 }); 61019 }, function (reason) { 61020 comObj.postMessage({ 61021 sourceName, 61022 targetName, 61023 stream: StreamKind.CANCEL_COMPLETE, 61024 streamId, 61025 reason: wrapReason(reason) 61026 }); 61027 }); 61028 streamSink.sinkCapability.reject(dataReason); 61029 streamSink.isCancelled = true; 61030 delete this.streamSinks[streamId]; 61031 break; 61032 default: 61033 throw new Error("Unexpected stream case"); 61034 } 61035 } 61036 async #deleteStreamController(streamController, streamId) { 61037 await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); 61038 delete this.streamControllers[streamId]; 61039 } 61040 destroy() { 61041 this.#messageAC?.abort(); 61042 this.#messageAC = null; 61043 } 61044} 61045 61046;// ./src/core/writer.js 61047 61048 61049 61050 61051 61052 61053 61054 61055 61056 61057 61058 61059 61060 61061 61062 61063 61064async function writeObject(ref, obj, buffer, { 61065 encrypt = null 61066}) { 61067 const transform = encrypt?.createCipherTransform(ref.num, ref.gen); 61068 buffer.push(`${ref.num} ${ref.gen} obj\n`); 61069 if (obj instanceof Dict) { 61070 await writeDict(obj, buffer, transform); 61071 } else if (obj instanceof BaseStream) { 61072 await writeStream(obj, buffer, transform); 61073 } else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { 61074 await writeArray(obj, buffer, transform); 61075 } 61076 buffer.push("\nendobj\n"); 61077} 61078async function writeDict(dict, buffer, transform) { 61079 buffer.push("<<"); 61080 for (const key of dict.getKeys()) { 61081 buffer.push(` /${escapePDFName(key)} `); 61082 await writeValue(dict.getRaw(key), buffer, transform); 61083 } 61084 buffer.push(">>"); 61085} 61086async function writeStream(stream, buffer, transform) { 61087 let bytes = stream.getBytes(); 61088 const { 61089 dict 61090 } = stream; 61091 const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]); 61092 const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter; 61093 const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode"); 61094 const MIN_LENGTH_FOR_COMPRESSING = 256; 61095 if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode) { 61096 try { 61097 const cs = new CompressionStream("deflate"); 61098 const writer = cs.writable.getWriter(); 61099 await writer.ready; 61100 writer.write(bytes).then(async () => { 61101 await writer.ready; 61102 await writer.close(); 61103 }).catch(() => {}); 61104 const buf = await new Response(cs.readable).arrayBuffer(); 61105 bytes = new Uint8Array(buf); 61106 let newFilter, newParams; 61107 if (!filter) { 61108 newFilter = Name.get("FlateDecode"); 61109 } else if (!isFilterZeroFlateDecode) { 61110 newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter]; 61111 if (params) { 61112 newParams = Array.isArray(params) ? [null, ...params] : [null, params]; 61113 } 61114 } 61115 if (newFilter) { 61116 dict.set("Filter", newFilter); 61117 } 61118 if (newParams) { 61119 dict.set("DecodeParms", newParams); 61120 } 61121 } catch (ex) { 61122 info(`writeStream - cannot compress data: "${ex}".`); 61123 } 61124 } 61125 let string = bytesToString(bytes); 61126 if (transform) { 61127 string = transform.encryptString(string); 61128 } 61129 dict.set("Length", string.length); 61130 await writeDict(dict, buffer, transform); 61131 buffer.push(" stream\n", string, "\nendstream"); 61132} 61133async function writeArray(array, buffer, transform) { 61134 buffer.push("["); 61135 let first = true; 61136 for (const val of array) { 61137 if (!first) { 61138 buffer.push(" "); 61139 } else { 61140 first = false; 61141 } 61142 await writeValue(val, buffer, transform); 61143 } 61144 buffer.push("]"); 61145} 61146async function writeValue(value, buffer, transform) { 61147 if (value instanceof Name) { 61148 buffer.push(`/${escapePDFName(value.name)}`); 61149 } else if (value instanceof Ref) { 61150 buffer.push(`${value.num} ${value.gen} R`); 61151 } else if (Array.isArray(value) || ArrayBuffer.isView(value)) { 61152 await writeArray(value, buffer, transform); 61153 } else if (typeof value === "string") { 61154 if (transform) { 61155 value = transform.encryptString(value); 61156 } 61157 buffer.push(`(${escapeString(value)})`); 61158 } else if (typeof value === "number") { 61159 buffer.push(numberToString(value)); 61160 } else if (typeof value === "boolean") { 61161 buffer.push(value.toString()); 61162 } else if (value instanceof Dict) { 61163 await writeDict(value, buffer, transform); 61164 } else if (value instanceof BaseStream) { 61165 await writeStream(value, buffer, transform); 61166 } else if (value === null) { 61167 buffer.push("null"); 61168 } else { 61169 warn(`Unhandled value in writer: ${typeof value}, please file a bug.`); 61170 } 61171} 61172function writeInt(number, size, offset, buffer) { 61173 for (let i = size + offset - 1; i > offset - 1; i--) { 61174 buffer[i] = number & 0xff; 61175 number >>= 8; 61176 } 61177 return offset + size; 61178} 61179function writeString(string, offset, buffer) { 61180 for (let i = 0, len = string.length; i < len; i++) { 61181 buffer[offset + i] = string.charCodeAt(i) & 0xff; 61182 } 61183} 61184function computeMD5(filesize, xrefInfo) { 61185 const time = Math.floor(Date.now() / 1000); 61186 const filename = xrefInfo.filename || ""; 61187 const md5Buffer = [time.toString(), filename, filesize.toString()]; 61188 let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0); 61189 for (const value of Object.values(xrefInfo.info)) { 61190 md5Buffer.push(value); 61191 md5BufferLen += value.length; 61192 } 61193 const array = new Uint8Array(md5BufferLen); 61194 let offset = 0; 61195 for (const str of md5Buffer) { 61196 writeString(str, offset, array); 61197 offset += str.length; 61198 } 61199 return bytesToString(calculateMD5(array)); 61200} 61201function writeXFADataForAcroform(str, changes) { 61202 const xml = new SimpleXMLParser({ 61203 hasAttributes: true 61204 }).parseFromString(str); 61205 for (const { 61206 xfa 61207 } of changes) { 61208 if (!xfa) { 61209 continue; 61210 } 61211 const { 61212 path, 61213 value 61214 } = xfa; 61215 if (!path) { 61216 continue; 61217 } 61218 const nodePath = parseXFAPath(path); 61219 let node = xml.documentElement.searchNode(nodePath, 0); 61220 if (!node && nodePath.length > 1) { 61221 node = xml.documentElement.searchNode([nodePath.at(-1)], 0); 61222 } 61223 if (node) { 61224 node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)]; 61225 } else { 61226 warn(`Node not found for path: ${path}`); 61227 } 61228 } 61229 const buffer = []; 61230 xml.documentElement.dump(buffer); 61231 return buffer.join(""); 61232} 61233async function updateAcroform({ 61234 xref, 61235 acroForm, 61236 acroFormRef, 61237 hasXfa, 61238 hasXfaDatasetsEntry, 61239 xfaDatasetsRef, 61240 needAppearances, 61241 changes 61242}) { 61243 if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { 61244 warn("XFA - Cannot save it"); 61245 } 61246 if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) { 61247 return; 61248 } 61249 const dict = acroForm.clone(); 61250 if (hasXfa && !hasXfaDatasetsEntry) { 61251 const newXfa = acroForm.get("XFA").slice(); 61252 newXfa.splice(2, 0, "datasets"); 61253 newXfa.splice(3, 0, xfaDatasetsRef); 61254 dict.set("XFA", newXfa); 61255 } 61256 if (needAppearances) { 61257 dict.set("NeedAppearances", true); 61258 } 61259 changes.put(acroFormRef, { 61260 data: dict 61261 }); 61262} 61263function updateXFA({ 61264 xfaData, 61265 xfaDatasetsRef, 61266 changes, 61267 xref 61268}) { 61269 if (xfaData === null) { 61270 const datasets = xref.fetchIfRef(xfaDatasetsRef); 61271 xfaData = writeXFADataForAcroform(datasets.getString(), changes); 61272 } 61273 const xfaDataStream = new StringStream(xfaData); 61274 xfaDataStream.dict = new Dict(xref); 61275 xfaDataStream.dict.set("Type", Name.get("EmbeddedFile")); 61276 changes.put(xfaDatasetsRef, { 61277 data: xfaDataStream 61278 }); 61279} 61280async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { 61281 buffer.push("xref\n"); 61282 const indexes = getIndexes(newRefs); 61283 let indexesPosition = 0; 61284 for (const { 61285 ref, 61286 data 61287 } of newRefs) { 61288 if (ref.num === indexes[indexesPosition]) { 61289 buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`); 61290 indexesPosition += 2; 61291 } 61292 if (data !== null) { 61293 buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`); 61294 baseOffset += data.length; 61295 } else { 61296 buffer.push(`0000000000 ${Math.min(ref.gen + 1, 0xffff).toString().padStart(5, "0")} f\r\n`); 61297 } 61298 } 61299 computeIDs(baseOffset, xrefInfo, newXref); 61300 buffer.push("trailer\n"); 61301 await writeDict(newXref, buffer); 61302 buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); 61303} 61304function getIndexes(newRefs) { 61305 const indexes = []; 61306 for (const { 61307 ref 61308 } of newRefs) { 61309 if (ref.num === indexes.at(-2) + indexes.at(-1)) { 61310 indexes[indexes.length - 1] += 1; 61311 } else { 61312 indexes.push(ref.num, 1); 61313 } 61314 } 61315 return indexes; 61316} 61317async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { 61318 const xrefTableData = []; 61319 let maxOffset = 0; 61320 let maxGen = 0; 61321 for (const { 61322 ref, 61323 data 61324 } of newRefs) { 61325 let gen; 61326 maxOffset = Math.max(maxOffset, baseOffset); 61327 if (data !== null) { 61328 gen = Math.min(ref.gen, 0xffff); 61329 xrefTableData.push([1, baseOffset, gen]); 61330 baseOffset += data.length; 61331 } else { 61332 gen = Math.min(ref.gen + 1, 0xffff); 61333 xrefTableData.push([0, 0, gen]); 61334 } 61335 maxGen = Math.max(maxGen, gen); 61336 } 61337 newXref.set("Index", getIndexes(newRefs)); 61338 const offsetSize = getSizeInBytes(maxOffset); 61339 const maxGenSize = getSizeInBytes(maxGen); 61340 const sizes = [1, offsetSize, maxGenSize]; 61341 newXref.set("W", sizes); 61342 computeIDs(baseOffset, xrefInfo, newXref); 61343 const structSize = sizes.reduce((a, x) => a + x, 0); 61344 const data = new Uint8Array(structSize * xrefTableData.length); 61345 const stream = new Stream(data); 61346 stream.dict = newXref; 61347 let offset = 0; 61348 for (const [type, objOffset, gen] of xrefTableData) { 61349 offset = writeInt(type, sizes[0], offset, data); 61350 offset = writeInt(objOffset, sizes[1], offset, data); 61351 offset = writeInt(gen, sizes[2], offset, data); 61352 } 61353 await writeObject(xrefInfo.newRef, stream, buffer, {}); 61354 buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n"); 61355} 61356function computeIDs(baseOffset, xrefInfo, newXref) { 61357 if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { 61358 const md5 = computeMD5(baseOffset, xrefInfo); 61359 newXref.set("ID", [xrefInfo.fileIds[0], md5]); 61360 } 61361} 61362function getTrailerDict(xrefInfo, changes, useXrefStream) { 61363 const newXref = new Dict(null); 61364 newXref.set("Prev", xrefInfo.startXRef); 61365 const refForXrefTable = xrefInfo.newRef; 61366 if (useXrefStream) { 61367 changes.put(refForXrefTable, { 61368 data: "" 61369 }); 61370 newXref.set("Size", refForXrefTable.num + 1); 61371 newXref.set("Type", Name.get("XRef")); 61372 } else { 61373 newXref.set("Size", refForXrefTable.num); 61374 } 61375 if (xrefInfo.rootRef !== null) { 61376 newXref.set("Root", xrefInfo.rootRef); 61377 } 61378 if (xrefInfo.infoRef !== null) { 61379 newXref.set("Info", xrefInfo.infoRef); 61380 } 61381 if (xrefInfo.encryptRef !== null) { 61382 newXref.set("Encrypt", xrefInfo.encryptRef); 61383 } 61384 return newXref; 61385} 61386async function writeChanges(changes, xref, buffer = []) { 61387 const newRefs = []; 61388 for (const [ref, { 61389 data 61390 }] of changes.items()) { 61391 if (data === null || typeof data === "string") { 61392 newRefs.push({ 61393 ref, 61394 data 61395 }); 61396 continue; 61397 } 61398 await writeObject(ref, data, buffer, xref); 61399 newRefs.push({ 61400 ref, 61401 data: buffer.join("") 61402 }); 61403 buffer.length = 0; 61404 } 61405 return newRefs.sort((a, b) => a.ref.num - b.ref.num); 61406} 61407async function incrementalUpdate({ 61408 originalData, 61409 xrefInfo, 61410 changes, 61411 xref = null, 61412 hasXfa = false, 61413 xfaDatasetsRef = null, 61414 hasXfaDatasetsEntry = false, 61415 needAppearances, 61416 acroFormRef = null, 61417 acroForm = null, 61418 xfaData = null, 61419 useXrefStream = false 61420}) { 61421 await updateAcroform({ 61422 xref, 61423 acroForm, 61424 acroFormRef, 61425 hasXfa, 61426 hasXfaDatasetsEntry, 61427 xfaDatasetsRef, 61428 needAppearances, 61429 changes 61430 }); 61431 if (hasXfa) { 61432 updateXFA({ 61433 xfaData, 61434 xfaDatasetsRef, 61435 changes, 61436 xref 61437 }); 61438 } 61439 const newXref = getTrailerDict(xrefInfo, changes, useXrefStream); 61440 const buffer = []; 61441 const newRefs = await writeChanges(changes, xref, buffer); 61442 let baseOffset = originalData.length; 61443 const lastByte = originalData.at(-1); 61444 if (lastByte !== 0x0a && lastByte !== 0x0d) { 61445 buffer.push("\n"); 61446 baseOffset += 1; 61447 } 61448 for (const { 61449 data 61450 } of newRefs) { 61451 if (data !== null) { 61452 buffer.push(data); 61453 } 61454 } 61455 await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer)); 61456 const totalLength = buffer.reduce((a, str) => a + str.length, originalData.length); 61457 const array = new Uint8Array(totalLength); 61458 array.set(originalData); 61459 let offset = originalData.length; 61460 for (const str of buffer) { 61461 writeString(str, offset, array); 61462 offset += str.length; 61463 } 61464 return array; 61465} 61466 61467;// ./src/core/worker_stream.js 61468 61469 61470class PDFWorkerStream { 61471 constructor(msgHandler) { 61472 this._msgHandler = msgHandler; 61473 this._contentLength = null; 61474 this._fullRequestReader = null; 61475 this._rangeRequestReaders = []; 61476 } 61477 getFullReader() { 61478 assert(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once."); 61479 this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); 61480 return this._fullRequestReader; 61481 } 61482 getRangeReader(begin, end) { 61483 const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); 61484 this._rangeRequestReaders.push(reader); 61485 return reader; 61486 } 61487 cancelAllRequests(reason) { 61488 this._fullRequestReader?.cancel(reason); 61489 for (const reader of this._rangeRequestReaders.slice(0)) { 61490 reader.cancel(reason); 61491 } 61492 } 61493} 61494class PDFWorkerStreamReader { 61495 constructor(msgHandler) { 61496 this._msgHandler = msgHandler; 61497 this.onProgress = null; 61498 this._contentLength = null; 61499 this._isRangeSupported = false; 61500 this._isStreamingSupported = false; 61501 const readableStream = this._msgHandler.sendWithStream("GetReader"); 61502 this._reader = readableStream.getReader(); 61503 this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { 61504 this._isStreamingSupported = data.isStreamingSupported; 61505 this._isRangeSupported = data.isRangeSupported; 61506 this._contentLength = data.contentLength; 61507 }); 61508 } 61509 get headersReady() { 61510 return this._headersReady; 61511 } 61512 get contentLength() { 61513 return this._contentLength; 61514 } 61515 get isStreamingSupported() { 61516 return this._isStreamingSupported; 61517 } 61518 get isRangeSupported() { 61519 return this._isRangeSupported; 61520 } 61521 async read() { 61522 const { 61523 value, 61524 done 61525 } = await this._reader.read(); 61526 if (done) { 61527 return { 61528 value: undefined, 61529 done: true 61530 }; 61531 } 61532 return { 61533 value: value.buffer, 61534 done: false 61535 }; 61536 } 61537 cancel(reason) { 61538 this._reader.cancel(reason); 61539 } 61540} 61541class PDFWorkerStreamRangeReader { 61542 constructor(begin, end, msgHandler) { 61543 this._msgHandler = msgHandler; 61544 this.onProgress = null; 61545 const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { 61546 begin, 61547 end 61548 }); 61549 this._reader = readableStream.getReader(); 61550 } 61551 get isStreamingSupported() { 61552 return false; 61553 } 61554 async read() { 61555 const { 61556 value, 61557 done 61558 } = await this._reader.read(); 61559 if (done) { 61560 return { 61561 value: undefined, 61562 done: true 61563 }; 61564 } 61565 return { 61566 value: value.buffer, 61567 done: false 61568 }; 61569 } 61570 cancel(reason) { 61571 this._reader.cancel(reason); 61572 } 61573} 61574 61575;// ./src/core/worker.js 61576 61577 61578 61579 61580 61581 61582 61583 61584 61585 61586 61587 61588 61589 61590 61591 61592 61593 61594 61595 61596 61597 61598 61599 61600 61601 61602 61603 61604 61605class WorkerTask { 61606 constructor(name) { 61607 this.name = name; 61608 this.terminated = false; 61609 this._capability = Promise.withResolvers(); 61610 } 61611 get finished() { 61612 return this._capability.promise; 61613 } 61614 finish() { 61615 this._capability.resolve(); 61616 } 61617 terminate() { 61618 this.terminated = true; 61619 } 61620 ensureNotTerminated() { 61621 if (this.terminated) { 61622 throw new Error("Worker task was terminated"); 61623 } 61624 } 61625} 61626class WorkerMessageHandler { 61627 static { 61628 if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) { 61629 this.initializeFromPort(self); 61630 } 61631 } 61632 static setup(handler, port) { 61633 let testMessageProcessed = false; 61634 handler.on("test", data => { 61635 if (testMessageProcessed) { 61636 return; 61637 } 61638 testMessageProcessed = true; 61639 handler.send("test", data instanceof Uint8Array); 61640 }); 61641 handler.on("configure", data => { 61642 setVerbosityLevel(data.verbosity); 61643 }); 61644 handler.on("GetDocRequest", data => this.createDocumentHandler(data, port)); 61645 } 61646 static createDocumentHandler(docParams, port) { 61647 let pdfManager; 61648 let terminated = false; 61649 let cancelXHRs = null; 61650 const WorkerTasks = new Set(); 61651 const verbosity = getVerbosityLevel(); 61652 const { 61653 docId, 61654 apiVersion 61655 } = docParams; 61656 const workerVersion = "4.10.38"; 61657 if (apiVersion !== workerVersion) { 61658 throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); 61659 } 61660 const enumerableProperties = []; 61661 for (const property in []) { 61662 enumerableProperties.push(property); 61663 } 61664 if (enumerableProperties.length) { 61665 throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s."); 61666 } 61667 const workerHandlerName = docId + "_worker"; 61668 let handler = new MessageHandler(workerHandlerName, docId, port); 61669 function ensureNotTerminated() { 61670 if (terminated) { 61671 throw new Error("Worker was terminated"); 61672 } 61673 } 61674 function startWorkerTask(task) { 61675 WorkerTasks.add(task); 61676 } 61677 function finishWorkerTask(task) { 61678 task.finish(); 61679 WorkerTasks.delete(task); 61680 } 61681 async function loadDocument(recoveryMode) { 61682 await pdfManager.ensureDoc("checkHeader"); 61683 await pdfManager.ensureDoc("parseStartXRef"); 61684 await pdfManager.ensureDoc("parse", [recoveryMode]); 61685 await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]); 61686 await pdfManager.ensureDoc("checkLastPage", [recoveryMode]); 61687 const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); 61688 if (isPureXfa) { 61689 const task = new WorkerTask("loadXfaFonts"); 61690 startWorkerTask(task); 61691 await Promise.all([pdfManager.loadXfaFonts(handler, task).catch(reason => {}).then(() => finishWorkerTask(task)), pdfManager.loadXfaImages()]); 61692 } 61693 const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]); 61694 const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null; 61695 return { 61696 numPages, 61697 fingerprints, 61698 htmlForXfa 61699 }; 61700 } 61701 async function getPdfManager({ 61702 data, 61703 password, 61704 disableAutoFetch, 61705 rangeChunkSize, 61706 length, 61707 docBaseUrl, 61708 enableXfa, 61709 evaluatorOptions 61710 }) { 61711 const pdfManagerArgs = { 61712 source: null, 61713 disableAutoFetch, 61714 docBaseUrl, 61715 docId, 61716 enableXfa, 61717 evaluatorOptions, 61718 handler, 61719 length, 61720 password, 61721 rangeChunkSize 61722 }; 61723 if (data) { 61724 pdfManagerArgs.source = data; 61725 return new LocalPdfManager(pdfManagerArgs); 61726 } 61727 const pdfStream = new PDFWorkerStream(handler), 61728 fullRequest = pdfStream.getFullReader(); 61729 const pdfManagerCapability = Promise.withResolvers(); 61730 let newPdfManager, 61731 cachedChunks = [], 61732 loaded = 0; 61733 fullRequest.headersReady.then(function () { 61734 if (!fullRequest.isRangeSupported) { 61735 return; 61736 } 61737 pdfManagerArgs.source = pdfStream; 61738 pdfManagerArgs.length = fullRequest.contentLength; 61739 pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported; 61740 newPdfManager = new NetworkPdfManager(pdfManagerArgs); 61741 for (const chunk of cachedChunks) { 61742 newPdfManager.sendProgressiveData(chunk); 61743 } 61744 cachedChunks = []; 61745 pdfManagerCapability.resolve(newPdfManager); 61746 cancelXHRs = null; 61747 }).catch(function (reason) { 61748 pdfManagerCapability.reject(reason); 61749 cancelXHRs = null; 61750 }); 61751 new Promise(function (resolve, reject) { 61752 const readChunk = function ({ 61753 value, 61754 done 61755 }) { 61756 try { 61757 ensureNotTerminated(); 61758 if (done) { 61759 if (!newPdfManager) { 61760 const pdfFile = arrayBuffersToBytes(cachedChunks); 61761 cachedChunks = []; 61762 if (length && pdfFile.length !== length) { 61763 warn("reported HTTP length is different from actual"); 61764 } 61765 pdfManagerArgs.source = pdfFile; 61766 newPdfManager = new LocalPdfManager(pdfManagerArgs); 61767 pdfManagerCapability.resolve(newPdfManager); 61768 } 61769 cancelXHRs = null; 61770 return; 61771 } 61772 loaded += value.byteLength; 61773 if (!fullRequest.isStreamingSupported) { 61774 handler.send("DocProgress", { 61775 loaded, 61776 total: Math.max(loaded, fullRequest.contentLength || 0) 61777 }); 61778 } 61779 if (newPdfManager) { 61780 newPdfManager.sendProgressiveData(value); 61781 } else { 61782 cachedChunks.push(value); 61783 } 61784 fullRequest.read().then(readChunk, reject); 61785 } catch (e) { 61786 reject(e); 61787 } 61788 }; 61789 fullRequest.read().then(readChunk, reject); 61790 }).catch(function (e) { 61791 pdfManagerCapability.reject(e); 61792 cancelXHRs = null; 61793 }); 61794 cancelXHRs = reason => { 61795 pdfStream.cancelAllRequests(reason); 61796 }; 61797 return pdfManagerCapability.promise; 61798 } 61799 function setupDoc(data) { 61800 function onSuccess(doc) { 61801 ensureNotTerminated(); 61802 handler.send("GetDoc", { 61803 pdfInfo: doc 61804 }); 61805 } 61806 function onFailure(ex) { 61807 ensureNotTerminated(); 61808 if (ex instanceof PasswordException) { 61809 const task = new WorkerTask(`PasswordException: response ${ex.code}`); 61810 startWorkerTask(task); 61811 handler.sendWithPromise("PasswordRequest", ex).then(function ({ 61812 password 61813 }) { 61814 finishWorkerTask(task); 61815 pdfManager.updatePassword(password); 61816 pdfManagerReady(); 61817 }).catch(function () { 61818 finishWorkerTask(task); 61819 handler.send("DocException", ex); 61820 }); 61821 } else { 61822 handler.send("DocException", wrapReason(ex)); 61823 } 61824 } 61825 function pdfManagerReady() { 61826 ensureNotTerminated(); 61827 loadDocument(false).then(onSuccess, function (reason) { 61828 ensureNotTerminated(); 61829 if (!(reason instanceof XRefParseException)) { 61830 onFailure(reason); 61831 return; 61832 } 61833 pdfManager.requestLoadedStream().then(function () { 61834 ensureNotTerminated(); 61835 loadDocument(true).then(onSuccess, onFailure); 61836 }); 61837 }); 61838 } 61839 ensureNotTerminated(); 61840 getPdfManager(data).then(function (newPdfManager) { 61841 if (terminated) { 61842 newPdfManager.terminate(new AbortException("Worker was terminated.")); 61843 throw new Error("Worker was terminated"); 61844 } 61845 pdfManager = newPdfManager; 61846 pdfManager.requestLoadedStream(true).then(stream => { 61847 handler.send("DataLoaded", { 61848 length: stream.bytes.byteLength 61849 }); 61850 }); 61851 }).then(pdfManagerReady, onFailure); 61852 } 61853 handler.on("GetPage", function (data) { 61854 return pdfManager.getPage(data.pageIndex).then(function (page) { 61855 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]) { 61856 return { 61857 rotate, 61858 ref, 61859 refStr: ref?.toString() ?? null, 61860 userUnit, 61861 view 61862 }; 61863 }); 61864 }); 61865 }); 61866 handler.on("GetPageIndex", function (data) { 61867 const pageRef = Ref.get(data.num, data.gen); 61868 return pdfManager.ensureCatalog("getPageIndex", [pageRef]); 61869 }); 61870 handler.on("GetDestinations", function (data) { 61871 return pdfManager.ensureCatalog("destinations"); 61872 }); 61873 handler.on("GetDestination", function (data) { 61874 return pdfManager.ensureCatalog("getDestination", [data.id]); 61875 }); 61876 handler.on("GetPageLabels", function (data) { 61877 return pdfManager.ensureCatalog("pageLabels"); 61878 }); 61879 handler.on("GetPageLayout", function (data) { 61880 return pdfManager.ensureCatalog("pageLayout"); 61881 }); 61882 handler.on("GetPageMode", function (data) { 61883 return pdfManager.ensureCatalog("pageMode"); 61884 }); 61885 handler.on("GetViewerPreferences", function (data) { 61886 return pdfManager.ensureCatalog("viewerPreferences"); 61887 }); 61888 handler.on("GetOpenAction", function (data) { 61889 return pdfManager.ensureCatalog("openAction"); 61890 }); 61891 handler.on("GetAttachments", function (data) { 61892 return pdfManager.ensureCatalog("attachments"); 61893 }); 61894 handler.on("GetDocJSActions", function (data) { 61895 return pdfManager.ensureCatalog("jsActions"); 61896 }); 61897 handler.on("GetPageJSActions", function ({ 61898 pageIndex 61899 }) { 61900 return pdfManager.getPage(pageIndex).then(function (page) { 61901 return pdfManager.ensure(page, "jsActions"); 61902 }); 61903 }); 61904 handler.on("GetOutline", function (data) { 61905 return pdfManager.ensureCatalog("documentOutline"); 61906 }); 61907 handler.on("GetOptionalContentConfig", function (data) { 61908 return pdfManager.ensureCatalog("optionalContentConfig"); 61909 }); 61910 handler.on("GetPermissions", function (data) { 61911 return pdfManager.ensureCatalog("permissions"); 61912 }); 61913 handler.on("GetMetadata", function (data) { 61914 return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]); 61915 }); 61916 handler.on("GetMarkInfo", function (data) { 61917 return pdfManager.ensureCatalog("markInfo"); 61918 }); 61919 handler.on("GetData", function (data) { 61920 return pdfManager.requestLoadedStream().then(function (stream) { 61921 return stream.bytes; 61922 }); 61923 }); 61924 handler.on("GetAnnotations", function ({ 61925 pageIndex, 61926 intent 61927 }) { 61928 return pdfManager.getPage(pageIndex).then(function (page) { 61929 const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); 61930 startWorkerTask(task); 61931 return page.getAnnotationsData(handler, task, intent).then(data => { 61932 finishWorkerTask(task); 61933 return data; 61934 }, reason => { 61935 finishWorkerTask(task); 61936 throw reason; 61937 }); 61938 }); 61939 }); 61940 handler.on("GetFieldObjects", function (data) { 61941 return pdfManager.ensureDoc("fieldObjects").then(fieldObjects => fieldObjects?.allFields || null); 61942 }); 61943 handler.on("HasJSActions", function (data) { 61944 return pdfManager.ensureDoc("hasJSActions"); 61945 }); 61946 handler.on("GetCalculationOrderIds", function (data) { 61947 return pdfManager.ensureDoc("calculationOrderIds"); 61948 }); 61949 handler.on("SaveDocument", async function ({ 61950 isPureXfa, 61951 numPages, 61952 annotationStorage, 61953 filename 61954 }) { 61955 const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("structTreeRoot")]; 61956 const changes = new RefSetCache(); 61957 const promises = []; 61958 const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null; 61959 const [stream, acroForm, acroFormRef, startXRef, xref, linearization, _structTreeRoot] = await Promise.all(globalPromises); 61960 const catalogRef = xref.trailer.getRaw("Root") || null; 61961 let structTreeRoot; 61962 if (newAnnotationsByPage) { 61963 if (!_structTreeRoot) { 61964 if (await StructTreeRoot.canCreateStructureTree({ 61965 catalogRef, 61966 pdfManager, 61967 newAnnotationsByPage 61968 })) { 61969 structTreeRoot = null; 61970 } 61971 } else if (await _structTreeRoot.canUpdateStructTree({ 61972 pdfManager, 61973 xref, 61974 newAnnotationsByPage 61975 })) { 61976 structTreeRoot = _structTreeRoot; 61977 } 61978 const imagePromises = AnnotationFactory.generateImages(annotationStorage.values(), xref, pdfManager.evaluatorOptions.isOffscreenCanvasSupported); 61979 const newAnnotationPromises = structTreeRoot === undefined ? promises : []; 61980 for (const [pageIndex, annotations] of newAnnotationsByPage) { 61981 newAnnotationPromises.push(pdfManager.getPage(pageIndex).then(page => { 61982 const task = new WorkerTask(`Save (editor): page ${pageIndex}`); 61983 startWorkerTask(task); 61984 return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(function () { 61985 finishWorkerTask(task); 61986 }); 61987 })); 61988 } 61989 if (structTreeRoot === null) { 61990 promises.push(Promise.all(newAnnotationPromises).then(async () => { 61991 await StructTreeRoot.createStructureTree({ 61992 newAnnotationsByPage, 61993 xref, 61994 catalogRef, 61995 pdfManager, 61996 changes 61997 }); 61998 })); 61999 } else if (structTreeRoot) { 62000 promises.push(Promise.all(newAnnotationPromises).then(async () => { 62001 await structTreeRoot.updateStructureTree({ 62002 newAnnotationsByPage, 62003 pdfManager, 62004 changes 62005 }); 62006 })); 62007 } 62008 } 62009 if (isPureXfa) { 62010 promises.push(pdfManager.serializeXfaData(annotationStorage)); 62011 } else { 62012 for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { 62013 promises.push(pdfManager.getPage(pageIndex).then(function (page) { 62014 const task = new WorkerTask(`Save: page ${pageIndex}`); 62015 startWorkerTask(task); 62016 return page.save(handler, task, annotationStorage, changes).finally(function () { 62017 finishWorkerTask(task); 62018 }); 62019 })); 62020 } 62021 } 62022 const refs = await Promise.all(promises); 62023 let xfaData = null; 62024 if (isPureXfa) { 62025 xfaData = refs[0]; 62026 if (!xfaData) { 62027 return stream.bytes; 62028 } 62029 } else if (changes.size === 0) { 62030 return stream.bytes; 62031 } 62032 const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().some(ref => ref.needAppearances); 62033 const xfa = acroForm instanceof Dict && acroForm.get("XFA") || null; 62034 let xfaDatasetsRef = null; 62035 let hasXfaDatasetsEntry = false; 62036 if (Array.isArray(xfa)) { 62037 for (let i = 0, ii = xfa.length; i < ii; i += 2) { 62038 if (xfa[i] === "datasets") { 62039 xfaDatasetsRef = xfa[i + 1]; 62040 hasXfaDatasetsEntry = true; 62041 } 62042 } 62043 if (xfaDatasetsRef === null) { 62044 xfaDatasetsRef = xref.getNewTemporaryRef(); 62045 } 62046 } else if (xfa) { 62047 warn("Unsupported XFA type."); 62048 } 62049 let newXrefInfo = Object.create(null); 62050 if (xref.trailer) { 62051 const infoObj = Object.create(null); 62052 const xrefInfo = xref.trailer.get("Info") || null; 62053 if (xrefInfo instanceof Dict) { 62054 for (const [key, value] of xrefInfo) { 62055 if (typeof value === "string") { 62056 infoObj[key] = stringToPDFString(value); 62057 } 62058 } 62059 } 62060 newXrefInfo = { 62061 rootRef: catalogRef, 62062 encryptRef: xref.trailer.getRaw("Encrypt") || null, 62063 newRef: xref.getNewTemporaryRef(), 62064 infoRef: xref.trailer.getRaw("Info") || null, 62065 info: infoObj, 62066 fileIds: xref.trailer.get("ID") || null, 62067 startXRef: linearization ? startXRef : xref.lastXRefStreamPos ?? startXRef, 62068 filename 62069 }; 62070 } 62071 return incrementalUpdate({ 62072 originalData: stream.bytes, 62073 xrefInfo: newXrefInfo, 62074 changes, 62075 xref, 62076 hasXfa: !!xfa, 62077 xfaDatasetsRef, 62078 hasXfaDatasetsEntry, 62079 needAppearances, 62080 acroFormRef, 62081 acroForm, 62082 xfaData, 62083 useXrefStream: isDict(xref.topDict, "XRef") 62084 }).finally(() => { 62085 xref.resetNewTemporaryRef(); 62086 }); 62087 }); 62088 handler.on("GetOperatorList", function (data, sink) { 62089 const pageIndex = data.pageIndex; 62090 pdfManager.getPage(pageIndex).then(function (page) { 62091 const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); 62092 startWorkerTask(task); 62093 const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; 62094 page.getOperatorList({ 62095 handler, 62096 sink, 62097 task, 62098 intent: data.intent, 62099 cacheKey: data.cacheKey, 62100 annotationStorage: data.annotationStorage, 62101 modifiedIds: data.modifiedIds 62102 }).then(function (operatorListInfo) { 62103 finishWorkerTask(task); 62104 if (start) { 62105 info(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`); 62106 } 62107 sink.close(); 62108 }, function (reason) { 62109 finishWorkerTask(task); 62110 if (task.terminated) { 62111 return; 62112 } 62113 sink.error(reason); 62114 }); 62115 }); 62116 }); 62117 handler.on("GetTextContent", function (data, sink) { 62118 const { 62119 pageIndex, 62120 includeMarkedContent, 62121 disableNormalization 62122 } = data; 62123 pdfManager.getPage(pageIndex).then(function (page) { 62124 const task = new WorkerTask("GetTextContent: page " + pageIndex); 62125 startWorkerTask(task); 62126 const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; 62127 page.extractTextContent({ 62128 handler, 62129 task, 62130 sink, 62131 includeMarkedContent, 62132 disableNormalization 62133 }).then(function () { 62134 finishWorkerTask(task); 62135 if (start) { 62136 info(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}
62136ms`); 62137 } 62138 sink.close(); 62139 }, function (reason) { 62140 finishWorkerTask(task); 62141 if (task.terminated) { 62142 return; 62143 } 62144 sink.error(reason); 62145 }); 62146 }); 62147 }); 62148 handler.on("GetStructTree", function (data) { 62149 return pdfManager.getPage(data.pageIndex).then(function (page) { 62150 return pdfManager.ensure(page, "getStructTree"); 62151 }); 62152 }); 62153 handler.on("FontFallback", function (data) { 62154 return pdfManager.fontFallback(data.id, handler); 62155 }); 62156 handler.on("Cleanup", function (data) { 62157 return pdfManager.cleanup(true); 62158 }); 62159 handler.on("Terminate", function (data) { 62160 terminated = true; 62161 const waitOn = []; 62162 if (pdfManager) { 62163 pdfManager.terminate(new AbortException("Worker was terminated.")); 62164 const cleanupPromise = pdfManager.cleanup(); 62165 waitOn.push(cleanupPromise); 62166 pdfManager = null; 62167 } else { 62168 clearGlobalCaches(); 62169 } 62170 cancelXHRs?.(new AbortException("Worker was terminated.")); 62171 for (const task of WorkerTasks) { 62172 waitOn.push(task.finished); 62173 task.terminate(); 62174 } 62175 return Promise.all(waitOn).then(function () { 62176 handler.destroy(); 62177 handler = null; 62178 }); 62179 }); 62180 handler.on("Ready", function (data) { 62181 setupDoc(docParams); 62182 docParams = null; 62183 }); 62184 return workerHandlerName; 62185 } 62186 static initializeFromPort(port) { 62187 const handler = new MessageHandler("worker", "main", port); 62188 this.setup(handler, port); 62189 handler.send("ready", null); 62190 } 62191} 62192 62193;// ./src/pdf.worker.js 62194 62195const pdfjsVersion = "4.10.38"; 62196const pdfjsBuild = "f9bea397f"; 62197 62198var __webpack_exports__WorkerMessageHandler = __webpack_exports__.WorkerMessageHandler; 62199export { __webpack_exports__WorkerMessageHandler as WorkerMessageHandler }; 62200 62201//# sourceMappingURL=pdf.worker.mjs.map 62202//# sourceMappingURL=pdfjs.worker.bundle.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.