diff --git a/dist/exif-reader.js b/dist/exif-reader.js index ed62dc2..1853d7f 100644 --- a/dist/exif-reader.js +++ b/dist/exif-reader.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ExifReader=t():e.ExifReader=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:1,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:1})}},t={};function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e){var t=function(e){if("object"!=n(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return e+""}(e);return"symbol"==n(t)?t:t+""}e.r(t),e.d(t,{default:function(){return Ii},errors:function(){return Ci},load:function(){return Ui},loadView:function(){return Ai}});var i=function(){return e=function e(t){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),function(e){return"object"!==n(e)||void 0===e.length||void 0===e.readUInt8||void 0===e.readUInt16LE||void 0===e.readUInt16BE||void 0===e.readUInt32LE||void 0===e.readUInt32BE||void 0===e.readInt32LE||void 0===e.readInt32BE}(t))throw Error("DataView: Passed buffer type is unsupported.");this.buffer=t,this.byteLength=this.buffer.length},(t=[{key:"getUint8",value:function(e){return this.buffer.readUInt8(e)}},{key:"getUint16",value:function(e,t){return t?this.buffer.readUInt16LE(e):this.buffer.readUInt16BE(e)}},{key:"getUint32",value:function(e,t){return t?this.buffer.readUInt32LE(e):this.buffer.readUInt32BE(e)}},{key:"getInt32",value:function(e,t){return t?this.buffer.readInt32LE(e):this.buffer.readInt32BE(e)}}])&&function(e,t){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:"string";if(0===t&&"function"==typeof DecompressionStream){var i=new DecompressionStream("deflate"),o=new Blob([e]).stream().pipeThrough(i);return"dataview"===r?new Response(o).arrayBuffer().then((function(e){return new DataView(e)})):new Response(o).arrayBuffer().then((function(e){return new TextDecoder(n).decode(e)}))}return void 0!==t?Promise.reject("Unknown compression method ".concat(t,".")):e}var v={USE_FILE:1,USE_JFIF:1,USE_PNG_FILE:1,USE_EXIF:1,USE_IPTC:1,USE_XMP:1,USE_ICC:1,USE_MPF:1,USE_PHOTOSHOP:1,USE_THUMBNAIL:1,USE_TIFF:1,USE_JPEG:1,USE_PNG:1,USE_HEIC:1,USE_AVIF:1,USE_WEBP:1,USE_GIF:1,USE_MAKER_NOTES:1};function y(e){return e.map((function(e){return String.fromCharCode(e)})).join("")}function S(e){if(e.length>=8){var t=y(e.slice(0,8));if("ASCII\0\0\0"===t)return y(e.slice(8));if("JIS\0\0\0\0\0"===t)return"[JIS encoded text]";if("UNICODE\0"===t)return"[Unicode encoded text]";if("\0\0\0\0\0\0\0\0"===t)return"[Undefined encoding]"}return"Undefined"}function b(e){return e[0][0]/e[0][1]+e[1][0]/e[1][1]/60+e[2][0]/e[2][1]/3600}var I=18761,C=I,U=function(e,t){if(e.getUint16(t)===I)return I;if(19789===e.getUint16(t))return 19789;throw Error("Illegal byte order value. Faulty image.")},P=2,A=65496,E=2,w=4,T=2,x=2,F=10,M=18,O=33,k=79,D=18,R=8,N="ICC_PROFILE\0",L=w+N.length,_=L+1,B="MPF\0",G=65472,j=65474,z=65476,V=65499,H=65501,W=65498,X=65504,J=65505,Y=65506,K=65517,q=65519,$=65534,Q=65535,Z="JFIF",ee="Exif",te="http://ns.adobe.com/xap/1.0/\0",ne="http://ns.adobe.com/xmp/extension/\0",re="Photoshop 3.0";function ie(e,t){return e.getUint16(t)===G}function oe(e,t){return e.getUint16(t)===j}function ae(e,t){var n=N.length;return e.getUint16(t)===Y&&a(e,t+w,n)===N}function ue(e,t){var n=B.length;return e.getUint16(t)===Y&&a(e,t+w,n)===B}function ce(e,t){var n=Z.length;return e.getUint16(t)===X&&a(e,t+w,n)===Z&&0===e.getUint8(t+w+n)}function fe(e,t){var n=ee.length;return e.getUint16(t)===J&&a(e,t+w,n)===ee&&0===e.getUint8(t+w+n)}function se(e,t){return e.getUint16(t)===J&&function(e,t){var n=te.length;return a(e,t+w,n)===te}(e,t)}function le(e,t){return e.getUint16(t)===J&&function(e,t){var n=ne.length;return a(e,t+w,n)===ne}(e,t)}function de(e,t){return{dataOffset:e+O,length:t-(O-T)}}function pe(e,t){return{dataOffset:e+k,length:t-(k-T)}}function me(e,t){var n=re.length;return e.getUint16(t)===K&&a(e,t+w,n)===re&&0===e.getUint8(t+w+n)}function ge(e,t){var n=e.getUint16(t);return n>=X&&n<=q||n===$||n===G||n===j||n===z||n===V||n===H||n===W}function he(e,t){return e.getUint16(t)===Q}var ve="‰PNG\r\n\n",ye=4,Se=4,be=0,Ie=ye,Ce=ye+Se,Ue="XML:com.adobe.xmp\0",Pe="tEXt",Ae="iTXt",Ee="zTXt",we="pHYs",Te="tIME",xe="eXIf",Fe="iCCP";function Me(e,t){return"IHDR"===a(e,t+Ie,Se)}function Oe(e,t){return a(e,t+Ie,Se)===Ae&&a(e,t+Ce,Ue.length)===Ue}function ke(e,t,n){var r=a(e,t+Ie,Se);return r===Pe||r===Ae||r===Ee&&n}function De(e,t){return a(e,t+Ie,Se)===xe}function Re(e,t){return a(e,t+Ie,Se)===Fe}function Ne(e,t){var n=[we,Te],r=a(e,t+Ie,Se);return n.includes(r)}function Le(e,t){t+=Ce+Ue.length+1+1;for(var n=0;n<2&&t0)return ze(e,n,r)}function ze(e,t,n){return 4===n?e.getUint32(t):8===n?(console.warn("This file uses an 8-bit offset which is currently not supported by ExifReader. Contact the maintainer to get it fixed."),function(e,t){return e.getUint32(t+4)}(e,t)):0}var Ve=1165519206,He=1835625829;function We(e,t){var n=function(e,t){var n=e.getUint32(t);return function(e){return 0===e}(n)?{length:e.byteLength-t,contentOffset:t+4+4}:function(e){return 1===e}(n)&&function(e,t){return 0===e.getUint32(t+8)}(e,t)?{length:e.getUint32(t+12),contentOffset:t+4+4+8}:{length:n,contentOffset:t+4+4}}(e,t),r=n.length,i=n.contentOffset;if(!(r<8)){var o=e.getUint32(t+4);if(1718909296===o)return function(e,t,n){return{type:"ftyp",majorBrand:a(e,t,4),length:n}}(e,i,r);if(1768977008===o)return function(e,t,n,r){return{type:"iprp",subBoxes:Ke(e,n,r-(n-t)),length:r}}(e,t,i,r);if(1768973167===o)return function(e,t,n,r){return{type:"ipco",properties:Ke(e,n,r-(n-t)),length:r}}(e,t,i,r);if(1668246642===o)return function(e,t,n){return{type:"colr",icc:Ye(e,t),length:n}}(e,i,r);var c=e.getUint8(i);return 1835365473===o?function(e,t,n,r){return{type:"meta",subBoxes:Ke(e,n+3,r-(n+3-t)),length:r}}(e,t,i+1,r):1768714083===o?function(e,t,n,r){var i=function(e,t){var n={item:{dataReferenceIndex:2,extentCount:2,extent:{}}};e<2?(n.itemCount=2,n.item.itemId=2):2===e&&(n.itemCount=4,n.item.itemId=4),n.item.constructionMethod=1===e||2===e?2:0;var r={offsetSize:t,lengthSize:t,baseOffsetSize:t+1,indexSize:t+1};return r.itemCount=t+2,r.items=r.itemCount+n.itemCount,r.item={itemId:0},r.item.constructionMethod=r.item.itemId+n.item.itemId,r.item.dataReferenceIndex=r.item.constructionMethod+n.item.constructionMethod,{offsets:r,sizes:n}}(t,n+3),o=i.offsets,a=i.sizes,u=e.getUint8(o.offsetSize)>>4;a.item.extent.extentOffset=u;var c=15&e.getUint8(o.lengthSize);a.item.extent.extentLength=c;var f=e.getUint8(o.baseOffsetSize)>>4;a.item.baseOffset=f;var s=function(e,t,n){if(1===n||2===n)return 15&e.getUint8(t)}(e,o.indexSize,t);a.item.extent.extentIndex=void 0!==s?s:0;var l=function(e,t,n){return n<2?e.getUint16(t):2===n?e.getUint32(t):void 0}(e,o.itemCount,t);return{type:"iloc",items:Be(e,t,o,a,u,c,s,l),length:r}}(e,c,i+1,r):1768517222===o?function(e,t,n,r,i){var o=function(e,t){var n={entryCount:t+3},r={};return r.entryCount=0===e?2:4,n.itemInfos=n.entryCount+r.entryCount,{offsets:n}}(n,r),a=o.offsets;return{type:"iinf",itemInfos:Ke(e,a.itemInfos,i-(a.itemInfos-t)),length:i}}(e,t,c,i+1,r):1768842853===o?function(e,t,n,r,i){r+=3;var o={type:"infe",length:i};return 0!==n&&1!==n||(o.itemId=e.getUint16(r),r+=2,o.itemProtectionIndex=e.getUint16(r),r+=2,o.itemName=u(e,r),r+=o.itemName.length+1),n>=2&&(2===n?(o.itemId=e.getUint16(r),r+=2):3===n&&(o.itemId=e.getUint32(r),r+=4),o.itemProtectionIndex=e.getUint16(r),r+=2,o.itemType=e.getUint32(r),r+=4,o.itemName=u(e,r),r+=o.itemName.length+1,o.itemType===He?(o.contentType=u(e,r),t+i>(r+=o.contentType.length+1)&&(o.contentEncoding=u(e,r),r+=o.contentEncoding.length+1)):1970432288===o.itemType&&(o.itemUri=u(e,r),r+=o.itemUri.length+1)),o}(e,t,c,i+1,r):{type:void 0,length:r}}}function Xe(e){if(v.USE_EXIF||v.USE_XMP||v.USE_ICC){var t={},n=function(e){for(var t=0;t+4+4<=e.byteLength;){var n=We(e,t);if(void 0===n)break;if("meta"===n.type)return n;t+=n.length}}(e);return n?(v.USE_EXIF&&(t.tiffHeaderOffset=function(e,t){try{var n=function(e){return e.subBoxes.find((function(e){return"iinf"===e.type})).itemInfos.find((function(e){return e.itemType===Ve}))}(t).itemId,r=Je(t,n);return function(e,t){return t+4+e.getUint32(t)}(e,r.baseOffset+r.extents[0].extentOffset)}catch(e){return}}(e,n)),v.USE_XMP&&(t.xmpChunks=function(e){try{var t=function(e){return e.subBoxes.find((function(e){return"iinf"===e.type})).itemInfos.find((function(e){return e.itemType===He&&"application/rdf+xml"===e.contentType}))}(e).itemId,n=Je(e,t),r=Je(e,t).extents[0];return[{dataOffset:n.baseOffset+r.extentOffset,length:r.extentLength}]}catch(e){return}}(n)),v.USE_ICC&&(t.iccChunks=function(e){try{var t=e.subBoxes.find((function(e){return"iprp"===e.type})).subBoxes.find((function(e){return"ipco"===e.type})).properties.find((function(e){return"colr"===e.type})).icc;if(t)return[t]}catch(e){}}(n)),t.hasAppMarkers=void 0!==t.tiffHeaderOffset||void 0!==t.xmpChunks||void 0!==t.iccChunks,t):{hasAppMarkers:0}}return{}}function Je(e,t){return e.subBoxes.find((function(e){return"iloc"===e.type})).items.find((function(e){return e.itemId===t}))}function Ye(e,t){var n=a(e,t,4);if("prof"===n||"rICC"===n)return{offset:t+4,length:e.getUint32(t+4),chunkNumber:1,chunksTotal:1}}function Ke(e,t,n){for(var r=[Ve,He],i=[],o=t;o=4&&function(e){var t=e.getUint16(0)===C;return 42===e.getUint16(2,t)}(e)}(e))return tt(v.USE_EXIF?{hasAppMarkers:1,tiffHeaderOffset:0}:{},"tiff","TIFF");if(v.USE_JPEG&&function(e){return!!e&&e.byteLength>=P&&e.getUint16(0)===A}(e))return tt(function(e){for(var t,n,r,i,o,a,u,c,f,s=E;s+w+5<=e.byteLength;){if(v.USE_FILE&&ie(e,s))t=e.getUint16(s+T),n=s+T;else if(v.USE_FILE&&oe(e,s))t=e.getUint16(s+T),r=s+T;else if(v.USE_JFIF&&ce(e,s))t=e.getUint16(s+T),i=s+x;else if(v.USE_EXIF&&fe(e,s))t=e.getUint16(s+T),o=s+F;else if(v.USE_XMP&&se(e,s))u||(u=[]),t=e.getUint16(s+T),u.push(de(s,t));else if(v.USE_XMP&&le(e,s))u||(u=[]),t=e.getUint16(s+T),u.push(pe(s,t));else if(v.USE_IPTC&&me(e,s))t=e.getUint16(s+T),a=s+M;else if(v.USE_ICC&&ae(e,s)){t=e.getUint16(s+T);var l=s+D,d=t-(D-T),p=e.getUint8(s+L),m=e.getUint8(s+_);c||(c=[]),c.push({offset:l,length:d,chunkNumber:p,chunksTotal:m})}else if(v.USE_MPF&&ue(e,s))t=e.getUint16(s+T),f=s+R;else{if(!ge(e,s)){if(he(e,s)){s++;continue}break}t=e.getUint16(s+T)}s+=T+t}return{hasAppMarkers:s>E,fileDataOffset:n||r,jfifDataOffset:i,tiffHeaderOffset:o,iptcDataOffset:a,xmpChunks:u,iccChunks:c,mpfDataOffset:f}}(e),"jpeg","JPEG");if(v.USE_PNG&&function(e){return!!e&&a(e,0,ve.length)===ve}(e))return tt(function(e,t){for(var n={hasAppMarkers:0},r=ve.length;r+ye+Se<=e.byteLength;){if(v.USE_PNG_FILE&&Me(e,r))n.hasAppMarkers=1,n.pngHeaderOffset=r+Ce;else if(v.USE_XMP&&Oe(e,r)){var i=Le(e,r);void 0!==i&&(n.hasAppMarkers=1,n.xmpChunks=[{dataOffset:i,length:e.getUint32(r+be)-(i-(r+Ce))}])}else if(ke(e,r,t)){n.hasAppMarkers=1;var o=a(e,r+Ie,Se);n.pngTextChunks||(n.pngTextChunks=[]),n.pngTextChunks.push({length:e.getUint32(r+be),type:o,offset:r+Ce})}else if(De(e,r))n.hasAppMarkers=1,n.tiffHeaderOffset=r+Ce;else if(v.USE_ICC&&t&&Re(e,r)){n.hasAppMarkers=1;var u=e.getUint32(r+be),c=r+Ce,f=_e(e,c),s=f.profileName,l=f.compressionMethod,d=f.compressedProfileOffset;n.iccChunks||(n.iccChunks=[]),n.iccChunks.push({offset:d,length:u-(d-c),chunkNumber:1,chunksTotal:1,profileName:s,compressionMethod:l})}else Ne(e,r)&&(n.hasAppMarkers=1,n.pngChunkOffsets||(n.pngChunkOffsets=[]),n.pngChunkOffsets.push(r+be));r+=e.getUint32(r+be)+ye+Se+4}return n}(e,t),"png","PNG");if(v.USE_HEIC&&function(e){if(!e)return 0;try{var t=We(e,0);return t&&-1!==["heic","heix","hevc","hevx","heim","heis","hevm","hevs","mif1"].indexOf(t.majorBrand)}catch(e){return 0}}(e))return tt(function(e){return Xe(e)}(e),"heic","HEIC");if(v.USE_AVIF&&function(e){if(!e)return 0;try{var t=We(e,0);return t&&"avif"===t.majorBrand}catch(e){return 0}}(e))return tt(function(e){return Xe(e)}(e),"avif","AVIF");if(v.USE_WEBP&&function(e){return!!e&&"RIFF"===a(e,0,4)&&"WEBP"===a(e,8,4)}(e))return tt(function(e){for(var t,n,r,i,o=12,u=0;o+8.25){var t=e[0]/e[1];return Number.isInteger(t)?""+t:t.toFixed(1)}return 0!==e[0]?"1/".concat(Math.round(e[1]/e[0])):"0/".concat(e[1])},FNumber:function(e){return"f/".concat(e[0]/e[1])},FocalLength:function(e){return e[0]/e[1]+" mm"},FocalPlaneResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},LightSource:function(e){return 1===e?"Daylight":2===e?"Fluorescent":3===e?"Tungsten (incandescent light)":4===e?"Flash":9===e?"Fine weather":10===e?"Cloudy weather":11===e?"Shade":12===e?"Daylight fluorescent (D 5700 – 7100K)":13===e?"Day white fluorescent (N 4600 – 5400K)":14===e?"Cool white fluorescent (W 3900 – 4500K)":15===e?"White fluorescent (WW 3200 – 3700K)":17===e?"Standard light A":18===e?"Standard light B":19===e?"Standard light C":20===e?"D55":21===e?"D65":22===e?"D75":23===e?"D50":24===e?"ISO studio tungsten":255===e?"Other light source":"Unknown"},MeteringMode:function(e){return 1===e?"Average":2===e?"CenterWeightedAverage":3===e?"Spot":4===e?"MultiSpot":5===e?"Pattern":6===e?"Partial":255===e?"Other":"Unknown"},ResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},Saturation:function(e){return 0===e?"Normal":1===e?"Low saturation":2===e?"High saturation":"Unknown"},SceneCaptureType:function(e){return 0===e?"Standard":1===e?"Landscape":2===e?"Portrait":3===e?"Night scene":"Unknown"},Sharpness:function(e){return 0===e?"Normal":1===e?"Soft":2===e?"Hard":"Unknown"},ShutterSpeedValue:function(e){var t=Math.pow(2,e[0]/e[1]);return t<=1?"".concat(Math.round(1/t)):"1/".concat(Math.round(t))},WhiteBalance:function(e){return 0===e?"Auto white balance":1===e?"Manual white balance":"Unknown"},XResolution:function(e){return""+Math.round(e[0]/e[1])},YResolution:function(e){return""+Math.round(e[0]/e[1])}},rt={11:"ProcessingSoftware",254:{name:"SubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image",3:"Single page of multi-page reduced-resolution image",4:"Transparency mask",5:"Transparency mask of reduced-resolution image",6:"Transparency mask of multi-page image",7:"Transparency mask of reduced-resolution multi-page image",65537:"Alternate reduced-resolution image",4294967295:"Invalid"}[e]||"Unknown"}},255:{name:"OldSubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image"}[e]||"Unknown"}},256:"ImageWidth",257:"ImageLength",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",263:{name:"Thresholding",description:function(e){return{1:"No dithering or halftoning",2:"Ordered dither or halfton",3:"Randomized dither"}[e]||"Unknown"}},264:"CellWidth",265:"CellLength",266:{name:"FillOrder",description:function(e){return{1:"Normal",2:"Reversed"}[e]||"Unknown"}},269:"DocumentName",270:"ImageDescription",271:"Make",272:"Model",273:"StripOffsets",274:{name:"Orientation",description:function(e){return 1===e?"top-left":2===e?"top-right":3===e?"bottom-right":4===e?"bottom-left":5===e?"left-top":6===e?"right-top":7===e?"right-bottom":8===e?"left-bottom":"Undefined"}},277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",280:"MinSampleValue",281:"MaxSampleValue",282:{name:"XResolution",description:nt.XResolution},283:{name:"YResolution",description:nt.YResolution},284:"PlanarConfiguration",285:"PageName",286:{name:"XPosition",description:function(e){return""+Math.round(e[0]/e[1])}},287:{name:"YPosition",description:function(e){return""+Math.round(e[0]/e[1])}},290:{name:"GrayResponseUnit",description:function(e){return{1:"0.1",2:"0.001",3:"0.0001",4:"1e-05",5:"1e-06"}[e]||"Unknown"}},296:{name:"ResolutionUnit",description:nt.ResolutionUnit},297:"PageNumber",301:"TransferFunction",305:"Software",306:"DateTime",315:"Artist",316:"HostComputer",317:"Predictor",318:{name:"WhitePoint",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},319:{name:"PrimaryChromaticities",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},321:"HalftoneHints",322:"TileWidth",323:"TileLength",330:"A100DataOffset",332:{name:"InkSet",description:function(e){return{1:"CMYK",2:"Not CMYK"}[e]||"Unknown"}},337:"TargetPrinter",338:{name:"ExtraSamples",description:function(e){return{0:"Unspecified",1:"Associated Alpha",2:"Unassociated Alpha"}[e]||"Unknown"}},339:{name:"SampleFormat",description:function(e){var t={1:"Unsigned",2:"Signed",3:"Float",4:"Undefined",5:"Complex int",6:"Complex float"};return Array.isArray(e)?e.map((function(e){return t[e]||"Unknown"})).join(", "):"Unknown"}},513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",529:{name:"YCbCrCoefficients",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join("/")}},530:"YCbCrSubSampling",531:{name:"YCbCrPositioning",description:function(e){return 1===e?"centered":2===e?"co-sited":"undefined "+e}},532:{name:"ReferenceBlackWhite",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join(", ")}},700:"ApplicationNotes",18246:"Rating",18249:"RatingPercent",33432:{name:"Copyright",description:function(e){return e.join("; ")}},33550:"PixelScale",33723:"IPTC-NAA",33920:"IntergraphMatrix",33922:"ModelTiePoint",34118:"SEMInfo",34264:"ModelTransform",34377:"PhotoshopSettings",34665:"Exif IFD Pointer",34675:"ICC_Profile",34735:"GeoTiffDirectory",34736:"GeoTiffDoubleParams",34737:"GeoTiffAsciiParams",34853:"GPS Info IFD Pointer",40091:"XPTitle",40092:"XPComment",40093:"XPAuthor",40094:"XPKeywords",40095:"XPSubject",42112:"GDALMetadata",42113:"GDALNoData",50341:"PrintIM",50707:"DNGBackwardVersion",50708:"UniqueCameraModel",50709:"LocalizedCameraModel",50721:"ColorMatrix1",50722:"ColorMatrix2",50723:"CameraCalibration1",50724:"CameraCalibration2",50725:"ReductionMatrix1",50726:"ReductionMatrix2",50727:"AnalogBalance",50728:"AsShotNeutral",50729:"AsShotWhiteXY",50730:"BaselineExposure",50731:"BaselineNoise",50732:"BaselineSharpness",50734:"LinearResponseLimit",50735:"CameraSerialNumber",50736:"DNGLensInfo",50739:"ShadowScale",50741:{name:"MakerNoteSafety",description:function(e){return{0:"Unsafe",1:"Safe"}[e]||"Unknown"}},50778:{name:"CalibrationIlluminant1",description:nt.LightSource},50779:{name:"CalibrationIlluminant2",description:nt.LightSource},50781:"RawDataUniqueID",50827:"OriginalRawFileName",50828:"OriginalRawFileData",50831:"AsShotICCProfile",50832:"AsShotPreProfileMatrix",50833:"CurrentICCProfile",50834:"CurrentPreProfileMatrix",50879:"ColorimetricReference",50885:"SRawType",50898:"PanasonicTitle",50899:"PanasonicTitle2",50931:"CameraCalibrationSig",50932:"ProfileCalibrationSig",50933:"ProfileIFD",50934:"AsShotProfileName",50936:"ProfileName",50937:"ProfileHueSatMapDims",50938:"ProfileHueSatMapData1",50939:"ProfileHueSatMapData2",50940:"ProfileToneCurve",50941:{name:"ProfileEmbedPolicy",description:function(e){return{0:"Allow Copying",1:"Embed if Used",2:"Never Embed",3:"No Restrictions"}[e]||"Unknown"}},50942:"ProfileCopyright",50964:"ForwardMatrix1",50965:"ForwardMatrix2",50966:"PreviewApplicationName",50967:"PreviewApplicationVersion",50968:"PreviewSettingsName",50969:"PreviewSettingsDigest",50970:{name:"PreviewColorSpace",description:function(e){return{1:"Gray Gamma 2.2",2:"sRGB",3:"Adobe RGB",4:"ProPhoto RGB"}[e]||"Unknown"}},50971:"PreviewDateTime",50972:"RawImageDigest",50973:"OriginalRawFileDigest",50981:"ProfileLookTableDims",50982:"ProfileLookTableData",51043:"TimeCodes",51044:"FrameRate",51058:"TStop",51081:"ReelName",51089:"OriginalDefaultFinalSize",51090:"OriginalBestQualitySize",51091:"OriginalDefaultCropSize",51105:"CameraLabel",51107:{name:"ProfileHueSatMapEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51108:{name:"ProfileLookTableEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51109:"BaselineExposureOffset",51110:{name:"DefaultBlackRender",description:function(e){return{0:"Auto",1:"None"}[e]||"Unknown"}},51111:"NewRawImageDigest",51112:"RawToPreviewGain"};function it(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.byteLength);f++){var s=Et(e,t,n,r,i,o);void 0!==s&&(u[s.name]={id:s.id,value:s.value,description:s.description},"MakerNote"===s.name&&(u[s.name].__offset=s.__offset)),r+=12}if(v.USE_THUMBNAIL&&r",d===St.tagTypes.ASCII&&(a=function(e){try{return e.map((function(e){return decodeURIComponent(escape(e))}))}catch(t){return e}}(a=function(e){for(var t=[],n=0,r=0;r5&&void 0!==arguments[5]&&arguments[5]&&(r*=St.typeSizes[n],n=St.tagTypes.BYTE);for(var a=0;a>31&1,e>>30&1,e>>29&1],n=[];return t[0]&&n.push("Dependent Parent Image"),t[1]&&n.push("Dependent Child Image"),t[2]&&n.push("Representative Image"),{value:t,description:n.join(", ")||"None"}}function Gt(e){var t=e>>24&7;return{value:t,description:0===t?"JPEG":"Unknown"}}function jt(e){var t=16777215&e;return{value:t,description:{196608:"Baseline MP Primary Image",65537:"Large Thumbnail (VGA equivalent)",65538:"Large Thumbnail (Full HD equivalent)",131073:"Multi-Frame Image (Panorama)",131074:"Multi-Frame Image (Disparity)",131075:"Multi-Frame Image (Multi-Angle)",0:"Undefined"}[t]||"Unknown"}}function zt(e,t,n,r){return function(e){return 0===e}(e)?0:_t(t.value,e*Lt+8,St.getTypeSize("LONG"),n)+r}var Vt={read:function(e,t){var n=function(e,t){return St.getShortAt(e,t)}(e,t),r=function(e,t,n){if(!(8>n)){var r=St.getByteAt(e,t+7);return{value:r,description:""+r}}}(e,t,n);return{"Bits Per Sample":Ht(e,t,n),"Image Height":Wt(e,t,n),"Image Width":Xt(e,t,n),"Color Components":r,Subsampling:r&&Jt(e,t,r.value,n)}}};function Ht(e,t,n){if(!(3>n)){var r=St.getByteAt(e,t+2);return{value:r,description:""+r}}}function Wt(e,t,n){if(!(5>n)){var r=St.getShortAt(e,t+3);return{value:r,description:"".concat(r,"px")}}}function Xt(e,t,n){if(!(7>n)){var r=St.getShortAt(e,t+5);return{value:r,description:"".concat(r,"px")}}}function Jt(e,t,n,r){if(!(8+3*n>r)){for(var i=[],o=0;o1?Yt(i)+Kt(i):""}}}function Yt(e){var t={1:"Y",2:"Cb",3:"Cr",4:"I",5:"Q"};return e.map((function(e){return t[e[0]]})).join("")}function Kt(e){var t={17:"4:4:4 (1 1)",18:"4:4:0 (1 2)",20:"4:4:1 (1 4)",33:"4:2:2 (2 1)",34:"4:2:0 (2 2)",36:"4:2:1 (2 4)",65:"4:1:1 (4 1)",66:"4:1:0 (4 2)"};return 0===e.length||void 0===e[0][1]||void 0===t[e[0][1]]?"":t[e[0][1]]}var qt={read:function(e,t){var n=function(e,t){return St.getShortAt(e,t)}(e,t),r=function(e,t,n){if(!(15>n)){var r=St.getByteAt(e,t+14);return{value:r,description:"".concat(r,"px")}}}(e,t,n),i=function(e,t,n){if(!(16>n)){var r=St.getByteAt(e,t+15);return{value:r,description:"".concat(r,"px")}}}(e,t,n),o={"JFIF Version":$t(e,t,n),"Resolution Unit":Qt(e,t,n),XResolution:en(e,t,n),YResolution:tn(e,t,n),"JFIF Thumbnail Width":r,"JFIF Thumbnail Height":i};if(void 0!==r&&void 0!==i){var a=function(e,t,n,r){if(!(0===n||16+n>r))return{value:e.buffer.slice(t+16,t+16+n),description:"<24-bit RGB pixel data>"}}(e,t,3*r.value*i.value,n);a&&(o["JFIF Thumbnail"]=a)}for(var u in o)void 0===o[u]&&delete o[u];return o}};function $t(e,t,n){if(!(9>n)){var r=St.getByteAt(e,t+7),i=St.getByteAt(e,t+7+1);return{value:256*r+i,description:r+"."+i}}}function Qt(e,t,n){if(!(10>n)){var r=St.getByteAt(e,t+9);return{value:r,description:Zt(r)}}}function Zt(e){return 0===e?"None":1===e?"inches":2===e?"cm":"Unknown"}function en(e,t,n){if(!(12>n)){var r=St.getShortAt(e,t+10);return{value:r,description:""+r}}}function tn(e,t,n){if(!(14>n)){var r=St.getShortAt(e,t+12);return{value:r,description:""+r}}}var nn={iptc:{256:{name:"Model Version",description:function(e){return""+((e[0]<<8)+e[1])}},261:{name:"Destination",repeatable:1},276:{name:"File Format",description:function(e){return""+((e[0]<<8)+e[1])}},278:{name:"File Format Version",description:function(e){return""+((e[0]<<8)+e[1])}},286:"Service Identifier",296:"Envelope Number",306:"Product ID",316:"Envelope Priority",326:{name:"Date Sent",description:rn},336:{name:"Time Sent",description:on},346:{name:"Coded Character Set",description:an,encoding_name:an},356:"UNO",376:{name:"ARM Identifier",description:function(e){return""+((e[0]<<8)+e[1])}},378:{name:"ARM Version",description:function(e){return""+((e[0]<<8)+e[1])}},512:{name:"Record Version",description:function(e){return""+((e[0]<<8)+e[1])}},515:"Object Type Reference",516:"Object Attribute Reference",517:"Object Name",519:"Edit Status",520:{name:"Editorial Update",description:function(e){return"01"===y(e)?"Additional Language":"Unknown"}},522:"Urgency",524:{name:"Subject Reference",repeatable:1,description:function(e){var t=y(e).split(":");return t[2]+(t[3]?"/"+t[3]:"")+(t[4]?"/"+t[4]:"")}},527:"Category",532:{name:"Supplemental Category",repeatable:1},534:"Fixture Identifier",537:{name:"Keywords",repeatable:1},538:{name:"Content Location Code",repeatable:1},539:{name:"Content Location Name",repeatable:1},542:"Release Date",547:"Release Time",549:"Expiration Date",550:"Expiration Time",552:"Special Instructions",554:{name:"Action Advised",description:function(e){var t=y(e);return"01"===t?"Object Kill":"02"===t?"Object Replace":"03"===t?"Object Append":"04"===t?"Object Reference":"Unknown"}},557:{name:"Reference Service",repeatable:1},559:{name:"Reference Date",repeatable:1},562:{name:"Reference Number",repeatable:1},567:{name:"Date Created",description:rn},572:{name:"Time Created",description:on},574:{name:"Digital Creation Date",description:rn},575:{name:"Digital Creation Time",description:on},577:"Originating Program",582:"Program Version",587:{name:"Object Cycle",description:function(e){var t=y(e);return"a"===t?"morning":"p"===t?"evening":"b"===t?"both":"Unknown"}},592:{name:"By-line",repeatable:1},597:{name:"By-line Title",repeatable:1},602:"City",604:"Sub-location",607:"Province/State",612:"Country/Primary Location Code",613:"Country/Primary Location Name",615:"Original Transmission Reference",617:"Headline",622:"Credit",627:"Source",628:"Copyright Notice",630:{name:"Contact",repeatable:1},632:"Caption/Abstract",634:{name:"Writer/Editor",repeatable:1},637:{name:"Rasterized Caption",description:function(e){return e}},642:"Image Type",643:{name:"Image Orientation",description:function(e){var t=y(e);return"P"===t?"Portrait":"L"===t?"Landscape":"S"===t?"Square":"Unknown"}},647:"Language Identifier",662:{name:"Audio Type",description:function(e){var t=y(e),n=t.charAt(0),r=t.charAt(1),i="";return"1"===n?i+="Mono":"2"===n&&(i+="Stereo"),"A"===r?i+=", actuality":"C"===r?i+=", question and answer session":"M"===r?i+=", music, transmitted by itself":"Q"===r?i+=", response to a question":"R"===r?i+=", raw sound":"S"===r?i+=", scener":"V"===r?i+=", voicer":"W"===r&&(i+=", wrap"),""!==i?i:t}},663:{name:"Audio Sampling Rate",description:function(e){return parseInt(y(e),10)+" Hz"}},664:{name:"Audio Sampling Resolution",description:function(e){var t=parseInt(y(e),10);return t+(1===t?" bit":" bits")}},665:{name:"Audio Duration",description:function(e){var t=y(e);return t.length>=6?t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2):t}},666:"Audio Outcue",698:"Short Document ID",699:"Unique Document ID",700:"Owner ID",712:{name:function(e){return 2===e.length?"ObjectData Preview File Format":"Record 2 destination"},description:function(e){if(2===e.length){var t=(e[0]<<8)+e[1];return 0===t?"No ObjectData":1===t?"IPTC-NAA Digital Newsphoto Parameter Record":2===t?"IPTC7901 Recommended Message Format":3===t?"Tagged Image File Format (Adobe/Aldus Image data)":4===t?"Illustrator (Adobe Graphics data)":5===t?"AppleSingle (Apple Computer Inc)":6===t?"NAA 89-3 (ANPA 1312)":7===t?"MacBinary II":8===t?"IPTC Unstructured Character Oriented File Format (UCOFF)":9===t?"United Press International ANPA 1312 variant":10===t?"United Press International Down-Load Message":11===t?"JPEG File Interchange (JFIF)":12===t?"Photo-CD Image-Pac (Eastman Kodak)":13===t?"Microsoft Bit Mapped Graphics File [*.BMP]":14===t?"Digital Audio File [*.WAV] (Microsoft & Creative Labs)":15===t?"Audio plus Moving Video [*.AVI] (Microsoft)":16===t?"PC DOS/Windows Executable Files [*.COM][*.EXE]":17===t?"Compressed Binary File [*.ZIP] (PKWare Inc)":18===t?"Audio Interchange File Format AIFF (Apple Computer Inc)":19===t?"RIFF Wave (Microsoft Corporation)":20===t?"Freehand (Macromedia/Aldus)":21===t?'Hypertext Markup Language "HTML" (The Internet Society)':22===t?"MPEG 2 Audio Layer 2 (Musicom), ISO/IEC":23===t?"MPEG 2 Audio Layer 3, ISO/IEC":24===t?"Portable Document File (*.PDF) Adobe":25===t?"News Industry Text Format (NITF)":26===t?"Tape Archive (*.TAR)":27===t?"Tidningarnas Telegrambyrå NITF version (TTNITF DTD)":28===t?"Ritzaus Bureau NITF version (RBNITF DTD)":29===t?"Corel Draw [*.CDR]":"Unknown format ".concat(t)}return y(e)}},713:{name:"ObjectData Preview File Format Version",description:function(e,t){var n={"00":{"00":"1"},"01":{"01":"1","02":"2","03":"3","04":"4"},"02":{"04":"4"},"03":{"01":"5.0","02":"6.0"},"04":{"01":"1.40"},"05":{"01":"2"},"06":{"01":"1"},11:{"01":"1.02"},20:{"01":"3.1","02":"4.0","03":"5.0","04":"5.5"},21:{"02":"2.0"}},r=y(e);if(t["ObjectData Preview File Format"]){var i=y(t["ObjectData Preview File Format"].value);if(n[i]&&n[i][r])return n[i][r]}return r}},714:"ObjectData Preview Data",1802:{name:"Size Mode",description:function(e){return e[0].toString()}},1812:{name:"Max Subfile Size",description:function(e){for(var t=0,n=0;n=8?t.substr(0,4)+"-"+t.substr(4,2)+"-"+t.substr(6,2):t}function on(e){var t=y(e),n=t;return t.length>=6&&(n=t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2),11===t.length&&(n+=t.substr(6,1)+t.substr(7,2)+":"+t.substr(9,2))),n}function an(e){var t=y(e);return"%G"===t?"UTF-8":"%5"===t?"Windows-1252":"%/G"===t?"UTF-8 Level 1":"%/H"===t?"UTF-8 Level 2":"%/I"===t?"UTF-8 Level 3":"/A"===t?"ISO-8859-1":"/B"===t?"ISO-8859-2":"/C"===t?"ISO-8859-3":"/D"===t?"ISO-8859-4":"/@"===t?"ISO-8859-5":"/G"===t?"ISO-8859-6":"/F"===t?"ISO-8859-7":"/H"===t?"ISO-8859-8":"Unknown"}var un=function(e,t){var n=function(){if("undefined"!=typeof TextDecoder)return TextDecoder}();if("undefined"!=typeof n&&void 0!==e)try{return new n(e).decode(t instanceof DataView?t.buffer:Uint8Array.from(t))}catch(e){}return function(e){try{return decodeURIComponent(escape(e))}catch(t){return e}}(t.map((function(e){return String.fromCharCode(e)})).join(""))},cn={read:function(e,t,n){try{if(Array.isArray(e))return dn(new DataView(Uint8Array.from(e).buffer),{size:e.length},0,n);var r=function(e,t){for(;t+12<=e.byteLength;){var n=fn(e,t);if(sn(n))return{naaBlock:n,dataOffset:t+12};t+=12+n.size+ln(n)}throw Error("No IPTC NAA resource block.")}(e,t);return dn(e,r.naaBlock,r.dataOffset,n)}catch(e){return{}}}};function fn(e,t){if(943868237!==e.getUint32(t,0))throw Error("Not an IPTC resource block.");return{type:e.getUint16(t+4),size:e.getUint16(t+10)}}function sn(e){return 1028===e.type}function ln(e){return e.size%2!=0?1:0}function dn(e,t,n,r){for(var i={},o=void 0,a=n+t.size;ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n1&&n.push(Pn(e,t.slice(1))),n}(e,t),function(e){if(Array.isArray(e))return e}(r)||function(e){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,r,i,o,a=[],u=1,c=0;try{for(i=(t=t.call(e)).next,!2;!(u=(n=i.call(t)).done)&&(a.push(n.value),2!==a.length);u=1);}catch(e){c=1,r=e}finally{try{if(!u&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw r}}return a}}(r)||function(e){if(e){if("string"==typeof e)return Cn(e,2);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Cn(e,2):void 0}}(r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],a=i[1],u=An(n,o);if(a){var c=An(n,a);u||c||(delete n._raw,An(n,Pn(e,t)))}return n}};function Pn(e,t){for(var n=t.reduce((function(e,t){return e+t.length}),0),r=new Uint8Array(n),i=0,o=0;o).+$/,"$1"),"application/xml");if("parsererror"===r.documentElement.nodeName)throw Error(r.documentElement.textContent);return{doc:r,raw:n}}(t),r=n.doc,i=n.raw;return e._raw=(e._raw||"")+i,l(e,xn(wn(En(r),1))),1}catch(e){return 0}}function En(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:0,r=function(e){for(var t=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:void 0;if(Array.isArray(e)){var n=function(e){return e.map((function(e){return void 0!==e.value?Dn(e.value):Dn(e)})).join(", ")}(e);return t&&"function"==typeof vn[t]?vn[t](e,n):n}if("object"===In(e))return function(e){var t=[];for(var n in e)t.push("".concat(Rn(n),": ").concat(Dn(e[n].value)));return t.join("; ")}(e);try{return t&&"function"==typeof vn[t]?vn[t](e):decodeURIComponent(escape(e))}catch(t){return e}}function Rn(e){return"CiAdrCity"===e?"CreatorCity":"CiAdrCtry"===e?"CreatorCountry":"CiAdrExtadr"===e?"CreatorAddress":"CiAdrPcode"===e?"CreatorPostalCode":"CiAdrRegion"===e?"CreatorRegion":"CiEmailWork"===e?"CreatorWorkEmail":"CiTelWork"===e?"CreatorWorkPhone":"CiUrlWork"===e?"CreatorWorkUrl":e}function Nn(e){var t={};for(var n in e)try{On(n)||(t[kn(n)]=Ln(e[n],n))}catch(e){}return t}function Ln(e,t){return function(e){return Array.isArray(e)}(e)?function(e,t){return Xn(e[e.length-1],t)}(e,t):function(e){return"Resource"===e.attributes["rdf:parseType"]&&"string"==typeof e.value&&""===e.value.trim()}(e)?{value:"",attributes:{},description:""}:_n(e)?Bn(e,t):jn(e)?zn(e,t):Vn(e)?Hn(e,t):function(e){return void 0!==Wn(e.value)}(e)?function(e,t){var n=Wn(e.value).value["rdf:li"],r=Gn(e),i=[];return void 0===n?n=[]:Array.isArray(n)||(n=[n]),n.forEach((function(e){i.push(function(e){return _n(e)?Bn(e):jn(e)?zn(e).value:Vn(e)?Hn(e).value:Xn(e)}(e))})),{value:i,attributes:r,description:Dn(i,t)}}(e,t):Xn(e,t)}function _n(e){return"Resource"===e.attributes["rdf:parseType"]&&void 0!==e.value["rdf:value"]||void 0!==e.value["rdf:Description"]&&void 0!==e.value["rdf:Description"].value["rdf:value"]}function Bn(e,t){var n=Gn(e);void 0!==e.value["rdf:Description"]&&(e=e.value["rdf:Description"]),l(n,Gn(e),function(e){var t={};for(var n in e.value)"rdf:value"===n||On(n)||(t[kn(n)]=e.value[n].value);return t}(e));var r=function(e){return Jn(e.value["rdf:value"])||e.value["rdf:value"].value}(e);return{value:r,attributes:n,description:Dn(r,t)}}function Gn(e){var t={};for(var n in e.attributes)"rdf:parseType"===n||"rdf:resource"===n||On(n)||(t[kn(n)]=e.attributes[n]);return t}function jn(e){return"Resource"===e.attributes["rdf:parseType"]||void 0!==e.value["rdf:Description"]&&void 0===e.value["rdf:Description"].value["rdf:value"]}function zn(e,t){var n={value:{},attributes:{}};return void 0!==e.value["rdf:Description"]&&(l(n.value,Fn(e.value["rdf:Description"].attributes)),l(n.attributes,Gn(e)),e=e.value["rdf:Description"]),l(n.value,Nn(e.value)),n.description=Dn(n.value,t),n}function Vn(e){return 0===Object.keys(e.value).length&&void 0===e.attributes["xml:lang"]&&void 0===e.attributes["rdf:resource"]}function Hn(e,t){var n=Fn(e.attributes);return{value:n,attributes:{},description:Dn(n,t)}}function Wn(e){return e["rdf:Bag"]||e["rdf:Seq"]||e["rdf:Alt"]}function Xn(e,t){var n=Jn(e)||xn(e.value);return{value:n,attributes:Gn(e),description:Dn(n,t)}}function Jn(e){return e.attributes&&e.attributes["rdf:resource"]}function Yn(e){return Yn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Yn(e)}function Kn(e,t,n){return(t=function(e){var t=function(e){if("object"!=Yn(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=Yn(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return e+""}(e);return"symbol"==Yn(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:1,configurable:1,writable:1}):e[t]=n,e}function qn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n>>31==0?1:-1,a=(2130706432&i)>>>32-n,u=i&parseInt(m("1",32-n),2);return o*function(e){return parseInt(e.replace(".",""),2)/Math.pow(2,(e.split(".")[1]||"").length)}(a.toString(2)+"."+(m("0",32-n-(r=u.toString(2)).length)+r))}function nr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n"}r[s||$n[c].name]=p}else t&&(r["undefined-".concat(c)]=p)}i+=l+l%2}return r}},ir="8BIM",or=2,ar=4,ur=ir.length;function cr(e,t){var n,r=function(e){if(Array.isArray(e))return e}(n=f(e,t))||function(e){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,r,i,o,a=[],u=1,c=0;try{for(i=(t=t.call(e)).next,!2;!(u=(n=i.call(t)).done)&&(a.push(n.value),2!==a.length);u=1);}catch(e){c=1,r=e}finally{try{if(!u&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw r}}return a}}(n)||function(e){if(e){if("string"==typeof e)return nr(e,2);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?nr(e,2):void 0}}(n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),i=r[0];return{tagName:r[1],tagNameSize:1+i+(i%2==0?1:0)}}var fr={desc:{name:"ICC Description"},cprt:{name:"ICC Copyright"},dmdd:{name:"ICC Device Model Description"},vued:{name:"ICC Viewing Conditions Description"},dmnd:{name:"ICC Device Manufacturer for Display"},tech:{name:"Technology"}},sr={4:{name:"Preferred CMM type",value:function(e,t){return a(e,t,4)},description:function(e){return null!==e?lr(e):""}},8:{name:"Profile Version",value:function(e,t){return e.getUint8(t).toString(10)+"."+(e.getUint8(t+1)>>4).toString(10)+"."+(e.getUint8(t+1)%16).toString(10)}},12:{name:"Profile/Device class",value:function(e,t){return a(e,t,4)},description:function(e){switch(e.toLowerCase()){case"scnr":return"Input Device profile";case"mntr":return"Display Device profile";case"prtr":return"Output Device profile";case"link":return"DeviceLink profile";case"abst":return"Abstract profile";case"spac":return"ColorSpace profile";case"nmcl":return"NamedColor profile";case"cenc":return"ColorEncodingSpace profile";case"mid ":return"MultiplexIdentification profile";case"mlnk":return"MultiplexLink profile";case"mvis":return"MultiplexVisualization profile";default:return e}}},16:{name:"Color Space",value:function(e,t){return a(e,t,4)}},20:{name:"Connection Space",value:function(e,t){return a(e,t,4)}},24:{name:"ICC Profile Date",value:function(e,t){return function(e,t){var n=e.getUint16(t),r=e.getUint16(t+2)-1,i=e.getUint16(t+4),o=e.getUint16(t+6),a=e.getUint16(t+8),u=e.getUint16(t+10);return new Date(Date.UTC(n,r,i,o,a,u))}(e,t).toISOString()}},36:{name:"ICC Signature",value:function(e,t){return n=e.buffer.slice(t,t+4),String.fromCharCode.apply(null,new Uint8Array(n));var n}},40:{name:"Primary Platform",value:function(e,t){return a(e,t,4)},description:function(e){return lr(e)}},48:{name:"Device Manufacturer",value:function(e,t){return a(e,t,4)},description:function(e){return lr(e)}},52:{name:"Device Model Number",value:function(e,t){return a(e,t,4)}},64:{name:"Rendering Intent",value:function(e,t){return e.getUint32(t)},description:function(e){switch(e){case 0:return"Perceptual";case 1:return"Relative Colorimetric";case 2:return"Saturation";case 3:return"Absolute Colorimetric";default:return e}}},80:{name:"Profile Creator",value:function(e,t){return a(e,t,4)}}};function lr(e){switch(e.toLowerCase()){case"appl":return"Apple";case"adbe":return"Adobe";case"msft":return"Microsoft";case"sunw":return"Sun Microsystems";case"sgi":return"Silicon Graphics";case"tgnt":return"Taligent";default:return e}}var dr={read:function(e,t,n){return n&&t[0].compressionMethod!==g?function(e,t){return 0!==t[0].compressionMethod?{}:h(new DataView(e.buffer.slice(t[0].offset,t[0].offset+t[0].length)),t[0].compressionMethod,"utf-8","dataview").then(Cr).catch((function(){return{}}))}(e,t):function(e,t){try{for(var n=t.reduce((function(e,t){return e+t.length}),0),r=new Uint8Array(n),i=0,o=function(e){return Array.isArray(e)?new DataView(Uint8Array.from(e).buffer).buffer:e.buffer}(e),a=function(e){var n=t.find((function(t){return t.chunkNumber===e}));if(!n)throw Error("ICC chunk ".concat(e," not found"));var a=o.slice(n.offset,n.offset+n.length),u=new Uint8Array(a);r.set(u,i),i+=u.length},u=1;u<=t.length;u++)a(u);return Cr(new DataView(r.buffer))}catch(e){return{}}}(e,t)}},pr=84,mr=128,gr="acsp",hr="desc",vr="mluc",yr="text",Sr="sig ",br=12;function Ir(e,t){return e.lengtht.length)return r;var y=a(e,h,4);if(y===hr){var S=e.getUint32(h+8);if(S>v)return r;Pr(r,g,Ur(t.slice(h+12,h+S+11)))}else if(y===vr){for(var b=e.getUint32(h+8),I=e.getUint32(h+12),C=h+16,U=[],P=0;Pe.byteLength)){var n=St.getLongAt(e,t);return{value:n,description:"".concat(n,"px")}}}function Tr(e,t){if(!(t+4+4>e.byteLength)){var n=St.getLongAt(e,t+4);return{value:n,description:"".concat(n,"px")}}}function xr(e,t){if(!(t+8+1>e.byteLength)){var n=St.getByteAt(e,t+8);return{value:n,description:"".concat(n)}}}function Fr(e,t){if(!(t+9+1>e.byteLength)){var n=St.getByteAt(e,t+9);return{value:n,description:{0:"Grayscale",2:"RGB",3:"Palette",4:"Grayscale with Alpha",6:"RGB with Alpha"}[n]||"Unknown"}}}function Mr(e,t){if(!(t+10+1>e.byteLength)){var n=St.getByteAt(e,t+10);return{value:n,description:0===n?"Deflate/Inflate":"Unknown"}}}function Or(e,t){if(!(t+11+1>e.byteLength)){var n=St.getByteAt(e,t+11);return{value:n,description:0===n?"Adaptive":"Unknown"}}}function kr(e,t){if(!(t+12+1>e.byteLength)){var n=St.getByteAt(e,t+12);return{value:n,description:{0:"Noninterlaced",1:"Adam7 Interlace"}[n]||"Unknown"}}}function Dr(e){return Dr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Dr(e)}var Rr={read:function(e,t,n,r){for(var i={},o=[],a=0;a0?Promise.all(o):void 0}}},Nr="STATE_KEYWORD",Lr="STATE_COMPRESSION",_r="STATE_LANG",Br="STATE_TRANSLATED_KEYWORD",Gr="STATE_TEXT",jr=1,zr=1,Vr=6;function Hr(e,t,n,r,i){for(var o,a=[],u=[],c=[],f=Nr,s=g,l=0;l".split(""),r,u,a)})):Jr(p,r,u,a)}function Wr(e){var t=e.type,n=e.dataView,r=e.offset;if(t===Ae){if(n.getUint8(r)===zr)return n.getUint8(r+1)}else if(t===Ee)return n.getUint8(r);return g}function Xr(e,t){return t===Nr&&[Ae,Ee].includes(e)?Lr:t===Lr?e===Ae?_r:Gr:t===_r?Br:Gr}function Jr(e,t,n,r){var i=function(e){return e instanceof DataView?a(e,0,e.byteLength):e}(e);return{name:Yr(t,n,r),value:i,description:t===Ae?Kr(e):i}}function Yr(e,t,n){var r=s(n);if(e===Pe||0===t.length)return r;var i=s(t);return"".concat(r," (").concat(i,")")}function Kr(e){return un("UTF-8",e)}function qr(e,t){return"raw profile type exif"===e.toLowerCase()&&"exif"===t.substring(1,5)}function $r(e,t){return"raw profile type iptc"===e.toLowerCase()&&"iptc"===t.substring(1,5)}function Qr(e){return function(e){for(var t=new DataView(new ArrayBuffer(e.length/2)),n=0;ne.byteLength)){var t=a(e,3,3);return{value:t,description:t}}}function di(e){if(!(8>e.byteLength)){var t=e.getUint16(6,1);return{value:t,description:"".concat(t,"px")}}}function pi(e){if(!(10>e.byteLength)){var t=e.getUint16(8,1);return{value:t,description:"".concat(t,"px")}}}function mi(e){if(!(11>e.byteLength)){var t=(128&e.getUint8(10))>>>7;return{value:t,description:1===t?"Yes":"No"}}}function gi(e){if(!(11>e.byteLength)){var t=1+((112&e.getUint8(10))>>>4);return{value:t,description:"".concat(t," ").concat(1===t?"bit":"bits")}}}function hi(e){if(!(11>e.byteLength)){var t=1+(7&e.getUint8(10));return{value:t,description:"".concat(t," ").concat(1===t?"bit":"bits")}}}var vi=[6,7,99],yi={get:function(e,t,n){if((i=t)&&(void 0===i.Compression||vi.includes(i.Compression.value))&&i.JPEGInterchangeFormat&&i.JPEGInterchangeFormat.value&&i.JPEGInterchangeFormatLength&&i.JPEGInterchangeFormatLength.value){t.type="image/jpeg";var r=n+t.JPEGInterchangeFormat.value;t.image=e.buffer.slice(r,r+t.JPEGInterchangeFormatLength.value),d(t,"base64",(function(){return p(this.image)}))}var i;return t}};function Si(e){this.name="MetadataMissingError",this.message=e||"No Exif data",this.stack=Error().stack}Si.prototype=Error();var bi={MetadataMissingError:Si},Ii={load:Ui,loadView:Ai,errors:bi},Ci=bi;function Ui(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(e){return"string"==typeof e}(e)?(n.async=1,function(e,t){return/^\w+:\/\//.test(e)?"undefined"!=typeof fetch?function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length,n={method:"GET"};return Number.isInteger(t)&&t>=0&&(n.headers={range:"bytes=0-".concat(t-1)}),fetch(e,n).then((function(e){return e.arrayBuffer()}))}(e,t):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i={};Number.isInteger(t)&&t>=0&&(i.headers={range:"bytes=0-".concat(t-1)});var o=function(e){return/^https:\/\//.test(e)?require("https").get:require("http").get}(e);o(e,i,(function(e){if(e.statusCode>=200&&e.statusCode<=299){var t=[];e.on("data",(function(e){return t.push(Buffer.from(e))})),e.on("error",(function(e){return r(e)})),e.on("end",(function(){return n(Buffer.concat(t))}))}else r("Could not fetch file: ".concat(e.statusCode," ").concat(e.statusMessage)),e.resume()})).on("error",(function(e){return r(e)}))}))}(e,t):function(e){return/^data:[^;,]*(;base64)?,/.test(e)}(e)?Promise.resolve(function(e){var t=e.substring(e.indexOf(",")+1);if(-1!==e.indexOf(";base64")){if("undefined"!=typeof atob)return Uint8Array.from(atob(t),(function(e){return e.charCodeAt(0)})).buffer;if("undefined"==typeof Buffer)return;return"undefined"!=typeof Buffer.from?Buffer.from(t,"base64"):new Buffer(t,"base64")}var n=decodeURIComponent(t);return"undefined"!=typeof Buffer?"undefined"!=typeof Buffer.from?Buffer.from(n):new Buffer(n):Uint8Array.from(n,(function(e){return e.charCodeAt(0)})).buffer}(e)):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i=function(){try{return require("fs")}catch(e){return}}();i.open(e,(function(o,a){o?r(o):i.stat(e,(function(o,u){if(o)r(o);else{var c=Math.min(u.size,void 0!==t?t:u.size),f=Buffer.alloc(c),s={buffer:f,length:c};i.read(a,s,(function(t){t?r(t):i.close(a,(function(t){t&&console.warn("Could not close file ".concat(e,":"),t),n(f)}))}))}}))}))}))}(e,t)}(e,n).then((function(e){return Pi(e,n)}))):function(e){return"undefined"!=typeof window&&"undefined"!=typeof File&&e instanceof File}(e)?(n.async=1,(t=e,new Promise((function(e,n){var r=new FileReader;r.onload=function(t){return e(t.target.result)},r.onerror=function(){return n(r.error)},r.readAsArrayBuffer(t)}))).then((function(e){return Pi(e,n)}))):Pi(e,n)}function Pi(e,t){return function(e){try{return Buffer.isBuffer(e)}catch(e){return 0}}(e)&&(e=new Uint8Array(e).buffer),Ai(function(e){try{return new DataView(e)}catch(t){return new i(e)}}(e),t)}function Ai(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{expanded:0,async:0,includeUnknown:0},n=t.expanded,r=void 0===n?0:n,i=t.async,o=void 0===i?0:i,a=t.includeUnknown,u=void 0===a?0:a,c=0,f={},d=[],p=et.parseAppMarkers(e,o),m=p.fileType,g=p.fileDataOffset,h=p.jfifDataOffset,y=p.tiffHeaderOffset,S=p.iptcDataOffset,I=p.xmpChunks,C=p.iccChunks,U=p.mpfDataOffset,P=p.pngHeaderOffset,A=p.pngTextChunks,E=p.pngChunkOffsets,w=p.vp8xChunkOffset,T=p.gifHeaderOffset;if(v.USE_JPEG&&v.USE_FILE&&function(e){return void 0!==e}(g)){c=1;var x=Vt.read(e,g);r?f.file=x:f=l({},f,x)}if(v.USE_JPEG&&v.USE_JFIF&&function(e){return void 0!==e}(h)){c=1;var F=qt.read(e,h);r?f.jfif=F:f=l({},f,F)}if(v.USE_EXIF&&function(e){return void 0!==e}(y)){c=1;var M=Ot.read(e,y,u),O=M.tags,k=M.byteOrder;if(O.Thumbnail&&(f.Thumbnail=O.Thumbnail,delete O.Thumbnail),r?(f.exif=O,function(e){if(e.exif){if(e.exif.GPSLatitude&&e.exif.GPSLatitudeRef)try{e.gps=e.gps||{},e.gps.Latitude=b(e.exif.GPSLatitude.value),"S"===e.exif.GPSLatitudeRef.value.join("")&&(e.gps.Latitude=-e.gps.Latitude)}catch(e){}if(e.exif.GPSLongitude&&e.exif.GPSLongitudeRef)try{e.gps=e.gps||{},e.gps.Longitude=b(e.exif.GPSLongitude.value),"W"===e.exif.GPSLongitudeRef.value.join("")&&(e.gps.Longitude=-e.gps.Longitude)}catch(e){}if(e.exif.GPSAltitude&&e.exif.GPSAltitudeRef)try{e.gps=e.gps||{},e.gps.Altitude=e.exif.GPSAltitude.value[0]/e.exif.GPSAltitude.value[1],1===e.exif.GPSAltitudeRef.value&&(e.gps.Altitude=-e.gps.Altitude)}catch(e){}}}(f)):f=l({},f,O),v.USE_TIFF&&v.USE_IPTC&&O["IPTC-NAA"]&&!Ei(S)){var D=cn.read(O["IPTC-NAA"].value,0,u);r?f.iptc=D:f=l({},f,D)}if(v.USE_TIFF&&v.USE_XMP&&O.ApplicationNotes&&!wi(I)){var R=Un.read(s(O.ApplicationNotes.value));r?f.xmp=R:(delete R._raw,f=l({},f,R))}if(v.USE_PHOTOSHOP&&O.ImageSourceData){var N=rr.read(O.PhotoshopSettings.value,u);r?f.photoshop=N:f=l({},f,N)}if(v.USE_TIFF&&v.USE_ICC&&O.ICC_Profile&&!Ti(C)){var L=dr.read(O.ICC_Profile.value,[{offset:0,length:O.ICC_Profile.value.length,chunkNumber:1,chunksTotal:1}]);r?f.icc=L:f=l({},f,L)}if(v.USE_MAKER_NOTES&&function(e){return e.Make&&e.Make.value&&Array.isArray(e.Make.value)&&"Canon"===e.Make.value[0]&&e.MakerNote&&e.MakerNote.__offset}(O)){var _=Ar.read(e,y,O.MakerNote.__offset,k,u);r?f.makerNotes=_:f=l({},f,_)}O.MakerNote&&delete O.MakerNote.__offset}if(v.USE_JPEG&&v.USE_IPTC&&Ei(S)){c=1;var B=cn.read(e,S,u);r?f.iptc=B:f=l({},f,B)}if(v.USE_XMP&&wi(I)){c=1;var G=Un.read(e,I);r?f.xmp=G:(delete G._raw,f=l({},f,G))}if((v.USE_JPEG||v.USE_WEBP)&&v.USE_ICC&&Ti(C)){c=1;var j=dr.read(e,C,o);j instanceof Promise?d.push(j.then($)):$(j)}if(v.USE_MPF&&function(e){return void 0!==e}(U)){c=1;var z=Nt.read(e,U,u);r?f.mpf=z:f=l({},f,z)}if(v.USE_PNG&&v.USE_PNG_FILE&&void 0!==P){c=1;var V=Er.read(e,P);r?(f.png=f.png?l({},f.png,V):V,f.pngFile=V):f=l({},f,V)}if(v.USE_PNG&&function(e){return void 0!==e}(A)){c=1;var H=Rr.read(e,A,o,u),W=H.readTags,X=H.readTagsPromise;Q(W),X&&d.push(X.then((function(e){return e.forEach(Q)})))}if(v.USE_PNG&&function(e){return void 0!==e}(E)){c=1;var J=Zr.read(e,E);r?f.png=f.png?l({},f.png,J):J:f=l({},f,J)}if(v.USE_WEBP&&function(e){return void 0!==e}(w)){c=1;var Y=ai.read(e,w);r?f.riff=f.riff?l({},f.riff,Y):Y:f=l({},f,Y)}if(v.USE_GIF&&function(e){return void 0!==e}(T)){c=1;var K=si.read(e,T);r?f.gif=f.gif?l({},f.gif,K):K:f=l({},f,K)}var q=(v.USE_JPEG||v.USE_WEBP)&&v.USE_EXIF&&v.USE_THUMBNAIL&&yi.get(e,f.Thumbnail,y);if(q?(c=1,f.Thumbnail=q):delete f.Thumbnail,m&&(r?(f.file||(f.file={}),f.file.FileType=m):f.FileType=m,c=1),!c)throw new bi.MetadataMissingError;return o?Promise.all(d).then((function(){return f})):f;function $(e){r?f.icc=e:f=l({},f,e)}function Q(e){if(r){for(var t=0,n=["exif","iptc"];t0}function Ti(e){return Array.isArray(e)&&e.length>0}return t}()})); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ExifReader=t():e.ExifReader=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:1,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:1})}},t={};function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e){var t=function(e){if("object"!=n(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return e+""}(e);return"symbol"==n(t)?t:t+""}e.r(t),e.d(t,{default:function(){return Ci},errors:function(){return Ui},load:function(){return Pi},loadView:function(){return Ei}});var i=function(){return e=function e(t){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),function(e){return"object"!==n(e)||void 0===e.length||void 0===e.readUInt8||void 0===e.readUInt16LE||void 0===e.readUInt16BE||void 0===e.readUInt32LE||void 0===e.readUInt32BE||void 0===e.readInt32LE||void 0===e.readInt32BE}(t))throw Error("DataView: Passed buffer type is unsupported.");this.buffer=t,this.byteLength=this.buffer.length},(t=[{key:"getUint8",value:function(e){return this.buffer.readUInt8(e)}},{key:"getUint16",value:function(e,t){return t?this.buffer.readUInt16LE(e):this.buffer.readUInt16BE(e)}},{key:"getUint32",value:function(e,t){return t?this.buffer.readUInt32LE(e):this.buffer.readUInt32BE(e)}},{key:"getInt32",value:function(e,t){return t?this.buffer.readInt32LE(e):this.buffer.readInt32BE(e)}}])&&function(e,t){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:"string";if(0===t&&"function"==typeof DecompressionStream){var i=new DecompressionStream("deflate"),o=new Blob([e]).stream().pipeThrough(i);return"dataview"===r?new Response(o).arrayBuffer().then((function(e){return new DataView(e)})):new Response(o).arrayBuffer().then((function(e){return new TextDecoder(n).decode(e)}))}return void 0!==t?Promise.reject("Unknown compression method ".concat(t,".")):e}var v={USE_FILE:1,USE_JFIF:1,USE_PNG_FILE:1,USE_EXIF:1,USE_IPTC:1,USE_XMP:1,USE_ICC:1,USE_MPF:1,USE_PHOTOSHOP:1,USE_THUMBNAIL:1,USE_TIFF:1,USE_JPEG:1,USE_PNG:1,USE_HEIC:1,USE_AVIF:1,USE_WEBP:1,USE_GIF:1,USE_MAKER_NOTES:1};function y(e){return e.map((function(e){return String.fromCharCode(e)})).join("")}function S(e){if(e.length>=8){var t=y(e.slice(0,8));if("ASCII\0\0\0"===t)return y(e.slice(8));if("JIS\0\0\0\0\0"===t)return"[JIS encoded text]";if("UNICODE\0"===t)return"[Unicode encoded text]";if("\0\0\0\0\0\0\0\0"===t)return"[Undefined encoding]"}return"Undefined"}function b(e){return e[0][0]/e[0][1]+e[1][0]/e[1][1]/60+e[2][0]/e[2][1]/3600}var I=18761,C=I,U=function(e,t){if(e.getUint16(t)===I)return I;if(19789===e.getUint16(t))return 19789;throw Error("Illegal byte order value. Faulty image.")},P=2,A=65496,E=2,w=4,T=2,x=2,F=10,M=18,O=33,k=79,D=18,R=8,N="ICC_PROFILE\0",L=w+N.length,_=L+1,B="MPF\0",G=65472,j=65474,z=65476,V=65499,H=65501,W=65498,X=65504,J=65505,Y=65506,K=65517,q=65519,$=65534,Q=65535,Z="JFIF",ee="Exif",te="http://ns.adobe.com/xap/1.0/\0",ne="http://ns.adobe.com/xmp/extension/\0",re="Photoshop 3.0";function ie(e,t){return e.getUint16(t)===G}function oe(e,t){return e.getUint16(t)===j}function ae(e,t){var n=N.length;return e.getUint16(t)===Y&&a(e,t+w,n)===N}function ue(e,t){var n=B.length;return e.getUint16(t)===Y&&a(e,t+w,n)===B}function ce(e,t){var n=Z.length;return e.getUint16(t)===X&&a(e,t+w,n)===Z&&0===e.getUint8(t+w+n)}function fe(e,t){var n=ee.length;return e.getUint16(t)===J&&a(e,t+w,n)===ee&&0===e.getUint8(t+w+n)}function se(e,t){return e.getUint16(t)===J&&function(e,t){var n=te.length;return a(e,t+w,n)===te}(e,t)}function le(e,t){return e.getUint16(t)===J&&function(e,t){var n=ne.length;return a(e,t+w,n)===ne}(e,t)}function de(e,t){return{dataOffset:e+O,length:t-(O-T)}}function pe(e,t){return{dataOffset:e+k,length:t-(k-T)}}function me(e,t){var n=re.length;return e.getUint16(t)===K&&a(e,t+w,n)===re&&0===e.getUint8(t+w+n)}function ge(e,t){var n=e.getUint16(t);return n>=X&&n<=q||n===$||n===G||n===j||n===z||n===V||n===H||n===W}function he(e,t){return e.getUint16(t)===Q}var ve="‰PNG\r\n\n",ye=4,Se=4,be=0,Ie=ye,Ce=ye+Se,Ue="XML:com.adobe.xmp\0",Pe="tEXt",Ae="iTXt",Ee="zTXt",we="pHYs",Te="tIME",xe="eXIf",Fe="iCCP";function Me(e,t){return"IHDR"===a(e,t+Ie,Se)}function Oe(e,t){return a(e,t+Ie,Se)===Ae&&a(e,t+Ce,Ue.length)===Ue}function ke(e,t,n){var r=a(e,t+Ie,Se);return r===Pe||r===Ae||r===Ee&&n}function De(e,t){return a(e,t+Ie,Se)===xe}function Re(e,t){return a(e,t+Ie,Se)===Fe}function Ne(e,t){var n=[we,Te],r=a(e,t+Ie,Se);return n.includes(r)}function Le(e,t){t+=Ce+Ue.length+1+1;for(var n=0;n<2&&t0)return ze(e,n,r)}function ze(e,t,n){return 4===n?e.getUint32(t):8===n?(console.warn("This file uses an 8-bit offset which is currently not supported by ExifReader. Contact the maintainer to get it fixed."),function(e,t){return e.getUint32(t+4)}(e,t)):0}var Ve=1165519206,He=1835625829;function We(e,t){var n=function(e,t){var n=e.getUint32(t);return function(e){return 0===e}(n)?{length:e.byteLength-t,contentOffset:t+4+4}:function(e){return 1===e}(n)&&function(e,t){return 0===e.getUint32(t+8)}(e,t)?{length:e.getUint32(t+12),contentOffset:t+4+4+8}:{length:n,contentOffset:t+4+4}}(e,t),r=n.length,i=n.contentOffset;if(!(r<8)){var o=e.getUint32(t+4);if(1718909296===o)return function(e,t,n){return{type:"ftyp",majorBrand:a(e,t,4),length:n}}(e,i,r);if(1768977008===o)return function(e,t,n,r){return{type:"iprp",subBoxes:Ke(e,n,r-(n-t)),length:r}}(e,t,i,r);if(1768973167===o)return function(e,t,n,r){return{type:"ipco",properties:Ke(e,n,r-(n-t)),length:r}}(e,t,i,r);if(1668246642===o)return function(e,t,n){return{type:"colr",icc:Ye(e,t),length:n}}(e,i,r);var c=e.getUint8(i);return 1835365473===o?function(e,t,n,r){return{type:"meta",subBoxes:Ke(e,n+3,r-(n+3-t)),length:r}}(e,t,i+1,r):1768714083===o?function(e,t,n,r){var i=function(e,t){var n={item:{dataReferenceIndex:2,extentCount:2,extent:{}}};e<2?(n.itemCount=2,n.item.itemId=2):2===e&&(n.itemCount=4,n.item.itemId=4),n.item.constructionMethod=1===e||2===e?2:0;var r={offsetSize:t,lengthSize:t,baseOffsetSize:t+1,indexSize:t+1};return r.itemCount=t+2,r.items=r.itemCount+n.itemCount,r.item={itemId:0},r.item.constructionMethod=r.item.itemId+n.item.itemId,r.item.dataReferenceIndex=r.item.constructionMethod+n.item.constructionMethod,{offsets:r,sizes:n}}(t,n+3),o=i.offsets,a=i.sizes,u=e.getUint8(o.offsetSize)>>4;a.item.extent.extentOffset=u;var c=15&e.getUint8(o.lengthSize);a.item.extent.extentLength=c;var f=e.getUint8(o.baseOffsetSize)>>4;a.item.baseOffset=f;var s=function(e,t,n){if(1===n||2===n)return 15&e.getUint8(t)}(e,o.indexSize,t);a.item.extent.extentIndex=void 0!==s?s:0;var l=function(e,t,n){return n<2?e.getUint16(t):2===n?e.getUint32(t):void 0}(e,o.itemCount,t);return{type:"iloc",items:Be(e,t,o,a,u,c,s,l),length:r}}(e,c,i+1,r):1768517222===o?function(e,t,n,r,i){var o=function(e,t){var n={entryCount:t+3},r={};return r.entryCount=0===e?2:4,n.itemInfos=n.entryCount+r.entryCount,{offsets:n}}(n,r),a=o.offsets;return{type:"iinf",itemInfos:Ke(e,a.itemInfos,i-(a.itemInfos-t)),length:i}}(e,t,c,i+1,r):1768842853===o?function(e,t,n,r,i){r+=3;var o={type:"infe",length:i};return 0!==n&&1!==n||(o.itemId=e.getUint16(r),r+=2,o.itemProtectionIndex=e.getUint16(r),r+=2,o.itemName=u(e,r),r+=o.itemName.length+1),n>=2&&(2===n?(o.itemId=e.getUint16(r),r+=2):3===n&&(o.itemId=e.getUint32(r),r+=4),o.itemProtectionIndex=e.getUint16(r),r+=2,o.itemType=e.getUint32(r),r+=4,o.itemName=u(e,r),r+=o.itemName.length+1,o.itemType===He?(o.contentType=u(e,r),t+i>(r+=o.contentType.length+1)&&(o.contentEncoding=u(e,r),r+=o.contentEncoding.length+1)):1970432288===o.itemType&&(o.itemUri=u(e,r),r+=o.itemUri.length+1)),o}(e,t,c,i+1,r):{type:void 0,length:r}}}function Xe(e){if(v.USE_EXIF||v.USE_XMP||v.USE_ICC){var t={},n=function(e){for(var t=0;t+4+4<=e.byteLength;){var n=We(e,t);if(void 0===n)break;if("meta"===n.type)return n;t+=n.length}}(e);return n?(v.USE_EXIF&&(t.tiffHeaderOffset=function(e,t){try{var n=function(e){return e.subBoxes.find((function(e){return"iinf"===e.type})).itemInfos.find((function(e){return e.itemType===Ve}))}(t).itemId,r=Je(t,n);return function(e,t){return t+4+e.getUint32(t)}(e,r.baseOffset+r.extents[0].extentOffset)}catch(e){return}}(e,n)),v.USE_XMP&&(t.xmpChunks=function(e){try{var t=function(e){return e.subBoxes.find((function(e){return"iinf"===e.type})).itemInfos.find((function(e){return e.itemType===He&&"application/rdf+xml"===e.contentType}))}(e).itemId,n=Je(e,t),r=Je(e,t).extents[0];return[{dataOffset:n.baseOffset+r.extentOffset,length:r.extentLength}]}catch(e){return}}(n)),v.USE_ICC&&(t.iccChunks=function(e){try{var t=e.subBoxes.find((function(e){return"iprp"===e.type})).subBoxes.find((function(e){return"ipco"===e.type})).properties.find((function(e){return"colr"===e.type})).icc;if(t)return[t]}catch(e){}}(n)),t.hasAppMarkers=void 0!==t.tiffHeaderOffset||void 0!==t.xmpChunks||void 0!==t.iccChunks,t):{hasAppMarkers:0}}return{}}function Je(e,t){return e.subBoxes.find((function(e){return"iloc"===e.type})).items.find((function(e){return e.itemId===t}))}function Ye(e,t){var n=a(e,t,4);if("prof"===n||"rICC"===n)return{offset:t+4,length:e.getUint32(t+4),chunkNumber:1,chunksTotal:1}}function Ke(e,t,n){for(var r=[Ve,He],i=[],o=t;o=4&&function(e){var t=e.getUint16(0)===C;return 42===e.getUint16(2,t)}(e)}(e))return tt(v.USE_EXIF?{hasAppMarkers:1,tiffHeaderOffset:0}:{},"tiff","TIFF");if(v.USE_JPEG&&function(e){return!!e&&e.byteLength>=P&&e.getUint16(0)===A}(e))return tt(function(e){for(var t,n,r,i,o,a,u,c,f,s=E;s+w+5<=e.byteLength;){if(v.USE_FILE&&ie(e,s))t=e.getUint16(s+T),n=s+T;else if(v.USE_FILE&&oe(e,s))t=e.getUint16(s+T),r=s+T;else if(v.USE_JFIF&&ce(e,s))t=e.getUint16(s+T),i=s+x;else if(v.USE_EXIF&&fe(e,s))t=e.getUint16(s+T),o=s+F;else if(v.USE_XMP&&se(e,s))u||(u=[]),t=e.getUint16(s+T),u.push(de(s,t));else if(v.USE_XMP&&le(e,s))u||(u=[]),t=e.getUint16(s+T),u.push(pe(s,t));else if(v.USE_IPTC&&me(e,s))t=e.getUint16(s+T),a=s+M;else if(v.USE_ICC&&ae(e,s)){t=e.getUint16(s+T);var l=s+D,d=t-(D-T),p=e.getUint8(s+L),m=e.getUint8(s+_);c||(c=[]),c.push({offset:l,length:d,chunkNumber:p,chunksTotal:m})}else if(v.USE_MPF&&ue(e,s))t=e.getUint16(s+T),f=s+R;else{if(!ge(e,s)){if(he(e,s)){s++;continue}break}t=e.getUint16(s+T)}s+=T+t}return{hasAppMarkers:s>E,fileDataOffset:n||r,jfifDataOffset:i,tiffHeaderOffset:o,iptcDataOffset:a,xmpChunks:u,iccChunks:c,mpfDataOffset:f}}(e),"jpeg","JPEG");if(v.USE_PNG&&function(e){return!!e&&a(e,0,ve.length)===ve}(e))return tt(function(e,t){for(var n={hasAppMarkers:0},r=ve.length;r+ye+Se<=e.byteLength;){if(v.USE_PNG_FILE&&Me(e,r))n.hasAppMarkers=1,n.pngHeaderOffset=r+Ce;else if(v.USE_XMP&&Oe(e,r)){var i=Le(e,r);void 0!==i&&(n.hasAppMarkers=1,n.xmpChunks=[{dataOffset:i,length:e.getUint32(r+be)-(i-(r+Ce))}])}else if(ke(e,r,t)){n.hasAppMarkers=1;var o=a(e,r+Ie,Se);n.pngTextChunks||(n.pngTextChunks=[]),n.pngTextChunks.push({length:e.getUint32(r+be),type:o,offset:r+Ce})}else if(De(e,r))n.hasAppMarkers=1,n.tiffHeaderOffset=r+Ce;else if(v.USE_ICC&&t&&Re(e,r)){n.hasAppMarkers=1;var u=e.getUint32(r+be),c=r+Ce,f=_e(e,c),s=f.profileName,l=f.compressionMethod,d=f.compressedProfileOffset;n.iccChunks||(n.iccChunks=[]),n.iccChunks.push({offset:d,length:u-(d-c),chunkNumber:1,chunksTotal:1,profileName:s,compressionMethod:l})}else Ne(e,r)&&(n.hasAppMarkers=1,n.pngChunkOffsets||(n.pngChunkOffsets=[]),n.pngChunkOffsets.push(r+be));r+=e.getUint32(r+be)+ye+Se+4}return n}(e,t),"png","PNG");if(v.USE_HEIC&&function(e){if(!e)return 0;try{var t=We(e,0);return t&&-1!==["heic","heix","hevc","hevx","heim","heis","hevm","hevs","mif1"].indexOf(t.majorBrand)}catch(e){return 0}}(e))return tt(function(e){return Xe(e)}(e),"heic","HEIC");if(v.USE_AVIF&&function(e){if(!e)return 0;try{var t=We(e,0);return t&&"avif"===t.majorBrand}catch(e){return 0}}(e))return tt(function(e){return Xe(e)}(e),"avif","AVIF");if(v.USE_WEBP&&function(e){return!!e&&"RIFF"===a(e,0,4)&&"WEBP"===a(e,8,4)}(e))return tt(function(e){for(var t,n,r,i,o=12,u=0;o+8.25){var t=e[0]/e[1];return Number.isInteger(t)?""+t:t.toFixed(1)}return 0!==e[0]?"1/".concat(Math.round(e[1]/e[0])):"0/".concat(e[1])},FNumber:function(e){return"f/".concat(e[0]/e[1])},FocalLength:function(e){return e[0]/e[1]+" mm"},FocalPlaneResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},LightSource:function(e){return 1===e?"Daylight":2===e?"Fluorescent":3===e?"Tungsten (incandescent light)":4===e?"Flash":9===e?"Fine weather":10===e?"Cloudy weather":11===e?"Shade":12===e?"Daylight fluorescent (D 5700 – 7100K)":13===e?"Day white fluorescent (N 4600 – 5400K)":14===e?"Cool white fluorescent (W 3900 – 4500K)":15===e?"White fluorescent (WW 3200 – 3700K)":17===e?"Standard light A":18===e?"Standard light B":19===e?"Standard light C":20===e?"D55":21===e?"D65":22===e?"D75":23===e?"D50":24===e?"ISO studio tungsten":255===e?"Other light source":"Unknown"},MeteringMode:function(e){return 1===e?"Average":2===e?"CenterWeightedAverage":3===e?"Spot":4===e?"MultiSpot":5===e?"Pattern":6===e?"Partial":255===e?"Other":"Unknown"},ResolutionUnit:function(e){return 2===e?"inches":3===e?"centimeters":"Unknown"},Saturation:function(e){return 0===e?"Normal":1===e?"Low saturation":2===e?"High saturation":"Unknown"},SceneCaptureType:function(e){return 0===e?"Standard":1===e?"Landscape":2===e?"Portrait":3===e?"Night scene":"Unknown"},Sharpness:function(e){return 0===e?"Normal":1===e?"Soft":2===e?"Hard":"Unknown"},ShutterSpeedValue:function(e){var t=Math.pow(2,e[0]/e[1]);return t<=1?"".concat(Math.round(1/t)):"1/".concat(Math.round(t))},WhiteBalance:function(e){return 0===e?"Auto white balance":1===e?"Manual white balance":"Unknown"},XResolution:function(e){return""+Math.round(e[0]/e[1])},YResolution:function(e){return""+Math.round(e[0]/e[1])}},rt={11:"ProcessingSoftware",254:{name:"SubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image",3:"Single page of multi-page reduced-resolution image",4:"Transparency mask",5:"Transparency mask of reduced-resolution image",6:"Transparency mask of multi-page image",7:"Transparency mask of reduced-resolution multi-page image",65537:"Alternate reduced-resolution image",4294967295:"Invalid"}[e]||"Unknown"}},255:{name:"OldSubfileType",description:function(e){return{0:"Full-resolution image",1:"Reduced-resolution image",2:"Single page of multi-page image"}[e]||"Unknown"}},256:"ImageWidth",257:"ImageLength",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",263:{name:"Thresholding",description:function(e){return{1:"No dithering or halftoning",2:"Ordered dither or halfton",3:"Randomized dither"}[e]||"Unknown"}},264:"CellWidth",265:"CellLength",266:{name:"FillOrder",description:function(e){return{1:"Normal",2:"Reversed"}[e]||"Unknown"}},269:"DocumentName",270:"ImageDescription",271:"Make",272:"Model",273:"StripOffsets",274:{name:"Orientation",description:function(e){return 1===e?"top-left":2===e?"top-right":3===e?"bottom-right":4===e?"bottom-left":5===e?"left-top":6===e?"right-top":7===e?"right-bottom":8===e?"left-bottom":"Undefined"}},277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",280:"MinSampleValue",281:"MaxSampleValue",282:{name:"XResolution",description:nt.XResolution},283:{name:"YResolution",description:nt.YResolution},284:"PlanarConfiguration",285:"PageName",286:{name:"XPosition",description:function(e){return""+Math.round(e[0]/e[1])}},287:{name:"YPosition",description:function(e){return""+Math.round(e[0]/e[1])}},290:{name:"GrayResponseUnit",description:function(e){return{1:"0.1",2:"0.001",3:"0.0001",4:"1e-05",5:"1e-06"}[e]||"Unknown"}},296:{name:"ResolutionUnit",description:nt.ResolutionUnit},297:"PageNumber",301:"TransferFunction",305:"Software",306:"DateTime",315:"Artist",316:"HostComputer",317:"Predictor",318:{name:"WhitePoint",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},319:{name:"PrimaryChromaticities",description:function(e){return e.map((function(e){return"".concat(e[0],"/").concat(e[1])})).join(", ")}},321:"HalftoneHints",322:"TileWidth",323:"TileLength",330:"A100DataOffset",332:{name:"InkSet",description:function(e){return{1:"CMYK",2:"Not CMYK"}[e]||"Unknown"}},337:"TargetPrinter",338:{name:"ExtraSamples",description:function(e){return{0:"Unspecified",1:"Associated Alpha",2:"Unassociated Alpha"}[e]||"Unknown"}},339:{name:"SampleFormat",description:function(e){var t={1:"Unsigned",2:"Signed",3:"Float",4:"Undefined",5:"Complex int",6:"Complex float"};return Array.isArray(e)?e.map((function(e){return t[e]||"Unknown"})).join(", "):"Unknown"}},513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",529:{name:"YCbCrCoefficients",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join("/")}},530:"YCbCrSubSampling",531:{name:"YCbCrPositioning",description:function(e){return 1===e?"centered":2===e?"co-sited":"undefined "+e}},532:{name:"ReferenceBlackWhite",description:function(e){return e.map((function(e){return""+e[0]/e[1]})).join(", ")}},700:"ApplicationNotes",18246:"Rating",18249:"RatingPercent",33432:{name:"Copyright",description:function(e){return e.join("; ")}},33550:"PixelScale",33723:"IPTC-NAA",33920:"IntergraphMatrix",33922:"ModelTiePoint",34118:"SEMInfo",34264:"ModelTransform",34377:"PhotoshopSettings",34665:"Exif IFD Pointer",34675:"ICC_Profile",34735:"GeoTiffDirectory",34736:"GeoTiffDoubleParams",34737:"GeoTiffAsciiParams",34853:"GPS Info IFD Pointer",40091:{name:"XPTitle",description:it},40092:{name:"XPComment",description:it},40093:{name:"XPAuthor",description:it},40094:{name:"XPKeywords",description:it},40095:{name:"XPSubject",description:it},42112:"GDALMetadata",42113:"GDALNoData",50341:"PrintIM",50707:"DNGBackwardVersion",50708:"UniqueCameraModel",50709:"LocalizedCameraModel",50721:"ColorMatrix1",50722:"ColorMatrix2",50723:"CameraCalibration1",50724:"CameraCalibration2",50725:"ReductionMatrix1",50726:"ReductionMatrix2",50727:"AnalogBalance",50728:"AsShotNeutral",50729:"AsShotWhiteXY",50730:"BaselineExposure",50731:"BaselineNoise",50732:"BaselineSharpness",50734:"LinearResponseLimit",50735:"CameraSerialNumber",50736:"DNGLensInfo",50739:"ShadowScale",50741:{name:"MakerNoteSafety",description:function(e){return{0:"Unsafe",1:"Safe"}[e]||"Unknown"}},50778:{name:"CalibrationIlluminant1",description:nt.LightSource},50779:{name:"CalibrationIlluminant2",description:nt.LightSource},50781:"RawDataUniqueID",50827:"OriginalRawFileName",50828:"OriginalRawFileData",50831:"AsShotICCProfile",50832:"AsShotPreProfileMatrix",50833:"CurrentICCProfile",50834:"CurrentPreProfileMatrix",50879:"ColorimetricReference",50885:"SRawType",50898:"PanasonicTitle",50899:"PanasonicTitle2",50931:"CameraCalibrationSig",50932:"ProfileCalibrationSig",50933:"ProfileIFD",50934:"AsShotProfileName",50936:"ProfileName",50937:"ProfileHueSatMapDims",50938:"ProfileHueSatMapData1",50939:"ProfileHueSatMapData2",50940:"ProfileToneCurve",50941:{name:"ProfileEmbedPolicy",description:function(e){return{0:"Allow Copying",1:"Embed if Used",2:"Never Embed",3:"No Restrictions"}[e]||"Unknown"}},50942:"ProfileCopyright",50964:"ForwardMatrix1",50965:"ForwardMatrix2",50966:"PreviewApplicationName",50967:"PreviewApplicationVersion",50968:"PreviewSettingsName",50969:"PreviewSettingsDigest",50970:{name:"PreviewColorSpace",description:function(e){return{1:"Gray Gamma 2.2",2:"sRGB",3:"Adobe RGB",4:"ProPhoto RGB"}[e]||"Unknown"}},50971:"PreviewDateTime",50972:"RawImageDigest",50973:"OriginalRawFileDigest",50981:"ProfileLookTableDims",50982:"ProfileLookTableData",51043:"TimeCodes",51044:"FrameRate",51058:"TStop",51081:"ReelName",51089:"OriginalDefaultFinalSize",51090:"OriginalBestQualitySize",51091:"OriginalDefaultCropSize",51105:"CameraLabel",51107:{name:"ProfileHueSatMapEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51108:{name:"ProfileLookTableEncoding",description:function(e){return{0:"Linear",1:"sRGB"}[e]||"Unknown"}},51109:"BaselineExposureOffset",51110:{name:"DefaultBlackRender",description:function(e){return{0:"Auto",1:"None"}[e]||"Unknown"}},51111:"NewRawImageDigest",51112:"RawToPreviewGain"};function it(e){return new TextDecoder("utf-16").decode(new Uint8Array(e)).replace(/\u0000+$/,"")}function ot(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.byteLength);f++){var s=wt(e,t,n,r,i,o);void 0!==s&&(u[s.name]={id:s.id,value:s.value,description:s.description},"MakerNote"===s.name&&(u[s.name].__offset=s.__offset)),r+=12}if(v.USE_THUMBNAIL&&r",d===bt.tagTypes.ASCII&&(a=function(e){try{return e.map((function(e){return decodeURIComponent(escape(e))}))}catch(t){return e}}(a=function(e){for(var t=[],n=0,r=0;r5&&void 0!==arguments[5]&&arguments[5]&&(r*=bt.typeSizes[n],n=bt.tagTypes.BYTE);for(var a=0;a>31&1,e>>30&1,e>>29&1],n=[];return t[0]&&n.push("Dependent Parent Image"),t[1]&&n.push("Dependent Child Image"),t[2]&&n.push("Representative Image"),{value:t,description:n.join(", ")||"None"}}function jt(e){var t=e>>24&7;return{value:t,description:0===t?"JPEG":"Unknown"}}function zt(e){var t=16777215&e;return{value:t,description:{196608:"Baseline MP Primary Image",65537:"Large Thumbnail (VGA equivalent)",65538:"Large Thumbnail (Full HD equivalent)",131073:"Multi-Frame Image (Panorama)",131074:"Multi-Frame Image (Disparity)",131075:"Multi-Frame Image (Multi-Angle)",0:"Undefined"}[t]||"Unknown"}}function Vt(e,t,n,r){return function(e){return 0===e}(e)?0:Bt(t.value,e*_t+8,bt.getTypeSize("LONG"),n)+r}var Ht={read:function(e,t){var n=function(e,t){return bt.getShortAt(e,t)}(e,t),r=function(e,t,n){if(!(8>n)){var r=bt.getByteAt(e,t+7);return{value:r,description:""+r}}}(e,t,n);return{"Bits Per Sample":Wt(e,t,n),"Image Height":Xt(e,t,n),"Image Width":Jt(e,t,n),"Color Components":r,Subsampling:r&&Yt(e,t,r.value,n)}}};function Wt(e,t,n){if(!(3>n)){var r=bt.getByteAt(e,t+2);return{value:r,description:""+r}}}function Xt(e,t,n){if(!(5>n)){var r=bt.getShortAt(e,t+3);return{value:r,description:"".concat(r,"px")}}}function Jt(e,t,n){if(!(7>n)){var r=bt.getShortAt(e,t+5);return{value:r,description:"".concat(r,"px")}}}function Yt(e,t,n,r){if(!(8+3*n>r)){for(var i=[],o=0;o1?Kt(i)+qt(i):""}}}function Kt(e){var t={1:"Y",2:"Cb",3:"Cr",4:"I",5:"Q"};return e.map((function(e){return t[e[0]]})).join("")}function qt(e){var t={17:"4:4:4 (1 1)",18:"4:4:0 (1 2)",20:"4:4:1 (1 4)",33:"4:2:2 (2 1)",34:"4:2:0 (2 2)",36:"4:2:1 (2 4)",65:"4:1:1 (4 1)",66:"4:1:0 (4 2)"};return 0===e.length||void 0===e[0][1]||void 0===t[e[0][1]]?"":t[e[0][1]]}var $t={read:function(e,t){var n=function(e,t){return bt.getShortAt(e,t)}(e,t),r=function(e,t,n){if(!(15>n)){var r=bt.getByteAt(e,t+14);return{value:r,description:"".concat(r,"px")}}}(e,t,n),i=function(e,t,n){if(!(16>n)){var r=bt.getByteAt(e,t+15);return{value:r,description:"".concat(r,"px")}}}(e,t,n),o={"JFIF Version":Qt(e,t,n),"Resolution Unit":Zt(e,t,n),XResolution:tn(e,t,n),YResolution:nn(e,t,n),"JFIF Thumbnail Width":r,"JFIF Thumbnail Height":i};if(void 0!==r&&void 0!==i){var a=function(e,t,n,r){if(!(0===n||16+n>r))return{value:e.buffer.slice(t+16,t+16+n),description:"<24-bit RGB pixel data>"}}(e,t,3*r.value*i.value,n);a&&(o["JFIF Thumbnail"]=a)}for(var u in o)void 0===o[u]&&delete o[u];return o}};function Qt(e,t,n){if(!(9>n)){var r=bt.getByteAt(e,t+7),i=bt.getByteAt(e,t+7+1);return{value:256*r+i,description:r+"."+i}}}function Zt(e,t,n){if(!(10>n)){var r=bt.getByteAt(e,t+9);return{value:r,description:en(r)}}}function en(e){return 0===e?"None":1===e?"inches":2===e?"cm":"Unknown"}function tn(e,t,n){if(!(12>n)){var r=bt.getShortAt(e,t+10);return{value:r,description:""+r}}}function nn(e,t,n){if(!(14>n)){var r=bt.getShortAt(e,t+12);return{value:r,description:""+r}}}var rn={iptc:{256:{name:"Model Version",description:function(e){return""+((e[0]<<8)+e[1])}},261:{name:"Destination",repeatable:1},276:{name:"File Format",description:function(e){return""+((e[0]<<8)+e[1])}},278:{name:"File Format Version",description:function(e){return""+((e[0]<<8)+e[1])}},286:"Service Identifier",296:"Envelope Number",306:"Product ID",316:"Envelope Priority",326:{name:"Date Sent",description:on},336:{name:"Time Sent",description:an},346:{name:"Coded Character Set",description:un,encoding_name:un},356:"UNO",376:{name:"ARM Identifier",description:function(e){return""+((e[0]<<8)+e[1])}},378:{name:"ARM Version",description:function(e){return""+((e[0]<<8)+e[1])}},512:{name:"Record Version",description:function(e){return""+((e[0]<<8)+e[1])}},515:"Object Type Reference",516:"Object Attribute Reference",517:"Object Name",519:"Edit Status",520:{name:"Editorial Update",description:function(e){return"01"===y(e)?"Additional Language":"Unknown"}},522:"Urgency",524:{name:"Subject Reference",repeatable:1,description:function(e){var t=y(e).split(":");return t[2]+(t[3]?"/"+t[3]:"")+(t[4]?"/"+t[4]:"")}},527:"Category",532:{name:"Supplemental Category",repeatable:1},534:"Fixture Identifier",537:{name:"Keywords",repeatable:1},538:{name:"Content Location Code",repeatable:1},539:{name:"Content Location Name",repeatable:1},542:"Release Date",547:"Release Time",549:"Expiration Date",550:"Expiration Time",552:"Special Instructions",554:{name:"Action Advised",description:function(e){var t=y(e);return"01"===t?"Object Kill":"02"===t?"Object Replace":"03"===t?"Object Append":"04"===t?"Object Reference":"Unknown"}},557:{name:"Reference Service",repeatable:1},559:{name:"Reference Date",repeatable:1},562:{name:"Reference Number",repeatable:1},567:{name:"Date Created",description:on},572:{name:"Time Created",description:an},574:{name:"Digital Creation Date",description:on},575:{name:"Digital Creation Time",description:an},577:"Originating Program",582:"Program Version",587:{name:"Object Cycle",description:function(e){var t=y(e);return"a"===t?"morning":"p"===t?"evening":"b"===t?"both":"Unknown"}},592:{name:"By-line",repeatable:1},597:{name:"By-line Title",repeatable:1},602:"City",604:"Sub-location",607:"Province/State",612:"Country/Primary Location Code",613:"Country/Primary Location Name",615:"Original Transmission Reference",617:"Headline",622:"Credit",627:"Source",628:"Copyright Notice",630:{name:"Contact",repeatable:1},632:"Caption/Abstract",634:{name:"Writer/Editor",repeatable:1},637:{name:"Rasterized Caption",description:function(e){return e}},642:"Image Type",643:{name:"Image Orientation",description:function(e){var t=y(e);return"P"===t?"Portrait":"L"===t?"Landscape":"S"===t?"Square":"Unknown"}},647:"Language Identifier",662:{name:"Audio Type",description:function(e){var t=y(e),n=t.charAt(0),r=t.charAt(1),i="";return"1"===n?i+="Mono":"2"===n&&(i+="Stereo"),"A"===r?i+=", actuality":"C"===r?i+=", question and answer session":"M"===r?i+=", music, transmitted by itself":"Q"===r?i+=", response to a question":"R"===r?i+=", raw sound":"S"===r?i+=", scener":"V"===r?i+=", voicer":"W"===r&&(i+=", wrap"),""!==i?i:t}},663:{name:"Audio Sampling Rate",description:function(e){return parseInt(y(e),10)+" Hz"}},664:{name:"Audio Sampling Resolution",description:function(e){var t=parseInt(y(e),10);return t+(1===t?" bit":" bits")}},665:{name:"Audio Duration",description:function(e){var t=y(e);return t.length>=6?t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2):t}},666:"Audio Outcue",698:"Short Document ID",699:"Unique Document ID",700:"Owner ID",712:{name:function(e){return 2===e.length?"ObjectData Preview File Format":"Record 2 destination"},description:function(e){if(2===e.length){var t=(e[0]<<8)+e[1];return 0===t?"No ObjectData":1===t?"IPTC-NAA Digital Newsphoto Parameter Record":2===t?"IPTC7901 Recommended Message Format":3===t?"Tagged Image File Format (Adobe/Aldus Image data)":4===t?"Illustrator (Adobe Graphics data)":5===t?"AppleSingle (Apple Computer Inc)":6===t?"NAA 89-3 (ANPA 1312)":7===t?"MacBinary II":8===t?"IPTC Unstructured Character Oriented File Format (UCOFF)":9===t?"United Press International ANPA 1312 variant":10===t?"United Press International Down-Load Message":11===t?"JPEG File Interchange (JFIF)":12===t?"Photo-CD Image-Pac (Eastman Kodak)":13===t?"Microsoft Bit Mapped Graphics File [*.BMP]":14===t?"Digital Audio File [*.WAV] (Microsoft & Creative Labs)":15===t?"Audio plus Moving Video [*.AVI] (Microsoft)":16===t?"PC DOS/Windows Executable Files [*.COM][*.EXE]":17===t?"Compressed Binary File [*.ZIP] (PKWare Inc)":18===t?"Audio Interchange File Format AIFF (Apple Computer Inc)":19===t?"RIFF Wave (Microsoft Corporation)":20===t?"Freehand (Macromedia/Aldus)":21===t?'Hypertext Markup Language "HTML" (The Internet Society)':22===t?"MPEG 2 Audio Layer 2 (Musicom), ISO/IEC":23===t?"MPEG 2 Audio Layer 3, ISO/IEC":24===t?"Portable Document File (*.PDF) Adobe":25===t?"News Industry Text Format (NITF)":26===t?"Tape Archive (*.TAR)":27===t?"Tidningarnas Telegrambyrå NITF version (TTNITF DTD)":28===t?"Ritzaus Bureau NITF version (RBNITF DTD)":29===t?"Corel Draw [*.CDR]":"Unknown format ".concat(t)}return y(e)}},713:{name:"ObjectData Preview File Format Version",description:function(e,t){var n={"00":{"00":"1"},"01":{"01":"1","02":"2","03":"3","04":"4"},"02":{"04":"4"},"03":{"01":"5.0","02":"6.0"},"04":{"01":"1.40"},"05":{"01":"2"},"06":{"01":"1"},11:{"01":"1.02"},20:{"01":"3.1","02":"4.0","03":"5.0","04":"5.5"},21:{"02":"2.0"}},r=y(e);if(t["ObjectData Preview File Format"]){var i=y(t["ObjectData Preview File Format"].value);if(n[i]&&n[i][r])return n[i][r]}return r}},714:"ObjectData Preview Data",1802:{name:"Size Mode",description:function(e){return e[0].toString()}},1812:{name:"Max Subfile Size",description:function(e){for(var t=0,n=0;n=8?t.substr(0,4)+"-"+t.substr(4,2)+"-"+t.substr(6,2):t}function an(e){var t=y(e),n=t;return t.length>=6&&(n=t.substr(0,2)+":"+t.substr(2,2)+":"+t.substr(4,2),11===t.length&&(n+=t.substr(6,1)+t.substr(7,2)+":"+t.substr(9,2))),n}function un(e){var t=y(e);return"%G"===t?"UTF-8":"%5"===t?"Windows-1252":"%/G"===t?"UTF-8 Level 1":"%/H"===t?"UTF-8 Level 2":"%/I"===t?"UTF-8 Level 3":"/A"===t?"ISO-8859-1":"/B"===t?"ISO-8859-2":"/C"===t?"ISO-8859-3":"/D"===t?"ISO-8859-4":"/@"===t?"ISO-8859-5":"/G"===t?"ISO-8859-6":"/F"===t?"ISO-8859-7":"/H"===t?"ISO-8859-8":"Unknown"}var cn=function(e,t){var n=function(){if("undefined"!=typeof TextDecoder)return TextDecoder}();if("undefined"!=typeof n&&void 0!==e)try{return new n(e).decode(t instanceof DataView?t.buffer:Uint8Array.from(t))}catch(e){}return function(e){try{return decodeURIComponent(escape(e))}catch(t){return e}}(t.map((function(e){return String.fromCharCode(e)})).join(""))},fn={read:function(e,t,n){try{if(Array.isArray(e))return pn(new DataView(Uint8Array.from(e).buffer),{size:e.length},0,n);var r=function(e,t){for(;t+12<=e.byteLength;){var n=sn(e,t);if(ln(n))return{naaBlock:n,dataOffset:t+12};t+=12+n.size+dn(n)}throw Error("No IPTC NAA resource block.")}(e,t);return pn(e,r.naaBlock,r.dataOffset,n)}catch(e){return{}}}};function sn(e,t){if(943868237!==e.getUint32(t,0))throw Error("Not an IPTC resource block.");return{type:e.getUint16(t+4),size:e.getUint16(t+10)}}function ln(e){return 1028===e.type}function dn(e){return e.size%2!=0?1:0}function pn(e,t,n,r){for(var i={},o=void 0,a=n+t.size;ne.length)&&(t=e.length);for(var n=0,r=Array(t);ne.length)&&(t=e.length);for(var n=0,r=Array(t);n1&&n.push(An(e,t.slice(1))),n}(e,t),function(e){if(Array.isArray(e))return e}(r)||function(e){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,r,i,o,a=[],u=1,c=0;try{for(i=(t=t.call(e)).next,!2;!(u=(n=i.call(t)).done)&&(a.push(n.value),2!==a.length);u=1);}catch(e){c=1,r=e}finally{try{if(!u&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw r}}return a}}(r)||function(e){if(e){if("string"==typeof e)return Un(e,2);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Un(e,2):void 0}}(r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],a=i[1],u=En(n,o);if(a){var c=En(n,a);u||c||(delete n._raw,En(n,An(e,t)))}return n}};function An(e,t){for(var n=t.reduce((function(e,t){return e+t.length}),0),r=new Uint8Array(n),i=0,o=0;o).+$/,"$1"),"application/xml");if("parsererror"===r.documentElement.nodeName)throw Error(r.documentElement.textContent);return{doc:r,raw:n}}(t),r=n.doc,i=n.raw;return e._raw=(e._raw||"")+i,l(e,Fn(Tn(wn(r),1))),1}catch(e){return 0}}function wn(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:0,r=function(e){for(var t=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:void 0;if(Array.isArray(e)){var n=function(e){return e.map((function(e){return void 0!==e.value?Rn(e.value):Rn(e)})).join(", ")}(e);return t&&"function"==typeof yn[t]?yn[t](e,n):n}if("object"===Cn(e))return function(e){var t=[];for(var n in e)t.push("".concat(Nn(n),": ").concat(Rn(e[n].value)));return t.join("; ")}(e);try{return t&&"function"==typeof yn[t]?yn[t](e):decodeURIComponent(escape(e))}catch(t){return e}}function Nn(e){return"CiAdrCity"===e?"CreatorCity":"CiAdrCtry"===e?"CreatorCountry":"CiAdrExtadr"===e?"CreatorAddress":"CiAdrPcode"===e?"CreatorPostalCode":"CiAdrRegion"===e?"CreatorRegion":"CiEmailWork"===e?"CreatorWorkEmail":"CiTelWork"===e?"CreatorWorkPhone":"CiUrlWork"===e?"CreatorWorkUrl":e}function Ln(e){var t={};for(var n in e)try{kn(n)||(t[Dn(n)]=_n(e[n],n))}catch(e){}return t}function _n(e,t){return function(e){return Array.isArray(e)}(e)?function(e,t){return Jn(e[e.length-1],t)}(e,t):function(e){return"Resource"===e.attributes["rdf:parseType"]&&"string"==typeof e.value&&""===e.value.trim()}(e)?{value:"",attributes:{},description:""}:Bn(e)?Gn(e,t):zn(e)?Vn(e,t):Hn(e)?Wn(e,t):function(e){return void 0!==Xn(e.value)}(e)?function(e,t){var n=Xn(e.value).value["rdf:li"],r=jn(e),i=[];return void 0===n?n=[]:Array.isArray(n)||(n=[n]),n.forEach((function(e){i.push(function(e){return Bn(e)?Gn(e):zn(e)?Vn(e).value:Hn(e)?Wn(e).value:Jn(e)}(e))})),{value:i,attributes:r,description:Rn(i,t)}}(e,t):Jn(e,t)}function Bn(e){return"Resource"===e.attributes["rdf:parseType"]&&void 0!==e.value["rdf:value"]||void 0!==e.value["rdf:Description"]&&void 0!==e.value["rdf:Description"].value["rdf:value"]}function Gn(e,t){var n=jn(e);void 0!==e.value["rdf:Description"]&&(e=e.value["rdf:Description"]),l(n,jn(e),function(e){var t={};for(var n in e.value)"rdf:value"===n||kn(n)||(t[Dn(n)]=e.value[n].value);return t}(e));var r=function(e){return Yn(e.value["rdf:value"])||e.value["rdf:value"].value}(e);return{value:r,attributes:n,description:Rn(r,t)}}function jn(e){var t={};for(var n in e.attributes)"rdf:parseType"===n||"rdf:resource"===n||kn(n)||(t[Dn(n)]=e.attributes[n]);return t}function zn(e){return"Resource"===e.attributes["rdf:parseType"]||void 0!==e.value["rdf:Description"]&&void 0===e.value["rdf:Description"].value["rdf:value"]}function Vn(e,t){var n={value:{},attributes:{}};return void 0!==e.value["rdf:Description"]&&(l(n.value,Mn(e.value["rdf:Description"].attributes)),l(n.attributes,jn(e)),e=e.value["rdf:Description"]),l(n.value,Ln(e.value)),n.description=Rn(n.value,t),n}function Hn(e){return 0===Object.keys(e.value).length&&void 0===e.attributes["xml:lang"]&&void 0===e.attributes["rdf:resource"]}function Wn(e,t){var n=Mn(e.attributes);return{value:n,attributes:{},description:Rn(n,t)}}function Xn(e){return e["rdf:Bag"]||e["rdf:Seq"]||e["rdf:Alt"]}function Jn(e,t){var n=Yn(e)||Fn(e.value);return{value:n,attributes:jn(e),description:Rn(n,t)}}function Yn(e){return e.attributes&&e.attributes["rdf:resource"]}function Kn(e){return Kn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Kn(e)}function qn(e,t,n){return(t=function(e){var t=function(e){if("object"!=Kn(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=Kn(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return e+""}(e);return"symbol"==Kn(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:1,configurable:1,writable:1}):e[t]=n,e}function $n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n>>31==0?1:-1,a=(2130706432&i)>>>32-n,u=i&parseInt(m("1",32-n),2);return o*function(e){return parseInt(e.replace(".",""),2)/Math.pow(2,(e.split(".")[1]||"").length)}(a.toString(2)+"."+(m("0",32-n-(r=u.toString(2)).length)+r))}function rr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n"}r[s||Qn[c].name]=p}else t&&(r["undefined-".concat(c)]=p)}i+=l+l%2}return r}},or="8BIM",ar=2,ur=4,cr=or.length;function fr(e,t){var n,r=function(e){if(Array.isArray(e))return e}(n=f(e,t))||function(e){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,r,i,o,a=[],u=1,c=0;try{for(i=(t=t.call(e)).next,!2;!(u=(n=i.call(t)).done)&&(a.push(n.value),2!==a.length);u=1);}catch(e){c=1,r=e}finally{try{if(!u&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(c)throw r}}return a}}(n)||function(e){if(e){if("string"==typeof e)return rr(e,2);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?rr(e,2):void 0}}(n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),i=r[0];return{tagName:r[1],tagNameSize:1+i+(i%2==0?1:0)}}var sr={desc:{name:"ICC Description"},cprt:{name:"ICC Copyright"},dmdd:{name:"ICC Device Model Description"},vued:{name:"ICC Viewing Conditions Description"},dmnd:{name:"ICC Device Manufacturer for Display"},tech:{name:"Technology"}},lr={4:{name:"Preferred CMM type",value:function(e,t){return a(e,t,4)},description:function(e){return null!==e?dr(e):""}},8:{name:"Profile Version",value:function(e,t){return e.getUint8(t).toString(10)+"."+(e.getUint8(t+1)>>4).toString(10)+"."+(e.getUint8(t+1)%16).toString(10)}},12:{name:"Profile/Device class",value:function(e,t){return a(e,t,4)},description:function(e){switch(e.toLowerCase()){case"scnr":return"Input Device profile";case"mntr":return"Display Device profile";case"prtr":return"Output Device profile";case"link":return"DeviceLink profile";case"abst":return"Abstract profile";case"spac":return"ColorSpace profile";case"nmcl":return"NamedColor profile";case"cenc":return"ColorEncodingSpace profile";case"mid ":return"MultiplexIdentification profile";case"mlnk":return"MultiplexLink profile";case"mvis":return"MultiplexVisualization profile";default:return e}}},16:{name:"Color Space",value:function(e,t){return a(e,t,4)}},20:{name:"Connection Space",value:function(e,t){return a(e,t,4)}},24:{name:"ICC Profile Date",value:function(e,t){return function(e,t){var n=e.getUint16(t),r=e.getUint16(t+2)-1,i=e.getUint16(t+4),o=e.getUint16(t+6),a=e.getUint16(t+8),u=e.getUint16(t+10);return new Date(Date.UTC(n,r,i,o,a,u))}(e,t).toISOString()}},36:{name:"ICC Signature",value:function(e,t){return n=e.buffer.slice(t,t+4),String.fromCharCode.apply(null,new Uint8Array(n));var n}},40:{name:"Primary Platform",value:function(e,t){return a(e,t,4)},description:function(e){return dr(e)}},48:{name:"Device Manufacturer",value:function(e,t){return a(e,t,4)},description:function(e){return dr(e)}},52:{name:"Device Model Number",value:function(e,t){return a(e,t,4)}},64:{name:"Rendering Intent",value:function(e,t){return e.getUint32(t)},description:function(e){switch(e){case 0:return"Perceptual";case 1:return"Relative Colorimetric";case 2:return"Saturation";case 3:return"Absolute Colorimetric";default:return e}}},80:{name:"Profile Creator",value:function(e,t){return a(e,t,4)}}};function dr(e){switch(e.toLowerCase()){case"appl":return"Apple";case"adbe":return"Adobe";case"msft":return"Microsoft";case"sunw":return"Sun Microsystems";case"sgi":return"Silicon Graphics";case"tgnt":return"Taligent";default:return e}}var pr={read:function(e,t,n){return n&&t[0].compressionMethod!==g?function(e,t){return 0!==t[0].compressionMethod?{}:h(new DataView(e.buffer.slice(t[0].offset,t[0].offset+t[0].length)),t[0].compressionMethod,"utf-8","dataview").then(Ur).catch((function(){return{}}))}(e,t):function(e,t){try{for(var n=t.reduce((function(e,t){return e+t.length}),0),r=new Uint8Array(n),i=0,o=function(e){return Array.isArray(e)?new DataView(Uint8Array.from(e).buffer).buffer:e.buffer}(e),a=function(e){var n=t.find((function(t){return t.chunkNumber===e}));if(!n)throw Error("ICC chunk ".concat(e," not found"));var a=o.slice(n.offset,n.offset+n.length),u=new Uint8Array(a);r.set(u,i),i+=u.length},u=1;u<=t.length;u++)a(u);return Ur(new DataView(r.buffer))}catch(e){return{}}}(e,t)}},mr=84,gr=128,hr="acsp",vr="desc",yr="mluc",Sr="text",br="sig ",Ir=12;function Cr(e,t){return e.lengtht.length)return r;var y=a(e,h,4);if(y===vr){var S=e.getUint32(h+8);if(S>v)return r;Ar(r,g,Pr(t.slice(h+12,h+S+11)))}else if(y===yr){for(var b=e.getUint32(h+8),I=e.getUint32(h+12),C=h+16,U=[],P=0;Pe.byteLength)){var n=bt.getLongAt(e,t);return{value:n,description:"".concat(n,"px")}}}function xr(e,t){if(!(t+4+4>e.byteLength)){var n=bt.getLongAt(e,t+4);return{value:n,description:"".concat(n,"px")}}}function Fr(e,t){if(!(t+8+1>e.byteLength)){var n=bt.getByteAt(e,t+8);return{value:n,description:"".concat(n)}}}function Mr(e,t){if(!(t+9+1>e.byteLength)){var n=bt.getByteAt(e,t+9);return{value:n,description:{0:"Grayscale",2:"RGB",3:"Palette",4:"Grayscale with Alpha",6:"RGB with Alpha"}[n]||"Unknown"}}}function Or(e,t){if(!(t+10+1>e.byteLength)){var n=bt.getByteAt(e,t+10);return{value:n,description:0===n?"Deflate/Inflate":"Unknown"}}}function kr(e,t){if(!(t+11+1>e.byteLength)){var n=bt.getByteAt(e,t+11);return{value:n,description:0===n?"Adaptive":"Unknown"}}}function Dr(e,t){if(!(t+12+1>e.byteLength)){var n=bt.getByteAt(e,t+12);return{value:n,description:{0:"Noninterlaced",1:"Adam7 Interlace"}[n]||"Unknown"}}}function Rr(e){return Rr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Rr(e)}var Nr={read:function(e,t,n,r){for(var i={},o=[],a=0;a0?Promise.all(o):void 0}}},Lr="STATE_KEYWORD",_r="STATE_COMPRESSION",Br="STATE_LANG",Gr="STATE_TRANSLATED_KEYWORD",jr="STATE_TEXT",zr=1,Vr=1,Hr=6;function Wr(e,t,n,r,i){for(var o,a=[],u=[],c=[],f=Lr,s=g,l=0;l".split(""),r,u,a)})):Yr(p,r,u,a)}function Xr(e){var t=e.type,n=e.dataView,r=e.offset;if(t===Ae){if(n.getUint8(r)===Vr)return n.getUint8(r+1)}else if(t===Ee)return n.getUint8(r);return g}function Jr(e,t){return t===Lr&&[Ae,Ee].includes(e)?_r:t===_r?e===Ae?Br:jr:t===Br?Gr:jr}function Yr(e,t,n,r){var i=function(e){return e instanceof DataView?a(e,0,e.byteLength):e}(e);return{name:Kr(t,n,r),value:i,description:t===Ae?qr(e):i}}function Kr(e,t,n){var r=s(n);if(e===Pe||0===t.length)return r;var i=s(t);return"".concat(r," (").concat(i,")")}function qr(e){return cn("UTF-8",e)}function $r(e,t){return"raw profile type exif"===e.toLowerCase()&&"exif"===t.substring(1,5)}function Qr(e,t){return"raw profile type iptc"===e.toLowerCase()&&"iptc"===t.substring(1,5)}function Zr(e){return function(e){for(var t=new DataView(new ArrayBuffer(e.length/2)),n=0;ne.byteLength)){var t=a(e,3,3);return{value:t,description:t}}}function pi(e){if(!(8>e.byteLength)){var t=e.getUint16(6,1);return{value:t,description:"".concat(t,"px")}}}function mi(e){if(!(10>e.byteLength)){var t=e.getUint16(8,1);return{value:t,description:"".concat(t,"px")}}}function gi(e){if(!(11>e.byteLength)){var t=(128&e.getUint8(10))>>>7;return{value:t,description:1===t?"Yes":"No"}}}function hi(e){if(!(11>e.byteLength)){var t=1+((112&e.getUint8(10))>>>4);return{value:t,description:"".concat(t," ").concat(1===t?"bit":"bits")}}}function vi(e){if(!(11>e.byteLength)){var t=1+(7&e.getUint8(10));return{value:t,description:"".concat(t," ").concat(1===t?"bit":"bits")}}}var yi=[6,7,99],Si={get:function(e,t,n){if((i=t)&&(void 0===i.Compression||yi.includes(i.Compression.value))&&i.JPEGInterchangeFormat&&i.JPEGInterchangeFormat.value&&i.JPEGInterchangeFormatLength&&i.JPEGInterchangeFormatLength.value){t.type="image/jpeg";var r=n+t.JPEGInterchangeFormat.value;t.image=e.buffer.slice(r,r+t.JPEGInterchangeFormatLength.value),d(t,"base64",(function(){return p(this.image)}))}var i;return t}};function bi(e){this.name="MetadataMissingError",this.message=e||"No Exif data",this.stack=Error().stack}bi.prototype=Error();var Ii={MetadataMissingError:bi},Ci={load:Pi,loadView:Ei,errors:Ii},Ui=Ii;function Pi(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(e){return"string"==typeof e}(e)?(n.async=1,function(e,t){return/^\w+:\/\//.test(e)?"undefined"!=typeof fetch?function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length,n={method:"GET"};return Number.isInteger(t)&&t>=0&&(n.headers={range:"bytes=0-".concat(t-1)}),fetch(e,n).then((function(e){return e.arrayBuffer()}))}(e,t):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i={};Number.isInteger(t)&&t>=0&&(i.headers={range:"bytes=0-".concat(t-1)});var o=function(e){return/^https:\/\//.test(e)?require("https").get:require("http").get}(e);o(e,i,(function(e){if(e.statusCode>=200&&e.statusCode<=299){var t=[];e.on("data",(function(e){return t.push(Buffer.from(e))})),e.on("error",(function(e){return r(e)})),e.on("end",(function(){return n(Buffer.concat(t))}))}else r("Could not fetch file: ".concat(e.statusCode," ").concat(e.statusMessage)),e.resume()})).on("error",(function(e){return r(e)}))}))}(e,t):function(e){return/^data:[^;,]*(;base64)?,/.test(e)}(e)?Promise.resolve(function(e){var t=e.substring(e.indexOf(",")+1);if(-1!==e.indexOf(";base64")){if("undefined"!=typeof atob)return Uint8Array.from(atob(t),(function(e){return e.charCodeAt(0)})).buffer;if("undefined"==typeof Buffer)return;return"undefined"!=typeof Buffer.from?Buffer.from(t,"base64"):new Buffer(t,"base64")}var n=decodeURIComponent(t);return"undefined"!=typeof Buffer?"undefined"!=typeof Buffer.from?Buffer.from(n):new Buffer(n):Uint8Array.from(n,(function(e){return e.charCodeAt(0)})).buffer}(e)):function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).length;return new Promise((function(n,r){var i=function(){try{return require("fs")}catch(e){return}}();i.open(e,(function(o,a){o?r(o):i.stat(e,(function(o,u){if(o)r(o);else{var c=Math.min(u.size,void 0!==t?t:u.size),f=Buffer.alloc(c),s={buffer:f,length:c};i.read(a,s,(function(t){t?r(t):i.close(a,(function(t){t&&console.warn("Could not close file ".concat(e,":"),t),n(f)}))}))}}))}))}))}(e,t)}(e,n).then((function(e){return Ai(e,n)}))):function(e){return"undefined"!=typeof window&&"undefined"!=typeof File&&e instanceof File}(e)?(n.async=1,(t=e,new Promise((function(e,n){var r=new FileReader;r.onload=function(t){return e(t.target.result)},r.onerror=function(){return n(r.error)},r.readAsArrayBuffer(t)}))).then((function(e){return Ai(e,n)}))):Ai(e,n)}function Ai(e,t){return function(e){try{return Buffer.isBuffer(e)}catch(e){return 0}}(e)&&(e=new Uint8Array(e).buffer),Ei(function(e){try{return new DataView(e)}catch(t){return new i(e)}}(e),t)}function Ei(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{expanded:0,async:0,includeUnknown:0},n=t.expanded,r=void 0===n?0:n,i=t.async,o=void 0===i?0:i,a=t.includeUnknown,u=void 0===a?0:a,c=0,f={},d=[],p=et.parseAppMarkers(e,o),m=p.fileType,g=p.fileDataOffset,h=p.jfifDataOffset,y=p.tiffHeaderOffset,S=p.iptcDataOffset,I=p.xmpChunks,C=p.iccChunks,U=p.mpfDataOffset,P=p.pngHeaderOffset,A=p.pngTextChunks,E=p.pngChunkOffsets,w=p.vp8xChunkOffset,T=p.gifHeaderOffset;if(v.USE_JPEG&&v.USE_FILE&&function(e){return void 0!==e}(g)){c=1;var x=Ht.read(e,g);r?f.file=x:f=l({},f,x)}if(v.USE_JPEG&&v.USE_JFIF&&function(e){return void 0!==e}(h)){c=1;var F=$t.read(e,h);r?f.jfif=F:f=l({},f,F)}if(v.USE_EXIF&&function(e){return void 0!==e}(y)){c=1;var M=kt.read(e,y,u),O=M.tags,k=M.byteOrder;if(O.Thumbnail&&(f.Thumbnail=O.Thumbnail,delete O.Thumbnail),r?(f.exif=O,function(e){if(e.exif){if(e.exif.GPSLatitude&&e.exif.GPSLatitudeRef)try{e.gps=e.gps||{},e.gps.Latitude=b(e.exif.GPSLatitude.value),"S"===e.exif.GPSLatitudeRef.value.join("")&&(e.gps.Latitude=-e.gps.Latitude)}catch(e){}if(e.exif.GPSLongitude&&e.exif.GPSLongitudeRef)try{e.gps=e.gps||{},e.gps.Longitude=b(e.exif.GPSLongitude.value),"W"===e.exif.GPSLongitudeRef.value.join("")&&(e.gps.Longitude=-e.gps.Longitude)}catch(e){}if(e.exif.GPSAltitude&&e.exif.GPSAltitudeRef)try{e.gps=e.gps||{},e.gps.Altitude=e.exif.GPSAltitude.value[0]/e.exif.GPSAltitude.value[1],1===e.exif.GPSAltitudeRef.value&&(e.gps.Altitude=-e.gps.Altitude)}catch(e){}}}(f)):f=l({},f,O),v.USE_TIFF&&v.USE_IPTC&&O["IPTC-NAA"]&&!wi(S)){var D=fn.read(O["IPTC-NAA"].value,0,u);r?f.iptc=D:f=l({},f,D)}if(v.USE_TIFF&&v.USE_XMP&&O.ApplicationNotes&&!Ti(I)){var R=Pn.read(s(O.ApplicationNotes.value));r?f.xmp=R:(delete R._raw,f=l({},f,R))}if(v.USE_PHOTOSHOP&&O.ImageSourceData){var N=ir.read(O.PhotoshopSettings.value,u);r?f.photoshop=N:f=l({},f,N)}if(v.USE_TIFF&&v.USE_ICC&&O.ICC_Profile&&!xi(C)){var L=pr.read(O.ICC_Profile.value,[{offset:0,length:O.ICC_Profile.value.length,chunkNumber:1,chunksTotal:1}]);r?f.icc=L:f=l({},f,L)}if(v.USE_MAKER_NOTES&&function(e){return e.Make&&e.Make.value&&Array.isArray(e.Make.value)&&"Canon"===e.Make.value[0]&&e.MakerNote&&e.MakerNote.__offset}(O)){var _=Er.read(e,y,O.MakerNote.__offset,k,u);r?f.makerNotes=_:f=l({},f,_)}O.MakerNote&&delete O.MakerNote.__offset}if(v.USE_JPEG&&v.USE_IPTC&&wi(S)){c=1;var B=fn.read(e,S,u);r?f.iptc=B:f=l({},f,B)}if(v.USE_XMP&&Ti(I)){c=1;var G=Pn.read(e,I);r?f.xmp=G:(delete G._raw,f=l({},f,G))}if((v.USE_JPEG||v.USE_WEBP)&&v.USE_ICC&&xi(C)){c=1;var j=pr.read(e,C,o);j instanceof Promise?d.push(j.then($)):$(j)}if(v.USE_MPF&&function(e){return void 0!==e}(U)){c=1;var z=Lt.read(e,U,u);r?f.mpf=z:f=l({},f,z)}if(v.USE_PNG&&v.USE_PNG_FILE&&void 0!==P){c=1;var V=wr.read(e,P);r?(f.png=f.png?l({},f.png,V):V,f.pngFile=V):f=l({},f,V)}if(v.USE_PNG&&function(e){return void 0!==e}(A)){c=1;var H=Nr.read(e,A,o,u),W=H.readTags,X=H.readTagsPromise;Q(W),X&&d.push(X.then((function(e){return e.forEach(Q)})))}if(v.USE_PNG&&function(e){return void 0!==e}(E)){c=1;var J=ei.read(e,E);r?f.png=f.png?l({},f.png,J):J:f=l({},f,J)}if(v.USE_WEBP&&function(e){return void 0!==e}(w)){c=1;var Y=ui.read(e,w);r?f.riff=f.riff?l({},f.riff,Y):Y:f=l({},f,Y)}if(v.USE_GIF&&function(e){return void 0!==e}(T)){c=1;var K=li.read(e,T);r?f.gif=f.gif?l({},f.gif,K):K:f=l({},f,K)}var q=(v.USE_JPEG||v.USE_WEBP)&&v.USE_EXIF&&v.USE_THUMBNAIL&&Si.get(e,f.Thumbnail,y);if(q?(c=1,f.Thumbnail=q):delete f.Thumbnail,m&&(r?(f.file||(f.file={}),f.file.FileType=m):f.FileType=m,c=1),!c)throw new Ii.MetadataMissingError;return o?Promise.all(d).then((function(){return f})):f;function $(e){r?f.icc=e:f=l({},f,e)}function Q(e){if(r){for(var t=0,n=["exif","iptc"];t0}function xi(e){return Array.isArray(e)&&e.length>0}return t}()})); //# sourceMappingURL=exif-reader.js.map \ No newline at end of file diff --git a/dist/exif-reader.js.map b/dist/exif-reader.js.map index a8ff407..787e207 100644 --- a/dist/exif-reader.js.map +++ b/dist/exif-reader.js.map @@ -1 +1 @@ -{"version":3,"file":"exif-reader.js","mappings":"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","sources":["webpack://ExifReader/webpack/universalModuleDefinition","webpack://ExifReader/webpack/bootstrap","webpack://ExifReader/webpack/runtime/define property getters","webpack://ExifReader/webpack/runtime/hasOwnProperty shorthand","webpack://ExifReader/webpack/runtime/make namespace object","webpack://ExifReader/./src/dataview.js","webpack://ExifReader/./src/utils.js","webpack://ExifReader/./src/constants.js","webpack://ExifReader/./src/tag-names-utils.js","webpack://ExifReader/./src/byte-order.js","webpack://ExifReader/./src/image-header-jpeg.js","webpack://ExifReader/./src/image-header-png.js","webpack://ExifReader/./src/image-header-iso-bmff-iloc.js","webpack://ExifReader/./src/image-header-iso-bmff-utils.js","webpack://ExifReader/./src/image-header-iso-bmff.js","webpack://ExifReader/./src/image-header-heic.js","webpack://ExifReader/./src/image-header-gif.js","webpack://ExifReader/./src/xml.js","webpack://ExifReader/./src/image-header.js","webpack://ExifReader/./src/image-header-tiff.js","webpack://ExifReader/./src/image-header-avif.js","webpack://ExifReader/./src/image-header-webp.js","webpack://ExifReader/./src/tag-names-common.js","webpack://ExifReader/./src/tag-names-0th-ifd.js","webpack://ExifReader/./src/tag-names-gps-ifd.js","webpack://ExifReader/./src/tag-names-interoperability-ifd.js","webpack://ExifReader/./src/tag-names-mpf-ifd.js","webpack://ExifReader/./src/tag-names.js","webpack://ExifReader/./src/tag-names-exif-ifd.js","webpack://ExifReader/./src/tag-names-canon-ifd.js","webpack://ExifReader/./src/types.js","webpack://ExifReader/./src/tags-helpers.js","webpack://ExifReader/./src/tags.js","webpack://ExifReader/./src/mpf-tags.js","webpack://ExifReader/./src/file-tags.js","webpack://ExifReader/./src/jfif-tags.js","webpack://ExifReader/./src/iptc-tag-names.js","webpack://ExifReader/./src/text-decoder.js","webpack://ExifReader/./src/tag-decoder.js","webpack://ExifReader/./src/iptc-tags.js","webpack://ExifReader/./src/xmp-tag-names.js","webpack://ExifReader/./src/xmp-tags.js","webpack://ExifReader/./src/dom-parser.js","webpack://ExifReader/./src/photoshop-tag-names.js","webpack://ExifReader/./src/photoshop-tags.js","webpack://ExifReader/./src/icc-tag-names.js","webpack://ExifReader/./src/icc-tags.js","webpack://ExifReader/./src/canon-tags.js","webpack://ExifReader/./src/png-file-tags.js","webpack://ExifReader/./src/png-text-tags.js","webpack://ExifReader/./src/png-tags.js","webpack://ExifReader/./src/vp8x-tags.js","webpack://ExifReader/./src/gif-file-tags.js","webpack://ExifReader/./src/thumbnail.js","webpack://ExifReader/./src/errors.js","webpack://ExifReader/./src/exif-reader.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ExifReader\"] = factory();\n\telse\n\t\troot[\"ExifReader\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export default class DataView {\n constructor(buffer) {\n if (bufferTypeIsUnsupported(buffer)) {\n throw new Error('DataView: Passed buffer type is unsupported.');\n }\n\n this.buffer = buffer;\n this.byteLength = this.buffer.length;\n }\n\n getUint8(offset) {\n return this.buffer.readUInt8(offset);\n }\n\n getUint16(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt16LE(offset);\n }\n return this.buffer.readUInt16BE(offset);\n }\n\n getUint32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt32LE(offset);\n }\n return this.buffer.readUInt32BE(offset);\n }\n\n getInt32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readInt32LE(offset);\n }\n return this.buffer.readInt32BE(offset);\n }\n}\n\nfunction bufferTypeIsUnsupported(buffer) {\n return typeof buffer !== 'object'\n || buffer.length === undefined\n || buffer.readUInt8 === undefined\n || buffer.readUInt16LE === undefined\n || buffer.readUInt16BE === undefined\n || buffer.readUInt32LE === undefined\n || buffer.readUInt32BE === undefined\n || buffer.readInt32LE === undefined\n || buffer.readInt32BE === undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport DataViewWrapper from './dataview.js';\n\nexport function getDataView(data, byteOffset, byteLength) {\n try {\n return new DataView(data, byteOffset, byteLength);\n } catch (error) {\n return new DataViewWrapper(data, byteOffset, byteLength);\n }\n}\n\nexport function getStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n chars.push(dataView.getUint8(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getNullTerminatedStringFromDataView(dataView, offset) {\n const chars = [];\n let i = 0;\n while (offset + i < dataView.byteLength) {\n const char = dataView.getUint8(offset + i);\n if (char === 0) {\n break;\n }\n chars.push(char);\n i++;\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getUnicodeStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i += 2) {\n chars.push(dataView.getUint16(offset + i));\n }\n if (chars[chars.length - 1] === 0) {\n chars.pop();\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getPascalStringFromDataView(dataView, offset) {\n const size = dataView.getUint8(offset);\n const string = getStringFromDataView(dataView, offset + 1, size);\n return [size, string];\n}\n\nexport function getStringValueFromArray(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getCharacterArray(string) {\n return string.split('').map((character) => character.charCodeAt(0));\n}\n\nexport function objectAssign() {\n for (let i = 1; i < arguments.length; i++) {\n for (const property in arguments[i]) {\n arguments[0][property] = arguments[i][property];\n }\n }\n\n return arguments[0];\n}\n\nexport function deferInit(object, key, initializer) {\n let initialized = false;\n Object.defineProperty(object, key, {\n get() {\n if (!initialized) {\n initialized = true;\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value: initializer.apply(object),\n writable: true\n });\n }\n return object[key];\n },\n configurable: true,\n enumerable: true\n });\n}\n\nexport function getBase64Image(image) {\n if (typeof btoa !== 'undefined') {\n if (typeof image === 'string') {\n // This only happens during the build tests using Node 16+ (npm run test:build).\n return btoa(image);\n }\n // IE11- does not implement reduce on the Uint8Array prototype.\n return btoa(Array.prototype.reduce.call(new Uint8Array(image), (data, byte) => data + String.fromCharCode(byte), ''));\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(image).toString('base64'); // eslint-disable-line no-undef\n }\n return (new Buffer(image)).toString('base64'); // eslint-disable-line no-undef\n}\n\nexport function dataUriToBuffer(dataUri) {\n const data = dataUri.substring(dataUri.indexOf(',') + 1);\n\n if (dataUri.indexOf(';base64') !== -1) {\n if (typeof atob !== 'undefined') {\n return Uint8Array.from(atob(data), (char) => char.charCodeAt(0)).buffer;\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(data, 'base64'); // eslint-disable-line no-undef\n }\n return new Buffer(data, 'base64'); // eslint-disable-line no-undef\n }\n\n const decodedData = decodeURIComponent(data);\n if (typeof Buffer !== 'undefined') {\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(decodedData); // eslint-disable-line no-undef\n }\n return new Buffer(decodedData); // eslint-disable-line no-undef\n }\n return Uint8Array.from(decodedData, (char) => char.charCodeAt(0)).buffer;\n}\n\nexport function padStart(string, length, character) {\n const padding = strRepeat(character, length - string.length);\n return padding + string;\n}\n\nexport function parseFloatRadix(string, radix) {\n return parseInt(string.replace('.', ''), radix)\n / Math.pow(radix, (string.split('.')[1] || '').length);\n}\n\nexport function strRepeat(string, num) {\n return new Array(num + 1).join(string);\n}\n\nexport const COMPRESSION_METHOD_NONE = undefined;\nexport const COMPRESSION_METHOD_DEFLATE = 0;\n\nexport function decompress(dataView, compressionMethod, encoding, returnType = 'string') {\n if (compressionMethod === COMPRESSION_METHOD_DEFLATE) {\n if (typeof DecompressionStream === 'function') {\n const decompressionStream = new DecompressionStream('deflate');\n const decompressedStream = new Blob([dataView]).stream().pipeThrough(decompressionStream);\n if (returnType === 'dataview') {\n return new Response(decompressedStream).arrayBuffer().then((arrayBuffer) => new DataView(arrayBuffer));\n }\n return new Response(decompressedStream).arrayBuffer()\n .then((buffer) => new TextDecoder(encoding).decode(buffer));\n }\n }\n if (compressionMethod !== undefined) {\n return Promise.reject(`Unknown compression method ${compressionMethod}.`);\n }\n return dataView;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n USE_FILE: true,\n USE_JFIF: true,\n USE_PNG_FILE: true,\n USE_EXIF: true,\n USE_IPTC: true,\n USE_XMP: true,\n USE_ICC: true,\n USE_MPF: true,\n USE_PHOTOSHOP: true,\n USE_THUMBNAIL: true,\n USE_TIFF: true,\n USE_JPEG: true,\n USE_PNG: true,\n USE_HEIC: true,\n USE_AVIF: true,\n USE_WEBP: true,\n USE_GIF: true,\n USE_MAKER_NOTES: true\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringValue(value) {\n return value.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getEncodedString(value) {\n if (value.length >= 8) {\n const encoding = getStringValue(value.slice(0, 8));\n\n if (encoding === 'ASCII\\x00\\x00\\x00') {\n return getStringValue(value.slice(8));\n } else if (encoding === 'JIS\\x00\\x00\\x00\\x00\\x00') {\n return '[JIS encoded text]';\n } else if (encoding === 'UNICODE\\x00') {\n return '[Unicode encoded text]';\n } else if (encoding === '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00') {\n return '[Undefined encoding]';\n }\n }\n\n return 'Undefined';\n}\n\nexport function getCalculatedGpsValue(value) {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nconst LITTLE_ENDIAN = 0x4949;\nconst BIG_ENDIAN = 0x4d4d;\n\nexport default {\n BIG_ENDIAN,\n LITTLE_ENDIAN,\n getByteOrder\n};\n\nfunction getByteOrder(dataView, tiffHeaderOffset) {\n if (dataView.getUint16(tiffHeaderOffset) === LITTLE_ENDIAN) {\n return LITTLE_ENDIAN;\n } else if (dataView.getUint16(tiffHeaderOffset) === BIG_ENDIAN) {\n return BIG_ENDIAN;\n }\n throw new Error('Illegal byte order value. Faulty image.');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isJpegFile,\n findJpegOffsets\n};\n\nconst MIN_JPEG_DATA_BUFFER_LENGTH = 2;\nconst JPEG_ID = 0xffd8;\nconst JPEG_ID_SIZE = 2;\nconst APP_ID_OFFSET = 4;\nconst APP_MARKER_SIZE = 2;\nconst JFIF_DATA_OFFSET = 2; // From start of APP0 marker.\nconst TIFF_HEADER_OFFSET = 10; // From start of APP1 marker.\nconst IPTC_DATA_OFFSET = 18; // From start of APP13 marker.\nconst XMP_DATA_OFFSET = 33; // From start of APP1 marker.\nconst XMP_EXTENDED_DATA_OFFSET = 79; // From start of APP1 marker including GUID, total length, and offset.\nconst APP2_ICC_DATA_OFFSET = 18; // From start of APP2 marker including marker and chunk/chunk total numbers.\nconst MPF_DATA_OFFSET = 8;\n\nconst APP2_ICC_IDENTIFIER = 'ICC_PROFILE\\0';\nconst ICC_CHUNK_NUMBER_OFFSET = APP_ID_OFFSET + APP2_ICC_IDENTIFIER.length;\nconst ICC_TOTAL_CHUNKS_OFFSET = ICC_CHUNK_NUMBER_OFFSET + 1;\n\nconst APP2_MPF_IDENTIFIER = 'MPF\\0';\n\nconst SOF0_MARKER = 0xffc0;\nconst SOF2_MARKER = 0xffc2;\nconst DHT_MARKER = 0xffc4;\nconst DQT_MARKER = 0xffdb;\nconst DRI_MARKER = 0xffdd;\nconst SOS_MARKER = 0xffda;\n\nconst APP0_MARKER = 0xffe0;\nconst APP1_MARKER = 0xffe1;\nconst APP2_MARKER = 0xffe2;\nconst APP13_MARKER = 0xffed;\nconst APP15_MARKER = 0xffef;\nconst COMMENT_MARKER = 0xfffe;\n\n// Any number of fill bytes can be placed before an app marker. It's actually the first 0xff that is the\n// fill byte and the next 0xff is either another fill byte or the first half of the next app marker.\nconst FILL_BYTE = 0xffff;\n\nconst APP0_JFIF_IDENTIFIER = 'JFIF';\nconst APP1_EXIF_IDENTIFIER = 'Exif';\nconst APP1_XMP_IDENTIFIER = 'http://ns.adobe.com/xap/1.0/\\x00';\nconst APP1_XMP_EXTENDED_IDENTIFIER = 'http://ns.adobe.com/xmp/extension/\\x00';\nconst APP13_IPTC_IDENTIFIER = 'Photoshop 3.0';\n\nfunction isJpegFile(dataView) {\n return !!dataView && (dataView.byteLength >= MIN_JPEG_DATA_BUFFER_LENGTH) && (dataView.getUint16(0) === JPEG_ID);\n}\n\nfunction findJpegOffsets(dataView) {\n let appMarkerPosition = JPEG_ID_SIZE;\n let fieldLength;\n let sof0DataOffset;\n let sof2DataOffset;\n let jfifDataOffset;\n let tiffHeaderOffset;\n let iptcDataOffset;\n let xmpChunks;\n let iccChunks;\n let mpfDataOffset;\n\n while (appMarkerPosition + APP_ID_OFFSET + 5 <= dataView.byteLength) {\n if (Constants.USE_FILE && isSOF0Marker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n sof0DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_FILE && isSOF2Marker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n sof2DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_JFIF && isApp0JfifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n jfifDataOffset = appMarkerPosition + JFIF_DATA_OFFSET;\n } else if (Constants.USE_EXIF && isApp1ExifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n tiffHeaderOffset = appMarkerPosition + TIFF_HEADER_OFFSET;\n } else if (Constants.USE_XMP && isApp1XmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_XMP && isApp1ExtendedXmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getExtendedXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_IPTC && isApp13PhotoshopMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n iptcDataOffset = appMarkerPosition + IPTC_DATA_OFFSET;\n } else if (Constants.USE_ICC && isApp2ICCMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n const iccDataOffset = appMarkerPosition + APP2_ICC_DATA_OFFSET;\n const iccDataLength = fieldLength - (APP2_ICC_DATA_OFFSET - APP_MARKER_SIZE);\n\n const iccChunkNumber = dataView.getUint8(appMarkerPosition + ICC_CHUNK_NUMBER_OFFSET);\n const iccChunksTotal = dataView.getUint8(appMarkerPosition + ICC_TOTAL_CHUNKS_OFFSET);\n if (!iccChunks) {\n iccChunks = [];\n }\n iccChunks.push({offset: iccDataOffset, length: iccDataLength, chunkNumber: iccChunkNumber, chunksTotal: iccChunksTotal});\n } else if (Constants.USE_MPF && isApp2MPFMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n mpfDataOffset = appMarkerPosition + MPF_DATA_OFFSET;\n } else if (isAppMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n } else if (isFillByte(dataView, appMarkerPosition)) {\n appMarkerPosition++;\n continue;\n } else {\n break;\n }\n appMarkerPosition += APP_MARKER_SIZE + fieldLength;\n }\n\n return {\n hasAppMarkers: appMarkerPosition > JPEG_ID_SIZE,\n fileDataOffset: sof0DataOffset || sof2DataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset\n };\n}\n\nfunction isSOF0Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF0_MARKER);\n}\n\nfunction isSOF2Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF2_MARKER);\n}\n\nfunction isApp2ICCMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_ICC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_ICC_IDENTIFIER);\n}\n\nfunction isApp2MPFMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_MPF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_MPF_IDENTIFIER);\n}\n\nfunction isApp0JfifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP0_JFIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP0_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP0_JFIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1ExifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_EXIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1XmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_IDENTIFIER;\n}\n\nfunction isApp1ExtendedXmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isExtendedXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isExtendedXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_EXTENDED_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_EXTENDED_IDENTIFIER;\n}\n\nfunction getXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_DATA_OFFSET,\n length: fieldLength - (XMP_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction getExtendedXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_EXTENDED_DATA_OFFSET,\n length: fieldLength - (XMP_EXTENDED_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction isApp13PhotoshopMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP13_IPTC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP13_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP13_IPTC_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isAppMarker(dataView, appMarkerPosition) {\n const appMarker = dataView.getUint16(appMarkerPosition);\n return ((appMarker >= APP0_MARKER) && (appMarker <= APP15_MARKER))\n || (appMarker === COMMENT_MARKER)\n || (appMarker === SOF0_MARKER)\n || (appMarker === SOF2_MARKER)\n || (appMarker === DHT_MARKER)\n || (appMarker === DQT_MARKER)\n || (appMarker === DRI_MARKER)\n || (appMarker === SOS_MARKER);\n}\n\nfunction isFillByte(dataView, appMarkerPosition) {\n return dataView.getUint16(appMarkerPosition) === FILL_BYTE;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringFromDataView, getNullTerminatedStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isPngFile,\n findPngOffsets\n};\n\nconst PNG_ID = '\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a';\nconst PNG_CHUNK_LENGTH_SIZE = 4;\nexport const PNG_CHUNK_TYPE_SIZE = 4;\nexport const PNG_CHUNK_LENGTH_OFFSET = 0;\nexport const PNG_CHUNK_TYPE_OFFSET = PNG_CHUNK_LENGTH_SIZE;\nexport const PNG_CHUNK_DATA_OFFSET = PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE;\nconst PNG_XMP_PREFIX = 'XML:com.adobe.xmp\\x00';\nexport const TYPE_TEXT = 'tEXt';\nexport const TYPE_ITXT = 'iTXt';\nexport const TYPE_ZTXT = 'zTXt';\nexport const TYPE_PHYS = 'pHYs';\nexport const TYPE_TIME = 'tIME';\nexport const TYPE_EXIF = 'eXIf';\nexport const TYPE_ICCP = 'iCCP';\n\nfunction isPngFile(dataView) {\n return !!dataView && getStringFromDataView(dataView, 0, PNG_ID.length) === PNG_ID;\n}\n\nfunction findPngOffsets(dataView, async) {\n const PNG_CRC_SIZE = 4;\n\n const offsets = {\n hasAppMarkers: false\n };\n\n let offset = PNG_ID.length;\n\n while (offset + PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE <= dataView.byteLength) {\n if (Constants.USE_PNG_FILE && isPngImageHeaderChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.pngHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_XMP && isPngXmpChunk(dataView, offset)) {\n const dataOffset = getPngXmpDataOffset(dataView, offset);\n if (dataOffset !== undefined) {\n offsets.hasAppMarkers = true;\n offsets.xmpChunks = [{\n dataOffset,\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET) - (dataOffset - (offset + PNG_CHUNK_DATA_OFFSET))\n }];\n }\n } else if (isPngTextChunk(dataView, offset, async)) {\n offsets.hasAppMarkers = true;\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n if (!offsets.pngTextChunks) {\n offsets.pngTextChunks = [];\n }\n offsets.pngTextChunks.push({\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET),\n type: chunkType,\n offset: offset + PNG_CHUNK_DATA_OFFSET\n });\n } else if (isPngExifChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.tiffHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_ICC && async && isPngIccpChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n const chunkDataLength = dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET);\n const iccHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n const {profileName, compressionMethod, compressedProfileOffset} = parseIccHeader(dataView, iccHeaderOffset);\n if (!offsets.iccChunks) {\n offsets.iccChunks = [];\n }\n offsets.iccChunks.push({\n offset: compressedProfileOffset,\n length: chunkDataLength - (compressedProfileOffset - iccHeaderOffset),\n chunkNumber: 1,\n chunksTotal: 1,\n profileName,\n compressionMethod\n });\n } else if (isPngChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n if (!offsets.pngChunkOffsets) {\n offsets.pngChunkOffsets = [];\n }\n offsets.pngChunkOffsets.push(offset + PNG_CHUNK_LENGTH_OFFSET);\n }\n\n offset += dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET)\n + PNG_CHUNK_LENGTH_SIZE\n + PNG_CHUNK_TYPE_SIZE\n + PNG_CRC_SIZE;\n }\n\n return offsets;\n}\n\nfunction isPngImageHeaderChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_IMAGE_HEADER = 'IHDR';\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_IMAGE_HEADER;\n}\n\nfunction isPngXmpChunk(dataView, offset) {\n return (getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_ITXT)\n && (getStringFromDataView(dataView, offset + PNG_CHUNK_DATA_OFFSET, PNG_XMP_PREFIX.length) === PNG_XMP_PREFIX);\n}\n\nfunction isPngTextChunk(dataView, offset, async) {\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return chunkType === TYPE_TEXT || chunkType === TYPE_ITXT || (chunkType === TYPE_ZTXT && async);\n}\n\nfunction isPngExifChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_EXIF;\n}\n\nfunction isPngIccpChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_ICCP;\n}\n\nfunction isPngChunk(dataView, offset) {\n const SUPPORTED_PNG_CHUNK_TYPES = [TYPE_PHYS, TYPE_TIME];\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return SUPPORTED_PNG_CHUNK_TYPES.includes(chunkType);\n}\n\nfunction getPngXmpDataOffset(dataView, offset) {\n const COMPRESSION_FLAG_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n offset += PNG_CHUNK_DATA_OFFSET + PNG_XMP_PREFIX.length + COMPRESSION_FLAG_SIZE + COMPRESSION_METHOD_SIZE;\n\n let numberOfNullSeparators = 0;\n while (numberOfNullSeparators < 2 && offset < dataView.byteLength) {\n if (dataView.getUint8(offset) === 0x00) {\n numberOfNullSeparators++;\n }\n offset++;\n }\n if (numberOfNullSeparators < 2) {\n return undefined;\n }\n return offset;\n}\n\nfunction parseIccHeader(dataView, offset) {\n const NULL_SEPARATOR_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n const profileName = getNullTerminatedStringFromDataView(dataView, offset);\n offset += profileName.length + NULL_SEPARATOR_SIZE;\n\n const compressionMethod = dataView.getUint8(offset);\n offset += COMPRESSION_METHOD_SIZE;\n\n return {\n profileName,\n compressionMethod,\n compressedProfileOffset: offset\n };\n}\n","import {get64BitValue} from './image-header-iso-bmff-utils.js';\n\nexport function parseItemLocationBox(dataView, version, contentOffset, boxLength) {\n const FLAGS_SIZE = 3;\n\n const {offsets, sizes} = getItemLocationBoxOffsetsAndSizes(version, contentOffset + FLAGS_SIZE);\n\n const offsetSize = dataView.getUint8(offsets.offsetSize) >> 4;\n sizes.item.extent.extentOffset = offsetSize;\n const lengthSize = dataView.getUint8(offsets.lengthSize) & 0x0f;\n sizes.item.extent.extentLength = lengthSize;\n const baseOffsetSize = dataView.getUint8(offsets.baseOffsetSize) >> 4;\n sizes.item.baseOffset = baseOffsetSize;\n const indexSize = getIndexSize(dataView, offsets.indexSize, version);\n sizes.item.extent.extentIndex = indexSize !== undefined ? indexSize : 0;\n const itemCount = getItemCount(dataView, offsets.itemCount, version);\n\n return {\n type: 'iloc',\n items: getItems(dataView, version, offsets, sizes, offsetSize, lengthSize, indexSize, itemCount),\n length: boxLength\n };\n}\n\nfunction getItemLocationBoxOffsetsAndSizes(version, contentOffset) {\n const sizes = {\n item: {\n dataReferenceIndex: 2,\n extentCount: 2,\n extent: {}\n }\n };\n if (version < 2) {\n sizes.itemCount = 2;\n sizes.item.itemId = 2;\n } else if (version === 2) {\n sizes.itemCount = 4;\n sizes.item.itemId = 4;\n }\n if (version === 1 || version === 2) {\n sizes.item.constructionMethod = 2;\n } else {\n sizes.item.constructionMethod = 0;\n }\n\n const offsets = {\n offsetSize: contentOffset,\n lengthSize: contentOffset,\n baseOffsetSize: contentOffset + 1,\n indexSize: contentOffset + 1\n };\n offsets.itemCount = contentOffset + 2;\n offsets.items = offsets.itemCount + sizes.itemCount;\n offsets.item = {\n itemId: 0\n };\n offsets.item.constructionMethod = offsets.item.itemId + sizes.item.itemId;\n offsets.item.dataReferenceIndex = offsets.item.constructionMethod + sizes.item.constructionMethod;\n\n return {offsets, sizes};\n}\n\nfunction getIndexSize(dataView, offset, version) {\n if (version === 1 || version === 2) {\n return dataView.getUint8(offset) & 0x0f;\n }\n return undefined;\n}\n\nfunction getItemCount(dataView, offset, version) {\n if (version < 2) {\n return dataView.getUint16(offset);\n } else if (version === 2) {\n return dataView.getUint32(offset);\n }\n return undefined;\n}\n\nfunction getItems(dataView, version, offsets, sizes, offsetSize, lengthSize, indexSize, itemCount) {\n if (itemCount === undefined) {\n return [];\n }\n\n const items = [];\n let offset = offsets.items;\n\n for (let i = 0; i < itemCount; i++) {\n const item = {extents: []};\n item.itemId = getItemId(dataView, offset, version);\n offset += sizes.item.itemId;\n item.constructionMethod = (version === 1) || (version === 2) ? dataView.getUint16(offset) & 0x0f : undefined;\n offset += sizes.item.constructionMethod;\n item.dataReferenceIndex = dataView.getUint16(offset);\n offset += sizes.item.dataReferenceIndex;\n item.baseOffset = getVariableSizedValue(dataView, offset, sizes.item.baseOffset);\n offset += sizes.item.baseOffset;\n item.extentCount = dataView.getUint16(offset);\n offset += sizes.item.extentCount;\n for (let j = 0; j < item.extentCount; j++) {\n const extent = {};\n\n extent.extentIndex = getExtentIndex(dataView, version, offset, indexSize);\n offset += sizes.item.extent.extentIndex;\n extent.extentOffset = getVariableSizedValue(dataView, offset, offsetSize);\n offset += sizes.item.extent.extentOffset;\n extent.extentLength = getVariableSizedValue(dataView, offset, lengthSize);\n offset += sizes.item.extent.extentLength;\n\n item.extents.push(extent);\n }\n\n items.push(item);\n }\n\n return items;\n}\n\nfunction getItemId(dataView, offset, version) {\n if (version < 2) {\n return dataView.getUint16(offset);\n } else if (version === 2) {\n return dataView.getUint32(offset);\n }\n return undefined;\n}\n\nfunction getExtentIndex(dataView, version, offset, indexSize) {\n if ((version === 1 || version === 2) && indexSize > 0) {\n return getVariableSizedValue(dataView, offset, indexSize);\n }\n return undefined;\n}\n\nfunction getVariableSizedValue(dataView, offset, size) {\n if (size === 4) {\n return dataView.getUint32(offset);\n }\n if (size === 8) {\n // eslint-disable-next-line no-console\n console.warn('This file uses an 8-bit offset which is currently not supported by ExifReader. Contact the maintainer to get it fixed.');\n return get64BitValue(dataView, offset);\n }\n return 0;\n}\n","export function get64BitValue(dataView, offset) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return dataView.getUint32(offset + 4);\n}\n","import Constants from './constants.js';\nimport {getNullTerminatedStringFromDataView, getStringFromDataView} from './utils.js';\n// import {get64BitValue} from './image-header-iso-bmff-utils.js';\nimport {parseItemLocationBox} from './image-header-iso-bmff-iloc.js';\n\n// HEIC and AVIF files are based on the ISO-BMFF format. This file format is\n// built up by boxes. There are boxes and full boxes. All box types have a\n// length (4 or 8 bytes) and a type (4 bytes). Full boxes also have a version\n// (1 byte) and flags (3 bytes). The boxes can be nested. Each box type has its\n// own structure that can be seen in the specification.\n//\n// For metadata we are interested in the meta box. The meta box contains sub\n// boxes. The sub box type iinf has info about which types of metadata are\n// present in the file. The item ID we get from there we then look up in the\n// iloc sub box to get the offset to the real location of the metadata.\n//\n// The ICC profiles is a bit more nested. We have to look in\n// meta > iprp > ipco > colr, and then the whole profile is stored there.\n\n// These are actually 32-bit strings, not random IDs, e.g. \"ftyp\" and \"meta\".\nconst TYPE_FTYP = 0x66747970;\nconst TYPE_IPRP = 0x69707270;\nconst TYPE_META = 0x6d657461;\nconst TYPE_ILOC = 0x696c6f63;\nconst TYPE_IINF = 0x69696e66;\nconst TYPE_INFE = 0x696e6665;\nconst TYPE_IPCO = 0x6970636f;\nconst TYPE_COLR = 0x636f6c72;\n\n// const EXTENSION_TYPE_FDEL = 0x6664656c;\n\nexport const ITEM_INFO_TYPE_EXIF = 0x45786966;\nexport const ITEM_INFO_TYPE_MIME = 0x6d696d65;\nconst ITEM_INFO_TYPE_URI = 0x75726920;\n\n/**\n * Parses a ISO-BMFF box from the provided data view starting at the given offset.\n *\n * @param {DataView} dataView - The DataView to parse.\n * @param {number} offset - The offset at which to start parsing.\n * @returns {Object} The parsed box.\n */\nexport function parseBox(dataView, offset) {\n const BOX_TYPE_OFFSET = 4;\n const BOX_MIN_LENGTH = 8;\n const VERSION_SIZE = 1;\n\n const {length, contentOffset} = getBoxLength(dataView, offset);\n if (length < BOX_MIN_LENGTH) {\n return undefined;\n }\n\n const type = dataView.getUint32(offset + BOX_TYPE_OFFSET);\n\n if (type === TYPE_FTYP) {\n return parseFileTypeBox(dataView, contentOffset, length);\n }\n if (type === TYPE_IPRP) {\n return parseItemPropertiesBox(dataView, offset, contentOffset, length);\n }\n if (type === TYPE_IPCO) {\n return parseItemPropertyContainerBox(dataView, offset, contentOffset, length);\n }\n if (type === TYPE_COLR) {\n return parseColorInformationBox(dataView, contentOffset, length);\n }\n\n // The following are full boxes, also containing version and flags.\n const version = dataView.getUint8(contentOffset);\n\n if (type === TYPE_META) {\n return parseMetadataBox(dataView, offset, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_ILOC) {\n return parseItemLocationBox(dataView, version, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_IINF) {\n return parseItemInformationBox(dataView, offset, version, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_INFE) {\n return parseItemInformationEntryBox(dataView, offset, version, contentOffset + VERSION_SIZE, length);\n }\n\n return {\n // type: getStringFromDataView(dataView, offset + BOX_TYPE_OFFSET, 4),\n type: undefined,\n length\n };\n}\n\n/**\n * @typedef {Object} BoxLength\n * @property {number} length The length of the box including length and type.\n * @property {number} contentOffset\n */\n\n/**\n * @param {DataView} dataView\n * @param {number} offset\n * @returns {BoxLength}\n */\nfunction getBoxLength(dataView, offset) {\n const BOX_LENGTH_SIZE = 4;\n const BOX_TYPE_SIZE = 4;\n const BOX_EXTENDED_SIZE = 8;\n const BOX_EXTENDED_SIZE_LOW_OFFSET = 12;\n\n const boxLength = dataView.getUint32(offset);\n if (extendsToEndOfFile(boxLength)) {\n return {\n length: dataView.byteLength - offset,\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE,\n };\n }\n if (hasExtendedSize(boxLength)) {\n if (hasEmptyHighBits(dataView, offset)) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return {\n length: dataView.getUint32(offset + BOX_EXTENDED_SIZE_LOW_OFFSET),\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE + BOX_EXTENDED_SIZE,\n };\n }\n }\n\n return {\n length: boxLength,\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE,\n };\n}\n\nfunction extendsToEndOfFile(boxLength) {\n return boxLength === 0;\n}\n\nfunction hasExtendedSize(boxLength) {\n return boxLength === 1;\n}\n\nfunction hasEmptyHighBits(dataView, offset) {\n const BOX_EXTENDED_SIZE_OFFSET = 8;\n return dataView.getUint32(offset + BOX_EXTENDED_SIZE_OFFSET) === 0;\n}\n\n/**\n * @typedef {Object} Offsets\n * @property {number} tiffHeaderOffset\n * @property {Array} xmpChunks\n * @property {Array} iccChunks\n * @property {boolean} hasAppMarkers\n */\n\n/**\n * Finds the offsets of ISO-BMFF-structued data in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Offsets} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nexport function findOffsets(dataView) {\n if (Constants.USE_EXIF || Constants.USE_XMP || Constants.USE_ICC) {\n const offsets = {};\n const metaBox = findMetaBox(dataView);\n\n if (!metaBox) {\n return {hasAppMarkers: false};\n }\n\n if (Constants.USE_EXIF) {\n offsets.tiffHeaderOffset = findExifOffset(dataView, metaBox);\n }\n if (Constants.USE_XMP) {\n offsets.xmpChunks = findXmpChunks(metaBox);\n }\n if (Constants.USE_ICC) {\n offsets.iccChunks = findIccChunks(metaBox);\n }\n offsets.hasAppMarkers = (offsets.tiffHeaderOffset !== undefined) || (offsets.xmpChunks !== undefined) || (offsets.iccChunks !== undefined);\n return offsets;\n }\n\n return {};\n}\n\nfunction findMetaBox(dataView) {\n const BOX_LENGTH_SIZE = 4;\n const BOX_TYPE_SIZE = 4;\n\n let offset = 0;\n\n while (offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE <= dataView.byteLength) {\n const box = parseBox(dataView, offset);\n\n if (box === undefined) {\n break;\n }\n\n if (box.type === 'meta') {\n return box;\n }\n\n offset += box.length;\n }\n\n return undefined;\n}\n\nfunction findExifOffset(dataView, metaBox) {\n try {\n const exifItemId = findIinfExifItemId(metaBox).itemId;\n const ilocItem = findIlocItem(metaBox, exifItemId);\n const exifOffset = ilocItem.baseOffset + ilocItem.extents[0].extentOffset;\n return getTiffHeaderOffset(dataView, exifOffset);\n } catch (error) {\n return undefined;\n }\n}\n\nfunction findIinfExifItemId(metaBox) {\n return metaBox.subBoxes.find((box) => box.type === 'iinf').itemInfos.find((itemInfo) => itemInfo.itemType === ITEM_INFO_TYPE_EXIF);\n}\n\nfunction findIlocItem(metaBox, itemId) {\n return metaBox.subBoxes.find((box) => box.type === 'iloc').items.find((item) => item.itemId === itemId);\n}\n\nfunction getTiffHeaderOffset(dataView, exifOffset) {\n // ISO-BMFF formatted files store the Exif data as an \"Exif block\" where the\n // first 32 bits is the TIFF header offset.\n const TIFF_HEADER_OFFSET_SIZE = 4;\n return exifOffset + TIFF_HEADER_OFFSET_SIZE + dataView.getUint32(exifOffset);\n}\n\nfunction findXmpChunks(metaBox) {\n try {\n const xmpItemId = findIinfXmpItemId(metaBox).itemId;\n const ilocItem = findIlocItem(metaBox, xmpItemId);\n const ilocItemExtent = findIlocItem(metaBox, xmpItemId).extents[0];\n return [\n {\n dataOffset: ilocItem.baseOffset + ilocItemExtent.extentOffset,\n length: ilocItemExtent.extentLength,\n }\n ];\n } catch (error) {\n return undefined;\n }\n}\n\nfunction findIinfXmpItemId(metaBox) {\n return metaBox.subBoxes.find((box) => box.type === 'iinf')\n .itemInfos.find((itemInfo) => itemInfo.itemType === ITEM_INFO_TYPE_MIME && itemInfo.contentType === 'application/rdf+xml');\n}\n\nfunction findIccChunks(metaBox) {\n // This finds the first ICC chunk, but there could be one for each image\n // that is embedded in the file. If it turns out we need to match the ICC\n // chunk to a specific image, we need to check the \"ipma\" in addition to the\n // \"ipco\" (currently we only extract the \"ipco\" so more code would be\n // needed).\n try {\n const icc = metaBox.subBoxes.find((box) => box.type === 'iprp')\n .subBoxes.find((box) => box.type === 'ipco')\n .properties.find((box) => box.type === 'colr')\n .icc;\n if (icc) {\n return [icc];\n }\n } catch (error) {\n // Let it pass through.\n }\n return undefined;\n}\n\nfunction parseFileTypeBox(dataView, contentOffset, boxLength) {\n const MAJOR_BRAND_SIZE = 4;\n const majorBrand = getStringFromDataView(dataView, contentOffset, MAJOR_BRAND_SIZE);\n\n return {\n type: 'ftyp',\n majorBrand,\n length: boxLength\n };\n}\n\nfunction parseItemPropertiesBox(dataView, startOffset, contentOffset, length) {\n return {\n type: 'iprp',\n subBoxes: parseSubBoxes(dataView, contentOffset, length - (contentOffset - startOffset)),\n length,\n };\n}\n\nfunction parseItemPropertyContainerBox(dataView, startOffset, contentOffset, length) {\n return {\n type: 'ipco',\n properties: parseSubBoxes(dataView, contentOffset, length - (contentOffset - startOffset)),\n length,\n };\n}\n\nfunction parseColorInformationBox(dataView, contentOffset, length) {\n return {\n type: 'colr',\n icc: parseIcc(dataView, contentOffset),\n length,\n };\n}\n\nfunction parseIcc(dataView, contentOffset) {\n const COLOR_TYPE_SIZE = 4;\n\n const colorType = getStringFromDataView(dataView, contentOffset, COLOR_TYPE_SIZE);\n if (colorType !== 'prof' && colorType !== 'rICC') {\n // Support for nclx would require some restructuring for ICC handling.\n // Probably do it as a separate feature instead of combining with ICC.\n // Exiftool groups it under QuickTime. The test file test.avif has nclx.\n return undefined;\n }\n\n return {\n offset: contentOffset + COLOR_TYPE_SIZE,\n length: dataView.getUint32(contentOffset + COLOR_TYPE_SIZE),\n chunkNumber: 1,\n chunksTotal: 1\n };\n}\n\nfunction parseMetadataBox(dataView, startOffset, contentOffset, length) {\n const FLAGS_SIZE = 3;\n\n return {\n type: 'meta',\n subBoxes: parseSubBoxes(dataView, contentOffset + FLAGS_SIZE, length - (contentOffset + FLAGS_SIZE - startOffset)),\n length\n };\n}\n\n/**\n * @param {DataView} dataView\n * @param {number} offset The offset to start parsing from.\n * @param {number} length The length of all sub boxes combined.\n * @return {Array}\n */\nfunction parseSubBoxes(dataView, offset, length) {\n const ACCEPTED_ITEM_INFO_TYPES = [\n ITEM_INFO_TYPE_EXIF,\n ITEM_INFO_TYPE_MIME,\n ];\n\n const subBoxes = [];\n let currentOffset = offset;\n while (currentOffset < offset + length) {\n const box = parseBox(dataView, currentOffset);\n if (box === undefined) {\n break;\n }\n if (box.type !== undefined && (box.itemType === undefined || ACCEPTED_ITEM_INFO_TYPES.indexOf(box.itemType) !== -1)) {\n subBoxes.push(box);\n }\n currentOffset += box.length;\n }\n return subBoxes;\n}\n\nfunction parseItemInformationBox(dataView, startOffset, version, contentOffset, length) {\n const {offsets} = getItemInformationBoxOffsetsAndSizes(version, contentOffset);\n\n return {\n type: 'iinf',\n itemInfos: parseSubBoxes(dataView, offsets.itemInfos, length - (offsets.itemInfos - startOffset)),\n length\n };\n}\n\nfunction getItemInformationBoxOffsetsAndSizes(version, contentOffset) {\n const FLAGS_SIZE = 3;\n\n const offsets = {entryCount: contentOffset + FLAGS_SIZE};\n const sizes = {};\n\n if (version === 0) {\n sizes.entryCount = 2;\n } else {\n sizes.entryCount = 4;\n }\n\n offsets.itemInfos = offsets.entryCount + sizes.entryCount;\n\n return {offsets};\n}\n\nfunction parseItemInformationEntryBox(dataView, startOffset, version, contentOffset, length) {\n const FLAGS_SIZE = 3;\n\n contentOffset += FLAGS_SIZE;\n const entry = {type: 'infe', length};\n\n if (version === 0 || version === 1) {\n entry.itemId = dataView.getUint16(contentOffset);\n contentOffset += 2;\n entry.itemProtectionIndex = dataView.getUint16(contentOffset);\n contentOffset += 2;\n entry.itemName = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemName.length + 1;\n // entry.contentType = getNullTerminatedStringFromDataView(dataView, offset);\n // offset += entry.contentType.length + 1;\n // Since contentEncoding is optional we need to check the offset against length here.\n // entry.contentEncoding = getNullTerminatedStringFromDataView(dataView, offset);\n // offset += entry.contentEncoding.length + 1;\n }\n // The following code should be correct but we currently don't need it.\n // if (version === 1) {\n // // Everything here is optional, check the offset against length.\n // entry.extensionType = dataView.getUint32(contentOffset);\n // contentOffset += 4;\n // if (entry.extensionType === EXTENSION_TYPE_FDEL) {\n // entry.contentLocation = getNullTerminatedStringFromDataView(dataView, contentOffset);\n // contentOffset += entry.contentLocation.length + 1;\n // entry.contentMd5 = getNullTerminatedStringFromDataView(dataView, contentOffset);\n // contentOffset += entry.contentMd5.length + 1;\n // entry.contentLength = get64BitValue(dataView, contentOffset);\n // contentOffset += 8;\n // entry.transferLength = get64BitValue(dataView, contentOffset);\n // contentOffset += 8;\n // entry.entryCount = dataView.getUint8(contentOffset);\n // contentOffset += 1;\n // entry.entries = [];\n // for (let i = 0; i < entry.entryCount; i++) {\n // entry.entries.push({groupId: dataView.getUint32(contentOffset)});\n // contentOffset += 4;\n // }\n // }\n // }\n if (version >= 2) {\n if (version === 2) {\n entry.itemId = dataView.getUint16(contentOffset);\n contentOffset += 2;\n } else if (version === 3) {\n entry.itemId = dataView.getUint32(contentOffset);\n contentOffset += 4;\n }\n entry.itemProtectionIndex = dataView.getUint16(contentOffset);\n contentOffset += 2;\n // entry.itemTypeAscii = getStringFromDataView(dataView, offset, 4); // For testing.\n entry.itemType = dataView.getUint32(contentOffset);\n contentOffset += 4;\n entry.itemName = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemName.length + 1;\n if (entry.itemType === ITEM_INFO_TYPE_MIME) {\n entry.contentType = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.contentType.length + 1;\n if (startOffset + length > contentOffset) {\n entry.contentEncoding = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.contentEncoding.length + 1;\n }\n } else if (entry.itemType === ITEM_INFO_TYPE_URI) {\n entry.itemUri = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemUri.length + 1;\n }\n }\n return entry;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {parseBox, findOffsets} from './image-header-iso-bmff.js';\n\nexport default {\n isHeicFile,\n findHeicOffsets\n};\n\n/**\n * Checks if the provided data view represents a HEIC/HEIF file.\n *\n * @param {DataView} dataView - The data view to check.\n * @returns {boolean} True if the data view represents a HEIC/HEIF file, false otherwise.\n */\nfunction isHeicFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n const HEIC_MAJOR_BRANDS = ['heic', 'heix', 'hevc', 'hevx', 'heim', 'heis', 'hevm', 'hevs', 'mif1'];\n\n try {\n const headerBox = parseBox(dataView, 0);\n return headerBox && HEIC_MAJOR_BRANDS.indexOf(headerBox.majorBrand) !== -1;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Finds the offsets of a HEIC file in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Object} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nfunction findHeicOffsets(dataView) {\n return findOffsets(dataView);\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n isGifFile,\n findOffsets\n};\n\nconst GIF_SIGNATURE_SIZE = 6;\nconst GIF_SIGNATURES = ['GIF87a', 'GIF89a'];\n\nfunction isGifFile(dataView) {\n return !!dataView && GIF_SIGNATURES.includes(getStringFromDataView(dataView, 0, GIF_SIGNATURE_SIZE));\n}\n\nfunction findOffsets() {\n return {\n gifHeaderOffset: 0\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n isXMLFile,\n findOffsets\n};\n\nconst XML_MARKER_OFFSET = 0;\nconst XML_MARKER = '= MIN_TIFF_DATA_BUFFER_LENGTH) && hasTiffMarker(dataView);\n}\n\nfunction hasTiffMarker(dataView) {\n const TIFF_ID = 0x2a;\n const TIFF_ID_OFFSET = 2;\n\n const littleEndian = dataView.getUint16(0) === ByteOrder.LITTLE_ENDIAN;\n return dataView.getUint16(TIFF_ID_OFFSET, littleEndian) === TIFF_ID;\n}\n\nfunction findTiffOffsets() {\n const TIFF_FILE_HEADER_OFFSET = 0;\n\n if (Constants.USE_EXIF) {\n return {\n hasAppMarkers: true,\n tiffHeaderOffset: TIFF_FILE_HEADER_OFFSET\n };\n }\n return {};\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification:\n// https://aomediacodec.github.io/av1-avif\n\nimport {parseBox, findOffsets} from './image-header-iso-bmff.js';\n\nexport default {\n isAvifFile,\n findAvifOffsets\n};\n\n/**\n * Checks if the provided data view represents an AVIF file.\n *\n * @param {DataView} dataView - The data view to check.\n * @returns {boolean} True if the data view represents an AVIF file, false otherwise.\n */\nfunction isAvifFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n try {\n const headerBox = parseBox(dataView, 0);\n return headerBox && headerBox.majorBrand === 'avif';\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Finds the offsets of an AVIF file in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Object} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nfunction findAvifOffsets(dataView) {\n return findOffsets(dataView);\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isWebpFile,\n findOffsets\n};\n\nfunction isWebpFile(dataView) {\n const RIFF_ID_OFFSET = 0;\n const RIFF_ID = 'RIFF';\n const WEBP_MARKER_OFFSET = 8;\n const WEBP_MARKER = 'WEBP';\n\n return !!dataView && getStringFromDataView(dataView, RIFF_ID_OFFSET, RIFF_ID.length) === RIFF_ID\n && getStringFromDataView(dataView, WEBP_MARKER_OFFSET, WEBP_MARKER.length) === WEBP_MARKER;\n}\n\nfunction findOffsets(dataView) {\n const SUB_CHUNK_START_OFFSET = 12;\n const CHUNK_SIZE_OFFSET = 4;\n const EXIF_IDENTIFIER = 'Exif\\x00\\x00';\n const CHUNK_HEADER_SIZE = 8;\n\n let offset = SUB_CHUNK_START_OFFSET;\n let hasAppMarkers = false;\n let tiffHeaderOffset;\n let xmpChunks;\n let iccChunks;\n let vp8xChunkOffset;\n\n while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) {\n const chunkId = getStringFromDataView(dataView, offset, 4);\n const chunkSize = dataView.getUint32(offset + CHUNK_SIZE_OFFSET, true);\n\n if (Constants.USE_EXIF && (chunkId === 'EXIF')) {\n hasAppMarkers = true;\n if (getStringFromDataView(dataView, offset + CHUNK_HEADER_SIZE, EXIF_IDENTIFIER.length) === EXIF_IDENTIFIER) {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE + EXIF_IDENTIFIER.length;\n } else {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE;\n }\n } else if (Constants.USE_XMP && (chunkId === 'XMP ')) {\n hasAppMarkers = true;\n xmpChunks = [{\n dataOffset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize\n }];\n } else if (Constants.USE_ICC && (chunkId === 'ICCP')) {\n hasAppMarkers = true;\n iccChunks = [{\n offset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n } else if (chunkId === 'VP8X') {\n hasAppMarkers = true;\n vp8xChunkOffset = offset + CHUNK_HEADER_SIZE;\n }\n\n offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1);\n }\n\n return {\n hasAppMarkers,\n tiffHeaderOffset,\n xmpChunks,\n iccChunks,\n vp8xChunkOffset\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n ApertureValue: (value) => Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2),\n ColorSpace(value) {\n if (value === 1) {\n return 'sRGB';\n } else if (value === 0xffff) {\n return 'Uncalibrated';\n }\n return 'Unknown';\n },\n ComponentsConfiguration(value) {\n return value.map((character) => {\n if (character === 0x31) {\n return 'Y';\n } else if (character === 0x32) {\n return 'Cb';\n } else if (character === 0x33) {\n return 'Cr';\n } else if (character === 0x34) {\n return 'R';\n } else if (character === 0x35) {\n return 'G';\n } else if (character === 0x36) {\n return 'B';\n }\n }).join('');\n },\n Contrast(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n CustomRendered(value) {\n if (value === 0) {\n return 'Normal process';\n } else if (value === 1) {\n return 'Custom process';\n }\n return 'Unknown';\n },\n ExposureMode(value) {\n if (value === 0) {\n return 'Auto exposure';\n } else if (value === 1) {\n return 'Manual exposure';\n } else if (value === 2) {\n return 'Auto bracket';\n }\n return 'Unknown';\n },\n ExposureProgram(value) {\n if (value === 0) {\n return 'Undefined';\n } else if (value === 1) {\n return 'Manual';\n } else if (value === 2) {\n return 'Normal program';\n } else if (value === 3) {\n return 'Aperture priority';\n } else if (value === 4) {\n return 'Shutter priority';\n } else if (value === 5) {\n return 'Creative program';\n } else if (value === 6) {\n return 'Action program';\n } else if (value === 7) {\n return 'Portrait mode';\n } else if (value === 8) {\n return 'Landscape mode';\n } else if (value === 9) {\n return 'Bulb';\n }\n return 'Unknown';\n },\n ExposureTime(value) {\n if (value[0] / value[1] > 0.25) {\n const decimal = value[0] / value[1];\n if (Number.isInteger(decimal)) {\n return '' + decimal;\n }\n return decimal.toFixed(1);\n }\n if (value[0] !== 0) {\n return `1/${Math.round(value[1] / value[0])}`;\n }\n return `0/${value[1]}`;\n },\n FNumber: (value) => `f/${value[0] / value[1]}`,\n FocalLength: (value) => (value[0] / value[1]) + ' mm',\n FocalPlaneResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n } else if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n LightSource: (value) => {\n if (value === 1) {\n return 'Daylight';\n } else if (value === 2) {\n return 'Fluorescent';\n } else if (value === 3) {\n return 'Tungsten (incandescent light)';\n } else if (value === 4) {\n return 'Flash';\n } else if (value === 9) {\n return 'Fine weather';\n } else if (value === 10) {\n return 'Cloudy weather';\n } else if (value === 11) {\n return 'Shade';\n } else if (value === 12) {\n return 'Daylight fluorescent (D 5700 – 7100K)';\n } else if (value === 13) {\n return 'Day white fluorescent (N 4600 – 5400K)';\n } else if (value === 14) {\n return 'Cool white fluorescent (W 3900 – 4500K)';\n } else if (value === 15) {\n return 'White fluorescent (WW 3200 – 3700K)';\n } else if (value === 17) {\n return 'Standard light A';\n } else if (value === 18) {\n return 'Standard light B';\n } else if (value === 19) {\n return 'Standard light C';\n } else if (value === 20) {\n return 'D55';\n } else if (value === 21) {\n return 'D65';\n } else if (value === 22) {\n return 'D75';\n } else if (value === 23) {\n return 'D50';\n } else if (value === 24) {\n return 'ISO studio tungsten';\n } else if (value === 255) {\n return 'Other light source';\n }\n return 'Unknown';\n },\n MeteringMode(value) {\n if (value === 1) {\n return 'Average';\n } else if (value === 2) {\n return 'CenterWeightedAverage';\n } else if (value === 3) {\n return 'Spot';\n } else if (value === 4) {\n return 'MultiSpot';\n } else if (value === 5) {\n return 'Pattern';\n } else if (value === 6) {\n return 'Partial';\n } else if (value === 255) {\n return 'Other';\n }\n return 'Unknown';\n },\n ResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n }\n if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n Saturation(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Low saturation';\n } else if (value === 2) {\n return 'High saturation';\n }\n return 'Unknown';\n },\n SceneCaptureType(value) {\n if (value === 0) {\n return 'Standard';\n } else if (value === 1) {\n return 'Landscape';\n } else if (value === 2) {\n return 'Portrait';\n } else if (value === 3) {\n return 'Night scene';\n }\n return 'Unknown';\n },\n Sharpness(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n ShutterSpeedValue(value) {\n const denominator = Math.pow(2, value[0] / value[1]);\n if (denominator <= 1) {\n return `${Math.round(1 / denominator)}`;\n }\n return `1/${Math.round(denominator)}`;\n },\n WhiteBalance(value) {\n if (value === 0) {\n return 'Auto white balance';\n } else if (value === 1) {\n return 'Manual white balance';\n }\n return 'Unknown';\n },\n XResolution: (value) => '' + Math.round(value[0] / value[1]),\n YResolution: (value) => '' + Math.round(value[0] / value[1])\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x000b: 'ProcessingSoftware',\n 0x00fe: {\n name: 'SubfileType',\n description: (value) => ({\n 0x0: 'Full-resolution image',\n 0x1: 'Reduced-resolution image',\n 0x2: 'Single page of multi-page image',\n 0x3: 'Single page of multi-page reduced-resolution image',\n 0x4: 'Transparency mask',\n 0x5: 'Transparency mask of reduced-resolution image',\n 0x6: 'Transparency mask of multi-page image',\n 0x7: 'Transparency mask of reduced-resolution multi-page image',\n 0x10001: 'Alternate reduced-resolution image',\n 0xffffffff: 'Invalid'\n })[value] || 'Unknown'\n },\n 0x00ff: {\n name: 'OldSubfileType',\n description: (value) => ({\n 0: 'Full-resolution image',\n 1: 'Reduced-resolution image',\n 2: 'Single page of multi-page image'\n })[value] || 'Unknown'\n },\n 0x0100: 'ImageWidth',\n 0x0101: 'ImageLength',\n 0x0102: 'BitsPerSample',\n 0x0103: 'Compression',\n 0x0106: 'PhotometricInterpretation',\n 0x0107: {\n name: 'Thresholding',\n description: (value) => ({\n 1: 'No dithering or halftoning',\n 2: 'Ordered dither or halfton',\n 3: 'Randomized dither'\n })[value] || 'Unknown'\n },\n 0x0108: 'CellWidth',\n 0x0109: 'CellLength',\n 0x010a: {\n name: 'FillOrder',\n description: (value) => ({\n 1: 'Normal',\n 2: 'Reversed'\n })[value] || 'Unknown'\n },\n 0x010d: 'DocumentName',\n 0x010e: 'ImageDescription',\n 0x010f: 'Make',\n 0x0110: 'Model',\n 0x0111: 'StripOffsets',\n 0x0112: {\n name: 'Orientation',\n description: (value) => {\n if (value === 1) {\n return 'top-left';\n }\n if (value === 2) {\n return 'top-right';\n }\n if (value === 3) {\n return 'bottom-right';\n }\n if (value === 4) {\n return 'bottom-left';\n }\n if (value === 5) {\n return 'left-top';\n }\n if (value === 6) {\n return 'right-top';\n }\n if (value === 7) {\n return 'right-bottom';\n }\n if (value === 8) {\n return 'left-bottom';\n }\n return 'Undefined';\n }\n },\n 0x0115: 'SamplesPerPixel',\n 0x0116: 'RowsPerStrip',\n 0x0117: 'StripByteCounts',\n 0x0118: 'MinSampleValue',\n 0x0119: 'MaxSampleValue',\n 0x011a: {\n 'name': 'XResolution',\n 'description': TagNamesCommon.XResolution\n },\n 0x011b: {\n 'name': 'YResolution',\n 'description': TagNamesCommon.YResolution\n },\n 0x011c: 'PlanarConfiguration',\n 0x011d: 'PageName',\n 0x011e: {\n 'name': 'XPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011f: {\n 'name': 'YPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x0122: {\n name: 'GrayResponseUnit',\n description: (value) => ({\n 1: '0.1',\n 2: '0.001',\n 3: '0.0001',\n 4: '1e-05',\n 5: '1e-06'\n })[value] || 'Unknown'\n },\n 0x0128: {\n name: 'ResolutionUnit',\n description: TagNamesCommon.ResolutionUnit\n },\n 0x0129: 'PageNumber',\n 0x012d: 'TransferFunction',\n 0x0131: 'Software',\n 0x0132: 'DateTime',\n 0x013b: 'Artist',\n 0x013c: 'HostComputer',\n 0x013d: 'Predictor',\n 0x013e: {\n 'name': 'WhitePoint',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x013f: {\n 'name': 'PrimaryChromaticities',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x0141: 'HalftoneHints',\n 0x0142: 'TileWidth',\n 0x0143: 'TileLength',\n 0x014a: 'A100DataOffset',\n 0x014c: {\n name: 'InkSet',\n description: (value) => ({\n 1: 'CMYK',\n 2: 'Not CMYK'\n })[value] || 'Unknown'\n },\n 0x0151: 'TargetPrinter',\n 0x0152: {\n name: 'ExtraSamples',\n description: (value) => ({\n 0: 'Unspecified',\n 1: 'Associated Alpha',\n 2: 'Unassociated Alpha',\n })[value] || 'Unknown'\n },\n 0x0153: {\n name: 'SampleFormat',\n description: (value) => {\n const formats = {\n 1: 'Unsigned',\n 2: 'Signed',\n 3: 'Float',\n 4: 'Undefined',\n 5: 'Complex int',\n 6: 'Complex float',\n };\n if (!Array.isArray(value)) {\n return 'Unknown';\n }\n return value.map((sample) => formats[sample] || 'Unknown').join(', ');\n }\n },\n 0x0201: 'JPEGInterchangeFormat',\n 0x0202: 'JPEGInterchangeFormatLength',\n 0x0211: {\n 'name': 'YCbCrCoefficients',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join('/');\n }\n },\n 0x0212: 'YCbCrSubSampling',\n 0x0213: {\n name: 'YCbCrPositioning',\n description: (value) => {\n if (value === 1) {\n return 'centered';\n }\n if (value === 2) {\n return 'co-sited';\n }\n return 'undefined ' + value;\n }\n },\n 0x0214: {\n 'name': 'ReferenceBlackWhite',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join(', ');\n }\n },\n 0x02bc: 'ApplicationNotes',\n 0x4746: 'Rating',\n 0x4749: 'RatingPercent',\n 0x8298: {\n name: 'Copyright',\n description: (value) => value.join('; ')\n },\n 0x830e: 'PixelScale',\n 0x83bb: 'IPTC-NAA',\n 0x8480: 'IntergraphMatrix',\n 0x8482: 'ModelTiePoint',\n 0x8546: 'SEMInfo',\n 0x85d8: 'ModelTransform',\n 0x8649: 'PhotoshopSettings',\n 0x8769: 'Exif IFD Pointer',\n 0x8773: 'ICC_Profile',\n 0x87af: 'GeoTiffDirectory',\n 0x87b0: 'GeoTiffDoubleParams',\n 0x87b1: 'GeoTiffAsciiParams',\n 0x8825: 'GPS Info IFD Pointer',\n 0x9c9b: 'XPTitle',\n 0x9c9c: 'XPComment',\n 0x9c9d: 'XPAuthor',\n 0x9c9e: 'XPKeywords',\n 0x9c9f: 'XPSubject',\n 0xa480: 'GDALMetadata',\n 0xa481: 'GDALNoData',\n 0xc4a5: 'PrintIM',\n 0xc613: 'DNGBackwardVersion',\n 0xc614: 'UniqueCameraModel',\n 0xc615: 'LocalizedCameraModel',\n 0xc621: 'ColorMatrix1',\n 0xc622: 'ColorMatrix2',\n 0xc623: 'CameraCalibration1',\n 0xc624: 'CameraCalibration2',\n 0xc625: 'ReductionMatrix1',\n 0xc626: 'ReductionMatrix2',\n 0xc627: 'AnalogBalance',\n 0xc628: 'AsShotNeutral',\n 0xc629: 'AsShotWhiteXY',\n 0xc62a: 'BaselineExposure',\n 0xc62b: 'BaselineNoise',\n 0xc62c: 'BaselineSharpness',\n 0xc62e: 'LinearResponseLimit',\n 0xc62f: 'CameraSerialNumber',\n 0xc630: 'DNGLensInfo',\n 0xc633: 'ShadowScale',\n 0xc635: {\n name: 'MakerNoteSafety',\n description: (value) => ({\n 0: 'Unsafe',\n 1: 'Safe'\n })[value] || 'Unknown'\n },\n 0xc65a: {\n name: 'CalibrationIlluminant1',\n description: TagNamesCommon['LightSource']\n },\n 0xc65b: {\n name: 'CalibrationIlluminant2',\n description: TagNamesCommon['LightSource']\n },\n 0xc65d: 'RawDataUniqueID',\n 0xc68b: 'OriginalRawFileName',\n 0xc68c: 'OriginalRawFileData',\n 0xc68f: 'AsShotICCProfile',\n 0xc690: 'AsShotPreProfileMatrix',\n 0xc691: 'CurrentICCProfile',\n 0xc692: 'CurrentPreProfileMatrix',\n 0xc6bf: 'ColorimetricReference',\n 0xc6c5: 'SRawType',\n 0xc6d2: 'PanasonicTitle',\n 0xc6d3: 'PanasonicTitle2',\n 0xc6f3: 'CameraCalibrationSig',\n 0xc6f4: 'ProfileCalibrationSig',\n 0xc6f5: 'ProfileIFD',\n 0xc6f6: 'AsShotProfileName',\n 0xc6f8: 'ProfileName',\n 0xc6f9: 'ProfileHueSatMapDims',\n 0xc6fa: 'ProfileHueSatMapData1',\n 0xc6fb: 'ProfileHueSatMapData2',\n 0xc6fc: 'ProfileToneCurve',\n 0xc6fd: {\n name: 'ProfileEmbedPolicy',\n description: (value) => ({\n 0: 'Allow Copying',\n 1: 'Embed if Used',\n 2: 'Never Embed',\n 3: 'No Restrictions'\n })[value] || 'Unknown'\n },\n 0xc6fe: 'ProfileCopyright',\n 0xc714: 'ForwardMatrix1',\n 0xc715: 'ForwardMatrix2',\n 0xc716: 'PreviewApplicationName',\n 0xc717: 'PreviewApplicationVersion',\n 0xc718: 'PreviewSettingsName',\n 0xc719: 'PreviewSettingsDigest',\n 0xc71a: {\n name: 'PreviewColorSpace',\n description: (value) => ({\n 1: 'Gray Gamma 2.2',\n 2: 'sRGB',\n 3: 'Adobe RGB',\n 4: 'ProPhoto RGB'\n })[value] || 'Unknown'\n },\n 0xc71b: 'PreviewDateTime',\n 0xc71c: 'RawImageDigest',\n 0xc71d: 'OriginalRawFileDigest',\n 0xc725: 'ProfileLookTableDims',\n 0xc726: 'ProfileLookTableData',\n 0xc763: 'TimeCodes',\n 0xc764: 'FrameRate',\n 0xc772: 'TStop',\n 0xc789: 'ReelName',\n 0xc791: 'OriginalDefaultFinalSize',\n 0xc792: 'OriginalBestQualitySize',\n 0xc793: 'OriginalDefaultCropSize',\n 0xc7a1: 'CameraLabel',\n 0xc7a3: {\n name: 'ProfileHueSatMapEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a4: {\n name: 'ProfileLookTableEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a5: 'BaselineExposureOffset',\n 0xc7a6: {\n name: 'DefaultBlackRender',\n description: (value) => ({\n 0: 'Auto',\n 1: 'None'\n })[value] || 'Unknown'\n },\n 0xc7a7: 'NewRawImageDigest',\n 0xc7a8: 'RawToPreviewGain'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getEncodedString, getCalculatedGpsValue} from './tag-names-utils.js';\n\nexport default {\n 0x0000: {\n 'name': 'GPSVersionID',\n 'description': (value) => {\n if (value[0] === 2 && value[1] === 2 && value[2] === 0 && value[3] === 0) {\n return 'Version 2.2';\n }\n return 'Unknown';\n }\n },\n 0x0001: {\n 'name': 'GPSLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0002: {\n 'name': 'GPSLatitude',\n 'description': getCalculatedGpsValue\n },\n 0x0003: {\n 'name': 'GPSLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0004: {\n 'name': 'GPSLongitude',\n 'description': getCalculatedGpsValue\n },\n 0x0005: {\n 'name': 'GPSAltitudeRef',\n 'description': (value) => {\n if (value === 0) {\n return 'Sea level';\n } else if (value === 1) {\n return 'Sea level reference (negative value)';\n }\n return 'Unknown';\n }\n },\n 0x0006: {\n 'name': 'GPSAltitude',\n 'description': (value) => {\n return (value[0] / value[1]) + ' m';\n }\n },\n 0x0007: {\n 'name': 'GPSTimeStamp',\n 'description': (values) => {\n return values.map(([numerator, denominator]) => {\n const num = numerator / denominator;\n if (/^\\d(\\.|$)/.test(`${num}`)) {\n return `0${num}`;\n }\n return num;\n }).join(':');\n }\n },\n 0x0008: 'GPSSatellites',\n 0x0009: {\n 'name': 'GPSStatus',\n 'description': (value) => {\n const status = value.join('');\n if (status === 'A') {\n return 'Measurement in progress';\n } else if (status === 'V') {\n return 'Measurement Interoperability';\n }\n return 'Unknown';\n }\n },\n 0x000a: {\n 'name': 'GPSMeasureMode',\n 'description': (value) => {\n const mode = value.join('');\n if (mode === '2') {\n return '2-dimensional measurement';\n } else if (mode === '3') {\n return '3-dimensional measurement';\n }\n return 'Unknown';\n }\n },\n 0x000b: 'GPSDOP',\n 0x000c: {\n 'name': 'GPSSpeedRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers per hour';\n } else if (ref === 'M') {\n return 'Miles per hour';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x000d: 'GPSSpeed',\n 0x000e: {\n 'name': 'GPSTrackRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x000f: 'GPSTrack',\n 0x0010: {\n 'name': 'GPSImgDirectionRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0011: 'GPSImgDirection',\n 0x0012: 'GPSMapDatum',\n 0x0013: {\n 'name': 'GPSDestLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0014: {\n 'name': 'GPSDestLatitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0015: {\n 'name': 'GPSDestLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0016: {\n 'name': 'GPSDestLongitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0017: {\n 'name': 'GPSDestBearingRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0018: 'GPSDestBearing',\n 0x0019: {\n 'name': 'GPSDestDistanceRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers';\n } else if (ref === 'M') {\n return 'Miles';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x001a: 'GPSDestDistance',\n 0x001b: {\n 'name': 'GPSProcessingMethod',\n 'description': getEncodedString\n },\n 0x001c: {\n 'name': 'GPSAreaInformation',\n 'description': getEncodedString\n },\n 0x001d: 'GPSDateStamp',\n 0x001e: {\n 'name': 'GPSDifferential',\n 'description': (value) => {\n if (value === 0) {\n return 'Measurement without differential correction';\n } else if (value === 1) {\n return 'Differential correction applied';\n }\n return 'Unknown';\n }\n },\n 0x001f: 'GPSHPositioningError'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0x0001: 'InteroperabilityIndex',\n 0x0002: {\n name: 'InteroperabilityVersion',\n description: (value) => getStringValue(value)\n },\n 0x1000: 'RelatedImageFileFormat',\n 0x1001: 'RelatedImageWidth',\n 0x1002: 'RelatedImageHeight'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0xb000: {\n 'name': 'MPFVersion',\n 'description': (value) => getStringValue(value)\n },\n 0xb001: 'NumberOfImages',\n 0xb002: 'MPEntry',\n 0xb003: 'ImageUIDList',\n 0xb004: 'TotalFrames'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport Constants from './constants.js';\nimport TagNames0thIfd from './tag-names-0th-ifd.js';\nimport TagNamesExifIfd from './tag-names-exif-ifd.js';\nimport TagNamesGpsIfd from './tag-names-gps-ifd.js';\nimport TagNamesInteroperabilityIfd from './tag-names-interoperability-ifd.js';\nimport TagNamesMpfIfd from './tag-names-mpf-ifd.js';\nimport TagNamesCanonIfd from './tag-names-canon-ifd.js';\n\nconst tagNames0thExifIfds = objectAssign({}, TagNames0thIfd, TagNamesExifIfd);\n\nexport const IFD_TYPE_0TH = '0th';\nexport const IFD_TYPE_1ST = '1st';\nexport const IFD_TYPE_EXIF = 'exif';\nexport const IFD_TYPE_GPS = 'gps';\nexport const IFD_TYPE_INTEROPERABILITY = 'interoperability';\nexport const IFD_TYPE_MPF = 'mpf';\nexport const IFD_TYPE_CANON = 'canon';\n\nexport default {\n [IFD_TYPE_0TH]: tagNames0thExifIfds,\n [IFD_TYPE_1ST]: TagNames0thIfd,\n [IFD_TYPE_EXIF]: tagNames0thExifIfds,\n [IFD_TYPE_GPS]: TagNamesGpsIfd,\n [IFD_TYPE_INTEROPERABILITY]: TagNamesInteroperabilityIfd,\n [IFD_TYPE_MPF]: Constants.USE_MPF ? TagNamesMpfIfd : {},\n [IFD_TYPE_CANON]: Constants.USE_MAKER_NOTES ? TagNamesCanonIfd : {},\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue, getEncodedString} from './tag-names-utils.js';\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x829a: {\n 'name': 'ExposureTime',\n 'description': TagNamesCommon.ExposureTime\n },\n 0x829d: {\n 'name': 'FNumber',\n 'description': TagNamesCommon.FNumber\n },\n 0x8822: {\n 'name': 'ExposureProgram',\n 'description': TagNamesCommon.ExposureProgram\n },\n 0x8824: 'SpectralSensitivity',\n 0x8827: 'ISOSpeedRatings',\n 0x8828: {\n 'name': 'OECF',\n 'description': () => '[Raw OECF table data]'\n },\n 0x882a: 'TimeZoneOffset',\n 0x882b: 'SelfTimerMode',\n 0x8830: {\n name: 'SensitivityType',\n description: (value) => ({\n 1: 'Standard Output Sensitivity',\n 2: 'Recommended Exposure Index',\n 3: 'ISO Speed',\n 4: 'Standard Output Sensitivity and Recommended Exposure Index',\n 5: 'Standard Output Sensitivity and ISO Speed',\n 6: 'Recommended Exposure Index and ISO Speed',\n 7: 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed'\n })[value] || 'Unknown'\n },\n 0x8831: 'StandardOutputSensitivity',\n 0x8832: 'RecommendedExposureIndex',\n 0x8833: 'ISOSpeed',\n 0x8834: 'ISOSpeedLatitudeyyy',\n 0x8835: 'ISOSpeedLatitudezzz',\n 0x9000: {\n 'name': 'ExifVersion',\n 'description': (value) => getStringValue(value)\n },\n 0x9003: 'DateTimeOriginal',\n 0x9004: 'DateTimeDigitized',\n 0x9009: 'GooglePlusUploadCode',\n 0x9010: 'OffsetTime',\n 0x9011: 'OffsetTimeOriginal',\n 0x9012: 'OffsetTimeDigitized',\n 0x9101: {\n 'name': 'ComponentsConfiguration',\n 'description': TagNamesCommon.ComponentsConfiguration\n },\n 0x9102: 'CompressedBitsPerPixel',\n 0x9201: {\n 'name': 'ShutterSpeedValue',\n 'description': TagNamesCommon.ShutterSpeedValue\n },\n 0x9202: {\n 'name': 'ApertureValue',\n 'description': TagNamesCommon.ApertureValue\n },\n 0x9203: 'BrightnessValue',\n 0x9204: 'ExposureBiasValue',\n 0x9205: {\n 'name': 'MaxApertureValue',\n 'description': (value) => {\n return Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2);\n }\n },\n 0x9206: {\n 'name': 'SubjectDistance',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9207: {\n 'name': 'MeteringMode',\n 'description': TagNamesCommon.MeteringMode\n },\n 0x9208: {\n 'name': 'LightSource',\n description: TagNamesCommon.LightSource\n },\n 0x9209: {\n 'name': 'Flash',\n 'description': (value) => {\n if (value === 0x00) {\n return 'Flash did not fire';\n } else if (value === 0x01) {\n return 'Flash fired';\n } else if (value === 0x05) {\n return 'Strobe return light not detected';\n } else if (value === 0x07) {\n return 'Strobe return light detected';\n } else if (value === 0x09) {\n return 'Flash fired, compulsory flash mode';\n } else if (value === 0x0d) {\n return 'Flash fired, compulsory flash mode, return light not detected';\n } else if (value === 0x0f) {\n return 'Flash fired, compulsory flash mode, return light detected';\n } else if (value === 0x10) {\n return 'Flash did not fire, compulsory flash mode';\n } else if (value === 0x18) {\n return 'Flash did not fire, auto mode';\n } else if (value === 0x19) {\n return 'Flash fired, auto mode';\n } else if (value === 0x1d) {\n return 'Flash fired, auto mode, return light not detected';\n } else if (value === 0x1f) {\n return 'Flash fired, auto mode, return light detected';\n } else if (value === 0x20) {\n return 'No flash function';\n } else if (value === 0x41) {\n return 'Flash fired, red-eye reduction mode';\n } else if (value === 0x45) {\n return 'Flash fired, red-eye reduction mode, return light not detected';\n } else if (value === 0x47) {\n return 'Flash fired, red-eye reduction mode, return light detected';\n } else if (value === 0x49) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode';\n } else if (value === 0x4d) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected';\n } else if (value === 0x4f) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected';\n } else if (value === 0x59) {\n return 'Flash fired, auto mode, red-eye reduction mode';\n } else if (value === 0x5d) {\n return 'Flash fired, auto mode, return light not detected, red-eye reduction mode';\n } else if (value === 0x5f) {\n return 'Flash fired, auto mode, return light detected, red-eye reduction mode';\n }\n return 'Unknown';\n }\n },\n 0x920a: {\n 'name': 'FocalLength',\n 'description': TagNamesCommon.FocalLength\n },\n 0x9211: 'ImageNumber',\n 0x9212: {\n name: 'SecurityClassification',\n description: (value) => ({\n 'C': 'Confidential',\n 'R': 'Restricted',\n 'S': 'Secret',\n 'T': 'Top Secret',\n 'U': 'Unclassified'\n })[value] || 'Unknown'\n },\n 0x9213: 'ImageHistory',\n 0x9214: {\n 'name': 'SubjectArea',\n 'description': (value) => {\n if (value.length === 2) {\n return `Location; X: ${value[0]}, Y: ${value[1]}`;\n } else if (value.length === 3) {\n return `Circle; X: ${value[0]}, Y: ${value[1]}, diameter: ${value[2]}`;\n } else if (value.length === 4) {\n return `Rectangle; X: ${value[0]}, Y: ${value[1]}, width: ${value[2]}, height: ${value[3]}`;\n }\n return 'Unknown';\n }\n },\n 0x927c: {\n 'name': 'MakerNote',\n 'description': () => '[Raw maker note data]'\n },\n 0x9286: {\n 'name': 'UserComment',\n 'description': getEncodedString\n },\n 0x9290: 'SubSecTime',\n 0x9291: 'SubSecTimeOriginal',\n 0x9292: 'SubSecTimeDigitized',\n 0x935c: 'ImageSourceData',\n 0x9400: {\n 'name': 'AmbientTemperature',\n 'description': (value) => (value[0] / value[1]) + ' °C'\n },\n 0x9401: {\n 'name': 'Humidity',\n 'description': (value) => (value[0] / value[1]) + ' %'\n },\n 0x9402: {\n 'name': 'Pressure',\n 'description': (value) => (value[0] / value[1]) + ' hPa'\n },\n 0x9403: {\n 'name': 'WaterDepth',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9404: {\n 'name': 'Acceleration',\n 'description': (value) => (value[0] / value[1]) + ' mGal'\n },\n 0x9405: {\n 'name': 'CameraElevationAngle',\n 'description': (value) => (value[0] / value[1]) + ' °'\n },\n 0xa000: {\n 'name': 'FlashpixVersion',\n 'description': (value) => value.map((charCode) => String.fromCharCode(charCode)).join('')\n },\n 0xa001: {\n 'name': 'ColorSpace',\n 'description': TagNamesCommon.ColorSpace\n },\n 0xa002: 'PixelXDimension',\n 0xa003: 'PixelYDimension',\n 0xa004: 'RelatedSoundFile',\n 0xa005: 'Interoperability IFD Pointer',\n 0xa20b: 'FlashEnergy',\n 0xa20c: {\n 'name': 'SpatialFrequencyResponse',\n 'description': () => '[Raw SFR table data]'\n },\n 0xa20e: 'FocalPlaneXResolution',\n 0xa20f: 'FocalPlaneYResolution',\n 0xa210: {\n 'name': 'FocalPlaneResolutionUnit',\n 'description': TagNamesCommon.FocalPlaneResolutionUnit\n },\n 0xa214: {\n 'name': 'SubjectLocation',\n 'description': ([x, y]) => `X: ${x}, Y: ${y}`\n },\n 0xa215: 'ExposureIndex',\n 0xa217: {\n 'name': 'SensingMethod',\n 'description': (value) => {\n if (value === 1) {\n return 'Undefined';\n } else if (value === 2) {\n return 'One-chip color area sensor';\n } else if (value === 3) {\n return 'Two-chip color area sensor';\n } else if (value === 4) {\n return 'Three-chip color area sensor';\n } else if (value === 5) {\n return 'Color sequential area sensor';\n } else if (value === 7) {\n return 'Trilinear sensor';\n } else if (value === 8) {\n return 'Color sequential linear sensor';\n }\n return 'Unknown';\n }\n },\n 0xa300: {\n 'name': 'FileSource',\n 'description': (value) => {\n if (value === 3) {\n return 'DSC';\n }\n return 'Unknown';\n }\n },\n 0xa301: {\n 'name': 'SceneType',\n 'description': (value) => {\n if (value === 1) {\n return 'A directly photographed image';\n }\n return 'Unknown';\n }\n },\n 0xa302: {\n 'name': 'CFAPattern',\n 'description': () => '[Raw CFA pattern table data]'\n },\n 0xa401: {\n 'name': 'CustomRendered',\n 'description': TagNamesCommon.CustomRendered\n },\n 0xa402: {\n 'name': 'ExposureMode',\n 'description': TagNamesCommon.ExposureMode\n },\n 0xa403: {\n 'name': 'WhiteBalance',\n 'description': TagNamesCommon.WhiteBalance\n },\n 0xa404: {\n 'name': 'DigitalZoomRatio',\n 'description': (value) => {\n if (value[0] === 0) {\n return 'Digital zoom was not used';\n }\n return '' + (value[0] / value[1]);\n }\n },\n 0xa405: {\n 'name': 'FocalLengthIn35mmFilm',\n 'description': (value) => {\n if (value === 0) {\n return 'Unknown';\n }\n return value;\n }\n },\n 0xa406: {\n 'name': 'SceneCaptureType',\n 'description': TagNamesCommon.SceneCaptureType\n },\n 0xa407: {\n 'name': 'GainControl',\n 'description': (value) => {\n if (value === 0) {\n return 'None';\n } else if (value === 1) {\n return 'Low gain up';\n } else if (value === 2) {\n return 'High gain up';\n } else if (value === 3) {\n return 'Low gain down';\n } else if (value === 4) {\n return 'High gain down';\n }\n return 'Unknown';\n }\n },\n 0xa408: {\n 'name': 'Contrast',\n 'description': TagNamesCommon.Contrast\n },\n 0xa409: {\n 'name': 'Saturation',\n 'description': TagNamesCommon.Saturation\n },\n 0xa40a: {\n 'name': 'Sharpness',\n 'description': TagNamesCommon.Sharpness\n },\n 0xa40b: {\n 'name': 'DeviceSettingDescription',\n 'description': () => '[Raw device settings table data]'\n },\n 0xa40c: {\n 'name': 'SubjectDistanceRange',\n 'description': (value) => {\n if (value === 1) {\n return 'Macro';\n } else if (value === 2) {\n return 'Close view';\n } else if (value === 3) {\n return 'Distant view';\n }\n return 'Unknown';\n }\n },\n 0xa420: 'ImageUniqueID',\n 0xa430: 'CameraOwnerName',\n 0xa431: 'BodySerialNumber',\n 0xa432: {\n 'name': 'LensSpecification',\n 'description': (value) => {\n const focalLengthFrom = parseFloat((value[0][0] / value[0][1]).toFixed(5));\n const focalLengthTo = parseFloat((value[1][0] / value[1][1]).toFixed(5));\n const focalLengths = `${focalLengthFrom}-${focalLengthTo} mm`;\n if (value[3][1] === 0) {\n return `${focalLengths} f/?`;\n }\n const maxAperture = 1 / ((value[2][1] / value[2][1]) / (value[3][0] / value[3][1]));\n return `${focalLengths} f/${parseFloat(maxAperture.toFixed(5))}`;\n }\n },\n 0xa433: 'LensMake',\n 0xa434: 'LensModel',\n 0xa435: 'LensSerialNumber',\n 0xa460: {\n name: 'CompositeImage',\n description: (value) => ({\n 1: 'Not a Composite Image',\n 2: 'General Composite Image',\n 3: 'Composite Image Captured While Shooting',\n })[value] || 'Unknown'\n },\n 0xa461: 'SourceImageNumberOfCompositeImage',\n 0xa462: 'SourceExposureTimesOfCompositeImage',\n 0xa500: 'Gamma',\n 0xea1c: 'Padding',\n 0xea1d: 'OffsetSchema',\n 0xfde8: 'OwnerName',\n 0xfde9: 'SerialNumber',\n 0xfdea: 'Lens',\n 0xfe4c: 'RawFile',\n 0xfe4d: 'Converter',\n 0xfe4e: 'WhiteBalance',\n 0xfe51: 'Exposure',\n 0xfe52: 'Shadows',\n 0xfe53: 'Brightness',\n 0xfe54: 'Contrast',\n 0xfe55: 'Saturation',\n 0xfe56: 'Sharpness',\n 0xfe57: 'Smoothness',\n 0xfe58: 'MoireFilter'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n 0x0004: {\n 'name': 'ShotInfo',\n 'description': (value) => value\n },\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\n\nconst typeSizes = {\n 1: 1, // BYTE\n 2: 1, // ASCII\n 3: 2, // SHORT\n 4: 4, // LONG\n 5: 8, // RATIONAL\n 7: 1, // UNDEFINED\n 9: 4, // SLONG\n 10: 8, // SRATIONAL\n 13: 4 // IFD\n};\n\nconst tagTypes = {\n 'BYTE': 1,\n 'ASCII': 2,\n 'SHORT': 3,\n 'LONG': 4,\n 'RATIONAL': 5,\n 'UNDEFINED': 7,\n 'SLONG': 9,\n 'SRATIONAL': 10,\n 'IFD': 13\n};\n\nexport default {\n getAsciiValue,\n getByteAt,\n getAsciiAt,\n getShortAt,\n getLongAt,\n getRationalAt,\n getUndefinedAt,\n getSlongAt,\n getSrationalAt,\n getIfdPointerAt,\n typeSizes,\n tagTypes,\n getTypeSize\n};\n\nfunction getAsciiValue(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode));\n}\n\nfunction getByteAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getAsciiAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getShortAt(dataView, offset, byteOrder) {\n return dataView.getUint16(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getLongAt(dataView, offset, byteOrder) {\n return dataView.getUint32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getRationalAt(dataView, offset, byteOrder) {\n return [getLongAt(dataView, offset, byteOrder), getLongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getUndefinedAt(dataView, offset) {\n return getByteAt(dataView, offset);\n}\n\nfunction getSlongAt(dataView, offset, byteOrder) {\n return dataView.getInt32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getSrationalAt(dataView, offset, byteOrder) {\n return [getSlongAt(dataView, offset, byteOrder), getSlongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getIfdPointerAt(dataView, offset, byteOrder) {\n return getLongAt(dataView, offset, byteOrder);\n}\n\nfunction getTypeSize(typeName) {\n if (tagTypes[typeName] === undefined) {\n throw new Error('No such type found.');\n }\n\n return typeSizes[tagTypes[typeName]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport Types from './types.js';\nimport TagNames, {IFD_TYPE_0TH, IFD_TYPE_1ST} from './tag-names.js';\n\nconst getTagValueAt = {\n 1: Types.getByteAt,\n 2: Types.getAsciiAt,\n 3: Types.getShortAt,\n 4: Types.getLongAt,\n 5: Types.getRationalAt,\n 7: Types.getUndefinedAt,\n 9: Types.getSlongAt,\n 10: Types.getSrationalAt,\n 13: Types.getIfdPointerAt\n};\n\nexport function get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder) {\n return tiffHeaderOffset + Types.getLongAt(dataView, tiffHeaderOffset + 4, byteOrder);\n}\n\nexport function readIfd(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const FIELD_COUNT_SIZE = Types.getTypeSize('SHORT');\n const FIELD_SIZE = 12;\n\n const tags = {};\n const numberOfFields = getNumberOfFields(dataView, offset, byteOrder);\n\n offset += FIELD_COUNT_SIZE;\n for (let fieldIndex = 0; fieldIndex < numberOfFields; fieldIndex++) {\n if (offset + FIELD_SIZE > dataView.byteLength) {\n break;\n }\n\n const tag = readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown);\n if (tag !== undefined) {\n tags[tag.name] = {\n 'id': tag.id,\n 'value': tag.value,\n 'description': tag.description\n };\n if (tag.name === 'MakerNote') {\n tags[tag.name].__offset = tag.__offset;\n }\n }\n\n offset += FIELD_SIZE;\n }\n\n if (Constants.USE_THUMBNAIL && (offset < dataView.byteLength - Types.getTypeSize('LONG'))) {\n const nextIfdOffset = Types.getLongAt(dataView, offset, byteOrder);\n if (nextIfdOffset !== 0 && ifdType === IFD_TYPE_0TH) {\n tags['Thumbnail'] = readIfd(dataView, IFD_TYPE_1ST, tiffHeaderOffset, tiffHeaderOffset + nextIfdOffset, byteOrder, includeUnknown);\n }\n }\n\n return tags;\n}\n\nfunction getNumberOfFields(dataView, offset, byteOrder) {\n if (offset + Types.getTypeSize('SHORT') <= dataView.byteLength) {\n return Types.getShortAt(dataView, offset, byteOrder);\n }\n return 0;\n}\n\nfunction readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const TAG_CODE_IPTC_NAA = 0x83bb;\n const TAG_TYPE_OFFSET = Types.getTypeSize('SHORT');\n const TAG_COUNT_OFFSET = TAG_TYPE_OFFSET + Types.getTypeSize('SHORT');\n const TAG_VALUE_OFFSET = TAG_COUNT_OFFSET + Types.getTypeSize('LONG');\n\n const tagCode = Types.getShortAt(dataView, offset, byteOrder);\n const tagType = Types.getShortAt(dataView, offset + TAG_TYPE_OFFSET, byteOrder);\n const tagCount = Types.getLongAt(dataView, offset + TAG_COUNT_OFFSET, byteOrder);\n let tagValue;\n let tagValueOffset;\n\n if (Types.typeSizes[tagType] === undefined || (!includeUnknown && TagNames[ifdType][tagCode] === undefined)) {\n return undefined;\n }\n\n if (tagValueFitsInOffsetSlot(tagType, tagCount)) {\n tagValueOffset = offset + TAG_VALUE_OFFSET;\n tagValue = getTagValue(dataView, tagValueOffset, tagType, tagCount, byteOrder);\n } else {\n tagValueOffset = Types.getLongAt(dataView, offset + TAG_VALUE_OFFSET, byteOrder);\n if (tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount)) {\n const forceByteType = tagCode === TAG_CODE_IPTC_NAA;\n tagValue = getTagValue(dataView, tiffHeaderOffset + tagValueOffset, tagType, tagCount, byteOrder, forceByteType);\n } else {\n tagValue = '';\n }\n }\n\n if (tagType === Types.tagTypes['ASCII']) {\n tagValue = splitNullSeparatedAsciiString(tagValue);\n tagValue = decodeAsciiValue(tagValue);\n }\n\n let tagName = `undefined-${tagCode}`;\n let tagDescription = tagValue;\n\n if (TagNames[ifdType][tagCode] !== undefined) {\n if ((TagNames[ifdType][tagCode]['name'] !== undefined) && (TagNames[ifdType][tagCode]['description'] !== undefined)) {\n tagName = TagNames[ifdType][tagCode]['name'];\n try {\n tagDescription = TagNames[ifdType][tagCode]['description'](tagValue);\n } catch (error) {\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n } else if ((tagType === Types.tagTypes['RATIONAL']) || (tagType === Types.tagTypes['SRATIONAL'])) {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = '' + (tagValue[0] / tagValue[1]);\n } else {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n }\n\n return {\n id: tagCode,\n name: tagName,\n value: tagValue,\n description: tagDescription,\n __offset: tagValueOffset\n };\n}\n\nfunction tagValueFitsInOffsetSlot(tagType, tagCount) {\n return Types.typeSizes[tagType] * tagCount <= Types.getTypeSize('LONG');\n}\n\nfunction getTagValue(dataView, offset, type, count, byteOrder, forceByteType = false) {\n let value = [];\n\n if (forceByteType) {\n count = count * Types.typeSizes[type];\n type = Types.tagTypes['BYTE'];\n }\n for (let valueIndex = 0; valueIndex < count; valueIndex++) {\n value.push(getTagValueAt[type](dataView, offset, byteOrder));\n offset += Types.typeSizes[type];\n }\n\n if (type === Types.tagTypes['ASCII']) {\n value = Types.getAsciiValue(value);\n } else if (value.length === 1) {\n value = value[0];\n }\n\n return value;\n}\n\nfunction tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount) {\n return tiffHeaderOffset + tagValueOffset + Types.typeSizes[tagType] * tagCount <= dataView.byteLength;\n}\n\nfunction splitNullSeparatedAsciiString(string) {\n const tagValue = [];\n let i = 0;\n\n for (let j = 0; j < string.length; j++) {\n if (string[j] === '\\x00') {\n i++;\n continue;\n }\n if (tagValue[i] === undefined) {\n tagValue[i] = '';\n }\n tagValue[i] += string[j];\n }\n\n return tagValue;\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return asciiValue.map((value) => decodeURIComponent(escape(value)));\n } catch (error) {\n return asciiValue;\n }\n}\n\nfunction getDescriptionFromTagValue(tagValue) {\n if (tagValue instanceof Array) {\n return tagValue.join(', ');\n }\n return tagValue;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport ByteOrder from './byte-order.js';\nimport {IFD_TYPE_0TH, IFD_TYPE_EXIF, IFD_TYPE_GPS, IFD_TYPE_INTEROPERABILITY} from './tag-names.js';\nimport {readIfd, get0thIfdOffset} from './tags-helpers.js';\n\nconst EXIF_IFD_POINTER_KEY = 'Exif IFD Pointer';\nconst GPS_INFO_IFD_POINTER_KEY = 'GPS Info IFD Pointer';\nconst INTEROPERABILITY_IFD_POINTER_KEY = 'Interoperability IFD Pointer';\n\nexport default {\n read,\n};\n\nfunction read(dataView, tiffHeaderOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, tiffHeaderOffset);\n let tags = read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n\n return {tags, byteOrder};\n}\n\nfunction read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n return readIfd(dataView, IFD_TYPE_0TH, tiffHeaderOffset, get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder), byteOrder, includeUnknown);\n}\n\nfunction readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[EXIF_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_EXIF, tiffHeaderOffset, tiffHeaderOffset + tags[EXIF_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[GPS_INFO_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_GPS, tiffHeaderOffset, tiffHeaderOffset + tags[GPS_INFO_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[INTEROPERABILITY_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_INTEROPERABILITY, tiffHeaderOffset, tiffHeaderOffset + tags[INTEROPERABILITY_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\nimport Types from './types.js';\nimport {IFD_TYPE_MPF} from './tag-names.js';\nimport {deferInit, getBase64Image} from './utils.js';\nimport {readIfd, get0thIfdOffset} from './tags-helpers.js';\n\nexport default {\n read\n};\n\nconst ENTRY_SIZE = 16;\n\nfunction read(dataView, dataOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, dataOffset);\n const tags = readIfd(dataView, IFD_TYPE_MPF, dataOffset, get0thIfdOffset(dataView, dataOffset, byteOrder), byteOrder, includeUnknown);\n return addMpfImages(dataView, dataOffset, tags, byteOrder);\n}\n\nfunction addMpfImages(dataView, dataOffset, tags, byteOrder) {\n if (!tags['MPEntry']) {\n return tags;\n }\n\n const images = [];\n for (let i = 0; i < Math.ceil(tags['MPEntry'].value.length / ENTRY_SIZE); i++) {\n images[i] = {};\n\n const attributes = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageFlags'] = getImageFlags(attributes);\n images[i]['ImageFormat'] = getImageFormat(attributes);\n images[i]['ImageType'] = getImageType(attributes);\n\n const imageSize = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 4, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageSize'] = {\n value: imageSize,\n description: '' + imageSize\n };\n\n const imageOffset = getImageOffset(i, tags['MPEntry'], byteOrder, dataOffset);\n images[i]['ImageOffset'] = {\n value: imageOffset,\n description: '' + imageOffset\n };\n\n const dependentImage1EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 12, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage1EntryNumber'] = {\n value: dependentImage1EntryNumber,\n description: '' + dependentImage1EntryNumber\n };\n\n const dependentImage2EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 14, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage2EntryNumber'] = {\n value: dependentImage2EntryNumber,\n description: '' + dependentImage2EntryNumber\n };\n\n images[i].image = dataView.buffer.slice(imageOffset, imageOffset + imageSize);\n deferInit(images[i], 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n tags['Images'] = images;\n\n return tags;\n}\n\nfunction getImageNumberValue(entries, offset, size, byteOrder) {\n if (byteOrder === ByteOrder.LITTLE_ENDIAN) {\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * i);\n }\n return value;\n }\n\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * (size - 1 - i));\n }\n return value;\n}\n\nfunction getImageFlags(attributes) {\n const flags = [\n (attributes >> 31) & 0x1,\n (attributes >> 30) & 0x1,\n (attributes >> 29) & 0x1\n ];\n\n const flagsDescription = [];\n\n if (flags[0]) {\n flagsDescription.push('Dependent Parent Image');\n }\n if (flags[1]) {\n flagsDescription.push('Dependent Child Image');\n }\n if (flags[2]) {\n flagsDescription.push('Representative Image');\n }\n\n return {\n value: flags,\n description: flagsDescription.join(', ') || 'None'\n };\n}\n\nfunction getImageFormat(attributes) {\n const imageFormat = attributes >> 24 & 0x7;\n return {\n value: imageFormat,\n description: imageFormat === 0 ? 'JPEG' : 'Unknown'\n };\n}\n\nfunction getImageType(attributes) {\n const type = attributes & 0xffffff;\n const descriptions = {\n 0x30000: 'Baseline MP Primary Image',\n 0x10001: 'Large Thumbnail (VGA equivalent)',\n 0x10002: 'Large Thumbnail (Full HD equivalent)',\n 0x20001: 'Multi-Frame Image (Panorama)',\n 0x20002: 'Multi-Frame Image (Disparity)',\n 0x20003: 'Multi-Frame Image (Multi-Angle)',\n 0x0: 'Undefined',\n };\n\n return {\n value: type,\n description: descriptions[type] || 'Unknown'\n };\n}\n\nfunction getImageOffset(imageIndex, mpEntry, byteOrder, dataOffset) {\n if (isFirstIndividualImage(imageIndex)) {\n return 0;\n }\n return getImageNumberValue(mpEntry.value, imageIndex * ENTRY_SIZE + 8, Types.getTypeSize('LONG'), byteOrder) + dataOffset;\n}\n\nfunction isFirstIndividualImage(imageIndex) {\n return imageIndex === 0;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n const length = getLength(dataView, fileDataOffset);\n const numberOfColorComponents = getNumberOfColorComponents(dataView, fileDataOffset, length);\n return {\n 'Bits Per Sample': getDataPrecision(dataView, fileDataOffset, length),\n 'Image Height': getImageHeight(dataView, fileDataOffset, length),\n 'Image Width': getImageWidth(dataView, fileDataOffset, length),\n 'Color Components': numberOfColorComponents,\n 'Subsampling': numberOfColorComponents && getSubsampling(dataView, fileDataOffset, numberOfColorComponents.value, length)\n };\n}\n\nfunction getLength(dataView, fileDataOffset) {\n return Types.getShortAt(dataView, fileDataOffset);\n}\n\nfunction getDataPrecision(dataView, fileDataOffset, length) {\n const OFFSET = 2;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset, length) {\n const OFFSET = 3;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset, length) {\n const OFFSET = 5;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getNumberOfColorComponents(dataView, fileDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getSubsampling(dataView, fileDataOffset, numberOfColorComponents, length) {\n const OFFSET = 8;\n const SIZE = 3 * numberOfColorComponents;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const components = [];\n\n for (let i = 0; i < numberOfColorComponents; i++) {\n const componentOffset = fileDataOffset + OFFSET + i * 3;\n components.push([\n Types.getByteAt(dataView, componentOffset),\n Types.getByteAt(dataView, componentOffset + 1),\n Types.getByteAt(dataView, componentOffset + 2)\n ]);\n }\n\n return {\n value: components,\n description: components.length > 1 ? getComponentIds(components) + getSamplingType(components) : ''\n };\n}\n\nfunction getComponentIds(components) {\n const ids = {\n 0x01: 'Y',\n 0x02: 'Cb',\n 0x03: 'Cr',\n 0x04: 'I',\n 0x05: 'Q',\n };\n\n return components.map((compontent) => ids[compontent[0]]).join('');\n}\n\nfunction getSamplingType(components) {\n const types = {\n 0x11: '4:4:4 (1 1)',\n 0x12: '4:4:0 (1 2)',\n 0x14: '4:4:1 (1 4)',\n 0x21: '4:2:2 (2 1)',\n 0x22: '4:2:0 (2 2)',\n 0x24: '4:2:1 (2 4)',\n 0x41: '4:1:1 (4 1)',\n 0x42: '4:1:0 (4 2)'\n };\n\n if (components.length === 0 || components[0][1] === undefined || types[components[0][1]] === undefined) {\n return '';\n }\n\n return types[components[0][1]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, jfifDataOffset) {\n const length = getLength(dataView, jfifDataOffset);\n const thumbnailWidth = getThumbnailWidth(dataView, jfifDataOffset, length);\n const thumbnailHeight = getThumbnailHeight(dataView, jfifDataOffset, length);\n const tags = {\n 'JFIF Version': getVersion(dataView, jfifDataOffset, length),\n 'Resolution Unit': getResolutionUnit(dataView, jfifDataOffset, length),\n 'XResolution': getXResolution(dataView, jfifDataOffset, length),\n 'YResolution': getYResolution(dataView, jfifDataOffset, length),\n 'JFIF Thumbnail Width': thumbnailWidth,\n 'JFIF Thumbnail Height': thumbnailHeight\n };\n\n if (thumbnailWidth !== undefined && thumbnailHeight !== undefined) {\n const thumbnail = getThumbnail(dataView, jfifDataOffset, 3 * thumbnailWidth.value * thumbnailHeight.value, length);\n if (thumbnail) {\n tags['JFIF Thumbnail'] = thumbnail;\n }\n }\n\n for (const tagName in tags) {\n if (tags[tagName] === undefined) {\n delete tags[tagName];\n }\n }\n\n return tags;\n}\n\nfunction getLength(dataView, jfifDataOffset) {\n return Types.getShortAt(dataView, jfifDataOffset);\n}\n\nfunction getVersion(dataView, jfifDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const majorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n const minorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET + 1);\n return {\n value: majorVersion * 0x100 + minorVersion,\n description: majorVersion + '.' + minorVersion\n };\n}\n\nfunction getResolutionUnit(dataView, jfifDataOffset, length) {\n const OFFSET = 9;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: getResolutionUnitDescription(value)\n };\n}\n\nfunction getResolutionUnitDescription(value) {\n if (value === 0) {\n return 'None';\n }\n if (value === 1) {\n return 'inches';\n }\n if (value === 2) {\n return 'cm';\n }\n return 'Unknown';\n}\n\nfunction getXResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 10;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getYResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 12;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getThumbnailWidth(dataView, jfifDataOffset, length) {\n const OFFSET = 14;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnailHeight(dataView, jfifDataOffset, length) {\n const OFFSET = 15;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnail(dataView, jfifDataOffset, thumbnailLength, length) {\n const OFFSET = 16;\n\n if (thumbnailLength === 0 || OFFSET + thumbnailLength > length) {\n return undefined;\n }\n\n const value = dataView.buffer.slice(jfifDataOffset + OFFSET, jfifDataOffset + OFFSET + thumbnailLength);\n return {\n value,\n description: '<24-bit RGB pixel data>'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 'iptc': {\n 0x0100: {\n 'name': 'Model Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0105: {\n 'name': 'Destination',\n 'repeatable': true\n },\n 0x0114: {\n 'name': 'File Format',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0116: {\n 'name': 'File Format Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x011e: 'Service Identifier',\n 0x0128: 'Envelope Number',\n 0x0132: 'Product ID',\n 0x013c: 'Envelope Priority',\n 0x0146: {\n 'name': 'Date Sent',\n 'description': getCreationDate\n },\n 0x0150: {\n 'name': 'Time Sent',\n 'description': getCreationTime\n },\n 0x015a: {\n 'name': 'Coded Character Set',\n 'description': getEncodingName,\n 'encoding_name': getEncodingName,\n },\n 0x0164: 'UNO',\n 0x0178: {\n 'name': 'ARM Identifier',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x017a: {\n 'name': 'ARM Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0200: {\n 'name': 'Record Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0203: 'Object Type Reference',\n 0x0204: 'Object Attribute Reference',\n 0x0205: 'Object Name',\n 0x0207: 'Edit Status',\n 0x0208: {\n 'name': 'Editorial Update',\n 'description': (value) => {\n if (getStringValue(value) === '01') {\n return 'Additional Language';\n }\n return 'Unknown';\n }\n },\n 0x020a: 'Urgency',\n 0x020c: {\n 'name': 'Subject Reference',\n 'repeatable': true,\n 'description': (value) => {\n const parts = getStringValue(value).split(':');\n return parts[2] + (parts[3] ? '/' + parts[3] : '') + (parts[4] ? '/' + parts[4] : '');\n }\n },\n 0x020f: 'Category',\n 0x0214: {\n 'name': 'Supplemental Category',\n 'repeatable': true\n },\n 0x0216: 'Fixture Identifier',\n 0x0219: {\n 'name': 'Keywords',\n 'repeatable': true\n },\n 0x021a: {\n 'name': 'Content Location Code',\n 'repeatable': true\n },\n 0x021b: {\n 'name': 'Content Location Name',\n 'repeatable': true\n },\n 0x021e: 'Release Date',\n 0x0223: 'Release Time',\n 0x0225: 'Expiration Date',\n 0x0226: 'Expiration Time',\n 0x0228: 'Special Instructions',\n 0x022a: {\n 'name': 'Action Advised',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === '01') {\n return 'Object Kill';\n } else if (string === '02') {\n return 'Object Replace';\n } else if (string === '03') {\n return 'Object Append';\n } else if (string === '04') {\n return 'Object Reference';\n }\n return 'Unknown';\n }\n },\n 0x022d: {\n 'name': 'Reference Service',\n 'repeatable': true\n },\n 0x022f: {\n 'name': 'Reference Date',\n 'repeatable': true\n },\n 0x0232: {\n 'name': 'Reference Number',\n 'repeatable': true\n },\n 0x0237: {\n 'name': 'Date Created',\n 'description': getCreationDate\n },\n 0x023c: {\n 'name': 'Time Created',\n 'description': getCreationTime\n },\n 0x023e: {\n 'name': 'Digital Creation Date',\n 'description': getCreationDate\n },\n 0x023f: {\n 'name': 'Digital Creation Time',\n 'description': getCreationTime\n },\n 0x0241: 'Originating Program',\n 0x0246: 'Program Version',\n 0x024b: {\n 'name': 'Object Cycle',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'a') {\n return 'morning';\n } else if (string === 'p') {\n return 'evening';\n } else if (string === 'b') {\n return 'both';\n }\n return 'Unknown';\n }\n },\n 0x0250: {\n 'name': 'By-line',\n 'repeatable': true\n },\n 0x0255: {\n 'name': 'By-line Title',\n 'repeatable': true\n },\n 0x025a: 'City',\n 0x025c: 'Sub-location',\n 0x025f: 'Province/State',\n 0x0264: 'Country/Primary Location Code',\n 0x0265: 'Country/Primary Location Name',\n 0x0267: 'Original Transmission Reference',\n 0x0269: 'Headline',\n 0x026e: 'Credit',\n 0x0273: 'Source',\n 0x0274: 'Copyright Notice',\n 0x0276: {\n 'name': 'Contact',\n 'repeatable': true\n },\n 0x0278: 'Caption/Abstract',\n 0x027a: {\n 'name': 'Writer/Editor',\n 'repeatable': true\n },\n 0x027d: {\n 'name': 'Rasterized Caption',\n 'description': (value) => value\n },\n 0x0282: 'Image Type',\n 0x0283: {\n 'name': 'Image Orientation',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'P') {\n return 'Portrait';\n } else if (string === 'L') {\n return 'Landscape';\n } else if (string === 'S') {\n return 'Square';\n }\n return 'Unknown';\n }\n },\n 0x0287: 'Language Identifier',\n 0x0296: {\n 'name': 'Audio Type',\n 'description': (value) => {\n const stringValue = getStringValue(value);\n const character0 = stringValue.charAt(0);\n const character1 = stringValue.charAt(1);\n let description = '';\n\n if (character0 === '1') {\n description += 'Mono';\n } else if (character0 === '2') {\n description += 'Stereo';\n }\n\n if (character1 === 'A') {\n description += ', actuality';\n } else if (character1 === 'C') {\n description += ', question and answer session';\n } else if (character1 === 'M') {\n description += ', music, transmitted by itself';\n } else if (character1 === 'Q') {\n description += ', response to a question';\n } else if (character1 === 'R') {\n description += ', raw sound';\n } else if (character1 === 'S') {\n description += ', scener';\n } else if (character1 === 'V') {\n description += ', voicer';\n } else if (character1 === 'W') {\n description += ', wrap';\n }\n\n if (description !== '') {\n return description;\n }\n return stringValue;\n }\n },\n 0x0297: {\n 'name': 'Audio Sampling Rate',\n 'description': (value) => parseInt(getStringValue(value), 10) + ' Hz'\n },\n 0x0298: {\n 'name': 'Audio Sampling Resolution',\n 'description': (value) => {\n const bits = parseInt(getStringValue(value), 10);\n return bits + (bits === 1 ? ' bit' : ' bits');\n }\n },\n 0x0299: {\n 'name': 'Audio Duration',\n 'description': (value) => {\n const duration = getStringValue(value);\n if (duration.length >= 6) {\n return duration.substr(0, 2) + ':' + duration.substr(2, 2) + ':' + duration.substr(4, 2);\n }\n return duration;\n }\n },\n 0x029a: 'Audio Outcue',\n 0x02ba: 'Short Document ID',\n 0x02bb: 'Unique Document ID',\n 0x02bc: 'Owner ID',\n 0x02c8: {\n 'name': (value) => {\n if (value.length === 2) {\n return 'ObjectData Preview File Format';\n }\n return 'Record 2 destination';\n },\n 'description': (value) => {\n if (value.length === 2) {\n const intValue = (value[0] << 8) + value[1];\n if (intValue === 0) {\n return 'No ObjectData';\n } else if (intValue === 1) {\n return 'IPTC-NAA Digital Newsphoto Parameter Record';\n } else if (intValue === 2) {\n return 'IPTC7901 Recommended Message Format';\n } else if (intValue === 3) {\n return 'Tagged Image File Format (Adobe/Aldus Image data)';\n } else if (intValue === 4) {\n return 'Illustrator (Adobe Graphics data)';\n } else if (intValue === 5) {\n return 'AppleSingle (Apple Computer Inc)';\n } else if (intValue === 6) {\n return 'NAA 89-3 (ANPA 1312)';\n } else if (intValue === 7) {\n return 'MacBinary II';\n } else if (intValue === 8) {\n return 'IPTC Unstructured Character Oriented File Format (UCOFF)';\n } else if (intValue === 9) {\n return 'United Press International ANPA 1312 variant';\n } else if (intValue === 10) {\n return 'United Press International Down-Load Message';\n } else if (intValue === 11) {\n return 'JPEG File Interchange (JFIF)';\n } else if (intValue === 12) {\n return 'Photo-CD Image-Pac (Eastman Kodak)';\n } else if (intValue === 13) {\n return 'Microsoft Bit Mapped Graphics File [*.BMP]';\n } else if (intValue === 14) {\n return 'Digital Audio File [*.WAV] (Microsoft & Creative Labs)';\n } else if (intValue === 15) {\n return 'Audio plus Moving Video [*.AVI] (Microsoft)';\n } else if (intValue === 16) {\n return 'PC DOS/Windows Executable Files [*.COM][*.EXE]';\n } else if (intValue === 17) {\n return 'Compressed Binary File [*.ZIP] (PKWare Inc)';\n } else if (intValue === 18) {\n return 'Audio Interchange File Format AIFF (Apple Computer Inc)';\n } else if (intValue === 19) {\n return 'RIFF Wave (Microsoft Corporation)';\n } else if (intValue === 20) {\n return 'Freehand (Macromedia/Aldus)';\n } else if (intValue === 21) {\n return 'Hypertext Markup Language \"HTML\" (The Internet Society)';\n } else if (intValue === 22) {\n return 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC';\n } else if (intValue === 23) {\n return 'MPEG 2 Audio Layer 3, ISO/IEC';\n } else if (intValue === 24) {\n return 'Portable Document File (*.PDF) Adobe';\n } else if (intValue === 25) {\n return 'News Industry Text Format (NITF)';\n } else if (intValue === 26) {\n return 'Tape Archive (*.TAR)';\n } else if (intValue === 27) {\n return 'Tidningarnas Telegrambyrå NITF version (TTNITF DTD)';\n } else if (intValue === 28) {\n return 'Ritzaus Bureau NITF version (RBNITF DTD)';\n } else if (intValue === 29) {\n return 'Corel Draw [*.CDR]';\n }\n return `Unknown format ${intValue}`;\n }\n return getStringValue(value);\n }\n },\n 0x02c9: {\n 'name': 'ObjectData Preview File Format Version',\n 'description': (value, tags) => {\n // Format ID, Version ID, Version Description\n const formatVersions = {\n '00': {'00': '1'},\n '01': {'01': '1', '02': '2', '03': '3', '04': '4'},\n '02': {'04': '4'},\n '03': {'01': '5.0', '02': '6.0'},\n '04': {'01': '1.40'},\n '05': {'01': '2'},\n '06': {'01': '1'},\n '11': {'01': '1.02'},\n '20': {'01': '3.1', '02': '4.0', '03': '5.0', '04': '5.5'},\n '21': {'02': '2.0'}\n };\n const stringValue = getStringValue(value);\n\n if (tags['ObjectData Preview File Format']) {\n const objectDataPreviewFileFormat = getStringValue(tags['ObjectData Preview File Format'].value);\n if (formatVersions[objectDataPreviewFileFormat]\n && formatVersions[objectDataPreviewFileFormat][stringValue]) {\n return formatVersions[objectDataPreviewFileFormat][stringValue];\n }\n }\n\n return stringValue;\n }\n },\n 0x02ca: 'ObjectData Preview Data',\n 0x070a: {\n 'name': 'Size Mode',\n 'description': (value) => {\n return (value[0]).toString();\n }\n },\n 0x0714: {\n 'name': 'Max Subfile Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075a: {\n 'name': 'ObjectData Size Announced',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075f: {\n 'name': 'Maximum ObjectData Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n }\n }\n};\n\nfunction getCreationDate(value) {\n const date = getStringValue(value);\n\n if (date.length >= 8) {\n return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);\n }\n\n return date;\n}\n\nfunction getCreationTime(value) {\n const time = getStringValue(value);\n let parsedTime = time;\n\n if (time.length >= 6) {\n parsedTime = time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);\n if (time.length === 11) {\n parsedTime += time.substr(6, 1) + time.substr(7, 2) + ':' + time.substr(9, 2);\n }\n }\n\n return parsedTime;\n}\n\nfunction getEncodingName(value) {\n const string = getStringValue(value);\n if (string === '\\x1b%G') {\n return 'UTF-8';\n } else if (string === '\\x1b%5') {\n return 'Windows-1252';\n } else if (string === '\\x1b%/G') {\n return 'UTF-8 Level 1';\n } else if (string === '\\x1b%/H') {\n return 'UTF-8 Level 2';\n } else if (string === '\\x1b%/I') {\n return 'UTF-8 Level 3';\n } else if (string === '\\x1B/A') {\n return 'ISO-8859-1';\n } else if (string === '\\x1B/B') {\n return 'ISO-8859-2';\n } else if (string === '\\x1B/C') {\n return 'ISO-8859-3';\n } else if (string === '\\x1B/D') {\n return 'ISO-8859-4';\n } else if (string === '\\x1B/@') {\n return 'ISO-8859-5';\n } else if (string === '\\x1B/G') {\n return 'ISO-8859-6';\n } else if (string === '\\x1B/F') {\n return 'ISO-8859-7';\n } else if (string === '\\x1B/H') {\n return 'ISO-8859-8';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof TextDecoder !== 'undefined') {\n return TextDecoder;\n }\n\n return undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TextDecoder from './text-decoder.js';\n\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n decode,\n TAG_HEADER_SIZE\n};\n\nfunction decode(encoding, tagValue) {\n const Decoder = TextDecoder.get();\n if ((typeof Decoder !== 'undefined') && (encoding !== undefined)) {\n try {\n return new Decoder(encoding).decode(tagValue instanceof DataView ? tagValue.buffer : Uint8Array.from(tagValue));\n } catch (error) {\n // Pass through and fall back to ASCII decoding.\n }\n }\n\n const stringValue = tagValue.map((charCode) => String.fromCharCode(charCode)).join('');\n return decodeAsciiValue(stringValue);\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return decodeURIComponent(escape(asciiValue));\n } catch (error) {\n return asciiValue;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport IptcTagNames from './iptc-tag-names.js';\nimport TagDecoder from './tag-decoder.js';\n\nconst BYTES_8BIM = 0x3842494d;\nconst BYTES_8BIM_SIZE = 4;\nconst RESOURCE_BLOCK_HEADER_SIZE = BYTES_8BIM_SIZE + 8;\nconst NAA_RESOURCE_BLOCK_TYPE = 0x0404;\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n read\n};\n\nfunction read(dataView, dataOffset, includeUnknown) {\n try {\n if (Array.isArray(dataView)) {\n return parseTags(new DataView(Uint8Array.from(dataView).buffer), {size: dataView.length}, 0, includeUnknown);\n }\n const {naaBlock, dataOffset: newDataOffset} = getNaaResourceBlock(dataView, dataOffset);\n return parseTags(dataView, naaBlock, newDataOffset, includeUnknown);\n } catch (error) {\n return {};\n }\n}\n\nfunction getNaaResourceBlock(dataView, dataOffset) {\n while (dataOffset + RESOURCE_BLOCK_HEADER_SIZE <= dataView.byteLength) {\n const resourceBlock = getResourceBlock(dataView, dataOffset);\n if (isNaaResourceBlock(resourceBlock)) {\n return {naaBlock: resourceBlock, dataOffset: dataOffset + RESOURCE_BLOCK_HEADER_SIZE};\n }\n dataOffset += RESOURCE_BLOCK_HEADER_SIZE + resourceBlock.size + getBlockPadding(resourceBlock);\n }\n throw new Error('No IPTC NAA resource block.');\n}\n\nfunction getResourceBlock(dataView, dataOffset) {\n const RESOURCE_BLOCK_SIZE_OFFSET = 10;\n\n if (dataView.getUint32(dataOffset, false) !== BYTES_8BIM) {\n throw new Error('Not an IPTC resource block.');\n }\n\n return {\n type: dataView.getUint16(dataOffset + BYTES_8BIM_SIZE),\n size: dataView.getUint16(dataOffset + RESOURCE_BLOCK_SIZE_OFFSET)\n };\n}\n\nfunction isNaaResourceBlock(resourceBlock) {\n return resourceBlock.type === NAA_RESOURCE_BLOCK_TYPE;\n}\n\nfunction getBlockPadding(resourceBlock) {\n if (resourceBlock.size % 2 !== 0) {\n return 1;\n }\n return 0;\n}\n\nfunction parseTags(dataView, naaBlock, dataOffset, includeUnknown) {\n const tags = {};\n let encoding = undefined;\n\n const endOfBlockOffset = dataOffset + naaBlock['size'];\n\n while ((dataOffset < endOfBlockOffset) && (dataOffset < dataView.byteLength)) {\n const {tag, tagSize} = readTag(dataView, dataOffset, tags, encoding, includeUnknown);\n\n if (tag === null) {\n break;\n }\n\n if (tag) {\n if ('encoding' in tag) {\n encoding = tag.encoding;\n }\n\n if ((tags[tag.name] === undefined) || (tag['repeatable'] === undefined)) {\n tags[tag.name] = {\n id: tag.id,\n value: tag.value,\n description: tag.description\n };\n } else {\n if (!(tags[tag.name] instanceof Array)) {\n tags[tag.name] = [{\n id: tags[tag.name].id,\n value: tags[tag.name].value,\n description: tags[tag.name].description\n }];\n }\n tags[tag.name].push({\n id: tag.id,\n value: tag.value,\n description: tag.description\n });\n }\n }\n\n dataOffset += TAG_HEADER_SIZE + tagSize;\n }\n\n return tags;\n}\n\nfunction readTag(dataView, dataOffset, tags, encoding, includeUnknown) {\n const TAG_CODE_OFFSET = 1;\n const TAG_SIZE_OFFSET = 3;\n\n if (leadByteIsMissing(dataView, dataOffset)) {\n return {tag: null, tagSize: 0};\n }\n\n const tagCode = dataView.getUint16(dataOffset + TAG_CODE_OFFSET);\n const tagSize = dataView.getUint16(dataOffset + TAG_SIZE_OFFSET);\n\n if (!includeUnknown && !IptcTagNames['iptc'][tagCode]) {\n return {tag: undefined, tagSize};\n }\n\n const tagValue = getTagValue(dataView, dataOffset + TAG_HEADER_SIZE, tagSize);\n\n const tag = {\n id: tagCode,\n name: getTagName(IptcTagNames['iptc'][tagCode], tagCode, tagValue),\n value: tagValue,\n description: getTagDescription(IptcTagNames['iptc'][tagCode], tagValue, tags, encoding)\n };\n if (tagIsRepeatable(tagCode)) {\n tag['repeatable'] = true;\n }\n if (tagContainsEncoding(tagCode)) {\n tag['encoding'] = IptcTagNames['iptc'][tagCode]['encoding_name'](tagValue);\n }\n\n return {tag, tagSize};\n}\n\nfunction leadByteIsMissing(dataView, dataOffset) {\n const TAG_LEAD_BYTE = 0x1c;\n return dataView.getUint8(dataOffset) !== TAG_LEAD_BYTE;\n}\n\nfunction getTagValue(dataView, offset, size) {\n const value = [];\n\n for (let valueIndex = 0; valueIndex < size; valueIndex++) {\n value.push(dataView.getUint8(offset + valueIndex));\n }\n\n return value;\n}\n\nfunction getTagName(tag, tagCode, tagValue) {\n if (!tag) {\n return `undefined-${tagCode}`;\n }\n if (tagIsName(tag)) {\n return tag;\n }\n if (hasDynamicName(tag)) {\n return tag['name'](tagValue);\n }\n return tag['name'];\n}\n\nfunction tagIsName(tag) {\n return typeof tag === 'string';\n}\n\nfunction hasDynamicName(tag) {\n return typeof (tag['name']) === 'function';\n}\n\nfunction getTagDescription(tag, tagValue, tags, encoding) {\n if (hasDescriptionProperty(tag)) {\n try {\n return tag['description'](tagValue, tags);\n } catch (error) {\n // Fall through to next handler.\n }\n }\n if (tagValueIsText(tag, tagValue)) {\n return TagDecoder.decode(encoding, tagValue);\n }\n return tagValue;\n}\n\nfunction tagValueIsText(tag, tagValue) {\n return tag && tagValue instanceof Array;\n}\n\nfunction hasDescriptionProperty(tag) {\n return tag && tag['description'] !== undefined;\n}\n\nfunction tagIsRepeatable(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['repeatable'];\n}\n\nfunction tagContainsEncoding(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['encoding_name'] !== undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 'tiff:Orientation'(value) {\n if (value === '1') {\n return 'Horizontal (normal)';\n }\n if (value === '2') {\n return 'Mirror horizontal';\n }\n if (value === '3') {\n return 'Rotate 180';\n }\n if (value === '4') {\n return 'Mirror vertical';\n }\n if (value === '5') {\n return 'Mirror horizontal and rotate 270 CW';\n }\n if (value === '6') {\n return 'Rotate 90 CW';\n }\n if (value === '7') {\n return 'Mirror horizontal and rotate 90 CW';\n }\n if (value === '8') {\n return 'Rotate 270 CW';\n }\n return value;\n },\n 'tiff:ResolutionUnit': (value) => TagNamesCommon.ResolutionUnit(parseInt(value, 10)),\n 'tiff:XResolution': (value) => fraction(TagNamesCommon.XResolution, value),\n 'tiff:YResolution': (value) => fraction(TagNamesCommon.YResolution, value),\n 'exif:ApertureValue': (value) => fraction(TagNamesCommon.ApertureValue, value),\n 'exif:GPSLatitude': calculateGPSValue,\n 'exif:GPSLongitude': calculateGPSValue,\n 'exif:FNumber': (value) => fraction(TagNamesCommon.FNumber, value),\n 'exif:FocalLength': (value) => fraction(TagNamesCommon.FocalLength, value),\n 'exif:FocalPlaneResolutionUnit': (value) => TagNamesCommon.FocalPlaneResolutionUnit(parseInt(value, 10)),\n 'exif:ColorSpace': (value) => TagNamesCommon.ColorSpace(parseNumber(value)),\n 'exif:ComponentsConfiguration'(value, description) {\n if (/^\\d, \\d, \\d, \\d$/.test(description)) {\n const numbers = description.split(', ').map((number) => number.charCodeAt(0));\n return TagNamesCommon.ComponentsConfiguration(numbers);\n }\n return description;\n },\n 'exif:Contrast': (value) => TagNamesCommon.Contrast(parseInt(value, 10)),\n 'exif:CustomRendered': (value) => TagNamesCommon.CustomRendered(parseInt(value, 10)),\n 'exif:ExposureMode': (value) => TagNamesCommon.ExposureMode(parseInt(value, 10)),\n 'exif:ExposureProgram': (value) => TagNamesCommon.ExposureProgram(parseInt(value, 10)),\n 'exif:ExposureTime'(value) {\n if (isFraction(value)) {\n return TagNamesCommon.ExposureTime(value.split('/').map((number) => parseInt(number, 10)));\n }\n return value;\n },\n 'exif:MeteringMode': (value) => TagNamesCommon.MeteringMode(parseInt(value, 10)),\n 'exif:Saturation': (value) => TagNamesCommon.Saturation(parseInt(value, 10)),\n 'exif:SceneCaptureType': (value) => TagNamesCommon.SceneCaptureType(parseInt(value, 10)),\n 'exif:Sharpness': (value) => TagNamesCommon.Sharpness(parseInt(value, 10)),\n 'exif:ShutterSpeedValue': (value) => fraction(TagNamesCommon.ShutterSpeedValue, value),\n 'exif:WhiteBalance': (value) => TagNamesCommon.WhiteBalance(parseInt(value, 10))\n};\n\nfunction fraction(func, value) {\n if (isFraction(value)) {\n return func(value.split('/'));\n }\n return value;\n}\n\nfunction parseNumber(value) {\n if (value.substring(0, 2) === '0x') {\n return parseInt(value.substring(2), 16);\n }\n return parseInt(value, 10);\n}\n\nfunction isFraction(value) {\n return /^-?\\d+\\/-?\\d+$/.test(value);\n}\n\nfunction calculateGPSValue(value) {\n const [degreesString, minutesString] = value.split(',');\n if ((degreesString !== undefined) && (minutesString !== undefined)) {\n const degrees = parseFloat(degreesString);\n const minutes = parseFloat(minutesString);\n const ref = minutesString.charAt(minutesString.length - 1);\n if ((!Number.isNaN(degrees)) && (!Number.isNaN(minutes))) {\n return '' + (degrees + minutes / 60) + ref;\n }\n }\n return value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView, objectAssign} from './utils.js';\nimport XmpTagNames from './xmp-tag-names.js';\nimport DOMParser from './dom-parser.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunks) {\n const tags = {};\n\n if (typeof dataView === 'string') {\n readTags(tags, dataView);\n return tags;\n }\n\n const [standardXmp, extendedXmp] = extractCompleteChunks(dataView, chunks);\n\n const hasStandardTags = readTags(tags, standardXmp);\n\n if (extendedXmp) {\n const hasExtendedTags = readTags(tags, extendedXmp);\n\n if (!hasStandardTags && !hasExtendedTags) {\n // Some writers are not spec-compliant in that they split an XMP\n // metadata tree over both the standard XMP block and the extended\n // XMP block. If we failed parsing both of the XMPs in the regular\n // way, we try to combine them to see if that works better.\n delete tags._raw;\n readTags(tags, combineChunks(dataView, chunks));\n }\n }\n\n return tags;\n}\n\n// The first chunk is always the regular XMP document. Then there is something\n// called extended XMP. The extended XMP is also a single XMP document but it\n// can be divided into multiple chunks that need to be combined into one.\nfunction extractCompleteChunks(dataView, chunks) {\n if (chunks.length === 0) {\n return [];\n }\n\n const completeChunks = [combineChunks(dataView, chunks.slice(0, 1))];\n if (chunks.length > 1) {\n completeChunks.push(combineChunks(dataView, chunks.slice(1)));\n }\n\n return completeChunks;\n}\n\nfunction combineChunks(dataView, chunks) {\n const totalLength = chunks.reduce((size, chunk) => size + chunk.length, 0);\n const combinedChunks = new Uint8Array(totalLength);\n let offset = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const slice = dataView.buffer.slice(chunk.dataOffset, chunk.dataOffset + chunk.length);\n combinedChunks.set(new Uint8Array(slice), offset);\n offset += chunk.length;\n }\n\n return new DataView(combinedChunks.buffer);\n}\n\nfunction readTags(tags, chunkDataView) {\n try {\n const {doc, raw} = getDocument(chunkDataView);\n tags._raw = (tags._raw || '') + raw;\n const rdf = getRDF(doc);\n\n objectAssign(tags, parseXMPObject(convertToObject(rdf, true)));\n return true;\n } catch (error) {\n return false;\n }\n}\n\nfunction getDocument(chunkDataView) {\n const domParser = DOMParser.get();\n if (!domParser) {\n console.warn('Warning: DOMParser is not available. It is needed to be able to parse XMP tags.'); // eslint-disable-line no-console\n throw new Error();\n }\n\n const xmlString = typeof chunkDataView === 'string' ? chunkDataView : getStringFromDataView(chunkDataView, 0, chunkDataView.byteLength);\n const doc = domParser.parseFromString(trimXmlSource(xmlString), 'application/xml');\n\n if (doc.documentElement.nodeName === 'parsererror') {\n throw new Error(doc.documentElement.textContent);\n }\n\n return {\n doc,\n raw: xmlString,\n };\n}\n\nfunction trimXmlSource(xmlSource) {\n return xmlSource.replace(/^.+(<\\?xpacket begin)/, '$1').replace(/(<\\?xpacket end=\".*\"\\?>).+$/, '$1');\n}\n\nfunction getRDF(node) {\n for (let i = 0; i < node.childNodes.length; i++) {\n if (node.childNodes[i].tagName === 'x:xmpmeta') {\n return getRDF(node.childNodes[i]);\n }\n if (node.childNodes[i].tagName === 'rdf:RDF') {\n return node.childNodes[i];\n }\n }\n\n throw new Error();\n}\n\nfunction convertToObject(node, isTopNode = false) {\n const childNodes = getChildNodes(node);\n\n if (hasTextOnlyContent(childNodes)) {\n if (isTopNode) {\n return {};\n }\n return getTextValue(childNodes[0]);\n }\n\n return getElementsFromNodes(childNodes);\n}\n\nfunction getChildNodes(node) {\n const elements = [];\n\n for (let i = 0; i < node.childNodes.length; i++) {\n elements.push(node.childNodes[i]);\n }\n\n return elements;\n}\n\nfunction hasTextOnlyContent(nodes) {\n return (nodes.length === 1) && (nodes[0].nodeName === '#text');\n}\n\nfunction getTextValue(node) {\n return node.nodeValue;\n}\n\nfunction getElementsFromNodes(nodes) {\n const elements = {};\n\n nodes.forEach((node) => {\n if (isElement(node)) {\n const nodeElement = getElementFromNode(node);\n\n if (elements[node.nodeName] !== undefined) {\n if (!Array.isArray(elements[node.nodeName])) {\n elements[node.nodeName] = [elements[node.nodeName]];\n }\n elements[node.nodeName].push(nodeElement);\n } else {\n elements[node.nodeName] = nodeElement;\n }\n }\n });\n\n return elements;\n}\n\nfunction isElement(node) {\n return (node.nodeName) && (node.nodeName !== '#text');\n}\n\nfunction getElementFromNode(node) {\n return {\n attributes: getAttributes(node),\n value: convertToObject(node)\n };\n}\n\nfunction getAttributes(element) {\n const attributes = {};\n\n for (let i = 0; i < element.attributes.length; i++) {\n attributes[element.attributes[i].nodeName] = decodeURIComponent(escape(element.attributes[i].value));\n }\n\n return attributes;\n}\n\nfunction parseXMPObject(xmpObject) {\n const tags = {};\n\n if (typeof xmpObject === 'string') {\n return xmpObject;\n }\n\n for (const nodeName in xmpObject) {\n let nodes = xmpObject[nodeName];\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n nodes.forEach((node) => {\n objectAssign(tags, parseNodeAttributesAsTags(node.attributes));\n if (typeof node.value === 'object') {\n objectAssign(tags, parseNodeChildrenAsTags(node.value));\n }\n });\n }\n\n return tags;\n}\n\nfunction parseNodeAttributesAsTags(attributes) {\n const tags = {};\n\n for (const name in attributes) {\n try {\n if (isTagAttribute(name)) {\n tags[getLocalName(name)] = {\n value: attributes[name],\n attributes: {},\n description: getDescription(attributes[name], name)\n };\n }\n } catch (error) {\n // Keep going and try to parse the rest of the tags.\n }\n }\n\n return tags;\n}\n\nfunction isTagAttribute(name) {\n return (name !== 'rdf:parseType') && (!isNamespaceDefinition(name));\n}\n\nfunction isNamespaceDefinition(name) {\n return name.split(':')[0] === 'xmlns';\n}\n\nfunction getLocalName(name) {\n if (/^MicrosoftPhoto(_\\d+_)?:Rating$/i.test(name)) {\n return 'RatingPercent';\n }\n return name.split(':')[1];\n}\n\nfunction getDescription(value, name = undefined) {\n if (Array.isArray(value)) {\n const arrayDescription = getDescriptionOfArray(value);\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value, arrayDescription);\n }\n return arrayDescription;\n }\n if (typeof value === 'object') {\n return getDescriptionOfObject(value);\n }\n\n try {\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value);\n }\n return decodeURIComponent(escape(value));\n } catch (error) {\n return value;\n }\n}\n\nfunction getDescriptionOfArray(value) {\n return value.map((item) => {\n if (item.value !== undefined) {\n return getDescription(item.value);\n }\n return getDescription(item);\n }).join(', ');\n}\n\nfunction getDescriptionOfObject(value) {\n const descriptions = [];\n\n for (const key in value) {\n descriptions.push(`${getClearTextKey(key)}: ${getDescription(value[key].value)}`);\n }\n\n return descriptions.join('; ');\n}\n\nfunction getClearTextKey(key) {\n if (key === 'CiAdrCity') {\n return 'CreatorCity';\n }\n if (key === 'CiAdrCtry') {\n return 'CreatorCountry';\n }\n if (key === 'CiAdrExtadr') {\n return 'CreatorAddress';\n }\n if (key === 'CiAdrPcode') {\n return 'CreatorPostalCode';\n }\n if (key === 'CiAdrRegion') {\n return 'CreatorRegion';\n }\n if (key === 'CiEmailWork') {\n return 'CreatorWorkEmail';\n }\n if (key === 'CiTelWork') {\n return 'CreatorWorkPhone';\n }\n if (key === 'CiUrlWork') {\n return 'CreatorWorkUrl';\n }\n return key;\n}\n\nfunction parseNodeChildrenAsTags(children) {\n const tags = {};\n\n for (const name in children) {\n try {\n if (!isNamespaceDefinition(name)) {\n tags[getLocalName(name)] = parseNodeAsTag(children[name], name);\n }\n } catch (error) {\n // Keep going and try to parse the rest of the tags.\n }\n }\n\n return tags;\n}\n\nfunction parseNodeAsTag(node, name) {\n if (isDuplicateTag(node)) {\n return parseNodeAsDuplicateTag(node, name);\n }\n if (isEmptyResourceTag(node)) {\n return {value: '', attributes: {}, description: ''};\n }\n if (hasNestedSimpleRdfDescription(node)) {\n return parseNodeAsSimpleRdfDescription(node, name);\n }\n if (hasNestedStructureRdfDescription(node)) {\n return parseNodeAsStructureRdfDescription(node, name);\n }\n if (isCompactStructure(node)) {\n return parseNodeAsCompactStructure(node, name);\n }\n if (isArray(node)) {\n return parseNodeAsArray(node, name);\n }\n return parseNodeAsSimpleValue(node, name);\n}\n\nfunction isEmptyResourceTag(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n && (typeof node.value === 'string')\n && (node.value.trim() === '');\n}\n\nfunction isDuplicateTag(node) {\n return Array.isArray(node);\n}\n\nfunction parseNodeAsDuplicateTag(node, name) {\n return parseNodeAsSimpleValue(node[node.length - 1], name);\n}\n\nfunction hasNestedSimpleRdfDescription(node) {\n return ((node.attributes['rdf:parseType'] === 'Resource') && (node.value['rdf:value'] !== undefined))\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] !== undefined));\n}\n\nfunction parseNodeAsSimpleRdfDescription(node, name) {\n const attributes = parseNodeAttributes(node);\n\n if (node.value['rdf:Description'] !== undefined) {\n node = node.value['rdf:Description'];\n }\n\n objectAssign(attributes, parseNodeAttributes(node), parseNodeChildrenAsAttributes(node));\n\n const value = parseRdfValue(node);\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseNodeAttributes(node) {\n const attributes = {};\n\n for (const name in node.attributes) {\n if ((name !== 'rdf:parseType') && (name !== 'rdf:resource') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.attributes[name];\n }\n }\n\n return attributes;\n}\n\nfunction parseNodeChildrenAsAttributes(node) {\n const attributes = {};\n\n for (const name in node.value) {\n if ((name !== 'rdf:value') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.value[name].value;\n }\n }\n\n return attributes;\n}\n\nfunction parseRdfValue(node) {\n return getURIValue(node.value['rdf:value']) || node.value['rdf:value'].value;\n}\n\nfunction hasNestedStructureRdfDescription(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] === undefined));\n}\n\nfunction parseNodeAsStructureRdfDescription(node, name) {\n const tag = {\n value: {},\n attributes: {}\n };\n\n if (node.value['rdf:Description'] !== undefined) {\n objectAssign(tag.value, parseNodeAttributesAsTags(node.value['rdf:Description'].attributes));\n objectAssign(tag.attributes, parseNodeAttributes(node));\n node = node.value['rdf:Description'];\n }\n\n objectAssign(tag.value, parseNodeChildrenAsTags(node.value));\n\n tag.description = getDescription(tag.value, name);\n\n return tag;\n}\n\nfunction isCompactStructure(node) {\n return (Object.keys(node.value).length === 0)\n && (node.attributes['xml:lang'] === undefined)\n && (node.attributes['rdf:resource'] === undefined);\n}\n\nfunction parseNodeAsCompactStructure(node, name) {\n const value = parseNodeAttributesAsTags(node.attributes);\n\n return {\n value,\n attributes: {},\n description: getDescription(value, name)\n };\n}\n\nfunction isArray(node) {\n return getArrayChild(node.value) !== undefined;\n}\n\nfunction getArrayChild(value) {\n return value['rdf:Bag'] || value['rdf:Seq'] || value['rdf:Alt'];\n}\n\nfunction parseNodeAsArray(node, name) {\n let items = getArrayChild(node.value).value['rdf:li'];\n const attributes = parseNodeAttributes(node);\n const value = [];\n\n if (items === undefined) {\n items = [];\n } else if (!Array.isArray(items)) {\n items = [items];\n }\n\n items.forEach((item) => {\n value.push(parseArrayValue(item));\n });\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseArrayValue(item) {\n if (hasNestedSimpleRdfDescription(item)) {\n return parseNodeAsSimpleRdfDescription(item);\n }\n if (hasNestedStructureRdfDescription(item)) {\n return parseNodeAsStructureRdfDescription(item).value;\n }\n if (isCompactStructure(item)) {\n return parseNodeAsCompactStructure(item).value;\n }\n\n return parseNodeAsSimpleValue(item);\n}\n\nfunction parseNodeAsSimpleValue(node, name) {\n const value = getURIValue(node) || parseXMPObject(node.value);\n\n return {\n value,\n attributes: parseNodeAttributes(node),\n description: getDescription(value, name)\n };\n}\n\nfunction getURIValue(node) {\n return node.attributes && node.attributes['rdf:resource'];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof DOMParser !== 'undefined') {\n return new DOMParser();\n }\n try {\n // eslint-disable-next-line no-undef\n const {DOMParser, onErrorStopParsing} = __non_webpack_require__('@xmldom/xmldom');\n return new DOMParser({onError: onErrorStopParsing});\n } catch (error) {\n return undefined;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {\n getPascalStringFromDataView,\n padStart,\n parseFloatRadix,\n strRepeat\n} from './utils.js';\n\n// export const OsTypeKeys = {\n// OBJC: 'Objc',\n// DOUB: 'doub',\n// UNTF: 'UntF',\n// TEXT: 'TEXT',\n// BOOL: 'bool',\n// ENUM: 'enum',\n// LONG: 'long'\n// };\n\nexport const PathRecordTypes = {\n CLOSED_SUBPATH_LENGTH: 0,\n CLOSED_SUBPATH_BEZIER_LINKED: 1,\n CLOSED_SUBPATH_BEZIER_UNLINKED: 2,\n OPEN_SUBPATH_LENGTH: 3,\n OPEN_SUBPATH_BEZIER_LINKED: 4,\n OPEN_SUBPATH_BEZIER_UNLINKED: 5,\n FILL_RULE: 6,\n CLIPBOARD: 7,\n INITIAL_FILL_RULE: 8\n};\n\nconst PATH_RECORD_SIZE = 24;\n\nexport default {\n // 0x0425: {\n // name: 'CaptionDigest',\n // description(dataView) {\n // let description = '';\n // for (let i = 0; i < dataView.byteLength; i++) {\n // const byte = dataView.getUint8(i);\n // description += padStart(byte.toString(16), 2, '0');\n // }\n // return description;\n // }\n // },\n // Commented out for now to lower bundle size until someone asks for it.\n // 0x043a: {\n // name: 'PrintInformation',\n // description: parseDescriptor\n // },\n // 0x043b: {\n // name: 'PrintStyle',\n // description: parseDescriptor\n // },\n 0x07d0: {\n name: 'PathInformation',\n description: pathResource\n },\n 0x0bb7: {\n name: 'ClippingPathName',\n description(dataView) {\n const [, string] = getPascalStringFromDataView(dataView, 0);\n return string;\n }\n },\n};\n\n// function parseDescriptor(dataView) {\n// const DESCRIPTOR_VERSION_SIZE = 4;\n// // This is a unicode string terminated with null. Unsure about the format though since in my example image it starts with 0x0000.\n// const UNCLEAR_CLASS_ID_NAME_PART_SIZE = 6;\n// let offset = 0;\n// offset += DESCRIPTOR_VERSION_SIZE + UNCLEAR_CLASS_ID_NAME_PART_SIZE;\n// const [classId, classIdSize] = getBlockValue(dataView, offset);\n// offset += classIdSize;\n// const numItems = Types.getLongAt(dataView, offset);\n// offset += 4;\n// const descriptor = {[classId]: {}};\n// for (let i = 0; i < numItems; i++) {\n// const [itemKey, itemKeySize] = getBlockValue(dataView, offset);\n// offset += itemKeySize;\n// const osTypeKey = getStringFromDataView(dataView, offset, 4);\n// offset += 4;\n// try {\n// const {itemValue, itemSize} = getItemValue(dataView, offset, osTypeKey);\n// offset += itemSize;\n// descriptor[classId][ITEM_KEY_TERMS[itemKey] || itemKey] = itemValue;\n// } catch (error) {\n// // We can't recover from unknown OS type key since we don't know\n// // where the next one starts.\n// break;\n// }\n// }\n// return JSON.stringify(descriptor);\n// }\n\n// function getBlockValue(dataView, offset, unicode = false) {\n// const length = (unicode ? 2 : 1) * Types.getLongAt(dataView, offset) || 4;\n// offset += 4;\n// const value = (unicode ? getUnicodeStringFromDataView : getStringFromDataView)(dataView, offset, length);\n// offset += length;\n// return [value, 4 + length];\n// }\n\n// function getItemValue(dataView, offset, osTypeKey) {\n// // Not all OSType keys are implemented yet because they are missing in the example image.\n// if (osTypeKey === OsTypeKeys.OBJC) {\n// const [classIdName, classIdNameSize] = getBlockValue(dataView, offset, true);\n// offset += classIdNameSize;\n// const [classId, classIdSize] = getBlockValue(dataView, offset);\n// offset += classIdSize;\n// const _offset = Types.getLongAt(dataView, offset);\n// return {\n// itemValue: {[classIdName]: {[classId]: _offset}},\n// itemSize: classIdNameSize + classIdSize + 4\n// };\n// }\n// if (osTypeKey === OsTypeKeys.DOUB) {\n// return {\n// itemValue: parseDouble(dataView, offset),\n// itemSize: 8\n// };\n// }\n// if (osTypeKey === OsTypeKeys.UNTF) {\n// const unit = getStringFromDataView(dataView, offset, 4);\n// return {\n// itemValue: {unit, value: parseDouble(dataView, offset + 4)},\n// itemSize: unit.length + 8\n// };\n// }\n// if (osTypeKey === OsTypeKeys.TEXT) {\n// const length = 2 * Types.getLongAt(dataView, offset);\n// offset += 4;\n// const text = getUnicodeStringFromDataView(dataView, offset, length);\n// return {\n// itemValue: text,\n// itemSize: 4 + length\n// };\n// }\n// if (osTypeKey === OsTypeKeys.BOOL) {\n// return {\n// itemValue: Types.getByteAt(dataView, offset) === 1,\n// itemSize: 1\n// };\n// }\n// if (osTypeKey === OsTypeKeys.ENUM) {\n// const [type, typeSize] = getBlockValue(dataView, offset);\n// offset += typeSize;\n// const [enumName, enumSize] = getBlockValue(dataView, offset);\n// return {\n// itemValue: {[type]: enumName},\n// itemSize: typeSize + enumSize\n// };\n// }\n// if (osTypeKey === OsTypeKeys.LONG) {\n// return {\n// itemValue: Types.getLongAt(dataView, offset),\n// itemSize: 4\n// };\n// }\n// throw new Error(`Unknown OS type key: ${osTypeKey}`);\n// }\n\n// function parseDouble(dataView, offset) {\n// const BIAS = 1023;\n// const sign = (Types.getByteAt(dataView, offset) & parseInt('10000000', 2)) === 0 ? 1 : -1;\n// const exponent = ((Types.getShortAt(dataView, offset) & parseInt('0111111111110000', 2)) >> 4) - BIAS;\n// const fractionHigh = padStart((Types.getLongAt(dataView, offset) & parseInt('00000000000011111111111111111111', 2)).toString(2), 20, '0');\n// const fractionLow = padStart(Types.getLongAt(dataView, offset + 4).toString(2), 32, '0');\n// const fraction = parseFloatRadix('1.' + fractionHigh + fractionLow, 2);\n// return sign * fraction * Math.pow(2, exponent);\n// }\n\nfunction pathResource(dataView) {\n const TYPE_SIZE = 2;\n const types = {};\n const paths = [];\n\n for (let offset = 0; offset < dataView.byteLength; offset += TYPE_SIZE + PATH_RECORD_SIZE) {\n const type = Types.getShortAt(dataView, offset);\n if (PATH_RECORD_TYPES[type]) {\n if (!types[type]) {\n types[type] = PATH_RECORD_TYPES[type].description;\n }\n paths.push({\n type,\n path: PATH_RECORD_TYPES[type].path(dataView, offset + TYPE_SIZE)\n });\n }\n }\n return JSON.stringify({types, paths});\n}\n\nconst PATH_RECORD_TYPES = {\n [PathRecordTypes.CLOSED_SUBPATH_LENGTH]: {\n description: 'Closed subpath length',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.CLOSED_SUBPATH_BEZIER_LINKED]: {\n description: 'Closed subpath Bezier knot, linked',\n path: parseBezierKnot\n },\n [PathRecordTypes.CLOSED_SUBPATH_BEZIER_UNLINKED]: {\n description: 'Closed subpath Bezier knot, unlinked',\n path: parseBezierKnot\n },\n [PathRecordTypes.OPEN_SUBPATH_LENGTH]: {\n description: 'Open subpath length',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.OPEN_SUBPATH_BEZIER_LINKED]: {\n description: 'Open subpath Bezier knot, linked',\n path: parseBezierKnot\n },\n [PathRecordTypes.OPEN_SUBPATH_BEZIER_UNLINKED]: {\n description: 'Open subpath Bezier knot, unlinked',\n path: parseBezierKnot\n },\n [PathRecordTypes.FILL_RULE]: {\n description: 'Path fill rule',\n path: () => []\n },\n [PathRecordTypes.INITIAL_FILL_RULE]: {\n description: 'Initial fill rule',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.CLIPBOARD]: {\n description: 'Clipboard',\n path: parseClipboard\n }\n};\n\nfunction parseBezierKnot(dataView, offset) {\n const PATH_POINT_SIZE = 8;\n const path = [];\n for (let i = 0; i < PATH_RECORD_SIZE; i += PATH_POINT_SIZE) {\n path.push(parsePathPoint(dataView, offset + i));\n }\n return path;\n}\n\nfunction parsePathPoint(dataView, offset) {\n const vertical = getFixedPointNumber(dataView, offset, 8);\n const horizontal = getFixedPointNumber(dataView, offset + 4, 8);\n return [horizontal, vertical];\n}\n\nfunction parseClipboard(dataView, offset) {\n return [\n [\n getFixedPointNumber(dataView, offset, 8), // Top\n getFixedPointNumber(dataView, offset + 4, 8), // Left\n getFixedPointNumber(dataView, offset + 8, 8), // Botton\n getFixedPointNumber(dataView, offset + 12, 8), // Right\n ],\n getFixedPointNumber(dataView, offset + 16, 8) // Resolution\n ];\n}\n\nfunction getFixedPointNumber(dataView, offset, binaryPoint) {\n const number = Types.getLongAt(dataView, offset);\n\n const sign = (number >>> 31) === 0 ? 1 : -1;\n const integer = (number & 0x7f000000) >>> (32 - binaryPoint);\n const fraction = number & parseInt(strRepeat('1', 32 - binaryPoint), 2);\n\n return sign * parseFloatRadix(integer.toString(2) + '.' + padStart(fraction.toString(2), 32 - binaryPoint, '0'), 2);\n}\n\n// Item key terminology: https://psd-tools.readthedocs.io/en/latest/reference/psd_tools.terminology.html\n// Are these correct? There are collisions that are commented out. A lot of code for little gain?\n// const ITEM_KEY_TERMS = {\n// 'A ': 'A',\n// 'Adjs': 'Adjustment',\n// 'Algd': 'Aligned',\n// 'Algn': 'Alignment',\n// 'AllE': 'AllExcept',\n// 'All ': 'AllPS',\n// 'AlTl': 'AllToolOptions',\n// 'AChn': 'AlphaChannelOptions',\n// 'AlpC': 'AlphaChannels',\n// 'AmbB': 'AmbientBrightness',\n// 'AmbC': 'AmbientColor',\n// 'Amnt': 'Amount',\n// 'AmMx': 'AmplitudeMax',\n// 'AmMn': 'AmplitudeMin',\n// 'Anch': 'Anchor',\n// 'Angl': 'Angle',\n// 'Ang1': 'Angle1',\n// 'Ang2': 'Angle2',\n// 'Ang3': 'Angle3',\n// 'Ang4': 'Angle4',\n// 'AntA': 'AntiAlias',\n// 'Appe': 'Append',\n// 'Aply': 'Apply',\n// 'Ar ': 'Area',\n// 'Arrw': 'Arrowhead',\n// 'As ': 'As',\n// 'Asst': 'AssetBin',\n// 'AssC': 'AssumedCMYK',\n// 'AssG': 'AssumedGray',\n// 'AssR': 'AssumedRGB',\n// 'At ': 'At',\n// 'Auto': 'Auto',\n// 'AuCo': 'AutoContrast',\n// 'Atrs': 'AutoErase',\n// 'AtKr': 'AutoKern',\n// 'AtUp': 'AutoUpdate',\n// 'Axis': 'Axis',\n// 'B ': 'B',\n// 'Bckg': 'Background',\n// 'BckC': 'BackgroundColor',\n// 'BckL': 'BackgroundLevel',\n// 'Bwd ': 'Backward',\n// 'Blnc': 'Balance',\n// 'Bsln': 'BaselineShift',\n// 'BpWh': 'BeepWhenDone',\n// 'BgnR': 'BeginRamp',\n// 'BgnS': 'BeginSustain',\n// 'bvlD': 'BevelDirection',\n// 'ebbl': 'BevelEmboss',\n// 'bvlS': 'BevelStyle',\n// 'bvlT': 'BevelTechnique',\n// 'BgNH': 'BigNudgeH',\n// 'BgNV': 'BigNudgeV',\n// 'BtDp': 'BitDepth',\n// 'Blck': 'Black',\n// 'BlcC': 'BlackClip',\n// 'Blcn': 'BlackGeneration',\n// 'BlcG': 'BlackGenerationCurve',\n// 'BlcI': 'BlackIntensity',\n// 'BlcL': 'BlackLevel',\n// // 'BlcL': 'BlackLimit',\n// 'Bld ': 'Bleed',\n// 'Blnd': 'BlendRange',\n// 'Bl ': 'Blue',\n// 'BlBl': 'BlueBlackPoint',\n// 'blueFloat': 'BlueFloat',\n// 'BlGm': 'BlueGamma',\n// 'BlWh': 'BlueWhitePoint',\n// 'BlX ': 'BlueX',\n// 'BlY ': 'BlueY',\n// 'blur': 'Blur',\n// 'BlrM': 'BlurMethod',\n// 'BlrQ': 'BlurQuality',\n// 'Bk ': 'Book',\n// 'BrdT': 'BorderThickness',\n// 'Btom': 'Bottom',\n// 'Brgh': 'Brightness',\n// 'BrsD': 'BrushDetail',\n// 'BrsS': 'BrushSize',\n// 'BrsT': 'BrushType',\n// 'Brsh': 'Brushes',\n// 'BmpA': 'BumpAmplitude',\n// 'BmpC': 'BumpChannel',\n// 'By ': 'By',\n// 'Byln': 'Byline',\n// 'BylT': 'BylineTitle',\n// 'BytO': 'ByteOrder',\n// 'CMYS': 'CMYKSetup',\n// 'CchP': 'CachePrefs',\n// 'Clcl': 'Calculation',\n// 'Clbr': 'CalibrationBars',\n// 'Cptn': 'Caption',\n// 'CptW': 'CaptionWriter',\n// 'Ctgr': 'Category',\n// 'ClSz': 'CellSize',\n// 'Cntr': 'Center',\n// 'CntC': 'CenterCropMarks',\n// 'ChlA': 'ChalkArea',\n// 'Chnl': 'Channel',\n// 'ChMx': 'ChannelMatrix',\n// 'ChnN': 'ChannelName',\n// 'Chns': 'Channels',\n// 'ChnI': 'ChannelsInterleaved',\n// 'ChAm': 'CharcoalAmount',\n// 'ChrA': 'CharcoalArea',\n// 'Ckmt': 'ChokeMatte',\n// 'ChFX': 'ChromeFX',\n// 'City': 'City',\n// 'ClrA': 'ClearAmount',\n// 'ClPt': 'ClippingPath',\n// 'ClpP': 'ClippingPathEPS',\n// 'ClpF': 'ClippingPathFlatness',\n// 'ClpI': 'ClippingPathIndex',\n// 'Clpg': 'ClippingPathInfo',\n// 'ClnS': 'CloneSource',\n// 'Clsp': 'ClosedSubpath',\n// 'Clr ': 'Color',\n// 'Clrh': 'ColorChannels',\n// 'ClrC': 'ColorCorrection',\n// 'ClrI': 'ColorIndicates',\n// 'ClMg': 'ColorManagement',\n// 'Clrr': 'ColorPickerPrefs',\n// 'ClrS': 'ColorSpace',\n// 'ClrT': 'ColorTable',\n// 'Clrz': 'Colorize',\n// 'Clrs': 'Colors',\n// 'ClrL': 'ColorsList',\n// 'ClmW': 'ColumnWidth',\n// 'CmdK': 'CommandKey',\n// 'Cmpn': 'Compensation',\n// 'Cmpr': 'Compression',\n// 'Cncv': 'Concavity',\n// 'Cndt': 'Condition',\n// 'Cnst': 'Constant',\n// // 'Cnst': 'Constrain',\n// 'CnsP': 'ConstrainProportions',\n// 'Cfov': 'ConstructionFOV',\n// 'Cntg': 'Contiguous',\n// 'Cntn': 'Continue',\n// 'Cnty': 'Continuity',\n// 'ShpC': 'ContourType',\n// // 'Cntr': 'Contrast',\n// 'Cnvr': 'Convert',\n// 'Cpy ': 'Copy',\n// 'Cpyr': 'Copyright',\n// 'CprN': 'CopyrightNotice',\n// 'CrnC': 'CornerCropMarks',\n// 'Cnt ': 'Count',\n// 'CntN': 'CountryName',\n// 'CrcB': 'CrackBrightness',\n// 'CrcD': 'CrackDepth',\n// 'CrcS': 'CrackSpacing',\n// 'blfl': 'CreateLayersFromLayerFX',\n// 'Crdt': 'Credit',\n// 'Crss': 'Crossover',\n// 'Crnt': 'Current',\n// 'CrnH': 'CurrentHistoryState',\n// 'CrnL': 'CurrentLight',\n// 'CrnT': 'CurrentToolOptions',\n// 'Crv ': 'Curve',\n// 'CrvF': 'CurveFile',\n// 'Cstm': 'Custom',\n// 'CstF': 'CustomForced',\n// 'CstM': 'CustomMatte',\n// 'CstP': 'CustomPalette',\n// 'Cyn ': 'Cyan',\n// 'DCS ': 'DCS',\n// 'DPXf': 'DPXFormat',\n// 'DrkI': 'DarkIntensity',\n// 'Drkn': 'Darkness',\n// 'DtCr': 'DateCreated',\n// 'Dt ': 'Datum',\n// 'Dfnt': 'Definition',\n// 'Dnst': 'Density',\n// 'Dpth': 'Depth',\n// 'Dstl': 'DestBlackMax',\n// 'DstB': 'DestBlackMin',\n// 'Dstt': 'DestWhiteMax',\n// 'DstW': 'DestWhiteMin',\n// 'DstM': 'DestinationMode',\n// 'Dtl ': 'Detail',\n// 'Dmtr': 'Diameter',\n// 'DffD': 'DiffusionDither',\n// 'Drct': 'Direction',\n// 'DrcB': 'DirectionBalance',\n// 'DspF': 'DisplaceFile',\n// 'DspM': 'DisplacementMap',\n// 'DspP': 'DisplayPrefs',\n// 'Dstn': 'Distance',\n// // 'Dstr': 'Distortion',\n// // 'Dstr': 'Distribution',\n// 'Dthr': 'Dither',\n// 'DthA': 'DitherAmount',\n// 'Dthp': 'DitherPreserve',\n// 'Dthq': 'DitherQuality',\n// 'DocI': 'DocumentID',\n// 'DtGn': 'DotGain',\n// 'DtGC': 'DotGainCurves',\n// 'DrSh': 'DropShadow',\n// 'Dplc': 'Duplicate',\n// 'DnmC': 'DynamicColorSliders',\n// 'Edg ': 'Edge',\n// 'EdgB': 'EdgeBrightness',\n// 'EdgF': 'EdgeFidelity',\n// 'EdgI': 'EdgeIntensity',\n// 'EdgS': 'EdgeSimplicity',\n// 'EdgT': 'EdgeThickness',\n// 'EdgW': 'EdgeWidth',\n// 'Effc': 'Effect',\n// 'EmbC': 'EmbedCMYK',\n// 'EmbG': 'EmbedGray',\n// 'EmbL': 'EmbedLab',\n// 'EmbP': 'EmbedProfiles',\n// 'EmbR': 'EmbedRGB',\n// 'EmlD': 'EmulsionDown',\n// 'EGst': 'EnableGestures',\n// 'enab': 'Enabled',\n// 'Encd': 'Encoding',\n// 'End ': 'End',\n// 'EndA': 'EndArrowhead',\n// 'EndR': 'EndRamp',\n// 'EndS': 'EndSustain',\n// 'Engn': 'Engine',\n// 'ErsT': 'EraseToHistory',\n// 'ErsK': 'EraserKind',\n// 'ExcP': 'ExactPoints',\n// 'Expr': 'Export',\n// 'ExpC': 'ExportClipboard',\n// 'Exps': 'Exposure',\n// 'Extd': 'Extend',\n// 'EQlt': 'ExtendedQuality',\n// 'Extn': 'Extension',\n// 'ExtQ': 'ExtensionsQuery',\n// 'ExtD': 'ExtrudeDepth',\n// 'ExtM': 'ExtrudeMaskIncomplete',\n// 'ExtR': 'ExtrudeRandom',\n// 'ExtS': 'ExtrudeSize',\n// 'ExtF': 'ExtrudeSolidFace',\n// 'ExtT': 'ExtrudeType',\n// 'EyDr': 'EyeDropperSample',\n// 'FxCm': 'FPXCompress',\n// 'FxQl': 'FPXQuality',\n// 'FxSz': 'FPXSize',\n// 'FxVw': 'FPXView',\n// 'FdT ': 'FadeTo',\n// 'FdtS': 'FadeoutSteps',\n// 'FlOf': 'Falloff',\n// 'Fthr': 'Feather',\n// 'FbrL': 'FiberLength',\n// 'File': 'File',\n// 'FlCr': 'FileCreator',\n// 'FlIn': 'FileInfo',\n// 'FilR': 'FileReference',\n// 'FlSP': 'FileSavePrefs',\n// 'FlTy': 'FileType',\n// 'flst': 'FilesList',\n// 'Fl ': 'Fill',\n// 'FlCl': 'FillColor',\n// 'FlNt': 'FillNeutral',\n// 'FlPd': 'FilterLayerPersistentData',\n// 'FlRs': 'FilterLayerRandomSeed',\n// 'Fngr': 'Fingerpainting',\n// 'FlrC': 'FlareCenter',\n// 'Fltn': 'Flatness',\n// 'Fltt': 'Flatten',\n// 'FlpV': 'FlipVertical',\n// 'Fcs ': 'Focus',\n// 'Fldr': 'Folders',\n// 'FntD': 'FontDesignAxes',\n// 'FntV': 'FontDesignAxesVectors',\n// 'FntN': 'FontName',\n// 'Scrp': 'FontScript',\n// 'FntS': 'FontStyleName',\n// 'FntT': 'FontTechnology',\n// 'FrcC': 'ForcedColors',\n// 'FrgC': 'ForegroundColor',\n// 'FrgL': 'ForegroundLevel',\n// 'Fmt ': 'Format',\n// 'Fwd ': 'Forward',\n// 'FrFX': 'FrameFX',\n// 'FrmW': 'FrameWidth',\n// 'FTcs': 'FreeTransformCenterState',\n// 'Frqn': 'Frequency',\n// 'From': 'From',\n// 'FrmB': 'FromBuiltin',\n// 'FrmM': 'FromMode',\n// 'FncK': 'FunctionKey',\n// 'Fzns': 'Fuzziness',\n// 'GCR ': 'GCR',\n// 'GFPT': 'GIFColorFileType',\n// 'GFCL': 'GIFColorLimit',\n// 'GFEC': 'GIFExportCaption',\n// 'GFMI': 'GIFMaskChannelIndex',\n// 'GFMV': 'GIFMaskChannelInverted',\n// 'GFPF': 'GIFPaletteFile',\n// 'GFPL': 'GIFPaletteType',\n// 'GFCS': 'GIFRequiredColorSpaceType',\n// 'GFIT': 'GIFRowOrderType',\n// 'GFTC': 'GIFTransparentColor',\n// 'GFTB': 'GIFTransparentIndexBlue',\n// 'GFTG': 'GIFTransparentIndexGreen',\n// 'GFTR': 'GIFTransparentIndexRed',\n// 'GFBM': 'GIFUseBestMatch',\n// 'Gmm ': 'Gamma',\n// 'GmtW': 'GamutWarning',\n// 'GnrP': 'GeneralPrefs',\n// 'gblA': 'GlobalAngle',\n// 'gagl': 'GlobalLightingAngle',\n// 'Glos': 'Gloss',\n// 'GlwA': 'GlowAmount',\n// 'GlwT': 'GlowTechnique',\n// 'Grad': 'Gradient',\n// 'Grdf': 'GradientFill',\n// // 'Grn ': 'Grain',\n// 'Grnt': 'GrainType',\n// 'Grns': 'Graininess',\n// 'Gry ': 'Gray',\n// 'GrBh': 'GrayBehavior',\n// 'GrSt': 'GraySetup',\n// 'Grn ': 'Green',\n// 'GrnB': 'GreenBlackPoint',\n// 'greenFloat': 'GreenFloat',\n// 'GrnG': 'GreenGamma',\n// 'GrnW': 'GreenWhitePoint',\n// 'GrnX': 'GreenX',\n// 'GrnY': 'GreenY',\n// 'GrdC': 'GridColor',\n// 'Grds': 'GridCustomColor',\n// 'GrdM': 'GridMajor',\n// 'Grdn': 'GridMinor',\n// 'GrdS': 'GridStyle',\n// 'Grdt': 'GridUnits',\n// 'Grup': 'Group',\n// 'GrtW': 'GroutWidth',\n// 'GrwS': 'GrowSelection',\n// 'Gdes': 'Guides',\n// 'GdsC': 'GuidesColor',\n// 'Gdss': 'GuidesCustomColor',\n// 'GdPr': 'GuidesPrefs',\n// 'GdsS': 'GuidesStyle',\n// 'GttW': 'GutterWidth',\n// 'HlfF': 'HalftoneFile',\n// 'HlfS': 'HalftoneScreen',\n// 'HlSz': 'HalftoneSize',\n// 'Hlfp': 'HalftoneSpec',\n// 'Hrdn': 'Hardness',\n// 'HCdH': 'HasCmdHPreference',\n// 'Hdr ': 'Header',\n// 'Hdln': 'Headline',\n// 'Hght': 'Height',\n// 'HghA': 'HighlightArea',\n// 'hglC': 'HighlightColor',\n// 'HghL': 'HighlightLevels',\n// 'hglM': 'HighlightMode',\n// 'hglO': 'HighlightOpacity',\n// 'HghS': 'HighlightStrength',\n// 'HstB': 'HistoryBrushSource',\n// 'HstP': 'HistoryPrefs',\n// 'HsSS': 'HistoryStateSource',\n// 'HsSt': 'HistoryStates',\n// 'Hrzn': 'Horizontal',\n// 'HrzS': 'HorizontalScale',\n// 'HstN': 'HostName',\n// 'HstV': 'HostVersion',\n// 'H ': 'Hue',\n// 'ICCE': 'ICCEngine',\n// 'ICCt': 'ICCSetupName',\n// 'Idnt': 'ID',\n// 'Idle': 'Idle',\n// 'ImgB': 'ImageBalance',\n// 'Impr': 'Import',\n// 'Imps': 'Impressionist',\n// 'In ': 'In',\n// 'c@#^': 'Inherits',\n// 'InkC': 'InkColors',\n// 'Inks': 'Inks',\n// 'IrGl': 'InnerGlow',\n// 'glwS': 'InnerGlowSource',\n// 'IrSh': 'InnerShadow',\n// 'Inpt': 'Input',\n// 'kIBP': 'InputBlackPoint',\n// 'Inmr': 'InputMapRange',\n// 'Inpr': 'InputRange',\n// 'kIWP': 'InputWhitePoint',\n// 'Intn': 'Intensity',\n// 'Inte': 'Intent',\n// 'IntH': 'InterfaceBevelHighlight',\n// 'Intv': 'InterfaceBevelShadow',\n// 'IntB': 'InterfaceBlack',\n// 'Intd': 'InterfaceBorder',\n// 'Intk': 'InterfaceButtonDarkShadow',\n// 'Intt': 'InterfaceButtonDownFill',\n// 'InBF': 'InterfaceButtonUpFill',\n// 'ICBL': 'InterfaceColorBlue2',\n// 'ICBH': 'InterfaceColorBlue32',\n// 'ICGL': 'InterfaceColorGreen2',\n// 'ICGH': 'InterfaceColorGreen32',\n// 'ICRL': 'InterfaceColorRed2',\n// 'ICRH': 'InterfaceColorRed32',\n// 'IntI': 'InterfaceIconFillActive',\n// 'IntF': 'InterfaceIconFillDimmed',\n// 'Intc': 'InterfaceIconFillSelected',\n// 'Intm': 'InterfaceIconFrameActive',\n// // 'Intr': 'InterfaceIconFrameDimmed',\n// 'IntS': 'InterfaceIconFrameSelected',\n// 'IntP': 'InterfacePaletteFill',\n// 'IntR': 'InterfaceRed',\n// 'IntT': 'InterfaceToolTipBackground',\n// 'ITTT': 'InterfaceToolTipText',\n// 'ITBg': 'InterfaceTransparencyBackground',\n// 'ITFg': 'InterfaceTransparencyForeground',\n// 'IntW': 'InterfaceWhite',\n// // 'Intr': 'Interlace',\n// 'IntC': 'InterlaceCreateType',\n// 'IntE': 'InterlaceEliminateType',\n// // 'Intr': 'Interpolation',\n// 'IntM': 'InterpolationMethod',\n// 'Invr': 'Invert',\n// 'InvM': 'InvertMask',\n// 'InvS': 'InvertSource2',\n// 'InvT': 'InvertTexture',\n// 'IsDr': 'IsDirty',\n// 'ItmI': 'ItemIndex',\n// 'JPEQ': 'JPEGQuality',\n// 'Krng': 'Kerning',\n// 'Kywd': 'Keywords',\n// 'Knd ': 'Kind',\n// 'LTnm': 'LUTAnimation',\n// 'LZWC': 'LZWCompression',\n// 'Lbls': 'Labels',\n// 'Lnds': 'Landscape',\n// 'LstT': 'LastTransform',\n// 'Lyr ': 'Layer',\n// 'Lefx': 'LayerEffects',\n// 'lfxv': 'LayerFXVisible',\n// 'LyrI': 'LayerID',\n// 'LyrN': 'LayerName',\n// 'Lyrs': 'Layers',\n// 'Ldng': 'Leading',\n// 'Left': 'Left',\n// 'lSNs': 'LegacySerialString',\n// // 'Lngt': 'Length',\n// 'Lns ': 'Lens',\n// 'Lvl ': 'Level',\n// 'Lvls': 'Levels',\n// 'LgDr': 'LightDark',\n// 'LghD': 'LightDirection',\n// 'LghI': 'LightIntensity',\n// 'LghP': 'LightPosition',\n// 'LghS': 'LightSource',\n// 'LghT': 'LightType',\n// 'LghG': 'LightenGrout',\n// 'Lght': 'Lightness',\n// 'Line': 'Line',\n// 'lnkE': 'LinkEnable',\n// 'LnkL': 'LinkedLayerIDs',\n// 'Lald': 'LocalLightingAltitude',\n// 'lagl': 'LocalLightingAngle',\n// 'LclR': 'LocalRange',\n// 'Lctn': 'Location',\n// 'Log ': 'Log',\n// 'kLog': 'Logarithmic',\n// 'LwCs': 'LowerCase',\n// 'Lmnc': 'Luminance',\n// 'Mgnt': 'Magenta',\n// 'MkVs': 'MakeVisible',\n// 'Mfov': 'ManipulationFOV',\n// 'MpBl': 'MapBlack',\n// 'Mpng': 'Mapping',\n// 'MpgS': 'MappingShape',\n// 'Mtrl': 'Material',\n// 'Mtrx': 'Matrix',\n// 'MttC': 'MatteColor',\n// 'Mxm ': 'Maximum',\n// 'MxmS': 'MaximumStates',\n// 'MmrU': 'MemoryUsagePercent',\n// 'Mrge': 'Merge',\n// 'Mrgd': 'Merged',\n// 'Msge': 'Message',\n// 'Mthd': 'Method',\n// 'MztT': 'MezzotintType',\n// 'Mdpn': 'Midpoint',\n// 'MdtL': 'MidtoneLevels',\n// 'Mnm ': 'Minimum',\n// 'MsmC': 'MismatchCMYK',\n// 'MsmG': 'MismatchGray',\n// 'MsmR': 'MismatchRGB',\n// 'Md ': 'Mode',\n// 'Mnch': 'Monochromatic',\n// 'MvT ': 'MoveTo',\n// 'Nm ': 'Name',\n// 'Ngtv': 'Negative',\n// 'Nw ': 'New',\n// 'Nose': 'Noise',\n// 'NnIm': 'NonImageData',\n// 'NnLn': 'NonLinear',\n// 'null': 'Null',\n// 'Nm L': 'NumLights',\n// 'Nmbr': 'Number',\n// 'NCch': 'NumberOfCacheLevels',\n// 'NC64': 'NumberOfCacheLevels64',\n// 'NmbO': 'NumberOfChannels',\n// 'NmbC': 'NumberOfChildren',\n// 'NmbD': 'NumberOfDocuments',\n// 'NmbG': 'NumberOfGenerators',\n// // 'NmbL': 'NumberOfLayers',\n// // 'NmbL': 'NumberOfLevels',\n// 'NmbP': 'NumberOfPaths',\n// 'NmbR': 'NumberOfRipples',\n// 'NmbS': 'NumberOfSiblings',\n// 'ObjN': 'ObjectName',\n// 'Ofst': 'Offset',\n// 'Sftt': 'OldSmallFontType',\n// 'On ': 'On',\n// 'Opct': 'Opacity',\n// 'Optm': 'Optimized',\n// 'Ornt': 'Orientation',\n// 'OrgH': 'OriginalHeader',\n// 'OrgT': 'OriginalTransmissionReference',\n// 'OthC': 'OtherCursors',\n// 'OrGl': 'OuterGlow',\n// 'Otpt': 'Output',\n// 'kOBP': 'OutputBlackPoint',\n// 'kOWP': 'OutputWhitePoint',\n// 'OvrC': 'OverprintColors',\n// 'OvrO': 'OverrideOpen',\n// 'ObrP': 'OverridePrinter',\n// 'Ovrd': 'OverrideSave',\n// 'PNGf': 'PNGFilter',\n// 'PGIT': 'PNGInterlaceType',\n// 'PMpf': 'PageFormat',\n// 'PgNm': 'PageNumber',\n// 'PgPs': 'PagePosition',\n// 'PgSt': 'PageSetup',\n// 'PnCK': 'PaintCursorKind',\n// 'PntT': 'PaintType',\n// 'PntC': 'PaintingCursors',\n// 'Plt ': 'Palette',\n// 'PltF': 'PaletteFile',\n// 'PprB': 'PaperBrightness',\n// 'PrIn': 'ParentIndex',\n// 'PrNm': 'ParentName',\n// 'Path': 'Path',\n// 'PthC': 'PathContents',\n// 'PthN': 'PathName',\n// 'Pttn': 'Pattern',\n// 'Pncl': 'PencilWidth',\n// 'Prsp': 'PerspectiveIndex',\n// 'Phsp': 'Phosphors',\n// 'PckI': 'PickerID',\n// 'Pckr': 'PickerKind',\n// 'PPSz': 'PixelPaintSize',\n// 'Pltf': 'Platform',\n// 'PlgF': 'PluginFolder',\n// 'PlgP': 'PluginPrefs',\n// 'Pts ': 'Points',\n// 'Pstn': 'Position',\n// 'PstS': 'PostScriptColor',\n// 'Pstr': 'Posterization',\n// 'PrdC': 'PredefinedColors',\n// 'PrfB': 'PreferBuiltin',\n// 'Prfr': 'Preferences',\n// 'PrsA': 'PreserveAdditional',\n// 'PrsL': 'PreserveLuminosity',\n// 'PrsT': 'PreserveTransparency',\n// 'Prs ': 'Pressure',\n// 'Prvw': 'Preview',\n// 'PrvK': 'PreviewCMYK',\n// 'PrvF': 'PreviewFullSize',\n// 'PrvI': 'PreviewIcon',\n// 'PrvM': 'PreviewMacThumbnail',\n// 'PrvW': 'PreviewWinThumbnail',\n// 'PrvQ': 'PreviewsQuery',\n// 'PMps': 'PrintSettings',\n// 'PrfS': 'ProfileSetup',\n// 'PrvS': 'ProvinceState',\n// 'Qlty': 'Quality',\n// 'QucM': 'QuickMask',\n// 'RGBS': 'RGBSetup',\n// 'Rds ': 'Radius',\n// 'RndS': 'RandomSeed',\n// 'Rt ': 'Ratio',\n// 'Rcnf': 'RecentFiles',\n// 'Rd ': 'Red',\n// 'RdBl': 'RedBlackPoint',\n// 'redFloat': 'RedFloat',\n// 'RdGm': 'RedGamma',\n// 'RdWh': 'RedWhitePoint',\n// 'RdX ': 'RedX',\n// 'RdY ': 'RedY',\n// 'RgsM': 'RegistrationMarks',\n// 'Rltv': 'Relative',\n// 'Rlf ': 'Relief',\n// 'Rfid': 'RenderFidelity',\n// 'Rsmp': 'Resample',\n// 'RWOZ': 'ResizeWindowsOnZoom',\n// 'Rslt': 'Resolution',\n// 'RsrI': 'ResourceID',\n// 'Rspn': 'Response',\n// 'RtnH': 'RetainHeader',\n// 'Rvrs': 'Reverse',\n// 'Rght': 'Right',\n// 'RplM': 'RippleMagnitude',\n// 'RplS': 'RippleSize',\n// 'Rtt ': 'Rotate',\n// 'Rndn': 'Roundness',\n// 'RlrH': 'RulerOriginH',\n// 'RlrV': 'RulerOriginV',\n// 'RlrU': 'RulerUnits',\n// // 'Strt': 'Saturation',\n// 'SvAn': 'SaveAndClose',\n// 'SvCm': 'SaveComposite',\n// 'PltL': 'SavePaletteLocations',\n// 'SvPt': 'SavePaths',\n// 'SvPy': 'SavePyramids',\n// 'Svng': 'Saving',\n// 'Scl ': 'Scale',\n// 'SclH': 'ScaleHorizontal',\n// 'SclV': 'ScaleVertical',\n// 'Scln': 'Scaling',\n// 'Scns': 'Scans',\n// 'ScrD': 'ScratchDisks',\n// 'ScrF': 'ScreenFile',\n// 'ScrT': 'ScreenType',\n// 'Sprt': 'Separations',\n// 'SrlS': 'SerialString',\n// // 'ShdI': 'ShadingIntensity',\n// 'ShdN': 'ShadingNoise',\n// 'ShdS': 'ShadingShape',\n// 'sdwC': 'ShadowColor',\n// // 'ShdI': 'ShadowIntensity',\n// 'ShdL': 'ShadowLevels',\n// 'sdwM': 'ShadowMode',\n// 'sdwO': 'ShadowOpacity',\n// 'Shp ': 'Shape',\n// 'Shrp': 'Sharpness',\n// 'ShrE': 'ShearEd',\n// 'ShrP': 'ShearPoints',\n// 'ShrS': 'ShearSt',\n// 'ShfK': 'ShiftKey',\n// 'ShKT': 'ShiftKeyToolSwitch',\n// 'ShrN': 'ShortNames',\n// 'ShwE': 'ShowEnglishFontNames',\n// 'SwMC': 'ShowMenuColors',\n// 'ShwT': 'ShowToolTips',\n// 'ShTr': 'ShowTransparency',\n// 'Sz ': 'SizeKey',\n// 'Skew': 'Skew',\n// 'Sfts': 'SmallFontType',\n// 'SmBM': 'SmartBlurMode',\n// 'SmBQ': 'SmartBlurQuality',\n// 'Smoo': 'Smooth',\n// 'Smth': 'Smoothness',\n// 'SnpI': 'SnapshotInitial',\n// 'SfCl': 'SoftClip',\n// 'Sftn': 'Softness',\n// 'SoFi': 'SolidFill',\n// 'Srce': 'Source',\n// 'Src2': 'Source2',\n// 'SrcM': 'SourceMode',\n// 'Spcn': 'Spacing',\n// 'SpcI': 'SpecialInstructions',\n// 'SphM': 'SpherizeMode',\n// 'Spot': 'Spot',\n// 'SprR': 'SprayRadius',\n// 'SqrS': 'SquareSize',\n// 'Srcl': 'SrcBlackMax',\n// 'SrcB': 'SrcBlackMin',\n// 'Srcm': 'SrcWhiteMax',\n// 'SrcW': 'SrcWhiteMin',\n// // 'Strt': 'Start',\n// 'StrA': 'StartArrowhead',\n// 'Stte': 'State',\n// 'srgh': 'Strength',\n// 'srgR': 'StrengthRatio',\n// 'Strg': 'Strength_PLUGIN',\n// 'StDt': 'StrokeDetail',\n// 'SDir': 'StrokeDirection',\n// 'StrL': 'StrokeLength',\n// 'StrP': 'StrokePressure',\n// 'StrS': 'StrokeSize',\n// 'StrW': 'StrokeWidth',\n// 'Styl': 'Style',\n// 'Stys': 'Styles',\n// 'StlC': 'StylusIsColor',\n// 'StlO': 'StylusIsOpacity',\n// 'StlP': 'StylusIsPressure',\n// 'StlS': 'StylusIsSize',\n// 'SbpL': 'SubPathList',\n// 'SplC': 'SupplementalCategories',\n// 'SstI': 'SystemInfo',\n// 'SstP': 'SystemPalette',\n// // 'null': 'Target',\n// 'Trgp': 'TargetPath',\n// 'TrgP': 'TargetPathIndex',\n// // 'Lngt': 'TermLength',\n// 'Txt ': 'Text',\n// // 'TxtC': 'TextClickPoint',\n// 'TxtD': 'TextData',\n// 'TxtS': 'TextStyle',\n// 'Txtt': 'TextStyleRange',\n// 'Txtr': 'Texture',\n// // 'TxtC': 'TextureCoverage',\n// 'TxtF': 'TextureFile',\n// 'TxtT': 'TextureType',\n// 'Thsh': 'Threshold',\n// 'TlNm': 'TileNumber',\n// 'TlOf': 'TileOffset',\n// 'TlSz': 'TileSize',\n// 'Ttl ': 'Title',\n// 'T ': 'To',\n// 'TBl ': 'ToBuiltin',\n// 'ToLk': 'ToLinked',\n// 'TMd ': 'ToMode',\n// 'TglO': 'ToggleOthers',\n// 'Tlrn': 'Tolerance',\n// 'Top ': 'Top',\n// 'TtlL': 'TotalLimit',\n// 'Trck': 'Tracking',\n// 'TrnF': 'TransferFunction',\n// // 'TrnS': 'TransferSpec',\n// 'Trns': 'Transparency',\n// // 'TrnG': 'TransparencyGrid',\n// 'TrnC': 'TransparencyGridColors',\n// // 'TrnG': 'TransparencyGridSize',\n// 'TrnP': 'TransparencyPrefs',\n// // 'TrnS': 'TransparencyShape',\n// 'TrnI': 'TransparentIndex',\n// 'TrnW': 'TransparentWhites',\n// 'Twst': 'Twist',\n// 'Type': 'Type',\n// 'UC ': 'UCA',\n// 'URL ': 'URL',\n// 'UndA': 'UndefinedArea',\n// 'Undl': 'Underline',\n// 'UntP': 'UnitsPrefs',\n// 'Untl': 'Untitled',\n// 'UppY': 'UpperY',\n// 'Urgn': 'Urgency',\n// 'AcrS': 'UseAccurateScreens',\n// 'AdPl': 'UseAdditionalPlugins',\n// 'UsCc': 'UseCacheForHistograms',\n// 'UsCr': 'UseCurves',\n// 'UsDf': 'UseDefault',\n// 'uglg': 'UseGlobalAngle',\n// 'UsIC': 'UseICCProfile',\n// 'UsMs': 'UseMask',\n// 'UsrM': 'UserMaskEnabled',\n// 'Usrs': 'UserMaskLinked',\n// 'Usng': 'Using',\n// 'Vl ': 'Value',\n// 'Vrnc': 'Variance',\n// 'Vct0': 'Vector0',\n// 'Vct1': 'Vector1',\n// 'VctC': 'VectorColor',\n// 'VrsF': 'VersionFix',\n// 'VrsM': 'VersionMajor',\n// 'VrsN': 'VersionMinor',\n// 'Vrtc': 'Vertical',\n// 'VrtS': 'VerticalScale',\n// 'Vdlp': 'VideoAlpha',\n// 'Vsbl': 'Visible',\n// 'WtcS': 'WatchSuspension',\n// 'watr': 'Watermark',\n// 'Wvtp': 'WaveType',\n// 'WLMx': 'WavelengthMax',\n// 'WLMn': 'WavelengthMin',\n// 'WbdP': 'WebdavPrefs',\n// 'Wtdg': 'WetEdges',\n// 'What': 'What',\n// 'WhtC': 'WhiteClip',\n// 'WhtI': 'WhiteIntensity',\n// 'WhHi': 'WhiteIsHigh',\n// 'WhtL': 'WhiteLevel',\n// 'WhtP': 'WhitePoint',\n// 'WhPt': 'WholePath',\n// 'Wdth': 'Width',\n// 'WndM': 'WindMethod',\n// 'With': 'With',\n// 'WrPt': 'WorkPath',\n// 'WrkP': 'WorkPathIndex',\n// 'X ': 'X',\n// 'Y ': 'Y',\n// 'Ylw ': 'Yellow',\n// 'ZZTy': 'ZigZagType',\n// 'Alis': '_3DAntiAlias',\n// };\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/\n\nimport {getDataView, getStringFromDataView, getPascalStringFromDataView} from './utils.js';\nimport Types from './types.js';\nimport TagNames from './photoshop-tag-names.js';\n\nexport default {\n read\n};\n\nconst SIGNATURE = '8BIM';\nconst TAG_ID_SIZE = 2;\nconst RESOURCE_LENGTH_SIZE = 4;\n\nconst SIGNATURE_SIZE = SIGNATURE.length;\n\nfunction read(bytes, includeUnknown) {\n const dataView = getDataView(new Uint8Array(bytes).buffer);\n const tags = {};\n let offset = 0;\n\n while (offset < bytes.length) {\n const signature = getStringFromDataView(dataView, offset, SIGNATURE_SIZE);\n offset += SIGNATURE_SIZE;\n const tagId = Types.getShortAt(dataView, offset);\n offset += TAG_ID_SIZE;\n const {tagName, tagNameSize} = getTagName(dataView, offset);\n offset += tagNameSize;\n const resourceSize = Types.getLongAt(dataView, offset);\n offset += RESOURCE_LENGTH_SIZE;\n if (signature === SIGNATURE) {\n const valueDataView = getDataView(dataView.buffer, offset, resourceSize);\n const tag = {\n id: tagId,\n value: getStringFromDataView(valueDataView, 0, resourceSize),\n };\n if (TagNames[tagId]) {\n try {\n tag.description = TagNames[tagId].description(valueDataView);\n } catch (error) {\n tag.description = '';\n }\n tags[tagName ? tagName : TagNames[tagId].name] = tag;\n } else if (includeUnknown) {\n tags[`undefined-${tagId}`] = tag;\n }\n }\n offset += resourceSize + (resourceSize % 2);\n }\n\n return tags;\n}\n\nfunction getTagName(dataView, offset) {\n // The name is encoded as a Pascal string (the string is prefixed with one\n // byte containing the length of the string) and everything is padded with a\n // null byte to make the size even.\n const [stringSize, string] = getPascalStringFromDataView(dataView, offset);\n return {\n tagName: string,\n tagNameSize: 1 + stringSize + (stringSize % 2 === 0 ? 1 : 0)\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport const iccTags = {\n 'desc': {\n 'name': 'ICC Description',\n },\n 'cprt': {\n 'name': 'ICC Copyright',\n },\n 'dmdd': {\n 'name': 'ICC Device Model Description',\n },\n 'vued': {\n 'name': 'ICC Viewing Conditions Description',\n },\n 'dmnd': {\n 'name': 'ICC Device Manufacturer for Display',\n },\n 'tech': {\n 'name': 'Technology',\n },\n};\n\nexport const iccProfile = {\n 4: {\n 'name': 'Preferred CMM type',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => value !== null ? toCompany(value) : '',\n },\n 8: {\n 'name': 'Profile Version',\n 'value': (dataView, offset) => {\n return (dataView.getUint8(offset)).toString(10) + '.'\n + (dataView.getUint8(offset + 1) >> 4).toString(10) + '.'\n + (dataView.getUint8(offset + 1) % 16).toString(10);\n }\n },\n 12: {\n 'name': 'Profile/Device class',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => {\n switch (value.toLowerCase()) {\n case 'scnr': return 'Input Device profile';\n case 'mntr': return 'Display Device profile';\n case 'prtr': return 'Output Device profile';\n case 'link': return 'DeviceLink profile';\n case 'abst': return 'Abstract profile';\n case 'spac': return 'ColorSpace profile';\n case 'nmcl': return 'NamedColor profile';\n case 'cenc': return 'ColorEncodingSpace profile';\n case 'mid ': return 'MultiplexIdentification profile';\n case 'mlnk': return 'MultiplexLink profile';\n case 'mvis': return 'MultiplexVisualization profile';\n default: return value;\n }\n }\n },\n 16: {\n 'name': 'Color Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 20: {\n 'name': 'Connection Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 24: {\n 'name': 'ICC Profile Date',\n 'value': (dataView, offset) => parseDate(dataView, offset).toISOString()\n },\n 36: {\n 'name': 'ICC Signature',\n 'value': (dataView, offset) => sliceToString(dataView.buffer.slice(offset, offset + 4))\n },\n 40: {\n 'name': 'Primary Platform',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 48: {\n 'name': 'Device Manufacturer',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 52: {\n 'name': 'Device Model Number',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 64: {\n 'name': 'Rendering Intent',\n 'value': (dataView, offset) => dataView.getUint32(offset),\n 'description': (value) => {\n switch (value) {\n case 0: return 'Perceptual';\n case 1: return 'Relative Colorimetric';\n case 2: return 'Saturation';\n case 3: return 'Absolute Colorimetric';\n default: return value;\n }\n }\n },\n\n 80: {\n 'name': 'Profile Creator',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n};\n\nfunction parseDate(dataView, offset) {\n const year = dataView.getUint16(offset);\n const month = dataView.getUint16(offset + 2) - 1;\n const day = dataView.getUint16(offset + 4);\n const hours = dataView.getUint16(offset + 6);\n const minutes = dataView.getUint16(offset + 8);\n const seconds = dataView.getUint16(offset + 10);\n return new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction toCompany(value) {\n switch (value.toLowerCase()) {\n case 'appl': return 'Apple';\n case 'adbe': return 'Adobe';\n case 'msft': return 'Microsoft';\n case 'sunw': return 'Sun Microsystems';\n case 'sgi': return 'Silicon Graphics';\n case 'tgnt': return 'Taligent';\n default: return value;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\nimport {iccTags, iccProfile} from './icc-tag-names.js';\nimport {getStringFromDataView, getUnicodeStringFromDataView, decompress, COMPRESSION_METHOD_NONE, COMPRESSION_METHOD_DEFLATE} from './utils.js';\n\nexport default {\n read\n};\n\nconst PROFILE_HEADER_LENGTH = 84;\nconst ICC_TAG_COUNT_OFFSET = 128;\nconst ICC_SIGNATURE = 'acsp';\nconst TAG_TYPE_DESC = 'desc';\nconst TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE = 'mluc';\nconst TAG_TYPE_TEXT = 'text';\nconst TAG_TYPE_SIGNATURE = 'sig ';\nconst TAG_TABLE_SINGLE_TAG_DATA = 12;\n\n// ICC profile data can be longer than application segment max length of ~64k.\n// so it can be split into multiple APP2 segments. Each segment includes\n// total chunk count and chunk number.\n// Here we read all chunks into single continuous array of bytes.\n// Compressed ICC profile data only has support for a single chunk.\nfunction read(dataView, iccData, async) {\n if (async && iccData[0].compressionMethod !== COMPRESSION_METHOD_NONE) {\n return readCompressedIcc(dataView, iccData);\n }\n\n return readIcc(dataView, iccData);\n}\n\nfunction readCompressedIcc(dataView, iccData) {\n if (!compressionMethodIsSupported(iccData[0].compressionMethod)) {\n return {};\n }\n const compressedDataView = new DataView(dataView.buffer.slice(iccData[0].offset, iccData[0].offset + iccData[0].length));\n return decompress(compressedDataView, iccData[0].compressionMethod, 'utf-8', 'dataview')\n .then(parseTags)\n .catch(() => ({}));\n}\n\nfunction compressionMethodIsSupported(compressionMethod) {\n return compressionMethod === COMPRESSION_METHOD_DEFLATE;\n}\n\nfunction readIcc(dataView, iccData) {\n try {\n const totalIccProfileLength = iccData.reduce((sum, icc) => sum + icc.length, 0);\n\n const iccBinaryData = new Uint8Array(totalIccProfileLength);\n let offset = 0;\n const buffer = getBuffer(dataView);\n\n for (let chunkNumber = 1; chunkNumber <= iccData.length; chunkNumber++) {\n const iccDataChunk = iccData.find((x) => x.chunkNumber === chunkNumber);\n if (!iccDataChunk) {\n throw new Error(`ICC chunk ${chunkNumber} not found`);\n }\n\n const data = buffer.slice(iccDataChunk.offset, iccDataChunk.offset + iccDataChunk.length);\n const chunkData = new Uint8Array(data);\n\n iccBinaryData.set(chunkData, offset);\n offset += chunkData.length;\n }\n\n return parseTags(new DataView(iccBinaryData.buffer));\n } catch (error) {\n return {};\n }\n}\n\nfunction getBuffer(dataView) {\n if (Array.isArray(dataView)) {\n return (new DataView(Uint8Array.from(dataView).buffer)).buffer;\n }\n return dataView.buffer;\n}\n\nfunction iccDoesNotHaveTagCount(buffer) {\n return buffer.length < (ICC_TAG_COUNT_OFFSET + 4);\n}\n\nfunction hasTagsData(buffer, tagHeaderOffset) {\n return buffer.length < tagHeaderOffset + TAG_TABLE_SINGLE_TAG_DATA;\n}\n\nexport function parseTags(dataView) {\n const buffer = dataView.buffer;\n\n const length = dataView.getUint32();\n if (dataView.byteLength !== length) {\n throw new Error('ICC profile length not matching');\n }\n\n if (dataView.length < PROFILE_HEADER_LENGTH) {\n throw new Error('ICC profile too short');\n }\n\n const tags = {};\n\n const iccProfileKeys = Object.keys(iccProfile);\n for (let i = 0; i < iccProfileKeys.length; i++) {\n const offset = iccProfileKeys[i];\n const profileEntry = iccProfile[offset];\n const value = profileEntry.value(dataView, parseInt(offset, 10));\n let description = value;\n if (profileEntry.description) {\n description = profileEntry.description(value);\n }\n\n tags[profileEntry.name] = {\n value,\n description\n };\n }\n\n const signature = sliceToString(buffer.slice(36, 40));\n if (signature !== ICC_SIGNATURE) {\n throw new Error('ICC profile: missing signature');\n }\n\n /* ICC data is incomplete but we have header parsed so lets return it */\n if (iccDoesNotHaveTagCount(buffer)) {\n return tags;\n }\n\n const tagCount = dataView.getUint32(128);\n let tagHeaderOffset = 132;\n\n for (let i = 0; i < tagCount; i++) {\n if (hasTagsData(buffer, tagHeaderOffset)) {\n // Tags are corrupted (offset too far), return what we parsed until now\n return tags;\n }\n const tagSignature = getStringFromDataView(dataView, tagHeaderOffset, 4);\n const tagOffset = dataView.getUint32(tagHeaderOffset + 4);\n const tagSize = dataView.getUint32(tagHeaderOffset + 8);\n\n if (tagOffset > buffer.length) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n const tagType = getStringFromDataView(dataView, tagOffset, 4);\n\n if (tagType === TAG_TYPE_DESC) {\n const tagValueSize = dataView.getUint32(tagOffset + 8);\n if (tagValueSize > tagSize) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n\n const val = sliceToString(buffer.slice(tagOffset + 12, tagOffset + tagValueSize + 11));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE) {\n const numRecords = dataView.getUint32(tagOffset + 8);\n const recordSize = dataView.getUint32(tagOffset + 12);\n let offset = tagOffset + 16;\n const val = [];\n for (let recordNum = 0; recordNum < numRecords; recordNum++) {\n const languageCode = getStringFromDataView(dataView, offset + 0, 2);\n const countryCode = getStringFromDataView(dataView, offset + 2, 2);\n const textLength = dataView.getUint32(offset + 4);\n const textOffset = dataView.getUint32(offset + 8);\n\n const text = getUnicodeStringFromDataView(dataView, tagOffset + textOffset, textLength);\n val.push({languageCode, countryCode, text});\n offset += recordSize;\n }\n if (numRecords === 1) {\n addTag(tags, tagSignature, val[0].text);\n } else {\n const valObj = {};\n for (let valIndex = 0; valIndex < val.length; valIndex++) {\n valObj[`${val[valIndex].languageCode}-${val[valIndex].countryCode}`] = val[valIndex].text;\n }\n addTag(tags, tagSignature, valObj);\n }\n } else if (tagType === TAG_TYPE_TEXT) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + tagSize - 7));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_SIGNATURE) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + 12));\n addTag(tags, tagSignature, val);\n }\n tagHeaderOffset = tagHeaderOffset + 12;\n }\n\n return tags;\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction addTag(tags, tagSignature, value) {\n if (iccTags[tagSignature]) {\n tags[iccTags[tagSignature].name] = {value, description: value};\n } else {\n tags[tagSignature] = {value, description: value};\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Reverse-engineered docs:\n// https://exiftool.org/makernote_types.html\n// https://exiv2.org/makernote.html\n// https://exiv2.org/tags-canon.html\n// https://gist.github.com/redaktor/bae0ef2377ab70bc5276\n// https://www.ozhiker.com/electronics/pjmt/jpeg_info/canon_mn.html\n\nimport {objectAssign} from './utils.js';\nimport {readIfd} from './tags-helpers.js';\nimport {IFD_TYPE_CANON} from './tag-names.js';\n\nconst SHOT_INFO_AUTO_ROTATE = 27; // First position is size.\n\nexport default {\n read,\n SHOT_INFO_AUTO_ROTATE\n};\n\nfunction read(dataView, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n let tags = readIfd(dataView, IFD_TYPE_CANON, tiffHeaderOffset, tiffHeaderOffset + offset, byteOrder, includeUnknown);\n\n if (tags['ShotInfo']) {\n tags = objectAssign({}, tags, parseShotInfo(tags['ShotInfo'].value));\n delete tags['ShotInfo'];\n }\n\n return tags;\n}\n\nfunction parseShotInfo(shotInfoData) {\n const tags = {};\n\n if (shotInfoData[SHOT_INFO_AUTO_ROTATE] !== undefined) {\n tags['AutoRotate'] = {\n value: shotInfoData[SHOT_INFO_AUTO_ROTATE],\n description: getAutoRotateDescription(shotInfoData[SHOT_INFO_AUTO_ROTATE])\n };\n }\n\n return tags;\n}\n\nfunction getAutoRotateDescription(autoRotate) {\n if (autoRotate === 0) {\n return 'None';\n }\n if (autoRotate === 1) {\n return 'Rotate 90 CW';\n }\n if (autoRotate === 2) {\n return 'Rotate 180';\n }\n if (autoRotate === 3) {\n return 'Rotate 270 CW';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n return {\n 'Image Width': getImageWidth(dataView, fileDataOffset),\n 'Image Height': getImageHeight(dataView, fileDataOffset),\n 'Bit Depth': getBitDepth(dataView, fileDataOffset),\n 'Color Type': getColorType(dataView, fileDataOffset),\n 'Compression': getCompression(dataView, fileDataOffset),\n 'Filter': getFilter(dataView, fileDataOffset),\n 'Interlace': getInterlace(dataView, fileDataOffset)\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset) {\n const OFFSET = 0;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset) {\n const OFFSET = 4;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getBitDepth(dataView, fileDataOffset) {\n const OFFSET = 8;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}`\n };\n}\n\nfunction getColorType(dataView, fileDataOffset) {\n const OFFSET = 9;\n const SIZE = 1;\n const COLOR_TYPES = {\n 0: 'Grayscale',\n 2: 'RGB',\n 3: 'Palette',\n 4: 'Grayscale with Alpha',\n 6: 'RGB with Alpha'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: COLOR_TYPES[value] || 'Unknown'\n };\n}\n\nfunction getCompression(dataView, fileDataOffset) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Deflate/Inflate' : 'Unknown'\n };\n}\n\nfunction getFilter(dataView, fileDataOffset) {\n const OFFSET = 11;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Adaptive' : 'Unknown'\n };\n}\n\nfunction getInterlace(dataView, fileDataOffset) {\n const OFFSET = 12;\n const SIZE = 1;\n const INTERLACE_TYPES = {\n 0: 'Noninterlaced',\n 1: 'Adam7 Interlace'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: INTERLACE_TYPES[value] || 'Unknown'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringValueFromArray, getStringFromDataView, decompress, COMPRESSION_METHOD_NONE} from './utils.js';\nimport TagDecoder from './tag-decoder.js';\nimport {TYPE_TEXT, TYPE_ITXT, TYPE_ZTXT} from './image-header-png.js';\nimport Tags from './tags.js';\nimport IptcTags from './iptc-tags.js';\nimport Constants from './constants.js';\n\nexport default {\n read\n};\n\nconst STATE_KEYWORD = 'STATE_KEYWORD';\nconst STATE_COMPRESSION = 'STATE_COMPRESSION';\nconst STATE_LANG = 'STATE_LANG';\nconst STATE_TRANSLATED_KEYWORD = 'STATE_TRANSLATED_KEYWORD';\nconst STATE_TEXT = 'STATE_TEXT';\nconst COMPRESSION_SECTION_ITXT_EXTRA_BYTE = 1;\nconst COMPRESSION_FLAG_COMPRESSED = 1;\nconst EXIF_OFFSET = 6;\n\nfunction read(dataView, pngTextChunks, async, includeUnknown) {\n const tags = {};\n const tagsPromises = [];\n for (let i = 0; i < pngTextChunks.length; i++) {\n const {offset, length, type} = pngTextChunks[i];\n const nameAndValue = getNameAndValue(dataView, offset, length, type, async);\n if (nameAndValue instanceof Promise) {\n tagsPromises.push(nameAndValue.then(({name, value, description}) => {\n try {\n if (Constants.USE_EXIF && isExifGroupTag(name, value)) {\n return {\n __exif: Tags.read(decodeRawData(value), EXIF_OFFSET, includeUnknown).tags\n };\n } else if (Constants.USE_IPTC && isIptcGroupTag(name, value)) {\n return {\n __iptc: IptcTags.read(decodeRawData(value), 0, includeUnknown)\n };\n } else if (name && !isExifGroupTag(name, value) && !isIptcGroupTag(name, value)) {\n return {\n [name]: {\n value,\n description\n }\n };\n }\n } catch (error) {\n // Ignore the broken tag.\n }\n return {};\n }));\n } else {\n const {name, value, description} = nameAndValue;\n if (name) {\n tags[name] = {\n value,\n description\n };\n }\n }\n }\n\n return {\n readTags: tags,\n readTagsPromise: tagsPromises.length > 0 ? Promise.all(tagsPromises) : undefined\n };\n}\n\nfunction getNameAndValue(dataView, offset, length, type, async) {\n const keywordChars = [];\n const langChars = [];\n const translatedKeywordChars = [];\n let valueChars;\n let parsingState = STATE_KEYWORD;\n let compressionMethod = COMPRESSION_METHOD_NONE;\n\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n if (parsingState === STATE_COMPRESSION) {\n compressionMethod = getCompressionMethod({type, dataView, offset: offset + i});\n if (type === TYPE_ITXT) {\n i += COMPRESSION_SECTION_ITXT_EXTRA_BYTE;\n }\n parsingState = moveToNextState(type, parsingState);\n continue;\n } else if (parsingState === STATE_TEXT) {\n valueChars = new DataView(dataView.buffer.slice(offset + i, offset + length));\n break;\n }\n const byte = dataView.getUint8(offset + i);\n if (byte === 0) {\n parsingState = moveToNextState(type, parsingState);\n } else if (parsingState === STATE_KEYWORD) {\n keywordChars.push(byte);\n } else if (parsingState === STATE_LANG) {\n langChars.push(byte);\n } else if (parsingState === STATE_TRANSLATED_KEYWORD) {\n translatedKeywordChars.push(byte);\n }\n }\n\n if (compressionMethod !== COMPRESSION_METHOD_NONE && !async) {\n return {};\n }\n const decompressedValueChars = decompress(valueChars, compressionMethod, getEncodingFromType(type));\n if (decompressedValueChars instanceof Promise) {\n return decompressedValueChars\n .then((_decompressedValueChars) => constructTag(_decompressedValueChars, type, langChars, keywordChars))\n .catch(() => constructTag(''.split(''), type, langChars, keywordChars));\n }\n return constructTag(decompressedValueChars, type, langChars, keywordChars);\n}\n\nfunction getCompressionMethod({type, dataView, offset}) {\n if (type === TYPE_ITXT) {\n if (dataView.getUint8(offset) === COMPRESSION_FLAG_COMPRESSED) {\n return dataView.getUint8(offset + 1);\n }\n } else if (type === TYPE_ZTXT) {\n return dataView.getUint8(offset);\n }\n return COMPRESSION_METHOD_NONE;\n}\n\nfunction moveToNextState(type, parsingState) {\n if (parsingState === STATE_KEYWORD && [TYPE_ITXT, TYPE_ZTXT].includes(type)) {\n return STATE_COMPRESSION;\n }\n if (parsingState === STATE_COMPRESSION) {\n if (type === TYPE_ITXT) {\n return STATE_LANG;\n }\n return STATE_TEXT;\n }\n if (parsingState === STATE_LANG) {\n return STATE_TRANSLATED_KEYWORD;\n }\n return STATE_TEXT;\n}\n\nfunction getEncodingFromType(type) {\n if (type === TYPE_TEXT || type === TYPE_ZTXT) {\n return 'latin1';\n }\n return 'utf-8';\n}\n\nfunction constructTag(valueChars, type, langChars, keywordChars) {\n const value = getValue(valueChars);\n return {\n name: getName(type, langChars, keywordChars),\n value,\n description: type === TYPE_ITXT ? getDescription(valueChars) : value\n };\n}\n\nfunction getName(type, langChars, keywordChars) {\n const name = getStringValueFromArray(keywordChars);\n if (type === TYPE_TEXT || langChars.length === 0) {\n return name;\n }\n const lang = getStringValueFromArray(langChars);\n return `${name} (${lang})`;\n}\n\nfunction getValue(valueChars) {\n if (valueChars instanceof DataView) {\n return getStringFromDataView(valueChars, 0, valueChars.byteLength);\n }\n return valueChars;\n}\n\nfunction getDescription(valueChars) {\n return TagDecoder.decode('UTF-8', valueChars);\n}\n\nfunction isExifGroupTag(name, value) {\n return name.toLowerCase() === 'raw profile type exif' && value.substring(1, 5) === 'exif';\n}\n\nfunction isIptcGroupTag(name, value) {\n return name.toLowerCase() === 'raw profile type iptc' && value.substring(1, 5) === 'iptc';\n}\n\nfunction decodeRawData(value) {\n const parts = value.match(/\\n(exif|iptc)\\n\\s*\\d+\\n([\\s\\S]*)$/);\n return hexToDataView(parts[2].replace(/\\n/g, ''));\n}\n\nfunction hexToDataView(hex) {\n const dataView = new DataView(new ArrayBuffer(hex.length / 2));\n for (let i = 0; i < hex.length; i += 2) {\n dataView.setUint8(i / 2, parseInt(hex.substring(i, i + 2), 16));\n }\n return dataView;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {PNG_CHUNK_LENGTH_OFFSET, PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_DATA_OFFSET, PNG_CHUNK_TYPE_SIZE, TYPE_PHYS, TYPE_TIME} from './image-header-png.js';\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunkOffsets) {\n const tags = {};\n\n for (let i = 0; i < chunkOffsets.length; i++) {\n const chunkLength = Types.getLongAt(dataView, chunkOffsets[i] + PNG_CHUNK_LENGTH_OFFSET);\n const chunkType = getStringFromDataView(dataView, chunkOffsets[i] + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n\n if (chunkType === TYPE_PHYS) {\n tags['Pixels Per Unit X'] = getPixelsPerUnitX(dataView, chunkOffsets[i], chunkLength);\n tags['Pixels Per Unit Y'] = getPixelsPerUnitY(dataView, chunkOffsets[i], chunkLength);\n tags['Pixel Units'] = getPixelUnits(dataView, chunkOffsets[i], chunkLength);\n } else if (chunkType === TYPE_TIME) {\n tags['Modify Date'] = getModifyDate(dataView, chunkOffsets[i], chunkLength);\n }\n }\n\n return tags;\n}\n\nfunction getPixelsPerUnitX(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 0;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelsPerUnitY(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 4;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelUnits(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 8;\n const TAG_SIZE = 1;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: value === 1 ? 'meters' : 'Unknown'\n };\n}\n\nfunction getModifyDate(dataView, chunkOffset, chunkLength) {\n const TIME_TAG_SIZE = 7;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, 0, TIME_TAG_SIZE)) {\n return undefined;\n }\n\n const year = Types.getShortAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET);\n const month = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 2);\n const day = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 3);\n const hours = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 4);\n const minutes = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 5);\n const seconds = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 6);\n\n return {\n value: [year, month, day, hours, minutes, seconds],\n description: `${pad(year, 4)}-${pad(month, 2)}-${pad(day, 2)} ${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}`\n };\n}\n\nfunction tagFitsInBuffer(dataView, chunkOffset, chunkLength, tagOffset, tagSize) {\n return tagOffset + tagSize <= chunkLength && chunkOffset + PNG_CHUNK_DATA_OFFSET + tagOffset + tagSize <= dataView.byteLength;\n}\n\nfunction pad(number, size) {\n return `${'0'.repeat(size - ('' + number).length)}${number}`;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nconst IMAGE_WIDTH_OFFSET = 4;\nconst IMAGE_HEIGHT_OFFSET = 7;\n\n// https://developers.google.com/speed/webp/docs/riff_container#extended_file_format\nfunction read(dataView, chunkOffset) {\n const tags = {};\n\n const flags = Types.getByteAt(dataView, chunkOffset);\n\n tags['Alpha'] = getAlpha(flags);\n tags['Animation'] = getAnimation(flags);\n tags['ImageWidth'] = getThreeByteValue(dataView, chunkOffset + IMAGE_WIDTH_OFFSET);\n tags['ImageHeight'] = getThreeByteValue(dataView, chunkOffset + IMAGE_HEIGHT_OFFSET);\n\n return tags;\n}\n\nfunction getAlpha(flags) {\n const value = flags & 0x10;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getAnimation(flags) {\n const value = flags & 0x02;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getThreeByteValue(dataView, offset) {\n // Values are stored little-endian.\n const value = Types.getByteAt(dataView, offset)\n + 256 * Types.getByteAt(dataView, offset + 1)\n + 256 * 256 * Types.getByteAt(dataView, offset + 2)\n + 1; // Value is 1-based, i.e. a value of 7 means 8px.\n\n return {\n value,\n description: value + 'px'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// https://www.w3.org/Graphics/GIF/spec-gif87.txt\n// https://www.w3.org/Graphics/GIF/spec-gif89a.txt\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView) {\n return {\n 'GIF Version': getGifVersion(dataView),\n 'Image Width': getImageWidth(dataView),\n 'Image Height': getImageHeight(dataView),\n 'Global Color Map': getGlobalColorMap(dataView),\n 'Bits Per Pixel': getBitDepth(dataView),\n 'Color Resolution Depth': getColorResolution(dataView)\n };\n}\n\nfunction getGifVersion(dataView) {\n const OFFSET = 3;\n const SIZE = 3;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = getStringFromDataView(dataView, OFFSET, SIZE);\n return {\n value,\n description: value\n };\n}\n\nfunction getImageWidth(dataView) {\n const OFFSET = 6;\n const SIZE = 2;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = dataView.getUint16(OFFSET, true);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView) {\n const OFFSET = 8;\n const SIZE = 2;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = dataView.getUint16(OFFSET, true);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getGlobalColorMap(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = (byteValue & 0b10000000) >>> 7;\n return {\n value,\n description: value === 1 ? 'Yes' : 'No'\n };\n}\n\nfunction getColorResolution(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = ((byteValue & 0b01110000) >>> 4) + 1; // Zero-based.\n return {\n value,\n description: `${value} ${value === 1 ? 'bit' : 'bits'}`\n };\n}\n\nfunction getBitDepth(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = (byteValue & 0b00000111) + 1; // Zero-based.\n return {\n value,\n description: `${value} ${value === 1 ? 'bit' : 'bits'}`\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {deferInit, getBase64Image} from './utils.js';\n\n// https://exiftool.org/TagNames/EXIF.html#Compression\nconst COMPRESSION_JPEG = [6, 7, 99];\n\nexport default {\n get,\n};\n\nfunction get(dataView, thumbnailTags, tiffHeaderOffset) {\n if (hasJpegThumbnail(thumbnailTags)) {\n thumbnailTags.type = 'image/jpeg';\n const offset = tiffHeaderOffset + thumbnailTags.JPEGInterchangeFormat.value;\n thumbnailTags.image = dataView.buffer.slice(offset, offset + thumbnailTags.JPEGInterchangeFormatLength.value);\n deferInit(thumbnailTags, 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n // There is a small possibility of thumbnails in TIFF format but they are\n // not stored as a self-contained image file and would be much more\n // difficult to extract.\n // https://exiftool.org/forum/index.php?topic=3273.msg14778#msg14778\n\n return thumbnailTags;\n}\n\nfunction hasJpegThumbnail(tags) {\n return tags && ((tags.Compression === undefined) || (COMPRESSION_JPEG.includes(tags.Compression.value)))\n && tags.JPEGInterchangeFormat && tags.JPEGInterchangeFormat.value\n && tags.JPEGInterchangeFormatLength && tags.JPEGInterchangeFormatLength.value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n/**\n * Thrown when no Exif metadata was found for the given image.\n *\n * @param {string} message The error message.\n */\nfunction MetadataMissingError(message) {\n this.name = 'MetadataMissingError';\n this.message = message || 'No Exif data';\n this.stack = (new Error()).stack;\n}\n\nMetadataMissingError.prototype = new Error;\n\nexport default {\n MetadataMissingError,\n};\n","/**\n * ExifReader\n * http://github.com/mattiasw/exifreader\n * Copyright (C) 2011-2023 Mattias Wallander \n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/* global Buffer, __non_webpack_require__ */\n\nimport {objectAssign, dataUriToBuffer} from './utils.js';\nimport DataViewWrapper from './dataview.js';\nimport Constants from './constants.js';\nimport {getStringValueFromArray} from './utils.js';\nimport {getCalculatedGpsValue} from './tag-names-utils.js';\nimport ImageHeader from './image-header.js';\nimport Tags from './tags.js';\nimport MpfTags from './mpf-tags.js';\nimport FileTags from './file-tags.js';\nimport JfifTags from './jfif-tags.js';\nimport IptcTags from './iptc-tags.js';\nimport XmpTags from './xmp-tags.js';\nimport PhotoshopTags from './photoshop-tags.js';\nimport IccTags from './icc-tags.js';\nimport CanonTags from './canon-tags.js';\nimport PngFileTags from './png-file-tags.js';\nimport PngTextTags from './png-text-tags.js';\nimport PngTags from './png-tags.js';\nimport Vp8xTags from './vp8x-tags.js';\nimport GifFileTags from './gif-file-tags.js';\nimport Thumbnail from './thumbnail.js';\nimport exifErrors from './errors.js';\n\nexport default {\n load,\n loadView,\n errors: exifErrors,\n};\n\nexport const errors = exifErrors;\n\nexport function load(data, options = {}) {\n if (isFilePathOrURL(data)) {\n options.async = true;\n return loadFile(data, options).then((fileContents) => loadFromData(fileContents, options));\n }\n if (isBrowserFileObject(data)) {\n options.async = true;\n return loadFileObject(data).then((fileContents) => loadFromData(fileContents, options));\n }\n return loadFromData(data, options);\n}\n\nfunction isFilePathOrURL(data) {\n return typeof data === 'string';\n}\n\nfunction loadFile(filename, options) {\n if (/^\\w+:\\/\\//.test(filename)) {\n if (typeof fetch !== 'undefined') {\n return fetchRemoteFile(filename, options);\n }\n\n return nodeGetRemoteFile(filename, options);\n }\n\n if (isDataUri(filename)) {\n return Promise.resolve(dataUriToBuffer(filename));\n }\n\n return loadLocalFile(filename, options);\n}\n\nfunction fetchRemoteFile(url, {length} = {}) {\n const options = {method: 'GET'};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n return fetch(url, options).then((response) => response.arrayBuffer());\n}\n\nfunction nodeGetRemoteFile(url, {length} = {}) {\n return new Promise((resolve, reject) => {\n const options = {};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n\n const get = requireNodeGet(url);\n get(url, options, (response) => {\n if ((response.statusCode >= 200) && (response.statusCode <= 299)) {\n const data = [];\n response.on('data', (chunk) => data.push(Buffer.from(chunk)));\n response.on('error', (error) => reject(error));\n response.on('end', () => resolve(Buffer.concat(data)));\n } else {\n reject(`Could not fetch file: ${response.statusCode} ${response.statusMessage}`);\n response.resume();\n }\n }).on('error', (error) => reject(error));\n });\n}\n\nfunction requireNodeGet(url) {\n if (/^https:\\/\\//.test(url)) {\n return __non_webpack_require__('https').get;\n }\n return __non_webpack_require__('http').get;\n}\n\nfunction isDataUri(filename) {\n return /^data:[^;,]*(;base64)?,/.test(filename);\n}\n\nfunction loadLocalFile(filename, {length} = {}) {\n return new Promise((resolve, reject) => {\n const fs = requireNodeFs();\n fs.open(filename, (error, fd) => {\n if (error) {\n reject(error);\n } else {\n fs.stat(filename, (error, stat) => {\n if (error) {\n reject(error);\n } else {\n const size = Math.min(stat.size, length !== undefined ? length : stat.size);\n const buffer = Buffer.alloc(size);\n const options = {\n buffer,\n length: size\n };\n fs.read(fd, options, (error) => {\n if (error) {\n reject(error);\n } else {\n fs.close(fd, (error) => {\n if (error) {\n console.warn(`Could not close file ${filename}:`, error); // eslint-disable-line no-console\n }\n resolve(buffer);\n });\n }\n });\n }\n });\n }\n });\n });\n}\n\nfunction requireNodeFs() {\n try {\n return __non_webpack_require__('fs');\n } catch (error) {\n return undefined;\n }\n}\n\nfunction isBrowserFileObject(data) {\n return (typeof window !== 'undefined') && (typeof File !== 'undefined') && (data instanceof File);\n}\n\nfunction loadFileObject(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => resolve(readerEvent.target.result);\n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(file);\n });\n}\n\nfunction loadFromData(data, options) {\n if (isNodeBuffer(data)) {\n // File data read in Node can share the underlying buffer with other\n // data. Therefore it's safest to get a new one to avoid weird bugs.\n data = (new Uint8Array(data)).buffer;\n }\n return loadView(getDataView(data), options);\n}\n\nfunction isNodeBuffer(data) {\n try {\n return Buffer.isBuffer(data);\n } catch (error) {\n return false;\n }\n}\n\nfunction getDataView(data) {\n try {\n return new DataView(data);\n } catch (error) {\n return new DataViewWrapper(data);\n }\n}\n\nexport function loadView(\n dataView,\n {expanded = false, async = false, includeUnknown = false} = {expanded: false, async: false, includeUnknown: false}\n) {\n let foundMetaData = false;\n let tags = {};\n const tagsPromises = [];\n\n const {\n fileType,\n fileDataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset,\n pngHeaderOffset,\n pngTextChunks,\n pngChunkOffsets,\n vp8xChunkOffset,\n gifHeaderOffset\n } = ImageHeader.parseAppMarkers(dataView, async);\n\n if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) {\n foundMetaData = true;\n const readTags = FileTags.read(dataView, fileDataOffset);\n if (expanded) {\n tags.file = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_JFIF && hasJfifData(jfifDataOffset)) {\n foundMetaData = true;\n const readTags = JfifTags.read(dataView, jfifDataOffset);\n if (expanded) {\n tags.jfif = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_EXIF && hasExifData(tiffHeaderOffset)) {\n foundMetaData = true;\n const {tags: readTags, byteOrder} = Tags.read(dataView, tiffHeaderOffset, includeUnknown);\n if (readTags.Thumbnail) {\n tags.Thumbnail = readTags.Thumbnail;\n delete readTags.Thumbnail;\n }\n\n if (expanded) {\n tags.exif = readTags;\n addGpsGroup(tags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n\n if (Constants.USE_TIFF && Constants.USE_IPTC && readTags['IPTC-NAA'] && !hasIptcData(iptcDataOffset)) {\n const readIptcTags = IptcTags.read(readTags['IPTC-NAA'].value, 0, includeUnknown);\n if (expanded) {\n tags.iptc = readIptcTags;\n } else {\n tags = objectAssign({}, tags, readIptcTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_XMP && readTags['ApplicationNotes'] && !hasXmpData(xmpChunks)) {\n const readXmpTags = XmpTags.read(getStringValueFromArray(readTags['ApplicationNotes'].value));\n if (expanded) {\n tags.xmp = readXmpTags;\n } else {\n delete readXmpTags._raw;\n tags = objectAssign({}, tags, readXmpTags);\n }\n }\n\n if (Constants.USE_PHOTOSHOP && readTags['ImageSourceData']) {\n const readPhotoshopTags = PhotoshopTags.read(readTags['PhotoshopSettings'].value, includeUnknown);\n if (expanded) {\n tags.photoshop = readPhotoshopTags;\n } else {\n tags = objectAssign({}, tags, readPhotoshopTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_ICC && readTags['ICC_Profile'] && !hasIccData(iccChunks)) {\n const readIccTags = IccTags.read(\n readTags['ICC_Profile'].value,\n [{\n offset: 0,\n length: readTags['ICC_Profile'].value.length,\n chunkNumber: 1,\n chunksTotal: 1\n }]\n );\n if (expanded) {\n tags.icc = readIccTags;\n } else {\n tags = objectAssign({}, tags, readIccTags);\n }\n }\n\n if (Constants.USE_MAKER_NOTES) {\n if (hasCanonData(readTags)) {\n const readCanonTags = CanonTags.read(dataView, tiffHeaderOffset, readTags['MakerNote'].__offset, byteOrder, includeUnknown);\n if (expanded) {\n tags.makerNotes = readCanonTags;\n } else {\n tags = objectAssign({}, tags, readCanonTags);\n }\n }\n }\n\n if (readTags['MakerNote']) {\n delete readTags['MakerNote'].__offset;\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_IPTC && hasIptcData(iptcDataOffset)) {\n foundMetaData = true;\n const readTags = IptcTags.read(dataView, iptcDataOffset, includeUnknown);\n if (expanded) {\n tags.iptc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_XMP && hasXmpData(xmpChunks)) {\n foundMetaData = true;\n const readTags = XmpTags.read(dataView, xmpChunks);\n if (expanded) {\n tags.xmp = readTags;\n } else {\n delete readTags._raw;\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if ((Constants.USE_JPEG || Constants.USE_WEBP) && Constants.USE_ICC && hasIccData(iccChunks)) {\n foundMetaData = true;\n const readTags = IccTags.read(dataView, iccChunks, async);\n if (readTags instanceof Promise) {\n tagsPromises.push(readTags.then(addIccTags));\n } else {\n addIccTags(readTags);\n }\n }\n\n if (Constants.USE_MPF && hasMpfData(mpfDataOffset)) {\n foundMetaData = true;\n const readMpfTags = MpfTags.read(dataView, mpfDataOffset, includeUnknown);\n if (expanded) {\n tags.mpf = readMpfTags;\n } else {\n tags = objectAssign({}, tags, readMpfTags);\n }\n }\n\n if (Constants.USE_PNG && Constants.USE_PNG_FILE && hasPngFileData(pngHeaderOffset)) {\n foundMetaData = true;\n const readTags = PngFileTags.read(dataView, pngHeaderOffset);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngFile = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_PNG && hasPngTextData(pngTextChunks)) {\n foundMetaData = true;\n const {readTags, readTagsPromise} = PngTextTags.read(dataView, pngTextChunks, async, includeUnknown);\n addPngTextTags(readTags);\n if (readTagsPromise) {\n tagsPromises.push(readTagsPromise.then((tagList) => tagList.forEach(addPngTextTags)));\n }\n }\n\n if (Constants.USE_PNG && hasPngData(pngChunkOffsets)) {\n foundMetaData = true;\n const readTags = PngTags.read(dataView, pngChunkOffsets);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_WEBP && hasVp8xData(vp8xChunkOffset)) {\n foundMetaData = true;\n const readTags = Vp8xTags.read(dataView, vp8xChunkOffset);\n if (expanded) {\n tags.riff = !tags.riff ? readTags : objectAssign({}, tags.riff, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_GIF && hasGifFileData(gifHeaderOffset)) {\n foundMetaData = true;\n const readTags = GifFileTags.read(dataView, gifHeaderOffset);\n if (expanded) {\n tags.gif = !tags.gif ? readTags : objectAssign({}, tags.gif, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP)\n && Constants.USE_EXIF\n && Constants.USE_THUMBNAIL\n && Thumbnail.get(dataView, tags.Thumbnail, tiffHeaderOffset);\n if (thumbnail) {\n foundMetaData = true;\n tags.Thumbnail = thumbnail;\n } else {\n delete tags.Thumbnail;\n }\n\n if (fileType) {\n if (expanded) {\n if (!tags.file) {\n tags.file = {};\n }\n tags.file.FileType = fileType;\n } else {\n tags.FileType = fileType;\n }\n foundMetaData = true;\n }\n\n if (!foundMetaData) {\n throw new exifErrors.MetadataMissingError();\n }\n\n if (async) {\n return Promise.all(tagsPromises).then(() => tags);\n }\n return tags;\n\n function addIccTags(readTags) {\n if (expanded) {\n tags.icc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n function addPngTextTags(readTags) {\n if (expanded) {\n for (const group of ['exif', 'iptc']) {\n const groupKey = `__${group}`;\n if (readTags[groupKey]) {\n tags[group] = !tags[group] ? readTags[groupKey] : objectAssign({}, tags.exif, readTags[groupKey]);\n delete readTags[groupKey];\n }\n }\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngText = !tags.pngText ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign(\n {},\n tags,\n readTags.__exif ? readTags.__exif : {},\n readTags.__iptc ? readTags.__iptc : {},\n readTags\n );\n delete tags.__exif;\n delete tags.__iptc;\n }\n }\n}\n\nfunction hasFileData(fileDataOffset) {\n return fileDataOffset !== undefined;\n}\n\nfunction hasJfifData(jfifDataOffset) {\n return jfifDataOffset !== undefined;\n}\n\nfunction hasExifData(tiffHeaderOffset) {\n return tiffHeaderOffset !== undefined;\n}\n\nfunction addGpsGroup(tags) {\n if (tags.exif) {\n if (tags.exif.GPSLatitude && tags.exif.GPSLatitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Latitude = getCalculatedGpsValue(tags.exif.GPSLatitude.value);\n if (tags.exif.GPSLatitudeRef.value.join('') === 'S') {\n tags.gps.Latitude = -tags.gps.Latitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSLongitude && tags.exif.GPSLongitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Longitude = getCalculatedGpsValue(tags.exif.GPSLongitude.value);\n if (tags.exif.GPSLongitudeRef.value.join('') === 'W') {\n tags.gps.Longitude = -tags.gps.Longitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSAltitude && tags.exif.GPSAltitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Altitude = tags.exif.GPSAltitude.value[0] / tags.exif.GPSAltitude.value[1];\n if (tags.exif.GPSAltitudeRef.value === 1) {\n tags.gps.Altitude = -tags.gps.Altitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n }\n}\n\nfunction hasIptcData(iptcDataOffset) {\n return iptcDataOffset !== undefined;\n}\n\nfunction hasXmpData(xmpChunks) {\n return Array.isArray(xmpChunks) && xmpChunks.length > 0;\n}\n\nfunction hasIccData(iccDataOffsets) {\n return Array.isArray(iccDataOffsets) && iccDataOffsets.length > 0;\n}\n\nfunction hasCanonData(tags) {\n return tags['Make'] && tags['Make'].value && Array.isArray(tags['Make'].value) && tags['Make'].value[0] === 'Canon'\n && tags['MakerNote'] && tags['MakerNote'].__offset;\n}\n\nfunction hasMpfData(mpfDataOffset) {\n return mpfDataOffset !== undefined;\n}\n\nfunction hasPngFileData(pngFileDataOffset) {\n return pngFileDataOffset !== undefined;\n}\n\nfunction hasPngTextData(pngTextChunks) {\n return pngTextChunks !== undefined;\n}\n\nfunction hasPngData(pngChunkOffsets) {\n return pngChunkOffsets !== undefined;\n}\n\nfunction hasVp8xData(vp8xChunkOffset) {\n return vp8xChunkOffset !== undefined;\n}\n\nfunction hasGifFileData(gifHeaderOffset) {\n return gifHeaderOffset !== undefined;\n}\n"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DataView","buffer","_classCallCheck","_typeof","undefined","length","readUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt32LE","readInt32BE","bufferTypeIsUnsupported","Error","byteLength","offset","littleEndian","getDataView","data","byteOffset","error","DataViewWrapper","getStringFromDataView","dataView","chars","i","push","getUint8","getStringValueFromArray","getNullTerminatedStringFromDataView","char","getUnicodeStringFromDataView","getUint16","pop","getPascalStringFromDataView","size","charArray","map","charCode","String","fromCharCode","join","objectAssign","arguments","property","deferInit","object","initializer","initialized","configurable","apply","writable","getBase64Image","image","btoa","Array","reduce","Uint8Array","byte","Buffer","from","toString","strRepeat","string","num","COMPRESSION_METHOD_NONE","decompress","compressionMethod","encoding","returnType","DecompressionStream","decompressionStream","decompressedStream","Blob","stream","pipeThrough","Response","arrayBuffer","then","TextDecoder","decode","Promise","reject","concat","USE_FILE","USE_JFIF","USE_PNG_FILE","USE_EXIF","USE_IPTC","USE_XMP","USE_ICC","USE_MPF","USE_PHOTOSHOP","USE_THUMBNAIL","USE_TIFF","USE_JPEG","USE_PNG","USE_HEIC","USE_AVIF","USE_WEBP","USE_GIF","USE_MAKER_NOTES","getStringValue","getEncodedString","slice","getCalculatedGpsValue","LITTLE_ENDIAN","tiffHeaderOffset","MIN_JPEG_DATA_BUFFER_LENGTH","JPEG_ID","JPEG_ID_SIZE","APP_ID_OFFSET","APP_MARKER_SIZE","JFIF_DATA_OFFSET","TIFF_HEADER_OFFSET","IPTC_DATA_OFFSET","XMP_DATA_OFFSET","XMP_EXTENDED_DATA_OFFSET","APP2_ICC_DATA_OFFSET","MPF_DATA_OFFSET","APP2_ICC_IDENTIFIER","ICC_CHUNK_NUMBER_OFFSET","ICC_TOTAL_CHUNKS_OFFSET","APP2_MPF_IDENTIFIER","SOF0_MARKER","SOF2_MARKER","DHT_MARKER","DQT_MARKER","DRI_MARKER","SOS_MARKER","APP0_MARKER","APP1_MARKER","APP2_MARKER","APP13_MARKER","APP15_MARKER","COMMENT_MARKER","FILL_BYTE","APP0_JFIF_IDENTIFIER","APP1_EXIF_IDENTIFIER","APP1_XMP_IDENTIFIER","APP1_XMP_EXTENDED_IDENTIFIER","APP13_IPTC_IDENTIFIER","isSOF0Marker","appMarkerPosition","isSOF2Marker","isApp2ICCMarker","markerIdLength","isApp2MPFMarker","isApp0JfifMarker","isApp1ExifMarker","isApp1XmpMarker","isXmpIdentifier","isApp1ExtendedXmpMarker","isExtendedXmpIdentifier","getXmpChunkDetails","fieldLength","dataOffset","getExtendedXmpChunkDetails","isApp13PhotoshopMarker","isAppMarker","appMarker","isFillByte","PNG_ID","PNG_CHUNK_LENGTH_SIZE","PNG_CHUNK_TYPE_SIZE","PNG_CHUNK_LENGTH_OFFSET","PNG_CHUNK_TYPE_OFFSET","PNG_CHUNK_DATA_OFFSET","PNG_XMP_PREFIX","TYPE_TEXT","TYPE_ITXT","TYPE_ZTXT","TYPE_PHYS","TYPE_TIME","TYPE_EXIF","TYPE_ICCP","isPngImageHeaderChunk","isPngXmpChunk","isPngTextChunk","async","chunkType","isPngExifChunk","isPngIccpChunk","isPngChunk","SUPPORTED_PNG_CHUNK_TYPES","includes","getPngXmpDataOffset","numberOfNullSeparators","parseIccHeader","profileName","compressedProfileOffset","getItems","version","offsets","sizes","offsetSize","lengthSize","indexSize","itemCount","items","item","extents","itemId","getItemId","constructionMethod","dataReferenceIndex","baseOffset","getVariableSizedValue","extentCount","j","extent","extentIndex","getExtentIndex","extentOffset","extentLength","getUint32","console","warn","get64BitValue","ITEM_INFO_TYPE_EXIF","ITEM_INFO_TYPE_MIME","parseBox","_getBoxLength","boxLength","extendsToEndOfFile","contentOffset","hasExtendedSize","hasEmptyHighBits","getBoxLength","type","majorBrand","parseFileTypeBox","startOffset","subBoxes","parseSubBoxes","parseItemPropertiesBox","properties","parseItemPropertyContainerBox","icc","parseIcc","parseColorInformationBox","parseMetadataBox","_getItemLocationBoxOf","baseOffsetSize","getItemLocationBoxOffsetsAndSizes","getIndexSize","getItemCount","parseItemLocationBox","_getItemInformationBo","entryCount","itemInfos","getItemInformationBoxOffsetsAndSizes","parseItemInformationBox","entry","itemProtectionIndex","itemName","itemType","contentType","contentEncoding","itemUri","parseItemInformationEntryBox","findOffsets","Constants","metaBox","box","findMetaBox","exifItemId","find","itemInfo","findIinfExifItemId","ilocItem","findIlocItem","exifOffset","getTiffHeaderOffset","findExifOffset","xmpChunks","xmpItemId","findIinfXmpItemId","ilocItemExtent","findXmpChunks","iccChunks","findIccChunks","hasAppMarkers","colorType","chunkNumber","chunksTotal","ACCEPTED_ITEM_INFO_TYPES","currentOffset","indexOf","GIF_SIGNATURE_SIZE","GIF_SIGNATURES","XML_MARKER_OFFSET","XML_MARKER","parseAppMarkers","ByteOrder","hasTiffMarker","Tiff","addFileType","Jpeg","sof0DataOffset","sof2DataOffset","jfifDataOffset","iptcDataOffset","mpfDataOffset","iccDataOffset","iccDataLength","iccChunkNumber","iccChunksTotal","fileDataOffset","Png","pngHeaderOffset","pngTextChunks","chunkDataLength","iccHeaderOffset","_parseIccHeader","pngChunkOffsets","headerBox","Heic","Avif","RIFF_ID","WEBP_MARKER","Webp","vp8xChunkOffset","chunkId","chunkSize","EXIF_IDENTIFIER","Gif","gifHeaderOffset","Xml","fileType","fileTypeDescription","description","ApertureValue","Math","pow","sqrt","toFixed","ColorSpace","ComponentsConfiguration","character","Contrast","CustomRendered","ExposureMode","ExposureProgram","ExposureTime","decimal","Number","isInteger","round","FNumber","FocalLength","FocalPlaneResolutionUnit","LightSource","MeteringMode","ResolutionUnit","Saturation","SceneCaptureType","Sharpness","ShutterSpeedValue","denominator","WhiteBalance","XResolution","YResolution","name","TagNamesCommon","values","formats","isArray","sample","ref","_ref","_ref2","test","status","mode","tagNames0thExifIfds","TagNames0thIfd","x","y","focalLengthFrom","parseFloat","focalLengthTo","focalLengths","maxAperture","IFD_TYPE_0TH","IFD_TYPE_EXIF","IFD_TYPE_INTEROPERABILITY","IFD_TYPE_CANON","_defineProperty","TagNamesGpsIfd","TagNamesInteroperabilityIfd","TagNamesMpfIfd","typeSizes","tagTypes","getAsciiValue","getByteAt","getAsciiAt","getShortAt","byteOrder","getLongAt","getRationalAt","getUndefinedAt","getSlongAt","getSrationalAt","getIfdPointerAt","getTypeSize","typeName","getInt32","getTagValueAt","Types","get0thIfdOffset","readIfd","ifdType","includeUnknown","FIELD_COUNT_SIZE","tags","numberOfFields","getNumberOfFields","fieldIndex","tag","readTag","id","__offset","nextIfdOffset","tagValue","tagValueOffset","TAG_TYPE_OFFSET","TAG_COUNT_OFFSET","TAG_VALUE_OFFSET","tagCode","tagType","tagCount","TagNames","tagValueFitsInOffsetSlot","getTagValue","tagValueFitsInDataView","asciiValue","decodeURIComponent","escape","decodeAsciiValue","splitNullSeparatedAsciiString","tagName","tagDescription","getDescriptionFromTagValue","count","valueIndex","EXIF_IFD_POINTER_KEY","GPS_INFO_IFD_POINTER_KEY","INTEROPERABILITY_IFD_POINTER_KEY","read","read0thIfd","readInteroperabilityIfd","readGpsIfd","readExifIfd","images","ceil","ENTRY_SIZE","attributes","getImageNumberValue","getImageFlags","getImageFormat","getImageType","imageSize","imageOffset","getImageOffset","dependentImage1EntryNumber","dependentImage2EntryNumber","addMpfImages","entries","flags","flagsDescription","imageFormat","imageIndex","mpEntry","isFirstIndividualImage","getLength","numberOfColorComponents","OFFSET","getNumberOfColorComponents","getDataPrecision","getImageHeight","getImageWidth","getSubsampling","components","componentOffset","getComponentIds","getSamplingType","ids","compontent","types","thumbnailWidth","getThumbnailWidth","thumbnailHeight","getThumbnailHeight","getVersion","getResolutionUnit","getXResolution","getYResolution","thumbnail","thumbnailLength","getThumbnail","majorVersion","minorVersion","getResolutionUnitDescription","getCreationDate","getCreationTime","getEncodingName","parts","split","stringValue","character0","charAt","character1","parseInt","bits","duration","substr","intValue","formatVersions","objectDataPreviewFileFormat","n","date","time","parsedTime","Decoder","parseTags","_getNaaResourceBlock","BYTES_8BIM_SIZE","resourceBlock","getResourceBlock","isNaaResourceBlock","naaBlock","getBlockPadding","getNaaResourceBlock","endOfBlockOffset","_readTag","tagSize","leadByteIsMissing","IptcTagNames","getTagName","getTagDescription","tagIsRepeatable","tagContainsEncoding","tagIsName","hasDynamicName","hasDescriptionProperty","tagValueIsText","TagDecoder","fraction","calculateGPSValue","substring","parseNumber","numbers","number","charCodeAt","isFraction","func","_value$split2","degreesString","minutesString","degrees","minutes","isNaN","chunks","readTags","_extractCompleteChunk2","completeChunks","combineChunks","extractCompleteChunks","standardXmp","extendedXmp","hasStandardTags","hasExtendedTags","_raw","totalLength","chunk","combinedChunks","set","chunkDataView","_getDocument","domParser","DOMParser","_non_webpack_require","__non_webpack_require__","onError","onErrorStopParsing","xmlString","doc","parseFromString","replace","documentElement","nodeName","textContent","raw","getDocument","parseXMPObject","convertToObject","getRDF","node","childNodes","nodes","isTopNode","elements","getChildNodes","nodeValue","getTextValue","forEach","isElement","nodeElement","getAttributes","getElementFromNode","getElementsFromNodes","element","xmpObject","parseNodeAttributesAsTags","parseNodeChildrenAsTags","isTagAttribute","getLocalName","getDescription","isNamespaceDefinition","arrayDescription","getDescriptionOfArray","XmpTagNames","descriptions","getClearTextKey","getDescriptionOfObject","children","parseNodeAsTag","isDuplicateTag","parseNodeAsSimpleValue","parseNodeAsDuplicateTag","trim","isEmptyResourceTag","hasNestedSimpleRdfDescription","parseNodeAsSimpleRdfDescription","hasNestedStructureRdfDescription","parseNodeAsStructureRdfDescription","isCompactStructure","parseNodeAsCompactStructure","getArrayChild","parseNodeAttributes","parseArrayValue","parseNodeAsArray","parseNodeChildrenAsAttributes","getURIValue","parseRdfValue","keys","paths","TYPE_SIZE","PATH_RECORD_TYPES","path","JSON","stringify","parseBezierKnot","getFixedPointNumber","parsePathPoint","vertical","binaryPoint","sign","integer","parseFloatRadix","bytes","signature","SIGNATURE_SIZE","tagId","_getTagName","TAG_ID_SIZE","tagNameSize","resourceSize","RESOURCE_LENGTH_SIZE","SIGNATURE","valueDataView","_getPascalStringFromD2","stringSize","iccTags","iccProfile","toCompany","toLowerCase","year","month","day","hours","seconds","Date","UTC","parseDate","toISOString","iccData","catch","readCompressedIcc","totalIccProfileLength","sum","iccBinaryData","getBuffer","_loop","iccDataChunk","chunkData","readIcc","PROFILE_HEADER_LENGTH","ICC_TAG_COUNT_OFFSET","ICC_SIGNATURE","TAG_TYPE_DESC","TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE","TAG_TYPE_TEXT","TAG_TYPE_SIGNATURE","TAG_TABLE_SINGLE_TAG_DATA","hasTagsData","tagHeaderOffset","iccProfileKeys","profileEntry","sliceToString","iccDoesNotHaveTagCount","tagSignature","tagOffset","tagValueSize","addTag","numRecords","recordSize","val","recordNum","languageCode","countryCode","textLength","textOffset","text","valObj","valIndex","shotInfoData","autoRotate","SHOT_INFO_AUTO_ROTATE","parseShotInfo","getBitDepth","getColorType","getCompression","getFilter","getInterlace","tagsPromises","_pngTextChunks$i","nameAndValue","getNameAndValue","isExifGroupTag","__exif","Tags","decodeRawData","EXIF_OFFSET","isIptcGroupTag","__iptc","IptcTags","readTagsPromise","all","STATE_KEYWORD","STATE_COMPRESSION","STATE_LANG","STATE_TRANSLATED_KEYWORD","STATE_TEXT","COMPRESSION_SECTION_ITXT_EXTRA_BYTE","COMPRESSION_FLAG_COMPRESSED","valueChars","keywordChars","langChars","translatedKeywordChars","parsingState","moveToNextState","getCompressionMethod","decompressedValueChars","getEncodingFromType","_decompressedValueChars","constructTag","_ref3","getValue","getName","lang","hex","ArrayBuffer","setUint8","hexToDataView","match","chunkOffsets","chunkLength","getPixelsPerUnitX","getPixelsPerUnitY","getPixelUnits","getModifyDate","chunkOffset","tagFitsInBuffer","pad","repeat","getAlpha","getAnimation","getThreeByteValue","IMAGE_WIDTH_OFFSET","IMAGE_HEIGHT_OFFSET","getGifVersion","getGlobalColorMap","getColorResolution","COMPRESSION_JPEG","thumbnailTags","Compression","JPEGInterchangeFormat","JPEGInterchangeFormatLength","MetadataMissingError","message","stack","load","loadView","errors","exifErrors","file","options","isFilePathOrURL","filename","fetch","url","method","headers","range","response","fetchRemoteFile","resolve","requireNodeGet","statusCode","on","statusMessage","resume","nodeGetRemoteFile","isDataUri","dataUri","atob","decodedData","dataUriToBuffer","fs","requireNodeFs","open","fd","stat","min","alloc","close","loadLocalFile","loadFile","fileContents","loadFromData","window","File","isBrowserFileObject","reader","FileReader","onload","readerEvent","target","result","onerror","readAsArrayBuffer","isBuffer","isNodeBuffer","_ref4","expanded","_ref4$expanded","_ref4$async","_ref4$includeUnknown","foundMetaData","_ImageHeader$parseApp","ImageHeader","hasFileData","FileTags","hasJfifData","JfifTags","jfif","hasExifData","_Tags$read","Thumbnail","exif","GPSLatitude","GPSLatitudeRef","gps","Latitude","GPSLongitude","GPSLongitudeRef","Longitude","GPSAltitude","GPSAltitudeRef","Altitude","addGpsGroup","hasIptcData","readIptcTags","iptc","hasXmpData","readXmpTags","XmpTags","xmp","readPhotoshopTags","PhotoshopTags","photoshop","hasIccData","readIccTags","IccTags","hasCanonData","readCanonTags","CanonTags","makerNotes","addIccTags","hasMpfData","readMpfTags","MpfTags","mpf","PngFileTags","png","pngFile","hasPngTextData","_PngTextTags$read","PngTextTags","addPngTextTags","tagList","hasPngData","PngTags","hasVp8xData","Vp8xTags","riff","hasGifFileData","GifFileTags","gif","FileType","_i","_arr","group","groupKey","pngText","iccDataOffsets"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"exif-reader.js","mappings":"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","sources":["webpack://ExifReader/webpack/universalModuleDefinition","webpack://ExifReader/webpack/bootstrap","webpack://ExifReader/webpack/runtime/define property getters","webpack://ExifReader/webpack/runtime/hasOwnProperty shorthand","webpack://ExifReader/webpack/runtime/make namespace object","webpack://ExifReader/./src/dataview.js","webpack://ExifReader/./src/utils.js","webpack://ExifReader/./src/constants.js","webpack://ExifReader/./src/tag-names-utils.js","webpack://ExifReader/./src/byte-order.js","webpack://ExifReader/./src/image-header-jpeg.js","webpack://ExifReader/./src/image-header-png.js","webpack://ExifReader/./src/image-header-iso-bmff-iloc.js","webpack://ExifReader/./src/image-header-iso-bmff-utils.js","webpack://ExifReader/./src/image-header-iso-bmff.js","webpack://ExifReader/./src/image-header-heic.js","webpack://ExifReader/./src/image-header-gif.js","webpack://ExifReader/./src/xml.js","webpack://ExifReader/./src/image-header.js","webpack://ExifReader/./src/image-header-tiff.js","webpack://ExifReader/./src/image-header-avif.js","webpack://ExifReader/./src/image-header-webp.js","webpack://ExifReader/./src/tag-names-common.js","webpack://ExifReader/./src/tag-names-0th-ifd.js","webpack://ExifReader/./src/tag-names-gps-ifd.js","webpack://ExifReader/./src/tag-names-interoperability-ifd.js","webpack://ExifReader/./src/tag-names-mpf-ifd.js","webpack://ExifReader/./src/tag-names.js","webpack://ExifReader/./src/tag-names-exif-ifd.js","webpack://ExifReader/./src/tag-names-canon-ifd.js","webpack://ExifReader/./src/types.js","webpack://ExifReader/./src/tags-helpers.js","webpack://ExifReader/./src/tags.js","webpack://ExifReader/./src/mpf-tags.js","webpack://ExifReader/./src/file-tags.js","webpack://ExifReader/./src/jfif-tags.js","webpack://ExifReader/./src/iptc-tag-names.js","webpack://ExifReader/./src/text-decoder.js","webpack://ExifReader/./src/tag-decoder.js","webpack://ExifReader/./src/iptc-tags.js","webpack://ExifReader/./src/xmp-tag-names.js","webpack://ExifReader/./src/xmp-tags.js","webpack://ExifReader/./src/dom-parser.js","webpack://ExifReader/./src/photoshop-tag-names.js","webpack://ExifReader/./src/photoshop-tags.js","webpack://ExifReader/./src/icc-tag-names.js","webpack://ExifReader/./src/icc-tags.js","webpack://ExifReader/./src/canon-tags.js","webpack://ExifReader/./src/png-file-tags.js","webpack://ExifReader/./src/png-text-tags.js","webpack://ExifReader/./src/png-tags.js","webpack://ExifReader/./src/vp8x-tags.js","webpack://ExifReader/./src/gif-file-tags.js","webpack://ExifReader/./src/thumbnail.js","webpack://ExifReader/./src/errors.js","webpack://ExifReader/./src/exif-reader.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ExifReader\"] = factory();\n\telse\n\t\troot[\"ExifReader\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export default class DataView {\n constructor(buffer) {\n if (bufferTypeIsUnsupported(buffer)) {\n throw new Error('DataView: Passed buffer type is unsupported.');\n }\n\n this.buffer = buffer;\n this.byteLength = this.buffer.length;\n }\n\n getUint8(offset) {\n return this.buffer.readUInt8(offset);\n }\n\n getUint16(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt16LE(offset);\n }\n return this.buffer.readUInt16BE(offset);\n }\n\n getUint32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt32LE(offset);\n }\n return this.buffer.readUInt32BE(offset);\n }\n\n getInt32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readInt32LE(offset);\n }\n return this.buffer.readInt32BE(offset);\n }\n}\n\nfunction bufferTypeIsUnsupported(buffer) {\n return typeof buffer !== 'object'\n || buffer.length === undefined\n || buffer.readUInt8 === undefined\n || buffer.readUInt16LE === undefined\n || buffer.readUInt16BE === undefined\n || buffer.readUInt32LE === undefined\n || buffer.readUInt32BE === undefined\n || buffer.readInt32LE === undefined\n || buffer.readInt32BE === undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport DataViewWrapper from './dataview.js';\n\nexport function getDataView(data, byteOffset, byteLength) {\n try {\n return new DataView(data, byteOffset, byteLength);\n } catch (error) {\n return new DataViewWrapper(data, byteOffset, byteLength);\n }\n}\n\nexport function getStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n chars.push(dataView.getUint8(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getNullTerminatedStringFromDataView(dataView, offset) {\n const chars = [];\n let i = 0;\n while (offset + i < dataView.byteLength) {\n const char = dataView.getUint8(offset + i);\n if (char === 0) {\n break;\n }\n chars.push(char);\n i++;\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getUnicodeStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i += 2) {\n chars.push(dataView.getUint16(offset + i));\n }\n if (chars[chars.length - 1] === 0) {\n chars.pop();\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getPascalStringFromDataView(dataView, offset) {\n const size = dataView.getUint8(offset);\n const string = getStringFromDataView(dataView, offset + 1, size);\n return [size, string];\n}\n\nexport function getStringValueFromArray(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getCharacterArray(string) {\n return string.split('').map((character) => character.charCodeAt(0));\n}\n\nexport function objectAssign() {\n for (let i = 1; i < arguments.length; i++) {\n for (const property in arguments[i]) {\n arguments[0][property] = arguments[i][property];\n }\n }\n\n return arguments[0];\n}\n\nexport function deferInit(object, key, initializer) {\n let initialized = false;\n Object.defineProperty(object, key, {\n get() {\n if (!initialized) {\n initialized = true;\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value: initializer.apply(object),\n writable: true\n });\n }\n return object[key];\n },\n configurable: true,\n enumerable: true\n });\n}\n\nexport function getBase64Image(image) {\n if (typeof btoa !== 'undefined') {\n if (typeof image === 'string') {\n // This only happens during the build tests using Node 16+ (npm run test:build).\n return btoa(image);\n }\n // IE11- does not implement reduce on the Uint8Array prototype.\n return btoa(Array.prototype.reduce.call(new Uint8Array(image), (data, byte) => data + String.fromCharCode(byte), ''));\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(image).toString('base64'); // eslint-disable-line no-undef\n }\n return (new Buffer(image)).toString('base64'); // eslint-disable-line no-undef\n}\n\nexport function dataUriToBuffer(dataUri) {\n const data = dataUri.substring(dataUri.indexOf(',') + 1);\n\n if (dataUri.indexOf(';base64') !== -1) {\n if (typeof atob !== 'undefined') {\n return Uint8Array.from(atob(data), (char) => char.charCodeAt(0)).buffer;\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(data, 'base64'); // eslint-disable-line no-undef\n }\n return new Buffer(data, 'base64'); // eslint-disable-line no-undef\n }\n\n const decodedData = decodeURIComponent(data);\n if (typeof Buffer !== 'undefined') {\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(decodedData); // eslint-disable-line no-undef\n }\n return new Buffer(decodedData); // eslint-disable-line no-undef\n }\n return Uint8Array.from(decodedData, (char) => char.charCodeAt(0)).buffer;\n}\n\nexport function padStart(string, length, character) {\n const padding = strRepeat(character, length - string.length);\n return padding + string;\n}\n\nexport function parseFloatRadix(string, radix) {\n return parseInt(string.replace('.', ''), radix)\n / Math.pow(radix, (string.split('.')[1] || '').length);\n}\n\nexport function strRepeat(string, num) {\n return new Array(num + 1).join(string);\n}\n\nexport const COMPRESSION_METHOD_NONE = undefined;\nexport const COMPRESSION_METHOD_DEFLATE = 0;\n\nexport function decompress(dataView, compressionMethod, encoding, returnType = 'string') {\n if (compressionMethod === COMPRESSION_METHOD_DEFLATE) {\n if (typeof DecompressionStream === 'function') {\n const decompressionStream = new DecompressionStream('deflate');\n const decompressedStream = new Blob([dataView]).stream().pipeThrough(decompressionStream);\n if (returnType === 'dataview') {\n return new Response(decompressedStream).arrayBuffer().then((arrayBuffer) => new DataView(arrayBuffer));\n }\n return new Response(decompressedStream).arrayBuffer()\n .then((buffer) => new TextDecoder(encoding).decode(buffer));\n }\n }\n if (compressionMethod !== undefined) {\n return Promise.reject(`Unknown compression method ${compressionMethod}.`);\n }\n return dataView;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n USE_FILE: true,\n USE_JFIF: true,\n USE_PNG_FILE: true,\n USE_EXIF: true,\n USE_IPTC: true,\n USE_XMP: true,\n USE_ICC: true,\n USE_MPF: true,\n USE_PHOTOSHOP: true,\n USE_THUMBNAIL: true,\n USE_TIFF: true,\n USE_JPEG: true,\n USE_PNG: true,\n USE_HEIC: true,\n USE_AVIF: true,\n USE_WEBP: true,\n USE_GIF: true,\n USE_MAKER_NOTES: true\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringValue(value) {\n return value.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getEncodedString(value) {\n if (value.length >= 8) {\n const encoding = getStringValue(value.slice(0, 8));\n\n if (encoding === 'ASCII\\x00\\x00\\x00') {\n return getStringValue(value.slice(8));\n } else if (encoding === 'JIS\\x00\\x00\\x00\\x00\\x00') {\n return '[JIS encoded text]';\n } else if (encoding === 'UNICODE\\x00') {\n return '[Unicode encoded text]';\n } else if (encoding === '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00') {\n return '[Undefined encoding]';\n }\n }\n\n return 'Undefined';\n}\n\nexport function getCalculatedGpsValue(value) {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nconst LITTLE_ENDIAN = 0x4949;\nconst BIG_ENDIAN = 0x4d4d;\n\nexport default {\n BIG_ENDIAN,\n LITTLE_ENDIAN,\n getByteOrder\n};\n\nfunction getByteOrder(dataView, tiffHeaderOffset) {\n if (dataView.getUint16(tiffHeaderOffset) === LITTLE_ENDIAN) {\n return LITTLE_ENDIAN;\n } else if (dataView.getUint16(tiffHeaderOffset) === BIG_ENDIAN) {\n return BIG_ENDIAN;\n }\n throw new Error('Illegal byte order value. Faulty image.');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isJpegFile,\n findJpegOffsets\n};\n\nconst MIN_JPEG_DATA_BUFFER_LENGTH = 2;\nconst JPEG_ID = 0xffd8;\nconst JPEG_ID_SIZE = 2;\nconst APP_ID_OFFSET = 4;\nconst APP_MARKER_SIZE = 2;\nconst JFIF_DATA_OFFSET = 2; // From start of APP0 marker.\nconst TIFF_HEADER_OFFSET = 10; // From start of APP1 marker.\nconst IPTC_DATA_OFFSET = 18; // From start of APP13 marker.\nconst XMP_DATA_OFFSET = 33; // From start of APP1 marker.\nconst XMP_EXTENDED_DATA_OFFSET = 79; // From start of APP1 marker including GUID, total length, and offset.\nconst APP2_ICC_DATA_OFFSET = 18; // From start of APP2 marker including marker and chunk/chunk total numbers.\nconst MPF_DATA_OFFSET = 8;\n\nconst APP2_ICC_IDENTIFIER = 'ICC_PROFILE\\0';\nconst ICC_CHUNK_NUMBER_OFFSET = APP_ID_OFFSET + APP2_ICC_IDENTIFIER.length;\nconst ICC_TOTAL_CHUNKS_OFFSET = ICC_CHUNK_NUMBER_OFFSET + 1;\n\nconst APP2_MPF_IDENTIFIER = 'MPF\\0';\n\nconst SOF0_MARKER = 0xffc0;\nconst SOF2_MARKER = 0xffc2;\nconst DHT_MARKER = 0xffc4;\nconst DQT_MARKER = 0xffdb;\nconst DRI_MARKER = 0xffdd;\nconst SOS_MARKER = 0xffda;\n\nconst APP0_MARKER = 0xffe0;\nconst APP1_MARKER = 0xffe1;\nconst APP2_MARKER = 0xffe2;\nconst APP13_MARKER = 0xffed;\nconst APP15_MARKER = 0xffef;\nconst COMMENT_MARKER = 0xfffe;\n\n// Any number of fill bytes can be placed before an app marker. It's actually the first 0xff that is the\n// fill byte and the next 0xff is either another fill byte or the first half of the next app marker.\nconst FILL_BYTE = 0xffff;\n\nconst APP0_JFIF_IDENTIFIER = 'JFIF';\nconst APP1_EXIF_IDENTIFIER = 'Exif';\nconst APP1_XMP_IDENTIFIER = 'http://ns.adobe.com/xap/1.0/\\x00';\nconst APP1_XMP_EXTENDED_IDENTIFIER = 'http://ns.adobe.com/xmp/extension/\\x00';\nconst APP13_IPTC_IDENTIFIER = 'Photoshop 3.0';\n\nfunction isJpegFile(dataView) {\n return !!dataView && (dataView.byteLength >= MIN_JPEG_DATA_BUFFER_LENGTH) && (dataView.getUint16(0) === JPEG_ID);\n}\n\nfunction findJpegOffsets(dataView) {\n let appMarkerPosition = JPEG_ID_SIZE;\n let fieldLength;\n let sof0DataOffset;\n let sof2DataOffset;\n let jfifDataOffset;\n let tiffHeaderOffset;\n let iptcDataOffset;\n let xmpChunks;\n let iccChunks;\n let mpfDataOffset;\n\n while (appMarkerPosition + APP_ID_OFFSET + 5 <= dataView.byteLength) {\n if (Constants.USE_FILE && isSOF0Marker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n sof0DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_FILE && isSOF2Marker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n sof2DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_JFIF && isApp0JfifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n jfifDataOffset = appMarkerPosition + JFIF_DATA_OFFSET;\n } else if (Constants.USE_EXIF && isApp1ExifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n tiffHeaderOffset = appMarkerPosition + TIFF_HEADER_OFFSET;\n } else if (Constants.USE_XMP && isApp1XmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_XMP && isApp1ExtendedXmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getExtendedXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_IPTC && isApp13PhotoshopMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n iptcDataOffset = appMarkerPosition + IPTC_DATA_OFFSET;\n } else if (Constants.USE_ICC && isApp2ICCMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n const iccDataOffset = appMarkerPosition + APP2_ICC_DATA_OFFSET;\n const iccDataLength = fieldLength - (APP2_ICC_DATA_OFFSET - APP_MARKER_SIZE);\n\n const iccChunkNumber = dataView.getUint8(appMarkerPosition + ICC_CHUNK_NUMBER_OFFSET);\n const iccChunksTotal = dataView.getUint8(appMarkerPosition + ICC_TOTAL_CHUNKS_OFFSET);\n if (!iccChunks) {\n iccChunks = [];\n }\n iccChunks.push({offset: iccDataOffset, length: iccDataLength, chunkNumber: iccChunkNumber, chunksTotal: iccChunksTotal});\n } else if (Constants.USE_MPF && isApp2MPFMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n mpfDataOffset = appMarkerPosition + MPF_DATA_OFFSET;\n } else if (isAppMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n } else if (isFillByte(dataView, appMarkerPosition)) {\n appMarkerPosition++;\n continue;\n } else {\n break;\n }\n appMarkerPosition += APP_MARKER_SIZE + fieldLength;\n }\n\n return {\n hasAppMarkers: appMarkerPosition > JPEG_ID_SIZE,\n fileDataOffset: sof0DataOffset || sof2DataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset\n };\n}\n\nfunction isSOF0Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF0_MARKER);\n}\n\nfunction isSOF2Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF2_MARKER);\n}\n\nfunction isApp2ICCMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_ICC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_ICC_IDENTIFIER);\n}\n\nfunction isApp2MPFMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_MPF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_MPF_IDENTIFIER);\n}\n\nfunction isApp0JfifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP0_JFIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP0_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP0_JFIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1ExifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_EXIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1XmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_IDENTIFIER;\n}\n\nfunction isApp1ExtendedXmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isExtendedXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isExtendedXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_EXTENDED_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_EXTENDED_IDENTIFIER;\n}\n\nfunction getXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_DATA_OFFSET,\n length: fieldLength - (XMP_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction getExtendedXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_EXTENDED_DATA_OFFSET,\n length: fieldLength - (XMP_EXTENDED_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction isApp13PhotoshopMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP13_IPTC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP13_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP13_IPTC_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isAppMarker(dataView, appMarkerPosition) {\n const appMarker = dataView.getUint16(appMarkerPosition);\n return ((appMarker >= APP0_MARKER) && (appMarker <= APP15_MARKER))\n || (appMarker === COMMENT_MARKER)\n || (appMarker === SOF0_MARKER)\n || (appMarker === SOF2_MARKER)\n || (appMarker === DHT_MARKER)\n || (appMarker === DQT_MARKER)\n || (appMarker === DRI_MARKER)\n || (appMarker === SOS_MARKER);\n}\n\nfunction isFillByte(dataView, appMarkerPosition) {\n return dataView.getUint16(appMarkerPosition) === FILL_BYTE;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringFromDataView, getNullTerminatedStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isPngFile,\n findPngOffsets\n};\n\nconst PNG_ID = '\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a';\nconst PNG_CHUNK_LENGTH_SIZE = 4;\nexport const PNG_CHUNK_TYPE_SIZE = 4;\nexport const PNG_CHUNK_LENGTH_OFFSET = 0;\nexport const PNG_CHUNK_TYPE_OFFSET = PNG_CHUNK_LENGTH_SIZE;\nexport const PNG_CHUNK_DATA_OFFSET = PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE;\nconst PNG_XMP_PREFIX = 'XML:com.adobe.xmp\\x00';\nexport const TYPE_TEXT = 'tEXt';\nexport const TYPE_ITXT = 'iTXt';\nexport const TYPE_ZTXT = 'zTXt';\nexport const TYPE_PHYS = 'pHYs';\nexport const TYPE_TIME = 'tIME';\nexport const TYPE_EXIF = 'eXIf';\nexport const TYPE_ICCP = 'iCCP';\n\nfunction isPngFile(dataView) {\n return !!dataView && getStringFromDataView(dataView, 0, PNG_ID.length) === PNG_ID;\n}\n\nfunction findPngOffsets(dataView, async) {\n const PNG_CRC_SIZE = 4;\n\n const offsets = {\n hasAppMarkers: false\n };\n\n let offset = PNG_ID.length;\n\n while (offset + PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE <= dataView.byteLength) {\n if (Constants.USE_PNG_FILE && isPngImageHeaderChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.pngHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_XMP && isPngXmpChunk(dataView, offset)) {\n const dataOffset = getPngXmpDataOffset(dataView, offset);\n if (dataOffset !== undefined) {\n offsets.hasAppMarkers = true;\n offsets.xmpChunks = [{\n dataOffset,\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET) - (dataOffset - (offset + PNG_CHUNK_DATA_OFFSET))\n }];\n }\n } else if (isPngTextChunk(dataView, offset, async)) {\n offsets.hasAppMarkers = true;\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n if (!offsets.pngTextChunks) {\n offsets.pngTextChunks = [];\n }\n offsets.pngTextChunks.push({\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET),\n type: chunkType,\n offset: offset + PNG_CHUNK_DATA_OFFSET\n });\n } else if (isPngExifChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.tiffHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_ICC && async && isPngIccpChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n const chunkDataLength = dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET);\n const iccHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n const {profileName, compressionMethod, compressedProfileOffset} = parseIccHeader(dataView, iccHeaderOffset);\n if (!offsets.iccChunks) {\n offsets.iccChunks = [];\n }\n offsets.iccChunks.push({\n offset: compressedProfileOffset,\n length: chunkDataLength - (compressedProfileOffset - iccHeaderOffset),\n chunkNumber: 1,\n chunksTotal: 1,\n profileName,\n compressionMethod\n });\n } else if (isPngChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n if (!offsets.pngChunkOffsets) {\n offsets.pngChunkOffsets = [];\n }\n offsets.pngChunkOffsets.push(offset + PNG_CHUNK_LENGTH_OFFSET);\n }\n\n offset += dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET)\n + PNG_CHUNK_LENGTH_SIZE\n + PNG_CHUNK_TYPE_SIZE\n + PNG_CRC_SIZE;\n }\n\n return offsets;\n}\n\nfunction isPngImageHeaderChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_IMAGE_HEADER = 'IHDR';\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_IMAGE_HEADER;\n}\n\nfunction isPngXmpChunk(dataView, offset) {\n return (getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_ITXT)\n && (getStringFromDataView(dataView, offset + PNG_CHUNK_DATA_OFFSET, PNG_XMP_PREFIX.length) === PNG_XMP_PREFIX);\n}\n\nfunction isPngTextChunk(dataView, offset, async) {\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return chunkType === TYPE_TEXT || chunkType === TYPE_ITXT || (chunkType === TYPE_ZTXT && async);\n}\n\nfunction isPngExifChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_EXIF;\n}\n\nfunction isPngIccpChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_ICCP;\n}\n\nfunction isPngChunk(dataView, offset) {\n const SUPPORTED_PNG_CHUNK_TYPES = [TYPE_PHYS, TYPE_TIME];\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return SUPPORTED_PNG_CHUNK_TYPES.includes(chunkType);\n}\n\nfunction getPngXmpDataOffset(dataView, offset) {\n const COMPRESSION_FLAG_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n offset += PNG_CHUNK_DATA_OFFSET + PNG_XMP_PREFIX.length + COMPRESSION_FLAG_SIZE + COMPRESSION_METHOD_SIZE;\n\n let numberOfNullSeparators = 0;\n while (numberOfNullSeparators < 2 && offset < dataView.byteLength) {\n if (dataView.getUint8(offset) === 0x00) {\n numberOfNullSeparators++;\n }\n offset++;\n }\n if (numberOfNullSeparators < 2) {\n return undefined;\n }\n return offset;\n}\n\nfunction parseIccHeader(dataView, offset) {\n const NULL_SEPARATOR_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n const profileName = getNullTerminatedStringFromDataView(dataView, offset);\n offset += profileName.length + NULL_SEPARATOR_SIZE;\n\n const compressionMethod = dataView.getUint8(offset);\n offset += COMPRESSION_METHOD_SIZE;\n\n return {\n profileName,\n compressionMethod,\n compressedProfileOffset: offset\n };\n}\n","import {get64BitValue} from './image-header-iso-bmff-utils.js';\n\nexport function parseItemLocationBox(dataView, version, contentOffset, boxLength) {\n const FLAGS_SIZE = 3;\n\n const {offsets, sizes} = getItemLocationBoxOffsetsAndSizes(version, contentOffset + FLAGS_SIZE);\n\n const offsetSize = dataView.getUint8(offsets.offsetSize) >> 4;\n sizes.item.extent.extentOffset = offsetSize;\n const lengthSize = dataView.getUint8(offsets.lengthSize) & 0x0f;\n sizes.item.extent.extentLength = lengthSize;\n const baseOffsetSize = dataView.getUint8(offsets.baseOffsetSize) >> 4;\n sizes.item.baseOffset = baseOffsetSize;\n const indexSize = getIndexSize(dataView, offsets.indexSize, version);\n sizes.item.extent.extentIndex = indexSize !== undefined ? indexSize : 0;\n const itemCount = getItemCount(dataView, offsets.itemCount, version);\n\n return {\n type: 'iloc',\n items: getItems(dataView, version, offsets, sizes, offsetSize, lengthSize, indexSize, itemCount),\n length: boxLength\n };\n}\n\nfunction getItemLocationBoxOffsetsAndSizes(version, contentOffset) {\n const sizes = {\n item: {\n dataReferenceIndex: 2,\n extentCount: 2,\n extent: {}\n }\n };\n if (version < 2) {\n sizes.itemCount = 2;\n sizes.item.itemId = 2;\n } else if (version === 2) {\n sizes.itemCount = 4;\n sizes.item.itemId = 4;\n }\n if (version === 1 || version === 2) {\n sizes.item.constructionMethod = 2;\n } else {\n sizes.item.constructionMethod = 0;\n }\n\n const offsets = {\n offsetSize: contentOffset,\n lengthSize: contentOffset,\n baseOffsetSize: contentOffset + 1,\n indexSize: contentOffset + 1\n };\n offsets.itemCount = contentOffset + 2;\n offsets.items = offsets.itemCount + sizes.itemCount;\n offsets.item = {\n itemId: 0\n };\n offsets.item.constructionMethod = offsets.item.itemId + sizes.item.itemId;\n offsets.item.dataReferenceIndex = offsets.item.constructionMethod + sizes.item.constructionMethod;\n\n return {offsets, sizes};\n}\n\nfunction getIndexSize(dataView, offset, version) {\n if (version === 1 || version === 2) {\n return dataView.getUint8(offset) & 0x0f;\n }\n return undefined;\n}\n\nfunction getItemCount(dataView, offset, version) {\n if (version < 2) {\n return dataView.getUint16(offset);\n } else if (version === 2) {\n return dataView.getUint32(offset);\n }\n return undefined;\n}\n\nfunction getItems(dataView, version, offsets, sizes, offsetSize, lengthSize, indexSize, itemCount) {\n if (itemCount === undefined) {\n return [];\n }\n\n const items = [];\n let offset = offsets.items;\n\n for (let i = 0; i < itemCount; i++) {\n const item = {extents: []};\n item.itemId = getItemId(dataView, offset, version);\n offset += sizes.item.itemId;\n item.constructionMethod = (version === 1) || (version === 2) ? dataView.getUint16(offset) & 0x0f : undefined;\n offset += sizes.item.constructionMethod;\n item.dataReferenceIndex = dataView.getUint16(offset);\n offset += sizes.item.dataReferenceIndex;\n item.baseOffset = getVariableSizedValue(dataView, offset, sizes.item.baseOffset);\n offset += sizes.item.baseOffset;\n item.extentCount = dataView.getUint16(offset);\n offset += sizes.item.extentCount;\n for (let j = 0; j < item.extentCount; j++) {\n const extent = {};\n\n extent.extentIndex = getExtentIndex(dataView, version, offset, indexSize);\n offset += sizes.item.extent.extentIndex;\n extent.extentOffset = getVariableSizedValue(dataView, offset, offsetSize);\n offset += sizes.item.extent.extentOffset;\n extent.extentLength = getVariableSizedValue(dataView, offset, lengthSize);\n offset += sizes.item.extent.extentLength;\n\n item.extents.push(extent);\n }\n\n items.push(item);\n }\n\n return items;\n}\n\nfunction getItemId(dataView, offset, version) {\n if (version < 2) {\n return dataView.getUint16(offset);\n } else if (version === 2) {\n return dataView.getUint32(offset);\n }\n return undefined;\n}\n\nfunction getExtentIndex(dataView, version, offset, indexSize) {\n if ((version === 1 || version === 2) && indexSize > 0) {\n return getVariableSizedValue(dataView, offset, indexSize);\n }\n return undefined;\n}\n\nfunction getVariableSizedValue(dataView, offset, size) {\n if (size === 4) {\n return dataView.getUint32(offset);\n }\n if (size === 8) {\n // eslint-disable-next-line no-console\n console.warn('This file uses an 8-bit offset which is currently not supported by ExifReader. Contact the maintainer to get it fixed.');\n return get64BitValue(dataView, offset);\n }\n return 0;\n}\n","export function get64BitValue(dataView, offset) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return dataView.getUint32(offset + 4);\n}\n","import Constants from './constants.js';\nimport {getNullTerminatedStringFromDataView, getStringFromDataView} from './utils.js';\n// import {get64BitValue} from './image-header-iso-bmff-utils.js';\nimport {parseItemLocationBox} from './image-header-iso-bmff-iloc.js';\n\n// HEIC and AVIF files are based on the ISO-BMFF format. This file format is\n// built up by boxes. There are boxes and full boxes. All box types have a\n// length (4 or 8 bytes) and a type (4 bytes). Full boxes also have a version\n// (1 byte) and flags (3 bytes). The boxes can be nested. Each box type has its\n// own structure that can be seen in the specification.\n//\n// For metadata we are interested in the meta box. The meta box contains sub\n// boxes. The sub box type iinf has info about which types of metadata are\n// present in the file. The item ID we get from there we then look up in the\n// iloc sub box to get the offset to the real location of the metadata.\n//\n// The ICC profiles is a bit more nested. We have to look in\n// meta > iprp > ipco > colr, and then the whole profile is stored there.\n\n// These are actually 32-bit strings, not random IDs, e.g. \"ftyp\" and \"meta\".\nconst TYPE_FTYP = 0x66747970;\nconst TYPE_IPRP = 0x69707270;\nconst TYPE_META = 0x6d657461;\nconst TYPE_ILOC = 0x696c6f63;\nconst TYPE_IINF = 0x69696e66;\nconst TYPE_INFE = 0x696e6665;\nconst TYPE_IPCO = 0x6970636f;\nconst TYPE_COLR = 0x636f6c72;\n\n// const EXTENSION_TYPE_FDEL = 0x6664656c;\n\nexport const ITEM_INFO_TYPE_EXIF = 0x45786966;\nexport const ITEM_INFO_TYPE_MIME = 0x6d696d65;\nconst ITEM_INFO_TYPE_URI = 0x75726920;\n\n/**\n * Parses a ISO-BMFF box from the provided data view starting at the given offset.\n *\n * @param {DataView} dataView - The DataView to parse.\n * @param {number} offset - The offset at which to start parsing.\n * @returns {Object} The parsed box.\n */\nexport function parseBox(dataView, offset) {\n const BOX_TYPE_OFFSET = 4;\n const BOX_MIN_LENGTH = 8;\n const VERSION_SIZE = 1;\n\n const {length, contentOffset} = getBoxLength(dataView, offset);\n if (length < BOX_MIN_LENGTH) {\n return undefined;\n }\n\n const type = dataView.getUint32(offset + BOX_TYPE_OFFSET);\n\n if (type === TYPE_FTYP) {\n return parseFileTypeBox(dataView, contentOffset, length);\n }\n if (type === TYPE_IPRP) {\n return parseItemPropertiesBox(dataView, offset, contentOffset, length);\n }\n if (type === TYPE_IPCO) {\n return parseItemPropertyContainerBox(dataView, offset, contentOffset, length);\n }\n if (type === TYPE_COLR) {\n return parseColorInformationBox(dataView, contentOffset, length);\n }\n\n // The following are full boxes, also containing version and flags.\n const version = dataView.getUint8(contentOffset);\n\n if (type === TYPE_META) {\n return parseMetadataBox(dataView, offset, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_ILOC) {\n return parseItemLocationBox(dataView, version, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_IINF) {\n return parseItemInformationBox(dataView, offset, version, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_INFE) {\n return parseItemInformationEntryBox(dataView, offset, version, contentOffset + VERSION_SIZE, length);\n }\n\n return {\n // type: getStringFromDataView(dataView, offset + BOX_TYPE_OFFSET, 4),\n type: undefined,\n length\n };\n}\n\n/**\n * @typedef {Object} BoxLength\n * @property {number} length The length of the box including length and type.\n * @property {number} contentOffset\n */\n\n/**\n * @param {DataView} dataView\n * @param {number} offset\n * @returns {BoxLength}\n */\nfunction getBoxLength(dataView, offset) {\n const BOX_LENGTH_SIZE = 4;\n const BOX_TYPE_SIZE = 4;\n const BOX_EXTENDED_SIZE = 8;\n const BOX_EXTENDED_SIZE_LOW_OFFSET = 12;\n\n const boxLength = dataView.getUint32(offset);\n if (extendsToEndOfFile(boxLength)) {\n return {\n length: dataView.byteLength - offset,\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE,\n };\n }\n if (hasExtendedSize(boxLength)) {\n if (hasEmptyHighBits(dataView, offset)) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return {\n length: dataView.getUint32(offset + BOX_EXTENDED_SIZE_LOW_OFFSET),\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE + BOX_EXTENDED_SIZE,\n };\n }\n }\n\n return {\n length: boxLength,\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE,\n };\n}\n\nfunction extendsToEndOfFile(boxLength) {\n return boxLength === 0;\n}\n\nfunction hasExtendedSize(boxLength) {\n return boxLength === 1;\n}\n\nfunction hasEmptyHighBits(dataView, offset) {\n const BOX_EXTENDED_SIZE_OFFSET = 8;\n return dataView.getUint32(offset + BOX_EXTENDED_SIZE_OFFSET) === 0;\n}\n\n/**\n * @typedef {Object} Offsets\n * @property {number} tiffHeaderOffset\n * @property {Array} xmpChunks\n * @property {Array} iccChunks\n * @property {boolean} hasAppMarkers\n */\n\n/**\n * Finds the offsets of ISO-BMFF-structued data in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Offsets} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nexport function findOffsets(dataView) {\n if (Constants.USE_EXIF || Constants.USE_XMP || Constants.USE_ICC) {\n const offsets = {};\n const metaBox = findMetaBox(dataView);\n\n if (!metaBox) {\n return {hasAppMarkers: false};\n }\n\n if (Constants.USE_EXIF) {\n offsets.tiffHeaderOffset = findExifOffset(dataView, metaBox);\n }\n if (Constants.USE_XMP) {\n offsets.xmpChunks = findXmpChunks(metaBox);\n }\n if (Constants.USE_ICC) {\n offsets.iccChunks = findIccChunks(metaBox);\n }\n offsets.hasAppMarkers = (offsets.tiffHeaderOffset !== undefined) || (offsets.xmpChunks !== undefined) || (offsets.iccChunks !== undefined);\n return offsets;\n }\n\n return {};\n}\n\nfunction findMetaBox(dataView) {\n const BOX_LENGTH_SIZE = 4;\n const BOX_TYPE_SIZE = 4;\n\n let offset = 0;\n\n while (offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE <= dataView.byteLength) {\n const box = parseBox(dataView, offset);\n\n if (box === undefined) {\n break;\n }\n\n if (box.type === 'meta') {\n return box;\n }\n\n offset += box.length;\n }\n\n return undefined;\n}\n\nfunction findExifOffset(dataView, metaBox) {\n try {\n const exifItemId = findIinfExifItemId(metaBox).itemId;\n const ilocItem = findIlocItem(metaBox, exifItemId);\n const exifOffset = ilocItem.baseOffset + ilocItem.extents[0].extentOffset;\n return getTiffHeaderOffset(dataView, exifOffset);\n } catch (error) {\n return undefined;\n }\n}\n\nfunction findIinfExifItemId(metaBox) {\n return metaBox.subBoxes.find((box) => box.type === 'iinf').itemInfos.find((itemInfo) => itemInfo.itemType === ITEM_INFO_TYPE_EXIF);\n}\n\nfunction findIlocItem(metaBox, itemId) {\n return metaBox.subBoxes.find((box) => box.type === 'iloc').items.find((item) => item.itemId === itemId);\n}\n\nfunction getTiffHeaderOffset(dataView, exifOffset) {\n // ISO-BMFF formatted files store the Exif data as an \"Exif block\" where the\n // first 32 bits is the TIFF header offset.\n const TIFF_HEADER_OFFSET_SIZE = 4;\n return exifOffset + TIFF_HEADER_OFFSET_SIZE + dataView.getUint32(exifOffset);\n}\n\nfunction findXmpChunks(metaBox) {\n try {\n const xmpItemId = findIinfXmpItemId(metaBox).itemId;\n const ilocItem = findIlocItem(metaBox, xmpItemId);\n const ilocItemExtent = findIlocItem(metaBox, xmpItemId).extents[0];\n return [\n {\n dataOffset: ilocItem.baseOffset + ilocItemExtent.extentOffset,\n length: ilocItemExtent.extentLength,\n }\n ];\n } catch (error) {\n return undefined;\n }\n}\n\nfunction findIinfXmpItemId(metaBox) {\n return metaBox.subBoxes.find((box) => box.type === 'iinf')\n .itemInfos.find((itemInfo) => itemInfo.itemType === ITEM_INFO_TYPE_MIME && itemInfo.contentType === 'application/rdf+xml');\n}\n\nfunction findIccChunks(metaBox) {\n // This finds the first ICC chunk, but there could be one for each image\n // that is embedded in the file. If it turns out we need to match the ICC\n // chunk to a specific image, we need to check the \"ipma\" in addition to the\n // \"ipco\" (currently we only extract the \"ipco\" so more code would be\n // needed).\n try {\n const icc = metaBox.subBoxes.find((box) => box.type === 'iprp')\n .subBoxes.find((box) => box.type === 'ipco')\n .properties.find((box) => box.type === 'colr')\n .icc;\n if (icc) {\n return [icc];\n }\n } catch (error) {\n // Let it pass through.\n }\n return undefined;\n}\n\nfunction parseFileTypeBox(dataView, contentOffset, boxLength) {\n const MAJOR_BRAND_SIZE = 4;\n const majorBrand = getStringFromDataView(dataView, contentOffset, MAJOR_BRAND_SIZE);\n\n return {\n type: 'ftyp',\n majorBrand,\n length: boxLength\n };\n}\n\nfunction parseItemPropertiesBox(dataView, startOffset, contentOffset, length) {\n return {\n type: 'iprp',\n subBoxes: parseSubBoxes(dataView, contentOffset, length - (contentOffset - startOffset)),\n length,\n };\n}\n\nfunction parseItemPropertyContainerBox(dataView, startOffset, contentOffset, length) {\n return {\n type: 'ipco',\n properties: parseSubBoxes(dataView, contentOffset, length - (contentOffset - startOffset)),\n length,\n };\n}\n\nfunction parseColorInformationBox(dataView, contentOffset, length) {\n return {\n type: 'colr',\n icc: parseIcc(dataView, contentOffset),\n length,\n };\n}\n\nfunction parseIcc(dataView, contentOffset) {\n const COLOR_TYPE_SIZE = 4;\n\n const colorType = getStringFromDataView(dataView, contentOffset, COLOR_TYPE_SIZE);\n if (colorType !== 'prof' && colorType !== 'rICC') {\n // Support for nclx would require some restructuring for ICC handling.\n // Probably do it as a separate feature instead of combining with ICC.\n // Exiftool groups it under QuickTime. The test file test.avif has nclx.\n return undefined;\n }\n\n return {\n offset: contentOffset + COLOR_TYPE_SIZE,\n length: dataView.getUint32(contentOffset + COLOR_TYPE_SIZE),\n chunkNumber: 1,\n chunksTotal: 1\n };\n}\n\nfunction parseMetadataBox(dataView, startOffset, contentOffset, length) {\n const FLAGS_SIZE = 3;\n\n return {\n type: 'meta',\n subBoxes: parseSubBoxes(dataView, contentOffset + FLAGS_SIZE, length - (contentOffset + FLAGS_SIZE - startOffset)),\n length\n };\n}\n\n/**\n * @param {DataView} dataView\n * @param {number} offset The offset to start parsing from.\n * @param {number} length The length of all sub boxes combined.\n * @return {Array}\n */\nfunction parseSubBoxes(dataView, offset, length) {\n const ACCEPTED_ITEM_INFO_TYPES = [\n ITEM_INFO_TYPE_EXIF,\n ITEM_INFO_TYPE_MIME,\n ];\n\n const subBoxes = [];\n let currentOffset = offset;\n while (currentOffset < offset + length) {\n const box = parseBox(dataView, currentOffset);\n if (box === undefined) {\n break;\n }\n if (box.type !== undefined && (box.itemType === undefined || ACCEPTED_ITEM_INFO_TYPES.indexOf(box.itemType) !== -1)) {\n subBoxes.push(box);\n }\n currentOffset += box.length;\n }\n return subBoxes;\n}\n\nfunction parseItemInformationBox(dataView, startOffset, version, contentOffset, length) {\n const {offsets} = getItemInformationBoxOffsetsAndSizes(version, contentOffset);\n\n return {\n type: 'iinf',\n itemInfos: parseSubBoxes(dataView, offsets.itemInfos, length - (offsets.itemInfos - startOffset)),\n length\n };\n}\n\nfunction getItemInformationBoxOffsetsAndSizes(version, contentOffset) {\n const FLAGS_SIZE = 3;\n\n const offsets = {entryCount: contentOffset + FLAGS_SIZE};\n const sizes = {};\n\n if (version === 0) {\n sizes.entryCount = 2;\n } else {\n sizes.entryCount = 4;\n }\n\n offsets.itemInfos = offsets.entryCount + sizes.entryCount;\n\n return {offsets};\n}\n\nfunction parseItemInformationEntryBox(dataView, startOffset, version, contentOffset, length) {\n const FLAGS_SIZE = 3;\n\n contentOffset += FLAGS_SIZE;\n const entry = {type: 'infe', length};\n\n if (version === 0 || version === 1) {\n entry.itemId = dataView.getUint16(contentOffset);\n contentOffset += 2;\n entry.itemProtectionIndex = dataView.getUint16(contentOffset);\n contentOffset += 2;\n entry.itemName = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemName.length + 1;\n // entry.contentType = getNullTerminatedStringFromDataView(dataView, offset);\n // offset += entry.contentType.length + 1;\n // Since contentEncoding is optional we need to check the offset against length here.\n // entry.contentEncoding = getNullTerminatedStringFromDataView(dataView, offset);\n // offset += entry.contentEncoding.length + 1;\n }\n // The following code should be correct but we currently don't need it.\n // if (version === 1) {\n // // Everything here is optional, check the offset against length.\n // entry.extensionType = dataView.getUint32(contentOffset);\n // contentOffset += 4;\n // if (entry.extensionType === EXTENSION_TYPE_FDEL) {\n // entry.contentLocation = getNullTerminatedStringFromDataView(dataView, contentOffset);\n // contentOffset += entry.contentLocation.length + 1;\n // entry.contentMd5 = getNullTerminatedStringFromDataView(dataView, contentOffset);\n // contentOffset += entry.contentMd5.length + 1;\n // entry.contentLength = get64BitValue(dataView, contentOffset);\n // contentOffset += 8;\n // entry.transferLength = get64BitValue(dataView, contentOffset);\n // contentOffset += 8;\n // entry.entryCount = dataView.getUint8(contentOffset);\n // contentOffset += 1;\n // entry.entries = [];\n // for (let i = 0; i < entry.entryCount; i++) {\n // entry.entries.push({groupId: dataView.getUint32(contentOffset)});\n // contentOffset += 4;\n // }\n // }\n // }\n if (version >= 2) {\n if (version === 2) {\n entry.itemId = dataView.getUint16(contentOffset);\n contentOffset += 2;\n } else if (version === 3) {\n entry.itemId = dataView.getUint32(contentOffset);\n contentOffset += 4;\n }\n entry.itemProtectionIndex = dataView.getUint16(contentOffset);\n contentOffset += 2;\n // entry.itemTypeAscii = getStringFromDataView(dataView, offset, 4); // For testing.\n entry.itemType = dataView.getUint32(contentOffset);\n contentOffset += 4;\n entry.itemName = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemName.length + 1;\n if (entry.itemType === ITEM_INFO_TYPE_MIME) {\n entry.contentType = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.contentType.length + 1;\n if (startOffset + length > contentOffset) {\n entry.contentEncoding = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.contentEncoding.length + 1;\n }\n } else if (entry.itemType === ITEM_INFO_TYPE_URI) {\n entry.itemUri = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemUri.length + 1;\n }\n }\n return entry;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {parseBox, findOffsets} from './image-header-iso-bmff.js';\n\nexport default {\n isHeicFile,\n findHeicOffsets\n};\n\n/**\n * Checks if the provided data view represents a HEIC/HEIF file.\n *\n * @param {DataView} dataView - The data view to check.\n * @returns {boolean} True if the data view represents a HEIC/HEIF file, false otherwise.\n */\nfunction isHeicFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n const HEIC_MAJOR_BRANDS = ['heic', 'heix', 'hevc', 'hevx', 'heim', 'heis', 'hevm', 'hevs', 'mif1'];\n\n try {\n const headerBox = parseBox(dataView, 0);\n return headerBox && HEIC_MAJOR_BRANDS.indexOf(headerBox.majorBrand) !== -1;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Finds the offsets of a HEIC file in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Object} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nfunction findHeicOffsets(dataView) {\n return findOffsets(dataView);\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n isGifFile,\n findOffsets\n};\n\nconst GIF_SIGNATURE_SIZE = 6;\nconst GIF_SIGNATURES = ['GIF87a', 'GIF89a'];\n\nfunction isGifFile(dataView) {\n return !!dataView && GIF_SIGNATURES.includes(getStringFromDataView(dataView, 0, GIF_SIGNATURE_SIZE));\n}\n\nfunction findOffsets() {\n return {\n gifHeaderOffset: 0\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n isXMLFile,\n findOffsets\n};\n\nconst XML_MARKER_OFFSET = 0;\nconst XML_MARKER = '= MIN_TIFF_DATA_BUFFER_LENGTH) && hasTiffMarker(dataView);\n}\n\nfunction hasTiffMarker(dataView) {\n const TIFF_ID = 0x2a;\n const TIFF_ID_OFFSET = 2;\n\n const littleEndian = dataView.getUint16(0) === ByteOrder.LITTLE_ENDIAN;\n return dataView.getUint16(TIFF_ID_OFFSET, littleEndian) === TIFF_ID;\n}\n\nfunction findTiffOffsets() {\n const TIFF_FILE_HEADER_OFFSET = 0;\n\n if (Constants.USE_EXIF) {\n return {\n hasAppMarkers: true,\n tiffHeaderOffset: TIFF_FILE_HEADER_OFFSET\n };\n }\n return {};\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification:\n// https://aomediacodec.github.io/av1-avif\n\nimport {parseBox, findOffsets} from './image-header-iso-bmff.js';\n\nexport default {\n isAvifFile,\n findAvifOffsets\n};\n\n/**\n * Checks if the provided data view represents an AVIF file.\n *\n * @param {DataView} dataView - The data view to check.\n * @returns {boolean} True if the data view represents an AVIF file, false otherwise.\n */\nfunction isAvifFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n try {\n const headerBox = parseBox(dataView, 0);\n return headerBox && headerBox.majorBrand === 'avif';\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Finds the offsets of an AVIF file in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Object} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nfunction findAvifOffsets(dataView) {\n return findOffsets(dataView);\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isWebpFile,\n findOffsets\n};\n\nfunction isWebpFile(dataView) {\n const RIFF_ID_OFFSET = 0;\n const RIFF_ID = 'RIFF';\n const WEBP_MARKER_OFFSET = 8;\n const WEBP_MARKER = 'WEBP';\n\n return !!dataView && getStringFromDataView(dataView, RIFF_ID_OFFSET, RIFF_ID.length) === RIFF_ID\n && getStringFromDataView(dataView, WEBP_MARKER_OFFSET, WEBP_MARKER.length) === WEBP_MARKER;\n}\n\nfunction findOffsets(dataView) {\n const SUB_CHUNK_START_OFFSET = 12;\n const CHUNK_SIZE_OFFSET = 4;\n const EXIF_IDENTIFIER = 'Exif\\x00\\x00';\n const CHUNK_HEADER_SIZE = 8;\n\n let offset = SUB_CHUNK_START_OFFSET;\n let hasAppMarkers = false;\n let tiffHeaderOffset;\n let xmpChunks;\n let iccChunks;\n let vp8xChunkOffset;\n\n while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) {\n const chunkId = getStringFromDataView(dataView, offset, 4);\n const chunkSize = dataView.getUint32(offset + CHUNK_SIZE_OFFSET, true);\n\n if (Constants.USE_EXIF && (chunkId === 'EXIF')) {\n hasAppMarkers = true;\n if (getStringFromDataView(dataView, offset + CHUNK_HEADER_SIZE, EXIF_IDENTIFIER.length) === EXIF_IDENTIFIER) {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE + EXIF_IDENTIFIER.length;\n } else {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE;\n }\n } else if (Constants.USE_XMP && (chunkId === 'XMP ')) {\n hasAppMarkers = true;\n xmpChunks = [{\n dataOffset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize\n }];\n } else if (Constants.USE_ICC && (chunkId === 'ICCP')) {\n hasAppMarkers = true;\n iccChunks = [{\n offset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n } else if (chunkId === 'VP8X') {\n hasAppMarkers = true;\n vp8xChunkOffset = offset + CHUNK_HEADER_SIZE;\n }\n\n offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1);\n }\n\n return {\n hasAppMarkers,\n tiffHeaderOffset,\n xmpChunks,\n iccChunks,\n vp8xChunkOffset\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n ApertureValue: (value) => Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2),\n ColorSpace(value) {\n if (value === 1) {\n return 'sRGB';\n } else if (value === 0xffff) {\n return 'Uncalibrated';\n }\n return 'Unknown';\n },\n ComponentsConfiguration(value) {\n return value.map((character) => {\n if (character === 0x31) {\n return 'Y';\n } else if (character === 0x32) {\n return 'Cb';\n } else if (character === 0x33) {\n return 'Cr';\n } else if (character === 0x34) {\n return 'R';\n } else if (character === 0x35) {\n return 'G';\n } else if (character === 0x36) {\n return 'B';\n }\n }).join('');\n },\n Contrast(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n CustomRendered(value) {\n if (value === 0) {\n return 'Normal process';\n } else if (value === 1) {\n return 'Custom process';\n }\n return 'Unknown';\n },\n ExposureMode(value) {\n if (value === 0) {\n return 'Auto exposure';\n } else if (value === 1) {\n return 'Manual exposure';\n } else if (value === 2) {\n return 'Auto bracket';\n }\n return 'Unknown';\n },\n ExposureProgram(value) {\n if (value === 0) {\n return 'Undefined';\n } else if (value === 1) {\n return 'Manual';\n } else if (value === 2) {\n return 'Normal program';\n } else if (value === 3) {\n return 'Aperture priority';\n } else if (value === 4) {\n return 'Shutter priority';\n } else if (value === 5) {\n return 'Creative program';\n } else if (value === 6) {\n return 'Action program';\n } else if (value === 7) {\n return 'Portrait mode';\n } else if (value === 8) {\n return 'Landscape mode';\n } else if (value === 9) {\n return 'Bulb';\n }\n return 'Unknown';\n },\n ExposureTime(value) {\n if (value[0] / value[1] > 0.25) {\n const decimal = value[0] / value[1];\n if (Number.isInteger(decimal)) {\n return '' + decimal;\n }\n return decimal.toFixed(1);\n }\n if (value[0] !== 0) {\n return `1/${Math.round(value[1] / value[0])}`;\n }\n return `0/${value[1]}`;\n },\n FNumber: (value) => `f/${value[0] / value[1]}`,\n FocalLength: (value) => (value[0] / value[1]) + ' mm',\n FocalPlaneResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n } else if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n LightSource: (value) => {\n if (value === 1) {\n return 'Daylight';\n } else if (value === 2) {\n return 'Fluorescent';\n } else if (value === 3) {\n return 'Tungsten (incandescent light)';\n } else if (value === 4) {\n return 'Flash';\n } else if (value === 9) {\n return 'Fine weather';\n } else if (value === 10) {\n return 'Cloudy weather';\n } else if (value === 11) {\n return 'Shade';\n } else if (value === 12) {\n return 'Daylight fluorescent (D 5700 – 7100K)';\n } else if (value === 13) {\n return 'Day white fluorescent (N 4600 – 5400K)';\n } else if (value === 14) {\n return 'Cool white fluorescent (W 3900 – 4500K)';\n } else if (value === 15) {\n return 'White fluorescent (WW 3200 – 3700K)';\n } else if (value === 17) {\n return 'Standard light A';\n } else if (value === 18) {\n return 'Standard light B';\n } else if (value === 19) {\n return 'Standard light C';\n } else if (value === 20) {\n return 'D55';\n } else if (value === 21) {\n return 'D65';\n } else if (value === 22) {\n return 'D75';\n } else if (value === 23) {\n return 'D50';\n } else if (value === 24) {\n return 'ISO studio tungsten';\n } else if (value === 255) {\n return 'Other light source';\n }\n return 'Unknown';\n },\n MeteringMode(value) {\n if (value === 1) {\n return 'Average';\n } else if (value === 2) {\n return 'CenterWeightedAverage';\n } else if (value === 3) {\n return 'Spot';\n } else if (value === 4) {\n return 'MultiSpot';\n } else if (value === 5) {\n return 'Pattern';\n } else if (value === 6) {\n return 'Partial';\n } else if (value === 255) {\n return 'Other';\n }\n return 'Unknown';\n },\n ResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n }\n if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n Saturation(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Low saturation';\n } else if (value === 2) {\n return 'High saturation';\n }\n return 'Unknown';\n },\n SceneCaptureType(value) {\n if (value === 0) {\n return 'Standard';\n } else if (value === 1) {\n return 'Landscape';\n } else if (value === 2) {\n return 'Portrait';\n } else if (value === 3) {\n return 'Night scene';\n }\n return 'Unknown';\n },\n Sharpness(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n ShutterSpeedValue(value) {\n const denominator = Math.pow(2, value[0] / value[1]);\n if (denominator <= 1) {\n return `${Math.round(1 / denominator)}`;\n }\n return `1/${Math.round(denominator)}`;\n },\n WhiteBalance(value) {\n if (value === 0) {\n return 'Auto white balance';\n } else if (value === 1) {\n return 'Manual white balance';\n }\n return 'Unknown';\n },\n XResolution: (value) => '' + Math.round(value[0] / value[1]),\n YResolution: (value) => '' + Math.round(value[0] / value[1])\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x000b: 'ProcessingSoftware',\n 0x00fe: {\n name: 'SubfileType',\n description: (value) => ({\n 0x0: 'Full-resolution image',\n 0x1: 'Reduced-resolution image',\n 0x2: 'Single page of multi-page image',\n 0x3: 'Single page of multi-page reduced-resolution image',\n 0x4: 'Transparency mask',\n 0x5: 'Transparency mask of reduced-resolution image',\n 0x6: 'Transparency mask of multi-page image',\n 0x7: 'Transparency mask of reduced-resolution multi-page image',\n 0x10001: 'Alternate reduced-resolution image',\n 0xffffffff: 'Invalid'\n })[value] || 'Unknown'\n },\n 0x00ff: {\n name: 'OldSubfileType',\n description: (value) => ({\n 0: 'Full-resolution image',\n 1: 'Reduced-resolution image',\n 2: 'Single page of multi-page image'\n })[value] || 'Unknown'\n },\n 0x0100: 'ImageWidth',\n 0x0101: 'ImageLength',\n 0x0102: 'BitsPerSample',\n 0x0103: 'Compression',\n 0x0106: 'PhotometricInterpretation',\n 0x0107: {\n name: 'Thresholding',\n description: (value) => ({\n 1: 'No dithering or halftoning',\n 2: 'Ordered dither or halfton',\n 3: 'Randomized dither'\n })[value] || 'Unknown'\n },\n 0x0108: 'CellWidth',\n 0x0109: 'CellLength',\n 0x010a: {\n name: 'FillOrder',\n description: (value) => ({\n 1: 'Normal',\n 2: 'Reversed'\n })[value] || 'Unknown'\n },\n 0x010d: 'DocumentName',\n 0x010e: 'ImageDescription',\n 0x010f: 'Make',\n 0x0110: 'Model',\n 0x0111: 'StripOffsets',\n 0x0112: {\n name: 'Orientation',\n description: (value) => {\n if (value === 1) {\n return 'top-left';\n }\n if (value === 2) {\n return 'top-right';\n }\n if (value === 3) {\n return 'bottom-right';\n }\n if (value === 4) {\n return 'bottom-left';\n }\n if (value === 5) {\n return 'left-top';\n }\n if (value === 6) {\n return 'right-top';\n }\n if (value === 7) {\n return 'right-bottom';\n }\n if (value === 8) {\n return 'left-bottom';\n }\n return 'Undefined';\n }\n },\n 0x0115: 'SamplesPerPixel',\n 0x0116: 'RowsPerStrip',\n 0x0117: 'StripByteCounts',\n 0x0118: 'MinSampleValue',\n 0x0119: 'MaxSampleValue',\n 0x011a: {\n 'name': 'XResolution',\n 'description': TagNamesCommon.XResolution\n },\n 0x011b: {\n 'name': 'YResolution',\n 'description': TagNamesCommon.YResolution\n },\n 0x011c: 'PlanarConfiguration',\n 0x011d: 'PageName',\n 0x011e: {\n 'name': 'XPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011f: {\n 'name': 'YPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x0122: {\n name: 'GrayResponseUnit',\n description: (value) => ({\n 1: '0.1',\n 2: '0.001',\n 3: '0.0001',\n 4: '1e-05',\n 5: '1e-06'\n })[value] || 'Unknown'\n },\n 0x0128: {\n name: 'ResolutionUnit',\n description: TagNamesCommon.ResolutionUnit\n },\n 0x0129: 'PageNumber',\n 0x012d: 'TransferFunction',\n 0x0131: 'Software',\n 0x0132: 'DateTime',\n 0x013b: 'Artist',\n 0x013c: 'HostComputer',\n 0x013d: 'Predictor',\n 0x013e: {\n 'name': 'WhitePoint',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x013f: {\n 'name': 'PrimaryChromaticities',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x0141: 'HalftoneHints',\n 0x0142: 'TileWidth',\n 0x0143: 'TileLength',\n 0x014a: 'A100DataOffset',\n 0x014c: {\n name: 'InkSet',\n description: (value) => ({\n 1: 'CMYK',\n 2: 'Not CMYK'\n })[value] || 'Unknown'\n },\n 0x0151: 'TargetPrinter',\n 0x0152: {\n name: 'ExtraSamples',\n description: (value) => ({\n 0: 'Unspecified',\n 1: 'Associated Alpha',\n 2: 'Unassociated Alpha',\n })[value] || 'Unknown'\n },\n 0x0153: {\n name: 'SampleFormat',\n description: (value) => {\n const formats = {\n 1: 'Unsigned',\n 2: 'Signed',\n 3: 'Float',\n 4: 'Undefined',\n 5: 'Complex int',\n 6: 'Complex float',\n };\n if (!Array.isArray(value)) {\n return 'Unknown';\n }\n return value.map((sample) => formats[sample] || 'Unknown').join(', ');\n }\n },\n 0x0201: 'JPEGInterchangeFormat',\n 0x0202: 'JPEGInterchangeFormatLength',\n 0x0211: {\n 'name': 'YCbCrCoefficients',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join('/');\n }\n },\n 0x0212: 'YCbCrSubSampling',\n 0x0213: {\n name: 'YCbCrPositioning',\n description: (value) => {\n if (value === 1) {\n return 'centered';\n }\n if (value === 2) {\n return 'co-sited';\n }\n return 'undefined ' + value;\n }\n },\n 0x0214: {\n 'name': 'ReferenceBlackWhite',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join(', ');\n }\n },\n 0x02bc: 'ApplicationNotes',\n 0x4746: 'Rating',\n 0x4749: 'RatingPercent',\n 0x8298: {\n name: 'Copyright',\n description: (value) => value.join('; ')\n },\n 0x830e: 'PixelScale',\n 0x83bb: 'IPTC-NAA',\n 0x8480: 'IntergraphMatrix',\n 0x8482: 'ModelTiePoint',\n 0x8546: 'SEMInfo',\n 0x85d8: 'ModelTransform',\n 0x8649: 'PhotoshopSettings',\n 0x8769: 'Exif IFD Pointer',\n 0x8773: 'ICC_Profile',\n 0x87af: 'GeoTiffDirectory',\n 0x87b0: 'GeoTiffDoubleParams',\n 0x87b1: 'GeoTiffAsciiParams',\n 0x8825: 'GPS Info IFD Pointer',\n 0x9c9b: {\n name: 'XPTitle',\n description: decodeXPValue,\n },\n 0x9c9c: {\n name: 'XPComment',\n description: decodeXPValue\n },\n 0x9c9d: {\n name: 'XPAuthor',\n description: decodeXPValue,\n },\n 0x9c9e: {\n name: 'XPKeywords',\n description: decodeXPValue,\n },\n 0x9c9f: {\n name: 'XPSubject',\n description: decodeXPValue,\n },\n 0xa480: 'GDALMetadata',\n 0xa481: 'GDALNoData',\n 0xc4a5: 'PrintIM',\n 0xc613: 'DNGBackwardVersion',\n 0xc614: 'UniqueCameraModel',\n 0xc615: 'LocalizedCameraModel',\n 0xc621: 'ColorMatrix1',\n 0xc622: 'ColorMatrix2',\n 0xc623: 'CameraCalibration1',\n 0xc624: 'CameraCalibration2',\n 0xc625: 'ReductionMatrix1',\n 0xc626: 'ReductionMatrix2',\n 0xc627: 'AnalogBalance',\n 0xc628: 'AsShotNeutral',\n 0xc629: 'AsShotWhiteXY',\n 0xc62a: 'BaselineExposure',\n 0xc62b: 'BaselineNoise',\n 0xc62c: 'BaselineSharpness',\n 0xc62e: 'LinearResponseLimit',\n 0xc62f: 'CameraSerialNumber',\n 0xc630: 'DNGLensInfo',\n 0xc633: 'ShadowScale',\n 0xc635: {\n name: 'MakerNoteSafety',\n description: (value) => ({\n 0: 'Unsafe',\n 1: 'Safe'\n })[value] || 'Unknown'\n },\n 0xc65a: {\n name: 'CalibrationIlluminant1',\n description: TagNamesCommon['LightSource']\n },\n 0xc65b: {\n name: 'CalibrationIlluminant2',\n description: TagNamesCommon['LightSource']\n },\n 0xc65d: 'RawDataUniqueID',\n 0xc68b: 'OriginalRawFileName',\n 0xc68c: 'OriginalRawFileData',\n 0xc68f: 'AsShotICCProfile',\n 0xc690: 'AsShotPreProfileMatrix',\n 0xc691: 'CurrentICCProfile',\n 0xc692: 'CurrentPreProfileMatrix',\n 0xc6bf: 'ColorimetricReference',\n 0xc6c5: 'SRawType',\n 0xc6d2: 'PanasonicTitle',\n 0xc6d3: 'PanasonicTitle2',\n 0xc6f3: 'CameraCalibrationSig',\n 0xc6f4: 'ProfileCalibrationSig',\n 0xc6f5: 'ProfileIFD',\n 0xc6f6: 'AsShotProfileName',\n 0xc6f8: 'ProfileName',\n 0xc6f9: 'ProfileHueSatMapDims',\n 0xc6fa: 'ProfileHueSatMapData1',\n 0xc6fb: 'ProfileHueSatMapData2',\n 0xc6fc: 'ProfileToneCurve',\n 0xc6fd: {\n name: 'ProfileEmbedPolicy',\n description: (value) => ({\n 0: 'Allow Copying',\n 1: 'Embed if Used',\n 2: 'Never Embed',\n 3: 'No Restrictions'\n })[value] || 'Unknown'\n },\n 0xc6fe: 'ProfileCopyright',\n 0xc714: 'ForwardMatrix1',\n 0xc715: 'ForwardMatrix2',\n 0xc716: 'PreviewApplicationName',\n 0xc717: 'PreviewApplicationVersion',\n 0xc718: 'PreviewSettingsName',\n 0xc719: 'PreviewSettingsDigest',\n 0xc71a: {\n name: 'PreviewColorSpace',\n description: (value) => ({\n 1: 'Gray Gamma 2.2',\n 2: 'sRGB',\n 3: 'Adobe RGB',\n 4: 'ProPhoto RGB'\n })[value] || 'Unknown'\n },\n 0xc71b: 'PreviewDateTime',\n 0xc71c: 'RawImageDigest',\n 0xc71d: 'OriginalRawFileDigest',\n 0xc725: 'ProfileLookTableDims',\n 0xc726: 'ProfileLookTableData',\n 0xc763: 'TimeCodes',\n 0xc764: 'FrameRate',\n 0xc772: 'TStop',\n 0xc789: 'ReelName',\n 0xc791: 'OriginalDefaultFinalSize',\n 0xc792: 'OriginalBestQualitySize',\n 0xc793: 'OriginalDefaultCropSize',\n 0xc7a1: 'CameraLabel',\n 0xc7a3: {\n name: 'ProfileHueSatMapEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a4: {\n name: 'ProfileLookTableEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a5: 'BaselineExposureOffset',\n 0xc7a6: {\n name: 'DefaultBlackRender',\n description: (value) => ({\n 0: 'Auto',\n 1: 'None'\n })[value] || 'Unknown'\n },\n 0xc7a7: 'NewRawImageDigest',\n 0xc7a8: 'RawToPreviewGain'\n};\n\nfunction decodeXPValue(value) {\n // The XP tags are encoded as UCS-2 which uses two bytes per character but\n // it's close to UTF-16 so we can use that to decode them.\n // https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml\n const decodedValue = new TextDecoder('utf-16').decode(new Uint8Array(value));\n // Some softwares pad the string with null characters so we remove them.\n return decodedValue.replace(/\\u0000+$/, ''); // eslint-disable-line no-control-regex\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getEncodedString, getCalculatedGpsValue} from './tag-names-utils.js';\n\nexport default {\n 0x0000: {\n 'name': 'GPSVersionID',\n 'description': (value) => {\n if (value[0] === 2 && value[1] === 2 && value[2] === 0 && value[3] === 0) {\n return 'Version 2.2';\n }\n return 'Unknown';\n }\n },\n 0x0001: {\n 'name': 'GPSLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0002: {\n 'name': 'GPSLatitude',\n 'description': getCalculatedGpsValue\n },\n 0x0003: {\n 'name': 'GPSLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0004: {\n 'name': 'GPSLongitude',\n 'description': getCalculatedGpsValue\n },\n 0x0005: {\n 'name': 'GPSAltitudeRef',\n 'description': (value) => {\n if (value === 0) {\n return 'Sea level';\n } else if (value === 1) {\n return 'Sea level reference (negative value)';\n }\n return 'Unknown';\n }\n },\n 0x0006: {\n 'name': 'GPSAltitude',\n 'description': (value) => {\n return (value[0] / value[1]) + ' m';\n }\n },\n 0x0007: {\n 'name': 'GPSTimeStamp',\n 'description': (values) => {\n return values.map(([numerator, denominator]) => {\n const num = numerator / denominator;\n if (/^\\d(\\.|$)/.test(`${num}`)) {\n return `0${num}`;\n }\n return num;\n }).join(':');\n }\n },\n 0x0008: 'GPSSatellites',\n 0x0009: {\n 'name': 'GPSStatus',\n 'description': (value) => {\n const status = value.join('');\n if (status === 'A') {\n return 'Measurement in progress';\n } else if (status === 'V') {\n return 'Measurement Interoperability';\n }\n return 'Unknown';\n }\n },\n 0x000a: {\n 'name': 'GPSMeasureMode',\n 'description': (value) => {\n const mode = value.join('');\n if (mode === '2') {\n return '2-dimensional measurement';\n } else if (mode === '3') {\n return '3-dimensional measurement';\n }\n return 'Unknown';\n }\n },\n 0x000b: 'GPSDOP',\n 0x000c: {\n 'name': 'GPSSpeedRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers per hour';\n } else if (ref === 'M') {\n return 'Miles per hour';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x000d: 'GPSSpeed',\n 0x000e: {\n 'name': 'GPSTrackRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x000f: 'GPSTrack',\n 0x0010: {\n 'name': 'GPSImgDirectionRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0011: 'GPSImgDirection',\n 0x0012: 'GPSMapDatum',\n 0x0013: {\n 'name': 'GPSDestLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0014: {\n 'name': 'GPSDestLatitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0015: {\n 'name': 'GPSDestLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0016: {\n 'name': 'GPSDestLongitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0017: {\n 'name': 'GPSDestBearingRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0018: 'GPSDestBearing',\n 0x0019: {\n 'name': 'GPSDestDistanceRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers';\n } else if (ref === 'M') {\n return 'Miles';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x001a: 'GPSDestDistance',\n 0x001b: {\n 'name': 'GPSProcessingMethod',\n 'description': getEncodedString\n },\n 0x001c: {\n 'name': 'GPSAreaInformation',\n 'description': getEncodedString\n },\n 0x001d: 'GPSDateStamp',\n 0x001e: {\n 'name': 'GPSDifferential',\n 'description': (value) => {\n if (value === 0) {\n return 'Measurement without differential correction';\n } else if (value === 1) {\n return 'Differential correction applied';\n }\n return 'Unknown';\n }\n },\n 0x001f: 'GPSHPositioningError'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0x0001: 'InteroperabilityIndex',\n 0x0002: {\n name: 'InteroperabilityVersion',\n description: (value) => getStringValue(value)\n },\n 0x1000: 'RelatedImageFileFormat',\n 0x1001: 'RelatedImageWidth',\n 0x1002: 'RelatedImageHeight'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0xb000: {\n 'name': 'MPFVersion',\n 'description': (value) => getStringValue(value)\n },\n 0xb001: 'NumberOfImages',\n 0xb002: 'MPEntry',\n 0xb003: 'ImageUIDList',\n 0xb004: 'TotalFrames'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport Constants from './constants.js';\nimport TagNames0thIfd from './tag-names-0th-ifd.js';\nimport TagNamesExifIfd from './tag-names-exif-ifd.js';\nimport TagNamesGpsIfd from './tag-names-gps-ifd.js';\nimport TagNamesInteroperabilityIfd from './tag-names-interoperability-ifd.js';\nimport TagNamesMpfIfd from './tag-names-mpf-ifd.js';\nimport TagNamesCanonIfd from './tag-names-canon-ifd.js';\n\nconst tagNames0thExifIfds = objectAssign({}, TagNames0thIfd, TagNamesExifIfd);\n\nexport const IFD_TYPE_0TH = '0th';\nexport const IFD_TYPE_1ST = '1st';\nexport const IFD_TYPE_EXIF = 'exif';\nexport const IFD_TYPE_GPS = 'gps';\nexport const IFD_TYPE_INTEROPERABILITY = 'interoperability';\nexport const IFD_TYPE_MPF = 'mpf';\nexport const IFD_TYPE_CANON = 'canon';\n\nexport default {\n [IFD_TYPE_0TH]: tagNames0thExifIfds,\n [IFD_TYPE_1ST]: TagNames0thIfd,\n [IFD_TYPE_EXIF]: tagNames0thExifIfds,\n [IFD_TYPE_GPS]: TagNamesGpsIfd,\n [IFD_TYPE_INTEROPERABILITY]: TagNamesInteroperabilityIfd,\n [IFD_TYPE_MPF]: Constants.USE_MPF ? TagNamesMpfIfd : {},\n [IFD_TYPE_CANON]: Constants.USE_MAKER_NOTES ? TagNamesCanonIfd : {},\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue, getEncodedString} from './tag-names-utils.js';\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x829a: {\n 'name': 'ExposureTime',\n 'description': TagNamesCommon.ExposureTime\n },\n 0x829d: {\n 'name': 'FNumber',\n 'description': TagNamesCommon.FNumber\n },\n 0x8822: {\n 'name': 'ExposureProgram',\n 'description': TagNamesCommon.ExposureProgram\n },\n 0x8824: 'SpectralSensitivity',\n 0x8827: 'ISOSpeedRatings',\n 0x8828: {\n 'name': 'OECF',\n 'description': () => '[Raw OECF table data]'\n },\n 0x882a: 'TimeZoneOffset',\n 0x882b: 'SelfTimerMode',\n 0x8830: {\n name: 'SensitivityType',\n description: (value) => ({\n 1: 'Standard Output Sensitivity',\n 2: 'Recommended Exposure Index',\n 3: 'ISO Speed',\n 4: 'Standard Output Sensitivity and Recommended Exposure Index',\n 5: 'Standard Output Sensitivity and ISO Speed',\n 6: 'Recommended Exposure Index and ISO Speed',\n 7: 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed'\n })[value] || 'Unknown'\n },\n 0x8831: 'StandardOutputSensitivity',\n 0x8832: 'RecommendedExposureIndex',\n 0x8833: 'ISOSpeed',\n 0x8834: 'ISOSpeedLatitudeyyy',\n 0x8835: 'ISOSpeedLatitudezzz',\n 0x9000: {\n 'name': 'ExifVersion',\n 'description': (value) => getStringValue(value)\n },\n 0x9003: 'DateTimeOriginal',\n 0x9004: 'DateTimeDigitized',\n 0x9009: 'GooglePlusUploadCode',\n 0x9010: 'OffsetTime',\n 0x9011: 'OffsetTimeOriginal',\n 0x9012: 'OffsetTimeDigitized',\n 0x9101: {\n 'name': 'ComponentsConfiguration',\n 'description': TagNamesCommon.ComponentsConfiguration\n },\n 0x9102: 'CompressedBitsPerPixel',\n 0x9201: {\n 'name': 'ShutterSpeedValue',\n 'description': TagNamesCommon.ShutterSpeedValue\n },\n 0x9202: {\n 'name': 'ApertureValue',\n 'description': TagNamesCommon.ApertureValue\n },\n 0x9203: 'BrightnessValue',\n 0x9204: 'ExposureBiasValue',\n 0x9205: {\n 'name': 'MaxApertureValue',\n 'description': (value) => {\n return Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2);\n }\n },\n 0x9206: {\n 'name': 'SubjectDistance',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9207: {\n 'name': 'MeteringMode',\n 'description': TagNamesCommon.MeteringMode\n },\n 0x9208: {\n 'name': 'LightSource',\n description: TagNamesCommon.LightSource\n },\n 0x9209: {\n 'name': 'Flash',\n 'description': (value) => {\n if (value === 0x00) {\n return 'Flash did not fire';\n } else if (value === 0x01) {\n return 'Flash fired';\n } else if (value === 0x05) {\n return 'Strobe return light not detected';\n } else if (value === 0x07) {\n return 'Strobe return light detected';\n } else if (value === 0x09) {\n return 'Flash fired, compulsory flash mode';\n } else if (value === 0x0d) {\n return 'Flash fired, compulsory flash mode, return light not detected';\n } else if (value === 0x0f) {\n return 'Flash fired, compulsory flash mode, return light detected';\n } else if (value === 0x10) {\n return 'Flash did not fire, compulsory flash mode';\n } else if (value === 0x18) {\n return 'Flash did not fire, auto mode';\n } else if (value === 0x19) {\n return 'Flash fired, auto mode';\n } else if (value === 0x1d) {\n return 'Flash fired, auto mode, return light not detected';\n } else if (value === 0x1f) {\n return 'Flash fired, auto mode, return light detected';\n } else if (value === 0x20) {\n return 'No flash function';\n } else if (value === 0x41) {\n return 'Flash fired, red-eye reduction mode';\n } else if (value === 0x45) {\n return 'Flash fired, red-eye reduction mode, return light not detected';\n } else if (value === 0x47) {\n return 'Flash fired, red-eye reduction mode, return light detected';\n } else if (value === 0x49) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode';\n } else if (value === 0x4d) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected';\n } else if (value === 0x4f) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected';\n } else if (value === 0x59) {\n return 'Flash fired, auto mode, red-eye reduction mode';\n } else if (value === 0x5d) {\n return 'Flash fired, auto mode, return light not detected, red-eye reduction mode';\n } else if (value === 0x5f) {\n return 'Flash fired, auto mode, return light detected, red-eye reduction mode';\n }\n return 'Unknown';\n }\n },\n 0x920a: {\n 'name': 'FocalLength',\n 'description': TagNamesCommon.FocalLength\n },\n 0x9211: 'ImageNumber',\n 0x9212: {\n name: 'SecurityClassification',\n description: (value) => ({\n 'C': 'Confidential',\n 'R': 'Restricted',\n 'S': 'Secret',\n 'T': 'Top Secret',\n 'U': 'Unclassified'\n })[value] || 'Unknown'\n },\n 0x9213: 'ImageHistory',\n 0x9214: {\n 'name': 'SubjectArea',\n 'description': (value) => {\n if (value.length === 2) {\n return `Location; X: ${value[0]}, Y: ${value[1]}`;\n } else if (value.length === 3) {\n return `Circle; X: ${value[0]}, Y: ${value[1]}, diameter: ${value[2]}`;\n } else if (value.length === 4) {\n return `Rectangle; X: ${value[0]}, Y: ${value[1]}, width: ${value[2]}, height: ${value[3]}`;\n }\n return 'Unknown';\n }\n },\n 0x927c: {\n 'name': 'MakerNote',\n 'description': () => '[Raw maker note data]'\n },\n 0x9286: {\n 'name': 'UserComment',\n 'description': getEncodedString\n },\n 0x9290: 'SubSecTime',\n 0x9291: 'SubSecTimeOriginal',\n 0x9292: 'SubSecTimeDigitized',\n 0x935c: 'ImageSourceData',\n 0x9400: {\n 'name': 'AmbientTemperature',\n 'description': (value) => (value[0] / value[1]) + ' °C'\n },\n 0x9401: {\n 'name': 'Humidity',\n 'description': (value) => (value[0] / value[1]) + ' %'\n },\n 0x9402: {\n 'name': 'Pressure',\n 'description': (value) => (value[0] / value[1]) + ' hPa'\n },\n 0x9403: {\n 'name': 'WaterDepth',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9404: {\n 'name': 'Acceleration',\n 'description': (value) => (value[0] / value[1]) + ' mGal'\n },\n 0x9405: {\n 'name': 'CameraElevationAngle',\n 'description': (value) => (value[0] / value[1]) + ' °'\n },\n 0xa000: {\n 'name': 'FlashpixVersion',\n 'description': (value) => value.map((charCode) => String.fromCharCode(charCode)).join('')\n },\n 0xa001: {\n 'name': 'ColorSpace',\n 'description': TagNamesCommon.ColorSpace\n },\n 0xa002: 'PixelXDimension',\n 0xa003: 'PixelYDimension',\n 0xa004: 'RelatedSoundFile',\n 0xa005: 'Interoperability IFD Pointer',\n 0xa20b: 'FlashEnergy',\n 0xa20c: {\n 'name': 'SpatialFrequencyResponse',\n 'description': () => '[Raw SFR table data]'\n },\n 0xa20e: 'FocalPlaneXResolution',\n 0xa20f: 'FocalPlaneYResolution',\n 0xa210: {\n 'name': 'FocalPlaneResolutionUnit',\n 'description': TagNamesCommon.FocalPlaneResolutionUnit\n },\n 0xa214: {\n 'name': 'SubjectLocation',\n 'description': ([x, y]) => `X: ${x}, Y: ${y}`\n },\n 0xa215: 'ExposureIndex',\n 0xa217: {\n 'name': 'SensingMethod',\n 'description': (value) => {\n if (value === 1) {\n return 'Undefined';\n } else if (value === 2) {\n return 'One-chip color area sensor';\n } else if (value === 3) {\n return 'Two-chip color area sensor';\n } else if (value === 4) {\n return 'Three-chip color area sensor';\n } else if (value === 5) {\n return 'Color sequential area sensor';\n } else if (value === 7) {\n return 'Trilinear sensor';\n } else if (value === 8) {\n return 'Color sequential linear sensor';\n }\n return 'Unknown';\n }\n },\n 0xa300: {\n 'name': 'FileSource',\n 'description': (value) => {\n if (value === 3) {\n return 'DSC';\n }\n return 'Unknown';\n }\n },\n 0xa301: {\n 'name': 'SceneType',\n 'description': (value) => {\n if (value === 1) {\n return 'A directly photographed image';\n }\n return 'Unknown';\n }\n },\n 0xa302: {\n 'name': 'CFAPattern',\n 'description': () => '[Raw CFA pattern table data]'\n },\n 0xa401: {\n 'name': 'CustomRendered',\n 'description': TagNamesCommon.CustomRendered\n },\n 0xa402: {\n 'name': 'ExposureMode',\n 'description': TagNamesCommon.ExposureMode\n },\n 0xa403: {\n 'name': 'WhiteBalance',\n 'description': TagNamesCommon.WhiteBalance\n },\n 0xa404: {\n 'name': 'DigitalZoomRatio',\n 'description': (value) => {\n if (value[0] === 0) {\n return 'Digital zoom was not used';\n }\n return '' + (value[0] / value[1]);\n }\n },\n 0xa405: {\n 'name': 'FocalLengthIn35mmFilm',\n 'description': (value) => {\n if (value === 0) {\n return 'Unknown';\n }\n return value;\n }\n },\n 0xa406: {\n 'name': 'SceneCaptureType',\n 'description': TagNamesCommon.SceneCaptureType\n },\n 0xa407: {\n 'name': 'GainControl',\n 'description': (value) => {\n if (value === 0) {\n return 'None';\n } else if (value === 1) {\n return 'Low gain up';\n } else if (value === 2) {\n return 'High gain up';\n } else if (value === 3) {\n return 'Low gain down';\n } else if (value === 4) {\n return 'High gain down';\n }\n return 'Unknown';\n }\n },\n 0xa408: {\n 'name': 'Contrast',\n 'description': TagNamesCommon.Contrast\n },\n 0xa409: {\n 'name': 'Saturation',\n 'description': TagNamesCommon.Saturation\n },\n 0xa40a: {\n 'name': 'Sharpness',\n 'description': TagNamesCommon.Sharpness\n },\n 0xa40b: {\n 'name': 'DeviceSettingDescription',\n 'description': () => '[Raw device settings table data]'\n },\n 0xa40c: {\n 'name': 'SubjectDistanceRange',\n 'description': (value) => {\n if (value === 1) {\n return 'Macro';\n } else if (value === 2) {\n return 'Close view';\n } else if (value === 3) {\n return 'Distant view';\n }\n return 'Unknown';\n }\n },\n 0xa420: 'ImageUniqueID',\n 0xa430: 'CameraOwnerName',\n 0xa431: 'BodySerialNumber',\n 0xa432: {\n 'name': 'LensSpecification',\n 'description': (value) => {\n const focalLengthFrom = parseFloat((value[0][0] / value[0][1]).toFixed(5));\n const focalLengthTo = parseFloat((value[1][0] / value[1][1]).toFixed(5));\n const focalLengths = `${focalLengthFrom}-${focalLengthTo} mm`;\n if (value[3][1] === 0) {\n return `${focalLengths} f/?`;\n }\n const maxAperture = 1 / ((value[2][1] / value[2][1]) / (value[3][0] / value[3][1]));\n return `${focalLengths} f/${parseFloat(maxAperture.toFixed(5))}`;\n }\n },\n 0xa433: 'LensMake',\n 0xa434: 'LensModel',\n 0xa435: 'LensSerialNumber',\n 0xa460: {\n name: 'CompositeImage',\n description: (value) => ({\n 1: 'Not a Composite Image',\n 2: 'General Composite Image',\n 3: 'Composite Image Captured While Shooting',\n })[value] || 'Unknown'\n },\n 0xa461: 'SourceImageNumberOfCompositeImage',\n 0xa462: 'SourceExposureTimesOfCompositeImage',\n 0xa500: 'Gamma',\n 0xea1c: 'Padding',\n 0xea1d: 'OffsetSchema',\n 0xfde8: 'OwnerName',\n 0xfde9: 'SerialNumber',\n 0xfdea: 'Lens',\n 0xfe4c: 'RawFile',\n 0xfe4d: 'Converter',\n 0xfe4e: 'WhiteBalance',\n 0xfe51: 'Exposure',\n 0xfe52: 'Shadows',\n 0xfe53: 'Brightness',\n 0xfe54: 'Contrast',\n 0xfe55: 'Saturation',\n 0xfe56: 'Sharpness',\n 0xfe57: 'Smoothness',\n 0xfe58: 'MoireFilter'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n 0x0004: {\n 'name': 'ShotInfo',\n 'description': (value) => value\n },\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\n\nconst typeSizes = {\n 1: 1, // BYTE\n 2: 1, // ASCII\n 3: 2, // SHORT\n 4: 4, // LONG\n 5: 8, // RATIONAL\n 7: 1, // UNDEFINED\n 9: 4, // SLONG\n 10: 8, // SRATIONAL\n 13: 4 // IFD\n};\n\nconst tagTypes = {\n 'BYTE': 1,\n 'ASCII': 2,\n 'SHORT': 3,\n 'LONG': 4,\n 'RATIONAL': 5,\n 'UNDEFINED': 7,\n 'SLONG': 9,\n 'SRATIONAL': 10,\n 'IFD': 13\n};\n\nexport default {\n getAsciiValue,\n getByteAt,\n getAsciiAt,\n getShortAt,\n getLongAt,\n getRationalAt,\n getUndefinedAt,\n getSlongAt,\n getSrationalAt,\n getIfdPointerAt,\n typeSizes,\n tagTypes,\n getTypeSize\n};\n\nfunction getAsciiValue(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode));\n}\n\nfunction getByteAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getAsciiAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getShortAt(dataView, offset, byteOrder) {\n return dataView.getUint16(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getLongAt(dataView, offset, byteOrder) {\n return dataView.getUint32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getRationalAt(dataView, offset, byteOrder) {\n return [getLongAt(dataView, offset, byteOrder), getLongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getUndefinedAt(dataView, offset) {\n return getByteAt(dataView, offset);\n}\n\nfunction getSlongAt(dataView, offset, byteOrder) {\n return dataView.getInt32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getSrationalAt(dataView, offset, byteOrder) {\n return [getSlongAt(dataView, offset, byteOrder), getSlongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getIfdPointerAt(dataView, offset, byteOrder) {\n return getLongAt(dataView, offset, byteOrder);\n}\n\nfunction getTypeSize(typeName) {\n if (tagTypes[typeName] === undefined) {\n throw new Error('No such type found.');\n }\n\n return typeSizes[tagTypes[typeName]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport Types from './types.js';\nimport TagNames, {IFD_TYPE_0TH, IFD_TYPE_1ST} from './tag-names.js';\n\nconst getTagValueAt = {\n 1: Types.getByteAt,\n 2: Types.getAsciiAt,\n 3: Types.getShortAt,\n 4: Types.getLongAt,\n 5: Types.getRationalAt,\n 7: Types.getUndefinedAt,\n 9: Types.getSlongAt,\n 10: Types.getSrationalAt,\n 13: Types.getIfdPointerAt\n};\n\nexport function get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder) {\n return tiffHeaderOffset + Types.getLongAt(dataView, tiffHeaderOffset + 4, byteOrder);\n}\n\nexport function readIfd(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const FIELD_COUNT_SIZE = Types.getTypeSize('SHORT');\n const FIELD_SIZE = 12;\n\n const tags = {};\n const numberOfFields = getNumberOfFields(dataView, offset, byteOrder);\n\n offset += FIELD_COUNT_SIZE;\n for (let fieldIndex = 0; fieldIndex < numberOfFields; fieldIndex++) {\n if (offset + FIELD_SIZE > dataView.byteLength) {\n break;\n }\n\n const tag = readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown);\n if (tag !== undefined) {\n tags[tag.name] = {\n 'id': tag.id,\n 'value': tag.value,\n 'description': tag.description\n };\n if (tag.name === 'MakerNote') {\n tags[tag.name].__offset = tag.__offset;\n }\n }\n\n offset += FIELD_SIZE;\n }\n\n if (Constants.USE_THUMBNAIL && (offset < dataView.byteLength - Types.getTypeSize('LONG'))) {\n const nextIfdOffset = Types.getLongAt(dataView, offset, byteOrder);\n if (nextIfdOffset !== 0 && ifdType === IFD_TYPE_0TH) {\n tags['Thumbnail'] = readIfd(dataView, IFD_TYPE_1ST, tiffHeaderOffset, tiffHeaderOffset + nextIfdOffset, byteOrder, includeUnknown);\n }\n }\n\n return tags;\n}\n\nfunction getNumberOfFields(dataView, offset, byteOrder) {\n if (offset + Types.getTypeSize('SHORT') <= dataView.byteLength) {\n return Types.getShortAt(dataView, offset, byteOrder);\n }\n return 0;\n}\n\nfunction readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const TAG_CODE_IPTC_NAA = 0x83bb;\n const TAG_TYPE_OFFSET = Types.getTypeSize('SHORT');\n const TAG_COUNT_OFFSET = TAG_TYPE_OFFSET + Types.getTypeSize('SHORT');\n const TAG_VALUE_OFFSET = TAG_COUNT_OFFSET + Types.getTypeSize('LONG');\n\n const tagCode = Types.getShortAt(dataView, offset, byteOrder);\n const tagType = Types.getShortAt(dataView, offset + TAG_TYPE_OFFSET, byteOrder);\n const tagCount = Types.getLongAt(dataView, offset + TAG_COUNT_OFFSET, byteOrder);\n let tagValue;\n let tagValueOffset;\n\n if (Types.typeSizes[tagType] === undefined || (!includeUnknown && TagNames[ifdType][tagCode] === undefined)) {\n return undefined;\n }\n\n if (tagValueFitsInOffsetSlot(tagType, tagCount)) {\n tagValueOffset = offset + TAG_VALUE_OFFSET;\n tagValue = getTagValue(dataView, tagValueOffset, tagType, tagCount, byteOrder);\n } else {\n tagValueOffset = Types.getLongAt(dataView, offset + TAG_VALUE_OFFSET, byteOrder);\n if (tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount)) {\n const forceByteType = tagCode === TAG_CODE_IPTC_NAA;\n tagValue = getTagValue(dataView, tiffHeaderOffset + tagValueOffset, tagType, tagCount, byteOrder, forceByteType);\n } else {\n tagValue = '';\n }\n }\n\n if (tagType === Types.tagTypes['ASCII']) {\n tagValue = splitNullSeparatedAsciiString(tagValue);\n tagValue = decodeAsciiValue(tagValue);\n }\n\n let tagName = `undefined-${tagCode}`;\n let tagDescription = tagValue;\n\n if (TagNames[ifdType][tagCode] !== undefined) {\n if ((TagNames[ifdType][tagCode]['name'] !== undefined) && (TagNames[ifdType][tagCode]['description'] !== undefined)) {\n tagName = TagNames[ifdType][tagCode]['name'];\n try {\n tagDescription = TagNames[ifdType][tagCode]['description'](tagValue);\n } catch (error) {\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n } else if ((tagType === Types.tagTypes['RATIONAL']) || (tagType === Types.tagTypes['SRATIONAL'])) {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = '' + (tagValue[0] / tagValue[1]);\n } else {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n }\n\n return {\n id: tagCode,\n name: tagName,\n value: tagValue,\n description: tagDescription,\n __offset: tagValueOffset\n };\n}\n\nfunction tagValueFitsInOffsetSlot(tagType, tagCount) {\n return Types.typeSizes[tagType] * tagCount <= Types.getTypeSize('LONG');\n}\n\nfunction getTagValue(dataView, offset, type, count, byteOrder, forceByteType = false) {\n let value = [];\n\n if (forceByteType) {\n count = count * Types.typeSizes[type];\n type = Types.tagTypes['BYTE'];\n }\n for (let valueIndex = 0; valueIndex < count; valueIndex++) {\n value.push(getTagValueAt[type](dataView, offset, byteOrder));\n offset += Types.typeSizes[type];\n }\n\n if (type === Types.tagTypes['ASCII']) {\n value = Types.getAsciiValue(value);\n } else if (value.length === 1) {\n value = value[0];\n }\n\n return value;\n}\n\nfunction tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount) {\n return tiffHeaderOffset + tagValueOffset + Types.typeSizes[tagType] * tagCount <= dataView.byteLength;\n}\n\nfunction splitNullSeparatedAsciiString(string) {\n const tagValue = [];\n let i = 0;\n\n for (let j = 0; j < string.length; j++) {\n if (string[j] === '\\x00') {\n i++;\n continue;\n }\n if (tagValue[i] === undefined) {\n tagValue[i] = '';\n }\n tagValue[i] += string[j];\n }\n\n return tagValue;\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return asciiValue.map((value) => decodeURIComponent(escape(value)));\n } catch (error) {\n return asciiValue;\n }\n}\n\nfunction getDescriptionFromTagValue(tagValue) {\n if (tagValue instanceof Array) {\n return tagValue.join(', ');\n }\n return tagValue;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport ByteOrder from './byte-order.js';\nimport {IFD_TYPE_0TH, IFD_TYPE_EXIF, IFD_TYPE_GPS, IFD_TYPE_INTEROPERABILITY} from './tag-names.js';\nimport {readIfd, get0thIfdOffset} from './tags-helpers.js';\n\nconst EXIF_IFD_POINTER_KEY = 'Exif IFD Pointer';\nconst GPS_INFO_IFD_POINTER_KEY = 'GPS Info IFD Pointer';\nconst INTEROPERABILITY_IFD_POINTER_KEY = 'Interoperability IFD Pointer';\n\nexport default {\n read,\n};\n\nfunction read(dataView, tiffHeaderOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, tiffHeaderOffset);\n let tags = read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n\n return {tags, byteOrder};\n}\n\nfunction read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n return readIfd(dataView, IFD_TYPE_0TH, tiffHeaderOffset, get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder), byteOrder, includeUnknown);\n}\n\nfunction readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[EXIF_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_EXIF, tiffHeaderOffset, tiffHeaderOffset + tags[EXIF_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[GPS_INFO_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_GPS, tiffHeaderOffset, tiffHeaderOffset + tags[GPS_INFO_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[INTEROPERABILITY_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_INTEROPERABILITY, tiffHeaderOffset, tiffHeaderOffset + tags[INTEROPERABILITY_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\nimport Types from './types.js';\nimport {IFD_TYPE_MPF} from './tag-names.js';\nimport {deferInit, getBase64Image} from './utils.js';\nimport {readIfd, get0thIfdOffset} from './tags-helpers.js';\n\nexport default {\n read\n};\n\nconst ENTRY_SIZE = 16;\n\nfunction read(dataView, dataOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, dataOffset);\n const tags = readIfd(dataView, IFD_TYPE_MPF, dataOffset, get0thIfdOffset(dataView, dataOffset, byteOrder), byteOrder, includeUnknown);\n return addMpfImages(dataView, dataOffset, tags, byteOrder);\n}\n\nfunction addMpfImages(dataView, dataOffset, tags, byteOrder) {\n if (!tags['MPEntry']) {\n return tags;\n }\n\n const images = [];\n for (let i = 0; i < Math.ceil(tags['MPEntry'].value.length / ENTRY_SIZE); i++) {\n images[i] = {};\n\n const attributes = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageFlags'] = getImageFlags(attributes);\n images[i]['ImageFormat'] = getImageFormat(attributes);\n images[i]['ImageType'] = getImageType(attributes);\n\n const imageSize = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 4, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageSize'] = {\n value: imageSize,\n description: '' + imageSize\n };\n\n const imageOffset = getImageOffset(i, tags['MPEntry'], byteOrder, dataOffset);\n images[i]['ImageOffset'] = {\n value: imageOffset,\n description: '' + imageOffset\n };\n\n const dependentImage1EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 12, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage1EntryNumber'] = {\n value: dependentImage1EntryNumber,\n description: '' + dependentImage1EntryNumber\n };\n\n const dependentImage2EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 14, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage2EntryNumber'] = {\n value: dependentImage2EntryNumber,\n description: '' + dependentImage2EntryNumber\n };\n\n images[i].image = dataView.buffer.slice(imageOffset, imageOffset + imageSize);\n deferInit(images[i], 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n tags['Images'] = images;\n\n return tags;\n}\n\nfunction getImageNumberValue(entries, offset, size, byteOrder) {\n if (byteOrder === ByteOrder.LITTLE_ENDIAN) {\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * i);\n }\n return value;\n }\n\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * (size - 1 - i));\n }\n return value;\n}\n\nfunction getImageFlags(attributes) {\n const flags = [\n (attributes >> 31) & 0x1,\n (attributes >> 30) & 0x1,\n (attributes >> 29) & 0x1\n ];\n\n const flagsDescription = [];\n\n if (flags[0]) {\n flagsDescription.push('Dependent Parent Image');\n }\n if (flags[1]) {\n flagsDescription.push('Dependent Child Image');\n }\n if (flags[2]) {\n flagsDescription.push('Representative Image');\n }\n\n return {\n value: flags,\n description: flagsDescription.join(', ') || 'None'\n };\n}\n\nfunction getImageFormat(attributes) {\n const imageFormat = attributes >> 24 & 0x7;\n return {\n value: imageFormat,\n description: imageFormat === 0 ? 'JPEG' : 'Unknown'\n };\n}\n\nfunction getImageType(attributes) {\n const type = attributes & 0xffffff;\n const descriptions = {\n 0x30000: 'Baseline MP Primary Image',\n 0x10001: 'Large Thumbnail (VGA equivalent)',\n 0x10002: 'Large Thumbnail (Full HD equivalent)',\n 0x20001: 'Multi-Frame Image (Panorama)',\n 0x20002: 'Multi-Frame Image (Disparity)',\n 0x20003: 'Multi-Frame Image (Multi-Angle)',\n 0x0: 'Undefined',\n };\n\n return {\n value: type,\n description: descriptions[type] || 'Unknown'\n };\n}\n\nfunction getImageOffset(imageIndex, mpEntry, byteOrder, dataOffset) {\n if (isFirstIndividualImage(imageIndex)) {\n return 0;\n }\n return getImageNumberValue(mpEntry.value, imageIndex * ENTRY_SIZE + 8, Types.getTypeSize('LONG'), byteOrder) + dataOffset;\n}\n\nfunction isFirstIndividualImage(imageIndex) {\n return imageIndex === 0;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n const length = getLength(dataView, fileDataOffset);\n const numberOfColorComponents = getNumberOfColorComponents(dataView, fileDataOffset, length);\n return {\n 'Bits Per Sample': getDataPrecision(dataView, fileDataOffset, length),\n 'Image Height': getImageHeight(dataView, fileDataOffset, length),\n 'Image Width': getImageWidth(dataView, fileDataOffset, length),\n 'Color Components': numberOfColorComponents,\n 'Subsampling': numberOfColorComponents && getSubsampling(dataView, fileDataOffset, numberOfColorComponents.value, length)\n };\n}\n\nfunction getLength(dataView, fileDataOffset) {\n return Types.getShortAt(dataView, fileDataOffset);\n}\n\nfunction getDataPrecision(dataView, fileDataOffset, length) {\n const OFFSET = 2;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset, length) {\n const OFFSET = 3;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset, length) {\n const OFFSET = 5;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getNumberOfColorComponents(dataView, fileDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getSubsampling(dataView, fileDataOffset, numberOfColorComponents, length) {\n const OFFSET = 8;\n const SIZE = 3 * numberOfColorComponents;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const components = [];\n\n for (let i = 0; i < numberOfColorComponents; i++) {\n const componentOffset = fileDataOffset + OFFSET + i * 3;\n components.push([\n Types.getByteAt(dataView, componentOffset),\n Types.getByteAt(dataView, componentOffset + 1),\n Types.getByteAt(dataView, componentOffset + 2)\n ]);\n }\n\n return {\n value: components,\n description: components.length > 1 ? getComponentIds(components) + getSamplingType(components) : ''\n };\n}\n\nfunction getComponentIds(components) {\n const ids = {\n 0x01: 'Y',\n 0x02: 'Cb',\n 0x03: 'Cr',\n 0x04: 'I',\n 0x05: 'Q',\n };\n\n return components.map((compontent) => ids[compontent[0]]).join('');\n}\n\nfunction getSamplingType(components) {\n const types = {\n 0x11: '4:4:4 (1 1)',\n 0x12: '4:4:0 (1 2)',\n 0x14: '4:4:1 (1 4)',\n 0x21: '4:2:2 (2 1)',\n 0x22: '4:2:0 (2 2)',\n 0x24: '4:2:1 (2 4)',\n 0x41: '4:1:1 (4 1)',\n 0x42: '4:1:0 (4 2)'\n };\n\n if (components.length === 0 || components[0][1] === undefined || types[components[0][1]] === undefined) {\n return '';\n }\n\n return types[components[0][1]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, jfifDataOffset) {\n const length = getLength(dataView, jfifDataOffset);\n const thumbnailWidth = getThumbnailWidth(dataView, jfifDataOffset, length);\n const thumbnailHeight = getThumbnailHeight(dataView, jfifDataOffset, length);\n const tags = {\n 'JFIF Version': getVersion(dataView, jfifDataOffset, length),\n 'Resolution Unit': getResolutionUnit(dataView, jfifDataOffset, length),\n 'XResolution': getXResolution(dataView, jfifDataOffset, length),\n 'YResolution': getYResolution(dataView, jfifDataOffset, length),\n 'JFIF Thumbnail Width': thumbnailWidth,\n 'JFIF Thumbnail Height': thumbnailHeight\n };\n\n if (thumbnailWidth !== undefined && thumbnailHeight !== undefined) {\n const thumbnail = getThumbnail(dataView, jfifDataOffset, 3 * thumbnailWidth.value * thumbnailHeight.value, length);\n if (thumbnail) {\n tags['JFIF Thumbnail'] = thumbnail;\n }\n }\n\n for (const tagName in tags) {\n if (tags[tagName] === undefined) {\n delete tags[tagName];\n }\n }\n\n return tags;\n}\n\nfunction getLength(dataView, jfifDataOffset) {\n return Types.getShortAt(dataView, jfifDataOffset);\n}\n\nfunction getVersion(dataView, jfifDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const majorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n const minorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET + 1);\n return {\n value: majorVersion * 0x100 + minorVersion,\n description: majorVersion + '.' + minorVersion\n };\n}\n\nfunction getResolutionUnit(dataView, jfifDataOffset, length) {\n const OFFSET = 9;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: getResolutionUnitDescription(value)\n };\n}\n\nfunction getResolutionUnitDescription(value) {\n if (value === 0) {\n return 'None';\n }\n if (value === 1) {\n return 'inches';\n }\n if (value === 2) {\n return 'cm';\n }\n return 'Unknown';\n}\n\nfunction getXResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 10;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getYResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 12;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getThumbnailWidth(dataView, jfifDataOffset, length) {\n const OFFSET = 14;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnailHeight(dataView, jfifDataOffset, length) {\n const OFFSET = 15;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnail(dataView, jfifDataOffset, thumbnailLength, length) {\n const OFFSET = 16;\n\n if (thumbnailLength === 0 || OFFSET + thumbnailLength > length) {\n return undefined;\n }\n\n const value = dataView.buffer.slice(jfifDataOffset + OFFSET, jfifDataOffset + OFFSET + thumbnailLength);\n return {\n value,\n description: '<24-bit RGB pixel data>'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 'iptc': {\n 0x0100: {\n 'name': 'Model Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0105: {\n 'name': 'Destination',\n 'repeatable': true\n },\n 0x0114: {\n 'name': 'File Format',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0116: {\n 'name': 'File Format Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x011e: 'Service Identifier',\n 0x0128: 'Envelope Number',\n 0x0132: 'Product ID',\n 0x013c: 'Envelope Priority',\n 0x0146: {\n 'name': 'Date Sent',\n 'description': getCreationDate\n },\n 0x0150: {\n 'name': 'Time Sent',\n 'description': getCreationTime\n },\n 0x015a: {\n 'name': 'Coded Character Set',\n 'description': getEncodingName,\n 'encoding_name': getEncodingName,\n },\n 0x0164: 'UNO',\n 0x0178: {\n 'name': 'ARM Identifier',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x017a: {\n 'name': 'ARM Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0200: {\n 'name': 'Record Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0203: 'Object Type Reference',\n 0x0204: 'Object Attribute Reference',\n 0x0205: 'Object Name',\n 0x0207: 'Edit Status',\n 0x0208: {\n 'name': 'Editorial Update',\n 'description': (value) => {\n if (getStringValue(value) === '01') {\n return 'Additional Language';\n }\n return 'Unknown';\n }\n },\n 0x020a: 'Urgency',\n 0x020c: {\n 'name': 'Subject Reference',\n 'repeatable': true,\n 'description': (value) => {\n const parts = getStringValue(value).split(':');\n return parts[2] + (parts[3] ? '/' + parts[3] : '') + (parts[4] ? '/' + parts[4] : '');\n }\n },\n 0x020f: 'Category',\n 0x0214: {\n 'name': 'Supplemental Category',\n 'repeatable': true\n },\n 0x0216: 'Fixture Identifier',\n 0x0219: {\n 'name': 'Keywords',\n 'repeatable': true\n },\n 0x021a: {\n 'name': 'Content Location Code',\n 'repeatable': true\n },\n 0x021b: {\n 'name': 'Content Location Name',\n 'repeatable': true\n },\n 0x021e: 'Release Date',\n 0x0223: 'Release Time',\n 0x0225: 'Expiration Date',\n 0x0226: 'Expiration Time',\n 0x0228: 'Special Instructions',\n 0x022a: {\n 'name': 'Action Advised',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === '01') {\n return 'Object Kill';\n } else if (string === '02') {\n return 'Object Replace';\n } else if (string === '03') {\n return 'Object Append';\n } else if (string === '04') {\n return 'Object Reference';\n }\n return 'Unknown';\n }\n },\n 0x022d: {\n 'name': 'Reference Service',\n 'repeatable': true\n },\n 0x022f: {\n 'name': 'Reference Date',\n 'repeatable': true\n },\n 0x0232: {\n 'name': 'Reference Number',\n 'repeatable': true\n },\n 0x0237: {\n 'name': 'Date Created',\n 'description': getCreationDate\n },\n 0x023c: {\n 'name': 'Time Created',\n 'description': getCreationTime\n },\n 0x023e: {\n 'name': 'Digital Creation Date',\n 'description': getCreationDate\n },\n 0x023f: {\n 'name': 'Digital Creation Time',\n 'description': getCreationTime\n },\n 0x0241: 'Originating Program',\n 0x0246: 'Program Version',\n 0x024b: {\n 'name': 'Object Cycle',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'a') {\n return 'morning';\n } else if (string === 'p') {\n return 'evening';\n } else if (string === 'b') {\n return 'both';\n }\n return 'Unknown';\n }\n },\n 0x0250: {\n 'name': 'By-line',\n 'repeatable': true\n },\n 0x0255: {\n 'name': 'By-line Title',\n 'repeatable': true\n },\n 0x025a: 'City',\n 0x025c: 'Sub-location',\n 0x025f: 'Province/State',\n 0x0264: 'Country/Primary Location Code',\n 0x0265: 'Country/Primary Location Name',\n 0x0267: 'Original Transmission Reference',\n 0x0269: 'Headline',\n 0x026e: 'Credit',\n 0x0273: 'Source',\n 0x0274: 'Copyright Notice',\n 0x0276: {\n 'name': 'Contact',\n 'repeatable': true\n },\n 0x0278: 'Caption/Abstract',\n 0x027a: {\n 'name': 'Writer/Editor',\n 'repeatable': true\n },\n 0x027d: {\n 'name': 'Rasterized Caption',\n 'description': (value) => value\n },\n 0x0282: 'Image Type',\n 0x0283: {\n 'name': 'Image Orientation',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'P') {\n return 'Portrait';\n } else if (string === 'L') {\n return 'Landscape';\n } else if (string === 'S') {\n return 'Square';\n }\n return 'Unknown';\n }\n },\n 0x0287: 'Language Identifier',\n 0x0296: {\n 'name': 'Audio Type',\n 'description': (value) => {\n const stringValue = getStringValue(value);\n const character0 = stringValue.charAt(0);\n const character1 = stringValue.charAt(1);\n let description = '';\n\n if (character0 === '1') {\n description += 'Mono';\n } else if (character0 === '2') {\n description += 'Stereo';\n }\n\n if (character1 === 'A') {\n description += ', actuality';\n } else if (character1 === 'C') {\n description += ', question and answer session';\n } else if (character1 === 'M') {\n description += ', music, transmitted by itself';\n } else if (character1 === 'Q') {\n description += ', response to a question';\n } else if (character1 === 'R') {\n description += ', raw sound';\n } else if (character1 === 'S') {\n description += ', scener';\n } else if (character1 === 'V') {\n description += ', voicer';\n } else if (character1 === 'W') {\n description += ', wrap';\n }\n\n if (description !== '') {\n return description;\n }\n return stringValue;\n }\n },\n 0x0297: {\n 'name': 'Audio Sampling Rate',\n 'description': (value) => parseInt(getStringValue(value), 10) + ' Hz'\n },\n 0x0298: {\n 'name': 'Audio Sampling Resolution',\n 'description': (value) => {\n const bits = parseInt(getStringValue(value), 10);\n return bits + (bits === 1 ? ' bit' : ' bits');\n }\n },\n 0x0299: {\n 'name': 'Audio Duration',\n 'description': (value) => {\n const duration = getStringValue(value);\n if (duration.length >= 6) {\n return duration.substr(0, 2) + ':' + duration.substr(2, 2) + ':' + duration.substr(4, 2);\n }\n return duration;\n }\n },\n 0x029a: 'Audio Outcue',\n 0x02ba: 'Short Document ID',\n 0x02bb: 'Unique Document ID',\n 0x02bc: 'Owner ID',\n 0x02c8: {\n 'name': (value) => {\n if (value.length === 2) {\n return 'ObjectData Preview File Format';\n }\n return 'Record 2 destination';\n },\n 'description': (value) => {\n if (value.length === 2) {\n const intValue = (value[0] << 8) + value[1];\n if (intValue === 0) {\n return 'No ObjectData';\n } else if (intValue === 1) {\n return 'IPTC-NAA Digital Newsphoto Parameter Record';\n } else if (intValue === 2) {\n return 'IPTC7901 Recommended Message Format';\n } else if (intValue === 3) {\n return 'Tagged Image File Format (Adobe/Aldus Image data)';\n } else if (intValue === 4) {\n return 'Illustrator (Adobe Graphics data)';\n } else if (intValue === 5) {\n return 'AppleSingle (Apple Computer Inc)';\n } else if (intValue === 6) {\n return 'NAA 89-3 (ANPA 1312)';\n } else if (intValue === 7) {\n return 'MacBinary II';\n } else if (intValue === 8) {\n return 'IPTC Unstructured Character Oriented File Format (UCOFF)';\n } else if (intValue === 9) {\n return 'United Press International ANPA 1312 variant';\n } else if (intValue === 10) {\n return 'United Press International Down-Load Message';\n } else if (intValue === 11) {\n return 'JPEG File Interchange (JFIF)';\n } else if (intValue === 12) {\n return 'Photo-CD Image-Pac (Eastman Kodak)';\n } else if (intValue === 13) {\n return 'Microsoft Bit Mapped Graphics File [*.BMP]';\n } else if (intValue === 14) {\n return 'Digital Audio File [*.WAV] (Microsoft & Creative Labs)';\n } else if (intValue === 15) {\n return 'Audio plus Moving Video [*.AVI] (Microsoft)';\n } else if (intValue === 16) {\n return 'PC DOS/Windows Executable Files [*.COM][*.EXE]';\n } else if (intValue === 17) {\n return 'Compressed Binary File [*.ZIP] (PKWare Inc)';\n } else if (intValue === 18) {\n return 'Audio Interchange File Format AIFF (Apple Computer Inc)';\n } else if (intValue === 19) {\n return 'RIFF Wave (Microsoft Corporation)';\n } else if (intValue === 20) {\n return 'Freehand (Macromedia/Aldus)';\n } else if (intValue === 21) {\n return 'Hypertext Markup Language \"HTML\" (The Internet Society)';\n } else if (intValue === 22) {\n return 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC';\n } else if (intValue === 23) {\n return 'MPEG 2 Audio Layer 3, ISO/IEC';\n } else if (intValue === 24) {\n return 'Portable Document File (*.PDF) Adobe';\n } else if (intValue === 25) {\n return 'News Industry Text Format (NITF)';\n } else if (intValue === 26) {\n return 'Tape Archive (*.TAR)';\n } else if (intValue === 27) {\n return 'Tidningarnas Telegrambyrå NITF version (TTNITF DTD)';\n } else if (intValue === 28) {\n return 'Ritzaus Bureau NITF version (RBNITF DTD)';\n } else if (intValue === 29) {\n return 'Corel Draw [*.CDR]';\n }\n return `Unknown format ${intValue}`;\n }\n return getStringValue(value);\n }\n },\n 0x02c9: {\n 'name': 'ObjectData Preview File Format Version',\n 'description': (value, tags) => {\n // Format ID, Version ID, Version Description\n const formatVersions = {\n '00': {'00': '1'},\n '01': {'01': '1', '02': '2', '03': '3', '04': '4'},\n '02': {'04': '4'},\n '03': {'01': '5.0', '02': '6.0'},\n '04': {'01': '1.40'},\n '05': {'01': '2'},\n '06': {'01': '1'},\n '11': {'01': '1.02'},\n '20': {'01': '3.1', '02': '4.0', '03': '5.0', '04': '5.5'},\n '21': {'02': '2.0'}\n };\n const stringValue = getStringValue(value);\n\n if (tags['ObjectData Preview File Format']) {\n const objectDataPreviewFileFormat = getStringValue(tags['ObjectData Preview File Format'].value);\n if (formatVersions[objectDataPreviewFileFormat]\n && formatVersions[objectDataPreviewFileFormat][stringValue]) {\n return formatVersions[objectDataPreviewFileFormat][stringValue];\n }\n }\n\n return stringValue;\n }\n },\n 0x02ca: 'ObjectData Preview Data',\n 0x070a: {\n 'name': 'Size Mode',\n 'description': (value) => {\n return (value[0]).toString();\n }\n },\n 0x0714: {\n 'name': 'Max Subfile Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075a: {\n 'name': 'ObjectData Size Announced',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075f: {\n 'name': 'Maximum ObjectData Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n }\n }\n};\n\nfunction getCreationDate(value) {\n const date = getStringValue(value);\n\n if (date.length >= 8) {\n return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);\n }\n\n return date;\n}\n\nfunction getCreationTime(value) {\n const time = getStringValue(value);\n let parsedTime = time;\n\n if (time.length >= 6) {\n parsedTime = time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);\n if (time.length === 11) {\n parsedTime += time.substr(6, 1) + time.substr(7, 2) + ':' + time.substr(9, 2);\n }\n }\n\n return parsedTime;\n}\n\nfunction getEncodingName(value) {\n const string = getStringValue(value);\n if (string === '\\x1b%G') {\n return 'UTF-8';\n } else if (string === '\\x1b%5') {\n return 'Windows-1252';\n } else if (string === '\\x1b%/G') {\n return 'UTF-8 Level 1';\n } else if (string === '\\x1b%/H') {\n return 'UTF-8 Level 2';\n } else if (string === '\\x1b%/I') {\n return 'UTF-8 Level 3';\n } else if (string === '\\x1B/A') {\n return 'ISO-8859-1';\n } else if (string === '\\x1B/B') {\n return 'ISO-8859-2';\n } else if (string === '\\x1B/C') {\n return 'ISO-8859-3';\n } else if (string === '\\x1B/D') {\n return 'ISO-8859-4';\n } else if (string === '\\x1B/@') {\n return 'ISO-8859-5';\n } else if (string === '\\x1B/G') {\n return 'ISO-8859-6';\n } else if (string === '\\x1B/F') {\n return 'ISO-8859-7';\n } else if (string === '\\x1B/H') {\n return 'ISO-8859-8';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof TextDecoder !== 'undefined') {\n return TextDecoder;\n }\n\n return undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TextDecoder from './text-decoder.js';\n\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n decode,\n TAG_HEADER_SIZE\n};\n\nfunction decode(encoding, tagValue) {\n const Decoder = TextDecoder.get();\n if ((typeof Decoder !== 'undefined') && (encoding !== undefined)) {\n try {\n return new Decoder(encoding).decode(tagValue instanceof DataView ? tagValue.buffer : Uint8Array.from(tagValue));\n } catch (error) {\n // Pass through and fall back to ASCII decoding.\n }\n }\n\n const stringValue = tagValue.map((charCode) => String.fromCharCode(charCode)).join('');\n return decodeAsciiValue(stringValue);\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return decodeURIComponent(escape(asciiValue));\n } catch (error) {\n return asciiValue;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport IptcTagNames from './iptc-tag-names.js';\nimport TagDecoder from './tag-decoder.js';\n\nconst BYTES_8BIM = 0x3842494d;\nconst BYTES_8BIM_SIZE = 4;\nconst RESOURCE_BLOCK_HEADER_SIZE = BYTES_8BIM_SIZE + 8;\nconst NAA_RESOURCE_BLOCK_TYPE = 0x0404;\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n read\n};\n\nfunction read(dataView, dataOffset, includeUnknown) {\n try {\n if (Array.isArray(dataView)) {\n return parseTags(new DataView(Uint8Array.from(dataView).buffer), {size: dataView.length}, 0, includeUnknown);\n }\n const {naaBlock, dataOffset: newDataOffset} = getNaaResourceBlock(dataView, dataOffset);\n return parseTags(dataView, naaBlock, newDataOffset, includeUnknown);\n } catch (error) {\n return {};\n }\n}\n\nfunction getNaaResourceBlock(dataView, dataOffset) {\n while (dataOffset + RESOURCE_BLOCK_HEADER_SIZE <= dataView.byteLength) {\n const resourceBlock = getResourceBlock(dataView, dataOffset);\n if (isNaaResourceBlock(resourceBlock)) {\n return {naaBlock: resourceBlock, dataOffset: dataOffset + RESOURCE_BLOCK_HEADER_SIZE};\n }\n dataOffset += RESOURCE_BLOCK_HEADER_SIZE + resourceBlock.size + getBlockPadding(resourceBlock);\n }\n throw new Error('No IPTC NAA resource block.');\n}\n\nfunction getResourceBlock(dataView, dataOffset) {\n const RESOURCE_BLOCK_SIZE_OFFSET = 10;\n\n if (dataView.getUint32(dataOffset, false) !== BYTES_8BIM) {\n throw new Error('Not an IPTC resource block.');\n }\n\n return {\n type: dataView.getUint16(dataOffset + BYTES_8BIM_SIZE),\n size: dataView.getUint16(dataOffset + RESOURCE_BLOCK_SIZE_OFFSET)\n };\n}\n\nfunction isNaaResourceBlock(resourceBlock) {\n return resourceBlock.type === NAA_RESOURCE_BLOCK_TYPE;\n}\n\nfunction getBlockPadding(resourceBlock) {\n if (resourceBlock.size % 2 !== 0) {\n return 1;\n }\n return 0;\n}\n\nfunction parseTags(dataView, naaBlock, dataOffset, includeUnknown) {\n const tags = {};\n let encoding = undefined;\n\n const endOfBlockOffset = dataOffset + naaBlock['size'];\n\n while ((dataOffset < endOfBlockOffset) && (dataOffset < dataView.byteLength)) {\n const {tag, tagSize} = readTag(dataView, dataOffset, tags, encoding, includeUnknown);\n\n if (tag === null) {\n break;\n }\n\n if (tag) {\n if ('encoding' in tag) {\n encoding = tag.encoding;\n }\n\n if ((tags[tag.name] === undefined) || (tag['repeatable'] === undefined)) {\n tags[tag.name] = {\n id: tag.id,\n value: tag.value,\n description: tag.description\n };\n } else {\n if (!(tags[tag.name] instanceof Array)) {\n tags[tag.name] = [{\n id: tags[tag.name].id,\n value: tags[tag.name].value,\n description: tags[tag.name].description\n }];\n }\n tags[tag.name].push({\n id: tag.id,\n value: tag.value,\n description: tag.description\n });\n }\n }\n\n dataOffset += TAG_HEADER_SIZE + tagSize;\n }\n\n return tags;\n}\n\nfunction readTag(dataView, dataOffset, tags, encoding, includeUnknown) {\n const TAG_CODE_OFFSET = 1;\n const TAG_SIZE_OFFSET = 3;\n\n if (leadByteIsMissing(dataView, dataOffset)) {\n return {tag: null, tagSize: 0};\n }\n\n const tagCode = dataView.getUint16(dataOffset + TAG_CODE_OFFSET);\n const tagSize = dataView.getUint16(dataOffset + TAG_SIZE_OFFSET);\n\n if (!includeUnknown && !IptcTagNames['iptc'][tagCode]) {\n return {tag: undefined, tagSize};\n }\n\n const tagValue = getTagValue(dataView, dataOffset + TAG_HEADER_SIZE, tagSize);\n\n const tag = {\n id: tagCode,\n name: getTagName(IptcTagNames['iptc'][tagCode], tagCode, tagValue),\n value: tagValue,\n description: getTagDescription(IptcTagNames['iptc'][tagCode], tagValue, tags, encoding)\n };\n if (tagIsRepeatable(tagCode)) {\n tag['repeatable'] = true;\n }\n if (tagContainsEncoding(tagCode)) {\n tag['encoding'] = IptcTagNames['iptc'][tagCode]['encoding_name'](tagValue);\n }\n\n return {tag, tagSize};\n}\n\nfunction leadByteIsMissing(dataView, dataOffset) {\n const TAG_LEAD_BYTE = 0x1c;\n return dataView.getUint8(dataOffset) !== TAG_LEAD_BYTE;\n}\n\nfunction getTagValue(dataView, offset, size) {\n const value = [];\n\n for (let valueIndex = 0; valueIndex < size; valueIndex++) {\n value.push(dataView.getUint8(offset + valueIndex));\n }\n\n return value;\n}\n\nfunction getTagName(tag, tagCode, tagValue) {\n if (!tag) {\n return `undefined-${tagCode}`;\n }\n if (tagIsName(tag)) {\n return tag;\n }\n if (hasDynamicName(tag)) {\n return tag['name'](tagValue);\n }\n return tag['name'];\n}\n\nfunction tagIsName(tag) {\n return typeof tag === 'string';\n}\n\nfunction hasDynamicName(tag) {\n return typeof (tag['name']) === 'function';\n}\n\nfunction getTagDescription(tag, tagValue, tags, encoding) {\n if (hasDescriptionProperty(tag)) {\n try {\n return tag['description'](tagValue, tags);\n } catch (error) {\n // Fall through to next handler.\n }\n }\n if (tagValueIsText(tag, tagValue)) {\n return TagDecoder.decode(encoding, tagValue);\n }\n return tagValue;\n}\n\nfunction tagValueIsText(tag, tagValue) {\n return tag && tagValue instanceof Array;\n}\n\nfunction hasDescriptionProperty(tag) {\n return tag && tag['description'] !== undefined;\n}\n\nfunction tagIsRepeatable(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['repeatable'];\n}\n\nfunction tagContainsEncoding(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['encoding_name'] !== undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 'tiff:Orientation'(value) {\n if (value === '1') {\n return 'Horizontal (normal)';\n }\n if (value === '2') {\n return 'Mirror horizontal';\n }\n if (value === '3') {\n return 'Rotate 180';\n }\n if (value === '4') {\n return 'Mirror vertical';\n }\n if (value === '5') {\n return 'Mirror horizontal and rotate 270 CW';\n }\n if (value === '6') {\n return 'Rotate 90 CW';\n }\n if (value === '7') {\n return 'Mirror horizontal and rotate 90 CW';\n }\n if (value === '8') {\n return 'Rotate 270 CW';\n }\n return value;\n },\n 'tiff:ResolutionUnit': (value) => TagNamesCommon.ResolutionUnit(parseInt(value, 10)),\n 'tiff:XResolution': (value) => fraction(TagNamesCommon.XResolution, value),\n 'tiff:YResolution': (value) => fraction(TagNamesCommon.YResolution, value),\n 'exif:ApertureValue': (value) => fraction(TagNamesCommon.ApertureValue, value),\n 'exif:GPSLatitude': calculateGPSValue,\n 'exif:GPSLongitude': calculateGPSValue,\n 'exif:FNumber': (value) => fraction(TagNamesCommon.FNumber, value),\n 'exif:FocalLength': (value) => fraction(TagNamesCommon.FocalLength, value),\n 'exif:FocalPlaneResolutionUnit': (value) => TagNamesCommon.FocalPlaneResolutionUnit(parseInt(value, 10)),\n 'exif:ColorSpace': (value) => TagNamesCommon.ColorSpace(parseNumber(value)),\n 'exif:ComponentsConfiguration'(value, description) {\n if (/^\\d, \\d, \\d, \\d$/.test(description)) {\n const numbers = description.split(', ').map((number) => number.charCodeAt(0));\n return TagNamesCommon.ComponentsConfiguration(numbers);\n }\n return description;\n },\n 'exif:Contrast': (value) => TagNamesCommon.Contrast(parseInt(value, 10)),\n 'exif:CustomRendered': (value) => TagNamesCommon.CustomRendered(parseInt(value, 10)),\n 'exif:ExposureMode': (value) => TagNamesCommon.ExposureMode(parseInt(value, 10)),\n 'exif:ExposureProgram': (value) => TagNamesCommon.ExposureProgram(parseInt(value, 10)),\n 'exif:ExposureTime'(value) {\n if (isFraction(value)) {\n return TagNamesCommon.ExposureTime(value.split('/').map((number) => parseInt(number, 10)));\n }\n return value;\n },\n 'exif:MeteringMode': (value) => TagNamesCommon.MeteringMode(parseInt(value, 10)),\n 'exif:Saturation': (value) => TagNamesCommon.Saturation(parseInt(value, 10)),\n 'exif:SceneCaptureType': (value) => TagNamesCommon.SceneCaptureType(parseInt(value, 10)),\n 'exif:Sharpness': (value) => TagNamesCommon.Sharpness(parseInt(value, 10)),\n 'exif:ShutterSpeedValue': (value) => fraction(TagNamesCommon.ShutterSpeedValue, value),\n 'exif:WhiteBalance': (value) => TagNamesCommon.WhiteBalance(parseInt(value, 10))\n};\n\nfunction fraction(func, value) {\n if (isFraction(value)) {\n return func(value.split('/'));\n }\n return value;\n}\n\nfunction parseNumber(value) {\n if (value.substring(0, 2) === '0x') {\n return parseInt(value.substring(2), 16);\n }\n return parseInt(value, 10);\n}\n\nfunction isFraction(value) {\n return /^-?\\d+\\/-?\\d+$/.test(value);\n}\n\nfunction calculateGPSValue(value) {\n const [degreesString, minutesString] = value.split(',');\n if ((degreesString !== undefined) && (minutesString !== undefined)) {\n const degrees = parseFloat(degreesString);\n const minutes = parseFloat(minutesString);\n const ref = minutesString.charAt(minutesString.length - 1);\n if ((!Number.isNaN(degrees)) && (!Number.isNaN(minutes))) {\n return '' + (degrees + minutes / 60) + ref;\n }\n }\n return value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView, objectAssign} from './utils.js';\nimport XmpTagNames from './xmp-tag-names.js';\nimport DOMParser from './dom-parser.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunks) {\n const tags = {};\n\n if (typeof dataView === 'string') {\n readTags(tags, dataView);\n return tags;\n }\n\n const [standardXmp, extendedXmp] = extractCompleteChunks(dataView, chunks);\n\n const hasStandardTags = readTags(tags, standardXmp);\n\n if (extendedXmp) {\n const hasExtendedTags = readTags(tags, extendedXmp);\n\n if (!hasStandardTags && !hasExtendedTags) {\n // Some writers are not spec-compliant in that they split an XMP\n // metadata tree over both the standard XMP block and the extended\n // XMP block. If we failed parsing both of the XMPs in the regular\n // way, we try to combine them to see if that works better.\n delete tags._raw;\n readTags(tags, combineChunks(dataView, chunks));\n }\n }\n\n return tags;\n}\n\n// The first chunk is always the regular XMP document. Then there is something\n// called extended XMP. The extended XMP is also a single XMP document but it\n// can be divided into multiple chunks that need to be combined into one.\nfunction extractCompleteChunks(dataView, chunks) {\n if (chunks.length === 0) {\n return [];\n }\n\n const completeChunks = [combineChunks(dataView, chunks.slice(0, 1))];\n if (chunks.length > 1) {\n completeChunks.push(combineChunks(dataView, chunks.slice(1)));\n }\n\n return completeChunks;\n}\n\nfunction combineChunks(dataView, chunks) {\n const totalLength = chunks.reduce((size, chunk) => size + chunk.length, 0);\n const combinedChunks = new Uint8Array(totalLength);\n let offset = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const slice = dataView.buffer.slice(chunk.dataOffset, chunk.dataOffset + chunk.length);\n combinedChunks.set(new Uint8Array(slice), offset);\n offset += chunk.length;\n }\n\n return new DataView(combinedChunks.buffer);\n}\n\nfunction readTags(tags, chunkDataView) {\n try {\n const {doc, raw} = getDocument(chunkDataView);\n tags._raw = (tags._raw || '') + raw;\n const rdf = getRDF(doc);\n\n objectAssign(tags, parseXMPObject(convertToObject(rdf, true)));\n return true;\n } catch (error) {\n return false;\n }\n}\n\nfunction getDocument(chunkDataView) {\n const domParser = DOMParser.get();\n if (!domParser) {\n console.warn('Warning: DOMParser is not available. It is needed to be able to parse XMP tags.'); // eslint-disable-line no-console\n throw new Error();\n }\n\n const xmlString = typeof chunkDataView === 'string' ? chunkDataView : getStringFromDataView(chunkDataView, 0, chunkDataView.byteLength);\n const doc = domParser.parseFromString(trimXmlSource(xmlString), 'application/xml');\n\n if (doc.documentElement.nodeName === 'parsererror') {\n throw new Error(doc.documentElement.textContent);\n }\n\n return {\n doc,\n raw: xmlString,\n };\n}\n\nfunction trimXmlSource(xmlSource) {\n return xmlSource.replace(/^.+(<\\?xpacket begin)/, '$1').replace(/(<\\?xpacket end=\".*\"\\?>).+$/, '$1');\n}\n\nfunction getRDF(node) {\n for (let i = 0; i < node.childNodes.length; i++) {\n if (node.childNodes[i].tagName === 'x:xmpmeta') {\n return getRDF(node.childNodes[i]);\n }\n if (node.childNodes[i].tagName === 'rdf:RDF') {\n return node.childNodes[i];\n }\n }\n\n throw new Error();\n}\n\nfunction convertToObject(node, isTopNode = false) {\n const childNodes = getChildNodes(node);\n\n if (hasTextOnlyContent(childNodes)) {\n if (isTopNode) {\n return {};\n }\n return getTextValue(childNodes[0]);\n }\n\n return getElementsFromNodes(childNodes);\n}\n\nfunction getChildNodes(node) {\n const elements = [];\n\n for (let i = 0; i < node.childNodes.length; i++) {\n elements.push(node.childNodes[i]);\n }\n\n return elements;\n}\n\nfunction hasTextOnlyContent(nodes) {\n return (nodes.length === 1) && (nodes[0].nodeName === '#text');\n}\n\nfunction getTextValue(node) {\n return node.nodeValue;\n}\n\nfunction getElementsFromNodes(nodes) {\n const elements = {};\n\n nodes.forEach((node) => {\n if (isElement(node)) {\n const nodeElement = getElementFromNode(node);\n\n if (elements[node.nodeName] !== undefined) {\n if (!Array.isArray(elements[node.nodeName])) {\n elements[node.nodeName] = [elements[node.nodeName]];\n }\n elements[node.nodeName].push(nodeElement);\n } else {\n elements[node.nodeName] = nodeElement;\n }\n }\n });\n\n return elements;\n}\n\nfunction isElement(node) {\n return (node.nodeName) && (node.nodeName !== '#text');\n}\n\nfunction getElementFromNode(node) {\n return {\n attributes: getAttributes(node),\n value: convertToObject(node)\n };\n}\n\nfunction getAttributes(element) {\n const attributes = {};\n\n for (let i = 0; i < element.attributes.length; i++) {\n attributes[element.attributes[i].nodeName] = decodeURIComponent(escape(element.attributes[i].value));\n }\n\n return attributes;\n}\n\nfunction parseXMPObject(xmpObject) {\n const tags = {};\n\n if (typeof xmpObject === 'string') {\n return xmpObject;\n }\n\n for (const nodeName in xmpObject) {\n let nodes = xmpObject[nodeName];\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n nodes.forEach((node) => {\n objectAssign(tags, parseNodeAttributesAsTags(node.attributes));\n if (typeof node.value === 'object') {\n objectAssign(tags, parseNodeChildrenAsTags(node.value));\n }\n });\n }\n\n return tags;\n}\n\nfunction parseNodeAttributesAsTags(attributes) {\n const tags = {};\n\n for (const name in attributes) {\n try {\n if (isTagAttribute(name)) {\n tags[getLocalName(name)] = {\n value: attributes[name],\n attributes: {},\n description: getDescription(attributes[name], name)\n };\n }\n } catch (error) {\n // Keep going and try to parse the rest of the tags.\n }\n }\n\n return tags;\n}\n\nfunction isTagAttribute(name) {\n return (name !== 'rdf:parseType') && (!isNamespaceDefinition(name));\n}\n\nfunction isNamespaceDefinition(name) {\n return name.split(':')[0] === 'xmlns';\n}\n\nfunction getLocalName(name) {\n if (/^MicrosoftPhoto(_\\d+_)?:Rating$/i.test(name)) {\n return 'RatingPercent';\n }\n return name.split(':')[1];\n}\n\nfunction getDescription(value, name = undefined) {\n if (Array.isArray(value)) {\n const arrayDescription = getDescriptionOfArray(value);\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value, arrayDescription);\n }\n return arrayDescription;\n }\n if (typeof value === 'object') {\n return getDescriptionOfObject(value);\n }\n\n try {\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value);\n }\n return decodeURIComponent(escape(value));\n } catch (error) {\n return value;\n }\n}\n\nfunction getDescriptionOfArray(value) {\n return value.map((item) => {\n if (item.value !== undefined) {\n return getDescription(item.value);\n }\n return getDescription(item);\n }).join(', ');\n}\n\nfunction getDescriptionOfObject(value) {\n const descriptions = [];\n\n for (const key in value) {\n descriptions.push(`${getClearTextKey(key)}: ${getDescription(value[key].value)}`);\n }\n\n return descriptions.join('; ');\n}\n\nfunction getClearTextKey(key) {\n if (key === 'CiAdrCity') {\n return 'CreatorCity';\n }\n if (key === 'CiAdrCtry') {\n return 'CreatorCountry';\n }\n if (key === 'CiAdrExtadr') {\n return 'CreatorAddress';\n }\n if (key === 'CiAdrPcode') {\n return 'CreatorPostalCode';\n }\n if (key === 'CiAdrRegion') {\n return 'CreatorRegion';\n }\n if (key === 'CiEmailWork') {\n return 'CreatorWorkEmail';\n }\n if (key === 'CiTelWork') {\n return 'CreatorWorkPhone';\n }\n if (key === 'CiUrlWork') {\n return 'CreatorWorkUrl';\n }\n return key;\n}\n\nfunction parseNodeChildrenAsTags(children) {\n const tags = {};\n\n for (const name in children) {\n try {\n if (!isNamespaceDefinition(name)) {\n tags[getLocalName(name)] = parseNodeAsTag(children[name], name);\n }\n } catch (error) {\n // Keep going and try to parse the rest of the tags.\n }\n }\n\n return tags;\n}\n\nfunction parseNodeAsTag(node, name) {\n if (isDuplicateTag(node)) {\n return parseNodeAsDuplicateTag(node, name);\n }\n if (isEmptyResourceTag(node)) {\n return {value: '', attributes: {}, description: ''};\n }\n if (hasNestedSimpleRdfDescription(node)) {\n return parseNodeAsSimpleRdfDescription(node, name);\n }\n if (hasNestedStructureRdfDescription(node)) {\n return parseNodeAsStructureRdfDescription(node, name);\n }\n if (isCompactStructure(node)) {\n return parseNodeAsCompactStructure(node, name);\n }\n if (isArray(node)) {\n return parseNodeAsArray(node, name);\n }\n return parseNodeAsSimpleValue(node, name);\n}\n\nfunction isEmptyResourceTag(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n && (typeof node.value === 'string')\n && (node.value.trim() === '');\n}\n\nfunction isDuplicateTag(node) {\n return Array.isArray(node);\n}\n\nfunction parseNodeAsDuplicateTag(node, name) {\n return parseNodeAsSimpleValue(node[node.length - 1], name);\n}\n\nfunction hasNestedSimpleRdfDescription(node) {\n return ((node.attributes['rdf:parseType'] === 'Resource') && (node.value['rdf:value'] !== undefined))\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] !== undefined));\n}\n\nfunction parseNodeAsSimpleRdfDescription(node, name) {\n const attributes = parseNodeAttributes(node);\n\n if (node.value['rdf:Description'] !== undefined) {\n node = node.value['rdf:Description'];\n }\n\n objectAssign(attributes, parseNodeAttributes(node), parseNodeChildrenAsAttributes(node));\n\n const value = parseRdfValue(node);\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseNodeAttributes(node) {\n const attributes = {};\n\n for (const name in node.attributes) {\n if ((name !== 'rdf:parseType') && (name !== 'rdf:resource') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.attributes[name];\n }\n }\n\n return attributes;\n}\n\nfunction parseNodeChildrenAsAttributes(node) {\n const attributes = {};\n\n for (const name in node.value) {\n if ((name !== 'rdf:value') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.value[name].value;\n }\n }\n\n return attributes;\n}\n\nfunction parseRdfValue(node) {\n return getURIValue(node.value['rdf:value']) || node.value['rdf:value'].value;\n}\n\nfunction hasNestedStructureRdfDescription(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] === undefined));\n}\n\nfunction parseNodeAsStructureRdfDescription(node, name) {\n const tag = {\n value: {},\n attributes: {}\n };\n\n if (node.value['rdf:Description'] !== undefined) {\n objectAssign(tag.value, parseNodeAttributesAsTags(node.value['rdf:Description'].attributes));\n objectAssign(tag.attributes, parseNodeAttributes(node));\n node = node.value['rdf:Description'];\n }\n\n objectAssign(tag.value, parseNodeChildrenAsTags(node.value));\n\n tag.description = getDescription(tag.value, name);\n\n return tag;\n}\n\nfunction isCompactStructure(node) {\n return (Object.keys(node.value).length === 0)\n && (node.attributes['xml:lang'] === undefined)\n && (node.attributes['rdf:resource'] === undefined);\n}\n\nfunction parseNodeAsCompactStructure(node, name) {\n const value = parseNodeAttributesAsTags(node.attributes);\n\n return {\n value,\n attributes: {},\n description: getDescription(value, name)\n };\n}\n\nfunction isArray(node) {\n return getArrayChild(node.value) !== undefined;\n}\n\nfunction getArrayChild(value) {\n return value['rdf:Bag'] || value['rdf:Seq'] || value['rdf:Alt'];\n}\n\nfunction parseNodeAsArray(node, name) {\n let items = getArrayChild(node.value).value['rdf:li'];\n const attributes = parseNodeAttributes(node);\n const value = [];\n\n if (items === undefined) {\n items = [];\n } else if (!Array.isArray(items)) {\n items = [items];\n }\n\n items.forEach((item) => {\n value.push(parseArrayValue(item));\n });\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseArrayValue(item) {\n if (hasNestedSimpleRdfDescription(item)) {\n return parseNodeAsSimpleRdfDescription(item);\n }\n if (hasNestedStructureRdfDescription(item)) {\n return parseNodeAsStructureRdfDescription(item).value;\n }\n if (isCompactStructure(item)) {\n return parseNodeAsCompactStructure(item).value;\n }\n\n return parseNodeAsSimpleValue(item);\n}\n\nfunction parseNodeAsSimpleValue(node, name) {\n const value = getURIValue(node) || parseXMPObject(node.value);\n\n return {\n value,\n attributes: parseNodeAttributes(node),\n description: getDescription(value, name)\n };\n}\n\nfunction getURIValue(node) {\n return node.attributes && node.attributes['rdf:resource'];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof DOMParser !== 'undefined') {\n return new DOMParser();\n }\n try {\n // eslint-disable-next-line no-undef\n const {DOMParser, onErrorStopParsing} = __non_webpack_require__('@xmldom/xmldom');\n return new DOMParser({onError: onErrorStopParsing});\n } catch (error) {\n return undefined;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {\n getPascalStringFromDataView,\n padStart,\n parseFloatRadix,\n strRepeat\n} from './utils.js';\n\n// export const OsTypeKeys = {\n// OBJC: 'Objc',\n// DOUB: 'doub',\n// UNTF: 'UntF',\n// TEXT: 'TEXT',\n// BOOL: 'bool',\n// ENUM: 'enum',\n// LONG: 'long'\n// };\n\nexport const PathRecordTypes = {\n CLOSED_SUBPATH_LENGTH: 0,\n CLOSED_SUBPATH_BEZIER_LINKED: 1,\n CLOSED_SUBPATH_BEZIER_UNLINKED: 2,\n OPEN_SUBPATH_LENGTH: 3,\n OPEN_SUBPATH_BEZIER_LINKED: 4,\n OPEN_SUBPATH_BEZIER_UNLINKED: 5,\n FILL_RULE: 6,\n CLIPBOARD: 7,\n INITIAL_FILL_RULE: 8\n};\n\nconst PATH_RECORD_SIZE = 24;\n\nexport default {\n // 0x0425: {\n // name: 'CaptionDigest',\n // description(dataView) {\n // let description = '';\n // for (let i = 0; i < dataView.byteLength; i++) {\n // const byte = dataView.getUint8(i);\n // description += padStart(byte.toString(16), 2, '0');\n // }\n // return description;\n // }\n // },\n // Commented out for now to lower bundle size until someone asks for it.\n // 0x043a: {\n // name: 'PrintInformation',\n // description: parseDescriptor\n // },\n // 0x043b: {\n // name: 'PrintStyle',\n // description: parseDescriptor\n // },\n 0x07d0: {\n name: 'PathInformation',\n description: pathResource\n },\n 0x0bb7: {\n name: 'ClippingPathName',\n description(dataView) {\n const [, string] = getPascalStringFromDataView(dataView, 0);\n return string;\n }\n },\n};\n\n// function parseDescriptor(dataView) {\n// const DESCRIPTOR_VERSION_SIZE = 4;\n// // This is a unicode string terminated with null. Unsure about the format though since in my example image it starts with 0x0000.\n// const UNCLEAR_CLASS_ID_NAME_PART_SIZE = 6;\n// let offset = 0;\n// offset += DESCRIPTOR_VERSION_SIZE + UNCLEAR_CLASS_ID_NAME_PART_SIZE;\n// const [classId, classIdSize] = getBlockValue(dataView, offset);\n// offset += classIdSize;\n// const numItems = Types.getLongAt(dataView, offset);\n// offset += 4;\n// const descriptor = {[classId]: {}};\n// for (let i = 0; i < numItems; i++) {\n// const [itemKey, itemKeySize] = getBlockValue(dataView, offset);\n// offset += itemKeySize;\n// const osTypeKey = getStringFromDataView(dataView, offset, 4);\n// offset += 4;\n// try {\n// const {itemValue, itemSize} = getItemValue(dataView, offset, osTypeKey);\n// offset += itemSize;\n// descriptor[classId][ITEM_KEY_TERMS[itemKey] || itemKey] = itemValue;\n// } catch (error) {\n// // We can't recover from unknown OS type key since we don't know\n// // where the next one starts.\n// break;\n// }\n// }\n// return JSON.stringify(descriptor);\n// }\n\n// function getBlockValue(dataView, offset, unicode = false) {\n// const length = (unicode ? 2 : 1) * Types.getLongAt(dataView, offset) || 4;\n// offset += 4;\n// const value = (unicode ? getUnicodeStringFromDataView : getStringFromDataView)(dataView, offset, length);\n// offset += length;\n// return [value, 4 + length];\n// }\n\n// function getItemValue(dataView, offset, osTypeKey) {\n// // Not all OSType keys are implemented yet because they are missing in the example image.\n// if (osTypeKey === OsTypeKeys.OBJC) {\n// const [classIdName, classIdNameSize] = getBlockValue(dataView, offset, true);\n// offset += classIdNameSize;\n// const [classId, classIdSize] = getBlockValue(dataView, offset);\n// offset += classIdSize;\n// const _offset = Types.getLongAt(dataView, offset);\n// return {\n// itemValue: {[classIdName]: {[classId]: _offset}},\n// itemSize: classIdNameSize + classIdSize + 4\n// };\n// }\n// if (osTypeKey === OsTypeKeys.DOUB) {\n// return {\n// itemValue: parseDouble(dataView, offset),\n// itemSize: 8\n// };\n// }\n// if (osTypeKey === OsTypeKeys.UNTF) {\n// const unit = getStringFromDataView(dataView, offset, 4);\n// return {\n// itemValue: {unit, value: parseDouble(dataView, offset + 4)},\n// itemSize: unit.length + 8\n// };\n// }\n// if (osTypeKey === OsTypeKeys.TEXT) {\n// const length = 2 * Types.getLongAt(dataView, offset);\n// offset += 4;\n// const text = getUnicodeStringFromDataView(dataView, offset, length);\n// return {\n// itemValue: text,\n// itemSize: 4 + length\n// };\n// }\n// if (osTypeKey === OsTypeKeys.BOOL) {\n// return {\n// itemValue: Types.getByteAt(dataView, offset) === 1,\n// itemSize: 1\n// };\n// }\n// if (osTypeKey === OsTypeKeys.ENUM) {\n// const [type, typeSize] = getBlockValue(dataView, offset);\n// offset += typeSize;\n// const [enumName, enumSize] = getBlockValue(dataView, offset);\n// return {\n// itemValue: {[type]: enumName},\n// itemSize: typeSize + enumSize\n// };\n// }\n// if (osTypeKey === OsTypeKeys.LONG) {\n// return {\n// itemValue: Types.getLongAt(dataView, offset),\n// itemSize: 4\n// };\n// }\n// throw new Error(`Unknown OS type key: ${osTypeKey}`);\n// }\n\n// function parseDouble(dataView, offset) {\n// const BIAS = 1023;\n// const sign = (Types.getByteAt(dataView, offset) & parseInt('10000000', 2)) === 0 ? 1 : -1;\n// const exponent = ((Types.getShortAt(dataView, offset) & parseInt('0111111111110000', 2)) >> 4) - BIAS;\n// const fractionHigh = padStart((Types.getLongAt(dataView, offset) & parseInt('00000000000011111111111111111111', 2)).toString(2), 20, '0');\n// const fractionLow = padStart(Types.getLongAt(dataView, offset + 4).toString(2), 32, '0');\n// const fraction = parseFloatRadix('1.' + fractionHigh + fractionLow, 2);\n// return sign * fraction * Math.pow(2, exponent);\n// }\n\nfunction pathResource(dataView) {\n const TYPE_SIZE = 2;\n const types = {};\n const paths = [];\n\n for (let offset = 0; offset < dataView.byteLength; offset += TYPE_SIZE + PATH_RECORD_SIZE) {\n const type = Types.getShortAt(dataView, offset);\n if (PATH_RECORD_TYPES[type]) {\n if (!types[type]) {\n types[type] = PATH_RECORD_TYPES[type].description;\n }\n paths.push({\n type,\n path: PATH_RECORD_TYPES[type].path(dataView, offset + TYPE_SIZE)\n });\n }\n }\n return JSON.stringify({types, paths});\n}\n\nconst PATH_RECORD_TYPES = {\n [PathRecordTypes.CLOSED_SUBPATH_LENGTH]: {\n description: 'Closed subpath length',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.CLOSED_SUBPATH_BEZIER_LINKED]: {\n description: 'Closed subpath Bezier knot, linked',\n path: parseBezierKnot\n },\n [PathRecordTypes.CLOSED_SUBPATH_BEZIER_UNLINKED]: {\n description: 'Closed subpath Bezier knot, unlinked',\n path: parseBezierKnot\n },\n [PathRecordTypes.OPEN_SUBPATH_LENGTH]: {\n description: 'Open subpath length',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.OPEN_SUBPATH_BEZIER_LINKED]: {\n description: 'Open subpath Bezier knot, linked',\n path: parseBezierKnot\n },\n [PathRecordTypes.OPEN_SUBPATH_BEZIER_UNLINKED]: {\n description: 'Open subpath Bezier knot, unlinked',\n path: parseBezierKnot\n },\n [PathRecordTypes.FILL_RULE]: {\n description: 'Path fill rule',\n path: () => []\n },\n [PathRecordTypes.INITIAL_FILL_RULE]: {\n description: 'Initial fill rule',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.CLIPBOARD]: {\n description: 'Clipboard',\n path: parseClipboard\n }\n};\n\nfunction parseBezierKnot(dataView, offset) {\n const PATH_POINT_SIZE = 8;\n const path = [];\n for (let i = 0; i < PATH_RECORD_SIZE; i += PATH_POINT_SIZE) {\n path.push(parsePathPoint(dataView, offset + i));\n }\n return path;\n}\n\nfunction parsePathPoint(dataView, offset) {\n const vertical = getFixedPointNumber(dataView, offset, 8);\n const horizontal = getFixedPointNumber(dataView, offset + 4, 8);\n return [horizontal, vertical];\n}\n\nfunction parseClipboard(dataView, offset) {\n return [\n [\n getFixedPointNumber(dataView, offset, 8), // Top\n getFixedPointNumber(dataView, offset + 4, 8), // Left\n getFixedPointNumber(dataView, offset + 8, 8), // Botton\n getFixedPointNumber(dataView, offset + 12, 8), // Right\n ],\n getFixedPointNumber(dataView, offset + 16, 8) // Resolution\n ];\n}\n\nfunction getFixedPointNumber(dataView, offset, binaryPoint) {\n const number = Types.getLongAt(dataView, offset);\n\n const sign = (number >>> 31) === 0 ? 1 : -1;\n const integer = (number & 0x7f000000) >>> (32 - binaryPoint);\n const fraction = number & parseInt(strRepeat('1', 32 - binaryPoint), 2);\n\n return sign * parseFloatRadix(integer.toString(2) + '.' + padStart(fraction.toString(2), 32 - binaryPoint, '0'), 2);\n}\n\n// Item key terminology: https://psd-tools.readthedocs.io/en/latest/reference/psd_tools.terminology.html\n// Are these correct? There are collisions that are commented out. A lot of code for little gain?\n// const ITEM_KEY_TERMS = {\n// 'A ': 'A',\n// 'Adjs': 'Adjustment',\n// 'Algd': 'Aligned',\n// 'Algn': 'Alignment',\n// 'AllE': 'AllExcept',\n// 'All ': 'AllPS',\n// 'AlTl': 'AllToolOptions',\n// 'AChn': 'AlphaChannelOptions',\n// 'AlpC': 'AlphaChannels',\n// 'AmbB': 'AmbientBrightness',\n// 'AmbC': 'AmbientColor',\n// 'Amnt': 'Amount',\n// 'AmMx': 'AmplitudeMax',\n// 'AmMn': 'AmplitudeMin',\n// 'Anch': 'Anchor',\n// 'Angl': 'Angle',\n// 'Ang1': 'Angle1',\n// 'Ang2': 'Angle2',\n// 'Ang3': 'Angle3',\n// 'Ang4': 'Angle4',\n// 'AntA': 'AntiAlias',\n// 'Appe': 'Append',\n// 'Aply': 'Apply',\n// 'Ar ': 'Area',\n// 'Arrw': 'Arrowhead',\n// 'As ': 'As',\n// 'Asst': 'AssetBin',\n// 'AssC': 'AssumedCMYK',\n// 'AssG': 'AssumedGray',\n// 'AssR': 'AssumedRGB',\n// 'At ': 'At',\n// 'Auto': 'Auto',\n// 'AuCo': 'AutoContrast',\n// 'Atrs': 'AutoErase',\n// 'AtKr': 'AutoKern',\n// 'AtUp': 'AutoUpdate',\n// 'Axis': 'Axis',\n// 'B ': 'B',\n// 'Bckg': 'Background',\n// 'BckC': 'BackgroundColor',\n// 'BckL': 'BackgroundLevel',\n// 'Bwd ': 'Backward',\n// 'Blnc': 'Balance',\n// 'Bsln': 'BaselineShift',\n// 'BpWh': 'BeepWhenDone',\n// 'BgnR': 'BeginRamp',\n// 'BgnS': 'BeginSustain',\n// 'bvlD': 'BevelDirection',\n// 'ebbl': 'BevelEmboss',\n// 'bvlS': 'BevelStyle',\n// 'bvlT': 'BevelTechnique',\n// 'BgNH': 'BigNudgeH',\n// 'BgNV': 'BigNudgeV',\n// 'BtDp': 'BitDepth',\n// 'Blck': 'Black',\n// 'BlcC': 'BlackClip',\n// 'Blcn': 'BlackGeneration',\n// 'BlcG': 'BlackGenerationCurve',\n// 'BlcI': 'BlackIntensity',\n// 'BlcL': 'BlackLevel',\n// // 'BlcL': 'BlackLimit',\n// 'Bld ': 'Bleed',\n// 'Blnd': 'BlendRange',\n// 'Bl ': 'Blue',\n// 'BlBl': 'BlueBlackPoint',\n// 'blueFloat': 'BlueFloat',\n// 'BlGm': 'BlueGamma',\n// 'BlWh': 'BlueWhitePoint',\n// 'BlX ': 'BlueX',\n// 'BlY ': 'BlueY',\n// 'blur': 'Blur',\n// 'BlrM': 'BlurMethod',\n// 'BlrQ': 'BlurQuality',\n// 'Bk ': 'Book',\n// 'BrdT': 'BorderThickness',\n// 'Btom': 'Bottom',\n// 'Brgh': 'Brightness',\n// 'BrsD': 'BrushDetail',\n// 'BrsS': 'BrushSize',\n// 'BrsT': 'BrushType',\n// 'Brsh': 'Brushes',\n// 'BmpA': 'BumpAmplitude',\n// 'BmpC': 'BumpChannel',\n// 'By ': 'By',\n// 'Byln': 'Byline',\n// 'BylT': 'BylineTitle',\n// 'BytO': 'ByteOrder',\n// 'CMYS': 'CMYKSetup',\n// 'CchP': 'CachePrefs',\n// 'Clcl': 'Calculation',\n// 'Clbr': 'CalibrationBars',\n// 'Cptn': 'Caption',\n// 'CptW': 'CaptionWriter',\n// 'Ctgr': 'Category',\n// 'ClSz': 'CellSize',\n// 'Cntr': 'Center',\n// 'CntC': 'CenterCropMarks',\n// 'ChlA': 'ChalkArea',\n// 'Chnl': 'Channel',\n// 'ChMx': 'ChannelMatrix',\n// 'ChnN': 'ChannelName',\n// 'Chns': 'Channels',\n// 'ChnI': 'ChannelsInterleaved',\n// 'ChAm': 'CharcoalAmount',\n// 'ChrA': 'CharcoalArea',\n// 'Ckmt': 'ChokeMatte',\n// 'ChFX': 'ChromeFX',\n// 'City': 'City',\n// 'ClrA': 'ClearAmount',\n// 'ClPt': 'ClippingPath',\n// 'ClpP': 'ClippingPathEPS',\n// 'ClpF': 'ClippingPathFlatness',\n// 'ClpI': 'ClippingPathIndex',\n// 'Clpg': 'ClippingPathInfo',\n// 'ClnS': 'CloneSource',\n// 'Clsp': 'ClosedSubpath',\n// 'Clr ': 'Color',\n// 'Clrh': 'ColorChannels',\n// 'ClrC': 'ColorCorrection',\n// 'ClrI': 'ColorIndicates',\n// 'ClMg': 'ColorManagement',\n// 'Clrr': 'ColorPickerPrefs',\n// 'ClrS': 'ColorSpace',\n// 'ClrT': 'ColorTable',\n// 'Clrz': 'Colorize',\n// 'Clrs': 'Colors',\n// 'ClrL': 'ColorsList',\n// 'ClmW': 'ColumnWidth',\n// 'CmdK': 'CommandKey',\n// 'Cmpn': 'Compensation',\n// 'Cmpr': 'Compression',\n// 'Cncv': 'Concavity',\n// 'Cndt': 'Condition',\n// 'Cnst': 'Constant',\n// // 'Cnst': 'Constrain',\n// 'CnsP': 'ConstrainProportions',\n// 'Cfov': 'ConstructionFOV',\n// 'Cntg': 'Contiguous',\n// 'Cntn': 'Continue',\n// 'Cnty': 'Continuity',\n// 'ShpC': 'ContourType',\n// // 'Cntr': 'Contrast',\n// 'Cnvr': 'Convert',\n// 'Cpy ': 'Copy',\n// 'Cpyr': 'Copyright',\n// 'CprN': 'CopyrightNotice',\n// 'CrnC': 'CornerCropMarks',\n// 'Cnt ': 'Count',\n// 'CntN': 'CountryName',\n// 'CrcB': 'CrackBrightness',\n// 'CrcD': 'CrackDepth',\n// 'CrcS': 'CrackSpacing',\n// 'blfl': 'CreateLayersFromLayerFX',\n// 'Crdt': 'Credit',\n// 'Crss': 'Crossover',\n// 'Crnt': 'Current',\n// 'CrnH': 'CurrentHistoryState',\n// 'CrnL': 'CurrentLight',\n// 'CrnT': 'CurrentToolOptions',\n// 'Crv ': 'Curve',\n// 'CrvF': 'CurveFile',\n// 'Cstm': 'Custom',\n// 'CstF': 'CustomForced',\n// 'CstM': 'CustomMatte',\n// 'CstP': 'CustomPalette',\n// 'Cyn ': 'Cyan',\n// 'DCS ': 'DCS',\n// 'DPXf': 'DPXFormat',\n// 'DrkI': 'DarkIntensity',\n// 'Drkn': 'Darkness',\n// 'DtCr': 'DateCreated',\n// 'Dt ': 'Datum',\n// 'Dfnt': 'Definition',\n// 'Dnst': 'Density',\n// 'Dpth': 'Depth',\n// 'Dstl': 'DestBlackMax',\n// 'DstB': 'DestBlackMin',\n// 'Dstt': 'DestWhiteMax',\n// 'DstW': 'DestWhiteMin',\n// 'DstM': 'DestinationMode',\n// 'Dtl ': 'Detail',\n// 'Dmtr': 'Diameter',\n// 'DffD': 'DiffusionDither',\n// 'Drct': 'Direction',\n// 'DrcB': 'DirectionBalance',\n// 'DspF': 'DisplaceFile',\n// 'DspM': 'DisplacementMap',\n// 'DspP': 'DisplayPrefs',\n// 'Dstn': 'Distance',\n// // 'Dstr': 'Distortion',\n// // 'Dstr': 'Distribution',\n// 'Dthr': 'Dither',\n// 'DthA': 'DitherAmount',\n// 'Dthp': 'DitherPreserve',\n// 'Dthq': 'DitherQuality',\n// 'DocI': 'DocumentID',\n// 'DtGn': 'DotGain',\n// 'DtGC': 'DotGainCurves',\n// 'DrSh': 'DropShadow',\n// 'Dplc': 'Duplicate',\n// 'DnmC': 'DynamicColorSliders',\n// 'Edg ': 'Edge',\n// 'EdgB': 'EdgeBrightness',\n// 'EdgF': 'EdgeFidelity',\n// 'EdgI': 'EdgeIntensity',\n// 'EdgS': 'EdgeSimplicity',\n// 'EdgT': 'EdgeThickness',\n// 'EdgW': 'EdgeWidth',\n// 'Effc': 'Effect',\n// 'EmbC': 'EmbedCMYK',\n// 'EmbG': 'EmbedGray',\n// 'EmbL': 'EmbedLab',\n// 'EmbP': 'EmbedProfiles',\n// 'EmbR': 'EmbedRGB',\n// 'EmlD': 'EmulsionDown',\n// 'EGst': 'EnableGestures',\n// 'enab': 'Enabled',\n// 'Encd': 'Encoding',\n// 'End ': 'End',\n// 'EndA': 'EndArrowhead',\n// 'EndR': 'EndRamp',\n// 'EndS': 'EndSustain',\n// 'Engn': 'Engine',\n// 'ErsT': 'EraseToHistory',\n// 'ErsK': 'EraserKind',\n// 'ExcP': 'ExactPoints',\n// 'Expr': 'Export',\n// 'ExpC': 'ExportClipboard',\n// 'Exps': 'Exposure',\n// 'Extd': 'Extend',\n// 'EQlt': 'ExtendedQuality',\n// 'Extn': 'Extension',\n// 'ExtQ': 'ExtensionsQuery',\n// 'ExtD': 'ExtrudeDepth',\n// 'ExtM': 'ExtrudeMaskIncomplete',\n// 'ExtR': 'ExtrudeRandom',\n// 'ExtS': 'ExtrudeSize',\n// 'ExtF': 'ExtrudeSolidFace',\n// 'ExtT': 'ExtrudeType',\n// 'EyDr': 'EyeDropperSample',\n// 'FxCm': 'FPXCompress',\n// 'FxQl': 'FPXQuality',\n// 'FxSz': 'FPXSize',\n// 'FxVw': 'FPXView',\n// 'FdT ': 'FadeTo',\n// 'FdtS': 'FadeoutSteps',\n// 'FlOf': 'Falloff',\n// 'Fthr': 'Feather',\n// 'FbrL': 'FiberLength',\n// 'File': 'File',\n// 'FlCr': 'FileCreator',\n// 'FlIn': 'FileInfo',\n// 'FilR': 'FileReference',\n// 'FlSP': 'FileSavePrefs',\n// 'FlTy': 'FileType',\n// 'flst': 'FilesList',\n// 'Fl ': 'Fill',\n// 'FlCl': 'FillColor',\n// 'FlNt': 'FillNeutral',\n// 'FlPd': 'FilterLayerPersistentData',\n// 'FlRs': 'FilterLayerRandomSeed',\n// 'Fngr': 'Fingerpainting',\n// 'FlrC': 'FlareCenter',\n// 'Fltn': 'Flatness',\n// 'Fltt': 'Flatten',\n// 'FlpV': 'FlipVertical',\n// 'Fcs ': 'Focus',\n// 'Fldr': 'Folders',\n// 'FntD': 'FontDesignAxes',\n// 'FntV': 'FontDesignAxesVectors',\n// 'FntN': 'FontName',\n// 'Scrp': 'FontScript',\n// 'FntS': 'FontStyleName',\n// 'FntT': 'FontTechnology',\n// 'FrcC': 'ForcedColors',\n// 'FrgC': 'ForegroundColor',\n// 'FrgL': 'ForegroundLevel',\n// 'Fmt ': 'Format',\n// 'Fwd ': 'Forward',\n// 'FrFX': 'FrameFX',\n// 'FrmW': 'FrameWidth',\n// 'FTcs': 'FreeTransformCenterState',\n// 'Frqn': 'Frequency',\n// 'From': 'From',\n// 'FrmB': 'FromBuiltin',\n// 'FrmM': 'FromMode',\n// 'FncK': 'FunctionKey',\n// 'Fzns': 'Fuzziness',\n// 'GCR ': 'GCR',\n// 'GFPT': 'GIFColorFileType',\n// 'GFCL': 'GIFColorLimit',\n// 'GFEC': 'GIFExportCaption',\n// 'GFMI': 'GIFMaskChannelIndex',\n// 'GFMV': 'GIFMaskChannelInverted',\n// 'GFPF': 'GIFPaletteFile',\n// 'GFPL': 'GIFPaletteType',\n// 'GFCS': 'GIFRequiredColorSpaceType',\n// 'GFIT': 'GIFRowOrderType',\n// 'GFTC': 'GIFTransparentColor',\n// 'GFTB': 'GIFTransparentIndexBlue',\n// 'GFTG': 'GIFTransparentIndexGreen',\n// 'GFTR': 'GIFTransparentIndexRed',\n// 'GFBM': 'GIFUseBestMatch',\n// 'Gmm ': 'Gamma',\n// 'GmtW': 'GamutWarning',\n// 'GnrP': 'GeneralPrefs',\n// 'gblA': 'GlobalAngle',\n// 'gagl': 'GlobalLightingAngle',\n// 'Glos': 'Gloss',\n// 'GlwA': 'GlowAmount',\n// 'GlwT': 'GlowTechnique',\n// 'Grad': 'Gradient',\n// 'Grdf': 'GradientFill',\n// // 'Grn ': 'Grain',\n// 'Grnt': 'GrainType',\n// 'Grns': 'Graininess',\n// 'Gry ': 'Gray',\n// 'GrBh': 'GrayBehavior',\n// 'GrSt': 'GraySetup',\n// 'Grn ': 'Green',\n// 'GrnB': 'GreenBlackPoint',\n// 'greenFloat': 'GreenFloat',\n// 'GrnG': 'GreenGamma',\n// 'GrnW': 'GreenWhitePoint',\n// 'GrnX': 'GreenX',\n// 'GrnY': 'GreenY',\n// 'GrdC': 'GridColor',\n// 'Grds': 'GridCustomColor',\n// 'GrdM': 'GridMajor',\n// 'Grdn': 'GridMinor',\n// 'GrdS': 'GridStyle',\n// 'Grdt': 'GridUnits',\n// 'Grup': 'Group',\n// 'GrtW': 'GroutWidth',\n// 'GrwS': 'GrowSelection',\n// 'Gdes': 'Guides',\n// 'GdsC': 'GuidesColor',\n// 'Gdss': 'GuidesCustomColor',\n// 'GdPr': 'GuidesPrefs',\n// 'GdsS': 'GuidesStyle',\n// 'GttW': 'GutterWidth',\n// 'HlfF': 'HalftoneFile',\n// 'HlfS': 'HalftoneScreen',\n// 'HlSz': 'HalftoneSize',\n// 'Hlfp': 'HalftoneSpec',\n// 'Hrdn': 'Hardness',\n// 'HCdH': 'HasCmdHPreference',\n// 'Hdr ': 'Header',\n// 'Hdln': 'Headline',\n// 'Hght': 'Height',\n// 'HghA': 'HighlightArea',\n// 'hglC': 'HighlightColor',\n// 'HghL': 'HighlightLevels',\n// 'hglM': 'HighlightMode',\n// 'hglO': 'HighlightOpacity',\n// 'HghS': 'HighlightStrength',\n// 'HstB': 'HistoryBrushSource',\n// 'HstP': 'HistoryPrefs',\n// 'HsSS': 'HistoryStateSource',\n// 'HsSt': 'HistoryStates',\n// 'Hrzn': 'Horizontal',\n// 'HrzS': 'HorizontalScale',\n// 'HstN': 'HostName',\n// 'HstV': 'HostVersion',\n// 'H ': 'Hue',\n// 'ICCE': 'ICCEngine',\n// 'ICCt': 'ICCSetupName',\n// 'Idnt': 'ID',\n// 'Idle': 'Idle',\n// 'ImgB': 'ImageBalance',\n// 'Impr': 'Import',\n// 'Imps': 'Impressionist',\n// 'In ': 'In',\n// 'c@#^': 'Inherits',\n// 'InkC': 'InkColors',\n// 'Inks': 'Inks',\n// 'IrGl': 'InnerGlow',\n// 'glwS': 'InnerGlowSource',\n// 'IrSh': 'InnerShadow',\n// 'Inpt': 'Input',\n// 'kIBP': 'InputBlackPoint',\n// 'Inmr': 'InputMapRange',\n// 'Inpr': 'InputRange',\n// 'kIWP': 'InputWhitePoint',\n// 'Intn': 'Intensity',\n// 'Inte': 'Intent',\n// 'IntH': 'InterfaceBevelHighlight',\n// 'Intv': 'InterfaceBevelShadow',\n// 'IntB': 'InterfaceBlack',\n// 'Intd': 'InterfaceBorder',\n// 'Intk': 'InterfaceButtonDarkShadow',\n// 'Intt': 'InterfaceButtonDownFill',\n// 'InBF': 'InterfaceButtonUpFill',\n// 'ICBL': 'InterfaceColorBlue2',\n// 'ICBH': 'InterfaceColorBlue32',\n// 'ICGL': 'InterfaceColorGreen2',\n// 'ICGH': 'InterfaceColorGreen32',\n// 'ICRL': 'InterfaceColorRed2',\n// 'ICRH': 'InterfaceColorRed32',\n// 'IntI': 'InterfaceIconFillActive',\n// 'IntF': 'InterfaceIconFillDimmed',\n// 'Intc': 'InterfaceIconFillSelected',\n// 'Intm': 'InterfaceIconFrameActive',\n// // 'Intr': 'InterfaceIconFrameDimmed',\n// 'IntS': 'InterfaceIconFrameSelected',\n// 'IntP': 'InterfacePaletteFill',\n// 'IntR': 'InterfaceRed',\n// 'IntT': 'InterfaceToolTipBackground',\n// 'ITTT': 'InterfaceToolTipText',\n// 'ITBg': 'InterfaceTransparencyBackground',\n// 'ITFg': 'InterfaceTransparencyForeground',\n// 'IntW': 'InterfaceWhite',\n// // 'Intr': 'Interlace',\n// 'IntC': 'InterlaceCreateType',\n// 'IntE': 'InterlaceEliminateType',\n// // 'Intr': 'Interpolation',\n// 'IntM': 'InterpolationMethod',\n// 'Invr': 'Invert',\n// 'InvM': 'InvertMask',\n// 'InvS': 'InvertSource2',\n// 'InvT': 'InvertTexture',\n// 'IsDr': 'IsDirty',\n// 'ItmI': 'ItemIndex',\n// 'JPEQ': 'JPEGQuality',\n// 'Krng': 'Kerning',\n// 'Kywd': 'Keywords',\n// 'Knd ': 'Kind',\n// 'LTnm': 'LUTAnimation',\n// 'LZWC': 'LZWCompression',\n// 'Lbls': 'Labels',\n// 'Lnds': 'Landscape',\n// 'LstT': 'LastTransform',\n// 'Lyr ': 'Layer',\n// 'Lefx': 'LayerEffects',\n// 'lfxv': 'LayerFXVisible',\n// 'LyrI': 'LayerID',\n// 'LyrN': 'LayerName',\n// 'Lyrs': 'Layers',\n// 'Ldng': 'Leading',\n// 'Left': 'Left',\n// 'lSNs': 'LegacySerialString',\n// // 'Lngt': 'Length',\n// 'Lns ': 'Lens',\n// 'Lvl ': 'Level',\n// 'Lvls': 'Levels',\n// 'LgDr': 'LightDark',\n// 'LghD': 'LightDirection',\n// 'LghI': 'LightIntensity',\n// 'LghP': 'LightPosition',\n// 'LghS': 'LightSource',\n// 'LghT': 'LightType',\n// 'LghG': 'LightenGrout',\n// 'Lght': 'Lightness',\n// 'Line': 'Line',\n// 'lnkE': 'LinkEnable',\n// 'LnkL': 'LinkedLayerIDs',\n// 'Lald': 'LocalLightingAltitude',\n// 'lagl': 'LocalLightingAngle',\n// 'LclR': 'LocalRange',\n// 'Lctn': 'Location',\n// 'Log ': 'Log',\n// 'kLog': 'Logarithmic',\n// 'LwCs': 'LowerCase',\n// 'Lmnc': 'Luminance',\n// 'Mgnt': 'Magenta',\n// 'MkVs': 'MakeVisible',\n// 'Mfov': 'ManipulationFOV',\n// 'MpBl': 'MapBlack',\n// 'Mpng': 'Mapping',\n// 'MpgS': 'MappingShape',\n// 'Mtrl': 'Material',\n// 'Mtrx': 'Matrix',\n// 'MttC': 'MatteColor',\n// 'Mxm ': 'Maximum',\n// 'MxmS': 'MaximumStates',\n// 'MmrU': 'MemoryUsagePercent',\n// 'Mrge': 'Merge',\n// 'Mrgd': 'Merged',\n// 'Msge': 'Message',\n// 'Mthd': 'Method',\n// 'MztT': 'MezzotintType',\n// 'Mdpn': 'Midpoint',\n// 'MdtL': 'MidtoneLevels',\n// 'Mnm ': 'Minimum',\n// 'MsmC': 'MismatchCMYK',\n// 'MsmG': 'MismatchGray',\n// 'MsmR': 'MismatchRGB',\n// 'Md ': 'Mode',\n// 'Mnch': 'Monochromatic',\n// 'MvT ': 'MoveTo',\n// 'Nm ': 'Name',\n// 'Ngtv': 'Negative',\n// 'Nw ': 'New',\n// 'Nose': 'Noise',\n// 'NnIm': 'NonImageData',\n// 'NnLn': 'NonLinear',\n// 'null': 'Null',\n// 'Nm L': 'NumLights',\n// 'Nmbr': 'Number',\n// 'NCch': 'NumberOfCacheLevels',\n// 'NC64': 'NumberOfCacheLevels64',\n// 'NmbO': 'NumberOfChannels',\n// 'NmbC': 'NumberOfChildren',\n// 'NmbD': 'NumberOfDocuments',\n// 'NmbG': 'NumberOfGenerators',\n// // 'NmbL': 'NumberOfLayers',\n// // 'NmbL': 'NumberOfLevels',\n// 'NmbP': 'NumberOfPaths',\n// 'NmbR': 'NumberOfRipples',\n// 'NmbS': 'NumberOfSiblings',\n// 'ObjN': 'ObjectName',\n// 'Ofst': 'Offset',\n// 'Sftt': 'OldSmallFontType',\n// 'On ': 'On',\n// 'Opct': 'Opacity',\n// 'Optm': 'Optimized',\n// 'Ornt': 'Orientation',\n// 'OrgH': 'OriginalHeader',\n// 'OrgT': 'OriginalTransmissionReference',\n// 'OthC': 'OtherCursors',\n// 'OrGl': 'OuterGlow',\n// 'Otpt': 'Output',\n// 'kOBP': 'OutputBlackPoint',\n// 'kOWP': 'OutputWhitePoint',\n// 'OvrC': 'OverprintColors',\n// 'OvrO': 'OverrideOpen',\n// 'ObrP': 'OverridePrinter',\n// 'Ovrd': 'OverrideSave',\n// 'PNGf': 'PNGFilter',\n// 'PGIT': 'PNGInterlaceType',\n// 'PMpf': 'PageFormat',\n// 'PgNm': 'PageNumber',\n// 'PgPs': 'PagePosition',\n// 'PgSt': 'PageSetup',\n// 'PnCK': 'PaintCursorKind',\n// 'PntT': 'PaintType',\n// 'PntC': 'PaintingCursors',\n// 'Plt ': 'Palette',\n// 'PltF': 'PaletteFile',\n// 'PprB': 'PaperBrightness',\n// 'PrIn': 'ParentIndex',\n// 'PrNm': 'ParentName',\n// 'Path': 'Path',\n// 'PthC': 'PathContents',\n// 'PthN': 'PathName',\n// 'Pttn': 'Pattern',\n// 'Pncl': 'PencilWidth',\n// 'Prsp': 'PerspectiveIndex',\n// 'Phsp': 'Phosphors',\n// 'PckI': 'PickerID',\n// 'Pckr': 'PickerKind',\n// 'PPSz': 'PixelPaintSize',\n// 'Pltf': 'Platform',\n// 'PlgF': 'PluginFolder',\n// 'PlgP': 'PluginPrefs',\n// 'Pts ': 'Points',\n// 'Pstn': 'Position',\n// 'PstS': 'PostScriptColor',\n// 'Pstr': 'Posterization',\n// 'PrdC': 'PredefinedColors',\n// 'PrfB': 'PreferBuiltin',\n// 'Prfr': 'Preferences',\n// 'PrsA': 'PreserveAdditional',\n// 'PrsL': 'PreserveLuminosity',\n// 'PrsT': 'PreserveTransparency',\n// 'Prs ': 'Pressure',\n// 'Prvw': 'Preview',\n// 'PrvK': 'PreviewCMYK',\n// 'PrvF': 'PreviewFullSize',\n// 'PrvI': 'PreviewIcon',\n// 'PrvM': 'PreviewMacThumbnail',\n// 'PrvW': 'PreviewWinThumbnail',\n// 'PrvQ': 'PreviewsQuery',\n// 'PMps': 'PrintSettings',\n// 'PrfS': 'ProfileSetup',\n// 'PrvS': 'ProvinceState',\n// 'Qlty': 'Quality',\n// 'QucM': 'QuickMask',\n// 'RGBS': 'RGBSetup',\n// 'Rds ': 'Radius',\n// 'RndS': 'RandomSeed',\n// 'Rt ': 'Ratio',\n// 'Rcnf': 'RecentFiles',\n// 'Rd ': 'Red',\n// 'RdBl': 'RedBlackPoint',\n// 'redFloat': 'RedFloat',\n// 'RdGm': 'RedGamma',\n// 'RdWh': 'RedWhitePoint',\n// 'RdX ': 'RedX',\n// 'RdY ': 'RedY',\n// 'RgsM': 'RegistrationMarks',\n// 'Rltv': 'Relative',\n// 'Rlf ': 'Relief',\n// 'Rfid': 'RenderFidelity',\n// 'Rsmp': 'Resample',\n// 'RWOZ': 'ResizeWindowsOnZoom',\n// 'Rslt': 'Resolution',\n// 'RsrI': 'ResourceID',\n// 'Rspn': 'Response',\n// 'RtnH': 'RetainHeader',\n// 'Rvrs': 'Reverse',\n// 'Rght': 'Right',\n// 'RplM': 'RippleMagnitude',\n// 'RplS': 'RippleSize',\n// 'Rtt ': 'Rotate',\n// 'Rndn': 'Roundness',\n// 'RlrH': 'RulerOriginH',\n// 'RlrV': 'RulerOriginV',\n// 'RlrU': 'RulerUnits',\n// // 'Strt': 'Saturation',\n// 'SvAn': 'SaveAndClose',\n// 'SvCm': 'SaveComposite',\n// 'PltL': 'SavePaletteLocations',\n// 'SvPt': 'SavePaths',\n// 'SvPy': 'SavePyramids',\n// 'Svng': 'Saving',\n// 'Scl ': 'Scale',\n// 'SclH': 'ScaleHorizontal',\n// 'SclV': 'ScaleVertical',\n// 'Scln': 'Scaling',\n// 'Scns': 'Scans',\n// 'ScrD': 'ScratchDisks',\n// 'ScrF': 'ScreenFile',\n// 'ScrT': 'ScreenType',\n// 'Sprt': 'Separations',\n// 'SrlS': 'SerialString',\n// // 'ShdI': 'ShadingIntensity',\n// 'ShdN': 'ShadingNoise',\n// 'ShdS': 'ShadingShape',\n// 'sdwC': 'ShadowColor',\n// // 'ShdI': 'ShadowIntensity',\n// 'ShdL': 'ShadowLevels',\n// 'sdwM': 'ShadowMode',\n// 'sdwO': 'ShadowOpacity',\n// 'Shp ': 'Shape',\n// 'Shrp': 'Sharpness',\n// 'ShrE': 'ShearEd',\n// 'ShrP': 'ShearPoints',\n// 'ShrS': 'ShearSt',\n// 'ShfK': 'ShiftKey',\n// 'ShKT': 'ShiftKeyToolSwitch',\n// 'ShrN': 'ShortNames',\n// 'ShwE': 'ShowEnglishFontNames',\n// 'SwMC': 'ShowMenuColors',\n// 'ShwT': 'ShowToolTips',\n// 'ShTr': 'ShowTransparency',\n// 'Sz ': 'SizeKey',\n// 'Skew': 'Skew',\n// 'Sfts': 'SmallFontType',\n// 'SmBM': 'SmartBlurMode',\n// 'SmBQ': 'SmartBlurQuality',\n// 'Smoo': 'Smooth',\n// 'Smth': 'Smoothness',\n// 'SnpI': 'SnapshotInitial',\n// 'SfCl': 'SoftClip',\n// 'Sftn': 'Softness',\n// 'SoFi': 'SolidFill',\n// 'Srce': 'Source',\n// 'Src2': 'Source2',\n// 'SrcM': 'SourceMode',\n// 'Spcn': 'Spacing',\n// 'SpcI': 'SpecialInstructions',\n// 'SphM': 'SpherizeMode',\n// 'Spot': 'Spot',\n// 'SprR': 'SprayRadius',\n// 'SqrS': 'SquareSize',\n// 'Srcl': 'SrcBlackMax',\n// 'SrcB': 'SrcBlackMin',\n// 'Srcm': 'SrcWhiteMax',\n// 'SrcW': 'SrcWhiteMin',\n// // 'Strt': 'Start',\n// 'StrA': 'StartArrowhead',\n// 'Stte': 'State',\n// 'srgh': 'Strength',\n// 'srgR': 'StrengthRatio',\n// 'Strg': 'Strength_PLUGIN',\n// 'StDt': 'StrokeDetail',\n// 'SDir': 'StrokeDirection',\n// 'StrL': 'StrokeLength',\n// 'StrP': 'StrokePressure',\n// 'StrS': 'StrokeSize',\n// 'StrW': 'StrokeWidth',\n// 'Styl': 'Style',\n// 'Stys': 'Styles',\n// 'StlC': 'StylusIsColor',\n// 'StlO': 'StylusIsOpacity',\n// 'StlP': 'StylusIsPressure',\n// 'StlS': 'StylusIsSize',\n// 'SbpL': 'SubPathList',\n// 'SplC': 'SupplementalCategories',\n// 'SstI': 'SystemInfo',\n// 'SstP': 'SystemPalette',\n// // 'null': 'Target',\n// 'Trgp': 'TargetPath',\n// 'TrgP': 'TargetPathIndex',\n// // 'Lngt': 'TermLength',\n// 'Txt ': 'Text',\n// // 'TxtC': 'TextClickPoint',\n// 'TxtD': 'TextData',\n// 'TxtS': 'TextStyle',\n// 'Txtt': 'TextStyleRange',\n// 'Txtr': 'Texture',\n// // 'TxtC': 'TextureCoverage',\n// 'TxtF': 'TextureFile',\n// 'TxtT': 'TextureType',\n// 'Thsh': 'Threshold',\n// 'TlNm': 'TileNumber',\n// 'TlOf': 'TileOffset',\n// 'TlSz': 'TileSize',\n// 'Ttl ': 'Title',\n// 'T ': 'To',\n// 'TBl ': 'ToBuiltin',\n// 'ToLk': 'ToLinked',\n// 'TMd ': 'ToMode',\n// 'TglO': 'ToggleOthers',\n// 'Tlrn': 'Tolerance',\n// 'Top ': 'Top',\n// 'TtlL': 'TotalLimit',\n// 'Trck': 'Tracking',\n// 'TrnF': 'TransferFunction',\n// // 'TrnS': 'TransferSpec',\n// 'Trns': 'Transparency',\n// // 'TrnG': 'TransparencyGrid',\n// 'TrnC': 'TransparencyGridColors',\n// // 'TrnG': 'TransparencyGridSize',\n// 'TrnP': 'TransparencyPrefs',\n// // 'TrnS': 'TransparencyShape',\n// 'TrnI': 'TransparentIndex',\n// 'TrnW': 'TransparentWhites',\n// 'Twst': 'Twist',\n// 'Type': 'Type',\n// 'UC ': 'UCA',\n// 'URL ': 'URL',\n// 'UndA': 'UndefinedArea',\n// 'Undl': 'Underline',\n// 'UntP': 'UnitsPrefs',\n// 'Untl': 'Untitled',\n// 'UppY': 'UpperY',\n// 'Urgn': 'Urgency',\n// 'AcrS': 'UseAccurateScreens',\n// 'AdPl': 'UseAdditionalPlugins',\n// 'UsCc': 'UseCacheForHistograms',\n// 'UsCr': 'UseCurves',\n// 'UsDf': 'UseDefault',\n// 'uglg': 'UseGlobalAngle',\n// 'UsIC': 'UseICCProfile',\n// 'UsMs': 'UseMask',\n// 'UsrM': 'UserMaskEnabled',\n// 'Usrs': 'UserMaskLinked',\n// 'Usng': 'Using',\n// 'Vl ': 'Value',\n// 'Vrnc': 'Variance',\n// 'Vct0': 'Vector0',\n// 'Vct1': 'Vector1',\n// 'VctC': 'VectorColor',\n// 'VrsF': 'VersionFix',\n// 'VrsM': 'VersionMajor',\n// 'VrsN': 'VersionMinor',\n// 'Vrtc': 'Vertical',\n// 'VrtS': 'VerticalScale',\n// 'Vdlp': 'VideoAlpha',\n// 'Vsbl': 'Visible',\n// 'WtcS': 'WatchSuspension',\n// 'watr': 'Watermark',\n// 'Wvtp': 'WaveType',\n// 'WLMx': 'WavelengthMax',\n// 'WLMn': 'WavelengthMin',\n// 'WbdP': 'WebdavPrefs',\n// 'Wtdg': 'WetEdges',\n// 'What': 'What',\n// 'WhtC': 'WhiteClip',\n// 'WhtI': 'WhiteIntensity',\n// 'WhHi': 'WhiteIsHigh',\n// 'WhtL': 'WhiteLevel',\n// 'WhtP': 'WhitePoint',\n// 'WhPt': 'WholePath',\n// 'Wdth': 'Width',\n// 'WndM': 'WindMethod',\n// 'With': 'With',\n// 'WrPt': 'WorkPath',\n// 'WrkP': 'WorkPathIndex',\n// 'X ': 'X',\n// 'Y ': 'Y',\n// 'Ylw ': 'Yellow',\n// 'ZZTy': 'ZigZagType',\n// 'Alis': '_3DAntiAlias',\n// };\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/\n\nimport {getDataView, getStringFromDataView, getPascalStringFromDataView} from './utils.js';\nimport Types from './types.js';\nimport TagNames from './photoshop-tag-names.js';\n\nexport default {\n read\n};\n\nconst SIGNATURE = '8BIM';\nconst TAG_ID_SIZE = 2;\nconst RESOURCE_LENGTH_SIZE = 4;\n\nconst SIGNATURE_SIZE = SIGNATURE.length;\n\nfunction read(bytes, includeUnknown) {\n const dataView = getDataView(new Uint8Array(bytes).buffer);\n const tags = {};\n let offset = 0;\n\n while (offset < bytes.length) {\n const signature = getStringFromDataView(dataView, offset, SIGNATURE_SIZE);\n offset += SIGNATURE_SIZE;\n const tagId = Types.getShortAt(dataView, offset);\n offset += TAG_ID_SIZE;\n const {tagName, tagNameSize} = getTagName(dataView, offset);\n offset += tagNameSize;\n const resourceSize = Types.getLongAt(dataView, offset);\n offset += RESOURCE_LENGTH_SIZE;\n if (signature === SIGNATURE) {\n const valueDataView = getDataView(dataView.buffer, offset, resourceSize);\n const tag = {\n id: tagId,\n value: getStringFromDataView(valueDataView, 0, resourceSize),\n };\n if (TagNames[tagId]) {\n try {\n tag.description = TagNames[tagId].description(valueDataView);\n } catch (error) {\n tag.description = '';\n }\n tags[tagName ? tagName : TagNames[tagId].name] = tag;\n } else if (includeUnknown) {\n tags[`undefined-${tagId}`] = tag;\n }\n }\n offset += resourceSize + (resourceSize % 2);\n }\n\n return tags;\n}\n\nfunction getTagName(dataView, offset) {\n // The name is encoded as a Pascal string (the string is prefixed with one\n // byte containing the length of the string) and everything is padded with a\n // null byte to make the size even.\n const [stringSize, string] = getPascalStringFromDataView(dataView, offset);\n return {\n tagName: string,\n tagNameSize: 1 + stringSize + (stringSize % 2 === 0 ? 1 : 0)\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport const iccTags = {\n 'desc': {\n 'name': 'ICC Description',\n },\n 'cprt': {\n 'name': 'ICC Copyright',\n },\n 'dmdd': {\n 'name': 'ICC Device Model Description',\n },\n 'vued': {\n 'name': 'ICC Viewing Conditions Description',\n },\n 'dmnd': {\n 'name': 'ICC Device Manufacturer for Display',\n },\n 'tech': {\n 'name': 'Technology',\n },\n};\n\nexport const iccProfile = {\n 4: {\n 'name': 'Preferred CMM type',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => value !== null ? toCompany(value) : '',\n },\n 8: {\n 'name': 'Profile Version',\n 'value': (dataView, offset) => {\n return (dataView.getUint8(offset)).toString(10) + '.'\n + (dataView.getUint8(offset + 1) >> 4).toString(10) + '.'\n + (dataView.getUint8(offset + 1) % 16).toString(10);\n }\n },\n 12: {\n 'name': 'Profile/Device class',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => {\n switch (value.toLowerCase()) {\n case 'scnr': return 'Input Device profile';\n case 'mntr': return 'Display Device profile';\n case 'prtr': return 'Output Device profile';\n case 'link': return 'DeviceLink profile';\n case 'abst': return 'Abstract profile';\n case 'spac': return 'ColorSpace profile';\n case 'nmcl': return 'NamedColor profile';\n case 'cenc': return 'ColorEncodingSpace profile';\n case 'mid ': return 'MultiplexIdentification profile';\n case 'mlnk': return 'MultiplexLink profile';\n case 'mvis': return 'MultiplexVisualization profile';\n default: return value;\n }\n }\n },\n 16: {\n 'name': 'Color Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 20: {\n 'name': 'Connection Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 24: {\n 'name': 'ICC Profile Date',\n 'value': (dataView, offset) => parseDate(dataView, offset).toISOString()\n },\n 36: {\n 'name': 'ICC Signature',\n 'value': (dataView, offset) => sliceToString(dataView.buffer.slice(offset, offset + 4))\n },\n 40: {\n 'name': 'Primary Platform',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 48: {\n 'name': 'Device Manufacturer',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 52: {\n 'name': 'Device Model Number',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 64: {\n 'name': 'Rendering Intent',\n 'value': (dataView, offset) => dataView.getUint32(offset),\n 'description': (value) => {\n switch (value) {\n case 0: return 'Perceptual';\n case 1: return 'Relative Colorimetric';\n case 2: return 'Saturation';\n case 3: return 'Absolute Colorimetric';\n default: return value;\n }\n }\n },\n\n 80: {\n 'name': 'Profile Creator',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n};\n\nfunction parseDate(dataView, offset) {\n const year = dataView.getUint16(offset);\n const month = dataView.getUint16(offset + 2) - 1;\n const day = dataView.getUint16(offset + 4);\n const hours = dataView.getUint16(offset + 6);\n const minutes = dataView.getUint16(offset + 8);\n const seconds = dataView.getUint16(offset + 10);\n return new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction toCompany(value) {\n switch (value.toLowerCase()) {\n case 'appl': return 'Apple';\n case 'adbe': return 'Adobe';\n case 'msft': return 'Microsoft';\n case 'sunw': return 'Sun Microsystems';\n case 'sgi': return 'Silicon Graphics';\n case 'tgnt': return 'Taligent';\n default: return value;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\nimport {iccTags, iccProfile} from './icc-tag-names.js';\nimport {getStringFromDataView, getUnicodeStringFromDataView, decompress, COMPRESSION_METHOD_NONE, COMPRESSION_METHOD_DEFLATE} from './utils.js';\n\nexport default {\n read\n};\n\nconst PROFILE_HEADER_LENGTH = 84;\nconst ICC_TAG_COUNT_OFFSET = 128;\nconst ICC_SIGNATURE = 'acsp';\nconst TAG_TYPE_DESC = 'desc';\nconst TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE = 'mluc';\nconst TAG_TYPE_TEXT = 'text';\nconst TAG_TYPE_SIGNATURE = 'sig ';\nconst TAG_TABLE_SINGLE_TAG_DATA = 12;\n\n// ICC profile data can be longer than application segment max length of ~64k.\n// so it can be split into multiple APP2 segments. Each segment includes\n// total chunk count and chunk number.\n// Here we read all chunks into single continuous array of bytes.\n// Compressed ICC profile data only has support for a single chunk.\nfunction read(dataView, iccData, async) {\n if (async && iccData[0].compressionMethod !== COMPRESSION_METHOD_NONE) {\n return readCompressedIcc(dataView, iccData);\n }\n\n return readIcc(dataView, iccData);\n}\n\nfunction readCompressedIcc(dataView, iccData) {\n if (!compressionMethodIsSupported(iccData[0].compressionMethod)) {\n return {};\n }\n const compressedDataView = new DataView(dataView.buffer.slice(iccData[0].offset, iccData[0].offset + iccData[0].length));\n return decompress(compressedDataView, iccData[0].compressionMethod, 'utf-8', 'dataview')\n .then(parseTags)\n .catch(() => ({}));\n}\n\nfunction compressionMethodIsSupported(compressionMethod) {\n return compressionMethod === COMPRESSION_METHOD_DEFLATE;\n}\n\nfunction readIcc(dataView, iccData) {\n try {\n const totalIccProfileLength = iccData.reduce((sum, icc) => sum + icc.length, 0);\n\n const iccBinaryData = new Uint8Array(totalIccProfileLength);\n let offset = 0;\n const buffer = getBuffer(dataView);\n\n for (let chunkNumber = 1; chunkNumber <= iccData.length; chunkNumber++) {\n const iccDataChunk = iccData.find((x) => x.chunkNumber === chunkNumber);\n if (!iccDataChunk) {\n throw new Error(`ICC chunk ${chunkNumber} not found`);\n }\n\n const data = buffer.slice(iccDataChunk.offset, iccDataChunk.offset + iccDataChunk.length);\n const chunkData = new Uint8Array(data);\n\n iccBinaryData.set(chunkData, offset);\n offset += chunkData.length;\n }\n\n return parseTags(new DataView(iccBinaryData.buffer));\n } catch (error) {\n return {};\n }\n}\n\nfunction getBuffer(dataView) {\n if (Array.isArray(dataView)) {\n return (new DataView(Uint8Array.from(dataView).buffer)).buffer;\n }\n return dataView.buffer;\n}\n\nfunction iccDoesNotHaveTagCount(buffer) {\n return buffer.length < (ICC_TAG_COUNT_OFFSET + 4);\n}\n\nfunction hasTagsData(buffer, tagHeaderOffset) {\n return buffer.length < tagHeaderOffset + TAG_TABLE_SINGLE_TAG_DATA;\n}\n\nexport function parseTags(dataView) {\n const buffer = dataView.buffer;\n\n const length = dataView.getUint32();\n if (dataView.byteLength !== length) {\n throw new Error('ICC profile length not matching');\n }\n\n if (dataView.length < PROFILE_HEADER_LENGTH) {\n throw new Error('ICC profile too short');\n }\n\n const tags = {};\n\n const iccProfileKeys = Object.keys(iccProfile);\n for (let i = 0; i < iccProfileKeys.length; i++) {\n const offset = iccProfileKeys[i];\n const profileEntry = iccProfile[offset];\n const value = profileEntry.value(dataView, parseInt(offset, 10));\n let description = value;\n if (profileEntry.description) {\n description = profileEntry.description(value);\n }\n\n tags[profileEntry.name] = {\n value,\n description\n };\n }\n\n const signature = sliceToString(buffer.slice(36, 40));\n if (signature !== ICC_SIGNATURE) {\n throw new Error('ICC profile: missing signature');\n }\n\n /* ICC data is incomplete but we have header parsed so lets return it */\n if (iccDoesNotHaveTagCount(buffer)) {\n return tags;\n }\n\n const tagCount = dataView.getUint32(128);\n let tagHeaderOffset = 132;\n\n for (let i = 0; i < tagCount; i++) {\n if (hasTagsData(buffer, tagHeaderOffset)) {\n // Tags are corrupted (offset too far), return what we parsed until now\n return tags;\n }\n const tagSignature = getStringFromDataView(dataView, tagHeaderOffset, 4);\n const tagOffset = dataView.getUint32(tagHeaderOffset + 4);\n const tagSize = dataView.getUint32(tagHeaderOffset + 8);\n\n if (tagOffset > buffer.length) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n const tagType = getStringFromDataView(dataView, tagOffset, 4);\n\n if (tagType === TAG_TYPE_DESC) {\n const tagValueSize = dataView.getUint32(tagOffset + 8);\n if (tagValueSize > tagSize) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n\n const val = sliceToString(buffer.slice(tagOffset + 12, tagOffset + tagValueSize + 11));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE) {\n const numRecords = dataView.getUint32(tagOffset + 8);\n const recordSize = dataView.getUint32(tagOffset + 12);\n let offset = tagOffset + 16;\n const val = [];\n for (let recordNum = 0; recordNum < numRecords; recordNum++) {\n const languageCode = getStringFromDataView(dataView, offset + 0, 2);\n const countryCode = getStringFromDataView(dataView, offset + 2, 2);\n const textLength = dataView.getUint32(offset + 4);\n const textOffset = dataView.getUint32(offset + 8);\n\n const text = getUnicodeStringFromDataView(dataView, tagOffset + textOffset, textLength);\n val.push({languageCode, countryCode, text});\n offset += recordSize;\n }\n if (numRecords === 1) {\n addTag(tags, tagSignature, val[0].text);\n } else {\n const valObj = {};\n for (let valIndex = 0; valIndex < val.length; valIndex++) {\n valObj[`${val[valIndex].languageCode}-${val[valIndex].countryCode}`] = val[valIndex].text;\n }\n addTag(tags, tagSignature, valObj);\n }\n } else if (tagType === TAG_TYPE_TEXT) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + tagSize - 7));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_SIGNATURE) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + 12));\n addTag(tags, tagSignature, val);\n }\n tagHeaderOffset = tagHeaderOffset + 12;\n }\n\n return tags;\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction addTag(tags, tagSignature, value) {\n if (iccTags[tagSignature]) {\n tags[iccTags[tagSignature].name] = {value, description: value};\n } else {\n tags[tagSignature] = {value, description: value};\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Reverse-engineered docs:\n// https://exiftool.org/makernote_types.html\n// https://exiv2.org/makernote.html\n// https://exiv2.org/tags-canon.html\n// https://gist.github.com/redaktor/bae0ef2377ab70bc5276\n// https://www.ozhiker.com/electronics/pjmt/jpeg_info/canon_mn.html\n\nimport {objectAssign} from './utils.js';\nimport {readIfd} from './tags-helpers.js';\nimport {IFD_TYPE_CANON} from './tag-names.js';\n\nconst SHOT_INFO_AUTO_ROTATE = 27; // First position is size.\n\nexport default {\n read,\n SHOT_INFO_AUTO_ROTATE\n};\n\nfunction read(dataView, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n let tags = readIfd(dataView, IFD_TYPE_CANON, tiffHeaderOffset, tiffHeaderOffset + offset, byteOrder, includeUnknown);\n\n if (tags['ShotInfo']) {\n tags = objectAssign({}, tags, parseShotInfo(tags['ShotInfo'].value));\n delete tags['ShotInfo'];\n }\n\n return tags;\n}\n\nfunction parseShotInfo(shotInfoData) {\n const tags = {};\n\n if (shotInfoData[SHOT_INFO_AUTO_ROTATE] !== undefined) {\n tags['AutoRotate'] = {\n value: shotInfoData[SHOT_INFO_AUTO_ROTATE],\n description: getAutoRotateDescription(shotInfoData[SHOT_INFO_AUTO_ROTATE])\n };\n }\n\n return tags;\n}\n\nfunction getAutoRotateDescription(autoRotate) {\n if (autoRotate === 0) {\n return 'None';\n }\n if (autoRotate === 1) {\n return 'Rotate 90 CW';\n }\n if (autoRotate === 2) {\n return 'Rotate 180';\n }\n if (autoRotate === 3) {\n return 'Rotate 270 CW';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n return {\n 'Image Width': getImageWidth(dataView, fileDataOffset),\n 'Image Height': getImageHeight(dataView, fileDataOffset),\n 'Bit Depth': getBitDepth(dataView, fileDataOffset),\n 'Color Type': getColorType(dataView, fileDataOffset),\n 'Compression': getCompression(dataView, fileDataOffset),\n 'Filter': getFilter(dataView, fileDataOffset),\n 'Interlace': getInterlace(dataView, fileDataOffset)\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset) {\n const OFFSET = 0;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset) {\n const OFFSET = 4;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getBitDepth(dataView, fileDataOffset) {\n const OFFSET = 8;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}`\n };\n}\n\nfunction getColorType(dataView, fileDataOffset) {\n const OFFSET = 9;\n const SIZE = 1;\n const COLOR_TYPES = {\n 0: 'Grayscale',\n 2: 'RGB',\n 3: 'Palette',\n 4: 'Grayscale with Alpha',\n 6: 'RGB with Alpha'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: COLOR_TYPES[value] || 'Unknown'\n };\n}\n\nfunction getCompression(dataView, fileDataOffset) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Deflate/Inflate' : 'Unknown'\n };\n}\n\nfunction getFilter(dataView, fileDataOffset) {\n const OFFSET = 11;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Adaptive' : 'Unknown'\n };\n}\n\nfunction getInterlace(dataView, fileDataOffset) {\n const OFFSET = 12;\n const SIZE = 1;\n const INTERLACE_TYPES = {\n 0: 'Noninterlaced',\n 1: 'Adam7 Interlace'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: INTERLACE_TYPES[value] || 'Unknown'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringValueFromArray, getStringFromDataView, decompress, COMPRESSION_METHOD_NONE} from './utils.js';\nimport TagDecoder from './tag-decoder.js';\nimport {TYPE_TEXT, TYPE_ITXT, TYPE_ZTXT} from './image-header-png.js';\nimport Tags from './tags.js';\nimport IptcTags from './iptc-tags.js';\nimport Constants from './constants.js';\n\nexport default {\n read\n};\n\nconst STATE_KEYWORD = 'STATE_KEYWORD';\nconst STATE_COMPRESSION = 'STATE_COMPRESSION';\nconst STATE_LANG = 'STATE_LANG';\nconst STATE_TRANSLATED_KEYWORD = 'STATE_TRANSLATED_KEYWORD';\nconst STATE_TEXT = 'STATE_TEXT';\nconst COMPRESSION_SECTION_ITXT_EXTRA_BYTE = 1;\nconst COMPRESSION_FLAG_COMPRESSED = 1;\nconst EXIF_OFFSET = 6;\n\nfunction read(dataView, pngTextChunks, async, includeUnknown) {\n const tags = {};\n const tagsPromises = [];\n for (let i = 0; i < pngTextChunks.length; i++) {\n const {offset, length, type} = pngTextChunks[i];\n const nameAndValue = getNameAndValue(dataView, offset, length, type, async);\n if (nameAndValue instanceof Promise) {\n tagsPromises.push(nameAndValue.then(({name, value, description}) => {\n try {\n if (Constants.USE_EXIF && isExifGroupTag(name, value)) {\n return {\n __exif: Tags.read(decodeRawData(value), EXIF_OFFSET, includeUnknown).tags\n };\n } else if (Constants.USE_IPTC && isIptcGroupTag(name, value)) {\n return {\n __iptc: IptcTags.read(decodeRawData(value), 0, includeUnknown)\n };\n } else if (name && !isExifGroupTag(name, value) && !isIptcGroupTag(name, value)) {\n return {\n [name]: {\n value,\n description\n }\n };\n }\n } catch (error) {\n // Ignore the broken tag.\n }\n return {};\n }));\n } else {\n const {name, value, description} = nameAndValue;\n if (name) {\n tags[name] = {\n value,\n description\n };\n }\n }\n }\n\n return {\n readTags: tags,\n readTagsPromise: tagsPromises.length > 0 ? Promise.all(tagsPromises) : undefined\n };\n}\n\nfunction getNameAndValue(dataView, offset, length, type, async) {\n const keywordChars = [];\n const langChars = [];\n const translatedKeywordChars = [];\n let valueChars;\n let parsingState = STATE_KEYWORD;\n let compressionMethod = COMPRESSION_METHOD_NONE;\n\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n if (parsingState === STATE_COMPRESSION) {\n compressionMethod = getCompressionMethod({type, dataView, offset: offset + i});\n if (type === TYPE_ITXT) {\n i += COMPRESSION_SECTION_ITXT_EXTRA_BYTE;\n }\n parsingState = moveToNextState(type, parsingState);\n continue;\n } else if (parsingState === STATE_TEXT) {\n valueChars = new DataView(dataView.buffer.slice(offset + i, offset + length));\n break;\n }\n const byte = dataView.getUint8(offset + i);\n if (byte === 0) {\n parsingState = moveToNextState(type, parsingState);\n } else if (parsingState === STATE_KEYWORD) {\n keywordChars.push(byte);\n } else if (parsingState === STATE_LANG) {\n langChars.push(byte);\n } else if (parsingState === STATE_TRANSLATED_KEYWORD) {\n translatedKeywordChars.push(byte);\n }\n }\n\n if (compressionMethod !== COMPRESSION_METHOD_NONE && !async) {\n return {};\n }\n const decompressedValueChars = decompress(valueChars, compressionMethod, getEncodingFromType(type));\n if (decompressedValueChars instanceof Promise) {\n return decompressedValueChars\n .then((_decompressedValueChars) => constructTag(_decompressedValueChars, type, langChars, keywordChars))\n .catch(() => constructTag(''.split(''), type, langChars, keywordChars));\n }\n return constructTag(decompressedValueChars, type, langChars, keywordChars);\n}\n\nfunction getCompressionMethod({type, dataView, offset}) {\n if (type === TYPE_ITXT) {\n if (dataView.getUint8(offset) === COMPRESSION_FLAG_COMPRESSED) {\n return dataView.getUint8(offset + 1);\n }\n } else if (type === TYPE_ZTXT) {\n return dataView.getUint8(offset);\n }\n return COMPRESSION_METHOD_NONE;\n}\n\nfunction moveToNextState(type, parsingState) {\n if (parsingState === STATE_KEYWORD && [TYPE_ITXT, TYPE_ZTXT].includes(type)) {\n return STATE_COMPRESSION;\n }\n if (parsingState === STATE_COMPRESSION) {\n if (type === TYPE_ITXT) {\n return STATE_LANG;\n }\n return STATE_TEXT;\n }\n if (parsingState === STATE_LANG) {\n return STATE_TRANSLATED_KEYWORD;\n }\n return STATE_TEXT;\n}\n\nfunction getEncodingFromType(type) {\n if (type === TYPE_TEXT || type === TYPE_ZTXT) {\n return 'latin1';\n }\n return 'utf-8';\n}\n\nfunction constructTag(valueChars, type, langChars, keywordChars) {\n const value = getValue(valueChars);\n return {\n name: getName(type, langChars, keywordChars),\n value,\n description: type === TYPE_ITXT ? getDescription(valueChars) : value\n };\n}\n\nfunction getName(type, langChars, keywordChars) {\n const name = getStringValueFromArray(keywordChars);\n if (type === TYPE_TEXT || langChars.length === 0) {\n return name;\n }\n const lang = getStringValueFromArray(langChars);\n return `${name} (${lang})`;\n}\n\nfunction getValue(valueChars) {\n if (valueChars instanceof DataView) {\n return getStringFromDataView(valueChars, 0, valueChars.byteLength);\n }\n return valueChars;\n}\n\nfunction getDescription(valueChars) {\n return TagDecoder.decode('UTF-8', valueChars);\n}\n\nfunction isExifGroupTag(name, value) {\n return name.toLowerCase() === 'raw profile type exif' && value.substring(1, 5) === 'exif';\n}\n\nfunction isIptcGroupTag(name, value) {\n return name.toLowerCase() === 'raw profile type iptc' && value.substring(1, 5) === 'iptc';\n}\n\nfunction decodeRawData(value) {\n const parts = value.match(/\\n(exif|iptc)\\n\\s*\\d+\\n([\\s\\S]*)$/);\n return hexToDataView(parts[2].replace(/\\n/g, ''));\n}\n\nfunction hexToDataView(hex) {\n const dataView = new DataView(new ArrayBuffer(hex.length / 2));\n for (let i = 0; i < hex.length; i += 2) {\n dataView.setUint8(i / 2, parseInt(hex.substring(i, i + 2), 16));\n }\n return dataView;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {PNG_CHUNK_LENGTH_OFFSET, PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_DATA_OFFSET, PNG_CHUNK_TYPE_SIZE, TYPE_PHYS, TYPE_TIME} from './image-header-png.js';\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunkOffsets) {\n const tags = {};\n\n for (let i = 0; i < chunkOffsets.length; i++) {\n const chunkLength = Types.getLongAt(dataView, chunkOffsets[i] + PNG_CHUNK_LENGTH_OFFSET);\n const chunkType = getStringFromDataView(dataView, chunkOffsets[i] + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n\n if (chunkType === TYPE_PHYS) {\n tags['Pixels Per Unit X'] = getPixelsPerUnitX(dataView, chunkOffsets[i], chunkLength);\n tags['Pixels Per Unit Y'] = getPixelsPerUnitY(dataView, chunkOffsets[i], chunkLength);\n tags['Pixel Units'] = getPixelUnits(dataView, chunkOffsets[i], chunkLength);\n } else if (chunkType === TYPE_TIME) {\n tags['Modify Date'] = getModifyDate(dataView, chunkOffsets[i], chunkLength);\n }\n }\n\n return tags;\n}\n\nfunction getPixelsPerUnitX(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 0;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelsPerUnitY(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 4;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelUnits(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 8;\n const TAG_SIZE = 1;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: value === 1 ? 'meters' : 'Unknown'\n };\n}\n\nfunction getModifyDate(dataView, chunkOffset, chunkLength) {\n const TIME_TAG_SIZE = 7;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, 0, TIME_TAG_SIZE)) {\n return undefined;\n }\n\n const year = Types.getShortAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET);\n const month = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 2);\n const day = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 3);\n const hours = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 4);\n const minutes = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 5);\n const seconds = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 6);\n\n return {\n value: [year, month, day, hours, minutes, seconds],\n description: `${pad(year, 4)}-${pad(month, 2)}-${pad(day, 2)} ${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}`\n };\n}\n\nfunction tagFitsInBuffer(dataView, chunkOffset, chunkLength, tagOffset, tagSize) {\n return tagOffset + tagSize <= chunkLength && chunkOffset + PNG_CHUNK_DATA_OFFSET + tagOffset + tagSize <= dataView.byteLength;\n}\n\nfunction pad(number, size) {\n return `${'0'.repeat(size - ('' + number).length)}${number}`;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nconst IMAGE_WIDTH_OFFSET = 4;\nconst IMAGE_HEIGHT_OFFSET = 7;\n\n// https://developers.google.com/speed/webp/docs/riff_container#extended_file_format\nfunction read(dataView, chunkOffset) {\n const tags = {};\n\n const flags = Types.getByteAt(dataView, chunkOffset);\n\n tags['Alpha'] = getAlpha(flags);\n tags['Animation'] = getAnimation(flags);\n tags['ImageWidth'] = getThreeByteValue(dataView, chunkOffset + IMAGE_WIDTH_OFFSET);\n tags['ImageHeight'] = getThreeByteValue(dataView, chunkOffset + IMAGE_HEIGHT_OFFSET);\n\n return tags;\n}\n\nfunction getAlpha(flags) {\n const value = flags & 0x10;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getAnimation(flags) {\n const value = flags & 0x02;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getThreeByteValue(dataView, offset) {\n // Values are stored little-endian.\n const value = Types.getByteAt(dataView, offset)\n + 256 * Types.getByteAt(dataView, offset + 1)\n + 256 * 256 * Types.getByteAt(dataView, offset + 2)\n + 1; // Value is 1-based, i.e. a value of 7 means 8px.\n\n return {\n value,\n description: value + 'px'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// https://www.w3.org/Graphics/GIF/spec-gif87.txt\n// https://www.w3.org/Graphics/GIF/spec-gif89a.txt\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView) {\n return {\n 'GIF Version': getGifVersion(dataView),\n 'Image Width': getImageWidth(dataView),\n 'Image Height': getImageHeight(dataView),\n 'Global Color Map': getGlobalColorMap(dataView),\n 'Bits Per Pixel': getBitDepth(dataView),\n 'Color Resolution Depth': getColorResolution(dataView)\n };\n}\n\nfunction getGifVersion(dataView) {\n const OFFSET = 3;\n const SIZE = 3;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = getStringFromDataView(dataView, OFFSET, SIZE);\n return {\n value,\n description: value\n };\n}\n\nfunction getImageWidth(dataView) {\n const OFFSET = 6;\n const SIZE = 2;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = dataView.getUint16(OFFSET, true);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView) {\n const OFFSET = 8;\n const SIZE = 2;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = dataView.getUint16(OFFSET, true);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getGlobalColorMap(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = (byteValue & 0b10000000) >>> 7;\n return {\n value,\n description: value === 1 ? 'Yes' : 'No'\n };\n}\n\nfunction getColorResolution(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = ((byteValue & 0b01110000) >>> 4) + 1; // Zero-based.\n return {\n value,\n description: `${value} ${value === 1 ? 'bit' : 'bits'}`\n };\n}\n\nfunction getBitDepth(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = (byteValue & 0b00000111) + 1; // Zero-based.\n return {\n value,\n description: `${value} ${value === 1 ? 'bit' : 'bits'}`\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {deferInit, getBase64Image} from './utils.js';\n\n// https://exiftool.org/TagNames/EXIF.html#Compression\nconst COMPRESSION_JPEG = [6, 7, 99];\n\nexport default {\n get,\n};\n\nfunction get(dataView, thumbnailTags, tiffHeaderOffset) {\n if (hasJpegThumbnail(thumbnailTags)) {\n thumbnailTags.type = 'image/jpeg';\n const offset = tiffHeaderOffset + thumbnailTags.JPEGInterchangeFormat.value;\n thumbnailTags.image = dataView.buffer.slice(offset, offset + thumbnailTags.JPEGInterchangeFormatLength.value);\n deferInit(thumbnailTags, 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n // There is a small possibility of thumbnails in TIFF format but they are\n // not stored as a self-contained image file and would be much more\n // difficult to extract.\n // https://exiftool.org/forum/index.php?topic=3273.msg14778#msg14778\n\n return thumbnailTags;\n}\n\nfunction hasJpegThumbnail(tags) {\n return tags && ((tags.Compression === undefined) || (COMPRESSION_JPEG.includes(tags.Compression.value)))\n && tags.JPEGInterchangeFormat && tags.JPEGInterchangeFormat.value\n && tags.JPEGInterchangeFormatLength && tags.JPEGInterchangeFormatLength.value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n/**\n * Thrown when no Exif metadata was found for the given image.\n *\n * @param {string} message The error message.\n */\nfunction MetadataMissingError(message) {\n this.name = 'MetadataMissingError';\n this.message = message || 'No Exif data';\n this.stack = (new Error()).stack;\n}\n\nMetadataMissingError.prototype = new Error;\n\nexport default {\n MetadataMissingError,\n};\n","/**\n * ExifReader\n * http://github.com/mattiasw/exifreader\n * Copyright (C) 2011-2023 Mattias Wallander \n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/* global Buffer, __non_webpack_require__ */\n\nimport {objectAssign, dataUriToBuffer} from './utils.js';\nimport DataViewWrapper from './dataview.js';\nimport Constants from './constants.js';\nimport {getStringValueFromArray} from './utils.js';\nimport {getCalculatedGpsValue} from './tag-names-utils.js';\nimport ImageHeader from './image-header.js';\nimport Tags from './tags.js';\nimport MpfTags from './mpf-tags.js';\nimport FileTags from './file-tags.js';\nimport JfifTags from './jfif-tags.js';\nimport IptcTags from './iptc-tags.js';\nimport XmpTags from './xmp-tags.js';\nimport PhotoshopTags from './photoshop-tags.js';\nimport IccTags from './icc-tags.js';\nimport CanonTags from './canon-tags.js';\nimport PngFileTags from './png-file-tags.js';\nimport PngTextTags from './png-text-tags.js';\nimport PngTags from './png-tags.js';\nimport Vp8xTags from './vp8x-tags.js';\nimport GifFileTags from './gif-file-tags.js';\nimport Thumbnail from './thumbnail.js';\nimport exifErrors from './errors.js';\n\nexport default {\n load,\n loadView,\n errors: exifErrors,\n};\n\nexport const errors = exifErrors;\n\nexport function load(data, options = {}) {\n if (isFilePathOrURL(data)) {\n options.async = true;\n return loadFile(data, options).then((fileContents) => loadFromData(fileContents, options));\n }\n if (isBrowserFileObject(data)) {\n options.async = true;\n return loadFileObject(data).then((fileContents) => loadFromData(fileContents, options));\n }\n return loadFromData(data, options);\n}\n\nfunction isFilePathOrURL(data) {\n return typeof data === 'string';\n}\n\nfunction loadFile(filename, options) {\n if (/^\\w+:\\/\\//.test(filename)) {\n if (typeof fetch !== 'undefined') {\n return fetchRemoteFile(filename, options);\n }\n\n return nodeGetRemoteFile(filename, options);\n }\n\n if (isDataUri(filename)) {\n return Promise.resolve(dataUriToBuffer(filename));\n }\n\n return loadLocalFile(filename, options);\n}\n\nfunction fetchRemoteFile(url, {length} = {}) {\n const options = {method: 'GET'};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n return fetch(url, options).then((response) => response.arrayBuffer());\n}\n\nfunction nodeGetRemoteFile(url, {length} = {}) {\n return new Promise((resolve, reject) => {\n const options = {};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n\n const get = requireNodeGet(url);\n get(url, options, (response) => {\n if ((response.statusCode >= 200) && (response.statusCode <= 299)) {\n const data = [];\n response.on('data', (chunk) => data.push(Buffer.from(chunk)));\n response.on('error', (error) => reject(error));\n response.on('end', () => resolve(Buffer.concat(data)));\n } else {\n reject(`Could not fetch file: ${response.statusCode} ${response.statusMessage}`);\n response.resume();\n }\n }).on('error', (error) => reject(error));\n });\n}\n\nfunction requireNodeGet(url) {\n if (/^https:\\/\\//.test(url)) {\n return __non_webpack_require__('https').get;\n }\n return __non_webpack_require__('http').get;\n}\n\nfunction isDataUri(filename) {\n return /^data:[^;,]*(;base64)?,/.test(filename);\n}\n\nfunction loadLocalFile(filename, {length} = {}) {\n return new Promise((resolve, reject) => {\n const fs = requireNodeFs();\n fs.open(filename, (error, fd) => {\n if (error) {\n reject(error);\n } else {\n fs.stat(filename, (error, stat) => {\n if (error) {\n reject(error);\n } else {\n const size = Math.min(stat.size, length !== undefined ? length : stat.size);\n const buffer = Buffer.alloc(size);\n const options = {\n buffer,\n length: size\n };\n fs.read(fd, options, (error) => {\n if (error) {\n reject(error);\n } else {\n fs.close(fd, (error) => {\n if (error) {\n console.warn(`Could not close file ${filename}:`, error); // eslint-disable-line no-console\n }\n resolve(buffer);\n });\n }\n });\n }\n });\n }\n });\n });\n}\n\nfunction requireNodeFs() {\n try {\n return __non_webpack_require__('fs');\n } catch (error) {\n return undefined;\n }\n}\n\nfunction isBrowserFileObject(data) {\n return (typeof window !== 'undefined') && (typeof File !== 'undefined') && (data instanceof File);\n}\n\nfunction loadFileObject(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => resolve(readerEvent.target.result);\n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(file);\n });\n}\n\nfunction loadFromData(data, options) {\n if (isNodeBuffer(data)) {\n // File data read in Node can share the underlying buffer with other\n // data. Therefore it's safest to get a new one to avoid weird bugs.\n data = (new Uint8Array(data)).buffer;\n }\n return loadView(getDataView(data), options);\n}\n\nfunction isNodeBuffer(data) {\n try {\n return Buffer.isBuffer(data);\n } catch (error) {\n return false;\n }\n}\n\nfunction getDataView(data) {\n try {\n return new DataView(data);\n } catch (error) {\n return new DataViewWrapper(data);\n }\n}\n\nexport function loadView(\n dataView,\n {expanded = false, async = false, includeUnknown = false} = {expanded: false, async: false, includeUnknown: false}\n) {\n let foundMetaData = false;\n let tags = {};\n const tagsPromises = [];\n\n const {\n fileType,\n fileDataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset,\n pngHeaderOffset,\n pngTextChunks,\n pngChunkOffsets,\n vp8xChunkOffset,\n gifHeaderOffset\n } = ImageHeader.parseAppMarkers(dataView, async);\n\n if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) {\n foundMetaData = true;\n const readTags = FileTags.read(dataView, fileDataOffset);\n if (expanded) {\n tags.file = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_JFIF && hasJfifData(jfifDataOffset)) {\n foundMetaData = true;\n const readTags = JfifTags.read(dataView, jfifDataOffset);\n if (expanded) {\n tags.jfif = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_EXIF && hasExifData(tiffHeaderOffset)) {\n foundMetaData = true;\n const {tags: readTags, byteOrder} = Tags.read(dataView, tiffHeaderOffset, includeUnknown);\n if (readTags.Thumbnail) {\n tags.Thumbnail = readTags.Thumbnail;\n delete readTags.Thumbnail;\n }\n\n if (expanded) {\n tags.exif = readTags;\n addGpsGroup(tags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n\n if (Constants.USE_TIFF && Constants.USE_IPTC && readTags['IPTC-NAA'] && !hasIptcData(iptcDataOffset)) {\n const readIptcTags = IptcTags.read(readTags['IPTC-NAA'].value, 0, includeUnknown);\n if (expanded) {\n tags.iptc = readIptcTags;\n } else {\n tags = objectAssign({}, tags, readIptcTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_XMP && readTags['ApplicationNotes'] && !hasXmpData(xmpChunks)) {\n const readXmpTags = XmpTags.read(getStringValueFromArray(readTags['ApplicationNotes'].value));\n if (expanded) {\n tags.xmp = readXmpTags;\n } else {\n delete readXmpTags._raw;\n tags = objectAssign({}, tags, readXmpTags);\n }\n }\n\n if (Constants.USE_PHOTOSHOP && readTags['ImageSourceData']) {\n const readPhotoshopTags = PhotoshopTags.read(readTags['PhotoshopSettings'].value, includeUnknown);\n if (expanded) {\n tags.photoshop = readPhotoshopTags;\n } else {\n tags = objectAssign({}, tags, readPhotoshopTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_ICC && readTags['ICC_Profile'] && !hasIccData(iccChunks)) {\n const readIccTags = IccTags.read(\n readTags['ICC_Profile'].value,\n [{\n offset: 0,\n length: readTags['ICC_Profile'].value.length,\n chunkNumber: 1,\n chunksTotal: 1\n }]\n );\n if (expanded) {\n tags.icc = readIccTags;\n } else {\n tags = objectAssign({}, tags, readIccTags);\n }\n }\n\n if (Constants.USE_MAKER_NOTES) {\n if (hasCanonData(readTags)) {\n const readCanonTags = CanonTags.read(dataView, tiffHeaderOffset, readTags['MakerNote'].__offset, byteOrder, includeUnknown);\n if (expanded) {\n tags.makerNotes = readCanonTags;\n } else {\n tags = objectAssign({}, tags, readCanonTags);\n }\n }\n }\n\n if (readTags['MakerNote']) {\n delete readTags['MakerNote'].__offset;\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_IPTC && hasIptcData(iptcDataOffset)) {\n foundMetaData = true;\n const readTags = IptcTags.read(dataView, iptcDataOffset, includeUnknown);\n if (expanded) {\n tags.iptc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_XMP && hasXmpData(xmpChunks)) {\n foundMetaData = true;\n const readTags = XmpTags.read(dataView, xmpChunks);\n if (expanded) {\n tags.xmp = readTags;\n } else {\n delete readTags._raw;\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if ((Constants.USE_JPEG || Constants.USE_WEBP) && Constants.USE_ICC && hasIccData(iccChunks)) {\n foundMetaData = true;\n const readTags = IccTags.read(dataView, iccChunks, async);\n if (readTags instanceof Promise) {\n tagsPromises.push(readTags.then(addIccTags));\n } else {\n addIccTags(readTags);\n }\n }\n\n if (Constants.USE_MPF && hasMpfData(mpfDataOffset)) {\n foundMetaData = true;\n const readMpfTags = MpfTags.read(dataView, mpfDataOffset, includeUnknown);\n if (expanded) {\n tags.mpf = readMpfTags;\n } else {\n tags = objectAssign({}, tags, readMpfTags);\n }\n }\n\n if (Constants.USE_PNG && Constants.USE_PNG_FILE && hasPngFileData(pngHeaderOffset)) {\n foundMetaData = true;\n const readTags = PngFileTags.read(dataView, pngHeaderOffset);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngFile = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_PNG && hasPngTextData(pngTextChunks)) {\n foundMetaData = true;\n const {readTags, readTagsPromise} = PngTextTags.read(dataView, pngTextChunks, async, includeUnknown);\n addPngTextTags(readTags);\n if (readTagsPromise) {\n tagsPromises.push(readTagsPromise.then((tagList) => tagList.forEach(addPngTextTags)));\n }\n }\n\n if (Constants.USE_PNG && hasPngData(pngChunkOffsets)) {\n foundMetaData = true;\n const readTags = PngTags.read(dataView, pngChunkOffsets);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_WEBP && hasVp8xData(vp8xChunkOffset)) {\n foundMetaData = true;\n const readTags = Vp8xTags.read(dataView, vp8xChunkOffset);\n if (expanded) {\n tags.riff = !tags.riff ? readTags : objectAssign({}, tags.riff, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_GIF && hasGifFileData(gifHeaderOffset)) {\n foundMetaData = true;\n const readTags = GifFileTags.read(dataView, gifHeaderOffset);\n if (expanded) {\n tags.gif = !tags.gif ? readTags : objectAssign({}, tags.gif, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP)\n && Constants.USE_EXIF\n && Constants.USE_THUMBNAIL\n && Thumbnail.get(dataView, tags.Thumbnail, tiffHeaderOffset);\n if (thumbnail) {\n foundMetaData = true;\n tags.Thumbnail = thumbnail;\n } else {\n delete tags.Thumbnail;\n }\n\n if (fileType) {\n if (expanded) {\n if (!tags.file) {\n tags.file = {};\n }\n tags.file.FileType = fileType;\n } else {\n tags.FileType = fileType;\n }\n foundMetaData = true;\n }\n\n if (!foundMetaData) {\n throw new exifErrors.MetadataMissingError();\n }\n\n if (async) {\n return Promise.all(tagsPromises).then(() => tags);\n }\n return tags;\n\n function addIccTags(readTags) {\n if (expanded) {\n tags.icc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n function addPngTextTags(readTags) {\n if (expanded) {\n for (const group of ['exif', 'iptc']) {\n const groupKey = `__${group}`;\n if (readTags[groupKey]) {\n tags[group] = !tags[group] ? readTags[groupKey] : objectAssign({}, tags.exif, readTags[groupKey]);\n delete readTags[groupKey];\n }\n }\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngText = !tags.pngText ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign(\n {},\n tags,\n readTags.__exif ? readTags.__exif : {},\n readTags.__iptc ? readTags.__iptc : {},\n readTags\n );\n delete tags.__exif;\n delete tags.__iptc;\n }\n }\n}\n\nfunction hasFileData(fileDataOffset) {\n return fileDataOffset !== undefined;\n}\n\nfunction hasJfifData(jfifDataOffset) {\n return jfifDataOffset !== undefined;\n}\n\nfunction hasExifData(tiffHeaderOffset) {\n return tiffHeaderOffset !== undefined;\n}\n\nfunction addGpsGroup(tags) {\n if (tags.exif) {\n if (tags.exif.GPSLatitude && tags.exif.GPSLatitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Latitude = getCalculatedGpsValue(tags.exif.GPSLatitude.value);\n if (tags.exif.GPSLatitudeRef.value.join('') === 'S') {\n tags.gps.Latitude = -tags.gps.Latitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSLongitude && tags.exif.GPSLongitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Longitude = getCalculatedGpsValue(tags.exif.GPSLongitude.value);\n if (tags.exif.GPSLongitudeRef.value.join('') === 'W') {\n tags.gps.Longitude = -tags.gps.Longitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSAltitude && tags.exif.GPSAltitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Altitude = tags.exif.GPSAltitude.value[0] / tags.exif.GPSAltitude.value[1];\n if (tags.exif.GPSAltitudeRef.value === 1) {\n tags.gps.Altitude = -tags.gps.Altitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n }\n}\n\nfunction hasIptcData(iptcDataOffset) {\n return iptcDataOffset !== undefined;\n}\n\nfunction hasXmpData(xmpChunks) {\n return Array.isArray(xmpChunks) && xmpChunks.length > 0;\n}\n\nfunction hasIccData(iccDataOffsets) {\n return Array.isArray(iccDataOffsets) && iccDataOffsets.length > 0;\n}\n\nfunction hasCanonData(tags) {\n return tags['Make'] && tags['Make'].value && Array.isArray(tags['Make'].value) && tags['Make'].value[0] === 'Canon'\n && tags['MakerNote'] && tags['MakerNote'].__offset;\n}\n\nfunction hasMpfData(mpfDataOffset) {\n return mpfDataOffset !== undefined;\n}\n\nfunction hasPngFileData(pngFileDataOffset) {\n return pngFileDataOffset !== undefined;\n}\n\nfunction hasPngTextData(pngTextChunks) {\n return pngTextChunks !== undefined;\n}\n\nfunction hasPngData(pngChunkOffsets) {\n return pngChunkOffsets !== undefined;\n}\n\nfunction hasVp8xData(vp8xChunkOffset) {\n return vp8xChunkOffset !== undefined;\n}\n\nfunction hasGifFileData(gifHeaderOffset) {\n return gifHeaderOffset !== undefined;\n}\n"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DataView","buffer","_classCallCheck","_typeof","undefined","length","readUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt32LE","readInt32BE","bufferTypeIsUnsupported","Error","byteLength","offset","littleEndian","getDataView","data","byteOffset","error","DataViewWrapper","getStringFromDataView","dataView","chars","i","push","getUint8","getStringValueFromArray","getNullTerminatedStringFromDataView","char","getUnicodeStringFromDataView","getUint16","pop","getPascalStringFromDataView","size","charArray","map","charCode","String","fromCharCode","join","objectAssign","arguments","property","deferInit","object","initializer","initialized","configurable","apply","writable","getBase64Image","image","btoa","Array","reduce","Uint8Array","byte","Buffer","from","toString","strRepeat","string","num","COMPRESSION_METHOD_NONE","decompress","compressionMethod","encoding","returnType","DecompressionStream","decompressionStream","decompressedStream","Blob","stream","pipeThrough","Response","arrayBuffer","then","TextDecoder","decode","Promise","reject","concat","USE_FILE","USE_JFIF","USE_PNG_FILE","USE_EXIF","USE_IPTC","USE_XMP","USE_ICC","USE_MPF","USE_PHOTOSHOP","USE_THUMBNAIL","USE_TIFF","USE_JPEG","USE_PNG","USE_HEIC","USE_AVIF","USE_WEBP","USE_GIF","USE_MAKER_NOTES","getStringValue","getEncodedString","slice","getCalculatedGpsValue","LITTLE_ENDIAN","tiffHeaderOffset","MIN_JPEG_DATA_BUFFER_LENGTH","JPEG_ID","JPEG_ID_SIZE","APP_ID_OFFSET","APP_MARKER_SIZE","JFIF_DATA_OFFSET","TIFF_HEADER_OFFSET","IPTC_DATA_OFFSET","XMP_DATA_OFFSET","XMP_EXTENDED_DATA_OFFSET","APP2_ICC_DATA_OFFSET","MPF_DATA_OFFSET","APP2_ICC_IDENTIFIER","ICC_CHUNK_NUMBER_OFFSET","ICC_TOTAL_CHUNKS_OFFSET","APP2_MPF_IDENTIFIER","SOF0_MARKER","SOF2_MARKER","DHT_MARKER","DQT_MARKER","DRI_MARKER","SOS_MARKER","APP0_MARKER","APP1_MARKER","APP2_MARKER","APP13_MARKER","APP15_MARKER","COMMENT_MARKER","FILL_BYTE","APP0_JFIF_IDENTIFIER","APP1_EXIF_IDENTIFIER","APP1_XMP_IDENTIFIER","APP1_XMP_EXTENDED_IDENTIFIER","APP13_IPTC_IDENTIFIER","isSOF0Marker","appMarkerPosition","isSOF2Marker","isApp2ICCMarker","markerIdLength","isApp2MPFMarker","isApp0JfifMarker","isApp1ExifMarker","isApp1XmpMarker","isXmpIdentifier","isApp1ExtendedXmpMarker","isExtendedXmpIdentifier","getXmpChunkDetails","fieldLength","dataOffset","getExtendedXmpChunkDetails","isApp13PhotoshopMarker","isAppMarker","appMarker","isFillByte","PNG_ID","PNG_CHUNK_LENGTH_SIZE","PNG_CHUNK_TYPE_SIZE","PNG_CHUNK_LENGTH_OFFSET","PNG_CHUNK_TYPE_OFFSET","PNG_CHUNK_DATA_OFFSET","PNG_XMP_PREFIX","TYPE_TEXT","TYPE_ITXT","TYPE_ZTXT","TYPE_PHYS","TYPE_TIME","TYPE_EXIF","TYPE_ICCP","isPngImageHeaderChunk","isPngXmpChunk","isPngTextChunk","async","chunkType","isPngExifChunk","isPngIccpChunk","isPngChunk","SUPPORTED_PNG_CHUNK_TYPES","includes","getPngXmpDataOffset","numberOfNullSeparators","parseIccHeader","profileName","compressedProfileOffset","getItems","version","offsets","sizes","offsetSize","lengthSize","indexSize","itemCount","items","item","extents","itemId","getItemId","constructionMethod","dataReferenceIndex","baseOffset","getVariableSizedValue","extentCount","j","extent","extentIndex","getExtentIndex","extentOffset","extentLength","getUint32","console","warn","get64BitValue","ITEM_INFO_TYPE_EXIF","ITEM_INFO_TYPE_MIME","parseBox","_getBoxLength","boxLength","extendsToEndOfFile","contentOffset","hasExtendedSize","hasEmptyHighBits","getBoxLength","type","majorBrand","parseFileTypeBox","startOffset","subBoxes","parseSubBoxes","parseItemPropertiesBox","properties","parseItemPropertyContainerBox","icc","parseIcc","parseColorInformationBox","parseMetadataBox","_getItemLocationBoxOf","baseOffsetSize","getItemLocationBoxOffsetsAndSizes","getIndexSize","getItemCount","parseItemLocationBox","_getItemInformationBo","entryCount","itemInfos","getItemInformationBoxOffsetsAndSizes","parseItemInformationBox","entry","itemProtectionIndex","itemName","itemType","contentType","contentEncoding","itemUri","parseItemInformationEntryBox","findOffsets","Constants","metaBox","box","findMetaBox","exifItemId","find","itemInfo","findIinfExifItemId","ilocItem","findIlocItem","exifOffset","getTiffHeaderOffset","findExifOffset","xmpChunks","xmpItemId","findIinfXmpItemId","ilocItemExtent","findXmpChunks","iccChunks","findIccChunks","hasAppMarkers","colorType","chunkNumber","chunksTotal","ACCEPTED_ITEM_INFO_TYPES","currentOffset","indexOf","GIF_SIGNATURE_SIZE","GIF_SIGNATURES","XML_MARKER_OFFSET","XML_MARKER","parseAppMarkers","ByteOrder","hasTiffMarker","Tiff","addFileType","Jpeg","sof0DataOffset","sof2DataOffset","jfifDataOffset","iptcDataOffset","mpfDataOffset","iccDataOffset","iccDataLength","iccChunkNumber","iccChunksTotal","fileDataOffset","Png","pngHeaderOffset","pngTextChunks","chunkDataLength","iccHeaderOffset","_parseIccHeader","pngChunkOffsets","headerBox","Heic","Avif","RIFF_ID","WEBP_MARKER","Webp","vp8xChunkOffset","chunkId","chunkSize","EXIF_IDENTIFIER","Gif","gifHeaderOffset","Xml","fileType","fileTypeDescription","description","ApertureValue","Math","pow","sqrt","toFixed","ColorSpace","ComponentsConfiguration","character","Contrast","CustomRendered","ExposureMode","ExposureProgram","ExposureTime","decimal","Number","isInteger","round","FNumber","FocalLength","FocalPlaneResolutionUnit","LightSource","MeteringMode","ResolutionUnit","Saturation","SceneCaptureType","Sharpness","ShutterSpeedValue","denominator","WhiteBalance","XResolution","YResolution","name","TagNamesCommon","values","formats","isArray","sample","decodeXPValue","replace","ref","_ref","_ref2","test","status","mode","tagNames0thExifIfds","TagNames0thIfd","x","y","focalLengthFrom","parseFloat","focalLengthTo","focalLengths","maxAperture","IFD_TYPE_0TH","IFD_TYPE_EXIF","IFD_TYPE_INTEROPERABILITY","IFD_TYPE_CANON","_defineProperty","TagNamesGpsIfd","TagNamesInteroperabilityIfd","TagNamesMpfIfd","typeSizes","tagTypes","getAsciiValue","getByteAt","getAsciiAt","getShortAt","byteOrder","getLongAt","getRationalAt","getUndefinedAt","getSlongAt","getSrationalAt","getIfdPointerAt","getTypeSize","typeName","getInt32","getTagValueAt","Types","get0thIfdOffset","readIfd","ifdType","includeUnknown","FIELD_COUNT_SIZE","tags","numberOfFields","getNumberOfFields","fieldIndex","tag","readTag","id","__offset","nextIfdOffset","tagValue","tagValueOffset","TAG_TYPE_OFFSET","TAG_COUNT_OFFSET","TAG_VALUE_OFFSET","tagCode","tagType","tagCount","TagNames","tagValueFitsInOffsetSlot","getTagValue","tagValueFitsInDataView","asciiValue","decodeURIComponent","escape","decodeAsciiValue","splitNullSeparatedAsciiString","tagName","tagDescription","getDescriptionFromTagValue","count","valueIndex","EXIF_IFD_POINTER_KEY","GPS_INFO_IFD_POINTER_KEY","INTEROPERABILITY_IFD_POINTER_KEY","read","read0thIfd","readInteroperabilityIfd","readGpsIfd","readExifIfd","images","ceil","ENTRY_SIZE","attributes","getImageNumberValue","getImageFlags","getImageFormat","getImageType","imageSize","imageOffset","getImageOffset","dependentImage1EntryNumber","dependentImage2EntryNumber","addMpfImages","entries","flags","flagsDescription","imageFormat","imageIndex","mpEntry","isFirstIndividualImage","getLength","numberOfColorComponents","OFFSET","getNumberOfColorComponents","getDataPrecision","getImageHeight","getImageWidth","getSubsampling","components","componentOffset","getComponentIds","getSamplingType","ids","compontent","types","thumbnailWidth","getThumbnailWidth","thumbnailHeight","getThumbnailHeight","getVersion","getResolutionUnit","getXResolution","getYResolution","thumbnail","thumbnailLength","getThumbnail","majorVersion","minorVersion","getResolutionUnitDescription","getCreationDate","getCreationTime","getEncodingName","parts","split","stringValue","character0","charAt","character1","parseInt","bits","duration","substr","intValue","formatVersions","objectDataPreviewFileFormat","n","date","time","parsedTime","Decoder","parseTags","_getNaaResourceBlock","BYTES_8BIM_SIZE","resourceBlock","getResourceBlock","isNaaResourceBlock","naaBlock","getBlockPadding","getNaaResourceBlock","endOfBlockOffset","_readTag","tagSize","leadByteIsMissing","IptcTagNames","getTagName","getTagDescription","tagIsRepeatable","tagContainsEncoding","tagIsName","hasDynamicName","hasDescriptionProperty","tagValueIsText","TagDecoder","fraction","calculateGPSValue","substring","parseNumber","numbers","number","charCodeAt","isFraction","func","_value$split2","degreesString","minutesString","degrees","minutes","isNaN","chunks","readTags","_extractCompleteChunk2","completeChunks","combineChunks","extractCompleteChunks","standardXmp","extendedXmp","hasStandardTags","hasExtendedTags","_raw","totalLength","chunk","combinedChunks","set","chunkDataView","_getDocument","domParser","DOMParser","_non_webpack_require","__non_webpack_require__","onError","onErrorStopParsing","xmlString","doc","parseFromString","documentElement","nodeName","textContent","raw","getDocument","parseXMPObject","convertToObject","getRDF","node","childNodes","nodes","isTopNode","elements","getChildNodes","nodeValue","getTextValue","forEach","isElement","nodeElement","getAttributes","getElementFromNode","getElementsFromNodes","element","xmpObject","parseNodeAttributesAsTags","parseNodeChildrenAsTags","isTagAttribute","getLocalName","getDescription","isNamespaceDefinition","arrayDescription","getDescriptionOfArray","XmpTagNames","descriptions","getClearTextKey","getDescriptionOfObject","children","parseNodeAsTag","isDuplicateTag","parseNodeAsSimpleValue","parseNodeAsDuplicateTag","trim","isEmptyResourceTag","hasNestedSimpleRdfDescription","parseNodeAsSimpleRdfDescription","hasNestedStructureRdfDescription","parseNodeAsStructureRdfDescription","isCompactStructure","parseNodeAsCompactStructure","getArrayChild","parseNodeAttributes","parseArrayValue","parseNodeAsArray","parseNodeChildrenAsAttributes","getURIValue","parseRdfValue","keys","paths","TYPE_SIZE","PATH_RECORD_TYPES","path","JSON","stringify","parseBezierKnot","getFixedPointNumber","parsePathPoint","vertical","binaryPoint","sign","integer","parseFloatRadix","bytes","signature","SIGNATURE_SIZE","tagId","_getTagName","TAG_ID_SIZE","tagNameSize","resourceSize","RESOURCE_LENGTH_SIZE","SIGNATURE","valueDataView","_getPascalStringFromD2","stringSize","iccTags","iccProfile","toCompany","toLowerCase","year","month","day","hours","seconds","Date","UTC","parseDate","toISOString","iccData","catch","readCompressedIcc","totalIccProfileLength","sum","iccBinaryData","getBuffer","_loop","iccDataChunk","chunkData","readIcc","PROFILE_HEADER_LENGTH","ICC_TAG_COUNT_OFFSET","ICC_SIGNATURE","TAG_TYPE_DESC","TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE","TAG_TYPE_TEXT","TAG_TYPE_SIGNATURE","TAG_TABLE_SINGLE_TAG_DATA","hasTagsData","tagHeaderOffset","iccProfileKeys","profileEntry","sliceToString","iccDoesNotHaveTagCount","tagSignature","tagOffset","tagValueSize","addTag","numRecords","recordSize","val","recordNum","languageCode","countryCode","textLength","textOffset","text","valObj","valIndex","shotInfoData","autoRotate","SHOT_INFO_AUTO_ROTATE","parseShotInfo","getBitDepth","getColorType","getCompression","getFilter","getInterlace","tagsPromises","_pngTextChunks$i","nameAndValue","getNameAndValue","isExifGroupTag","__exif","Tags","decodeRawData","EXIF_OFFSET","isIptcGroupTag","__iptc","IptcTags","readTagsPromise","all","STATE_KEYWORD","STATE_COMPRESSION","STATE_LANG","STATE_TRANSLATED_KEYWORD","STATE_TEXT","COMPRESSION_SECTION_ITXT_EXTRA_BYTE","COMPRESSION_FLAG_COMPRESSED","valueChars","keywordChars","langChars","translatedKeywordChars","parsingState","moveToNextState","getCompressionMethod","decompressedValueChars","getEncodingFromType","_decompressedValueChars","constructTag","_ref3","getValue","getName","lang","hex","ArrayBuffer","setUint8","hexToDataView","match","chunkOffsets","chunkLength","getPixelsPerUnitX","getPixelsPerUnitY","getPixelUnits","getModifyDate","chunkOffset","tagFitsInBuffer","pad","repeat","getAlpha","getAnimation","getThreeByteValue","IMAGE_WIDTH_OFFSET","IMAGE_HEIGHT_OFFSET","getGifVersion","getGlobalColorMap","getColorResolution","COMPRESSION_JPEG","thumbnailTags","Compression","JPEGInterchangeFormat","JPEGInterchangeFormatLength","MetadataMissingError","message","stack","load","loadView","errors","exifErrors","file","options","isFilePathOrURL","filename","fetch","url","method","headers","range","response","fetchRemoteFile","resolve","requireNodeGet","statusCode","on","statusMessage","resume","nodeGetRemoteFile","isDataUri","dataUri","atob","decodedData","dataUriToBuffer","fs","requireNodeFs","open","fd","stat","min","alloc","close","loadLocalFile","loadFile","fileContents","loadFromData","window","File","isBrowserFileObject","reader","FileReader","onload","readerEvent","target","result","onerror","readAsArrayBuffer","isBuffer","isNodeBuffer","_ref4","expanded","_ref4$expanded","_ref4$async","_ref4$includeUnknown","foundMetaData","_ImageHeader$parseApp","ImageHeader","hasFileData","FileTags","hasJfifData","JfifTags","jfif","hasExifData","_Tags$read","Thumbnail","exif","GPSLatitude","GPSLatitudeRef","gps","Latitude","GPSLongitude","GPSLongitudeRef","Longitude","GPSAltitude","GPSAltitudeRef","Altitude","addGpsGroup","hasIptcData","readIptcTags","iptc","hasXmpData","readXmpTags","XmpTags","xmp","readPhotoshopTags","PhotoshopTags","photoshop","hasIccData","readIccTags","IccTags","hasCanonData","readCanonTags","CanonTags","makerNotes","addIccTags","hasMpfData","readMpfTags","MpfTags","mpf","PngFileTags","png","pngFile","hasPngTextData","_PngTextTags$read","PngTextTags","addPngTextTags","tagList","hasPngData","PngTags","hasVp8xData","Vp8xTags","riff","hasGifFileData","GifFileTags","gif","FileType","_i","_arr","group","groupKey","pngText","iccDataOffsets"],"sourceRoot":""} \ No newline at end of file diff --git a/src/tag-names-0th-ifd.js b/src/tag-names-0th-ifd.js index a8e286a..e587882 100644 --- a/src/tag-names-0th-ifd.js +++ b/src/tag-names-0th-ifd.js @@ -230,11 +230,26 @@ export default { 0x87b0: 'GeoTiffDoubleParams', 0x87b1: 'GeoTiffAsciiParams', 0x8825: 'GPS Info IFD Pointer', - 0x9c9b: 'XPTitle', - 0x9c9c: 'XPComment', - 0x9c9d: 'XPAuthor', - 0x9c9e: 'XPKeywords', - 0x9c9f: 'XPSubject', + 0x9c9b: { + name: 'XPTitle', + description: decodeXPValue, + }, + 0x9c9c: { + name: 'XPComment', + description: decodeXPValue + }, + 0x9c9d: { + name: 'XPAuthor', + description: decodeXPValue, + }, + 0x9c9e: { + name: 'XPKeywords', + description: decodeXPValue, + }, + 0x9c9f: { + name: 'XPSubject', + description: decodeXPValue, + }, 0xa480: 'GDALMetadata', 0xa481: 'GDALNoData', 0xc4a5: 'PrintIM', @@ -355,3 +370,12 @@ export default { 0xc7a7: 'NewRawImageDigest', 0xc7a8: 'RawToPreviewGain' }; + +function decodeXPValue(value) { + // The XP tags are encoded as UCS-2 which uses two bytes per character but + // it's close to UTF-16 so we can use that to decode them. + // https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml + const decodedValue = new TextDecoder('utf-16').decode(new Uint8Array(value)); + // Some softwares pad the string with null characters so we remove them. + return decodedValue.replace(/\u0000+$/, ''); // eslint-disable-line no-control-regex +} diff --git a/test/unit/tag-names-0th-ifd-spec.js b/test/unit/tag-names-0th-ifd-spec.js index 2fb59a9..fe7b6f6 100644 --- a/test/unit/tag-names-0th-ifd-spec.js +++ b/test/unit/tag-names-0th-ifd-spec.js @@ -359,23 +359,28 @@ describe('tag-names-0th-ifd', () => { }); it('should have tag XPTitle', () => { - expect(TagNames0thIfd[0x9c9b]).to.equal('XPTitle'); + expect(TagNames0thIfd[0x9c9b].name).to.equal('XPTitle'); + expect(TagNames0thIfd[0x9c9b].description([116, 0, 105, 0, 116, 0, 108, 0, 101, 0])).to.equal('title'); }); it('should have tag XPComment', () => { - expect(TagNames0thIfd[0x9c9c]).to.equal('XPComment'); + expect(TagNames0thIfd[0x9c9c].name).to.equal('XPComment'); + expect(TagNames0thIfd[0x9c9c].description([99, 0, 111, 0, 109, 0, 109, 0, 101, 0, 110, 0, 116, 0])).to.equal('comment'); }); it('should have tag XPAuthor', () => { - expect(TagNames0thIfd[0x9c9d]).to.equal('XPAuthor'); + expect(TagNames0thIfd[0x9c9d].name).to.equal('XPAuthor'); + expect(TagNames0thIfd[0x9c9d].description([97, 0, 117, 0, 116, 0, 104, 0, 111, 0, 114, 0])).to.equal('author'); }); it('should have tag XPKeywords', () => { - expect(TagNames0thIfd[0x9c9e]).to.equal('XPKeywords'); + expect(TagNames0thIfd[0x9c9e].name).to.equal('XPKeywords'); + expect(TagNames0thIfd[0x9c9e].description([107, 0, 101, 0, 121, 0, 119, 0, 111, 0, 114, 0, 100, 0, 115, 0])).to.equal('keywords'); }); it('should have tag XPSubject', () => { - expect(TagNames0thIfd[0x9c9f]).to.equal('XPSubject'); + expect(TagNames0thIfd[0x9c9f].name).to.equal('XPSubject'); + expect(TagNames0thIfd[0x9c9f].description([115, 0, 117, 0, 98, 0, 106, 0, 101, 0, 99, 0, 116, 0])).to.equal('subject'); }); it('should have tag GDALMetadata', () => {