@geoql/v-maplibre 1.5.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/dist/controls/_shared/index.d.ts +1 -0
- package/dist/controls/_shared/useMapControl.d.ts +10 -0
- package/dist/controls/index.d.ts +6 -0
- package/dist/controls/layer/VControlLayer.vue.d.ts +38 -0
- package/dist/controls/layer/VControlLayerGroup.vue.d.ts +53 -0
- package/dist/controls/layer/events.d.ts +1 -0
- package/dist/controls/layer/index.d.ts +5 -0
- package/dist/controls/layer/types.d.ts +16 -0
- package/dist/controls/legend/VControlLegend.vue.d.ts +54 -0
- package/dist/controls/legend/events.d.ts +2 -0
- package/dist/controls/legend/index.d.ts +3 -0
- package/dist/controls/legend/types.d.ts +63 -0
- package/dist/decoder-CLokFc0V.js +9 -0
- package/dist/decoder-CLokFc0V.js.map +1 -0
- package/dist/deflate-yeu3ogBn.js +11 -0
- package/dist/deflate-yeu3ogBn.js.map +1 -0
- package/dist/geotiff-BUZniE5g.js +3106 -0
- package/dist/geotiff-BUZniE5g.js.map +1 -0
- package/dist/index-Bt_rREAc.js +168 -0
- package/dist/index-Bt_rREAc.js.map +1 -0
- package/dist/index-CA8I5Z2-.js +4667 -0
- package/dist/index-CA8I5Z2-.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2736 -1638
- package/dist/index.js.map +1 -1
- package/dist/jpeg-B7yImnpY.js +534 -0
- package/dist/jpeg-B7yImnpY.js.map +1 -0
- package/dist/layers/deckgl/_shared/useDeckOverlay.d.ts +2 -0
- package/dist/layers/deckgl/index.d.ts +2 -0
- package/dist/layers/deckgl/mosaic/VLayerDeckglMosaic.vue.d.ts +163 -0
- package/dist/layers/deckgl/mosaic/index.d.ts +2 -0
- package/dist/layers/deckgl/text/VLayerDeckglText.vue.d.ts +1 -1
- package/dist/layers/deckgl/wind-particle/VLayerDeckglWindParticle.vue.d.ts +1 -1
- package/dist/layers/index.d.ts +3 -2
- package/dist/layers/maplibre/canvas/VLayerMaplibreCanvas.vue.d.ts +1 -1
- package/dist/layers/maplibre/custom/isochrone/VLayerMaplibreIsochrone.vue.d.ts +71 -0
- package/dist/layers/maplibre/custom/isochrone/index.d.ts +1 -0
- package/dist/layers/maplibre/geojson/VLayerMaplibreGeojson.vue.d.ts +1 -1
- package/dist/layers/maplibre/image/VLayerMaplibreImage.vue.d.ts +1 -1
- package/dist/layers/maplibre/pmtile/VLayerMaplibrePmtile.vue.d.ts +1 -1
- package/dist/layers/maplibre/video/VLayerMaplibreVideo.vue.d.ts +1 -1
- package/dist/lerc-CqgA9njy.js +1032 -0
- package/dist/lerc-CqgA9njy.js.map +1 -0
- package/dist/lzw-DL9RcHOz.js +85 -0
- package/dist/lzw-DL9RcHOz.js.map +1 -0
- package/dist/markers/VMarker.vue.d.ts +1 -2
- package/dist/packbits-YEJGULcy.js +25 -0
- package/dist/packbits-YEJGULcy.js.map +1 -0
- package/dist/pako.esm-Bx5X36Wo.js +1075 -0
- package/dist/pako.esm-Bx5X36Wo.js.map +1 -0
- package/dist/popups/VPopup.vue.d.ts +1 -1
- package/dist/raw-CoQHiEnn.js +10 -0
- package/dist/raw-CoQHiEnn.js.map +1 -0
- package/dist/v-maplibre.css +1 -1
- package/dist/webimage-BXLN-zu8.js +20 -0
- package/dist/webimage-BXLN-zu8.js.map +1 -0
- package/package.json +100 -84
- package/dist/layers/maplibre/{cluster → custom/cluster}/VLayerMaplibreCluster.vue.d.ts +1 -1
- package/dist/layers/maplibre/{cluster → custom/cluster}/index.d.ts +0 -0
- package/dist/layers/maplibre/{route → custom/route}/VLayerMaplibreRoute.vue.d.ts +2 -2
- /package/dist/layers/maplibre/{route → custom/route}/index.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geotiff-BUZniE5g.js","sources":["../../../node_modules/.bun/@petamoriken+float16@3.9.3/node_modules/@petamoriken/float16/src/_util/primordials.mjs","../../../node_modules/.bun/@petamoriken+float16@3.9.3/node_modules/@petamoriken/float16/src/_util/arrayIterator.mjs","../../../node_modules/.bun/@petamoriken+float16@3.9.3/node_modules/@petamoriken/float16/src/_util/converter.mjs","../../../node_modules/.bun/@petamoriken+float16@3.9.3/node_modules/@petamoriken/float16/src/DataView.mjs","../../../node_modules/.bun/xml-utils@1.10.2/node_modules/xml-utils/get-attribute.js","../../../node_modules/.bun/xml-utils@1.10.2/node_modules/xml-utils/index-of-match.js","../../../node_modules/.bun/xml-utils@1.10.2/node_modules/xml-utils/index-of-match-end.js","../../../node_modules/.bun/xml-utils@1.10.2/node_modules/xml-utils/count-substring.js","../../../node_modules/.bun/xml-utils@1.10.2/node_modules/xml-utils/find-tag-by-name.js","../../../node_modules/.bun/xml-utils@1.10.2/node_modules/xml-utils/find-tags-by-name.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/globals.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/rgb.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/compression/index.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/resample.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/geotiffimage.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/dataview64.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/dataslice.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/pool.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/httputils.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/basesource.js","../../../node_modules/.bun/quick-lru@6.1.2/node_modules/quick-lru/index.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/utils.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/blockedsource.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/client/base.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/client/fetch.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/client/xhr.js","../__vite-browser-external","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/client/http.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/remote.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/arraybuffer.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/filereader.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/source/file.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/geotiffwriter.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/logging.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/predictor.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/compression/basedecoder.js","../../../node_modules/.bun/geotiff@2.1.3/node_modules/geotiff/dist-module/geotiff.js"],"sourcesContent":["/* eslint-disable no-restricted-globals, no-restricted-syntax */\n/* global SharedArrayBuffer */\n\nimport { CANNOT_CONVERT_UNDEFINED_OR_NULL_TO_OBJECT } from \"./messages.mjs\";\n\n/** @type {<T extends (...args: any) => any>(target: T) => (thisArg: ThisType<T>, ...args: any[]) => any} */\nfunction uncurryThis(target) {\n return (thisArg, ...args) => {\n return ReflectApply(target, thisArg, args);\n };\n}\n\n/** @type {(target: any, key: string | symbol) => (thisArg: any, ...args: any[]) => any} */\nfunction uncurryThisGetter(target, key) {\n return uncurryThis(\n ReflectGetOwnPropertyDescriptor(\n target,\n key\n ).get\n );\n}\n\n// Reflect\nexport const {\n apply: ReflectApply,\n construct: ReflectConstruct,\n defineProperty: ReflectDefineProperty,\n get: ReflectGet,\n getOwnPropertyDescriptor: ReflectGetOwnPropertyDescriptor,\n getPrototypeOf: ReflectGetPrototypeOf,\n has: ReflectHas,\n ownKeys: ReflectOwnKeys,\n set: ReflectSet,\n setPrototypeOf: ReflectSetPrototypeOf,\n} = Reflect;\n\n// Proxy\nexport const NativeProxy = Proxy;\n\n// Number\nexport const {\n EPSILON,\n MAX_SAFE_INTEGER,\n isFinite: NumberIsFinite,\n isNaN: NumberIsNaN,\n} = Number;\n\n// Symbol\nexport const {\n iterator: SymbolIterator,\n species: SymbolSpecies,\n toStringTag: SymbolToStringTag,\n for: SymbolFor,\n} = Symbol;\n\n// Object\nexport const NativeObject = Object;\nexport const {\n create: ObjectCreate,\n defineProperty: ObjectDefineProperty,\n freeze: ObjectFreeze,\n is: ObjectIs,\n} = NativeObject;\nconst ObjectPrototype = NativeObject.prototype;\n/** @type {(object: object, key: PropertyKey) => Function | undefined} */\nexport const ObjectPrototype__lookupGetter__ = /** @type {any} */ (ObjectPrototype).__lookupGetter__\n ? uncurryThis(/** @type {any} */ (ObjectPrototype).__lookupGetter__)\n : (object, key) => {\n if (object == null) {\n throw NativeTypeError(\n CANNOT_CONVERT_UNDEFINED_OR_NULL_TO_OBJECT\n );\n }\n\n let target = NativeObject(object);\n do {\n const descriptor = ReflectGetOwnPropertyDescriptor(target, key);\n if (descriptor !== undefined) {\n if (ObjectHasOwn(descriptor, \"get\")) {\n return descriptor.get;\n }\n\n return;\n }\n } while ((target = ReflectGetPrototypeOf(target)) !== null);\n };\n/** @type {(object: object, key: PropertyKey) => boolean} */\nexport const ObjectHasOwn = /** @type {any} */ (NativeObject).hasOwn ||\n uncurryThis(ObjectPrototype.hasOwnProperty);\n\n// Array\nconst NativeArray = Array;\nexport const ArrayIsArray = NativeArray.isArray;\nconst ArrayPrototype = NativeArray.prototype;\n/** @type {(array: ArrayLike<unknown>, separator?: string) => string} */\nexport const ArrayPrototypeJoin = uncurryThis(ArrayPrototype.join);\n/** @type {<T>(array: T[], ...items: T[]) => number} */\nexport const ArrayPrototypePush = uncurryThis(ArrayPrototype.push);\n/** @type {(array: ArrayLike<unknown>, ...opts: any[]) => string} */\nexport const ArrayPrototypeToLocaleString = uncurryThis(\n ArrayPrototype.toLocaleString\n);\nexport const NativeArrayPrototypeSymbolIterator = ArrayPrototype[SymbolIterator];\n/** @type {<T>(array: T[]) => IterableIterator<T>} */\nexport const ArrayPrototypeSymbolIterator = uncurryThis(NativeArrayPrototypeSymbolIterator);\n\n// Math\nexport const {\n abs: MathAbs,\n trunc: MathTrunc,\n} = Math;\n\n// ArrayBuffer\nexport const NativeArrayBuffer = ArrayBuffer;\nexport const ArrayBufferIsView = NativeArrayBuffer.isView;\nconst ArrayBufferPrototype = NativeArrayBuffer.prototype;\n/** @type {(buffer: ArrayBuffer, begin?: number, end?: number) => number} */\nexport const ArrayBufferPrototypeSlice = uncurryThis(ArrayBufferPrototype.slice);\n/** @type {(buffer: ArrayBuffer) => ArrayBuffer} */\nexport const ArrayBufferPrototypeGetByteLength = uncurryThisGetter(ArrayBufferPrototype, \"byteLength\");\n\n// SharedArrayBuffer\nexport const NativeSharedArrayBuffer = typeof SharedArrayBuffer !== \"undefined\" ? SharedArrayBuffer : null;\n/** @type {(buffer: SharedArrayBuffer) => SharedArrayBuffer} */\nexport const SharedArrayBufferPrototypeGetByteLength = NativeSharedArrayBuffer\n && uncurryThisGetter(NativeSharedArrayBuffer.prototype, \"byteLength\");\n\n// TypedArray\n/** @typedef {Uint8Array|Uint8ClampedArray|Uint16Array|Uint32Array|Int8Array|Int16Array|Int32Array|Float32Array|Float64Array|BigUint64Array|BigInt64Array} TypedArray */\n/** @type {any} */\nexport const TypedArray = ReflectGetPrototypeOf(Uint8Array);\nconst TypedArrayFrom = TypedArray.from;\nexport const TypedArrayPrototype = TypedArray.prototype;\nexport const NativeTypedArrayPrototypeSymbolIterator = TypedArrayPrototype[SymbolIterator];\n/** @type {(typedArray: TypedArray) => IterableIterator<number>} */\nexport const TypedArrayPrototypeKeys = uncurryThis(TypedArrayPrototype.keys);\n/** @type {(typedArray: TypedArray) => IterableIterator<number>} */\nexport const TypedArrayPrototypeValues = uncurryThis(\n TypedArrayPrototype.values\n);\n/** @type {(typedArray: TypedArray) => IterableIterator<[number, number]>} */\nexport const TypedArrayPrototypeEntries = uncurryThis(\n TypedArrayPrototype.entries\n);\n/** @type {(typedArray: TypedArray, array: ArrayLike<number>, offset?: number) => void} */\nexport const TypedArrayPrototypeSet = uncurryThis(TypedArrayPrototype.set);\n/** @type {<T extends TypedArray>(typedArray: T) => T} */\nexport const TypedArrayPrototypeReverse = uncurryThis(\n TypedArrayPrototype.reverse\n);\n/** @type {<T extends TypedArray>(typedArray: T, value: number, start?: number, end?: number) => T} */\nexport const TypedArrayPrototypeFill = uncurryThis(TypedArrayPrototype.fill);\n/** @type {<T extends TypedArray>(typedArray: T, target: number, start: number, end?: number) => T} */\nexport const TypedArrayPrototypeCopyWithin = uncurryThis(\n TypedArrayPrototype.copyWithin\n);\n/** @type {<T extends TypedArray>(typedArray: T, compareFn?: (a: number, b: number) => number) => T} */\nexport const TypedArrayPrototypeSort = uncurryThis(TypedArrayPrototype.sort);\n/** @type {<T extends TypedArray>(typedArray: T, start?: number, end?: number) => T} */\nexport const TypedArrayPrototypeSlice = uncurryThis(TypedArrayPrototype.slice);\n/** @type {<T extends TypedArray>(typedArray: T, start?: number, end?: number) => T} */\nexport const TypedArrayPrototypeSubarray = uncurryThis(\n TypedArrayPrototype.subarray\n);\n/** @type {((typedArray: TypedArray) => ArrayBuffer)} */\nexport const TypedArrayPrototypeGetBuffer = uncurryThisGetter(\n TypedArrayPrototype,\n \"buffer\"\n);\n/** @type {((typedArray: TypedArray) => number)} */\nexport const TypedArrayPrototypeGetByteOffset = uncurryThisGetter(\n TypedArrayPrototype,\n \"byteOffset\"\n);\n/** @type {((typedArray: TypedArray) => number)} */\nexport const TypedArrayPrototypeGetLength = uncurryThisGetter(\n TypedArrayPrototype,\n \"length\"\n);\n/** @type {(target: unknown) => string} */\nexport const TypedArrayPrototypeGetSymbolToStringTag = uncurryThisGetter(\n TypedArrayPrototype,\n SymbolToStringTag\n);\n\n// Uint8Array\nexport const NativeUint8Array = Uint8Array;\n\n// Uint16Array\nexport const NativeUint16Array = Uint16Array;\n/** @type {Uint16ArrayConstructor[\"from\"]} */\nexport const Uint16ArrayFrom = (...args) => {\n return ReflectApply(TypedArrayFrom, NativeUint16Array, args);\n};\n\n// Uint32Array\nexport const NativeUint32Array = Uint32Array;\n\n// Float32Array\nexport const NativeFloat32Array = Float32Array;\n\n// ArrayIterator\n/** @type {any} */\nexport const ArrayIteratorPrototype = ReflectGetPrototypeOf([][SymbolIterator]());\n/** @type {<T>(arrayIterator: IterableIterator<T>) => IteratorResult<T>} */\nexport const ArrayIteratorPrototypeNext = uncurryThis(ArrayIteratorPrototype.next);\n\n// Generator\n/** @type {<T = unknown, TReturn = any, TNext = unknown>(generator: Generator<T, TReturn, TNext>, value?: TNext) => T} */\nexport const GeneratorPrototypeNext = uncurryThis((function* () {})().next);\n\n// Iterator\nexport const IteratorPrototype = ReflectGetPrototypeOf(ArrayIteratorPrototype);\n\n// DataView\nconst DataViewPrototype = DataView.prototype;\n/** @type {(dataView: DataView, byteOffset: number, littleEndian?: boolean) => number} */\nexport const DataViewPrototypeGetUint16 = uncurryThis(\n DataViewPrototype.getUint16\n);\n/** @type {(dataView: DataView, byteOffset: number, value: number, littleEndian?: boolean) => void} */\nexport const DataViewPrototypeSetUint16 = uncurryThis(\n DataViewPrototype.setUint16\n);\n\n// Error\nexport const NativeTypeError = TypeError;\nexport const NativeRangeError = RangeError;\n\n// WeakSet\n/**\n * Do not construct with arguments to avoid calling the \"add\" method\n * @type {{new <T extends {}>(): WeakSet<T>}}\n */\nexport const NativeWeakSet = WeakSet;\nconst WeakSetPrototype = NativeWeakSet.prototype;\n/** @type {<T extends {}>(set: WeakSet<T>, value: T) => Set<T>} */\nexport const WeakSetPrototypeAdd = uncurryThis(WeakSetPrototype.add);\n/** @type {<T extends {}>(set: WeakSet<T>, value: T) => boolean} */\nexport const WeakSetPrototypeHas = uncurryThis(WeakSetPrototype.has);\n\n// WeakMap\n/**\n * Do not construct with arguments to avoid calling the \"set\" method\n * @type {{new <K extends {}, V>(): WeakMap<K, V>}}\n */\nexport const NativeWeakMap = WeakMap;\nconst WeakMapPrototype = NativeWeakMap.prototype;\n/** @type {<K extends {}, V>(weakMap: WeakMap<K, V>, key: K) => V} */\nexport const WeakMapPrototypeGet = uncurryThis(WeakMapPrototype.get);\n/** @type {<K extends {}, V>(weakMap: WeakMap<K, V>, key: K) => boolean} */\nexport const WeakMapPrototypeHas = uncurryThis(WeakMapPrototype.has);\n/** @type {<K extends {}, V>(weakMap: WeakMap<K, V>, key: K, value: V) => WeakMap} */\nexport const WeakMapPrototypeSet = uncurryThis(WeakMapPrototype.set);\n","import {\n ArrayIteratorPrototype,\n ArrayIteratorPrototypeNext,\n ArrayPrototypeSymbolIterator,\n GeneratorPrototypeNext,\n IteratorPrototype,\n NativeArrayPrototypeSymbolIterator,\n NativeWeakMap,\n ObjectCreate,\n ObjectDefineProperty,\n ReflectGetOwnPropertyDescriptor,\n ReflectOwnKeys,\n SymbolIterator,\n WeakMapPrototypeGet,\n WeakMapPrototypeSet,\n} from \"./primordials.mjs\";\n\n/** @type {WeakMap<{}, IterableIterator<any>>} */\nconst arrayIterators = new NativeWeakMap();\n\nconst SafeIteratorPrototype = ObjectCreate(null, {\n next: {\n value: function next() {\n const arrayIterator = WeakMapPrototypeGet(arrayIterators, this);\n return ArrayIteratorPrototypeNext(arrayIterator);\n },\n },\n\n [SymbolIterator]: {\n value: function values() {\n return this;\n },\n },\n});\n\n/**\n * Wrap the Array around the SafeIterator If Array.prototype [@@iterator] has been modified\n * @type {<T>(array: T[]) => Iterable<T>}\n */\nexport function safeIfNeeded(array) {\n if (\n array[SymbolIterator] === NativeArrayPrototypeSymbolIterator &&\n ArrayIteratorPrototype.next === ArrayIteratorPrototypeNext\n ) {\n return array;\n }\n\n const safe = ObjectCreate(SafeIteratorPrototype);\n WeakMapPrototypeSet(arrayIterators, safe, ArrayPrototypeSymbolIterator(array));\n return safe;\n}\n\n/** @type {WeakMap<{}, Generator<any>>} */\nconst generators = new NativeWeakMap();\n\n/** @see https://tc39.es/ecma262/#sec-%arrayiteratorprototype%-object */\nconst DummyArrayIteratorPrototype = ObjectCreate(IteratorPrototype, {\n next: {\n value: function next() {\n const generator = WeakMapPrototypeGet(generators, this);\n return GeneratorPrototypeNext(generator);\n },\n writable: true,\n configurable: true,\n },\n});\n\nfor (const key of ReflectOwnKeys(ArrayIteratorPrototype)) {\n // next method has already defined\n if (key === \"next\") {\n continue;\n }\n\n // Copy ArrayIteratorPrototype descriptors to DummyArrayIteratorPrototype\n ObjectDefineProperty(DummyArrayIteratorPrototype, key, ReflectGetOwnPropertyDescriptor(ArrayIteratorPrototype, key));\n}\n\n/**\n * Wrap the Generator around the dummy ArrayIterator\n * @type {<T>(generator: Generator<T>) => IterableIterator<T>}\n */\nexport function wrap(generator) {\n const dummy = ObjectCreate(DummyArrayIteratorPrototype);\n WeakMapPrototypeSet(generators, dummy, generator);\n return dummy;\n}\n","import {\n EPSILON,\n MathAbs,\n NativeArrayBuffer,\n NativeFloat32Array,\n NativeUint16Array,\n NativeUint32Array,\n NativeUint8Array,\n NumberIsFinite,\n NumberIsNaN,\n} from \"./primordials.mjs\";\n\nconst INVERSE_OF_EPSILON = 1 / EPSILON;\n\n/**\n * rounds to the nearest value;\n * if the number falls midway, it is rounded to the nearest value with an even least significant digit\n * @param {number} num\n * @returns {number}\n */\nfunction roundTiesToEven(num) {\n return (num + INVERSE_OF_EPSILON) - INVERSE_OF_EPSILON;\n}\n\nconst FLOAT16_MIN_VALUE = 6.103515625e-05;\nconst FLOAT16_MAX_VALUE = 65504;\nconst FLOAT16_EPSILON = 0.0009765625;\n\nconst FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE = FLOAT16_EPSILON * FLOAT16_MIN_VALUE;\nconst FLOAT16_EPSILON_DEVIDED_BY_EPSILON = FLOAT16_EPSILON * INVERSE_OF_EPSILON;\n\n/**\n * round a number to a half float number\n * @param {unknown} num - double float\n * @returns {number} half float number\n */\nexport function roundToFloat16(num) {\n const number = +num;\n\n // NaN, Infinity, -Infinity, 0, -0\n if (!NumberIsFinite(number) || number === 0) {\n return number;\n }\n\n // finite except 0, -0\n const sign = number > 0 ? 1 : -1;\n const absolute = MathAbs(number);\n\n // small number\n if (absolute < FLOAT16_MIN_VALUE) {\n return sign * roundTiesToEven(absolute / FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE) * FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE;\n }\n\n const temp = (1 + FLOAT16_EPSILON_DEVIDED_BY_EPSILON) * absolute;\n const result = temp - (temp - absolute);\n\n // large number\n if (result > FLOAT16_MAX_VALUE || NumberIsNaN(result)) {\n return sign * Infinity;\n }\n\n return sign * result;\n}\n\n// base algorithm: http://fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst buffer = new NativeArrayBuffer(4);\nconst floatView = new NativeFloat32Array(buffer);\nconst uint32View = new NativeUint32Array(buffer);\n\nconst baseTable = new NativeUint16Array(512);\nconst shiftTable = new NativeUint8Array(512);\n\nfor (let i = 0; i < 256; ++i) {\n const e = i - 127;\n\n // very small number (0, -0)\n if (e < -24) {\n baseTable[i] = 0x0000;\n baseTable[i | 0x100] = 0x8000;\n shiftTable[i] = 24;\n shiftTable[i | 0x100] = 24;\n\n // small number (denorm)\n } else if (e < -14) {\n baseTable[i] = 0x0400 >> (-e - 14);\n baseTable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000;\n shiftTable[i] = -e - 1;\n shiftTable[i | 0x100] = -e - 1;\n\n // normal number\n } else if (e <= 15) {\n baseTable[i] = (e + 15) << 10;\n baseTable[i | 0x100] = ((e + 15) << 10) | 0x8000;\n shiftTable[i] = 13;\n shiftTable[i | 0x100] = 13;\n\n // large number (Infinity, -Infinity)\n } else if (e < 128) {\n baseTable[i] = 0x7c00;\n baseTable[i | 0x100] = 0xfc00;\n shiftTable[i] = 24;\n shiftTable[i | 0x100] = 24;\n\n // stay (NaN, Infinity, -Infinity)\n } else {\n baseTable[i] = 0x7c00;\n baseTable[i | 0x100] = 0xfc00;\n shiftTable[i] = 13;\n shiftTable[i | 0x100] = 13;\n }\n}\n\n/**\n * round a number to a half float number bits\n * @param {unknown} num - double float\n * @returns {number} half float number bits\n */\nexport function roundToFloat16Bits(num) {\n floatView[0] = roundToFloat16(num);\n const f = uint32View[0];\n const e = (f >> 23) & 0x1ff;\n return baseTable[e] + ((f & 0x007fffff) >> shiftTable[e]);\n}\n\nconst mantissaTable = new NativeUint32Array(2048);\nfor (let i = 1; i < 1024; ++i) {\n let m = i << 13; // zero pad mantissa bits\n let e = 0; // zero exponent\n\n // normalized\n while ((m & 0x00800000) === 0) {\n m <<= 1;\n e -= 0x00800000; // decrement exponent\n }\n\n m &= ~0x00800000; // clear leading 1 bit\n e += 0x38800000; // adjust bias\n\n mantissaTable[i] = m | e;\n}\nfor (let i = 1024; i < 2048; ++i) {\n mantissaTable[i] = 0x38000000 + ((i - 1024) << 13);\n}\n\nconst exponentTable = new NativeUint32Array(64);\nfor (let i = 1; i < 31; ++i) {\n exponentTable[i] = i << 23;\n}\nexponentTable[31] = 0x47800000;\nexponentTable[32] = 0x80000000;\nfor (let i = 33; i < 63; ++i) {\n exponentTable[i] = 0x80000000 + ((i - 32) << 23);\n}\nexponentTable[63] = 0xc7800000;\n\nconst offsetTable = new NativeUint16Array(64);\nfor (let i = 1; i < 64; ++i) {\n if (i !== 32) {\n offsetTable[i] = 1024;\n }\n}\n\n/**\n * convert a half float number bits to a number\n * @param {number} float16bits - half float number bits\n * @returns {number} double float\n */\nexport function convertToNumber(float16bits) {\n const i = float16bits >> 10;\n uint32View[0] = mantissaTable[offsetTable[i] + (float16bits & 0x3ff)] + exponentTable[i];\n return floatView[0];\n}\n","import { safeIfNeeded } from \"./_util/arrayIterator.mjs\";\nimport { convertToNumber, roundToFloat16Bits } from \"./_util/converter.mjs\";\nimport {\n DataViewPrototypeGetUint16,\n DataViewPrototypeSetUint16,\n} from \"./_util/primordials.mjs\";\n\n/**\n * returns an unsigned 16-bit float at the specified byte offset from the start of the DataView\n * @param {DataView} dataView\n * @param {number} byteOffset\n * @param {[boolean]} opts\n * @returns {number}\n */\nexport function getFloat16(dataView, byteOffset, ...opts) {\n return convertToNumber(\n DataViewPrototypeGetUint16(dataView, byteOffset, ...safeIfNeeded(opts))\n );\n}\n\n/**\n * stores an unsigned 16-bit float value at the specified byte offset from the start of the DataView\n * @param {DataView} dataView\n * @param {number} byteOffset\n * @param {number} value\n * @param {[boolean]} opts\n */\nexport function setFloat16(dataView, byteOffset, value, ...opts) {\n return DataViewPrototypeSetUint16(\n dataView,\n byteOffset,\n roundToFloat16Bits(value),\n ...safeIfNeeded(opts)\n );\n}\n","function getAttribute(tag, attributeName, options) {\n const debug = (options && options.debug) || false;\n if (debug) console.log(\"[xml-utils] getting \" + attributeName + \" in \" + tag);\n\n const xml = typeof tag === \"object\" ? tag.outer : tag;\n\n // only search for attributes in the opening tag\n const opening = xml.slice(0, xml.indexOf(\">\") + 1);\n\n const quotechars = ['\"', \"'\"];\n for (let i = 0; i < quotechars.length; i++) {\n const char = quotechars[i];\n const pattern = attributeName + \"\\\\=\" + char + \"([^\" + char + \"]*)\" + char;\n if (debug) console.log(\"[xml-utils] pattern:\", pattern);\n\n const re = new RegExp(pattern);\n const match = re.exec(opening);\n if (debug) console.log(\"[xml-utils] match:\", match);\n if (match) return match[1];\n }\n}\n\nmodule.exports = getAttribute;\nmodule.exports.default = getAttribute;\n","function indexOfMatch(xml, pattern, startIndex) {\n const re = new RegExp(pattern);\n const match = re.exec(xml.slice(startIndex));\n if (match) return startIndex + match.index;\n else return -1;\n}\n\nmodule.exports = indexOfMatch;\nmodule.exports.default = indexOfMatch;\n","function indexOfMatchEnd(xml, pattern, startIndex) {\n const re = new RegExp(pattern);\n const match = re.exec(xml.slice(startIndex));\n if (match) return startIndex + match.index + match[0].length - 1;\n else return -1;\n}\n\nmodule.exports = indexOfMatchEnd;\nmodule.exports.default = indexOfMatchEnd;\n","function countSubstring(string, substring) {\n const pattern = new RegExp(substring, \"g\");\n const match = string.match(pattern);\n return match ? match.length : 0;\n}\n\nmodule.exports = countSubstring;\nmodule.exports.default = countSubstring;\n","const indexOfMatch = require(\"./index-of-match.js\");\nconst indexOfMatchEnd = require(\"./index-of-match-end.js\");\nconst countSubstring = require(\"./count-substring.js\");\n\nfunction findTagByName(xml, tagName, options) {\n const debug = (options && options.debug) || false;\n const nested = !(options && typeof options.nested === false);\n\n const startIndex = (options && options.startIndex) || 0;\n\n if (debug) console.log(\"[xml-utils] starting findTagByName with\", tagName, \" and \", options);\n\n const start = indexOfMatch(xml, `\\<${tagName}[ \\n\\>\\/]`, startIndex);\n if (debug) console.log(\"[xml-utils] start:\", start);\n if (start === -1) return undefined;\n\n const afterStart = xml.slice(start + tagName.length);\n\n let relativeEnd = indexOfMatchEnd(afterStart, \"^[^<]*[ /]>\", 0);\n\n const selfClosing = relativeEnd !== -1 && afterStart[relativeEnd - 1] === \"/\";\n if (debug) console.log(\"[xml-utils] selfClosing:\", selfClosing);\n\n if (selfClosing === false) {\n // check if tag has subtags with the same name\n if (nested) {\n let startIndex = 0;\n let openings = 1;\n let closings = 0;\n while ((relativeEnd = indexOfMatchEnd(afterStart, \"[ /]\" + tagName + \">\", startIndex)) !== -1) {\n const clip = afterStart.substring(startIndex, relativeEnd + 1);\n openings += countSubstring(clip, \"<\" + tagName + \"[ \\n\\t>]\");\n closings += countSubstring(clip, \"</\" + tagName + \">\");\n // we can't have more openings than closings\n if (closings >= openings) break;\n startIndex = relativeEnd;\n }\n } else {\n relativeEnd = indexOfMatchEnd(afterStart, \"[ /]\" + tagName + \">\", 0);\n }\n }\n\n const end = start + tagName.length + relativeEnd + 1;\n if (debug) console.log(\"[xml-utils] end:\", end);\n if (end === -1) return undefined;\n\n const outer = xml.slice(start, end);\n // tag is like <gml:identifier codeSpace=\"OGP\">urn:ogc:def:crs:EPSG::32617</gml:identifier>\n\n let inner;\n if (selfClosing) {\n inner = null;\n } else {\n inner = outer.slice(outer.indexOf(\">\") + 1, outer.lastIndexOf(\"<\"));\n }\n\n return { inner, outer, start, end };\n}\n\nmodule.exports = findTagByName;\nmodule.exports.default = findTagByName;\n","const findTagByName = require(\"./find-tag-by-name.js\");\n\nfunction findTagsByName(xml, tagName, options) {\n const tags = [];\n const debug = (options && options.debug) || false;\n const nested = options && typeof options.nested === \"boolean\" ? options.nested : true;\n let startIndex = (options && options.startIndex) || 0;\n let tag;\n while ((tag = findTagByName(xml, tagName, { debug, startIndex }))) {\n if (nested) {\n startIndex = tag.start + 1 + tagName.length;\n } else {\n startIndex = tag.end;\n }\n tags.push(tag);\n }\n if (debug) console.log(\"findTagsByName found\", tags.length, \"tags\");\n return tags;\n}\n\nmodule.exports = findTagsByName;\nmodule.exports.default = findTagsByName;\n","export const fieldTagNames = {\n // TIFF Baseline\n 0x013B: 'Artist',\n 0x0102: 'BitsPerSample',\n 0x0109: 'CellLength',\n 0x0108: 'CellWidth',\n 0x0140: 'ColorMap',\n 0x0103: 'Compression',\n 0x8298: 'Copyright',\n 0x0132: 'DateTime',\n 0x0152: 'ExtraSamples',\n 0x010A: 'FillOrder',\n 0x0121: 'FreeByteCounts',\n 0x0120: 'FreeOffsets',\n 0x0123: 'GrayResponseCurve',\n 0x0122: 'GrayResponseUnit',\n 0x013C: 'HostComputer',\n 0x010E: 'ImageDescription',\n 0x0101: 'ImageLength',\n 0x0100: 'ImageWidth',\n 0x010F: 'Make',\n 0x0119: 'MaxSampleValue',\n 0x0118: 'MinSampleValue',\n 0x0110: 'Model',\n 0x00FE: 'NewSubfileType',\n 0x0112: 'Orientation',\n 0x0106: 'PhotometricInterpretation',\n 0x011C: 'PlanarConfiguration',\n 0x0128: 'ResolutionUnit',\n 0x0116: 'RowsPerStrip',\n 0x0115: 'SamplesPerPixel',\n 0x0131: 'Software',\n 0x0117: 'StripByteCounts',\n 0x0111: 'StripOffsets',\n 0x00FF: 'SubfileType',\n 0x0107: 'Threshholding',\n 0x011A: 'XResolution',\n 0x011B: 'YResolution',\n\n // TIFF Extended\n 0x0146: 'BadFaxLines',\n 0x0147: 'CleanFaxData',\n 0x0157: 'ClipPath',\n 0x0148: 'ConsecutiveBadFaxLines',\n 0x01B1: 'Decode',\n 0x01B2: 'DefaultImageColor',\n 0x010D: 'DocumentName',\n 0x0150: 'DotRange',\n 0x0141: 'HalftoneHints',\n 0x015A: 'Indexed',\n 0x015B: 'JPEGTables',\n 0x011D: 'PageName',\n 0x0129: 'PageNumber',\n 0x013D: 'Predictor',\n 0x013F: 'PrimaryChromaticities',\n 0x0214: 'ReferenceBlackWhite',\n 0x0153: 'SampleFormat',\n 0x0154: 'SMinSampleValue',\n 0x0155: 'SMaxSampleValue',\n 0x022F: 'StripRowCounts',\n 0x014A: 'SubIFDs',\n 0x0124: 'T4Options',\n 0x0125: 'T6Options',\n 0x0145: 'TileByteCounts',\n 0x0143: 'TileLength',\n 0x0144: 'TileOffsets',\n 0x0142: 'TileWidth',\n 0x012D: 'TransferFunction',\n 0x013E: 'WhitePoint',\n 0x0158: 'XClipPathUnits',\n 0x011E: 'XPosition',\n 0x0211: 'YCbCrCoefficients',\n 0x0213: 'YCbCrPositioning',\n 0x0212: 'YCbCrSubSampling',\n 0x0159: 'YClipPathUnits',\n 0x011F: 'YPosition',\n\n // EXIF\n 0x9202: 'ApertureValue',\n 0xA001: 'ColorSpace',\n 0x9004: 'DateTimeDigitized',\n 0x9003: 'DateTimeOriginal',\n 0x8769: 'Exif IFD',\n 0x9000: 'ExifVersion',\n 0x829A: 'ExposureTime',\n 0xA300: 'FileSource',\n 0x9209: 'Flash',\n 0xA000: 'FlashpixVersion',\n 0x829D: 'FNumber',\n 0xA420: 'ImageUniqueID',\n 0x9208: 'LightSource',\n 0x927C: 'MakerNote',\n 0x9201: 'ShutterSpeedValue',\n 0x9286: 'UserComment',\n\n // IPTC\n 0x83BB: 'IPTC',\n\n // ICC\n 0x8773: 'ICC Profile',\n\n // XMP\n 0x02BC: 'XMP',\n\n // GDAL\n 0xA480: 'GDAL_METADATA',\n 0xA481: 'GDAL_NODATA',\n\n // Photoshop\n 0x8649: 'Photoshop',\n\n // GeoTiff\n 0x830E: 'ModelPixelScale',\n 0x8482: 'ModelTiepoint',\n 0x85D8: 'ModelTransformation',\n 0x87AF: 'GeoKeyDirectory',\n 0x87B0: 'GeoDoubleParams',\n 0x87B1: 'GeoAsciiParams',\n\n // LERC\n 0xC5F2: 'LercParameters',\n};\n\nexport const fieldTags = {};\nfor (const key in fieldTagNames) {\n if (fieldTagNames.hasOwnProperty(key)) {\n fieldTags[fieldTagNames[key]] = parseInt(key, 10);\n }\n}\n\nexport const fieldTagTypes = {\n 256: 'SHORT',\n 257: 'SHORT',\n 258: 'SHORT',\n 259: 'SHORT',\n 262: 'SHORT',\n 273: 'LONG',\n 274: 'SHORT',\n 277: 'SHORT',\n 278: 'LONG',\n 279: 'LONG',\n 282: 'RATIONAL',\n 283: 'RATIONAL',\n 284: 'SHORT',\n 286: 'SHORT',\n 287: 'RATIONAL',\n 296: 'SHORT',\n 297: 'SHORT',\n 305: 'ASCII',\n 306: 'ASCII',\n 338: 'SHORT',\n 339: 'SHORT',\n 513: 'LONG',\n 514: 'LONG',\n 1024: 'SHORT',\n 1025: 'SHORT',\n 2048: 'SHORT',\n 2049: 'ASCII',\n 3072: 'SHORT',\n 3073: 'ASCII',\n 33550: 'DOUBLE',\n 33922: 'DOUBLE',\n 34264: 'DOUBLE',\n 34665: 'LONG',\n 34735: 'SHORT',\n 34736: 'DOUBLE',\n 34737: 'ASCII',\n 42113: 'ASCII',\n};\n\nexport const arrayFields = [\n fieldTags.BitsPerSample,\n fieldTags.ExtraSamples,\n fieldTags.SampleFormat,\n fieldTags.StripByteCounts,\n fieldTags.StripOffsets,\n fieldTags.StripRowCounts,\n fieldTags.TileByteCounts,\n fieldTags.TileOffsets,\n fieldTags.SubIFDs,\n];\n\nexport const fieldTypeNames = {\n 0x0001: 'BYTE',\n 0x0002: 'ASCII',\n 0x0003: 'SHORT',\n 0x0004: 'LONG',\n 0x0005: 'RATIONAL',\n 0x0006: 'SBYTE',\n 0x0007: 'UNDEFINED',\n 0x0008: 'SSHORT',\n 0x0009: 'SLONG',\n 0x000A: 'SRATIONAL',\n 0x000B: 'FLOAT',\n 0x000C: 'DOUBLE',\n // IFD offset, suggested by https://owl.phy.queensu.ca/~phil/exiftool/standards.html\n 0x000D: 'IFD',\n // introduced by BigTIFF\n 0x0010: 'LONG8',\n 0x0011: 'SLONG8',\n 0x0012: 'IFD8',\n};\n\nexport const fieldTypes = {};\nfor (const key in fieldTypeNames) {\n if (fieldTypeNames.hasOwnProperty(key)) {\n fieldTypes[fieldTypeNames[key]] = parseInt(key, 10);\n }\n}\n\nexport const photometricInterpretations = {\n WhiteIsZero: 0,\n BlackIsZero: 1,\n RGB: 2,\n Palette: 3,\n TransparencyMask: 4,\n CMYK: 5,\n YCbCr: 6,\n\n CIELab: 8,\n ICCLab: 9,\n};\n\nexport const ExtraSamplesValues = {\n Unspecified: 0,\n Assocalpha: 1,\n Unassalpha: 2,\n};\n\nexport const LercParameters = {\n Version: 0,\n AddCompression: 1,\n};\n\nexport const LercAddCompression = {\n None: 0,\n Deflate: 1,\n Zstandard: 2,\n};\n\nexport const geoKeyNames = {\n 1024: 'GTModelTypeGeoKey',\n 1025: 'GTRasterTypeGeoKey',\n 1026: 'GTCitationGeoKey',\n 2048: 'GeographicTypeGeoKey',\n 2049: 'GeogCitationGeoKey',\n 2050: 'GeogGeodeticDatumGeoKey',\n 2051: 'GeogPrimeMeridianGeoKey',\n 2052: 'GeogLinearUnitsGeoKey',\n 2053: 'GeogLinearUnitSizeGeoKey',\n 2054: 'GeogAngularUnitsGeoKey',\n 2055: 'GeogAngularUnitSizeGeoKey',\n 2056: 'GeogEllipsoidGeoKey',\n 2057: 'GeogSemiMajorAxisGeoKey',\n 2058: 'GeogSemiMinorAxisGeoKey',\n 2059: 'GeogInvFlatteningGeoKey',\n 2060: 'GeogAzimuthUnitsGeoKey',\n 2061: 'GeogPrimeMeridianLongGeoKey',\n 2062: 'GeogTOWGS84GeoKey',\n 3072: 'ProjectedCSTypeGeoKey',\n 3073: 'PCSCitationGeoKey',\n 3074: 'ProjectionGeoKey',\n 3075: 'ProjCoordTransGeoKey',\n 3076: 'ProjLinearUnitsGeoKey',\n 3077: 'ProjLinearUnitSizeGeoKey',\n 3078: 'ProjStdParallel1GeoKey',\n 3079: 'ProjStdParallel2GeoKey',\n 3080: 'ProjNatOriginLongGeoKey',\n 3081: 'ProjNatOriginLatGeoKey',\n 3082: 'ProjFalseEastingGeoKey',\n 3083: 'ProjFalseNorthingGeoKey',\n 3084: 'ProjFalseOriginLongGeoKey',\n 3085: 'ProjFalseOriginLatGeoKey',\n 3086: 'ProjFalseOriginEastingGeoKey',\n 3087: 'ProjFalseOriginNorthingGeoKey',\n 3088: 'ProjCenterLongGeoKey',\n 3089: 'ProjCenterLatGeoKey',\n 3090: 'ProjCenterEastingGeoKey',\n 3091: 'ProjCenterNorthingGeoKey',\n 3092: 'ProjScaleAtNatOriginGeoKey',\n 3093: 'ProjScaleAtCenterGeoKey',\n 3094: 'ProjAzimuthAngleGeoKey',\n 3095: 'ProjStraightVertPoleLongGeoKey',\n 3096: 'ProjRectifiedGridAngleGeoKey',\n 4096: 'VerticalCSTypeGeoKey',\n 4097: 'VerticalCitationGeoKey',\n 4098: 'VerticalDatumGeoKey',\n 4099: 'VerticalUnitsGeoKey',\n};\n\nexport const geoKeys = {};\nfor (const key in geoKeyNames) {\n if (geoKeyNames.hasOwnProperty(key)) {\n geoKeys[geoKeyNames[key]] = parseInt(key, 10);\n }\n}\n","export function fromWhiteIsZero(raster, max) {\n const { width, height } = raster;\n const rgbRaster = new Uint8Array(width * height * 3);\n let value;\n for (let i = 0, j = 0; i < raster.length; ++i, j += 3) {\n value = 256 - (raster[i] / max * 256);\n rgbRaster[j] = value;\n rgbRaster[j + 1] = value;\n rgbRaster[j + 2] = value;\n }\n return rgbRaster;\n}\n\nexport function fromBlackIsZero(raster, max) {\n const { width, height } = raster;\n const rgbRaster = new Uint8Array(width * height * 3);\n let value;\n for (let i = 0, j = 0; i < raster.length; ++i, j += 3) {\n value = raster[i] / max * 256;\n rgbRaster[j] = value;\n rgbRaster[j + 1] = value;\n rgbRaster[j + 2] = value;\n }\n return rgbRaster;\n}\n\nexport function fromPalette(raster, colorMap) {\n const { width, height } = raster;\n const rgbRaster = new Uint8Array(width * height * 3);\n const greenOffset = colorMap.length / 3;\n const blueOffset = colorMap.length / 3 * 2;\n for (let i = 0, j = 0; i < raster.length; ++i, j += 3) {\n const mapIndex = raster[i];\n rgbRaster[j] = colorMap[mapIndex] / 65536 * 256;\n rgbRaster[j + 1] = colorMap[mapIndex + greenOffset] / 65536 * 256;\n rgbRaster[j + 2] = colorMap[mapIndex + blueOffset] / 65536 * 256;\n }\n return rgbRaster;\n}\n\nexport function fromCMYK(cmykRaster) {\n const { width, height } = cmykRaster;\n const rgbRaster = new Uint8Array(width * height * 3);\n for (let i = 0, j = 0; i < cmykRaster.length; i += 4, j += 3) {\n const c = cmykRaster[i];\n const m = cmykRaster[i + 1];\n const y = cmykRaster[i + 2];\n const k = cmykRaster[i + 3];\n\n rgbRaster[j] = 255 * ((255 - c) / 256) * ((255 - k) / 256);\n rgbRaster[j + 1] = 255 * ((255 - m) / 256) * ((255 - k) / 256);\n rgbRaster[j + 2] = 255 * ((255 - y) / 256) * ((255 - k) / 256);\n }\n return rgbRaster;\n}\n\nexport function fromYCbCr(yCbCrRaster) {\n const { width, height } = yCbCrRaster;\n const rgbRaster = new Uint8ClampedArray(width * height * 3);\n for (let i = 0, j = 0; i < yCbCrRaster.length; i += 3, j += 3) {\n const y = yCbCrRaster[i];\n const cb = yCbCrRaster[i + 1];\n const cr = yCbCrRaster[i + 2];\n\n rgbRaster[j] = (y + (1.40200 * (cr - 0x80)));\n rgbRaster[j + 1] = (y - (0.34414 * (cb - 0x80)) - (0.71414 * (cr - 0x80)));\n rgbRaster[j + 2] = (y + (1.77200 * (cb - 0x80)));\n }\n return rgbRaster;\n}\n\nconst Xn = 0.95047;\nconst Yn = 1.00000;\nconst Zn = 1.08883;\n\n// from https://github.com/antimatter15/rgb-lab/blob/master/color.js\n\nexport function fromCIELab(cieLabRaster) {\n const { width, height } = cieLabRaster;\n const rgbRaster = new Uint8Array(width * height * 3);\n\n for (let i = 0, j = 0; i < cieLabRaster.length; i += 3, j += 3) {\n const L = cieLabRaster[i + 0];\n const a_ = cieLabRaster[i + 1] << 24 >> 24; // conversion from uint8 to int8\n const b_ = cieLabRaster[i + 2] << 24 >> 24; // same\n\n let y = (L + 16) / 116;\n let x = (a_ / 500) + y;\n let z = y - (b_ / 200);\n let r;\n let g;\n let b;\n\n x = Xn * ((x * x * x > 0.008856) ? x * x * x : (x - (16 / 116)) / 7.787);\n y = Yn * ((y * y * y > 0.008856) ? y * y * y : (y - (16 / 116)) / 7.787);\n z = Zn * ((z * z * z > 0.008856) ? z * z * z : (z - (16 / 116)) / 7.787);\n\n r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n r = (r > 0.0031308) ? ((1.055 * (r ** (1 / 2.4))) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? ((1.055 * (g ** (1 / 2.4))) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? ((1.055 * (b ** (1 / 2.4))) - 0.055) : 12.92 * b;\n\n rgbRaster[j] = Math.max(0, Math.min(1, r)) * 255;\n rgbRaster[j + 1] = Math.max(0, Math.min(1, g)) * 255;\n rgbRaster[j + 2] = Math.max(0, Math.min(1, b)) * 255;\n }\n return rgbRaster;\n}\n","const registry = new Map();\n\nexport function addDecoder(cases, importFn) {\n if (!Array.isArray(cases)) {\n cases = [cases]; // eslint-disable-line no-param-reassign\n }\n cases.forEach((c) => registry.set(c, importFn));\n}\n\nexport async function getDecoder(fileDirectory) {\n const importFn = registry.get(fileDirectory.Compression);\n if (!importFn) {\n throw new Error(`Unknown compression method identifier: ${fileDirectory.Compression}`);\n }\n const Decoder = await importFn();\n return new Decoder(fileDirectory);\n}\n\n// Add default decoders to registry (end-user may override with other implementations)\naddDecoder([undefined, 1], () => import('./raw.js').then((m) => m.default));\naddDecoder(5, () => import('./lzw.js').then((m) => m.default));\naddDecoder(6, () => {\n throw new Error('old style JPEG compression is not supported.');\n});\naddDecoder(7, () => import('./jpeg.js').then((m) => m.default));\naddDecoder([8, 32946], () => import('./deflate.js').then((m) => m.default));\naddDecoder(32773, () => import('./packbits.js').then((m) => m.default));\naddDecoder(34887, () => import('./lerc.js')\n .then(async (m) => {\n await m.zstd.init();\n return m;\n })\n .then((m) => m.default),\n);\naddDecoder(50001, () => import('./webimage.js').then((m) => m.default));\n","/**\n * @module resample\n */\n\nfunction copyNewSize(array, width, height, samplesPerPixel = 1) {\n return new (Object.getPrototypeOf(array).constructor)(width * height * samplesPerPixel);\n}\n\n/**\n * Resample the input arrays using nearest neighbor value selection.\n * @param {TypedArray[]} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @returns {TypedArray[]} The resampled rasters\n */\nexport function resampleNearest(valueArrays, inWidth, inHeight, outWidth, outHeight) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n return valueArrays.map((array) => {\n const newArray = copyNewSize(array, outWidth, outHeight);\n for (let y = 0; y < outHeight; ++y) {\n const cy = Math.min(Math.round(relY * y), inHeight - 1);\n for (let x = 0; x < outWidth; ++x) {\n const cx = Math.min(Math.round(relX * x), inWidth - 1);\n const value = array[(cy * inWidth) + cx];\n newArray[(y * outWidth) + x] = value;\n }\n }\n return newArray;\n });\n}\n\n// simple linear interpolation, code from:\n// https://en.wikipedia.org/wiki/Linear_interpolation#Programming_language_support\nfunction lerp(v0, v1, t) {\n return ((1 - t) * v0) + (t * v1);\n}\n\n/**\n * Resample the input arrays using bilinear interpolation.\n * @param {TypedArray[]} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @returns {TypedArray[]} The resampled rasters\n */\nexport function resampleBilinear(valueArrays, inWidth, inHeight, outWidth, outHeight) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n\n return valueArrays.map((array) => {\n const newArray = copyNewSize(array, outWidth, outHeight);\n for (let y = 0; y < outHeight; ++y) {\n const rawY = relY * y;\n\n const yl = Math.floor(rawY);\n const yh = Math.min(Math.ceil(rawY), (inHeight - 1));\n\n for (let x = 0; x < outWidth; ++x) {\n const rawX = relX * x;\n const tx = rawX % 1;\n\n const xl = Math.floor(rawX);\n const xh = Math.min(Math.ceil(rawX), (inWidth - 1));\n\n const ll = array[(yl * inWidth) + xl];\n const hl = array[(yl * inWidth) + xh];\n const lh = array[(yh * inWidth) + xl];\n const hh = array[(yh * inWidth) + xh];\n\n const value = lerp(\n lerp(ll, hl, tx),\n lerp(lh, hh, tx),\n rawY % 1,\n );\n newArray[(y * outWidth) + x] = value;\n }\n }\n return newArray;\n });\n}\n\n/**\n * Resample the input arrays using the selected resampling method.\n * @param {TypedArray[]} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {string} [method = 'nearest'] The desired resampling method\n * @returns {TypedArray[]} The resampled rasters\n */\nexport function resample(valueArrays, inWidth, inHeight, outWidth, outHeight, method = 'nearest') {\n switch (method.toLowerCase()) {\n case 'nearest':\n return resampleNearest(valueArrays, inWidth, inHeight, outWidth, outHeight);\n case 'bilinear':\n case 'linear':\n return resampleBilinear(valueArrays, inWidth, inHeight, outWidth, outHeight);\n default:\n throw new Error(`Unsupported resampling method: '${method}'`);\n }\n}\n\n/**\n * Resample the pixel interleaved input array using nearest neighbor value selection.\n * @param {TypedArray} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {number} samples The number of samples per pixel for pixel\n * interleaved data\n * @returns {TypedArray} The resampled raster\n */\nexport function resampleNearestInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n\n const newArray = copyNewSize(valueArray, outWidth, outHeight, samples);\n for (let y = 0; y < outHeight; ++y) {\n const cy = Math.min(Math.round(relY * y), inHeight - 1);\n for (let x = 0; x < outWidth; ++x) {\n const cx = Math.min(Math.round(relX * x), inWidth - 1);\n for (let i = 0; i < samples; ++i) {\n const value = valueArray[(cy * inWidth * samples) + (cx * samples) + i];\n newArray[(y * outWidth * samples) + (x * samples) + i] = value;\n }\n }\n }\n return newArray;\n}\n\n/**\n * Resample the pixel interleaved input array using bilinear interpolation.\n * @param {TypedArray} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {number} samples The number of samples per pixel for pixel\n * interleaved data\n * @returns {TypedArray} The resampled raster\n */\nexport function resampleBilinearInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n const newArray = copyNewSize(valueArray, outWidth, outHeight, samples);\n for (let y = 0; y < outHeight; ++y) {\n const rawY = relY * y;\n\n const yl = Math.floor(rawY);\n const yh = Math.min(Math.ceil(rawY), (inHeight - 1));\n\n for (let x = 0; x < outWidth; ++x) {\n const rawX = relX * x;\n const tx = rawX % 1;\n\n const xl = Math.floor(rawX);\n const xh = Math.min(Math.ceil(rawX), (inWidth - 1));\n\n for (let i = 0; i < samples; ++i) {\n const ll = valueArray[(yl * inWidth * samples) + (xl * samples) + i];\n const hl = valueArray[(yl * inWidth * samples) + (xh * samples) + i];\n const lh = valueArray[(yh * inWidth * samples) + (xl * samples) + i];\n const hh = valueArray[(yh * inWidth * samples) + (xh * samples) + i];\n\n const value = lerp(\n lerp(ll, hl, tx),\n lerp(lh, hh, tx),\n rawY % 1,\n );\n newArray[(y * outWidth * samples) + (x * samples) + i] = value;\n }\n }\n }\n return newArray;\n}\n\n/**\n * Resample the pixel interleaved input array using the selected resampling method.\n * @param {TypedArray} valueArray The input array to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {number} samples The number of samples per pixel for pixel\n * interleaved data\n * @param {string} [method = 'nearest'] The desired resampling method\n * @returns {TypedArray} The resampled rasters\n */\nexport function resampleInterleaved(valueArray, inWidth, inHeight, outWidth, outHeight, samples, method = 'nearest') {\n switch (method.toLowerCase()) {\n case 'nearest':\n return resampleNearestInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples,\n );\n case 'bilinear':\n case 'linear':\n return resampleBilinearInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples,\n );\n default:\n throw new Error(`Unsupported resampling method: '${method}'`);\n }\n}\n","/** @module geotiffimage */\nimport { getFloat16 } from '@petamoriken/float16';\nimport getAttribute from 'xml-utils/get-attribute.js';\nimport findTagsByName from 'xml-utils/find-tags-by-name.js';\n\nimport { photometricInterpretations, ExtraSamplesValues } from './globals.js';\nimport { fromWhiteIsZero, fromBlackIsZero, fromPalette, fromCMYK, fromYCbCr, fromCIELab } from './rgb.js';\nimport { getDecoder } from './compression/index.js';\nimport { resample, resampleInterleaved } from './resample.js';\n\n/**\n * @typedef {Object} ReadRasterOptions\n * @property {Array<number>} [window=whole window] the subset to read data from in pixels.\n * @property {Array<number>} [bbox=whole image] the subset to read data from in\n * geographical coordinates.\n * @property {Array<number>} [samples=all samples] the selection of samples to read from. Default is all samples.\n * @property {boolean} [interleave=false] whether the data shall be read\n * in one single array or separate\n * arrays.\n * @property {Pool} [pool=null] The optional decoder pool to use.\n * @property {number} [width] The desired width of the output. When the width is not the\n * same as the images, resampling will be performed.\n * @property {number} [height] The desired height of the output. When the width is not the\n * same as the images, resampling will be performed.\n * @property {string} [resampleMethod='nearest'] The desired resampling method.\n * @property {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @property {number|number[]} [fillValue] The value to use for parts of the image\n * outside of the images extent. When multiple\n * samples are requested, an array of fill values\n * can be passed.\n */\n\n/** @typedef {import(\"./geotiff.js\").TypedArray} TypedArray */\n/** @typedef {import(\"./geotiff.js\").ReadRasterResult} ReadRasterResult */\n\nfunction sum(array, start, end) {\n let s = 0;\n for (let i = start; i < end; ++i) {\n s += array[i];\n }\n return s;\n}\n\nfunction arrayForType(format, bitsPerSample, size) {\n switch (format) {\n case 1: // unsigned integer data\n if (bitsPerSample <= 8) {\n return new Uint8Array(size);\n } else if (bitsPerSample <= 16) {\n return new Uint16Array(size);\n } else if (bitsPerSample <= 32) {\n return new Uint32Array(size);\n }\n break;\n case 2: // twos complement signed integer data\n if (bitsPerSample === 8) {\n return new Int8Array(size);\n } else if (bitsPerSample === 16) {\n return new Int16Array(size);\n } else if (bitsPerSample === 32) {\n return new Int32Array(size);\n }\n break;\n case 3: // floating point data\n switch (bitsPerSample) {\n case 16:\n case 32:\n return new Float32Array(size);\n case 64:\n return new Float64Array(size);\n default:\n break;\n }\n break;\n default:\n break;\n }\n throw Error('Unsupported data format/bitsPerSample');\n}\n\nfunction needsNormalization(format, bitsPerSample) {\n if ((format === 1 || format === 2) && bitsPerSample <= 32 && bitsPerSample % 8 === 0) {\n return false;\n } else if (format === 3 && (bitsPerSample === 16 || bitsPerSample === 32 || bitsPerSample === 64)) {\n return false;\n }\n return true;\n}\n\nfunction normalizeArray(inBuffer, format, planarConfiguration, samplesPerPixel, bitsPerSample, tileWidth, tileHeight) {\n // const inByteArray = new Uint8Array(inBuffer);\n const view = new DataView(inBuffer);\n const outSize = planarConfiguration === 2\n ? tileHeight * tileWidth\n : tileHeight * tileWidth * samplesPerPixel;\n const samplesToTransfer = planarConfiguration === 2\n ? 1 : samplesPerPixel;\n const outArray = arrayForType(format, bitsPerSample, outSize);\n // let pixel = 0;\n\n const bitMask = parseInt('1'.repeat(bitsPerSample), 2);\n\n if (format === 1) { // unsigned integer\n // translation of https://github.com/OSGeo/gdal/blob/master/gdal/frmts/gtiff/geotiff.cpp#L7337\n let pixelBitSkip;\n // let sampleBitOffset = 0;\n if (planarConfiguration === 1) {\n pixelBitSkip = samplesPerPixel * bitsPerSample;\n // sampleBitOffset = (samplesPerPixel - 1) * bitsPerSample;\n } else {\n pixelBitSkip = bitsPerSample;\n }\n\n // Bits per line rounds up to next byte boundary.\n let bitsPerLine = tileWidth * pixelBitSkip;\n if ((bitsPerLine & 7) !== 0) {\n bitsPerLine = (bitsPerLine + 7) & (~7);\n }\n\n for (let y = 0; y < tileHeight; ++y) {\n const lineBitOffset = y * bitsPerLine;\n for (let x = 0; x < tileWidth; ++x) {\n const pixelBitOffset = lineBitOffset + (x * samplesToTransfer * bitsPerSample);\n for (let i = 0; i < samplesToTransfer; ++i) {\n const bitOffset = pixelBitOffset + (i * bitsPerSample);\n const outIndex = (((y * tileWidth) + x) * samplesToTransfer) + i;\n\n const byteOffset = Math.floor(bitOffset / 8);\n const innerBitOffset = bitOffset % 8;\n if (innerBitOffset + bitsPerSample <= 8) {\n outArray[outIndex] = (view.getUint8(byteOffset) >> (8 - bitsPerSample) - innerBitOffset) & bitMask;\n } else if (innerBitOffset + bitsPerSample <= 16) {\n outArray[outIndex] = (view.getUint16(byteOffset) >> (16 - bitsPerSample) - innerBitOffset) & bitMask;\n } else if (innerBitOffset + bitsPerSample <= 24) {\n const raw = (view.getUint16(byteOffset) << 8) | (view.getUint8(byteOffset + 2));\n outArray[outIndex] = (raw >> (24 - bitsPerSample) - innerBitOffset) & bitMask;\n } else {\n outArray[outIndex] = (view.getUint32(byteOffset) >> (32 - bitsPerSample) - innerBitOffset) & bitMask;\n }\n\n // let outWord = 0;\n // for (let bit = 0; bit < bitsPerSample; ++bit) {\n // if (inByteArray[bitOffset >> 3]\n // & (0x80 >> (bitOffset & 7))) {\n // outWord |= (1 << (bitsPerSample - 1 - bit));\n // }\n // ++bitOffset;\n // }\n\n // outArray[outIndex] = outWord;\n // outArray[pixel] = outWord;\n // pixel += 1;\n }\n // bitOffset = bitOffset + pixelBitSkip - bitsPerSample;\n }\n }\n } else if (format === 3) { // floating point\n // Float16 is handled elsewhere\n // normalize 16/24 bit floats to 32 bit floats in the array\n // console.time();\n // if (bitsPerSample === 16) {\n // for (let byte = 0, outIndex = 0; byte < inBuffer.byteLength; byte += 2, ++outIndex) {\n // outArray[outIndex] = getFloat16(view, byte);\n // }\n // }\n // console.timeEnd()\n }\n\n return outArray.buffer;\n}\n\n/**\n * GeoTIFF sub-file image.\n */\nclass GeoTIFFImage {\n /**\n * @constructor\n * @param {Object} fileDirectory The parsed file directory\n * @param {Object} geoKeys The parsed geo-keys\n * @param {DataView} dataView The DataView for the underlying file.\n * @param {Boolean} littleEndian Whether the file is encoded in little or big endian\n * @param {Boolean} cache Whether or not decoded tiles shall be cached\n * @param {import('./source/basesource').BaseSource} source The datasource to read from\n */\n constructor(fileDirectory, geoKeys, dataView, littleEndian, cache, source) {\n this.fileDirectory = fileDirectory;\n this.geoKeys = geoKeys;\n this.dataView = dataView;\n this.littleEndian = littleEndian;\n this.tiles = cache ? {} : null;\n this.isTiled = !fileDirectory.StripOffsets;\n const planarConfiguration = fileDirectory.PlanarConfiguration;\n this.planarConfiguration = (typeof planarConfiguration === 'undefined') ? 1 : planarConfiguration;\n if (this.planarConfiguration !== 1 && this.planarConfiguration !== 2) {\n throw new Error('Invalid planar configuration.');\n }\n\n this.source = source;\n }\n\n /**\n * Returns the associated parsed file directory.\n * @returns {Object} the parsed file directory\n */\n getFileDirectory() {\n return this.fileDirectory;\n }\n\n /**\n * Returns the associated parsed geo keys.\n * @returns {Object} the parsed geo keys\n */\n getGeoKeys() {\n return this.geoKeys;\n }\n\n /**\n * Returns the width of the image.\n * @returns {Number} the width of the image\n */\n getWidth() {\n return this.fileDirectory.ImageWidth;\n }\n\n /**\n * Returns the height of the image.\n * @returns {Number} the height of the image\n */\n getHeight() {\n return this.fileDirectory.ImageLength;\n }\n\n /**\n * Returns the number of samples per pixel.\n * @returns {Number} the number of samples per pixel\n */\n getSamplesPerPixel() {\n return typeof this.fileDirectory.SamplesPerPixel !== 'undefined'\n ? this.fileDirectory.SamplesPerPixel : 1;\n }\n\n /**\n * Returns the width of each tile.\n * @returns {Number} the width of each tile\n */\n getTileWidth() {\n return this.isTiled ? this.fileDirectory.TileWidth : this.getWidth();\n }\n\n /**\n * Returns the height of each tile.\n * @returns {Number} the height of each tile\n */\n getTileHeight() {\n if (this.isTiled) {\n return this.fileDirectory.TileLength;\n }\n if (typeof this.fileDirectory.RowsPerStrip !== 'undefined') {\n return Math.min(this.fileDirectory.RowsPerStrip, this.getHeight());\n }\n return this.getHeight();\n }\n\n getBlockWidth() {\n return this.getTileWidth();\n }\n\n getBlockHeight(y) {\n if (this.isTiled || (y + 1) * this.getTileHeight() <= this.getHeight()) {\n return this.getTileHeight();\n } else {\n return this.getHeight() - (y * this.getTileHeight());\n }\n }\n\n /**\n * Calculates the number of bytes for each pixel across all samples. Only full\n * bytes are supported, an exception is thrown when this is not the case.\n * @returns {Number} the bytes per pixel\n */\n getBytesPerPixel() {\n let bytes = 0;\n for (let i = 0; i < this.fileDirectory.BitsPerSample.length; ++i) {\n bytes += this.getSampleByteSize(i);\n }\n return bytes;\n }\n\n getSampleByteSize(i) {\n if (i >= this.fileDirectory.BitsPerSample.length) {\n throw new RangeError(`Sample index ${i} is out of range.`);\n }\n return Math.ceil(this.fileDirectory.BitsPerSample[i] / 8);\n }\n\n getReaderForSample(sampleIndex) {\n const format = this.fileDirectory.SampleFormat\n ? this.fileDirectory.SampleFormat[sampleIndex] : 1;\n const bitsPerSample = this.fileDirectory.BitsPerSample[sampleIndex];\n switch (format) {\n case 1: // unsigned integer data\n if (bitsPerSample <= 8) {\n return DataView.prototype.getUint8;\n } else if (bitsPerSample <= 16) {\n return DataView.prototype.getUint16;\n } else if (bitsPerSample <= 32) {\n return DataView.prototype.getUint32;\n }\n break;\n case 2: // twos complement signed integer data\n if (bitsPerSample <= 8) {\n return DataView.prototype.getInt8;\n } else if (bitsPerSample <= 16) {\n return DataView.prototype.getInt16;\n } else if (bitsPerSample <= 32) {\n return DataView.prototype.getInt32;\n }\n break;\n case 3:\n switch (bitsPerSample) {\n case 16:\n return function (offset, littleEndian) {\n return getFloat16(this, offset, littleEndian);\n };\n case 32:\n return DataView.prototype.getFloat32;\n case 64:\n return DataView.prototype.getFloat64;\n default:\n break;\n }\n break;\n default:\n break;\n }\n throw Error('Unsupported data format/bitsPerSample');\n }\n\n getSampleFormat(sampleIndex = 0) {\n return this.fileDirectory.SampleFormat\n ? this.fileDirectory.SampleFormat[sampleIndex] : 1;\n }\n\n getBitsPerSample(sampleIndex = 0) {\n return this.fileDirectory.BitsPerSample[sampleIndex];\n }\n\n getArrayForSample(sampleIndex, size) {\n const format = this.getSampleFormat(sampleIndex);\n const bitsPerSample = this.getBitsPerSample(sampleIndex);\n return arrayForType(format, bitsPerSample, size);\n }\n\n /**\n * Returns the decoded strip or tile.\n * @param {Number} x the strip or tile x-offset\n * @param {Number} y the tile y-offset (0 for stripped images)\n * @param {Number} sample the sample to get for separated samples\n * @param {import(\"./geotiff\").Pool|import(\"./geotiff\").BaseDecoder} poolOrDecoder the decoder or decoder pool\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise.<ArrayBuffer>}\n */\n async getTileOrStrip(x, y, sample, poolOrDecoder, signal) {\n const numTilesPerRow = Math.ceil(this.getWidth() / this.getTileWidth());\n const numTilesPerCol = Math.ceil(this.getHeight() / this.getTileHeight());\n let index;\n const { tiles } = this;\n if (this.planarConfiguration === 1) {\n index = (y * numTilesPerRow) + x;\n } else if (this.planarConfiguration === 2) {\n index = (sample * numTilesPerRow * numTilesPerCol) + (y * numTilesPerRow) + x;\n }\n\n let offset;\n let byteCount;\n if (this.isTiled) {\n offset = this.fileDirectory.TileOffsets[index];\n byteCount = this.fileDirectory.TileByteCounts[index];\n } else {\n offset = this.fileDirectory.StripOffsets[index];\n byteCount = this.fileDirectory.StripByteCounts[index];\n }\n const slice = (await this.source.fetch([{ offset, length: byteCount }], signal))[0];\n\n let request;\n if (tiles === null || !tiles[index]) {\n // resolve each request by potentially applying array normalization\n request = (async () => {\n let data = await poolOrDecoder.decode(this.fileDirectory, slice);\n const sampleFormat = this.getSampleFormat();\n const bitsPerSample = this.getBitsPerSample();\n if (needsNormalization(sampleFormat, bitsPerSample)) {\n data = normalizeArray(\n data,\n sampleFormat,\n this.planarConfiguration,\n this.getSamplesPerPixel(),\n bitsPerSample,\n this.getTileWidth(),\n this.getBlockHeight(y),\n );\n }\n return data;\n })();\n\n // set the cache\n if (tiles !== null) {\n tiles[index] = request;\n }\n } else {\n // get from the cache\n request = tiles[index];\n }\n\n // cache the tile request\n return { x, y, sample, data: await request };\n }\n\n /**\n * Internal read function.\n * @private\n * @param {Array} imageWindow The image window in pixel coordinates\n * @param {Array} samples The selected samples (0-based indices)\n * @param {TypedArray|TypedArray[]} valueArrays The array(s) to write into\n * @param {Boolean} interleave Whether or not to write in an interleaved manner\n * @param {import(\"./geotiff\").Pool|AbstractDecoder} poolOrDecoder the decoder or decoder pool\n * @param {number} width the width of window to be read into\n * @param {number} height the height of window to be read into\n * @param {number} resampleMethod the resampling method to be used when interpolating\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<ReadRasterResult>}\n */\n async _readRaster(imageWindow, samples, valueArrays, interleave, poolOrDecoder, width,\n height, resampleMethod, signal) {\n const tileWidth = this.getTileWidth();\n const tileHeight = this.getTileHeight();\n const imageWidth = this.getWidth();\n const imageHeight = this.getHeight();\n\n const minXTile = Math.max(Math.floor(imageWindow[0] / tileWidth), 0);\n const maxXTile = Math.min(\n Math.ceil(imageWindow[2] / tileWidth),\n Math.ceil(imageWidth / tileWidth),\n );\n const minYTile = Math.max(Math.floor(imageWindow[1] / tileHeight), 0);\n const maxYTile = Math.min(\n Math.ceil(imageWindow[3] / tileHeight),\n Math.ceil(imageHeight / tileHeight),\n );\n const windowWidth = imageWindow[2] - imageWindow[0];\n\n let bytesPerPixel = this.getBytesPerPixel();\n\n const srcSampleOffsets = [];\n const sampleReaders = [];\n for (let i = 0; i < samples.length; ++i) {\n if (this.planarConfiguration === 1) {\n srcSampleOffsets.push(sum(this.fileDirectory.BitsPerSample, 0, samples[i]) / 8);\n } else {\n srcSampleOffsets.push(0);\n }\n sampleReaders.push(this.getReaderForSample(samples[i]));\n }\n\n const promises = [];\n const { littleEndian } = this;\n\n for (let yTile = minYTile; yTile < maxYTile; ++yTile) {\n for (let xTile = minXTile; xTile < maxXTile; ++xTile) {\n let getPromise;\n if (this.planarConfiguration === 1) {\n getPromise = this.getTileOrStrip(xTile, yTile, 0, poolOrDecoder, signal);\n }\n for (let sampleIndex = 0; sampleIndex < samples.length; ++sampleIndex) {\n const si = sampleIndex;\n const sample = samples[sampleIndex];\n if (this.planarConfiguration === 2) {\n bytesPerPixel = this.getSampleByteSize(sample);\n getPromise = this.getTileOrStrip(xTile, yTile, sample, poolOrDecoder, signal);\n }\n const promise = getPromise.then((tile) => {\n const buffer = tile.data;\n const dataView = new DataView(buffer);\n const blockHeight = this.getBlockHeight(tile.y);\n const firstLine = tile.y * tileHeight;\n const firstCol = tile.x * tileWidth;\n const lastLine = firstLine + blockHeight;\n const lastCol = (tile.x + 1) * tileWidth;\n const reader = sampleReaders[si];\n\n const ymax = Math.min(blockHeight, blockHeight - (lastLine - imageWindow[3]), imageHeight - firstLine);\n const xmax = Math.min(tileWidth, tileWidth - (lastCol - imageWindow[2]), imageWidth - firstCol);\n\n for (let y = Math.max(0, imageWindow[1] - firstLine); y < ymax; ++y) {\n for (let x = Math.max(0, imageWindow[0] - firstCol); x < xmax; ++x) {\n const pixelOffset = ((y * tileWidth) + x) * bytesPerPixel;\n const value = reader.call(\n dataView, pixelOffset + srcSampleOffsets[si], littleEndian,\n );\n let windowCoordinate;\n if (interleave) {\n windowCoordinate = ((y + firstLine - imageWindow[1]) * windowWidth * samples.length)\n + ((x + firstCol - imageWindow[0]) * samples.length)\n + si;\n valueArrays[windowCoordinate] = value;\n } else {\n windowCoordinate = (\n (y + firstLine - imageWindow[1]) * windowWidth\n ) + x + firstCol - imageWindow[0];\n valueArrays[si][windowCoordinate] = value;\n }\n }\n }\n });\n promises.push(promise);\n }\n }\n }\n await Promise.all(promises);\n\n if ((width && (imageWindow[2] - imageWindow[0]) !== width)\n || (height && (imageWindow[3] - imageWindow[1]) !== height)) {\n let resampled;\n if (interleave) {\n resampled = resampleInterleaved(\n valueArrays,\n imageWindow[2] - imageWindow[0],\n imageWindow[3] - imageWindow[1],\n width, height,\n samples.length,\n resampleMethod,\n );\n } else {\n resampled = resample(\n valueArrays,\n imageWindow[2] - imageWindow[0],\n imageWindow[3] - imageWindow[1],\n width, height,\n resampleMethod,\n );\n }\n resampled.width = width;\n resampled.height = height;\n return resampled;\n }\n\n valueArrays.width = width || imageWindow[2] - imageWindow[0];\n valueArrays.height = height || imageWindow[3] - imageWindow[1];\n\n return valueArrays;\n }\n\n /**\n * Reads raster data from the image. This function reads all selected samples\n * into separate arrays of the correct type for that sample or into a single\n * combined array when `interleave` is set. When provided, only a subset\n * of the raster is read for each sample.\n *\n * @param {ReadRasterOptions} [options={}] optional parameters\n * @returns {Promise<ReadRasterResult>} the decoded arrays as a promise\n */\n async readRasters({\n window: wnd, samples = [], interleave, pool = null,\n width, height, resampleMethod, fillValue, signal,\n } = {}) {\n const imageWindow = wnd || [0, 0, this.getWidth(), this.getHeight()];\n\n // check parameters\n if (imageWindow[0] > imageWindow[2] || imageWindow[1] > imageWindow[3]) {\n throw new Error('Invalid subsets');\n }\n\n const imageWindowWidth = imageWindow[2] - imageWindow[0];\n const imageWindowHeight = imageWindow[3] - imageWindow[1];\n const numPixels = imageWindowWidth * imageWindowHeight;\n const samplesPerPixel = this.getSamplesPerPixel();\n\n if (!samples || !samples.length) {\n for (let i = 0; i < samplesPerPixel; ++i) {\n samples.push(i);\n }\n } else {\n for (let i = 0; i < samples.length; ++i) {\n if (samples[i] >= samplesPerPixel) {\n return Promise.reject(new RangeError(`Invalid sample index '${samples[i]}'.`));\n }\n }\n }\n let valueArrays;\n if (interleave) {\n const format = this.fileDirectory.SampleFormat\n ? Math.max.apply(null, this.fileDirectory.SampleFormat) : 1;\n const bitsPerSample = Math.max.apply(null, this.fileDirectory.BitsPerSample);\n valueArrays = arrayForType(format, bitsPerSample, numPixels * samples.length);\n if (fillValue) {\n valueArrays.fill(fillValue);\n }\n } else {\n valueArrays = [];\n for (let i = 0; i < samples.length; ++i) {\n const valueArray = this.getArrayForSample(samples[i], numPixels);\n if (Array.isArray(fillValue) && i < fillValue.length) {\n valueArray.fill(fillValue[i]);\n } else if (fillValue && !Array.isArray(fillValue)) {\n valueArray.fill(fillValue);\n }\n valueArrays.push(valueArray);\n }\n }\n\n const poolOrDecoder = pool || await getDecoder(this.fileDirectory);\n\n const result = await this._readRaster(\n imageWindow, samples, valueArrays, interleave, poolOrDecoder, width, height, resampleMethod, signal,\n );\n return result;\n }\n\n /**\n * Reads raster data from the image as RGB. The result is always an\n * interleaved typed array.\n * Colorspaces other than RGB will be transformed to RGB, color maps expanded.\n * When no other method is applicable, the first sample is used to produce a\n * grayscale image.\n * When provided, only a subset of the raster is read for each sample.\n *\n * @param {Object} [options] optional parameters\n * @param {Array<number>} [options.window] the subset to read data from in pixels.\n * @param {boolean} [options.interleave=true] whether the data shall be read\n * in one single array or separate\n * arrays.\n * @param {import(\"./geotiff\").Pool} [options.pool=null] The optional decoder pool to use.\n * @param {number} [options.width] The desired width of the output. When the width is no the\n * same as the images, resampling will be performed.\n * @param {number} [options.height] The desired height of the output. When the width is no the\n * same as the images, resampling will be performed.\n * @param {string} [options.resampleMethod='nearest'] The desired resampling method.\n * @param {boolean} [options.enableAlpha=false] Enable reading alpha channel if present.\n * @param {AbortSignal} [options.signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<ReadRasterResult>} the RGB array as a Promise\n */\n async readRGB({ window, interleave = true, pool = null, width, height,\n resampleMethod, enableAlpha = false, signal } = {}) {\n const imageWindow = window || [0, 0, this.getWidth(), this.getHeight()];\n\n // check parameters\n if (imageWindow[0] > imageWindow[2] || imageWindow[1] > imageWindow[3]) {\n throw new Error('Invalid subsets');\n }\n\n const pi = this.fileDirectory.PhotometricInterpretation;\n\n if (pi === photometricInterpretations.RGB) {\n let s = [0, 1, 2];\n if ((!(this.fileDirectory.ExtraSamples === ExtraSamplesValues.Unspecified)) && enableAlpha) {\n s = [];\n for (let i = 0; i < this.fileDirectory.BitsPerSample.length; i += 1) {\n s.push(i);\n }\n }\n return this.readRasters({\n window,\n interleave,\n samples: s,\n pool,\n width,\n height,\n resampleMethod,\n signal,\n });\n }\n\n let samples;\n switch (pi) {\n case photometricInterpretations.WhiteIsZero:\n case photometricInterpretations.BlackIsZero:\n case photometricInterpretations.Palette:\n samples = [0];\n break;\n case photometricInterpretations.CMYK:\n samples = [0, 1, 2, 3];\n break;\n case photometricInterpretations.YCbCr:\n case photometricInterpretations.CIELab:\n samples = [0, 1, 2];\n break;\n default:\n throw new Error('Invalid or unsupported photometric interpretation.');\n }\n\n const subOptions = {\n window: imageWindow,\n interleave: true,\n samples,\n pool,\n width,\n height,\n resampleMethod,\n signal,\n };\n const { fileDirectory } = this;\n const raster = await this.readRasters(subOptions);\n\n const max = 2 ** this.fileDirectory.BitsPerSample[0];\n let data;\n switch (pi) {\n case photometricInterpretations.WhiteIsZero:\n data = fromWhiteIsZero(raster, max);\n break;\n case photometricInterpretations.BlackIsZero:\n data = fromBlackIsZero(raster, max);\n break;\n case photometricInterpretations.Palette:\n data = fromPalette(raster, fileDirectory.ColorMap);\n break;\n case photometricInterpretations.CMYK:\n data = fromCMYK(raster);\n break;\n case photometricInterpretations.YCbCr:\n data = fromYCbCr(raster);\n break;\n case photometricInterpretations.CIELab:\n data = fromCIELab(raster);\n break;\n default:\n throw new Error('Unsupported photometric interpretation.');\n }\n\n // if non-interleaved data is requested, we must split the channels\n // into their respective arrays\n if (!interleave) {\n const red = new Uint8Array(data.length / 3);\n const green = new Uint8Array(data.length / 3);\n const blue = new Uint8Array(data.length / 3);\n for (let i = 0, j = 0; i < data.length; i += 3, ++j) {\n red[j] = data[i];\n green[j] = data[i + 1];\n blue[j] = data[i + 2];\n }\n data = [red, green, blue];\n }\n\n data.width = raster.width;\n data.height = raster.height;\n return data;\n }\n\n /**\n * Returns an array of tiepoints.\n * @returns {Object[]}\n */\n getTiePoints() {\n if (!this.fileDirectory.ModelTiepoint) {\n return [];\n }\n\n const tiePoints = [];\n for (let i = 0; i < this.fileDirectory.ModelTiepoint.length; i += 6) {\n tiePoints.push({\n i: this.fileDirectory.ModelTiepoint[i],\n j: this.fileDirectory.ModelTiepoint[i + 1],\n k: this.fileDirectory.ModelTiepoint[i + 2],\n x: this.fileDirectory.ModelTiepoint[i + 3],\n y: this.fileDirectory.ModelTiepoint[i + 4],\n z: this.fileDirectory.ModelTiepoint[i + 5],\n });\n }\n return tiePoints;\n }\n\n /**\n * Returns the parsed GDAL metadata items.\n *\n * If sample is passed to null, dataset-level metadata will be returned.\n * Otherwise only metadata specific to the provided sample will be returned.\n *\n * @param {number} [sample=null] The sample index.\n * @returns {Object}\n */\n getGDALMetadata(sample = null) {\n const metadata = {};\n if (!this.fileDirectory.GDAL_METADATA) {\n return null;\n }\n const string = this.fileDirectory.GDAL_METADATA;\n\n let items = findTagsByName(string, 'Item');\n\n if (sample === null) {\n items = items.filter((item) => getAttribute(item, 'sample') === undefined);\n } else {\n items = items.filter((item) => Number(getAttribute(item, 'sample')) === sample);\n }\n\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n metadata[getAttribute(item, 'name')] = item.inner;\n }\n return metadata;\n }\n\n /**\n * Returns the GDAL nodata value\n * @returns {number|null}\n */\n getGDALNoData() {\n if (!this.fileDirectory.GDAL_NODATA) {\n return null;\n }\n const string = this.fileDirectory.GDAL_NODATA;\n return Number(string.substring(0, string.length - 1));\n }\n\n /**\n * Returns the image origin as a XYZ-vector. When the image has no affine\n * transformation, then an exception is thrown.\n * @returns {Array<number>} The origin as a vector\n */\n getOrigin() {\n const tiePoints = this.fileDirectory.ModelTiepoint;\n const modelTransformation = this.fileDirectory.ModelTransformation;\n if (tiePoints && tiePoints.length === 6) {\n return [\n tiePoints[3],\n tiePoints[4],\n tiePoints[5],\n ];\n }\n if (modelTransformation) {\n return [\n modelTransformation[3],\n modelTransformation[7],\n modelTransformation[11],\n ];\n }\n throw new Error('The image does not have an affine transformation.');\n }\n\n /**\n * Returns the image resolution as a XYZ-vector. When the image has no affine\n * transformation, then an exception is thrown.\n * @param {GeoTIFFImage} [referenceImage=null] A reference image to calculate the resolution from\n * in cases when the current image does not have the\n * required tags on its own.\n * @returns {Array<number>} The resolution as a vector\n */\n getResolution(referenceImage = null) {\n const modelPixelScale = this.fileDirectory.ModelPixelScale;\n const modelTransformation = this.fileDirectory.ModelTransformation;\n\n if (modelPixelScale) {\n return [\n modelPixelScale[0],\n -modelPixelScale[1],\n modelPixelScale[2],\n ];\n }\n if (modelTransformation) {\n if (modelTransformation[1] === 0 && modelTransformation[4] === 0) {\n return [\n modelTransformation[0],\n -modelTransformation[5],\n modelTransformation[10],\n ];\n }\n return [\n Math.sqrt((modelTransformation[0] * modelTransformation[0])\n + (modelTransformation[4] * modelTransformation[4])),\n -Math.sqrt((modelTransformation[1] * modelTransformation[1])\n + (modelTransformation[5] * modelTransformation[5])),\n modelTransformation[10]];\n }\n\n if (referenceImage) {\n const [refResX, refResY, refResZ] = referenceImage.getResolution();\n return [\n refResX * referenceImage.getWidth() / this.getWidth(),\n refResY * referenceImage.getHeight() / this.getHeight(),\n refResZ * referenceImage.getWidth() / this.getWidth(),\n ];\n }\n\n throw new Error('The image does not have an affine transformation.');\n }\n\n /**\n * Returns whether or not the pixels of the image depict an area (or point).\n * @returns {Boolean} Whether the pixels are a point\n */\n pixelIsArea() {\n return this.geoKeys.GTRasterTypeGeoKey === 1;\n }\n\n /**\n * Returns the image bounding box as an array of 4 values: min-x, min-y,\n * max-x and max-y. When the image has no affine transformation, then an\n * exception is thrown.\n * @param {boolean} [tilegrid=false] If true return extent for a tilegrid\n * without adjustment for ModelTransformation.\n * @returns {Array<number>} The bounding box\n */\n getBoundingBox(tilegrid = false) {\n const height = this.getHeight();\n const width = this.getWidth();\n\n if (this.fileDirectory.ModelTransformation && !tilegrid) {\n // eslint-disable-next-line no-unused-vars\n const [a, b, c, d, e, f, g, h] = this.fileDirectory.ModelTransformation;\n\n const corners = [\n [0, 0],\n [0, height],\n [width, 0],\n [width, height],\n ];\n\n const projected = corners.map(([I, J]) => [\n d + (a * I) + (b * J),\n h + (e * I) + (f * J),\n ]);\n\n const xs = projected.map((pt) => pt[0]);\n const ys = projected.map((pt) => pt[1]);\n\n return [\n Math.min(...xs),\n Math.min(...ys),\n Math.max(...xs),\n Math.max(...ys),\n ];\n } else {\n const origin = this.getOrigin();\n const resolution = this.getResolution();\n\n const x1 = origin[0];\n const y1 = origin[1];\n\n const x2 = x1 + (resolution[0] * width);\n const y2 = y1 + (resolution[1] * height);\n\n return [\n Math.min(x1, x2),\n Math.min(y1, y2),\n Math.max(x1, x2),\n Math.max(y1, y2),\n ];\n }\n }\n}\n\nexport default GeoTIFFImage;\n","import { getFloat16 } from '@petamoriken/float16';\n\nexport default class DataView64 {\n constructor(arrayBuffer) {\n this._dataView = new DataView(arrayBuffer);\n }\n\n get buffer() {\n return this._dataView.buffer;\n }\n\n getUint64(offset, littleEndian) {\n const left = this.getUint32(offset, littleEndian);\n const right = this.getUint32(offset + 4, littleEndian);\n let combined;\n if (littleEndian) {\n combined = left + ((2 ** 32) * right);\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n return combined;\n }\n combined = ((2 ** 32) * left) + right;\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n\n return combined;\n }\n\n // adapted from https://stackoverflow.com/a/55338384/8060591\n getInt64(offset, littleEndian) {\n let value = 0;\n const isNegative = (this._dataView.getUint8(offset + (littleEndian ? 7 : 0)) & 0x80) > 0;\n let carrying = true;\n for (let i = 0; i < 8; i++) {\n let byte = this._dataView.getUint8(offset + (littleEndian ? i : 7 - i));\n if (isNegative) {\n if (carrying) {\n if (byte !== 0x00) {\n byte = ~(byte - 1) & 0xff;\n carrying = false;\n }\n } else {\n byte = ~byte & 0xff;\n }\n }\n value += byte * (256 ** i);\n }\n if (isNegative) {\n value = -value;\n }\n return value;\n }\n\n getUint8(offset, littleEndian) {\n return this._dataView.getUint8(offset, littleEndian);\n }\n\n getInt8(offset, littleEndian) {\n return this._dataView.getInt8(offset, littleEndian);\n }\n\n getUint16(offset, littleEndian) {\n return this._dataView.getUint16(offset, littleEndian);\n }\n\n getInt16(offset, littleEndian) {\n return this._dataView.getInt16(offset, littleEndian);\n }\n\n getUint32(offset, littleEndian) {\n return this._dataView.getUint32(offset, littleEndian);\n }\n\n getInt32(offset, littleEndian) {\n return this._dataView.getInt32(offset, littleEndian);\n }\n\n getFloat16(offset, littleEndian) {\n return getFloat16(this._dataView, offset, littleEndian);\n }\n\n getFloat32(offset, littleEndian) {\n return this._dataView.getFloat32(offset, littleEndian);\n }\n\n getFloat64(offset, littleEndian) {\n return this._dataView.getFloat64(offset, littleEndian);\n }\n}\n","export default class DataSlice {\n constructor(arrayBuffer, sliceOffset, littleEndian, bigTiff) {\n this._dataView = new DataView(arrayBuffer);\n this._sliceOffset = sliceOffset;\n this._littleEndian = littleEndian;\n this._bigTiff = bigTiff;\n }\n\n get sliceOffset() {\n return this._sliceOffset;\n }\n\n get sliceTop() {\n return this._sliceOffset + this.buffer.byteLength;\n }\n\n get littleEndian() {\n return this._littleEndian;\n }\n\n get bigTiff() {\n return this._bigTiff;\n }\n\n get buffer() {\n return this._dataView.buffer;\n }\n\n covers(offset, length) {\n return this.sliceOffset <= offset && this.sliceTop >= offset + length;\n }\n\n readUint8(offset) {\n return this._dataView.getUint8(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readInt8(offset) {\n return this._dataView.getInt8(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readUint16(offset) {\n return this._dataView.getUint16(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readInt16(offset) {\n return this._dataView.getInt16(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readUint32(offset) {\n return this._dataView.getUint32(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readInt32(offset) {\n return this._dataView.getInt32(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readFloat32(offset) {\n return this._dataView.getFloat32(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readFloat64(offset) {\n return this._dataView.getFloat64(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readUint64(offset) {\n const left = this.readUint32(offset);\n const right = this.readUint32(offset + 4);\n let combined;\n if (this._littleEndian) {\n combined = left + ((2 ** 32) * right);\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n return combined;\n }\n combined = ((2 ** 32) * left) + right;\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n\n return combined;\n }\n\n // adapted from https://stackoverflow.com/a/55338384/8060591\n readInt64(offset) {\n let value = 0;\n const isNegative = (this._dataView.getUint8(offset + (this._littleEndian ? 7 : 0)) & 0x80)\n > 0;\n let carrying = true;\n for (let i = 0; i < 8; i++) {\n let byte = this._dataView.getUint8(\n offset + (this._littleEndian ? i : 7 - i),\n );\n if (isNegative) {\n if (carrying) {\n if (byte !== 0x00) {\n byte = ~(byte - 1) & 0xff;\n carrying = false;\n }\n } else {\n byte = ~byte & 0xff;\n }\n }\n value += byte * (256 ** i);\n }\n if (isNegative) {\n value = -value;\n }\n return value;\n }\n\n readOffset(offset) {\n if (this._bigTiff) {\n return this.readUint64(offset);\n }\n return this.readUint32(offset);\n }\n}\n","import { getDecoder } from './compression/index.js';\n\nconst defaultPoolSize = typeof navigator !== 'undefined' ? (navigator.hardwareConcurrency || 2) : 2;\n\n/**\n * @module pool\n */\n\n/**\n * Pool for workers to decode chunks of the images.\n */\nclass Pool {\n /**\n * @constructor\n * @param {Number} [size] The size of the pool. Defaults to the number of CPUs\n * available. When this parameter is `null` or 0, then the\n * decoding will be done in the main thread.\n * @param {function(): Worker} [createWorker] A function that creates the decoder worker.\n * Defaults to a worker with all decoders that ship with geotiff.js. The `createWorker()`\n * function is expected to return a `Worker` compatible with Web Workers. For code that\n * runs in Node, [web-worker](https://www.npmjs.com/package/web-worker) is a good choice.\n *\n * A worker that uses a custom lzw decoder would look like this `my-custom-worker.js` file:\n * ```js\n * import { addDecoder, getDecoder } from 'geotiff';\n * addDecoder(5, () => import ('./my-custom-lzw').then((m) => m.default));\n * self.addEventListener('message', async (e) => {\n * const { id, fileDirectory, buffer } = e.data;\n * const decoder = await getDecoder(fileDirectory);\n * const decoded = await decoder.decode(fileDirectory, buffer);\n * self.postMessage({ decoded, id }, [decoded]);\n * });\n * ```\n * The way the above code is built into a worker by the `createWorker()` function\n * depends on the used bundler. For most bundlers, something like this will work:\n * ```js\n * function createWorker() {\n * return new Worker(new URL('./my-custom-worker.js', import.meta.url));\n * }\n * ```\n */\n constructor(size = defaultPoolSize, createWorker) {\n this.workers = null;\n this._awaitingDecoder = null;\n this.size = size;\n this.messageId = 0;\n if (size) {\n this._awaitingDecoder = createWorker ? Promise.resolve(createWorker) : new Promise((resolve) => {\n import('./worker/decoder.js').then((module) => {\n resolve(module.create);\n });\n });\n this._awaitingDecoder.then((create) => {\n this._awaitingDecoder = null;\n this.workers = [];\n for (let i = 0; i < size; i++) {\n this.workers.push({ worker: create(), idle: true });\n }\n });\n }\n }\n\n /**\n * Decode the given block of bytes with the set compression method.\n * @param {ArrayBuffer} buffer the array buffer of bytes to decode.\n * @returns {Promise<ArrayBuffer>} the decoded result as a `Promise`\n */\n async decode(fileDirectory, buffer) {\n if (this._awaitingDecoder) {\n await this._awaitingDecoder;\n }\n return this.size === 0\n ? getDecoder(fileDirectory).then((decoder) => decoder.decode(fileDirectory, buffer))\n : new Promise((resolve) => {\n const worker = this.workers.find((candidate) => candidate.idle)\n || this.workers[Math.floor(Math.random() * this.size)];\n worker.idle = false;\n const id = this.messageId++;\n const onMessage = (e) => {\n if (e.data.id === id) {\n worker.idle = true;\n resolve(e.data.decoded);\n worker.worker.removeEventListener('message', onMessage);\n }\n };\n worker.worker.addEventListener('message', onMessage);\n worker.worker.postMessage({ fileDirectory, buffer, id }, [buffer]);\n });\n }\n\n destroy() {\n if (this.workers) {\n this.workers.forEach((worker) => {\n worker.worker.terminate();\n });\n this.workers = null;\n }\n }\n}\n\nexport default Pool;\n","const CRLFCRLF = '\\r\\n\\r\\n';\n\n/*\n * Shim for 'Object.fromEntries'\n */\nfunction itemsToObject(items) {\n if (typeof Object.fromEntries !== 'undefined') {\n return Object.fromEntries(items);\n }\n const obj = {};\n for (const [key, value] of items) {\n obj[key.toLowerCase()] = value;\n }\n return obj;\n}\n\n/**\n * Parse HTTP headers from a given string.\n * @param {String} text the text to parse the headers from\n * @returns {Object} the parsed headers with lowercase keys\n */\nfunction parseHeaders(text) {\n const items = text\n .split('\\r\\n')\n .map((line) => {\n const kv = line.split(':').map((str) => str.trim());\n kv[0] = kv[0].toLowerCase();\n return kv;\n });\n\n return itemsToObject(items);\n}\n\n/**\n * Parse a 'Content-Type' header value to the content-type and parameters\n * @param {String} rawContentType the raw string to parse from\n * @returns {Object} the parsed content type with the fields: type and params\n */\nexport function parseContentType(rawContentType) {\n const [type, ...rawParams] = rawContentType.split(';').map((s) => s.trim());\n const paramsItems = rawParams.map((param) => param.split('='));\n return { type, params: itemsToObject(paramsItems) };\n}\n\n/**\n * Parse a 'Content-Range' header value to its start, end, and total parts\n * @param {String} rawContentRange the raw string to parse from\n * @returns {Object} the parsed parts\n */\nexport function parseContentRange(rawContentRange) {\n let start;\n let end;\n let total;\n\n if (rawContentRange) {\n [, start, end, total] = rawContentRange.match(/bytes (\\d+)-(\\d+)\\/(\\d+)/);\n start = parseInt(start, 10);\n end = parseInt(end, 10);\n total = parseInt(total, 10);\n }\n\n return { start, end, total };\n}\n\n/**\n * Parses a list of byteranges from the given 'multipart/byteranges' HTTP response.\n * Each item in the list has the following properties:\n * - headers: the HTTP headers\n * - data: the sliced ArrayBuffer for that specific part\n * - offset: the offset of the byterange within its originating file\n * - length: the length of the byterange\n * @param {ArrayBuffer} responseArrayBuffer the response to be parsed and split\n * @param {String} boundary the boundary string used to split the sections\n * @returns {Object[]} the parsed byteranges\n */\nexport function parseByteRanges(responseArrayBuffer, boundary) {\n let offset = null;\n const decoder = new TextDecoder('ascii');\n const out = [];\n\n const startBoundary = `--${boundary}`;\n const endBoundary = `${startBoundary}--`;\n\n // search for the initial boundary, may be offset by some bytes\n // TODO: more efficient to check for `--` in bytes directly\n for (let i = 0; i < 10; ++i) {\n const text = decoder.decode(\n new Uint8Array(responseArrayBuffer, i, startBoundary.length),\n );\n if (text === startBoundary) {\n offset = i;\n }\n }\n\n if (offset === null) {\n throw new Error('Could not find initial boundary');\n }\n\n while (offset < responseArrayBuffer.byteLength) {\n const text = decoder.decode(\n new Uint8Array(responseArrayBuffer, offset,\n Math.min(startBoundary.length + 1024, responseArrayBuffer.byteLength - offset),\n ),\n );\n\n // break if we arrived at the end\n if (text.length === 0 || text.startsWith(endBoundary)) {\n break;\n }\n\n // assert that we are actually dealing with a byterange and are at the correct offset\n if (!text.startsWith(startBoundary)) {\n throw new Error('Part does not start with boundary');\n }\n\n // get a substring from where we read the headers\n const innerText = text.substr(startBoundary.length + 2);\n\n if (innerText.length === 0) {\n break;\n }\n\n // find the double linebreak that denotes the end of the headers\n const endOfHeaders = innerText.indexOf(CRLFCRLF);\n\n // parse the headers to get the content range size\n const headers = parseHeaders(innerText.substr(0, endOfHeaders));\n const { start, end, total } = parseContentRange(headers['content-range']);\n\n // calculate the length of the slice and the next offset\n const startOfData = offset + startBoundary.length + endOfHeaders + CRLFCRLF.length;\n const length = parseInt(end, 10) + 1 - parseInt(start, 10);\n out.push({\n headers,\n data: responseArrayBuffer.slice(startOfData, startOfData + length),\n offset: start,\n length,\n fileSize: total,\n });\n\n offset = startOfData + length + 4;\n }\n\n return out;\n}\n","/**\n * @typedef Slice\n * @property {number} offset\n * @property {number} length\n */\n\nexport class BaseSource {\n /**\n *\n * @param {Slice[]} slices\n * @returns {ArrayBuffer[]}\n */\n async fetch(slices, signal = undefined) {\n return Promise.all(\n slices.map((slice) => this.fetchSlice(slice, signal)),\n );\n }\n\n /**\n *\n * @param {Slice} slice\n * @returns {ArrayBuffer}\n */\n async fetchSlice(slice) {\n throw new Error(`fetching of slice ${slice} not possible, not implemented`);\n }\n\n /**\n * Returns the filesize if already determined and null otherwise\n */\n get fileSize() {\n return null;\n }\n\n async close() {\n // no-op by default\n }\n}\n","export default class QuickLRU extends Map {\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tif (typeof options.maxAge === 'number' && options.maxAge === 0) {\n\t\t\tthrow new TypeError('`maxAge` must be a number greater than 0');\n\t\t}\n\n\t\t// TODO: Use private class fields when ESLint supports them.\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.maxAge = options.maxAge || Number.POSITIVE_INFINITY;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t// TODO: Use private class methods when targeting Node.js 16.\n\t_emitEvictions(cache) {\n\t\tif (typeof this.onEviction !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [key, item] of cache) {\n\t\t\tthis.onEviction(key, item.value);\n\t\t}\n\t}\n\n\t_deleteIfExpired(key, item) {\n\t\tif (typeof item.expiry === 'number' && item.expiry <= Date.now()) {\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tthis.onEviction(key, item.value);\n\t\t\t}\n\n\t\t\treturn this.delete(key);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t_getOrDeleteIfExpired(key, item) {\n\t\tconst deleted = this._deleteIfExpired(key, item);\n\t\tif (deleted === false) {\n\t\t\treturn item.value;\n\t\t}\n\t}\n\n\t_getItemValue(key, item) {\n\t\treturn item.expiry ? this._getOrDeleteIfExpired(key, item) : item.value;\n\t}\n\n\t_peek(key, cache) {\n\t\tconst item = cache.get(key);\n\n\t\treturn this._getItemValue(key, item);\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\t\t\tthis._emitEvictions(this.oldCache);\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\t_moveToRecent(key, item) {\n\t\tthis.oldCache.delete(key);\n\t\tthis._set(key, item);\n\t}\n\n\t* _entriesAscending() {\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\tconst item = this.cache.get(key);\n\n\t\t\treturn this._getItemValue(key, item);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst item = this.oldCache.get(key);\n\t\t\tif (this._deleteIfExpired(key, item) === false) {\n\t\t\t\tthis._moveToRecent(key, item);\n\t\t\t\treturn item.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(key, value, {maxAge = this.maxAge} = {}) {\n\t\tconst expiry =\n\t\t\ttypeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY ?\n\t\t\t\tDate.now() + maxAge :\n\t\t\t\tundefined;\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, {\n\t\t\t\tvalue,\n\t\t\t\texpiry\n\t\t\t});\n\t\t} else {\n\t\t\tthis._set(key, {value, expiry});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.cache.get(key));\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.oldCache.get(key));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this._peek(key, this.cache);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this._peek(key, this.oldCache);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\tresize(newSize) {\n\t\tif (!(newSize && newSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tconst items = [...this._entriesAscending()];\n\t\tconst removeCount = items.length - newSize;\n\t\tif (removeCount < 0) {\n\t\t\tthis.cache = new Map(items);\n\t\t\tthis.oldCache = new Map();\n\t\t\tthis._size = items.length;\n\t\t} else {\n\t\t\tif (removeCount > 0) {\n\t\t\t\tthis._emitEvictions(items.slice(0, removeCount));\n\t\t\t}\n\n\t\t\tthis.oldCache = new Map(items.slice(removeCount));\n\t\t\tthis.cache = new Map();\n\t\t\tthis._size = 0;\n\t\t}\n\n\t\tthis.maxSize = newSize;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesDescending() {\n\t\tlet items = [...this.cache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\titems = [...this.oldCache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesAscending() {\n\t\tfor (const [key, value] of this._entriesAscending()) {\n\t\t\tyield [key, value.value];\n\t\t}\n\t}\n\n\tget size() {\n\t\tif (!this._size) {\n\t\t\treturn this.oldCache.size;\n\t\t}\n\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n\n\tentries() {\n\t\treturn this.entriesAscending();\n\t}\n\n\tforEach(callbackFunction, thisArgument = this) {\n\t\tfor (const [key, value] of this.entriesAscending()) {\n\t\t\tcallbackFunction.call(thisArgument, value, key, this);\n\t\t}\n\t}\n\n\tget [Symbol.toStringTag]() {\n\t\treturn JSON.stringify([...this.entriesAscending()]);\n\t}\n}\n","export function assign(target, source) {\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n }\n}\n\nexport function chunk(iterable, length) {\n const results = [];\n const lengthOfIterable = iterable.length;\n for (let i = 0; i < lengthOfIterable; i += length) {\n const chunked = [];\n for (let ci = i; ci < i + length; ci++) {\n chunked.push(iterable[ci]);\n }\n results.push(chunked);\n }\n return results;\n}\n\nexport function endsWith(string, expectedEnding) {\n if (string.length < expectedEnding.length) {\n return false;\n }\n const actualEnding = string.substr(string.length - expectedEnding.length);\n return actualEnding === expectedEnding;\n}\n\nexport function forEach(iterable, func) {\n const { length } = iterable;\n for (let i = 0; i < length; i++) {\n func(iterable[i], i);\n }\n}\n\nexport function invert(oldObj) {\n const newObj = {};\n for (const key in oldObj) {\n if (oldObj.hasOwnProperty(key)) {\n const value = oldObj[key];\n newObj[value] = key;\n }\n }\n return newObj;\n}\n\nexport function range(n) {\n const results = [];\n for (let i = 0; i < n; i++) {\n results.push(i);\n }\n return results;\n}\n\nexport function times(numTimes, func) {\n const results = [];\n for (let i = 0; i < numTimes; i++) {\n results.push(func(i));\n }\n return results;\n}\n\nexport function toArray(iterable) {\n const results = [];\n const { length } = iterable;\n for (let i = 0; i < length; i++) {\n results.push(iterable[i]);\n }\n return results;\n}\n\nexport function toArrayRecursively(input) {\n if (input.length) {\n return toArray(input).map(toArrayRecursively);\n }\n return input;\n}\n\n// copied from https://github.com/academia-de-codigo/parse-content-range-header/blob/master/index.js\nexport function parseContentRange(headerValue) {\n if (!headerValue) {\n return null;\n }\n\n if (typeof headerValue !== 'string') {\n throw new Error('invalid argument');\n }\n\n const parseInt = (number) => Number.parseInt(number, 10);\n\n // Check for presence of unit\n let matches = headerValue.match(/^(\\w*) /);\n const unit = matches && matches[1];\n\n // check for start-end/size header format\n matches = headerValue.match(/(\\d+)-(\\d+)\\/(\\d+|\\*)/);\n if (matches) {\n return {\n unit,\n first: parseInt(matches[1]),\n last: parseInt(matches[2]),\n length: matches[3] === '*' ? null : parseInt(matches[3]),\n };\n }\n\n // check for size header format\n matches = headerValue.match(/(\\d+|\\*)/);\n if (matches) {\n return {\n unit,\n first: null,\n last: null,\n length: matches[1] === '*' ? null : parseInt(matches[1]),\n };\n }\n\n return null;\n}\n\n/*\n * Promisified wrapper around 'setTimeout' to allow 'await'\n */\nexport async function wait(milliseconds) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\nexport function zip(a, b) {\n const A = Array.isArray(a) ? a : Array.from(a);\n const B = Array.isArray(b) ? b : Array.from(b);\n return A.map((k, i) => [k, B[i]]);\n}\n\n// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\nexport class AbortError extends Error {\n constructor(params) {\n // Pass remaining arguments (including vendor specific ones) to parent constructor\n super(params);\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AbortError);\n }\n\n this.name = 'AbortError';\n }\n}\n\nexport class CustomAggregateError extends Error {\n constructor(errors, message) {\n super(message);\n this.errors = errors;\n this.message = message;\n this.name = 'AggregateError';\n }\n}\n\nexport const AggregateError = CustomAggregateError;\n","import QuickLRU from 'quick-lru';\nimport { BaseSource } from './basesource.js';\nimport { AbortError, AggregateError, wait, zip } from '../utils.js';\n\nclass Block {\n /**\n *\n * @param {number} offset\n * @param {number} length\n * @param {ArrayBuffer} [data]\n */\n constructor(offset, length, data = null) {\n this.offset = offset;\n this.length = length;\n this.data = data;\n }\n\n /**\n * @returns {number} the top byte border\n */\n get top() {\n return this.offset + this.length;\n }\n}\n\nclass BlockGroup {\n /**\n *\n * @param {number} offset\n * @param {number} length\n * @param {number[]} blockIds\n */\n constructor(offset, length, blockIds) {\n this.offset = offset;\n this.length = length;\n this.blockIds = blockIds;\n }\n}\n\nexport class BlockedSource extends BaseSource {\n /**\n *\n * @param {BaseSource} source The underlying source that shall be blocked and cached\n * @param {object} options\n * @param {number} [options.blockSize]\n * @param {number} [options.cacheSize]\n */\n constructor(source, { blockSize = 65536, cacheSize = 100 } = {}) {\n super();\n this.source = source;\n this.blockSize = blockSize;\n\n this.blockCache = new QuickLRU({\n maxSize: cacheSize,\n onEviction: (blockId, block) => {\n this.evictedBlocks.set(blockId, block);\n },\n });\n\n /** @type {Map<number, Block>} */\n this.evictedBlocks = new Map();\n\n // mapping blockId -> Block instance\n this.blockRequests = new Map();\n\n // set of blockIds missing for the current requests\n this.blockIdsToFetch = new Set();\n\n this.abortedBlockIds = new Set();\n }\n\n get fileSize() {\n return this.source.fileSize;\n }\n\n /**\n *\n * @param {import(\"./basesource\").Slice[]} slices\n */\n async fetch(slices, signal) {\n const blockRequests = [];\n const missingBlockIds = [];\n const allBlockIds = [];\n this.evictedBlocks.clear();\n\n for (const { offset, length } of slices) {\n let top = offset + length;\n\n const { fileSize } = this;\n if (fileSize !== null) {\n top = Math.min(top, fileSize);\n }\n\n const firstBlockOffset = Math.floor(offset / this.blockSize) * this.blockSize;\n\n for (let current = firstBlockOffset; current < top; current += this.blockSize) {\n const blockId = Math.floor(current / this.blockSize);\n if (!this.blockCache.has(blockId) && !this.blockRequests.has(blockId)) {\n this.blockIdsToFetch.add(blockId);\n missingBlockIds.push(blockId);\n }\n if (this.blockRequests.has(blockId)) {\n blockRequests.push(this.blockRequests.get(blockId));\n }\n allBlockIds.push(blockId);\n }\n }\n\n // allow additional block requests to accumulate\n await wait();\n this.fetchBlocks(signal);\n\n // Gather all of the new requests that this fetch call is contributing to `fetch`.\n const missingRequests = [];\n for (const blockId of missingBlockIds) {\n // The requested missing block could already be in the cache\n // instead of having its request still be outstanding.\n if (this.blockRequests.has(blockId)) {\n missingRequests.push(this.blockRequests.get(blockId));\n }\n }\n\n // Actually await all pending requests that are needed for this `fetch`.\n await Promise.allSettled(blockRequests);\n await Promise.allSettled(missingRequests);\n\n // Perform retries if a block was interrupted by a previous signal\n const abortedBlockRequests = [];\n const abortedBlockIds = allBlockIds\n .filter((id) => this.abortedBlockIds.has(id) || !this.blockCache.has(id));\n abortedBlockIds.forEach((id) => this.blockIdsToFetch.add(id));\n // start the retry of some blocks if required\n if (abortedBlockIds.length > 0 && signal && !signal.aborted) {\n this.fetchBlocks(null);\n for (const blockId of abortedBlockIds) {\n const block = this.blockRequests.get(blockId);\n if (!block) {\n throw new Error(`Block ${blockId} is not in the block requests`);\n }\n abortedBlockRequests.push(block);\n }\n await Promise.allSettled(abortedBlockRequests);\n }\n\n // throw an abort error\n if (signal && signal.aborted) {\n throw new AbortError('Request was aborted');\n }\n\n const blocks = allBlockIds.map((id) => this.blockCache.get(id) || this.evictedBlocks.get(id));\n const failedBlocks = blocks.filter((i) => !i);\n if (failedBlocks.length) {\n throw new AggregateError(failedBlocks, 'Request failed');\n }\n\n // create a final Map, with all required blocks for this request to satisfy\n const requiredBlocks = new Map(zip(allBlockIds, blocks));\n\n // TODO: satisfy each slice\n return this.readSliceData(slices, requiredBlocks);\n }\n\n /**\n *\n * @param {AbortSignal} signal\n */\n fetchBlocks(signal) {\n // check if we still need to\n if (this.blockIdsToFetch.size > 0) {\n const groups = this.groupBlocks(this.blockIdsToFetch);\n\n // start requesting slices of data\n const groupRequests = this.source.fetch(groups, signal);\n\n for (let groupIndex = 0; groupIndex < groups.length; ++groupIndex) {\n const group = groups[groupIndex];\n\n for (const blockId of group.blockIds) {\n // make an async IIFE for each block\n this.blockRequests.set(blockId, (async () => {\n try {\n const response = (await groupRequests)[groupIndex];\n const blockOffset = blockId * this.blockSize;\n const o = blockOffset - response.offset;\n const t = Math.min(o + this.blockSize, response.data.byteLength);\n const data = response.data.slice(o, t);\n const block = new Block(\n blockOffset,\n data.byteLength,\n data,\n blockId,\n );\n this.blockCache.set(blockId, block);\n this.abortedBlockIds.delete(blockId);\n } catch (err) {\n if (err.name === 'AbortError') {\n // store the signal here, we need it to determine later if an\n // error was caused by this signal\n err.signal = signal;\n this.blockCache.delete(blockId);\n this.abortedBlockIds.add(blockId);\n } else {\n throw err;\n }\n } finally {\n this.blockRequests.delete(blockId);\n }\n })());\n }\n }\n this.blockIdsToFetch.clear();\n }\n }\n\n /**\n *\n * @param {Set} blockIds\n * @returns {BlockGroup[]}\n */\n groupBlocks(blockIds) {\n const sortedBlockIds = Array.from(blockIds).sort((a, b) => a - b);\n if (sortedBlockIds.length === 0) {\n return [];\n }\n let current = [];\n let lastBlockId = null;\n const groups = [];\n\n for (const blockId of sortedBlockIds) {\n if (lastBlockId === null || lastBlockId + 1 === blockId) {\n current.push(blockId);\n lastBlockId = blockId;\n } else {\n groups.push(new BlockGroup(\n current[0] * this.blockSize,\n current.length * this.blockSize,\n current,\n ));\n current = [blockId];\n lastBlockId = blockId;\n }\n }\n\n groups.push(new BlockGroup(\n current[0] * this.blockSize,\n current.length * this.blockSize,\n current,\n ));\n\n return groups;\n }\n\n /**\n *\n * @param {import(\"./basesource\").Slice[]} slices\n * @param {Map} blocks\n */\n readSliceData(slices, blocks) {\n return slices.map((slice) => {\n let top = slice.offset + slice.length;\n if (this.fileSize !== null) {\n top = Math.min(this.fileSize, top);\n }\n const blockIdLow = Math.floor(slice.offset / this.blockSize);\n const blockIdHigh = Math.floor(top / this.blockSize);\n const sliceData = new ArrayBuffer(slice.length);\n const sliceView = new Uint8Array(sliceData);\n\n for (let blockId = blockIdLow; blockId <= blockIdHigh; ++blockId) {\n const block = blocks.get(blockId);\n const delta = block.offset - slice.offset;\n const topDelta = block.top - top;\n let blockInnerOffset = 0;\n let rangeInnerOffset = 0;\n let usedBlockLength;\n\n if (delta < 0) {\n blockInnerOffset = -delta;\n } else if (delta > 0) {\n rangeInnerOffset = delta;\n }\n\n if (topDelta < 0) {\n usedBlockLength = block.length - blockInnerOffset;\n } else {\n usedBlockLength = top - block.offset - blockInnerOffset;\n }\n\n const blockView = new Uint8Array(block.data, blockInnerOffset, usedBlockLength);\n sliceView.set(blockView, rangeInnerOffset);\n }\n\n return sliceData;\n });\n }\n}\n","export class BaseResponse {\n /**\n * Returns whether the response has an ok'ish status code\n */\n get ok() {\n return this.status >= 200 && this.status <= 299;\n }\n\n /**\n * Returns the status code of the response\n */\n get status() {\n throw new Error('not implemented');\n }\n\n /**\n * Returns the value of the specified header\n * @param {string} headerName the header name\n * @returns {string} the header value\n */\n getHeader(headerName) { // eslint-disable-line no-unused-vars\n throw new Error('not implemented');\n }\n\n /**\n * @returns {ArrayBuffer} the response data of the request\n */\n async getData() {\n throw new Error('not implemented');\n }\n}\n\nexport class BaseClient {\n constructor(url) {\n this.url = url;\n }\n\n /**\n * Send a request with the options\n * @param {{headers: HeadersInit, signal: AbortSignal}} [options={}]\n * @returns {Promise<BaseResponse>}\n */\n async request({ headers, signal } = {}) { // eslint-disable-line no-unused-vars\n throw new Error('request is not implemented');\n }\n}\n","import { BaseClient, BaseResponse } from './base.js';\n\nclass FetchResponse extends BaseResponse {\n /**\n * BaseResponse facade for fetch API Response\n * @param {Response} response\n */\n constructor(response) {\n super();\n this.response = response;\n }\n\n get status() {\n return this.response.status;\n }\n\n getHeader(name) {\n return this.response.headers.get(name);\n }\n\n async getData() {\n const data = this.response.arrayBuffer\n ? await this.response.arrayBuffer()\n : (await this.response.buffer()).buffer;\n return data;\n }\n}\n\nexport class FetchClient extends BaseClient {\n constructor(url, credentials) {\n super(url);\n this.credentials = credentials;\n }\n\n /**\n * @param {{headers: HeadersInit, signal: AbortSignal}} [options={}]\n * @returns {Promise<FetchResponse>}\n */\n async request({ headers, signal } = {}) {\n const response = await fetch(this.url, {\n headers, credentials: this.credentials, signal,\n });\n return new FetchResponse(response);\n }\n}\n","import { BaseClient, BaseResponse } from './base.js';\nimport { AbortError } from '../../utils.js';\n\nclass XHRResponse extends BaseResponse {\n /**\n * BaseResponse facade for XMLHttpRequest\n * @param {XMLHttpRequest} xhr\n * @param {ArrayBuffer} data\n */\n constructor(xhr, data) {\n super();\n this.xhr = xhr;\n this.data = data;\n }\n\n get status() {\n return this.xhr.status;\n }\n\n getHeader(name) {\n return this.xhr.getResponseHeader(name);\n }\n\n async getData() {\n return this.data;\n }\n}\n\nexport class XHRClient extends BaseClient {\n constructRequest(headers, signal) {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', this.url);\n xhr.responseType = 'arraybuffer';\n for (const [key, value] of Object.entries(headers)) {\n xhr.setRequestHeader(key, value);\n }\n\n // hook signals\n xhr.onload = () => {\n const data = xhr.response;\n resolve(new XHRResponse(xhr, data));\n };\n xhr.onerror = reject;\n xhr.onabort = () => reject(new AbortError('Request aborted'));\n xhr.send();\n\n if (signal) {\n if (signal.aborted) {\n xhr.abort();\n }\n signal.addEventListener('abort', () => xhr.abort());\n }\n });\n }\n\n async request({ headers, signal } = {}) {\n const response = await this.constructRequest(headers, signal);\n return response;\n }\n}\n","export default {}","import http from 'http';\nimport https from 'https';\nimport urlMod from 'url';\n\nimport { BaseClient, BaseResponse } from './base.js';\nimport { AbortError } from '../../utils.js';\n\nclass HttpResponse extends BaseResponse {\n /**\n * BaseResponse facade for node HTTP/HTTPS API Response\n * @param {http.ServerResponse} response\n */\n constructor(response, dataPromise) {\n super();\n this.response = response;\n this.dataPromise = dataPromise;\n }\n\n get status() {\n return this.response.statusCode;\n }\n\n getHeader(name) {\n return this.response.headers[name];\n }\n\n async getData() {\n const data = await this.dataPromise;\n return data;\n }\n}\n\nexport class HttpClient extends BaseClient {\n constructor(url) {\n super(url);\n this.parsedUrl = urlMod.parse(this.url);\n this.httpApi = (this.parsedUrl.protocol === 'http:' ? http : https);\n }\n\n constructRequest(headers, signal) {\n return new Promise((resolve, reject) => {\n const request = this.httpApi.get(\n {\n ...this.parsedUrl,\n headers,\n },\n (response) => {\n const dataPromise = new Promise((resolveData) => {\n const chunks = [];\n\n // collect chunks\n response.on('data', (chunk) => {\n chunks.push(chunk);\n });\n\n // concatenate all chunks and resolve the promise with the resulting buffer\n response.on('end', () => {\n const data = Buffer.concat(chunks).buffer;\n resolveData(data);\n });\n response.on('error', reject);\n });\n resolve(new HttpResponse(response, dataPromise));\n },\n );\n request.on('error', reject);\n\n if (signal) {\n if (signal.aborted) {\n request.destroy(new AbortError('Request aborted'));\n }\n signal.addEventListener('abort', () => request.destroy(new AbortError('Request aborted')));\n }\n });\n }\n\n async request({ headers, signal } = {}) {\n const response = await this.constructRequest(headers, signal);\n return response;\n }\n}\n","import { parseByteRanges, parseContentRange, parseContentType } from './httputils.js';\nimport { BaseSource } from './basesource.js';\nimport { BlockedSource } from './blockedsource.js';\n\nimport { FetchClient } from './client/fetch.js';\nimport { XHRClient } from './client/xhr.js';\nimport { HttpClient } from './client/http.js';\n\nclass RemoteSource extends BaseSource {\n /**\n *\n * @param {BaseClient} client\n * @param {object} headers\n * @param {numbers} maxRanges\n * @param {boolean} allowFullFile\n */\n constructor(client, headers, maxRanges, allowFullFile) {\n super();\n this.client = client;\n this.headers = headers;\n this.maxRanges = maxRanges;\n this.allowFullFile = allowFullFile;\n this._fileSize = null;\n }\n\n /**\n *\n * @param {Slice[]} slices\n */\n async fetch(slices, signal) {\n // if we allow multi-ranges, split the incoming request into that many sub-requests\n // and join them afterwards\n if (this.maxRanges >= slices.length) {\n return this.fetchSlices(slices, signal);\n } else if (this.maxRanges > 0 && slices.length > 1) {\n // TODO: split into multiple multi-range requests\n\n // const subSlicesRequests = [];\n // for (let i = 0; i < slices.length; i += this.maxRanges) {\n // subSlicesRequests.push(\n // this.fetchSlices(slices.slice(i, i + this.maxRanges), signal),\n // );\n // }\n // return (await Promise.all(subSlicesRequests)).flat();\n }\n\n // otherwise make a single request for each slice\n return Promise.all(\n slices.map((slice) => this.fetchSlice(slice, signal)),\n );\n }\n\n async fetchSlices(slices, signal) {\n const response = await this.client.request({\n headers: {\n ...this.headers,\n Range: `bytes=${slices\n .map(({ offset, length }) => `${offset}-${offset + length}`)\n .join(',')\n }`,\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error('Error fetching data.');\n } else if (response.status === 206) {\n const { type, params } = parseContentType(response.getHeader('content-type'));\n if (type === 'multipart/byteranges') {\n const byteRanges = parseByteRanges(await response.getData(), params.boundary);\n this._fileSize = byteRanges[0].fileSize || null;\n return byteRanges;\n }\n\n const data = await response.getData();\n\n const { start, end, total } = parseContentRange(response.getHeader('content-range'));\n this._fileSize = total || null;\n const first = [{\n data,\n offset: start,\n length: end - start,\n }];\n\n if (slices.length > 1) {\n // we requested more than one slice, but got only the first\n // unfortunately, some HTTP Servers don't support multi-ranges\n // and return only the first\n\n // get the rest of the slices and fetch them iteratively\n const others = await Promise.all(slices.slice(1).map((slice) => this.fetchSlice(slice, signal)));\n return first.concat(others);\n }\n return first;\n } else {\n if (!this.allowFullFile) {\n throw new Error('Server responded with full file');\n }\n const data = await response.getData();\n this._fileSize = data.byteLength;\n return [{\n data,\n offset: 0,\n length: data.byteLength,\n }];\n }\n }\n\n async fetchSlice(slice, signal) {\n const { offset, length } = slice;\n const response = await this.client.request({\n headers: {\n ...this.headers,\n Range: `bytes=${offset}-${offset + length}`,\n },\n signal,\n });\n\n // check the response was okay and if the server actually understands range requests\n if (!response.ok) {\n throw new Error('Error fetching data.');\n } else if (response.status === 206) {\n const data = await response.getData();\n\n const { total } = parseContentRange(response.getHeader('content-range'));\n this._fileSize = total || null;\n return {\n data,\n offset,\n length,\n };\n } else {\n if (!this.allowFullFile) {\n throw new Error('Server responded with full file');\n }\n\n const data = await response.getData();\n\n this._fileSize = data.byteLength;\n return {\n data,\n offset: 0,\n length: data.byteLength,\n };\n }\n }\n\n get fileSize() {\n return this._fileSize;\n }\n}\n\nfunction maybeWrapInBlockedSource(source, { blockSize, cacheSize }) {\n if (blockSize === null) {\n return source;\n }\n return new BlockedSource(source, { blockSize, cacheSize });\n}\n\nexport function makeFetchSource(url, { headers = {}, credentials, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const client = new FetchClient(url, credentials);\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\nexport function makeXHRSource(url, { headers = {}, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const client = new XHRClient(url);\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\nexport function makeHttpSource(url, { headers = {}, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const client = new HttpClient(url);\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\nexport function makeCustomSource(client, { headers = {}, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\n/**\n *\n * @param {string} url\n * @param {object} options\n */\nexport function makeRemoteSource(url, { forceXHR = false, ...clientOptions } = {}) {\n if (typeof fetch === 'function' && !forceXHR) {\n return makeFetchSource(url, clientOptions);\n }\n if (typeof XMLHttpRequest !== 'undefined') {\n return makeXHRSource(url, clientOptions);\n }\n return makeHttpSource(url, clientOptions);\n}\n","import { BaseSource } from './basesource.js';\nimport { AbortError } from '../utils.js';\n\nclass ArrayBufferSource extends BaseSource {\n constructor(arrayBuffer) {\n super();\n this.arrayBuffer = arrayBuffer;\n }\n\n fetchSlice(slice, signal) {\n if (signal && signal.aborted) {\n throw new AbortError('Request aborted');\n }\n return this.arrayBuffer.slice(slice.offset, slice.offset + slice.length);\n }\n}\n\nexport function makeBufferSource(arrayBuffer) {\n return new ArrayBufferSource(arrayBuffer);\n}\n","import { BaseSource } from './basesource.js';\n\nclass FileReaderSource extends BaseSource {\n constructor(file) {\n super();\n this.file = file;\n }\n\n async fetchSlice(slice, signal) {\n return new Promise((resolve, reject) => {\n const blob = this.file.slice(slice.offset, slice.offset + slice.length);\n const reader = new FileReader();\n reader.onload = (event) => resolve(event.target.result);\n reader.onerror = reject;\n reader.onabort = reject;\n reader.readAsArrayBuffer(blob);\n\n if (signal) {\n signal.addEventListener('abort', () => reader.abort());\n }\n });\n }\n}\n\n/**\n * Create a new source from a given file/blob.\n * @param {Blob} file The file or blob to read from.\n * @returns The constructed source\n */\nexport function makeFileReaderSource(file) {\n return new FileReaderSource(file);\n}\n","import fs from 'fs';\nimport { BaseSource } from './basesource.js';\n\nfunction closeAsync(fd) {\n return new Promise((resolve, reject) => {\n fs.close(fd, (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n}\n\nfunction openAsync(path, flags, mode = undefined) {\n return new Promise((resolve, reject) => {\n fs.open(path, flags, mode, (err, fd) => {\n if (err) {\n reject(err);\n } else {\n resolve(fd);\n }\n });\n });\n}\n\nfunction readAsync(...args) {\n return new Promise((resolve, reject) => {\n fs.read(...args, (err, bytesRead, buffer) => {\n if (err) {\n reject(err);\n } else {\n resolve({ bytesRead, buffer });\n }\n });\n });\n}\n\nclass FileSource extends BaseSource {\n constructor(path) {\n super();\n this.path = path;\n this.openRequest = openAsync(path, 'r');\n }\n\n async fetchSlice(slice) {\n // TODO: use `signal`\n const fd = await this.openRequest;\n const { buffer } = await readAsync(\n fd,\n Buffer.alloc(slice.length),\n 0,\n slice.length,\n slice.offset,\n );\n return buffer.buffer;\n }\n\n async close() {\n const fd = await this.openRequest;\n await closeAsync(fd);\n }\n}\n\nexport function makeFileSource(path) {\n return new FileSource(path);\n}\n","/*\n Some parts of this file are based on UTIF.js,\n which was released under the MIT License.\n You can view that here:\n https://github.com/photopea/UTIF.js/blob/master/LICENSE\n*/\nimport { fieldTagNames, fieldTagTypes, fieldTypeNames, geoKeyNames } from './globals.js';\nimport { assign, endsWith, forEach, invert, times } from './utils.js';\n\nconst tagName2Code = invert(fieldTagNames);\nconst geoKeyName2Code = invert(geoKeyNames);\nconst name2code = {};\nassign(name2code, tagName2Code);\nassign(name2code, geoKeyName2Code);\nconst typeName2byte = invert(fieldTypeNames);\n\n// config variables\nconst numBytesInIfd = 1000;\n\nconst _binBE = {\n nextZero: (data, o) => {\n let oincr = o;\n while (data[oincr] !== 0) {\n oincr++;\n }\n return oincr;\n },\n readUshort: (buff, p) => {\n return (buff[p] << 8) | buff[p + 1];\n },\n readShort: (buff, p) => {\n const a = _binBE.ui8;\n a[0] = buff[p + 1];\n a[1] = buff[p + 0];\n return _binBE.i16[0];\n },\n readInt: (buff, p) => {\n const a = _binBE.ui8;\n a[0] = buff[p + 3];\n a[1] = buff[p + 2];\n a[2] = buff[p + 1];\n a[3] = buff[p + 0];\n return _binBE.i32[0];\n },\n readUint: (buff, p) => {\n const a = _binBE.ui8;\n a[0] = buff[p + 3];\n a[1] = buff[p + 2];\n a[2] = buff[p + 1];\n a[3] = buff[p + 0];\n return _binBE.ui32[0];\n },\n readASCII: (buff, p, l) => {\n return l.map((i) => String.fromCharCode(buff[p + i])).join('');\n },\n readFloat: (buff, p) => {\n const a = _binBE.ui8;\n times(4, (i) => {\n a[i] = buff[p + 3 - i];\n });\n return _binBE.fl32[0];\n },\n readDouble: (buff, p) => {\n const a = _binBE.ui8;\n times(8, (i) => {\n a[i] = buff[p + 7 - i];\n });\n return _binBE.fl64[0];\n },\n writeUshort: (buff, p, n) => {\n buff[p] = (n >> 8) & 255;\n buff[p + 1] = n & 255;\n },\n writeUint: (buff, p, n) => {\n buff[p] = (n >> 24) & 255;\n buff[p + 1] = (n >> 16) & 255;\n buff[p + 2] = (n >> 8) & 255;\n buff[p + 3] = (n >> 0) & 255;\n },\n writeASCII: (buff, p, s) => {\n times(s.length, (i) => {\n buff[p + i] = s.charCodeAt(i);\n });\n },\n ui8: new Uint8Array(8),\n};\n\n_binBE.fl64 = new Float64Array(_binBE.ui8.buffer);\n\n_binBE.writeDouble = (buff, p, n) => {\n _binBE.fl64[0] = n;\n times(8, (i) => {\n buff[p + i] = _binBE.ui8[7 - i];\n });\n};\n\nconst _writeIFD = (bin, data, _offset, ifd) => {\n let offset = _offset;\n\n const keys = Object.keys(ifd).filter((key) => {\n return key !== undefined && key !== null && key !== 'undefined';\n });\n\n bin.writeUshort(data, offset, keys.length);\n offset += 2;\n\n let eoff = offset + (12 * keys.length) + 4;\n\n for (const key of keys) {\n let tag = null;\n if (typeof key === 'number') {\n tag = key;\n } else if (typeof key === 'string') {\n tag = parseInt(key, 10);\n }\n\n const typeName = fieldTagTypes[tag];\n const typeNum = typeName2byte[typeName];\n\n if (typeName == null || typeName === undefined || typeof typeName === 'undefined') {\n throw new Error(`unknown type of tag: ${tag}`);\n }\n\n let val = ifd[key];\n\n if (val === undefined) {\n throw new Error(`failed to get value for key ${key}`);\n }\n\n // ASCIIZ format with trailing 0 character\n // http://www.fileformat.info/format/tiff/corion.htm\n // https://stackoverflow.com/questions/7783044/whats-the-difference-between-asciiz-vs-ascii\n if (typeName === 'ASCII' && typeof val === 'string' && endsWith(val, '\\u0000') === false) {\n val += '\\u0000';\n }\n\n const num = val.length;\n\n bin.writeUshort(data, offset, tag);\n offset += 2;\n\n bin.writeUshort(data, offset, typeNum);\n offset += 2;\n\n bin.writeUint(data, offset, num);\n offset += 4;\n\n let dlen = [-1, 1, 1, 2, 4, 8, 0, 0, 0, 0, 0, 0, 8][typeNum] * num;\n let toff = offset;\n\n if (dlen > 4) {\n bin.writeUint(data, offset, eoff);\n toff = eoff;\n }\n\n if (typeName === 'ASCII') {\n bin.writeASCII(data, toff, val);\n } else if (typeName === 'SHORT') {\n times(num, (i) => {\n bin.writeUshort(data, toff + (2 * i), val[i]);\n });\n } else if (typeName === 'LONG') {\n times(num, (i) => {\n bin.writeUint(data, toff + (4 * i), val[i]);\n });\n } else if (typeName === 'RATIONAL') {\n times(num, (i) => {\n bin.writeUint(data, toff + (8 * i), Math.round(val[i] * 10000));\n bin.writeUint(data, toff + (8 * i) + 4, 10000);\n });\n } else if (typeName === 'DOUBLE') {\n times(num, (i) => {\n bin.writeDouble(data, toff + (8 * i), val[i]);\n });\n }\n\n if (dlen > 4) {\n dlen += (dlen & 1);\n eoff += dlen;\n }\n\n offset += 4;\n }\n\n return [offset, eoff];\n};\n\nconst encodeIfds = (ifds) => {\n const data = new Uint8Array(numBytesInIfd);\n let offset = 4;\n const bin = _binBE;\n\n // set big-endian byte-order\n // https://en.wikipedia.org/wiki/TIFF#Byte_order\n data[0] = 77;\n data[1] = 77;\n\n // set format-version number\n // https://en.wikipedia.org/wiki/TIFF#Byte_order\n data[3] = 42;\n\n let ifdo = 8;\n\n bin.writeUint(data, offset, ifdo);\n\n offset += 4;\n\n ifds.forEach((ifd, i) => {\n const noffs = _writeIFD(bin, data, ifdo, ifd);\n ifdo = noffs[1];\n if (i < ifds.length - 1) {\n bin.writeUint(data, noffs[0], ifdo);\n }\n });\n\n if (data.slice) {\n return data.slice(0, ifdo).buffer;\n }\n\n // node hasn't implemented slice on Uint8Array yet\n const result = new Uint8Array(ifdo);\n for (let i = 0; i < ifdo; i++) {\n result[i] = data[i];\n }\n return result.buffer;\n};\n\nconst encodeImage = (values, width, height, metadata) => {\n if (height === undefined || height === null) {\n throw new Error(`you passed into encodeImage a width of type ${height}`);\n }\n\n if (width === undefined || width === null) {\n throw new Error(`you passed into encodeImage a width of type ${width}`);\n }\n\n const ifd = {\n 256: [width], // ImageWidth\n 257: [height], // ImageLength\n 273: [numBytesInIfd], // strips offset\n 278: [height], // RowsPerStrip\n 305: 'geotiff.js', // no array for ASCII(Z)\n };\n\n if (metadata) {\n for (const i in metadata) {\n if (metadata.hasOwnProperty(i)) {\n ifd[i] = metadata[i];\n }\n }\n }\n\n const prfx = new Uint8Array(encodeIfds([ifd]));\n\n const img = new Uint8Array(values);\n\n const samplesPerPixel = ifd[277];\n\n const data = new Uint8Array(numBytesInIfd + (width * height * samplesPerPixel));\n times(prfx.length, (i) => {\n data[i] = prfx[i];\n });\n forEach(img, (value, i) => {\n data[numBytesInIfd + i] = value;\n });\n\n return data.buffer;\n};\n\nconst convertToTids = (input) => {\n const result = {};\n for (const key in input) {\n if (key !== 'StripOffsets') {\n if (!name2code[key]) {\n console.error(key, 'not in name2code:', Object.keys(name2code));\n }\n result[name2code[key]] = input[key];\n }\n }\n return result;\n};\n\nconst toArray = (input) => {\n if (Array.isArray(input)) {\n return input;\n }\n return [input];\n};\n\nconst metadataDefaults = [\n ['Compression', 1], // no compression\n ['PlanarConfiguration', 1],\n ['ExtraSamples', 0],\n];\n\nexport function writeGeotiff(data, metadata) {\n const isFlattened = typeof data[0] === 'number';\n\n let height;\n let numBands;\n let width;\n let flattenedValues;\n\n if (isFlattened) {\n height = metadata.height || metadata.ImageLength;\n width = metadata.width || metadata.ImageWidth;\n numBands = data.length / (height * width);\n flattenedValues = data;\n } else {\n numBands = data.length;\n height = data[0].length;\n width = data[0][0].length;\n flattenedValues = [];\n times(height, (rowIndex) => {\n times(width, (columnIndex) => {\n times(numBands, (bandIndex) => {\n flattenedValues.push(data[bandIndex][rowIndex][columnIndex]);\n });\n });\n });\n }\n\n metadata.ImageLength = height;\n delete metadata.height;\n metadata.ImageWidth = width;\n delete metadata.width;\n\n // consult https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml\n\n if (!metadata.BitsPerSample) {\n metadata.BitsPerSample = times(numBands, () => 8);\n }\n\n metadataDefaults.forEach((tag) => {\n const key = tag[0];\n if (!metadata[key]) {\n const value = tag[1];\n metadata[key] = value;\n }\n });\n\n // The color space of the image data.\n // 1=black is zero and 2=RGB.\n if (!metadata.PhotometricInterpretation) {\n metadata.PhotometricInterpretation = metadata.BitsPerSample.length === 3 ? 2 : 1;\n }\n\n // The number of components per pixel.\n if (!metadata.SamplesPerPixel) {\n metadata.SamplesPerPixel = [numBands];\n }\n\n if (!metadata.StripByteCounts) {\n // we are only writing one strip\n metadata.StripByteCounts = [numBands * height * width];\n }\n\n if (!metadata.ModelPixelScale) {\n // assumes raster takes up exactly the whole globe\n metadata.ModelPixelScale = [360 / width, 180 / height, 0];\n }\n\n if (!metadata.SampleFormat) {\n metadata.SampleFormat = times(numBands, () => 1);\n }\n\n // if didn't pass in projection information, assume the popular 4326 \"geographic projection\"\n if (!metadata.hasOwnProperty('GeographicTypeGeoKey') && !metadata.hasOwnProperty('ProjectedCSTypeGeoKey')) {\n metadata.GeographicTypeGeoKey = 4326;\n metadata.ModelTiepoint = [0, 0, 0, -180, 90, 0]; // raster fits whole globe\n metadata.GeogCitationGeoKey = 'WGS 84';\n metadata.GTModelTypeGeoKey = 2;\n }\n\n const geoKeys = Object.keys(metadata)\n .filter((key) => endsWith(key, 'GeoKey'))\n .sort((a, b) => name2code[a] - name2code[b]);\n\n if (!metadata.GeoAsciiParams) {\n let geoAsciiParams = '';\n geoKeys.forEach((name) => {\n const code = Number(name2code[name]);\n const tagType = fieldTagTypes[code];\n if (tagType === 'ASCII') {\n geoAsciiParams += `${metadata[name].toString()}\\u0000`;\n }\n });\n if (geoAsciiParams.length > 0) {\n metadata.GeoAsciiParams = geoAsciiParams;\n }\n }\n\n if (!metadata.GeoKeyDirectory) {\n const NumberOfKeys = geoKeys.length;\n\n const GeoKeyDirectory = [1, 1, 0, NumberOfKeys];\n geoKeys.forEach((geoKey) => {\n const KeyID = Number(name2code[geoKey]);\n GeoKeyDirectory.push(KeyID);\n\n let Count;\n let TIFFTagLocation;\n let valueOffset;\n if (fieldTagTypes[KeyID] === 'SHORT') {\n Count = 1;\n TIFFTagLocation = 0;\n valueOffset = metadata[geoKey];\n } else if (geoKey === 'GeogCitationGeoKey') {\n Count = metadata.GeoAsciiParams.length;\n TIFFTagLocation = Number(name2code.GeoAsciiParams);\n valueOffset = 0;\n } else {\n console.log(`[geotiff.js] couldn't get TIFFTagLocation for ${geoKey}`);\n }\n GeoKeyDirectory.push(TIFFTagLocation);\n GeoKeyDirectory.push(Count);\n GeoKeyDirectory.push(valueOffset);\n });\n metadata.GeoKeyDirectory = GeoKeyDirectory;\n }\n\n // delete GeoKeys from metadata, because stored in GeoKeyDirectory tag\n for (const geoKey of geoKeys) {\n if (metadata.hasOwnProperty(geoKey)) {\n delete metadata[geoKey];\n }\n }\n\n [\n 'Compression',\n 'ExtraSamples',\n 'GeographicTypeGeoKey',\n 'GTModelTypeGeoKey',\n 'GTRasterTypeGeoKey',\n 'ImageLength', // synonym of ImageHeight\n 'ImageWidth',\n 'Orientation',\n 'PhotometricInterpretation',\n 'ProjectedCSTypeGeoKey',\n 'PlanarConfiguration',\n 'ResolutionUnit',\n 'SamplesPerPixel',\n 'XPosition',\n 'YPosition',\n 'RowsPerStrip',\n ].forEach((name) => {\n if (metadata[name]) {\n metadata[name] = toArray(metadata[name]);\n }\n });\n\n const encodedMetadata = convertToTids(metadata);\n\n const outputImage = encodeImage(flattenedValues, width, height, encodedMetadata);\n\n return outputImage;\n}\n","/**\n * A no-op logger\n */\nclass DummyLogger {\n log() {}\n\n debug() {}\n\n info() {}\n\n warn() {}\n\n error() {}\n\n time() {}\n\n timeEnd() {}\n}\n\nlet LOGGER = new DummyLogger();\n\n/**\n *\n * @param {object} logger the new logger. e.g `console`\n */\nexport function setLogger(logger = new DummyLogger()) {\n LOGGER = logger;\n}\n\nexport function debug(...args) {\n return LOGGER.debug(...args);\n}\n\nexport function log(...args) {\n return LOGGER.log(...args);\n}\n\nexport function info(...args) {\n return LOGGER.info(...args);\n}\n\nexport function warn(...args) {\n return LOGGER.warn(...args);\n}\n\nexport function error(...args) {\n return LOGGER.error(...args);\n}\n\nexport function time(...args) {\n return LOGGER.time(...args);\n}\n\nexport function timeEnd(...args) {\n return LOGGER.timeEnd(...args);\n}\n","function decodeRowAcc(row, stride) {\n let length = row.length - stride;\n let offset = 0;\n do {\n for (let i = stride; i > 0; i--) {\n row[offset + stride] += row[offset];\n offset++;\n }\n\n length -= stride;\n } while (length > 0);\n}\n\nfunction decodeRowFloatingPoint(row, stride, bytesPerSample) {\n let index = 0;\n let count = row.length;\n const wc = count / bytesPerSample;\n\n while (count > stride) {\n for (let i = stride; i > 0; --i) {\n row[index + stride] += row[index];\n ++index;\n }\n count -= stride;\n }\n\n const copy = row.slice();\n for (let i = 0; i < wc; ++i) {\n for (let b = 0; b < bytesPerSample; ++b) {\n row[(bytesPerSample * i) + b] = copy[((bytesPerSample - b - 1) * wc) + i];\n }\n }\n}\n\nexport function applyPredictor(block, predictor, width, height, bitsPerSample,\n planarConfiguration) {\n if (!predictor || predictor === 1) {\n return block;\n }\n\n for (let i = 0; i < bitsPerSample.length; ++i) {\n if (bitsPerSample[i] % 8 !== 0) {\n throw new Error('When decoding with predictor, only multiple of 8 bits are supported.');\n }\n if (bitsPerSample[i] !== bitsPerSample[0]) {\n throw new Error('When decoding with predictor, all samples must have the same size.');\n }\n }\n\n const bytesPerSample = bitsPerSample[0] / 8;\n const stride = planarConfiguration === 2 ? 1 : bitsPerSample.length;\n\n for (let i = 0; i < height; ++i) {\n // Last strip will be truncated if height % stripHeight != 0\n if (i * stride * width * bytesPerSample >= block.byteLength) {\n break;\n }\n let row;\n if (predictor === 2) { // horizontal prediction\n switch (bitsPerSample[0]) {\n case 8:\n row = new Uint8Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample,\n );\n break;\n case 16:\n row = new Uint16Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample / 2,\n );\n break;\n case 32:\n row = new Uint32Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample / 4,\n );\n break;\n default:\n throw new Error(`Predictor 2 not allowed with ${bitsPerSample[0]} bits per sample.`);\n }\n decodeRowAcc(row, stride, bytesPerSample);\n } else if (predictor === 3) { // horizontal floating point\n row = new Uint8Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample,\n );\n decodeRowFloatingPoint(row, stride, bytesPerSample);\n }\n }\n return block;\n}\n","import { applyPredictor } from '../predictor.js';\n\nexport default class BaseDecoder {\n async decode(fileDirectory, buffer) {\n const decoded = await this.decodeBlock(buffer);\n const predictor = fileDirectory.Predictor || 1;\n if (predictor !== 1) {\n const isTiled = !fileDirectory.StripOffsets;\n const tileWidth = isTiled ? fileDirectory.TileWidth : fileDirectory.ImageWidth;\n const tileHeight = isTiled ? fileDirectory.TileLength : (\n fileDirectory.RowsPerStrip || fileDirectory.ImageLength\n );\n return applyPredictor(\n decoded, predictor, tileWidth, tileHeight, fileDirectory.BitsPerSample,\n fileDirectory.PlanarConfiguration,\n );\n }\n return decoded;\n }\n}\n","/** @module geotiff */\nimport GeoTIFFImage from './geotiffimage.js';\nimport DataView64 from './dataview64.js';\nimport DataSlice from './dataslice.js';\nimport Pool from './pool.js';\n\nimport { makeRemoteSource, makeCustomSource } from './source/remote.js';\nimport { makeBufferSource } from './source/arraybuffer.js';\nimport { makeFileReaderSource } from './source/filereader.js';\nimport { makeFileSource } from './source/file.js';\nimport { BaseClient, BaseResponse } from './source/client/base.js';\n\nimport { fieldTypes, fieldTagNames, arrayFields, geoKeyNames } from './globals.js';\nimport { writeGeotiff } from './geotiffwriter.js';\nimport * as globals from './globals.js';\nimport * as rgb from './rgb.js';\nimport { getDecoder, addDecoder } from './compression/index.js';\nimport { setLogger } from './logging.js';\n\nexport { globals };\nexport { rgb };\nexport { default as BaseDecoder } from './compression/basedecoder.js';\nexport { getDecoder, addDecoder };\nexport { setLogger };\n\n/**\n * @typedef {Uint8Array | Int8Array | Uint16Array | Int16Array | Uint32Array | Int32Array | Float32Array | Float64Array}\n * TypedArray\n */\n\n/**\n * @typedef {{ height:number, width: number }} Dimensions\n */\n\n/**\n * The autogenerated docs are a little confusing here. The effective type is:\n *\n * `TypedArray & { height: number; width: number}`\n * @typedef {TypedArray & Dimensions} TypedArrayWithDimensions\n */\n\n/**\n * The autogenerated docs are a little confusing here. The effective type is:\n *\n * `TypedArray[] & { height: number; width: number}`\n * @typedef {TypedArray[] & Dimensions} TypedArrayArrayWithDimensions\n */\n\n/**\n * The autogenerated docs are a little confusing here. The effective type is:\n *\n * `(TypedArray | TypedArray[]) & { height: number; width: number}`\n * @typedef {TypedArrayWithDimensions | TypedArrayArrayWithDimensions} ReadRasterResult\n */\n\nfunction getFieldTypeLength(fieldType) {\n switch (fieldType) {\n case fieldTypes.BYTE: case fieldTypes.ASCII: case fieldTypes.SBYTE: case fieldTypes.UNDEFINED:\n return 1;\n case fieldTypes.SHORT: case fieldTypes.SSHORT:\n return 2;\n case fieldTypes.LONG: case fieldTypes.SLONG: case fieldTypes.FLOAT: case fieldTypes.IFD:\n return 4;\n case fieldTypes.RATIONAL: case fieldTypes.SRATIONAL: case fieldTypes.DOUBLE:\n case fieldTypes.LONG8: case fieldTypes.SLONG8: case fieldTypes.IFD8:\n return 8;\n default:\n throw new RangeError(`Invalid field type: ${fieldType}`);\n }\n}\n\nfunction parseGeoKeyDirectory(fileDirectory) {\n const rawGeoKeyDirectory = fileDirectory.GeoKeyDirectory;\n if (!rawGeoKeyDirectory) {\n return null;\n }\n\n const geoKeyDirectory = {};\n for (let i = 4; i <= rawGeoKeyDirectory[3] * 4; i += 4) {\n const key = geoKeyNames[rawGeoKeyDirectory[i]];\n const location = (rawGeoKeyDirectory[i + 1])\n ? (fieldTagNames[rawGeoKeyDirectory[i + 1]]) : null;\n const count = rawGeoKeyDirectory[i + 2];\n const offset = rawGeoKeyDirectory[i + 3];\n\n let value = null;\n if (!location) {\n value = offset;\n } else {\n value = fileDirectory[location];\n if (typeof value === 'undefined' || value === null) {\n throw new Error(`Could not get value of geoKey '${key}'.`);\n } else if (typeof value === 'string') {\n value = value.substring(offset, offset + count - 1);\n } else if (value.subarray) {\n value = value.subarray(offset, offset + count);\n if (count === 1) {\n value = value[0];\n }\n }\n }\n geoKeyDirectory[key] = value;\n }\n return geoKeyDirectory;\n}\n\nfunction getValues(dataSlice, fieldType, count, offset) {\n let values = null;\n let readMethod = null;\n const fieldTypeLength = getFieldTypeLength(fieldType);\n\n switch (fieldType) {\n case fieldTypes.BYTE: case fieldTypes.ASCII: case fieldTypes.UNDEFINED:\n values = new Uint8Array(count); readMethod = dataSlice.readUint8;\n break;\n case fieldTypes.SBYTE:\n values = new Int8Array(count); readMethod = dataSlice.readInt8;\n break;\n case fieldTypes.SHORT:\n values = new Uint16Array(count); readMethod = dataSlice.readUint16;\n break;\n case fieldTypes.SSHORT:\n values = new Int16Array(count); readMethod = dataSlice.readInt16;\n break;\n case fieldTypes.LONG: case fieldTypes.IFD:\n values = new Uint32Array(count); readMethod = dataSlice.readUint32;\n break;\n case fieldTypes.SLONG:\n values = new Int32Array(count); readMethod = dataSlice.readInt32;\n break;\n case fieldTypes.LONG8: case fieldTypes.IFD8:\n values = new Array(count); readMethod = dataSlice.readUint64;\n break;\n case fieldTypes.SLONG8:\n values = new Array(count); readMethod = dataSlice.readInt64;\n break;\n case fieldTypes.RATIONAL:\n values = new Uint32Array(count * 2); readMethod = dataSlice.readUint32;\n break;\n case fieldTypes.SRATIONAL:\n values = new Int32Array(count * 2); readMethod = dataSlice.readInt32;\n break;\n case fieldTypes.FLOAT:\n values = new Float32Array(count); readMethod = dataSlice.readFloat32;\n break;\n case fieldTypes.DOUBLE:\n values = new Float64Array(count); readMethod = dataSlice.readFloat64;\n break;\n default:\n throw new RangeError(`Invalid field type: ${fieldType}`);\n }\n\n // normal fields\n if (!(fieldType === fieldTypes.RATIONAL || fieldType === fieldTypes.SRATIONAL)) {\n for (let i = 0; i < count; ++i) {\n values[i] = readMethod.call(\n dataSlice, offset + (i * fieldTypeLength),\n );\n }\n } else { // RATIONAL or SRATIONAL\n for (let i = 0; i < count; i += 2) {\n values[i] = readMethod.call(\n dataSlice, offset + (i * fieldTypeLength),\n );\n values[i + 1] = readMethod.call(\n dataSlice, offset + ((i * fieldTypeLength) + 4),\n );\n }\n }\n\n if (fieldType === fieldTypes.ASCII) {\n return new TextDecoder('utf-8').decode(values);\n }\n return values;\n}\n\n/**\n * Data class to store the parsed file directory, geo key directory and\n * offset to the next IFD\n */\nclass ImageFileDirectory {\n constructor(fileDirectory, geoKeyDirectory, nextIFDByteOffset) {\n this.fileDirectory = fileDirectory;\n this.geoKeyDirectory = geoKeyDirectory;\n this.nextIFDByteOffset = nextIFDByteOffset;\n }\n}\n\n/**\n * Error class for cases when an IFD index was requested, that does not exist\n * in the file.\n */\nclass GeoTIFFImageIndexError extends Error {\n constructor(index) {\n super(`No image at index ${index}`);\n this.index = index;\n }\n}\n\nclass GeoTIFFBase {\n /**\n * (experimental) Reads raster data from the best fitting image. This function uses\n * the image with the lowest resolution that is still a higher resolution than the\n * requested resolution.\n * When specified, the `bbox` option is translated to the `window` option and the\n * `resX` and `resY` to `width` and `height` respectively.\n * Then, the [readRasters]{@link GeoTIFFImage#readRasters} method of the selected\n * image is called and the result returned.\n * @see GeoTIFFImage.readRasters\n * @param {import('./geotiffimage').ReadRasterOptions} [options={}] optional parameters\n * @returns {Promise<ReadRasterResult>} the decoded array(s), with `height` and `width`, as a promise\n */\n async readRasters(options = {}) {\n const { window: imageWindow, width, height } = options;\n let { resX, resY, bbox } = options;\n\n const firstImage = await this.getImage();\n let usedImage = firstImage;\n const imageCount = await this.getImageCount();\n const imgBBox = firstImage.getBoundingBox();\n\n if (imageWindow && bbox) {\n throw new Error('Both \"bbox\" and \"window\" passed.');\n }\n\n // if width/height is passed, transform it to resolution\n if (width || height) {\n // if we have an image window (pixel coordinates), transform it to a BBox\n // using the origin/resolution of the first image.\n if (imageWindow) {\n const [oX, oY] = firstImage.getOrigin();\n const [rX, rY] = firstImage.getResolution();\n\n bbox = [\n oX + (imageWindow[0] * rX),\n oY + (imageWindow[1] * rY),\n oX + (imageWindow[2] * rX),\n oY + (imageWindow[3] * rY),\n ];\n }\n\n // if we have a bbox (or calculated one)\n\n const usedBBox = bbox || imgBBox;\n\n if (width) {\n if (resX) {\n throw new Error('Both width and resX passed');\n }\n resX = (usedBBox[2] - usedBBox[0]) / width;\n }\n if (height) {\n if (resY) {\n throw new Error('Both width and resY passed');\n }\n resY = (usedBBox[3] - usedBBox[1]) / height;\n }\n }\n\n // if resolution is set or calculated, try to get the image with the worst acceptable resolution\n if (resX || resY) {\n const allImages = [];\n for (let i = 0; i < imageCount; ++i) {\n const image = await this.getImage(i);\n const { SubfileType: subfileType, NewSubfileType: newSubfileType } = image.fileDirectory;\n if (i === 0 || subfileType === 2 || newSubfileType & 1) {\n allImages.push(image);\n }\n }\n\n allImages.sort((a, b) => a.getWidth() - b.getWidth());\n for (let i = 0; i < allImages.length; ++i) {\n const image = allImages[i];\n const imgResX = (imgBBox[2] - imgBBox[0]) / image.getWidth();\n const imgResY = (imgBBox[3] - imgBBox[1]) / image.getHeight();\n\n usedImage = image;\n if ((resX && resX > imgResX) || (resY && resY > imgResY)) {\n break;\n }\n }\n }\n\n let wnd = imageWindow;\n if (bbox) {\n const [oX, oY] = firstImage.getOrigin();\n const [imageResX, imageResY] = usedImage.getResolution(firstImage);\n\n wnd = [\n Math.round((bbox[0] - oX) / imageResX),\n Math.round((bbox[1] - oY) / imageResY),\n Math.round((bbox[2] - oX) / imageResX),\n Math.round((bbox[3] - oY) / imageResY),\n ];\n wnd = [\n Math.min(wnd[0], wnd[2]),\n Math.min(wnd[1], wnd[3]),\n Math.max(wnd[0], wnd[2]),\n Math.max(wnd[1], wnd[3]),\n ];\n }\n\n return usedImage.readRasters({ ...options, window: wnd });\n }\n}\n\n/**\n * @typedef {Object} GeoTIFFOptions\n * @property {boolean} [cache=false] whether or not decoded tiles shall be cached.\n */\n\n/**\n * The abstraction for a whole GeoTIFF file.\n * @augments GeoTIFFBase\n */\nclass GeoTIFF extends GeoTIFFBase {\n /**\n * @constructor\n * @param {*} source The datasource to read from.\n * @param {boolean} littleEndian Whether the image uses little endian.\n * @param {boolean} bigTiff Whether the image uses bigTIFF conventions.\n * @param {number} firstIFDOffset The numeric byte-offset from the start of the image\n * to the first IFD.\n * @param {GeoTIFFOptions} [options] further options.\n */\n constructor(source, littleEndian, bigTiff, firstIFDOffset, options = {}) {\n super();\n this.source = source;\n this.littleEndian = littleEndian;\n this.bigTiff = bigTiff;\n this.firstIFDOffset = firstIFDOffset;\n this.cache = options.cache || false;\n this.ifdRequests = [];\n this.ghostValues = null;\n }\n\n async getSlice(offset, size) {\n const fallbackSize = this.bigTiff ? 4048 : 1024;\n return new DataSlice(\n (await this.source.fetch([{\n offset,\n length: typeof size !== 'undefined' ? size : fallbackSize,\n }]))[0],\n offset,\n this.littleEndian,\n this.bigTiff,\n );\n }\n\n /**\n * Instructs to parse an image file directory at the given file offset.\n * As there is no way to ensure that a location is indeed the start of an IFD,\n * this function must be called with caution (e.g only using the IFD offsets from\n * the headers or other IFDs).\n * @param {number} offset the offset to parse the IFD at\n * @returns {Promise<ImageFileDirectory>} the parsed IFD\n */\n async parseFileDirectoryAt(offset) {\n const entrySize = this.bigTiff ? 20 : 12;\n const offsetSize = this.bigTiff ? 8 : 2;\n\n let dataSlice = await this.getSlice(offset);\n const numDirEntries = this.bigTiff\n ? dataSlice.readUint64(offset)\n : dataSlice.readUint16(offset);\n\n // if the slice does not cover the whole IFD, request a bigger slice, where the\n // whole IFD fits: num of entries + n x tag length + offset to next IFD\n const byteSize = (numDirEntries * entrySize) + (this.bigTiff ? 16 : 6);\n if (!dataSlice.covers(offset, byteSize)) {\n dataSlice = await this.getSlice(offset, byteSize);\n }\n\n const fileDirectory = {};\n\n // loop over the IFD and create a file directory object\n let i = offset + (this.bigTiff ? 8 : 2);\n for (let entryCount = 0; entryCount < numDirEntries; i += entrySize, ++entryCount) {\n const fieldTag = dataSlice.readUint16(i);\n const fieldType = dataSlice.readUint16(i + 2);\n const typeCount = this.bigTiff\n ? dataSlice.readUint64(i + 4)\n : dataSlice.readUint32(i + 4);\n\n let fieldValues;\n let value;\n const fieldTypeLength = getFieldTypeLength(fieldType);\n const valueOffset = i + (this.bigTiff ? 12 : 8);\n\n // check whether the value is directly encoded in the tag or refers to a\n // different external byte range\n if (fieldTypeLength * typeCount <= (this.bigTiff ? 8 : 4)) {\n fieldValues = getValues(dataSlice, fieldType, typeCount, valueOffset);\n } else {\n // resolve the reference to the actual byte range\n const actualOffset = dataSlice.readOffset(valueOffset);\n const length = getFieldTypeLength(fieldType) * typeCount;\n\n // check, whether we actually cover the referenced byte range; if not,\n // request a new slice of bytes to read from it\n if (dataSlice.covers(actualOffset, length)) {\n fieldValues = getValues(dataSlice, fieldType, typeCount, actualOffset);\n } else {\n const fieldDataSlice = await this.getSlice(actualOffset, length);\n fieldValues = getValues(fieldDataSlice, fieldType, typeCount, actualOffset);\n }\n }\n\n // unpack single values from the array\n if (typeCount === 1 && arrayFields.indexOf(fieldTag) === -1\n && !(fieldType === fieldTypes.RATIONAL || fieldType === fieldTypes.SRATIONAL)) {\n value = fieldValues[0];\n } else {\n value = fieldValues;\n }\n\n // write the tags value to the file directly\n fileDirectory[fieldTagNames[fieldTag]] = value;\n }\n const geoKeyDirectory = parseGeoKeyDirectory(fileDirectory);\n const nextIFDByteOffset = dataSlice.readOffset(\n offset + offsetSize + (entrySize * numDirEntries),\n );\n\n return new ImageFileDirectory(\n fileDirectory,\n geoKeyDirectory,\n nextIFDByteOffset,\n );\n }\n\n async requestIFD(index) {\n // see if we already have that IFD index requested.\n if (this.ifdRequests[index]) {\n // attach to an already requested IFD\n return this.ifdRequests[index];\n } else if (index === 0) {\n // special case for index 0\n this.ifdRequests[index] = this.parseFileDirectoryAt(this.firstIFDOffset);\n return this.ifdRequests[index];\n } else if (!this.ifdRequests[index - 1]) {\n // if the previous IFD was not yet loaded, load that one first\n // this is the recursive call.\n try {\n this.ifdRequests[index - 1] = this.requestIFD(index - 1);\n } catch (e) {\n // if the previous one already was an index error, rethrow\n // with the current index\n if (e instanceof GeoTIFFImageIndexError) {\n throw new GeoTIFFImageIndexError(index);\n }\n // rethrow anything else\n throw e;\n }\n }\n // if the previous IFD was loaded, we can finally fetch the one we are interested in.\n // we need to wrap this in an IIFE, otherwise this.ifdRequests[index] would be delayed\n this.ifdRequests[index] = (async () => {\n const previousIfd = await this.ifdRequests[index - 1];\n if (previousIfd.nextIFDByteOffset === 0) {\n throw new GeoTIFFImageIndexError(index);\n }\n return this.parseFileDirectoryAt(previousIfd.nextIFDByteOffset);\n })();\n return this.ifdRequests[index];\n }\n\n /**\n * Get the n-th internal subfile of an image. By default, the first is returned.\n *\n * @param {number} [index=0] the index of the image to return.\n * @returns {Promise<GeoTIFFImage>} the image at the given index\n */\n async getImage(index = 0) {\n const ifd = await this.requestIFD(index);\n return new GeoTIFFImage(\n ifd.fileDirectory, ifd.geoKeyDirectory,\n this.dataView, this.littleEndian, this.cache, this.source,\n );\n }\n\n /**\n * Returns the count of the internal subfiles.\n *\n * @returns {Promise<number>} the number of internal subfile images\n */\n async getImageCount() {\n let index = 0;\n // loop until we run out of IFDs\n let hasNext = true;\n while (hasNext) {\n try {\n await this.requestIFD(index);\n ++index;\n } catch (e) {\n if (e instanceof GeoTIFFImageIndexError) {\n hasNext = false;\n } else {\n throw e;\n }\n }\n }\n return index;\n }\n\n /**\n * Get the values of the COG ghost area as a parsed map.\n * See https://gdal.org/drivers/raster/cog.html#header-ghost-area for reference\n * @returns {Promise<Object>} the parsed ghost area or null, if no such area was found\n */\n async getGhostValues() {\n const offset = this.bigTiff ? 16 : 8;\n if (this.ghostValues) {\n return this.ghostValues;\n }\n const detectionString = 'GDAL_STRUCTURAL_METADATA_SIZE=';\n const heuristicAreaSize = detectionString.length + 100;\n let slice = await this.getSlice(offset, heuristicAreaSize);\n if (detectionString === getValues(slice, fieldTypes.ASCII, detectionString.length, offset)) {\n const valuesString = getValues(slice, fieldTypes.ASCII, heuristicAreaSize, offset);\n const firstLine = valuesString.split('\\n')[0];\n const metadataSize = Number(firstLine.split('=')[1].split(' ')[0]) + firstLine.length;\n if (metadataSize > heuristicAreaSize) {\n slice = await this.getSlice(offset, metadataSize);\n }\n const fullString = getValues(slice, fieldTypes.ASCII, metadataSize, offset);\n this.ghostValues = {};\n fullString\n .split('\\n')\n .filter((line) => line.length > 0)\n .map((line) => line.split('='))\n .forEach(([key, value]) => {\n this.ghostValues[key] = value;\n });\n }\n return this.ghostValues;\n }\n\n /**\n * Parse a (Geo)TIFF file from the given source.\n *\n * @param {*} source The source of data to parse from.\n * @param {GeoTIFFOptions} [options] Additional options.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n */\n static async fromSource(source, options, signal) {\n const headerData = (await source.fetch([{ offset: 0, length: 1024 }], signal))[0];\n const dataView = new DataView64(headerData);\n\n const BOM = dataView.getUint16(0, 0);\n let littleEndian;\n if (BOM === 0x4949) {\n littleEndian = true;\n } else if (BOM === 0x4D4D) {\n littleEndian = false;\n } else {\n throw new TypeError('Invalid byte order value.');\n }\n\n const magicNumber = dataView.getUint16(2, littleEndian);\n let bigTiff;\n if (magicNumber === 42) {\n bigTiff = false;\n } else if (magicNumber === 43) {\n bigTiff = true;\n const offsetByteSize = dataView.getUint16(4, littleEndian);\n if (offsetByteSize !== 8) {\n throw new Error('Unsupported offset byte-size.');\n }\n } else {\n throw new TypeError('Invalid magic number.');\n }\n\n const firstIFDOffset = bigTiff\n ? dataView.getUint64(8, littleEndian)\n : dataView.getUint32(4, littleEndian);\n return new GeoTIFF(source, littleEndian, bigTiff, firstIFDOffset, options);\n }\n\n /**\n * Closes the underlying file buffer\n * N.B. After the GeoTIFF has been completely processed it needs\n * to be closed but only if it has been constructed from a file.\n */\n close() {\n if (typeof this.source.close === 'function') {\n return this.source.close();\n }\n return false;\n }\n}\n\nexport { GeoTIFF };\nexport default GeoTIFF;\n\n/**\n * Wrapper for GeoTIFF files that have external overviews.\n * @augments GeoTIFFBase\n */\nclass MultiGeoTIFF extends GeoTIFFBase {\n /**\n * Construct a new MultiGeoTIFF from a main and several overview files.\n * @param {GeoTIFF} mainFile The main GeoTIFF file.\n * @param {GeoTIFF[]} overviewFiles An array of overview files.\n */\n constructor(mainFile, overviewFiles) {\n super();\n this.mainFile = mainFile;\n this.overviewFiles = overviewFiles;\n this.imageFiles = [mainFile].concat(overviewFiles);\n\n this.fileDirectoriesPerFile = null;\n this.fileDirectoriesPerFileParsing = null;\n this.imageCount = null;\n }\n\n async parseFileDirectoriesPerFile() {\n const requests = [this.mainFile.parseFileDirectoryAt(this.mainFile.firstIFDOffset)]\n .concat(this.overviewFiles.map((file) => file.parseFileDirectoryAt(file.firstIFDOffset)));\n\n this.fileDirectoriesPerFile = await Promise.all(requests);\n return this.fileDirectoriesPerFile;\n }\n\n /**\n * Get the n-th internal subfile of an image. By default, the first is returned.\n *\n * @param {number} [index=0] the index of the image to return.\n * @returns {Promise<GeoTIFFImage>} the image at the given index\n */\n async getImage(index = 0) {\n await this.getImageCount();\n await this.parseFileDirectoriesPerFile();\n let visited = 0;\n let relativeIndex = 0;\n for (let i = 0; i < this.imageFiles.length; i++) {\n const imageFile = this.imageFiles[i];\n for (let ii = 0; ii < this.imageCounts[i]; ii++) {\n if (index === visited) {\n const ifd = await imageFile.requestIFD(relativeIndex);\n return new GeoTIFFImage(\n ifd.fileDirectory, ifd.geoKeyDirectory,\n imageFile.dataView, imageFile.littleEndian, imageFile.cache, imageFile.source,\n );\n }\n visited++;\n relativeIndex++;\n }\n relativeIndex = 0;\n }\n\n throw new RangeError('Invalid image index');\n }\n\n /**\n * Returns the count of the internal subfiles.\n *\n * @returns {Promise<number>} the number of internal subfile images\n */\n async getImageCount() {\n if (this.imageCount !== null) {\n return this.imageCount;\n }\n const requests = [this.mainFile.getImageCount()]\n .concat(this.overviewFiles.map((file) => file.getImageCount()));\n this.imageCounts = await Promise.all(requests);\n this.imageCount = this.imageCounts.reduce((count, ifds) => count + ifds, 0);\n return this.imageCount;\n }\n}\n\nexport { MultiGeoTIFF };\n\n/**\n * Creates a new GeoTIFF from a remote URL.\n * @param {string} url The URL to access the image from\n * @param {object} [options] Additional options to pass to the source.\n * See {@link makeRemoteSource} for details.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<GeoTIFF>} The resulting GeoTIFF file.\n */\nexport async function fromUrl(url, options = {}, signal) {\n return GeoTIFF.fromSource(makeRemoteSource(url, options), signal);\n}\n\n/**\n * Creates a new GeoTIFF from a custom {@link BaseClient}.\n * @param {BaseClient} client The client.\n * @param {object} [options] Additional options to pass to the source.\n * See {@link makeRemoteSource} for details.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<GeoTIFF>} The resulting GeoTIFF file.\n */\nexport async function fromCustomClient(client, options = {}, signal) {\n return GeoTIFF.fromSource(makeCustomSource(client, options), signal);\n}\n\n/**\n * Construct a new GeoTIFF from an\n * [ArrayBuffer]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer}.\n * @param {ArrayBuffer} arrayBuffer The data to read the file from.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<GeoTIFF>} The resulting GeoTIFF file.\n */\nexport async function fromArrayBuffer(arrayBuffer, signal) {\n return GeoTIFF.fromSource(makeBufferSource(arrayBuffer), signal);\n}\n\n/**\n * Construct a GeoTIFF from a local file path. This uses the node\n * [filesystem API]{@link https://nodejs.org/api/fs.html} and is\n * not available on browsers.\n *\n * N.B. After the GeoTIFF has been completely processed it needs\n * to be closed but only if it has been constructed from a file.\n * @param {string} path The file path to read from.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<GeoTIFF>} The resulting GeoTIFF file.\n */\nexport async function fromFile(path, signal) {\n return GeoTIFF.fromSource(makeFileSource(path), signal);\n}\n\n/**\n * Construct a GeoTIFF from an HTML\n * [Blob]{@link https://developer.mozilla.org/en-US/docs/Web/API/Blob} or\n * [File]{@link https://developer.mozilla.org/en-US/docs/Web/API/File}\n * object.\n * @param {Blob|File} blob The Blob or File object to read from.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<GeoTIFF>} The resulting GeoTIFF file.\n */\nexport async function fromBlob(blob, signal) {\n return GeoTIFF.fromSource(makeFileReaderSource(blob), signal);\n}\n\n/**\n * Construct a MultiGeoTIFF from the given URLs.\n * @param {string} mainUrl The URL for the main file.\n * @param {string[]} overviewUrls An array of URLs for the overview images.\n * @param {Object} [options] Additional options to pass to the source.\n * See [makeRemoteSource]{@link module:source.makeRemoteSource}\n * for details.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise<MultiGeoTIFF>} The resulting MultiGeoTIFF file.\n */\nexport async function fromUrls(mainUrl, overviewUrls = [], options = {}, signal) {\n const mainFile = await GeoTIFF.fromSource(makeRemoteSource(mainUrl, options), signal);\n const overviewFiles = await Promise.all(\n overviewUrls.map((url) => GeoTIFF.fromSource(makeRemoteSource(url, options))),\n );\n\n return new MultiGeoTIFF(mainFile, overviewFiles);\n}\n\n/**\n * Main creating function for GeoTIFF files.\n * @param {(Array)} array of pixel values\n * @returns {metadata} metadata\n */\nexport function writeArrayBuffer(values, metadata) {\n return writeGeotiff(values, metadata);\n}\n\nexport { Pool };\nexport { GeoTIFFImage };\nexport { BaseClient, BaseResponse };\n"],"names":["uncurryThis","target","thisArg","args","ReflectApply","uncurryThisGetter","key","ReflectGetOwnPropertyDescriptor","ReflectGetPrototypeOf","ReflectOwnKeys","SymbolIterator","SymbolToStringTag","NativeObject","ObjectCreate","ObjectDefineProperty","NativeArray","ArrayPrototype","NativeArrayPrototypeSymbolIterator","ArrayPrototypeSymbolIterator","NativeArrayBuffer","ArrayBufferPrototype","NativeSharedArrayBuffer","TypedArray","TypedArrayPrototype","NativeUint8Array","NativeUint16Array","NativeUint32Array","NativeFloat32Array","ArrayIteratorPrototype","ArrayIteratorPrototypeNext","GeneratorPrototypeNext","IteratorPrototype","DataViewPrototype","DataViewPrototypeGetUint16","NativeWeakMap","WeakMapPrototype","WeakMapPrototypeGet","WeakMapPrototypeSet","arrayIterators","SafeIteratorPrototype","arrayIterator","safeIfNeeded","array","safe","generators","DummyArrayIteratorPrototype","generator","buffer","floatView","uint32View","baseTable","shiftTable","i","mantissaTable","m","e","exponentTable","offsetTable","convertToNumber","float16bits","getFloat16","dataView","byteOffset","opts","getAttribute","tag","attributeName","options","debug","xml","opening","quotechars","char","pattern","match","getAttributeModule","indexOfMatch","startIndex","indexOfMatchModule","indexOfMatchEnd","indexOfMatchEndModule","countSubstring","string","substring","countSubstringModule","require$$0","require$$1","require$$2","findTagByName","tagName","nested","start","afterStart","relativeEnd","selfClosing","openings","closings","clip","end","outer","inner","findTagByNameModule","findTagsByName","tags","findTagsByNameModule","fieldTagNames","fieldTags","fieldTagTypes","arrayFields","fieldTypeNames","fieldTypes","photometricInterpretations","ExtraSamplesValues","LercParameters","LercAddCompression","geoKeyNames","geoKeys","fromWhiteIsZero","raster","max","width","height","rgbRaster","value","j","fromBlackIsZero","fromPalette","colorMap","greenOffset","blueOffset","mapIndex","fromCMYK","cmykRaster","c","y","k","fromYCbCr","yCbCrRaster","cb","cr","Xn","Yn","Zn","fromCIELab","cieLabRaster","L","a_","b_","x","z","r","g","b","registry","addDecoder","cases","importFn","getDecoder","fileDirectory","Decoder","copyNewSize","samplesPerPixel","resampleNearest","valueArrays","inWidth","inHeight","outWidth","outHeight","relX","relY","newArray","cy","cx","lerp","v0","v1","resampleBilinear","rawY","yl","yh","rawX","tx","xl","xh","ll","hl","lh","hh","resample","method","resampleNearestInterleaved","valueArray","samples","resampleBilinearInterleaved","resampleInterleaved","sum","arrayForType","format","bitsPerSample","size","needsNormalization","normalizeArray","inBuffer","planarConfiguration","tileWidth","tileHeight","view","outSize","samplesToTransfer","outArray","bitMask","pixelBitSkip","bitsPerLine","lineBitOffset","pixelBitOffset","bitOffset","outIndex","innerBitOffset","raw","GeoTIFFImage","littleEndian","cache","source","bytes","sampleIndex","offset","sample","poolOrDecoder","signal","numTilesPerRow","numTilesPerCol","index","tiles","byteCount","slice","request","data","sampleFormat","imageWindow","interleave","resampleMethod","imageWidth","imageHeight","minXTile","maxXTile","minYTile","maxYTile","windowWidth","bytesPerPixel","srcSampleOffsets","sampleReaders","promises","yTile","xTile","getPromise","si","promise","tile","blockHeight","firstLine","firstCol","lastLine","lastCol","reader","ymax","xmax","pixelOffset","windowCoordinate","resampled","wnd","pool","fillValue","imageWindowWidth","imageWindowHeight","numPixels","window","enableAlpha","pi","s","subOptions","red","green","blue","tiePoints","metadata","items","item","modelTransformation","referenceImage","modelPixelScale","refResX","refResY","refResZ","tilegrid","a","d","f","projected","I","J","xs","pt","ys","origin","resolution","x1","y1","x2","y2","DataView64","arrayBuffer","left","right","combined","isNegative","carrying","byte","DataSlice","sliceOffset","bigTiff","length","defaultPoolSize","Pool","createWorker","resolve","module","create","decoder","worker","candidate","id","onMessage","CRLFCRLF","itemsToObject","obj","parseHeaders","text","line","kv","str","parseContentType","rawContentType","type","rawParams","paramsItems","param","parseContentRange","rawContentRange","total","parseByteRanges","responseArrayBuffer","boundary","out","startBoundary","endBoundary","innerText","endOfHeaders","headers","startOfData","BaseSource","slices","QuickLRU","maxAge","expiry","deleted","newSize","removeCount","oldCacheSize","callbackFunction","thisArgument","assign","endsWith","expectedEnding","forEach","iterable","func","invert","oldObj","newObj","times","numTimes","results","wait","milliseconds","zip","A","B","AbortError","params","CustomAggregateError","errors","message","AggregateError","Block","BlockGroup","blockIds","BlockedSource","blockSize","cacheSize","blockId","block","blockRequests","missingBlockIds","allBlockIds","top","fileSize","firstBlockOffset","current","missingRequests","abortedBlockRequests","abortedBlockIds","blocks","failedBlocks","requiredBlocks","groups","groupRequests","groupIndex","group","response","blockOffset","o","t","err","sortedBlockIds","lastBlockId","blockIdLow","blockIdHigh","sliceData","sliceView","delta","topDelta","blockInnerOffset","rangeInnerOffset","usedBlockLength","blockView","BaseResponse","headerName","BaseClient","url","FetchResponse","name","FetchClient","credentials","XHRResponse","xhr","XHRClient","reject","fs","HttpResponse","dataPromise","HttpClient","urlMod","http","resolveData","chunks","chunk","RemoteSource","client","maxRanges","allowFullFile","byteRanges","first","others","maybeWrapInBlockedSource","makeFetchSource","blockOptions","makeXHRSource","makeHttpSource","makeCustomSource","makeRemoteSource","forceXHR","clientOptions","ArrayBufferSource","makeBufferSource","FileReaderSource","file","blob","event","makeFileReaderSource","closeAsync","fd","openAsync","path","flags","mode","readAsync","bytesRead","FileSource","makeFileSource","tagName2Code","geoKeyName2Code","name2code","typeName2byte","numBytesInIfd","_binBE","oincr","buff","p","l","n","_writeIFD","bin","_offset","ifd","keys","eoff","typeName","typeNum","val","num","dlen","toff","encodeIfds","ifds","ifdo","noffs","result","encodeImage","values","prfx","img","convertToTids","input","toArray","metadataDefaults","writeGeotiff","isFlattened","numBands","flattenedValues","rowIndex","columnIndex","bandIndex","geoAsciiParams","code","GeoKeyDirectory","geoKey","KeyID","Count","TIFFTagLocation","valueOffset","encodedMetadata","DummyLogger","setLogger","logger","decodeRowAcc","row","stride","decodeRowFloatingPoint","bytesPerSample","count","wc","copy","applyPredictor","predictor","BaseDecoder","decoded","isTiled","getFieldTypeLength","fieldType","parseGeoKeyDirectory","rawGeoKeyDirectory","geoKeyDirectory","location","getValues","dataSlice","readMethod","fieldTypeLength","ImageFileDirectory","nextIFDByteOffset","GeoTIFFImageIndexError","GeoTIFFBase","resX","resY","bbox","firstImage","usedImage","imageCount","imgBBox","oX","oY","rX","rY","usedBBox","allImages","image","subfileType","newSubfileType","imgResX","imgResY","imageResX","imageResY","GeoTIFF","firstIFDOffset","fallbackSize","entrySize","offsetSize","numDirEntries","byteSize","entryCount","fieldTag","typeCount","fieldValues","actualOffset","fieldDataSlice","previousIfd","hasNext","detectionString","heuristicAreaSize","metadataSize","fullString","headerData","BOM","magicNumber","MultiGeoTIFF","mainFile","overviewFiles","requests","visited","relativeIndex","imageFile","ii","fromUrl","fromCustomClient","fromArrayBuffer","fromFile","fromBlob","fromUrls","mainUrl","overviewUrls","writeArrayBuffer"],"mappings":"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Q;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA;AAAA,EAGR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA,EACR,KAAQ;AAAA;AAAA,EAGR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAAA,EACR,OAAQ;AAA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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36]}
|