@ohos-ports/dcmjs 0.52.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcmjs.min.js","sources":["../node_modules/.pnpm/loglevel@1.9.2/node_modules/loglevel/lib/loglevel.js","../src/log.js","../src/bitArray.js","../node_modules/.pnpm/pako@2.1.0/node_modules/pako/dist/pako.esm.mjs","../src/SplitDataView.js","../src/utilities/toFloat.js","../src/utilities/toInt.js","../src/BufferStream.js","../src/constants/dicom.js","../src/utilities/dicomJson.js","../src/ValueRepresentation.js","../src/DicomDict.js","../src/dicom.packed.js","../src/dictionary.ranges.data.js","../src/dicom.lookup.js","../src/dictionary.fast.js","../src/Tag.js","../src/utilities/addAccessors.js","../src/DicomMetaDictionary.js","../src/utilities/deepEqual.js","../src/DicomMessage.js","../src/dictionary.private.data.js","../src/dicomweb.js","../src/colors.js","../src/utilities/DicomMetadataListener.js","../src/AsyncDicomReader.js","../src/datasetToBlob.js","../src/derivations/DerivedDataset.js","../src/derivations/Segmentation.js","../src/derivations/DerivedPixels.js","../src/derivations/DerivedImage.js","../src/derivations/ParametricMap.js","../src/derivations/StructuredReport.js","../src/normalizers.js","../src/utilities/TID1500/TID1500MeasurementReport.js","../src/utilities/TID1500/TID1501MeasurementGroup.js","../src/adapters/helpers.js","../src/adapters/Cornerstone/MeasurementReport.js","../src/utilities/TID300/TID300Measurement.js","../src/utilities/TID300/TID320ContentItem.js","../src/utilities/TID300/OpenPolyline.js","../src/utilities/TID300/unit2CodingValue.js","../src/utilities/TID300/Length.js","../src/adapters/Cornerstone/cornerstone4Tag.js","../src/adapters/Cornerstone/Length.js","../src/utilities/MeasurementBuilder.js","../src/utilities/TID300/Polyline.js","../src/adapters/Cornerstone/FreehandRoi.js","../src/utilities/TID300/Bidirectional.js","../src/adapters/Cornerstone/Bidirectional.js","../src/utilities/TID300/Ellipse.js","../src/adapters/Cornerstone/EllipticalRoi.js","../src/utilities/TID300/Circle.js","../src/adapters/Cornerstone/CircleRoi.js","../src/utilities/TID300/Point.js","../src/adapters/Cornerstone/ArrowAnnotate.js","../node_modules/.pnpm/is-buffer@1.1.6/node_modules/is-buffer/index.js","../node_modules/.pnpm/ndarray@1.0.19/node_modules/ndarray/ndarray.js","../node_modules/.pnpm/iota-array@1.0.0/node_modules/iota-array/iota.js","../src/utilities/orientation/crossProduct3D.js","../src/utilities/orientation/flipImageOrientationPatient.js","../src/utilities/orientation/rotateVectorAroundUnitVector.js","../src/utilities/orientation/rotateDirectionCosinesInPlane.js","../src/utilities/orientation/flipMatrix2D.js","../src/utilities/orientation/rotateMatrix902D.js","../src/utilities/orientation/nearlyEqual.js","../src/adapters/Cornerstone/Segmentation_3X.js","../src/utilities/compression/rleSingleSamplePerPixel.js","../node_modules/.pnpm/lodash.clonedeep@4.5.0/node_modules/lodash.clonedeep/index.js","../src/adapters/Cornerstone/Segmentation_4X.js","../src/adapters/Cornerstone/Segmentation.js","../src/utilities/TID300/CobbAngle.js","../src/adapters/Cornerstone/CobbAngle.js","../src/adapters/Cornerstone/Angle.js","../src/adapters/Cornerstone/RectangleRoi.js","../src/adapters/Cornerstone/index.js","../src/adapters/Cornerstone3D/CodingScheme.js","../src/adapters/Cornerstone3D/freeTextCodeChecks.js","../src/adapters/Cornerstone3D/MeasurementReport.js","../src/adapters/Cornerstone3D/cornerstone3DTag.js","../src/adapters/Cornerstone3D/Length.js","../src/adapters/Cornerstone3D/Bidirectional.js","../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/common.js","../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/vec3.js","../src/adapters/Cornerstone3D/EllipticalROI.js","../src/utilities/TID300/ArrowAnnotate.js","../src/adapters/Cornerstone3D/ArrowAnnotate.js","../src/adapters/Cornerstone3D/Probe.js","../src/adapters/Cornerstone3D/PlanarFreehandROI.js","../src/adapters/Cornerstone3D/index.js","../src/adapters/VTKjs/Segmentation.js","../src/adapters/VTKjs/index.js","../src/adapters/DICOMMicroscopyViewer/MeasurementReport.js","../src/adapters/DICOMMicroscopyViewer/Polyline.js","../src/utilities/TID300/Polygon.js","../src/adapters/DICOMMicroscopyViewer/Polygon.js","../src/adapters/DICOMMicroscopyViewer/Point.js","../src/adapters/DICOMMicroscopyViewer/Circle.js","../src/adapters/DICOMMicroscopyViewer/Ellipse.js","../src/adapters/DICOMMicroscopyViewer/index.js","../src/adapters/index.js","../src/utilities/TID1500/index.js","../src/utilities/TID300/Calibration.js","../src/utilities/Message.js","../src/utilities/ArrayBufferExpanderListener.js","../src/utilities/index.js","../src/utilities/TID300/index.js","../src/sr/coding.js","../src/sr/valueTypes.js","../src/sr/contentItems.js","../src/sr/templates.js","../src/sr/documents.js","../src/sr/index.js","../src/anonymizer.js","../src/index.js"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","import log from \"loglevel\";\n\nlog.setLevel(process.env.LOG_LEVEL || \"warn\");\n\nconst validationLog = log.getLogger(\"validation.dcmjs\");\n\nexport { log, validationLog };\nexport default log;\n","/* eslint no-bitwise: 0 */\nimport log from \"./log.js\";\n\nconst BitArray = {\n getBytesForBinaryFrame,\n pack,\n unpack\n};\n\nexport { BitArray };\nexport default BitArray;\n\nfunction getBytesForBinaryFrame(numPixels) {\n // Check whether the 1-bit pixels exactly fit into bytes\n const remainder = numPixels % 8;\n\n // Number of bytes that work on an exact fit\n let bytesRequired = Math.floor(numPixels / 8);\n\n // Add one byte if we have a remainder\n if (remainder > 0) {\n bytesRequired++;\n }\n\n return bytesRequired;\n}\n\nfunction pack(pixelData) {\n const numPixels = pixelData.length;\n\n log.debug(\"numPixels: \" + numPixels);\n\n const length = getBytesForBinaryFrame(numPixels);\n //log.info('getBytesForBinaryFrame: ' + length);\n\n const bitPixelData = new Uint8Array(length);\n\n let bytePos = 0;\n\n for (let i = 0; i < numPixels; i++) {\n // Compute byte position\n bytePos = Math.floor(i / 8);\n\n const pixValue = pixelData[i] !== 0;\n\n //log.info('i: ' + i);\n //log.info('pixValue: ' + pixValue);\n //log.info('bytePos: ' + bytePos);\n\n const bitPixelValue = pixValue << i % 8;\n //log.info('current bitPixelData: ' + bitPixelData[bytePos]);\n //log.info('this bitPixelValue: ' + bitPixelValue);\n\n bitPixelData[bytePos] |= bitPixelValue;\n\n //log.info('new bitPixelValue: ' + bitPixelData[bytePos]);\n }\n\n return bitPixelData;\n}\n\n// convert a packed bitwise pixel array into a byte-per-pixel\n// array with 255 corresponding to each set bit in the bit array\nfunction unpack(bitPixelArray) {\n const bitArray = new Uint8Array(bitPixelArray);\n const byteArray = new Uint8Array(8 * bitArray.length);\n\n for (let byteIndex = 0; byteIndex < byteArray.length; byteIndex++) {\n const bitIndex = byteIndex % 8;\n const bitByteIndex = Math.floor(byteIndex / 8);\n byteArray[byteIndex] =\n 255 * ((bitArray[bitByteIndex] & (1 << bitIndex)) >> bitIndex);\n }\n\n return byteArray;\n}\n","\n/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED$1 = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN$1 = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1 = 30;\n/* number of distance codes */\n\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) => {\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Tracev((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Tracev((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) => {\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n\n const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS$1; bits++) {\n code = (code + bl_count[bits - 1]) << 1;\n next_code[bits] = code;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n // \"inconsistent bit counts\");\n //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n for (n = 0; n <= max_code; n++) {\n let len = tree[n * 2 + 1]/*.Len*/;\n if (len === 0) { continue; }\n /* Now reverse the bits */\n tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n }\n};\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nconst tr_static_init = () => {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES$1; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES$1; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.sym_next = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) => {\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let sx = 0; /* running index in sym_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.sym_next !== 0) {\n do {\n dist = s.pending_buf[s.sym_buf + sx++] & 0xff;\n dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;\n lc = s.pending_buf[s.sym_buf + sx++];\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and sym_buf is ok: */\n //Assert(s->pending < s->lit_bufsize + sx, \"pendingBuf overflow\");\n\n } while (sx < s.sym_next);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) => {\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE$1;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) => {\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"block list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"allow list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* block_mask is the bit mask of block-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let block_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"block-listed\") bytes. */\n for (n = 0; n <= 31; n++, block_mask >>>= 1) {\n if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"allow-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS$1; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"block-listed\" or \"allow-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n bi_windup(s); /* align on byte boundary */\n put_short(s, stored_len);\n put_short(s, ~stored_len);\n if (stored_len) {\n s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);\n }\n s.pending += stored_len;\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and write out the encoded block.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN$1) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->sym_next / 3));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block$1(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) => {\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n\n s.pending_buf[s.sym_buf + s.sym_next++] = dist;\n s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;\n s.pending_buf[s.sym_buf + s.sym_next++] = lc;\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n return (s.sym_next === s.sym_end);\n};\n\nvar _tr_init_1 = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1 = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_UNKNOWN,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES = 30;\n/* number of distance codes */\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42; /* zlib header -> BUSY_STATE */\n//#ifdef GZIP\nconst GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */\n//#endif\nconst EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */\nconst NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */\nconst COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */\nconst HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */\nconst BUSY_STATE = 113; /* deflate -> FINISH_STATE */\nconst FINISH_STATE = 666; /* stream complete */\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) * 2) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n/* ===========================================================================\n * Slide the hash table when sliding the window down (could be avoided with 32\n * bit values at the expense of memory usage). We slide even when level == 0 to\n * keep the hash table consistent if we switch back to level > 0 later.\n */\nconst slide_hash = (s) => {\n let n, m;\n let p;\n let wsize = s.w_size;\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= wsize ? m - wsize : 0);\n } while (--n);\n n = wsize;\n//#ifndef FASTEST\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= wsize ? m - wsize : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n//#endif\n};\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output, except for\n * some deflate_stored() output, goes through this function so some\n * applications may wish to modify it to avoid allocating a large\n * strm->next_out buffer and copying into it. (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let n, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n slide_hash(s);\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n *\n * In case deflateParams() is used to later switch to a non-zero compression\n * level, s->matches (otherwise unused when storing) keeps track of the number\n * of hash table slides to perform. If s->matches is 1, then one hash table\n * slide will be done when switching. If s->matches is 2, the maximum value\n * allowed here, then the hash table will be cleared, since two or more slides\n * is the same as a clear.\n *\n * deflate_stored() is written to minimize the number of times an input byte is\n * copied. It is most efficient with large input and output buffers, which\n * maximizes the opportunites to have a single copy from next_in to next_out.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Smallest worthy block size when not flushing or finishing. By default\n * this is 32K. This can be as small as 507 bytes for memLevel == 1. For\n * large input and output buffers, the stored block size will be larger.\n */\n let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;\n\n /* Copy as many min_block or larger stored blocks directly to next_out as\n * possible. If flushing, copy the remaining available input to next_out as\n * stored blocks, if there is enough space.\n */\n let len, left, have, last = 0;\n let used = s.strm.avail_in;\n do {\n /* Set len to the maximum size block that we can copy directly with the\n * available input data and output space. Set left to how much of that\n * would be copied from what's left in the window.\n */\n len = 65535/* MAX_STORED */; /* maximum deflate stored block length */\n have = (s.bi_valid + 42) >> 3; /* number of header bytes */\n if (s.strm.avail_out < have) { /* need room for header */\n break;\n }\n /* maximum stored block length that will fit in avail_out: */\n have = s.strm.avail_out - have;\n left = s.strstart - s.block_start; /* bytes left in window */\n if (len > left + s.strm.avail_in) {\n len = left + s.strm.avail_in; /* limit len to the input */\n }\n if (len > have) {\n len = have; /* limit len to the output */\n }\n\n /* If the stored block would be less than min_block in length, or if\n * unable to copy all of the available input when flushing, then try\n * copying to the window and the pending buffer instead. Also don't\n * write an empty block when flushing -- deflate() does that.\n */\n if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) ||\n flush === Z_NO_FLUSH$2 ||\n len !== left + s.strm.avail_in)) {\n break;\n }\n\n /* Make a dummy stored block in pending to get the header bytes,\n * including any pending bits. This also updates the debugging counts.\n */\n last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0;\n _tr_stored_block(s, 0, 0, last);\n\n /* Replace the lengths in the dummy stored block with len. */\n s.pending_buf[s.pending - 4] = len;\n s.pending_buf[s.pending - 3] = len >> 8;\n s.pending_buf[s.pending - 2] = ~len;\n s.pending_buf[s.pending - 1] = ~len >> 8;\n\n /* Write the stored block header bytes. */\n flush_pending(s.strm);\n\n//#ifdef ZLIB_DEBUG\n// /* Update debugging counts for the data about to be copied. */\n// s->compressed_len += len << 3;\n// s->bits_sent += len << 3;\n//#endif\n\n /* Copy uncompressed bytes from the window to next_out. */\n if (left) {\n if (left > len) {\n left = len;\n }\n //zmemcpy(s->strm->next_out, s->window + s->block_start, left);\n s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);\n s.strm.next_out += left;\n s.strm.avail_out -= left;\n s.strm.total_out += left;\n s.block_start += left;\n len -= left;\n }\n\n /* Copy uncompressed bytes directly from next_in to next_out, updating\n * the check value.\n */\n if (len) {\n read_buf(s.strm, s.strm.output, s.strm.next_out, len);\n s.strm.next_out += len;\n s.strm.avail_out -= len;\n s.strm.total_out += len;\n }\n } while (last === 0);\n\n /* Update the sliding window with the last s->w_size bytes of the copied\n * data, or append all of the copied data to the existing window if less\n * than s->w_size bytes were copied. Also update the number of bytes to\n * insert in the hash tables, in the event that deflateParams() switches to\n * a non-zero compression level.\n */\n used -= s.strm.avail_in; /* number of input bytes directly copied */\n if (used) {\n /* If any input was used, then no unused input remains in the window,\n * therefore s->block_start == s->strstart.\n */\n if (used >= s.w_size) { /* supplant the previous history */\n s.matches = 2; /* clear hash */\n //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);\n s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);\n s.strstart = s.w_size;\n s.insert = s.strstart;\n }\n else {\n if (s.window_size - s.strstart <= used) {\n /* Slide the window down. */\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);\n s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);\n s.strstart += used;\n s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;\n }\n s.block_start = s.strstart;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* If the last block was written to next_out, then done. */\n if (last) {\n return BS_FINISH_DONE;\n }\n\n /* If flushing and all input has been consumed, then done. */\n if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 &&\n s.strm.avail_in === 0 && s.strstart === s.block_start) {\n return BS_BLOCK_DONE;\n }\n\n /* Fill the window with any remaining input. */\n have = s.window_size - s.strstart;\n if (s.strm.avail_in > have && s.block_start >= s.w_size) {\n /* Slide the window down. */\n s.block_start -= s.w_size;\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n have += s.w_size; /* more space now */\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n if (have > s.strm.avail_in) {\n have = s.strm.avail_in;\n }\n if (have) {\n read_buf(s.strm, s.window, s.strstart, have);\n s.strstart += have;\n s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* There was not enough avail_out to write a complete worthy or flushed\n * stored block to next_out. Write a stored block to pending instead, if we\n * have enough input for a worthy block, or if flushing and there is enough\n * room for the remaining input as a stored block in the pending buffer.\n */\n have = (s.bi_valid + 42) >> 3; /* number of header bytes */\n /* maximum stored block length that will fit in pending: */\n have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have;\n min_block = have > s.w_size ? s.w_size : have;\n left = s.strstart - s.block_start;\n if (left >= min_block ||\n ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 &&\n s.strm.avail_in === 0 && left <= have)) {\n len = left > have ? have : left;\n last = flush === Z_FINISH$3 && s.strm.avail_in === 0 &&\n len === left ? 1 : 0;\n _tr_stored_block(s, s.block_start, len, last);\n s.block_start += len;\n flush_pending(s.strm);\n }\n\n /* We've done all we can with the available input and output. */\n return last ? BS_FINISH_STARTED : BS_NEED_MORE;\n};\n\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.sym_buf = 0; /* buffer for distances and literals/lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.sym_next = 0; /* running index in sym_buf */\n this.sym_end = 0; /* symbol table full when sym_next reaches this */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\n/* =========================================================================\n * Check for a valid deflate stream state. Return 0 if ok, 1 if not.\n */\nconst deflateStateCheck = (strm) => {\n\n if (!strm) {\n return 1;\n }\n const s = strm.state;\n if (!s || s.strm !== strm || (s.status !== INIT_STATE &&\n//#ifdef GZIP\n s.status !== GZIP_STATE &&\n//#endif\n s.status !== EXTRA_STATE &&\n s.status !== NAME_STATE &&\n s.status !== COMMENT_STATE &&\n s.status !== HCRC_STATE &&\n s.status !== BUSY_STATE &&\n s.status !== FINISH_STATE)) {\n return 1;\n }\n return 0;\n};\n\n\nconst deflateResetKeep = (strm) => {\n\n if (deflateStateCheck(strm)) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status =\n//#ifdef GZIP\n s.wrap === 2 ? GZIP_STATE :\n//#endif\n s.wrap ? INIT_STATE : BUSY_STATE;\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = -2;\n _tr_init(s);\n return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK$3) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (deflateStateCheck(strm) || strm.state.wrap !== 2) {\n return Z_STREAM_ERROR$2;\n }\n strm.state.gzhead = head;\n return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR$2;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION$1) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n s.status = INIT_STATE; /* to pass state test in deflateReset() */\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n /* We overlay pending_buf and sym_buf. This works since the average size\n * for length/distance pairs over any compressed block is assured to be 31\n * bits or less.\n *\n * Analysis: The longest fixed codes are a length code of 8 bits plus 5\n * extra bits, for lengths 131 to 257. The longest fixed distance codes are\n * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest\n * possible fixed-codes length/distance pair is then 31 bits total.\n *\n * sym_buf starts one-fourth of the way into pending_buf. So there are\n * three bytes in sym_buf for every four bytes in pending_buf. Each symbol\n * in sym_buf is three bytes -- two for the distance and one for the\n * literal/length. As each symbol is consumed, the pointer to the next\n * sym_buf value to read moves forward three bytes. From that symbol, up to\n * 31 bits are written to pending_buf. The closest the written pending_buf\n * bits gets to the next sym_buf symbol to read is just before the last\n * code is written. At that time, 31*(n-2) bits have been written, just\n * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at\n * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1\n * symbols are written.) The closest the writing gets to what is unread is\n * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and\n * can range from 128 to 32768.\n *\n * Therefore, at a minimum, there are 142 bits of space between what is\n * written and what is read in the overlain buffers, so the symbols cannot\n * be overwritten by the compressed data. That space is actually 139 bits,\n * due to the three-bit fixed-code block header.\n *\n * That covers the case where either Z_FIXED is specified, forcing fixed\n * codes, or when the use of fixed codes is chosen, because that choice\n * results in a smaller compressed block than dynamic codes. That latter\n * condition then assures that the above analysis also covers all dynamic\n * blocks. A dynamic-code block will only be chosen to be emitted if it has\n * fewer bits than a fixed-code block would for the same set of symbols.\n * Therefore its average symbol length is assured to be less than 31. So\n * the compressed data for a dynamic block also cannot overwrite the\n * symbols from which it is being constructed.\n */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->sym_buf = s->pending_buf + s->lit_bufsize;\n s.sym_buf = s.lit_bufsize;\n\n //s->sym_end = (s->lit_bufsize - 1) * 3;\n s.sym_end = (s.lit_bufsize - 1) * 3;\n /* We avoid equality with lit_bufsize*3 because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\n/* ========================================================================= */\nconst deflate$2 = (strm, flush) => {\n\n if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (strm.avail_in !== 0 && !strm.input) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n }\n\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK$3;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH$3) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR$1);\n }\n\n /* Write the header */\n if (s.status === INIT_STATE && s.wrap === 0) {\n s.status = BUSY_STATE;\n }\n if (s.status === INIT_STATE) {\n /* zlib header */\n let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n//#ifdef GZIP\n if (s.status === GZIP_STATE) {\n /* gzip header */\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;\n while (s.pending + left > s.pending_buf_size) {\n let copy = s.pending_buf_size - s.pending;\n // zmemcpy(s.pending_buf + s.pending,\n // s.gzhead.extra + s.gzindex, copy);\n s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);\n s.pending = s.pending_buf_size;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex += copy;\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n left -= copy;\n }\n // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility\n // TypedArray.slice and TypedArray.from don't exist in IE10-IE11\n let gzhead_extra = new Uint8Array(s.gzhead.extra);\n // zmemcpy(s->pending_buf + s->pending,\n // s->gzhead->extra + s->gzindex, left);\n s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);\n s.pending += left;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = NAME_STATE;\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = COMMENT_STATE;\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n }\n s.status = HCRC_STATE;\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n }\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n//#endif\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n let bstate = s.level === 0 ? deflate_stored(s, flush) :\n s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\n s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush);\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK$3;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align(s);\n }\n else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH$1) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK$3;\n }\n }\n }\n\n if (flush !== Z_FINISH$3) { return Z_OK$3; }\n if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n\n const status = strm.state.status;\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR$2;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateGetDictionary = deflateGetDictionary;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_STRATEGY,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY\n }, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1$2.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1$2.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1$2.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$2) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1$2.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$2;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$2) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate$1(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 16209; /* got a data error -- remain here until reset */\nconst TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n// let shoextra; /* extra bits table to use */\n let match; /* use base and extra for symbol >= match */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n match = 20;\n\n } else if (type === LENS$1) {\n base = lbase;\n extra = lext;\n match = 257;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n match = 0;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] + 1 < match) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] >= match) {\n here_op = extra[work[sym] - match];\n here_val = base[work[sym] - match];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 16180; /* i: waiting for magic header */\nconst FLAGS = 16181; /* i: waiting for method and flags (gzip) */\nconst TIME = 16182; /* i: waiting for modification time (gzip) */\nconst OS = 16183; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 16184; /* i: waiting for extra length (gzip) */\nconst EXTRA = 16185; /* i: waiting for extra bytes (gzip) */\nconst NAME = 16186; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 16187; /* i: waiting for end of comment (gzip) */\nconst HCRC = 16188; /* i: waiting for header crc (gzip) */\nconst DICTID = 16189; /* i: waiting for dictionary check value */\nconst DICT = 16190; /* waiting for inflateSetDictionary() call */\nconst TYPE = 16191; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 16193; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 16194; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16195; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 16196; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 16197; /* i: waiting for code length code lengths */\nconst CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 16199; /* i: same as LEN below, but only first time in */\nconst LEN = 16200; /* i: waiting for length/lit/eob code */\nconst LENEXT = 16201; /* i: waiting for length extra bits */\nconst DIST = 16202; /* i: waiting for distance code */\nconst DISTEXT = 16203; /* i: waiting for distance extra bits */\nconst MATCH = 16204; /* o: waiting for output space to copy string */\nconst LIT = 16205; /* o: waiting for output space to write literal */\nconst CHECK = 16206; /* i: waiting for 32-bit check value */\nconst LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 16208; /* finished check, done -- remain here until reset */\nconst BAD = 16209; /* got a data error -- remain here until reset */\nconst MEM = 16210; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 16211; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip,\n bit 2 true to validate check value */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib), or\n -1 if raw or no header yet */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateStateCheck = (strm) => {\n\n if (!strm) {\n return 1;\n }\n const state = strm.state;\n if (!state || state.strm !== strm ||\n state.mode < HEAD || state.mode > SYNC) {\n return 1;\n }\n return 0;\n};\n\n\nconst inflateResetKeep = (strm) => {\n\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.flags = -1;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 5;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.strm = strm;\n state.window = null/*Z_NULL*/;\n state.mode = HEAD; /* to pass state test in inflateReset2() */\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (inflateStateCheck(strm) || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n if (state.wbits === 0) {\n state.wbits = 15;\n }\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n if (len > 15 || len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n state.flags = 0; /* indicate zlib header */\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 4) && hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if ((state.wrap & 4) && _out) {\n strm.adler = state.check =\n /*UPDATE_CHECK(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if ((state.wrap & 4) && _out) {\n strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCodesUsed = inflateCodesUsed;\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\nmodule.exports.inflateValidate = inflateValidate;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$2.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$2.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$2.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1$2.inflateReset(strm);\n status = inflate_1$2.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$2.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate$1(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip };\n","/**\n * This is a data view which is split across multiple pieces, and maintains\n * a running size, with nullable chunks.\n */\nexport default class SplitDataView {\n buffers = [];\n views = [];\n offsets = [];\n lengths = [];\n size = 0;\n byteLength = 0;\n\n /** The default size is 256k */\n defaultSize = 256 * 1024;\n\n /**\n * The set of byte arrays being consumed. This allows adding byte\n * arrays ready to be consumed to the list, and have them available\n * once the current consume finishes.\n */\n consumed = [];\n\n /** The last byte index not already consumed */\n consumeOffset = -1;\n\n constructor(options = { defaultSize: 256 * 1024 }) {\n this.defaultSize = options.defaultSize || this.defaultSize;\n }\n\n /**\n * Consumes the already written or read data, up to the given offset.\n */\n consume(offset) {\n this.consumeOffset = Math.max(offset, this.consumeOffset);\n if (!this.consumed || !this.offsets.length) {\n return;\n }\n while (true) {\n const nextOffset = this.offsets[this.consumed.length];\n const nextLength = this.lengths[this.consumed.length];\n if (nextOffset === undefined || nextLength === undefined) {\n return;\n }\n const currentEnd = nextOffset + nextLength;\n if (this.consumeOffset < currentEnd) {\n // Haven't finished consuming all the data in the current block\n return;\n }\n // Consume the entire buffer for now\n this.consumed.push(\n this.consumeListener?.(\n this.buffers,\n 0,\n Math.min(\n this.buffers.length,\n nextOffset - this.consumeOffset\n )\n )\n );\n this.buffers[this.consumed.length - 1] = null;\n this.views[this.consumed.length - 1] = null;\n // Continue loop to check if there are more buffers to consume\n }\n }\n\n /**\n * Returns true if there is data for\n */\n hasData(start, end) {\n if (start > this.size || end > this.size) {\n return false;\n }\n for (let i = 0; i < this.offsets.length; i++) {\n const startOffset = this.offsets[i];\n const nextOffset = startOffset + this.lengths[i];\n if (end <= nextOffset) {\n return !!this.buffers[i];\n }\n if (start <= nextOffset && end > startOffset) {\n // Enters the if conditions if start...end overlaps\n // startOffset...endOffset\n // 25...50 overlaps 25...26, 26..27, 49...50\n // but not 24..25 or 50...51\n if (!this.buffers[i + 1]) {\n return false;\n }\n }\n }\n return true;\n }\n\n checkSize(end) {\n while (end > this.byteLength) {\n const buffer = new ArrayBuffer(this.defaultSize);\n this.buffers.push(buffer);\n this.views.push(new DataView(buffer));\n this.offsets.push(this.byteLength);\n this.lengths.push(buffer.byteLength);\n\n this.byteLength += buffer.byteLength;\n }\n }\n\n /**\n * Adds the buffer to the end of the current buffers list,\n * updating the size etc.\n *\n * @param {*} buffer\n * @param {*} options.start for the start of the new buffer to use\n * @param {*} options.end for the end of the buffer to use\n * @param {*} options.transfer to transfer the buffer to be owned\n */\n addBuffer(buffer, options = null) {\n buffer = buffer.buffer || buffer;\n const start = options?.start || 0;\n const end = options?.end || buffer.byteLength;\n const transfer =\n options?.transfer ?? (start === 0 && end === buffer.byteLength);\n if (start === end) {\n return;\n }\n const addBuffer = transfer ? buffer : buffer.slice(start, end);\n const lastOffset = this.offsets.length\n ? this.offsets[this.offsets.length - 1]\n : 0;\n const lastLength = this.lengths.length\n ? this.lengths[this.lengths.length - 1]\n : 0;\n this.buffers.push(addBuffer);\n this.views.push(new DataView(addBuffer));\n this.offsets.push(lastOffset + lastLength);\n this.lengths.push(addBuffer.byteLength);\n this.size += addBuffer.byteLength;\n this.byteLength += addBuffer.byteLength;\n }\n\n /** Copies one view contents into this one as a mirror */\n from(view, _options) {\n this.size = view.size;\n this.byteLength = view.byteLength;\n this.offsets.push(...view.offsets);\n this.lengths.push(...view.lengths);\n this.buffers.push(...view.buffers);\n this.views.push(...view.views);\n // TODO - use the options to skip copying irrelevant data\n }\n\n slice(start = 0, end = this.size) {\n if (start === end) {\n return new Uint8Array(0).buffer;\n }\n let index = this.findStart(start);\n if (index === undefined) {\n throw new Error(\n `Start ${start} out of range of 0...${this.byteLength}`\n );\n }\n let buffer = this.buffers[index];\n if (!buffer) {\n console.error(\"Buffer should be defined here\");\n return;\n }\n let offset = this.offsets[index];\n let length = buffer.byteLength;\n if (end <= offset + length) {\n return buffer.slice(start - offset, end - offset);\n }\n const createBuffer = new Uint8Array(end - start);\n let offsetStart = 0;\n while (start + offsetStart < end && index < this.buffers.length) {\n buffer = this.buffers[index];\n length = buffer.byteLength;\n offset = this.offsets[index];\n\n const bufStart = start + offsetStart - offset;\n const addLength = Math.min(\n end - start - offsetStart,\n length - bufStart\n );\n createBuffer.set(\n new Uint8Array(buffer, bufStart, addLength),\n offsetStart\n );\n offsetStart += addLength;\n index++;\n }\n return createBuffer.buffer;\n }\n\n findStart(start = 0) {\n for (let index = 0; index < this.buffers.length; index++) {\n if (\n start >= this.offsets[index] &&\n start < this.offsets[index] + this.lengths[index]\n ) {\n return index;\n }\n }\n }\n\n /**\n * Returns a buffer view containing the given start position.\n * Note this will return undefined if start is after the current\n * data set.\n */\n findView(start, length = 1) {\n const index = this.findStart(start);\n const viewOffset = this.offsets[index];\n const viewLength = this.lengths[index];\n if (viewOffset === undefined) {\n throw new Error(\n `Finding view is past end of input for start=${start} where offsets=${this.offsets} and lengths are ${this.lengths}`\n );\n }\n if (start + length - viewOffset <= viewLength) {\n return { view: this.views[index], viewOffset, index };\n }\n const newBuffer = this.slice(start, start + length);\n return {\n view: new DataView(newBuffer),\n viewOffset: start,\n writeCommit: true\n };\n }\n\n writeCommit(view, start) {\n this.writeBuffer(view.buffer, start);\n }\n\n writeBuffer(data, start) {\n let index = this.findStart(start);\n let offset = 0;\n while (offset < data.byteLength) {\n const buffer = this.buffers[index];\n if (!buffer) {\n throw new Error(`Not enough space to write ${data.byteLength}`);\n }\n const bufferOffset = this.offsets[index];\n const startWrite = start + offset - bufferOffset;\n const writeLen = Math.min(\n buffer.byteLength - startWrite,\n data.byteLength - offset\n );\n const byteBuffer = new Uint8Array(buffer, startWrite, writeLen);\n const setData = new Uint8Array(\n data.buffer || data,\n offset,\n writeLen\n );\n byteBuffer.set(setData);\n offset += writeLen;\n index++;\n }\n }\n\n getUint8(offset) {\n const { view, viewOffset } = this.findView(offset, 1);\n return view.getUint8(offset - viewOffset);\n }\n\n getUint16(offset, isLittleEndian) {\n const { view, viewOffset } = this.findView(offset, 2);\n return view.getUint16(offset - viewOffset, isLittleEndian);\n }\n\n getUint32(offset, isLittleEndian) {\n const { view, viewOffset } = this.findView(offset, 4);\n return view.getUint32(offset - viewOffset, isLittleEndian);\n }\n\n getBigUint64(offset, isLittleEndian) {\n const { view, viewOffset } = this.findView(offset, 8);\n return view.getBigUint64(offset - viewOffset, isLittleEndian);\n }\n\n getFloat32(offset, isLittleEndian) {\n const { view, viewOffset } = this.findView(offset, 4);\n return view.getFloat32(offset - viewOffset, isLittleEndian);\n }\n\n getFloat64(offset, isLittleEndian) {\n const { view, viewOffset } = this.findView(offset, 8);\n return view.getFloat64(offset - viewOffset, isLittleEndian);\n }\n\n getInt8(offset) {\n const { view, viewOffset } = this.findView(offset, 1);\n return view.getInt8(offset - viewOffset);\n }\n\n getInt16(offset, isLittleEndian) {\n const { view, viewOffset } = this.findView(offset, 2);\n return view.getInt16(offset - viewOffset, isLittleEndian);\n }\n\n getInt32(offset, isLittleEndian) {\n const { view, viewOffset } = this.findView(offset, 4);\n return view.getInt32(offset - viewOffset, isLittleEndian);\n }\n\n setUint8(offset, value) {\n const { view, viewOffset } = this.findView(offset, 1);\n view.setUint8(offset - viewOffset, value);\n // Commit is unneeded since 1 byte will always be available\n }\n\n setUint16(offset, value, isLittleEndian) {\n const { view, viewOffset, writeCommit } = this.findView(offset, 2);\n view.setUint16(offset - viewOffset, value, isLittleEndian);\n if (writeCommit) {\n this.writeCommit(view, offset);\n }\n }\n\n setUint32(offset, value, isLittleEndian) {\n const { view, viewOffset, writeCommit } = this.findView(offset, 4);\n view.setUint32(offset - viewOffset, value, isLittleEndian);\n if (writeCommit) {\n this.writeCommit(view, offset);\n }\n }\n\n setBigUint64(offset, value, isLittleEndian) {\n const { view, viewOffset, writeCommit } = this.findView(offset, 8);\n view.setBigUint64(offset - viewOffset, value, isLittleEndian);\n if (writeCommit) {\n this.writeCommit(view, offset);\n }\n }\n\n setFloat32(offset, value, isLittleEndian) {\n const { view, viewOffset, writeCommit } = this.findView(offset, 4);\n view.setFloat32(offset - viewOffset, value, isLittleEndian);\n if (writeCommit) {\n this.writeCommit(view, offset);\n }\n }\n\n setFloat64(offset, value, isLittleEndian) {\n const { view, viewOffset, writeCommit } = this.findView(offset, 8);\n view.setFloat64(offset - viewOffset, value, isLittleEndian);\n if (writeCommit) {\n this.writeCommit(view, offset);\n }\n }\n\n setInt8(offset, value) {\n const { view, viewOffset } = this.findView(offset, 1);\n view.setInt8(offset - viewOffset, value);\n // Commit is unneeded since 1 byte will always be available\n }\n\n setInt16(offset, value, isLittleEndian) {\n const { view, viewOffset, writeCommit } = this.findView(offset, 2);\n view.setInt16(offset - viewOffset, value, isLittleEndian);\n if (writeCommit) {\n this.writeCommit(view, offset);\n }\n }\n\n setInt32(offset, value, isLittleEndian) {\n const { view, viewOffset, writeCommit } = this.findView(offset, 4);\n view.setInt32(offset - viewOffset, value, isLittleEndian);\n if (writeCommit) {\n this.writeCommit(view, offset);\n }\n }\n\n /**\n * Reports on the amount of memory held by the buffers in the view.\n * @param {number} consumeOffset - The current consume offset (typically from BufferStream.offset)\n * @returns {Object} An object containing:\n * - bufferCount: Number of buffers still held (not null)\n * - totalSize: Total size of all buffers in bytes\n * - consumeOffset: The current consume offset\n * - buffersBeforeOffset: Number of buffers before the consume offset\n * - bytesBeforeOffset: Total bytes before the consume offset\n */\n getBufferMemoryInfo(consumeOffset) {\n let bufferCount = 0;\n let totalSize = 0;\n let buffersBeforeOffset = 0;\n let bytesBeforeOffset = 0;\n const currentConsumeOffset = consumeOffset ?? this.consumeOffset;\n\n for (let i = 0; i < this.buffers.length; i++) {\n const buffer = this.buffers[i];\n if (buffer !== null && buffer !== undefined) {\n bufferCount++;\n totalSize += buffer.byteLength;\n\n // Count buffers and bytes that are before the consume offset\n const bufferStart = this.offsets[i];\n const bufferEnd = bufferStart + this.lengths[i];\n if (bufferEnd <= currentConsumeOffset) {\n // Buffer is completely before the offset\n buffersBeforeOffset++;\n bytesBeforeOffset += buffer.byteLength;\n } else if (bufferStart < currentConsumeOffset) {\n // Buffer spans the offset, count the portion before it\n bytesBeforeOffset += currentConsumeOffset - bufferStart;\n }\n }\n }\n\n return {\n bufferCount,\n totalSize,\n consumeOffset: currentConsumeOffset,\n buffersBeforeOffset,\n bytesBeforeOffset\n };\n }\n}\n","/**\n * Convert a value to a float\n */\nexport function toFloat(val) {\n if (Array.isArray(val)) {\n return val.map(toFloat);\n }\n if (typeof val == \"string\") {\n return parseFloat(val);\n }\n return val;\n}\n","/**\n * Convert a string or value to an integer\n * Also converts an array to an array of int\n */\nexport function toInt(val) {\n if (Array.isArray(val)) {\n return val.map(toInt);\n }\n\n if (isNaN(val)) {\n throw new Error(\"Not a number: \" + val);\n } else if (typeof val == \"string\") {\n return parseInt(val);\n }\n return val;\n}\n","import pako from \"pako\";\nimport SplitDataView from \"./SplitDataView\";\nimport { toFloat } from \"./utilities/toFloat\";\nimport { toInt } from \"./utilities/toInt\";\n\nexport class BufferStream {\n offset = 0;\n startOffset = 0;\n isLittleEndian = false;\n size = 0;\n view = new SplitDataView();\n /** The available listeners are those waiting for a query response */\n availableListeners = [];\n\n /** Indicates if this buffer stream is complete/has finished being created */\n isComplete = false;\n\n /** A flag to set to indicate to clear buffers as they get consumed */\n clearBuffers = false;\n\n encoder = new TextEncoder(\"utf-8\");\n\n constructor(options = null) {\n this.isLittleEndian = options?.littleEndian || this.isLittleEndian;\n this.view.defaultSize = options?.defaultSize ?? this.view.defaultSize;\n this.clearBuffers = options.clearBuffers || false;\n }\n\n /**\n * Mark this stream as having finished being written or read from\n */\n setComplete(value = true) {\n this.isComplete = value;\n this.notifyAvailableListeners();\n }\n\n /**\n * Indicates if the value length is currently available in the already\n * read/defined portion of the stream.\n *\n * By default this will test if the buffer is complete as well,\n * but this can be changed with orComplete=false.\n */\n isAvailable(length, orComplete = true) {\n return (\n this.offset + length <= this.endOffset ||\n (orComplete && this.isComplete)\n );\n }\n\n /**\n * Ensures that the specified number of bytes are available OR that it is\n * EOF. By default waits for at least 1k to be available.\n */\n ensureAvailable(bytes = 1024) {\n if (!this.isAvailable(bytes)) {\n return new Promise(resolve => {\n const recheckAvailable = () => {\n if (this.isAvailable(bytes)) {\n resolve(true);\n return;\n }\n this.availableListeners.push(recheckAvailable);\n };\n recheckAvailable();\n });\n }\n return true;\n }\n\n setEndian(isLittle) {\n this.isLittleEndian = isLittle;\n }\n\n slice(start = this.startOffset, end = this.endOffset) {\n return this.view.slice(start, end);\n }\n\n /**\n * @deprecated Gets the entire buffer at once. Suggest using the\n * view instead, and writing an iterator over the parts to finish\n * writing it.\n */\n getBuffer(start = 0, end = this.size) {\n if (this.noCopy) {\n return new Uint8Array(this.slice(start, end));\n }\n\n return this.slice(start, end);\n }\n\n get buffer() {\n // console.warn(\"Deprecated buffer get\");\n return this.getBuffer();\n }\n\n get available() {\n return this.endOffset - this.offset;\n }\n\n writeUint8(value) {\n this.checkSize(1);\n this.view.setUint8(this.offset, toInt(value));\n return this.increment(1);\n }\n\n writeUint8Repeat(value, count) {\n const v = toInt(value);\n this.checkSize(count);\n for (let i = 0; i < count; i++) {\n this.view.setUint8(this.offset + i, v);\n }\n return this.increment(count);\n }\n\n writeInt8(value) {\n this.checkSize(1);\n this.view.setInt8(this.offset, toInt(value));\n return this.increment(1);\n }\n\n writeUint16(value) {\n this.checkSize(2);\n this.view.setUint16(this.offset, toInt(value), this.isLittleEndian);\n return this.increment(2);\n }\n\n writeTwoUint16s(value) {\n this.checkSize(4);\n const first = value >> 16;\n const second = value & 0xffff;\n this.view.setUint16(this.offset, toInt(first), this.isLittleEndian);\n this.view.setUint16(\n this.offset + 2,\n toInt(second),\n this.isLittleEndian\n );\n return this.increment(4);\n }\n\n writeInt16(value) {\n this.checkSize(2);\n this.view.setInt16(this.offset, toInt(value), this.isLittleEndian);\n return this.increment(2);\n }\n\n writeUint32(value) {\n this.checkSize(4);\n this.view.setUint32(this.offset, toInt(value), this.isLittleEndian);\n return this.increment(4);\n }\n\n writeInt32(value) {\n this.checkSize(4);\n this.view.setInt32(this.offset, toInt(value), this.isLittleEndian);\n return this.increment(4);\n }\n\n writeBigUint64(value) {\n this.checkSize(8);\n this.view.setBigUint64(this.offset, value, this.isLittleEndian);\n return this.increment(8);\n }\n\n writeFloat(value) {\n this.checkSize(4);\n this.view.setFloat32(this.offset, toFloat(value), this.isLittleEndian);\n return this.increment(4);\n }\n\n writeDouble(value) {\n this.checkSize(8);\n this.view.setFloat64(this.offset, toFloat(value), this.isLittleEndian);\n return this.increment(8);\n }\n\n writeUTF8String(value) {\n const encodedString = this.encoder.encode(value);\n this.checkSize(encodedString.byteLength);\n this.view.writeBuffer(encodedString, this.offset);\n return this.increment(encodedString.byteLength);\n }\n\n writeAsciiString(value) {\n value = value || \"\";\n var len = value.length;\n this.checkSize(len);\n var startOffset = this.offset;\n for (let i = 0; i < len; i++) {\n const charCode = value.charCodeAt(i);\n this.view.setUint8(startOffset + i, charCode);\n }\n return this.increment(len);\n }\n\n readBigUint64() {\n var val = this.view.getBigUint64(this.offset, this.isLittleEndian);\n this.increment(8);\n return val;\n }\n\n readUint32() {\n var val = this.view.getUint32(this.offset, this.isLittleEndian);\n this.increment(4);\n return val;\n }\n\n readUint16() {\n var val = this.view.getUint16(this.offset, this.isLittleEndian);\n this.increment(2);\n return val;\n }\n\n readUint8() {\n var val = this.view.getUint8(this.offset);\n this.increment(1);\n return val;\n }\n\n peekUint8(offset) {\n return this.view.getUint8(this.offset + offset);\n }\n\n readUint8Array(length) {\n if (this.offset + length > this.endOffset) {\n throw new Error(\n `Stream has insufficient data: requested ${length} bytes at offset ${\n this.offset\n }, but only ${\n this.endOffset - this.offset\n } bytes available (endOffset ${this.endOffset})`\n );\n }\n const arr = new Uint8Array(\n this.view.slice(this.offset, this.offset + length)\n );\n this.increment(length);\n return arr;\n }\n\n readArrayBuffer(length) {\n return this.readUint8Array(length).buffer;\n }\n\n readUint16Array(length) {\n var sixlen = length / 2,\n arr = new Uint16Array(sixlen),\n i = 0;\n while (i++ < sixlen) {\n arr[i] = this.view.getUint16(this.offset, this.isLittleEndian);\n this.offset += 2;\n }\n return arr;\n }\n\n readInt8() {\n var val = this.view.getInt8(this.offset, this.isLittleEndian);\n this.increment(1);\n return val;\n }\n\n readInt16() {\n var val = this.view.getInt16(this.offset, this.isLittleEndian);\n this.increment(2);\n return val;\n }\n\n readInt32() {\n var val = this.view.getInt32(this.offset, this.isLittleEndian);\n this.increment(4);\n return val;\n }\n\n readFloat() {\n var val = this.view.getFloat32(this.offset, this.isLittleEndian);\n this.increment(4);\n return val;\n }\n\n readDouble() {\n var val = this.view.getFloat64(this.offset, this.isLittleEndian);\n this.increment(8);\n return val;\n }\n\n readAsciiString(length) {\n var result = \"\";\n var start = this.offset;\n var end = this.offset + length;\n if (end >= this.view.byteLength) {\n end = this.view.byteLength;\n }\n for (let i = start; i < end; ++i) {\n result += String.fromCharCode(this.view.getUint8(i));\n }\n this.increment(end - start);\n return result;\n }\n\n readVR() {\n var vr =\n String.fromCharCode(this.view.getUint8(this.offset)) +\n String.fromCharCode(this.view.getUint8(this.offset + 1));\n this.increment(2);\n return vr;\n }\n\n readEncodedString(length) {\n if (this.offset + length >= this.view.byteLength) {\n length = this.view.byteLength - this.offset;\n }\n const view = new DataView(\n this.slice(this.offset, this.offset + length)\n );\n const result = this.decoder.decode(view);\n this.increment(length);\n return result;\n }\n\n readHex(length) {\n var hexString = \"\";\n for (var i = 0; i < length; i++) {\n hexString += this.readUint8().toString(16);\n }\n return hexString;\n }\n\n checkSize(step) {\n this.view.checkSize(this.offset + step);\n }\n\n /**\n * Concatenates the stream, starting from the startOffset (to allow concat\n * on an existing output from the beginning)\n */\n concat(stream) {\n this.view.checkSize(this.size + stream.size - stream.startOffset);\n this.view.writeBuffer(\n new Uint8Array(stream.slice(stream.startOffset, stream.size)),\n this.offset\n );\n this.offset += stream.size;\n this.size = this.offset;\n this.endOffset = this.size;\n return this.view.availableSize;\n }\n\n increment(step) {\n this.offset += step;\n if (this.offset > this.size) {\n this.size = this.offset;\n }\n return step;\n }\n\n /**\n * Reads from an async stream delivering to addBuffer.\n */\n async fromAsyncStream(stream) {\n for await (const chunk of stream) {\n const ab = chunk.buffer.slice(\n chunk.byteOffset,\n chunk.byteOffset + chunk.byteLength\n );\n this.addBuffer(ab);\n }\n this.setComplete();\n }\n\n /**\n * Adds the buffer to the end of the current buffers list,\n * updating the size etc.\n *\n * @param {*} buffer\n * @param {*} options.start for the start of the new buffer to use\n * @param {*} options.end for the end of the buffer to use\n * @param {*} options.transfer to transfer the buffer to be owned\n * Transfer will default true if the entire buffer is being added.\n * It should be set explicitly to false to NOT transfer.\n */\n addBuffer(buffer, options = null) {\n if (!buffer) {\n // Silently ignore null buffers.\n return;\n }\n this.view.addBuffer(buffer, options);\n this.size = this.view.size;\n this.endOffset = this.size;\n this.notifyAvailableListeners();\n return this.size;\n }\n\n notifyAvailableListeners() {\n const existingListeners = [...this.availableListeners];\n this.availableListeners.splice(0, this.availableListeners.length);\n existingListeners.forEach(listener => listener());\n }\n\n /**\n * Consumes the data up to the given offset.\n * This will clear the references to the data buffers, and will\n * cause resets etc to fail.\n * The default offset is the current position, so everything already read.\n */\n consume(offset = this.offset) {\n if (!this.clearBuffers) {\n return;\n }\n this.view.consume(offset);\n }\n\n /**\n * Returns true if the stream has data in the given range.\n */\n hasData(start, end = start + 1) {\n return this.view.hasData(start, end);\n }\n\n more(length) {\n if (this.offset + length > this.endOffset) {\n throw new Error(\"Request more than currently allocated buffer\");\n }\n\n // Optimize the more implementation to choose between a slice and\n // a sub-string reference to the original set of views.\n // const newBuf = new ReadBufferStream(this.buffer, null, {\n // start: this.offset,\n // stop: this.offset + length\n // });\n const newBuf = new ReadBufferStream(\n this.slice(this.offset, this.offset + length)\n );\n this.increment(length);\n newBuf.setComplete();\n\n return newBuf;\n }\n\n reset() {\n this.offset = 0;\n return this;\n }\n\n end() {\n return this.isComplete && this.offset >= this.end;\n }\n\n toEnd() {\n this.offset = this.view.byteLength;\n }\n\n /**\n * Reports on the amount of memory held by the buffers in the view.\n * @returns {Object} An object containing:\n * - bufferCount: Number of buffers still held (not null)\n * - totalSize: Total size of all buffers in bytes\n * - consumeOffset: The current consume offset\n * - buffersBeforeOffset: Number of buffers before the consume offset\n */\n getBufferMemoryInfo() {\n return this.view.getBufferMemoryInfo(this.offset);\n }\n}\n\nexport class ReadBufferStream extends BufferStream {\n constructor(\n buffer,\n littleEndian,\n options = {\n start: null,\n stop: null,\n noCopy: false\n }\n ) {\n super({ ...options, littleEndian });\n this.noCopy = options.noCopy;\n this.decoder = new TextDecoder(\"latin1\");\n\n if (buffer instanceof BufferStream) {\n this.view.from(buffer.view, options);\n this.isComplete = true;\n } else if (buffer) {\n this.view.addBuffer(buffer);\n this.isComplete = true;\n }\n this.offset = options.start ?? buffer?.offset ?? 0;\n this.size = options.stop || buffer?.size || buffer?.byteLength || 0;\n\n this.startOffset = this.offset;\n this.endOffset = this.size;\n }\n\n setDecoder(decoder) {\n this.decoder = decoder;\n }\n\n reset() {\n this.offset = this.startOffset;\n return this;\n }\n\n end() {\n return this.isComplete && this.offset >= this.endOffset;\n }\n\n toEnd() {\n this.offset = this.endOffset;\n }\n\n writeUint8(value) {\n throw new Error(value, \"writeUint8 not implemented\");\n }\n\n writeUint8Repeat(value, count) {\n throw new Error(\n `writeUint8Repeat not implemented (value: ${value}, count: ${count})`\n );\n }\n\n writeInt8(value) {\n throw new Error(value, \"writeInt8 not implemented\");\n }\n\n writeUint16(value) {\n throw new Error(value, \"writeUint16 not implemented\");\n }\n\n writeTwoUint16s(value) {\n throw new Error(value, \"writeTwoUint16s not implemented\");\n }\n\n writeInt16(value) {\n throw new Error(value, \"writeInt16 not implemented\");\n }\n\n writeUint32(value) {\n throw new Error(value, \"writeUint32 not implemented\");\n }\n\n writeInt32(value) {\n throw new Error(value, \"writeInt32 not implemented\");\n }\n\n writeFloat(value) {\n throw new Error(value, \"writeFloat not implemented\");\n }\n\n writeDouble(value) {\n throw new Error(value, \"writeDouble not implemented\");\n }\n\n writeAsciiString(value) {\n throw new Error(value, \"writeAsciiString not implemented\");\n }\n\n writeUTF8String(value) {\n throw new Error(value, \"writeUTF8String not implemented\");\n }\n\n checkSize(step) {\n throw new Error(step, \"checkSize not implemented\");\n }\n\n concat(stream) {\n throw new Error(stream, \"concat not implemented\");\n }\n}\n\nexport class DeflatedReadBufferStream extends ReadBufferStream {\n constructor(stream, options) {\n const inflatedBuffer = pako.inflateRaw(\n stream.getBuffer(stream.offset, stream.size)\n );\n super(inflatedBuffer.buffer, stream.littleEndian, options);\n }\n}\n\nexport class WriteBufferStream extends BufferStream {\n constructor(defaultSize, littleEndian) {\n super({ defaultSize, littleEndian });\n this.size = 0;\n }\n}\n","// TransferSyntaxUIDs\nexport const IMPLICIT_LITTLE_ENDIAN = \"1.2.840.10008.1.2\";\nexport const EXPLICIT_LITTLE_ENDIAN = \"1.2.840.10008.1.2.1\";\nexport const DEFLATED_EXPLICIT_LITTLE_ENDIAN = \"1.2.840.10008.1.2.1.99\";\nexport const EXPLICIT_BIG_ENDIAN = \"1.2.840.10008.1.2.2\";\n\n/**\n * The raw hex value is the maximum 32 bit unsigned integer,\n * but this is a potential length value, so suggest using the\n * canonical UNDEFINED_LENGTH_FIX value of -1 instead\n */\nexport const UNDEFINED_LENGTH = 0xffffffff;\n/**\n * Use a -1 value for the undefined length being fixed as this is consistent\n * with other usage and can't be confused with a real length.\n */\nexport const UNDEFINED_LENGTH_FIX = -1;\nexport const ITEM_DELIMITATION_LENGTH = 0x00000000;\n\n// Delimitation Value\nexport const SEQUENCE_DELIMITATION_VALUE = 0x00000000;\n\n// Value multiplicity and padding\nexport const VM_DELIMITER = 0x5c;\nexport const PADDING_NULL = 0x00;\nexport const PADDING_SPACE = 0x20;\n\n// PersonName delimeters\nexport const PN_COMPONENT_DELIMITER = 0x3d;\n\nexport const SEQUENCE_ITEM_TAG = 0xfffee000;\nexport const SEQUENCE_DELIMITER_TAG = 0xfffee0dd;\n\n// Nearly all transfer syntaxes are encapsulated, so record those which are\n// unencapsulated as the exceptions.\nexport const unencapsulatedTransferSyntaxes = {\n [IMPLICIT_LITTLE_ENDIAN]: true,\n [EXPLICIT_BIG_ENDIAN]: true,\n [DEFLATED_EXPLICIT_LITTLE_ENDIAN]: true,\n [EXPLICIT_LITTLE_ENDIAN]: true\n};\n\n/**\n * Video transfer syntax UIDs (MPEG2, H.264, H.265)\n * These transfer syntaxes treat the entire pixel data stream as a single frame\n * regardless of the number of fragments.\n */\nexport const videoTransferSyntaxUIDs = new Set([\n \"1.2.840.10008.1.2.4.100\", // MPEG2 Main Profile @ Main Level\n \"1.2.840.10008.1.2.4.100.1\", // MPEG2 Main Profile @ Main Level (retired)\n \"1.2.840.10008.1.2.4.101\", // MPEG2 Main Profile @ High Level\n \"1.2.840.10008.1.2.4.101.1\", // MPEG2 Main Profile @ High Level (retired)\n \"1.2.840.10008.1.2.4.102\", // MPEG-4 AVC/H.264 High Profile / Level 4.1\n \"1.2.840.10008.1.2.4.102.1\", // MPEG-4 AVC/H.264 High Profile / Level 4.1 (retired)\n \"1.2.840.10008.1.2.4.103\", // MPEG-4 AVC/H.264 BD-compatible High Profile / Level 4.1\n \"1.2.840.10008.1.2.4.103.1\", // MPEG-4 AVC/H.264 BD-compatible High Profile / Level 4.1 (retired)\n \"1.2.840.10008.1.2.4.104\", // MPEG-4 AVC/H.264 High Profile / Level 4.2 For 2D Video\n \"1.2.840.10008.1.2.4.104.1\", // MPEG-4 AVC/H.264 High Profile / Level 4.2 For 2D Video (retired)\n \"1.2.840.10008.1.2.4.105\", // MPEG-4 AVC/H.264 High Profile / Level 4.2 For 3D Video\n \"1.2.840.10008.1.2.4.105.1\", // MPEG-4 AVC/H.264 High Profile / Level 4.2 For 3D Video (retired)\n \"1.2.840.10008.1.2.4.106\", // MPEG-4 AVC/H.264 Stereo High Profile / Level 4.2\n \"1.2.840.10008.1.2.4.106.1\", // MPEG-4 AVC/H.264 Stereo High Profile / Level 4.2 (retired)\n \"1.2.840.10008.1.2.4.107\", // HEVC/H.265 Main Profile / Level 5.1\n \"1.2.840.10008.1.2.4.108\" // HEVC/H.265 Main 10 Profile / Level 5.1\n]);\n\n/**\n * Checks if a transfer syntax UID is a video transfer syntax\n * @param {string} uid - Transfer syntax UID to check\n * @returns {boolean} - True if the UID is a video transfer syntax\n */\nexport function isVideoTransferSyntax(uid) {\n return uid && videoTransferSyntaxUIDs.has(uid);\n}\n\n/**\n * This is an enumeration of some HEX values for the tag strings, used to replace\n * constants in a few places.\n */\nexport const TagHex = {\n Item: \"FFFEE000\",\n ItemDelimitationEnd: \"FFFEE00D\",\n SequenceDelimitationEnd: \"FFFEE0DD\",\n PixelData: \"7FE00010\",\n FileMetaInformationGroupLength: \"00020000\",\n TransferSyntaxUID: \"00020010\",\n Rows: \"00280010\",\n Columns: \"00280011\",\n SamplesPerPixel: \"00280002\",\n BitsAllocated: \"00280100\",\n NumberOfFrames: \"00280008\",\n SpecificCharacterSet: \"00080005\",\n PixelRepresentation: \"00280103\",\n DataSetTrailingPadding: \"FFFCFFFC\",\n StudyInstanceUID: \"0020000D\",\n SeriesInstanceUID: \"0020000E\",\n SOPInstanceUID: \"00080018\",\n TimezoneOffsetFromUTC: \"00080201\",\n AvailableTransferSyntaxUID: \"00083002\",\n MediaStorageSOPInstanceUID: \"00020003\"\n};\n\nexport const encodingMapping = {\n \"\": \"iso-8859-1\",\n \"iso-ir-6\": \"iso-8859-1\",\n \"iso-ir-13\": \"shift-jis\",\n \"iso-ir-100\": \"latin1\",\n \"iso-ir-101\": \"iso-8859-2\",\n \"iso-ir-109\": \"iso-8859-3\",\n \"iso-ir-110\": \"iso-8859-4\",\n \"iso-ir-126\": \"iso-ir-126\",\n \"iso-ir-127\": \"iso-ir-127\",\n \"iso-ir-138\": \"iso-ir-138\",\n \"iso-ir-144\": \"iso-ir-144\",\n \"iso-ir-148\": \"iso-ir-148\",\n \"iso-ir-166\": \"tis-620\",\n \"iso-2022-ir-6\": \"iso-8859-1\",\n \"iso-2022-ir-13\": \"shift-jis\",\n \"iso-2022-ir-87\": \"iso-2022-jp\",\n \"iso-2022-ir-100\": \"latin1\",\n \"iso-2022-ir-101\": \"iso-8859-2\",\n \"iso-2022-ir-109\": \"iso-8859-3\",\n \"iso-2022-ir-110\": \"iso-8859-4\",\n \"iso-2022-ir-126\": \"iso-ir-126\",\n \"iso-2022-ir-127\": \"iso-ir-127\",\n \"iso-2022-ir-138\": \"iso-ir-138\",\n \"iso-2022-ir-144\": \"iso-ir-144\",\n \"iso-2022-ir-148\": \"iso-ir-148\",\n \"iso-2022-ir-149\": \"euc-kr\",\n \"iso-2022-ir-159\": \"iso-2022-jp\",\n \"iso-2022-ir-166\": \"tis-620\",\n \"iso-2022-ir-58\": \"iso-ir-58\",\n \"iso-ir-192\": \"utf-8\",\n gb18030: \"gb18030\",\n \"iso-2022-gbk\": \"gbk\",\n \"iso-2022-58\": \"gb2312\",\n gbk: \"gbk\"\n};\n\n/**\n * Maps DICOM tag hex strings to their normalized lower camelCase names\n * for use in listener.information tracking\n */\nexport const TAG_NAME_MAP = {\n \"0020000D\": \"studyInstanceUid\",\n \"0020000E\": \"seriesInstanceUid\",\n \"00080018\": \"sopInstanceUid\",\n \"00020010\": \"transferSyntaxUid\",\n \"00083002\": \"availableTransferSyntaxUid\",\n \"00080201\": \"timezoneOffsetFromUtc\",\n \"00080005\": \"specificCharacterSet\",\n \"00280008\": \"numberOfFrames\",\n \"00280010\": \"rows\",\n \"00280011\": \"columns\",\n \"00280002\": \"samplesPerPixel\",\n \"00280100\": \"bitsAllocated\",\n \"00280103\": \"pixelRepresentation\"\n};\n\n/**\n * Default tags to track in listener.information\n */\nexport const DEFAULT_INFORMATION_TAGS = new Set([\n \"0020000D\", // StudyInstanceUID\n \"0020000E\", // SeriesInstanceUID\n \"00080018\", // SOPInstanceUID\n \"00020010\", // TransferSyntaxUID\n \"00083002\", // AvailableTransferSyntaxUID\n \"00080201\", // TimezoneOffsetFromUTC\n \"00080005\", // SpecificCharacterSet\n \"00280008\", // NumberOfFrames\n \"00280010\", // Rows\n \"00280011\", // Columns\n \"00280002\", // SamplesPerPixel\n \"00280100\", // BitsAllocated\n \"00280103\" // PixelRepresentation\n]);\n\n/**\n * All valid DICOM VR (Value Representation) codes\n */\nexport const VALID_VRS = new Set([\n \"AE\", // Application Entity\n \"AS\", // Age String\n \"AT\", // Attribute Tag\n \"CS\", // Code String\n \"DA\", // Date\n \"DS\", // Decimal String\n \"DT\", // Date Time\n \"FL\", // Floating Point Single\n \"FD\", // Floating Point Double\n \"IS\", // Integer String\n \"LO\", // Long String\n \"LT\", // Long Text\n \"OB\", // Other Byte\n \"OD\", // Other Double\n \"OF\", // Other Float\n \"OL\", // Other Long\n \"OV\", // Other 64-bit Very Long\n \"OW\", // Other Word\n \"PN\", // Person Name\n \"SH\", // Short String\n \"SL\", // Signed Long\n \"SQ\", // Sequence of Items\n \"SS\", // Signed Short\n \"ST\", // Short Text\n \"SV\", // Signed 64-bit Very Long\n \"TM\", // Time\n \"UC\", // Unlimited Characters\n \"UI\", // Unique Identifier\n \"UL\", // Unsigned Long\n \"UN\", // Unknown\n \"UR\", // Universal Resource\n \"US\", // Unsigned Short\n \"UT\", // Unlimited Text\n \"UV\" // Unsigned 64-bit Very Long\n]);\n\n/**\n * DICOM VR (Value Representation) types that are allowed for bulkdata encoding\n * According to DICOMweb specification\n */\nexport const BULKDATA_VRS = new Set([\n \"DS\", // Decimal String\n \"FL\", // Floating Point Single\n \"FD\", // Floating Point Double\n \"IS\", // Integer String\n \"LT\", // Long Text\n \"OB\", // Other Byte\n \"OD\", // Other Double\n \"OF\", // Other Float\n \"OL\", // Other Long\n \"OV\", // Other 64-bit Very Long\n \"OW\", // Other Word\n \"SL\", // Signed Long\n \"SS\", // Signed Short\n \"ST\", // Short Text\n \"SV\", // Signed 64-bit Very Long\n \"UC\", // Unlimited Characters\n \"UL\", // Unsigned Long\n \"UN\", // Unknown\n \"US\", // Unsigned Short\n \"UT\", // Unlimited Text\n \"UV\" // Unsigned 64-bit Very Long\n]);\n","import { PN_COMPONENT_DELIMITER, VM_DELIMITER } from \"../constants/dicom\";\n\n/**\n * Converts a PN string to the dicom+json equivalent, or returns the\n * original object\n * @param {string | object} value Part10 style PersonName (PN) string (ie 'A^B==C\\D') or object\n * @param {bool} multiple if false returns the first valid PersonName, otherwise returns all PersonNames\n * @returns {object} dicom+json representation of PersonName value, or the same object.\n */\nfunction pnStringToObject(value, multiple = true) {\n if (value == undefined) {\n return multiple ? [] : undefined;\n }\n if (typeof value === \"string\" || value instanceof String) {\n // Direct string assignment:\n // naturalizedDataset.PatientName = \"Doe^John\";\n const values = value\n .split(String.fromCharCode(VM_DELIMITER))\n .filter(Boolean);\n const pnObj = values.map(function (v) {\n const components = v.split(\n String.fromCharCode(PN_COMPONENT_DELIMITER)\n );\n return {\n ...(components[0] ? { Alphabetic: components[0] } : {}),\n ...(components[1] ? { Ideographic: components[1] } : {}),\n ...(components[2] ? { Phonetic: components[2] } : {})\n };\n });\n return multiple ? pnObj : pnObj[0];\n } else {\n // Direct assignment:\n // naturalizedDataset.PatientName = {Alphabetic: \"John\"};\n if (!Array.isArray(value) && multiple) {\n return [Object.assign({}, value)];\n }\n // Verbatim:\n // naturalizedDataset.PatientName = [{Alphabetic: \"John\"}];\n return value;\n }\n}\n\n/**\n * Returns the dicom part10 equivalent string for a given json object.\n * @param {object | string} value\n * @returns {string} dicom part10 equivalent string\n */\nfunction pnObjectToString(value) {\n if (typeof value === \"string\" || value instanceof String) {\n return value;\n }\n\n const pnDelim = String.fromCharCode(PN_COMPONENT_DELIMITER);\n if (!Array.isArray(value)) {\n value = [value];\n }\n return value\n .filter(Boolean)\n .map(function (v) {\n if (\n v === undefined ||\n typeof v === \"string\" ||\n v instanceof String\n ) {\n return v;\n }\n return [v.Alphabetic ?? \"\", v.Ideographic ?? \"\", v.Phonetic ?? \"\"]\n .join(pnDelim)\n .replace(new RegExp(`${pnDelim}*$`), \"\");\n })\n .join(String.fromCharCode(VM_DELIMITER));\n}\n\n/**\n * Overrides toJSON and toString to ensure JSON.stringify always returns\n * a valid dicom+json object, even when given a string such as \"Doe^John\".\n * @param {object} value value object which will be given the accessors. note\n * for a string it must first be boxed: new String(value)\n * @returns {object} the same object\n */\nfunction pnAddValueAccessors(value) {\n if (!value.__hasValueAccessors) {\n Object.defineProperty(value, \"__hasValueAccessors\", { value: true });\n Object.defineProperty(value, \"toJSON\", {\n value: function () {\n if (Array.isArray(this)) {\n return this.filter(Boolean).map(x =>\n pnStringToObject(x, false)\n );\n } else {\n return pnStringToObject(this);\n }\n }\n });\n // This override is mostly for testing; PN is always represented\n // by its dicom+json model, but serialization flattens it to a\n // part10 string.\n Object.defineProperty(value, \"toString\", {\n value: function () {\n return pnObjectToString(value);\n }\n });\n }\n return value;\n}\n\nconst dicomJson = {\n pnObjectToString: pnObjectToString,\n pnConvertToJsonObject: pnStringToObject,\n pnAddValueAccessors: pnAddValueAccessors\n};\n\nexport default dicomJson;\n","import { ReadBufferStream, WriteBufferStream } from \"./BufferStream.js\";\nimport {\n PADDING_NULL,\n PADDING_SPACE,\n PN_COMPONENT_DELIMITER,\n VM_DELIMITER\n} from \"./constants/dicom.js\";\nimport { log, validationLog } from \"./log.js\";\nimport dicomJson from \"./utilities/dicomJson.js\";\n\n// We replace the tag with a Proxy which intercepts assignments to obj[valueProp]\n// and adds additional overrides/accessors to the value if need be. If valueProp\n// is falsy, we check target.vr and add accessors via a ValueRepresentation lookup.\n// Specifically, this helps address the incorrect (though common) use of the library:\n// dicomDict.dict.upsertTag('00101001', 'PN', 'Doe^John'); /* direct string assignment */\n// dicomDict.dict['00081070'].Value = 'Doe^John\\Doe^Jane'; /* overwrite with multiplicity */\n// ...\n// jsonOutput = JSON.serialize(dicomDict);\n// or:\n// naturalizedDataset.OperatorsName = 'Doe^John';\n// jsonOutput = JSON.serialize(naturalizedDataset);\n// Whereas the correct usage of the dicom+json model would be:\n// dicomDict.dict.upsertTag('00101001', 'PN', [{Alphabetic:'Doe^John'}]);\n// naturalizedDataset.OperatorsName = [{Alphabetic:'Doe^John'},{Alphabetic:'Doe^Jane'}];\n// TODO: refactor with addAccessors.js in mind\nconst tagProxyHandler = {\n set(target, prop, value) {\n var vrType;\n if (\n [\"values\", \"Value\"].includes(prop) &&\n target.vr &&\n ValueRepresentation.hasValueAccessors(target.vr)\n ) {\n vrType = ValueRepresentation.createByTypeString(target.vr);\n } else if (\n prop in DicomMetaDictionary.nameMap &&\n ValueRepresentation.hasValueAccessors(\n DicomMetaDictionary.nameMap[prop].vr\n )\n ) {\n vrType = ValueRepresentation.createByTypeString(\n DicomMetaDictionary.nameMap[prop].vr\n );\n } else {\n target[prop] = value;\n return true;\n }\n\n target[prop] = vrType.addValueAccessors(value);\n\n return true;\n }\n};\n\nfunction rtrim(str) {\n return str.replace(/\\s*$/g, \"\");\n}\n\nfunction toWindows(inputArray, size) {\n return Array.from(\n { length: inputArray.length - (size - 1) }, //get the appropriate length\n (_, index) => inputArray.slice(index, index + size) //create the windows\n );\n}\n\nlet DicomMessage, Tag, DicomMetaDictionary;\n\nvar binaryVRs = [\"FL\", \"FD\", \"SL\", \"SS\", \"UL\", \"US\", \"AT\", \"UV\"],\n length32VRs = [\"OB\", \"OW\", \"OF\", \"SQ\", \"UC\", \"UR\", \"UT\", \"UN\", \"OD\", \"UV\"],\n singleVRs = [\"SQ\", \"OF\", \"OW\", \"OB\", \"UN\"];\n\nclass ValueRepresentation {\n constructor(type) {\n this.type = type;\n this.multi = false;\n this._isBinary = binaryVRs.indexOf(this.type) != -1;\n this._allowMultiple =\n !this._isBinary && singleVRs.indexOf(this.type) == -1;\n this._isLength32 = length32VRs.indexOf(this.type) != -1;\n this._storeRaw = true;\n }\n\n static setDicomMessageClass(dicomMessageClass) {\n DicomMessage = dicomMessageClass;\n }\n\n static setDicomMetaDictionary(metaDictionary) {\n DicomMetaDictionary = metaDictionary;\n }\n\n static setTagClass(tagClass) {\n Tag = tagClass;\n }\n\n isBinary() {\n return this._isBinary;\n }\n\n allowMultiple() {\n return this._allowMultiple;\n }\n\n /**\n * Returns if the length is 32 bits. This has nothing to do with being\n * explicit or not, it only has to do with encoding.\n * @deprecated Replaced by isLength32\n */\n isExplicit() {\n return this._isLength32;\n }\n\n /**\n * Returns if the length is 32 bits. This has nothing to do with being\n * explicit or not, it only has to do with encoding.\n *\n * This used to be isExplicit, which was wrong as both encodings are explicit,\n * just one uses a single 4 byte word to encode both VR and length, and\n * the isLength32 always use a separate 32 bit length.\n */\n isLength32() {\n return this._isLength32;\n }\n\n /**\n * Flag that specifies whether to store the original unformatted value that is read from the dicom input buffer.\n * The `_rawValue` is used for lossless round trip processing, which preserves data (whitespace, special chars) on write\n * that may be lost after casting to other data structures like Number, or applying formatting for readability.\n *\n * Example DecimalString: _rawValue: [\"-0.000\"], Value: [0]\n */\n storeRaw() {\n return this._storeRaw;\n }\n\n addValueAccessors(value) {\n return value;\n }\n\n /**\n * Replaces a tag with a Proxy which assigns value accessors based on the vr field\n * of the tag being given to it. If the tag object does not have a vr or vr.type\n * property, the proxy will look for the prop name in the natural name map.\n * @param {any} tag object to add accessors to\n * @returns {any} either the same object if no accessor needed, or a Proxy\n */\n static addTagAccessors(tag) {\n if (\n !tag.__hasTagAccessors &&\n ValueRepresentation.hasValueAccessors(tag.vr?.type || tag.vr)\n ) {\n Object.defineProperty(tag, \"__hasTagAccessors\", { value: true });\n // See note in declaration of taxProxyHandler\n return new Proxy(tag, tagProxyHandler);\n }\n return tag;\n }\n\n /**\n * Removes padding byte, if it exists, from the last value in a multiple-value data element.\n *\n * This function ensures that data elements with multiple values maintain their integrity for lossless\n * read/write operations. In cases where the last value of a multi-valued data element is at the maximum allowed length,\n * an odd-length total can result in a padding byte being added. This padding byte, can cause a length violation\n * when writing back to the file. To prevent this, we remove the padding byte if it is the only additional character\n * in the last element. Otherwise, it leaves the values as-is to minimize changes to the original data.\n *\n * @param {string[]} values - An array of strings representing the values of a DICOM data element.\n * @returns {string[]} The modified array, with the padding byte potentially removed from the last value.\n */\n dropPadByte(values) {\n const maxLength = this.maxLength ?? this.maxCharLength;\n if (!Array.isArray(values) || !maxLength || !this.padByte) {\n return values;\n }\n\n // Only consider multiple-value data elements, as max length issues arise from a delimiter\n // making the total length odd and necessitating a padding byte.\n if (values.length > 1) {\n const padChar = String.fromCharCode(this.padByte);\n const lastIdx = values.length - 1;\n const lastValue = values[lastIdx];\n\n // If the last element is odd and ends with the padding byte trim to avoid potential max length violations during write\n if (lastValue.length % 2 !== 0 && lastValue.endsWith(padChar)) {\n values[lastIdx] = lastValue.substring(0, lastValue.length - 1); // Trim the padding byte\n }\n }\n\n return values;\n }\n\n read(stream, length, syntax, readOptions = { forceStoreRaw: false }) {\n if (this.fixed && this.maxLength) {\n if (!length)\n return {\n rawValue: this.defaultValue,\n value: this.defaultValue\n };\n if (this.maxLength != length)\n log.error(\n \"Invalid length for fixed length tag, vr \" +\n this.type +\n \", length \" +\n this.maxLength +\n \" != \" +\n length\n );\n }\n let rawValue = this.readBytes(stream, length, syntax);\n const value = this.applyFormatting(rawValue);\n\n // avoid duplicating large binary data structures like pixel data which are unlikely to be formatted or directly manipulated\n if (!this.storeRaw() && !readOptions.forceStoreRaw) {\n rawValue = undefined;\n }\n\n return { rawValue, value };\n }\n\n applyFormatting(value) {\n return value;\n }\n\n readBytes(stream, length) {\n return stream.readAsciiString(length);\n }\n\n readPaddedAsciiString(stream, length) {\n if (!length) return \"\";\n if (stream.peekUint8(length - 1) !== this.padByte) {\n return stream.readAsciiString(length);\n } else {\n var val = stream.readAsciiString(length - 1);\n stream.increment(1);\n return val;\n }\n }\n\n readPaddedEncodedString(stream, length) {\n if (!length) return \"\";\n const val = stream.readEncodedString(length);\n if (\n val.length &&\n val[val.length - 1] !== String.fromCharCode(this.padByte)\n ) {\n return val;\n } else {\n return val.slice(0, -1);\n }\n }\n\n write(stream, type) {\n var args = Array.from(arguments);\n if (args[2] === null || args[2] === \"\" || args[2] === undefined) {\n return [stream.writeAsciiString(\"\")];\n } else {\n var written = [],\n valueArgs = args.slice(2),\n func = stream[\"write\" + type];\n if (Array.isArray(valueArgs[0])) {\n if (valueArgs[0].length < 1) {\n written.push(0);\n } else {\n var self = this;\n valueArgs[0].forEach(function (v, k) {\n if (self.allowMultiple() && k > 0) {\n stream.writeUint8(VM_DELIMITER);\n }\n var singularArgs = [v].concat(valueArgs.slice(1));\n var byteCount = func.apply(stream, singularArgs);\n written.push(byteCount);\n });\n }\n } else {\n written.push(func.apply(stream, valueArgs));\n }\n return written;\n }\n }\n\n writeBytes(\n stream,\n value,\n lengths,\n writeOptions = { allowInvalidVRLength: false }\n ) {\n const { allowInvalidVRLength } = writeOptions;\n var valid = true,\n valarr = Array.isArray(value) ? value : [value],\n total = 0;\n\n for (var i = 0; i < valarr.length; i++) {\n var checkValue = valarr[i],\n checklen = lengths[i],\n isString = false,\n displaylen = checklen;\n if (checkValue === null || allowInvalidVRLength) {\n valid = true;\n } else if (this.checkLength) {\n valid = this.checkLength(checkValue);\n } else if (this.maxCharLength) {\n var check = this.maxCharLength; //, checklen = checkValue.length;\n valid = checkValue.length <= check;\n displaylen = checkValue.length;\n isString = true;\n } else if (this.maxLength) {\n valid = checklen <= this.maxLength;\n }\n\n if (!valid) {\n var errmsg =\n \"Value exceeds max length, vr: \" +\n this.type +\n \", value: \" +\n checkValue +\n \", length: \" +\n displaylen;\n if (isString) log.info(errmsg);\n else throw new Error(errmsg);\n }\n total += checklen;\n }\n if (this.allowMultiple()) {\n total += valarr.length ? valarr.length - 1 : 0;\n }\n\n //check for odd\n var written = total;\n if (total & 1) {\n stream.writeUint8(this.padByte);\n written++;\n }\n return written;\n }\n\n static hasValueAccessors(type) {\n if (type in VRinstances) {\n return (\n VRinstances[type].addValueAccessors !==\n ValueRepresentation.prototype.addValueAccessors\n );\n }\n // Given undefined, assume the representation need to add value accessors\n return type === undefined;\n }\n\n static createByTypeString(type) {\n var vr = VRinstances[type];\n if (vr === undefined) {\n if (type == \"ox\") {\n // TODO: determine VR based on context (could be 1 byte pixel data)\n // https://github.com/dgobbi/vtk-dicom/issues/38\n validationLog.error(\"Invalid vr type\", type, \"- using OW\");\n vr = VRinstances[\"OW\"];\n } else if (type == \"xs\") {\n validationLog.error(\"Invalid vr type\", type, \"- using US\");\n vr = VRinstances[\"US\"];\n } else {\n validationLog.error(\"Invalid vr type\", type, \"- using UN\");\n vr = VRinstances[\"UN\"];\n }\n }\n return vr;\n }\n\n static parseUnknownVr(type) {\n return new ParsedUnknownValue(type);\n }\n}\n\nclass AsciiStringRepresentation extends ValueRepresentation {\n constructor(type) {\n super(type);\n }\n\n readBytes(stream, length) {\n return stream.readAsciiString(length);\n }\n\n writeBytes(stream, value, writeOptions) {\n const written = super.write(stream, \"AsciiString\", value);\n\n return super.writeBytes(stream, value, written, writeOptions);\n }\n}\n\nclass EncodedStringRepresentation extends ValueRepresentation {\n constructor(type) {\n super(type);\n }\n\n readBytes(stream, length) {\n return stream.readEncodedString(length);\n }\n\n writeBytes(stream, value, writeOptions) {\n const written = super.write(stream, \"UTF8String\", value);\n\n return super.writeBytes(stream, value, written, writeOptions);\n }\n}\n\nclass BinaryRepresentation extends ValueRepresentation {\n constructor(type) {\n super(type);\n this._storeRaw = false;\n }\n\n writeBytes(stream, value, _syntax, isEncapsulated, writeOptions = {}) {\n var i;\n var binaryStream;\n var { fragmentMultiframe = true } = writeOptions;\n value = value === null || value === undefined ? [] : value;\n if (isEncapsulated) {\n var fragmentSize = 1024 * 20,\n frames = value.length,\n startOffset = [];\n\n // Calculate a total length for storing binary stream\n var bufferLength = 0;\n for (i = 0; i < frames; i++) {\n const needsPadding = Boolean(value[i].byteLength & 1);\n bufferLength += value[i].byteLength + (needsPadding ? 1 : 0);\n let fragmentsLength = 1;\n if (fragmentMultiframe) {\n fragmentsLength = Math.ceil(\n value[i].byteLength / fragmentSize\n );\n }\n // 8 bytes per fragment are needed to store 0xffff (2 bytes), 0xe000 (2 bytes), and frageStream size (4 bytes)\n bufferLength += fragmentsLength * 8;\n }\n\n binaryStream = new WriteBufferStream(\n bufferLength,\n stream.isLittleEndian\n );\n\n for (i = 0; i < frames; i++) {\n const needsPadding = Boolean(value[i].byteLength & 1);\n\n startOffset.push(binaryStream.size);\n var frameBuffer = value[i],\n frameStream = new ReadBufferStream(frameBuffer);\n\n var fragmentsLength = 1;\n if (fragmentMultiframe) {\n fragmentsLength = Math.ceil(\n frameStream.size / fragmentSize\n );\n }\n\n for (var j = 0, fragmentStart = 0; j < fragmentsLength; j++) {\n const isFinalFragment = j === fragmentsLength - 1;\n\n var fragmentEnd = fragmentStart + frameStream.size;\n if (fragmentMultiframe) {\n fragmentEnd = fragmentStart + fragmentSize;\n }\n if (isFinalFragment) {\n fragmentEnd = frameStream.size;\n }\n var fragStream = new ReadBufferStream(\n frameStream.getBuffer(fragmentStart, fragmentEnd)\n );\n fragmentStart = fragmentEnd;\n binaryStream.writeUint16(0xfffe);\n binaryStream.writeUint16(0xe000);\n\n const addPaddingByte = isFinalFragment && needsPadding;\n\n binaryStream.writeUint32(\n fragStream.size + (addPaddingByte ? 1 : 0)\n );\n binaryStream.concat(fragStream);\n\n if (addPaddingByte) {\n binaryStream.writeInt8(this.padByte);\n }\n }\n }\n\n stream.writeUint16(0xfffe);\n stream.writeUint16(0xe000);\n stream.writeUint32(startOffset.length * 4);\n for (i = 0; i < startOffset.length; i++) {\n stream.writeUint32(startOffset[i]);\n }\n stream.concat(binaryStream);\n stream.writeUint16(0xfffe);\n stream.writeUint16(0xe0dd);\n stream.writeUint32(0x0);\n\n return 0xffffffff;\n } else {\n var binaryData = value[0];\n binaryStream = new ReadBufferStream(binaryData);\n stream.concat(binaryStream);\n return super.writeBytes(\n stream,\n binaryData,\n [binaryStream.size],\n writeOptions\n );\n }\n }\n\n readBytes(stream, length) {\n if (length == 0xffffffff) {\n var itemTagValue = Tag.readTag(stream),\n frames = [];\n\n if (itemTagValue.is(0xfffee000)) {\n var itemLength = stream.readUint32(),\n numOfFrames = 1,\n offsets = [];\n if (itemLength > 0x0) {\n //has frames\n numOfFrames = itemLength / 4;\n var i = 0;\n while (i++ < numOfFrames) {\n offsets.push(stream.readUint32());\n }\n } else {\n offsets = [];\n }\n\n const SequenceItemTag = 0xfffee000;\n const SequenceDelimiterTag = 0xfffee0dd;\n\n const getNextSequenceItemData = stream => {\n const nextTag = Tag.readTag(stream);\n if (nextTag.is(SequenceItemTag)) {\n const itemLength = stream.readUint32();\n const buffer = stream.getBuffer(\n stream.offset,\n stream.offset + itemLength\n );\n stream.increment(itemLength);\n return buffer;\n } else if (nextTag.is(SequenceDelimiterTag)) {\n // Read SequenceDelimiterItem value for the SequenceDelimiterTag\n if (stream.readUint32() !== 0) {\n throw Error(\n \"SequenceDelimiterItem tag value was not zero\"\n );\n }\n return null;\n }\n\n throw Error(\"Invalid tag in sequence\");\n };\n\n // If there is an offset table, use that to loop through pixel data sequence\n if (offsets.length > 0) {\n // make offsets relative to the stream, not tag\n offsets = offsets.map(e => e + stream.offset);\n offsets.push(stream.size);\n\n // window offsets to an array of [start,stop] locations\n frames = toWindows(offsets, 2).map(range => {\n const fragments = [];\n const [start, stop] = range;\n // create a new readable stream based on the range\n const rangeStream = new ReadBufferStream(\n stream.buffer,\n stream.isLittleEndian,\n {\n start: start,\n stop: stop,\n noCopy: stream.noCopy\n }\n );\n\n let frameSize = 0;\n while (!rangeStream.end()) {\n const buf = getNextSequenceItemData(rangeStream);\n if (buf === null) {\n break;\n }\n fragments.push(buf);\n frameSize += buf.byteLength;\n }\n\n // Ensure the parent stream's offset is kept up to date\n stream.offset = rangeStream.offset;\n\n // If there's only one buffer thne just return it directly\n if (fragments.length === 1) {\n return fragments[0];\n }\n\n if (rangeStream.noCopy) {\n // return the fragments for downstream application to process\n return fragments;\n } else {\n // Allocate a final ArrayBuffer and concat all buffers into it\n const mergedFrame = new ArrayBuffer(frameSize);\n const u8Data = new Uint8Array(mergedFrame);\n fragments.reduce((offset, buffer) => {\n u8Data.set(new Uint8Array(buffer), offset);\n return offset + buffer.byteLength;\n }, 0);\n\n return mergedFrame;\n }\n });\n }\n // If no offset table, loop through remainder of stream looking for termination tag\n else {\n while (!stream.end()) {\n const buffer = getNextSequenceItemData(stream);\n if (buffer === null) {\n break;\n }\n frames.push(buffer);\n }\n }\n } else {\n throw new Error(\n \"Item tag not found after undefined binary length\"\n );\n }\n return frames;\n } else {\n var bytes;\n /*if (this.type == 'OW') {\n bytes = stream.readUint16Array(length);\n } else if (this.type == 'OB') {\n bytes = stream.readUint8Array(length);\n }*/\n bytes = stream.getBuffer(stream.offset, stream.offset + length);\n stream.increment(length);\n return [bytes];\n }\n }\n}\n\nclass ApplicationEntity extends AsciiStringRepresentation {\n constructor() {\n super(\"AE\");\n this.maxLength = 16;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readAsciiString(length);\n }\n\n applyFormatting(value) {\n return value.trim();\n }\n}\n\nclass CodeString extends AsciiStringRepresentation {\n constructor() {\n super(\"CS\");\n this.maxLength = 16;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n const BACKSLASH = String.fromCharCode(VM_DELIMITER);\n return this.dropPadByte(\n stream.readAsciiString(length).split(BACKSLASH)\n );\n }\n\n applyFormatting(value) {\n const trim = str => str.trim();\n\n if (Array.isArray(value)) {\n return value.map(str => trim(str));\n }\n\n return trim(value);\n }\n}\n\nclass AgeString extends AsciiStringRepresentation {\n constructor() {\n super(\"AS\");\n this.maxLength = 4;\n this.padByte = PADDING_SPACE;\n this.fixed = true;\n this.defaultValue = \"\";\n }\n}\n\nclass AttributeTag extends ValueRepresentation {\n constructor() {\n super(\"AT\");\n this.maxLength = 4;\n this.valueLength = 4;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n }\n\n readBytes(stream) {\n return Tag.readTag(stream).value;\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"TwoUint16s\", value),\n writeOptions\n );\n }\n}\n\nclass DateValue extends AsciiStringRepresentation {\n constructor(value) {\n super(\"DA\", value);\n this.maxLength = 8;\n this.rangeMatchingMaxLength = 18;\n this.padByte = PADDING_SPACE;\n //this.fixed = true;\n this.defaultValue = \"\";\n }\n\n checkLength(value) {\n if (typeof value === \"string\" || value instanceof String) {\n const isRangeQuery = value.includes(\"-\");\n return (\n value.length <=\n (isRangeQuery ? this.rangeMatchingMaxLength : this.maxLength)\n );\n }\n return true;\n }\n}\n\nclass NumericStringRepresentation extends AsciiStringRepresentation {\n readBytes(stream, length) {\n const BACKSLASH = String.fromCharCode(VM_DELIMITER);\n const numStr = stream.readAsciiString(length);\n\n return this.dropPadByte(numStr.split(BACKSLASH));\n }\n}\n\n// DS/IS parsing hardening — https://github.com/dcmjs-org/dcmjs/security/advisories/GHSA-px68-xx5g-48q5\nfunction finiteParsedNumberOrNull(parsed) {\n const n = Number(parsed);\n return Number.isFinite(n) ? n : null;\n}\n\nclass DecimalString extends NumericStringRepresentation {\n constructor() {\n super(\"DS\");\n this.maxLength = 16;\n this.padByte = PADDING_SPACE;\n }\n\n applyFormatting(value) {\n const formatNumber = numberStr => {\n if (numberStr === null || numberStr === undefined) {\n return null;\n }\n const returnVal = String(numberStr)\n .trim()\n .replace(/[^0-9.\\\\\\-+e]/gi, \"\");\n if (returnVal === \"\") return null;\n return finiteParsedNumberOrNull(returnVal);\n };\n\n if (Array.isArray(value)) {\n return value.map(formatNumber);\n }\n\n return formatNumber(value);\n }\n\n convertToString(value) {\n if (value === null) return \"\";\n if (typeof value === \"string\") return value;\n\n let str = String(value);\n if (str.length > this.maxLength) {\n // Characters needed for '-' at start.\n const sign_chars = value < 0 ? 1 : 0;\n\n // Decide whether to use scientific notation.\n const logval = Math.log10(Math.abs(value));\n\n // Numbers larger than 1e14 cannot be correctly represented by truncating\n // their string representations to 16 chars, e.g pi * 10^13 would become\n // '314159265358979.', which may not be universally understood. This limit\n // is 1e13 for negative numbers because of the minus sign.\n // For negative exponents, the point of equal precision between scientific\n // and standard notation is 1e-4 e.g. '0.00031415926535' and\n // '3.1415926535e-04' are both 16 chars.\n const use_scientific = logval < -4 || logval >= 14 - sign_chars;\n if (use_scientific) {\n const trunc_str = value.toExponential(16 - sign_chars);\n if (trunc_str.length <= 16) return trunc_str;\n // If string is too long, correct the length.\n return value.toExponential(\n 16 - (trunc_str.length - 16) - sign_chars\n );\n } else {\n const trunc_str = value.toFixed(16 - sign_chars);\n if (trunc_str.length <= 16) return trunc_str;\n // If string is too long, correct the length.\n return value.toFixed(16 - sign_chars - (trunc_str.length - 16));\n }\n }\n return str;\n }\n\n writeBytes(stream, value, writeOptions) {\n const val = Array.isArray(value)\n ? value.map(ds => this.convertToString(ds))\n : [this.convertToString(value)];\n return super.writeBytes(stream, val, writeOptions);\n }\n}\n\nclass DateTime extends AsciiStringRepresentation {\n constructor() {\n super(\"DT\");\n this.maxLength = 26;\n this.rangeMatchingMaxLength = 54;\n this.padByte = PADDING_SPACE;\n }\n\n checkLength(value) {\n if (typeof value === \"string\" || value instanceof String) {\n const isRangeQuery = value.includes(\"-\");\n return (\n value.length <=\n (isRangeQuery ? this.rangeMatchingMaxLength : this.maxLength)\n );\n }\n return true;\n }\n}\n\nclass FloatingPointSingle extends ValueRepresentation {\n constructor() {\n super(\"FL\");\n this.maxLength = 4;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n this.defaultValue = 0.0;\n }\n\n readBytes(stream) {\n return stream.readFloat();\n }\n\n applyFormatting(value) {\n return Number(value);\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"Float\", value),\n writeOptions\n );\n }\n}\n\nclass FloatingPointDouble extends ValueRepresentation {\n constructor() {\n super(\"FD\");\n this.maxLength = 8;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n this.defaultValue = 0.0;\n }\n\n readBytes(stream) {\n return stream.readDouble();\n }\n\n applyFormatting(value) {\n return Number(value);\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"Double\", value),\n writeOptions\n );\n }\n}\n\nclass IntegerString extends NumericStringRepresentation {\n constructor() {\n super(\"IS\");\n this.maxLength = 12;\n this.padByte = PADDING_SPACE;\n }\n\n applyFormatting(value) {\n const formatNumber = numberStr => {\n if (numberStr === null || numberStr === undefined) {\n return null;\n }\n const trimmed = String(numberStr).trim();\n if (trimmed === \"\") return null;\n // PS3.5: base-10 integer only (no decimal point, no exponent).\n if (!/^[+-]?\\d+$/.test(trimmed)) {\n return null;\n }\n return finiteParsedNumberOrNull(trimmed);\n };\n\n if (Array.isArray(value)) {\n return value.map(formatNumber);\n }\n\n return formatNumber(value);\n }\n\n convertToString(value) {\n if (typeof value === \"string\") return value;\n return value === null ? \"\" : String(value);\n }\n\n writeBytes(stream, value, writeOptions) {\n const val = Array.isArray(value)\n ? value.map(is => this.convertToString(is))\n : [this.convertToString(value)];\n return super.writeBytes(stream, val, writeOptions);\n }\n}\n\nclass LongString extends EncodedStringRepresentation {\n constructor() {\n super(\"LO\");\n this.maxCharLength = 64;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readEncodedString(length);\n }\n\n applyFormatting(value) {\n return value.trim();\n }\n}\n\nclass LongText extends EncodedStringRepresentation {\n constructor() {\n super(\"LT\");\n this.maxCharLength = 10240;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readEncodedString(length);\n }\n\n applyFormatting(value) {\n return rtrim(value);\n }\n}\n\nclass PersonName extends EncodedStringRepresentation {\n constructor() {\n super(\"PN\");\n this.maxLength = null;\n this.padByte = PADDING_SPACE;\n }\n\n static checkComponentLengths(components) {\n for (var i in components) {\n var cmp = components[i];\n // As per table 6.2-1 in the spec\n if (cmp.length > 64) return false;\n }\n return true;\n }\n\n // Adds toJSON and toString accessors to normalize PersonName output; ie toJSON\n // always returns a dicom+json object, and toString always returns a part10\n // style string, regardless of typeof value\n addValueAccessors(value) {\n if (typeof value === \"string\") {\n value = new String(value);\n }\n if (value != undefined) {\n if (typeof value === \"object\") {\n return dicomJson.pnAddValueAccessors(value);\n } else {\n throw new Error(\n \"Cannot add accessors to non-string primitives\"\n );\n }\n }\n return value;\n }\n\n // Only checked on write, not on read nor creation\n checkLength(value) {\n if (Array.isArray(value)) {\n // In DICOM JSON, components are encoded as a mapping (object),\n // where the keys are one or more of the following: \"Alphabetic\",\n // \"Ideographic\", \"Phonetic\".\n // http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_F.2.2.html\n for (const pnValue of value) {\n const components = Object.keys(pnValue).forEach(\n key => value[key]\n );\n if (!PersonName.checkComponentLengths(components)) return false;\n }\n } else if (typeof value === \"string\" || value instanceof String) {\n // In DICOM Part10, components are encoded as a string,\n // where components (\"Alphabetic\", \"Ideographic\", \"Phonetic\")\n // are separated by the \"=\" delimeter.\n // http://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html\n // PN may also have multiplicity, with each item separated by\n // 0x5C (backslash).\n // https://dicom.nema.org/dicom/2013/output/chtml/part05/sect_6.4.html\n const values = value.split(String.fromCharCode(VM_DELIMITER));\n\n for (var pnString of values) {\n const components = pnString.split(\n String.fromCharCode(PN_COMPONENT_DELIMITER)\n );\n if (!PersonName.checkComponentLengths(components)) return false;\n }\n }\n return true;\n }\n\n readBytes(stream, length) {\n return this.readPaddedEncodedString(stream, length);\n }\n\n applyFormatting(value) {\n const parsePersonName = valueStr =>\n dicomJson.pnConvertToJsonObject(valueStr);\n\n if (Array.isArray(value)) {\n return value.map(valueStr => parsePersonName(valueStr));\n }\n\n return parsePersonName(value);\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n dicomJson.pnObjectToString(value),\n writeOptions\n );\n }\n}\n\nclass ShortString extends EncodedStringRepresentation {\n constructor() {\n super(\"SH\");\n this.maxCharLength = 16;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readEncodedString(length);\n }\n\n applyFormatting(value) {\n return value.trim();\n }\n}\n\nclass SignedLong extends ValueRepresentation {\n constructor() {\n super(\"SL\");\n this.maxLength = 4;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n this.defaultValue = 0;\n }\n\n readBytes(stream) {\n return stream.readInt32();\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"Int32\", value),\n writeOptions\n );\n }\n}\n\nclass SequenceOfItems extends ValueRepresentation {\n constructor() {\n super(\"SQ\");\n this.maxLength = null;\n this.padByte = PADDING_NULL;\n this.noMultiple = true;\n this._storeRaw = false;\n }\n\n readBytes(stream, sqlength, syntax) {\n if (sqlength == 0x0) {\n return []; //contains no dataset\n } else {\n var undefLength = sqlength == 0xffffffff,\n elements = [],\n read = 0;\n\n while (true) {\n var tag = Tag.readTag(stream),\n length = null;\n read += 4;\n\n if (tag.is(0xfffee0dd)) {\n stream.readUint32();\n break;\n } else if (!undefLength && read == sqlength) {\n break;\n } else if (tag.is(0xfffee000)) {\n length = stream.readUint32();\n read += 4;\n var itemStream = null,\n toRead = 0,\n undef = length == 0xffffffff;\n\n if (undef) {\n var stack = 0;\n\n /* eslint-disable-next-line no-constant-condition */\n while (1) {\n var g = stream.readUint16();\n if (g == 0xfffe) {\n // some control tag is about to be read\n var ge = stream.readUint16();\n\n let itemLength = stream.readUint32();\n stream.increment(-4);\n\n if (ge == 0xe00d) {\n if (itemLength === 0) {\n // item delimitation tag (0xfffee00d) + item length (0x00000000) has been read\n stack--;\n if (stack < 0) {\n // if we are outside every stack, then we are finished reading the sequence of items\n stream.increment(4);\n read += 8;\n break;\n } else {\n // otherwise, we were in a nested sequence of items\n toRead += 4;\n }\n } else {\n // anything else has been read\n toRead += 2;\n }\n } else if (ge == 0xe000) {\n // a new item has been found\n toRead += 4;\n\n if (itemLength == 0xffffffff) {\n // a new item with undefined length has been found\n stack++;\n }\n } else {\n // some control tag that does not concern sequence of items has been read\n toRead += 2;\n stream.increment(-2);\n }\n } else {\n // anything else has been read\n toRead += 2;\n }\n }\n } else {\n toRead = length;\n }\n\n if (toRead) {\n stream.increment(undef ? -toRead - 8 : 0);\n itemStream = stream.more(toRead); //parseElements\n read += toRead;\n if (undef) stream.increment(8);\n\n var items = DicomMessage._read(itemStream, syntax);\n elements.push(items);\n }\n if (!undefLength && read == sqlength) {\n break;\n }\n }\n }\n return elements;\n }\n }\n\n writeBytes(stream, value, syntax, writeOptions) {\n let written = 0;\n\n if (value) {\n for (var i = 0; i < value.length; i++) {\n var item = value[i];\n super.write(stream, \"Uint16\", 0xfffe);\n super.write(stream, \"Uint16\", 0xe000);\n super.write(stream, \"Uint32\", 0xffffffff);\n\n written += DicomMessage.write(\n item,\n stream,\n syntax,\n writeOptions\n );\n\n super.write(stream, \"Uint16\", 0xfffe);\n super.write(stream, \"Uint16\", 0xe00d);\n super.write(stream, \"Uint32\", 0x00000000);\n written += 16;\n }\n }\n super.write(stream, \"Uint16\", 0xfffe);\n super.write(stream, \"Uint16\", 0xe0dd);\n super.write(stream, \"Uint32\", 0x00000000);\n written += 8;\n\n return super.writeBytes(stream, value, [written], writeOptions);\n }\n}\n\nclass SignedShort extends ValueRepresentation {\n constructor() {\n super(\"SS\");\n this.maxLength = 2;\n this.valueLength = 2;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n this.defaultValue = 0;\n }\n\n readBytes(stream) {\n return stream.readInt16();\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"Int16\", value),\n writeOptions\n );\n }\n}\n\nclass ShortText extends EncodedStringRepresentation {\n constructor() {\n super(\"ST\");\n this.maxCharLength = 1024;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readEncodedString(length);\n }\n\n applyFormatting(value) {\n return rtrim(value);\n }\n}\n\nclass TimeValue extends AsciiStringRepresentation {\n constructor() {\n super(\"TM\");\n this.maxLength = 16;\n this.rangeMatchingMaxLength = 28;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readAsciiString(length);\n }\n\n applyFormatting(value) {\n return rtrim(value);\n }\n\n checkLength(value) {\n if (typeof value === \"string\" || value instanceof String) {\n const isRangeQuery = value.includes(\"-\");\n return (\n value.length <=\n (isRangeQuery ? this.rangeMatchingMaxLength : this.maxLength)\n );\n }\n return true;\n }\n}\n\nclass UnlimitedCharacters extends EncodedStringRepresentation {\n constructor() {\n super(\"UC\");\n this.maxLength = null;\n this.multi = true;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readEncodedString(length);\n }\n\n applyFormatting(value) {\n return rtrim(value);\n }\n}\n\nclass UnlimitedText extends EncodedStringRepresentation {\n constructor() {\n super(\"UT\");\n this.maxLength = null;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readEncodedString(length);\n }\n\n applyFormatting(value) {\n return rtrim(value);\n }\n}\n\nclass UnsignedShort extends ValueRepresentation {\n constructor() {\n super(\"US\");\n this.maxLength = 2;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n this.defaultValue = 0;\n }\n\n readBytes(stream) {\n return stream.readUint16();\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"Uint16\", value),\n writeOptions\n );\n }\n}\n\nclass UnsignedLong extends ValueRepresentation {\n constructor() {\n super(\"UL\");\n this.maxLength = 4;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n this.defaultValue = 0;\n }\n\n readBytes(stream) {\n return stream.readUint32();\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"Uint32\", value),\n writeOptions\n );\n }\n}\n\nclass Unsigned64BitVeryLong extends ValueRepresentation {\n constructor() {\n super(\"UV\");\n this.maxLength = 8;\n this.padByte = PADDING_NULL;\n this.fixed = true;\n this.defaultValue = 0;\n }\n\n readBytes(stream) {\n return stream.readBigUint64();\n }\n\n writeBytes(stream, value, writeOptions) {\n return super.writeBytes(\n stream,\n value,\n super.write(stream, \"BigUint64\", value),\n writeOptions\n );\n }\n}\n\nclass UniqueIdentifier extends AsciiStringRepresentation {\n constructor() {\n super(\"UI\");\n this.maxLength = 64;\n this.padByte = PADDING_NULL;\n }\n\n readBytes(stream, length) {\n const result = this.readPaddedAsciiString(stream, length);\n\n const BACKSLASH = String.fromCharCode(VM_DELIMITER);\n\n // Treat backslashes as a delimiter for multiple UIDs, in which case an\n // array of UIDs is returned. This is used by DICOM Q&R to support\n // querying and matching multiple items on a UID field in a single\n // query. For more details see:\n //\n // https://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_C.2.2.2.2.html\n // https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.4.html\n\n if (result.indexOf(BACKSLASH) === -1) {\n return result;\n } else {\n return this.dropPadByte(result.split(BACKSLASH));\n }\n }\n\n applyFormatting(value) {\n const removeInvalidUidChars = uidStr => {\n return uidStr.replace(/[^0-9.]/g, \"\");\n };\n\n if (Array.isArray(value)) {\n return value.map(removeInvalidUidChars);\n }\n\n return removeInvalidUidChars(value);\n }\n}\n\nclass UniversalResource extends AsciiStringRepresentation {\n constructor() {\n super(\"UR\");\n this.maxLength = null;\n this.padByte = PADDING_SPACE;\n }\n\n readBytes(stream, length) {\n return stream.readAsciiString(length);\n }\n}\n\nclass UnknownValue extends BinaryRepresentation {\n constructor() {\n super(\"UN\");\n this.maxLength = null;\n this.padByte = PADDING_NULL;\n this.noMultiple = true;\n }\n}\n\nclass ParsedUnknownValue extends BinaryRepresentation {\n constructor(vr) {\n super(vr);\n this.maxLength = null;\n this.padByte = 0;\n this.noMultiple = true;\n this._isBinary = true;\n this._allowMultiple = false;\n this._isLength32 = true;\n this._storeRaw = true;\n }\n\n read(stream, length, syntax, readOptions) {\n const arrayBuffer = this.readBytes(stream, length, syntax)[0];\n const streamFromBuffer = new ReadBufferStream(arrayBuffer, true);\n const vr = ValueRepresentation.createByTypeString(this.type);\n\n if (vr.isBinary() && length > vr.maxLength && !vr.noMultiple) {\n var values = [];\n var rawValues = [];\n var times = length / vr.maxLength,\n i = 0;\n\n while (i++ < times) {\n const { rawValue, value } = vr.read(\n streamFromBuffer,\n vr.maxLength,\n syntax,\n readOptions\n );\n rawValues.push(rawValue);\n values.push(value);\n }\n return { rawValue: rawValues, value: values };\n } else {\n return vr.read(streamFromBuffer, length, syntax, readOptions);\n }\n }\n}\n\nclass OtherWordString extends BinaryRepresentation {\n constructor() {\n super(\"OW\");\n this.maxLength = null;\n this.padByte = PADDING_NULL;\n this.noMultiple = true;\n }\n}\n\nclass OtherByteString extends BinaryRepresentation {\n constructor() {\n super(\"OB\");\n this.maxLength = null;\n this.padByte = PADDING_NULL;\n this.noMultiple = true;\n }\n}\n\nclass OtherDoubleString extends BinaryRepresentation {\n constructor() {\n super(\"OD\");\n this.maxLength = null;\n this.padByte = PADDING_NULL;\n this.noMultiple = true;\n }\n}\n\nclass OtherFloatString extends BinaryRepresentation {\n constructor() {\n super(\"OF\");\n this.maxLength = null;\n this.padByte = PADDING_NULL;\n this.noMultiple = true;\n }\n}\n\n// these VR instances are precreate and are reused for each requested vr/tag\nlet VRinstances = {\n AE: new ApplicationEntity(),\n AS: new AgeString(),\n AT: new AttributeTag(),\n CS: new CodeString(),\n DA: new DateValue(),\n DS: new DecimalString(),\n DT: new DateTime(),\n FL: new FloatingPointSingle(),\n FD: new FloatingPointDouble(),\n IS: new IntegerString(),\n LO: new LongString(),\n LT: new LongText(),\n OB: new OtherByteString(),\n OD: new OtherDoubleString(),\n OF: new OtherFloatString(),\n OW: new OtherWordString(),\n PN: new PersonName(),\n SH: new ShortString(),\n SL: new SignedLong(),\n SQ: new SequenceOfItems(),\n SS: new SignedShort(),\n ST: new ShortText(),\n TM: new TimeValue(),\n UC: new UnlimitedCharacters(),\n UI: new UniqueIdentifier(),\n UL: new UnsignedLong(),\n UN: new UnknownValue(),\n UR: new UniversalResource(),\n US: new UnsignedShort(),\n UT: new UnlimitedText(),\n UV: new Unsigned64BitVeryLong()\n};\n\nexport { ValueRepresentation };\n","import { WriteBufferStream } from \"./BufferStream\";\nimport { ValueRepresentation } from \"./ValueRepresentation\";\nimport { TagHex } from \"./constants/dicom\";\n\nconst EXPLICIT_LITTLE_ENDIAN = \"1.2.840.10008.1.2.1\";\n\nlet DicomMessage;\n\nclass DicomDict {\n constructor(meta) {\n this.meta = meta;\n this.dict = {};\n }\n\n upsertTag(tag, vr, values) {\n if (this.dict[tag]) {\n // Should already have tag accessors.\n this.dict[tag].Value = values;\n } else {\n this.dict[tag] = ValueRepresentation.addTagAccessors({ vr: vr });\n this.dict[tag].Value = values;\n }\n }\n\n write(writeOptions = { allowInvalidVRLength: false }) {\n var metaSyntax = EXPLICIT_LITTLE_ENDIAN;\n var fileStream = new WriteBufferStream(4096, true);\n fileStream.writeUint8Repeat(0, 128);\n fileStream.writeAsciiString(\"DICM\");\n\n var metaStream = new WriteBufferStream(1024);\n if (!this.meta[TagHex.TransferSyntaxUID]) {\n this.meta[TagHex.TransferSyntaxUID] = {\n vr: \"UI\",\n Value: [EXPLICIT_LITTLE_ENDIAN]\n };\n }\n DicomMessage.write(this.meta, metaStream, metaSyntax, writeOptions);\n DicomMessage.writeTagObject(\n fileStream,\n TagHex.FileMetaInformationGroupLength,\n \"UL\",\n metaStream.size,\n metaSyntax,\n writeOptions\n );\n fileStream.concat(metaStream);\n\n var useSyntax = this.meta[TagHex.TransferSyntaxUID].Value[0];\n DicomMessage.write(this.dict, fileStream, useSyntax, writeOptions);\n return fileStream.getBuffer();\n }\n\n /** Helper method to avoid circular dependencies */\n static setDicomMessageClass(dicomMessageClass) {\n DicomMessage = dicomMessageClass;\n }\n}\n\nexport { DicomDict };\n","// AUTO-GENERATED from dictionary.js. Exact (GGGG,EEEE) tags only.\n// Provides very fast startup: most data is binary base64 decoded once.\n\nexport const vrTable = [\n \"UL\",\n \"UI\",\n \"SH\",\n \"US\",\n \"AE\",\n \"AT\",\n \"LO\",\n \"LT\",\n \"CS\",\n \"IS\",\n \"OB\",\n \"up\",\n \"SQ\",\n \"DA\",\n \"TM\",\n \"DT\",\n \"ST\",\n \"PN\",\n \"UR\",\n \"UC\",\n \"UT\",\n \"UV\",\n \"FD\",\n \"DS\",\n \"FL\",\n \"AS\",\n \"ox\",\n \"OF\",\n \"SL\",\n \"SS\",\n \"xs\",\n \"lt\",\n \"OW\",\n \"OD\",\n \"OL\",\n \"UN\",\n \"OV\",\n \"SV\",\n \"na\"\n];\nexport const vmTable = [\n \"1\",\n \"1-n\",\n \"1-8\",\n \"2-n\",\n \"1-3\",\n \"1-2\",\n \"3-3n\",\n \"2\",\n \"4\",\n \"3\",\n \"2-4\",\n \"2-2n\",\n \"6\",\n \"16\",\n \"9\",\n \"1-32\",\n \"1-99\",\n \"3-n\",\n \"6-n\"\n];\n\n// All names concatenated into one string; offsets/lengths index into it.\nexport const nameBlob =\n \"CommandGroupLengthRETIRED_CommandLengthToEndAffectedSOPClassUIDRequestedSOPClassUIDRETIRED_CommandRecognitionCodeCommandFieldMessageIDMessageIDBeingRespondedToRETIRED_InitiatorRETIRED_ReceiverRETIRED_FindLocationMoveDestinationPriorityCommandDataSetTypeRETIRED_NumberOfMatchesRETIRED_ResponseSequenceNumberStatusOffendingElementErrorCommentErrorIDAffectedSOPInstanceUIDRequestedSOPInstanceUIDEventTypeIDAttributeIdentifierListActionTypeIDNumberOfRemainingSuboperationsNumberOfCompletedSuboperationsNumberOfFailedSuboperationsNumberOfWarningSuboperationsMoveOriginatorApplicationEntityTitleMoveOriginatorMessageIDRETIRED_DialogReceiverRETIRED_TerminalTypeRETIRED_MessageSetIDRETIRED_EndMessageIDRETIRED_DisplayFormatRETIRED_PagePositionIDRETIRED_TextFormatIDRETIRED_NormalReverseRETIRED_AddGrayScaleRETIRED_BordersRETIRED_CopiesRETIRED_CommandMagnificationTypeRETIRED_EraseRETIRED_PrintRETIRED_OverlaysFileMetaInformationGroupLengthFileMetaInformationVersionMediaStorageSOPClassUIDMediaStorageSOPInstanceUIDTransferSyntaxUIDImplementationClassUIDImplementationVersionNameSourceApplicationEntityTitleSendingApplicationEntityTitleReceivingApplicationEntityTitlePrivateInformationCreatorUIDPrivateInformationFileSetIDFileSetDescriptorFileIDSpecificCharacterSetOfFileSetDescriptorFileOffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntityOffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntityFileSetConsistencyFlagDirectoryRecordSequenceOffsetOfTheNextDirectoryRecordRecordInUseFlagOffsetOfReferencedLowerLevelDirectoryEntityDirectoryRecordTypePrivateRecordUIDReferencedFileIDRETIRED_MRDRDirectoryRecordOffsetReferencedSOPClassUIDInFileReferencedSOPInstanceUIDInFileReferencedTransferSyntaxUIDInFileReferencedRelatedGeneralSOPClassUIDInFileRETIRED_NumberOfReferencesRETIRED_LengthToEndSpecificCharacterSetLanguageCodeSequenceImageTypeRETIRED_RecognitionCodeInstanceCreationDateInstanceCreationTimeInstanceCreatorUIDInstanceCoercionDateTimeSOPClassUIDAcquisitionUIDSOPInstanceUIDPyramidUIDRelatedGeneralSOPClassUIDOriginalSpecializedSOPClassUIDSyntheticDataStudyDateSeriesDateAcquisitionDateContentDateRETIRED_OverlayDateRETIRED_CurveDateAcquisitionDateTimeStudyTimeSeriesTimeAcquisitionTimeContentTimeRETIRED_OverlayTimeRETIRED_CurveTimeRETIRED_DataSetTypeRETIRED_DataSetSubtypeRETIRED_NuclearMedicineSeriesTypeAccessionNumberIssuerOfAccessionNumberSequenceQueryRetrieveLevelQueryRetrieveViewRetrieveAETitleStationAETitleInstanceAvailabilityFailedSOPInstanceUIDListModalityModalitiesInStudySOPClassesInStudyAnatomicRegionsInStudyCodeSequenceConversionTypePresentationIntentTypeManufacturerInstitutionNameInstitutionAddressInstitutionCodeSequenceReferringPhysicianNameReferringPhysicianAddressReferringPhysicianTelephoneNumbersReferringPhysicianIdentificationSequenceConsultingPhysicianNameConsultingPhysicianIdentificationSequenceCodeValueExtendedCodeValueCodingSchemeDesignatorCodingSchemeVersionCodeMeaningMappingResourceContextGroupVersionContextGroupLocalVersionExtendedCodeMeaningCodingSchemeResourcesSequenceCodingSchemeURLTypeContextGroupExtensionFlagCodingSchemeUIDContextGroupExtensionCreatorUIDCodingSchemeURLContextIdentifierCodingSchemeIdentificationSequenceCodingSchemeRegistryCodingSchemeExternalIDCodingSchemeNameCodingSchemeResponsibleOrganizationContextUIDMappingResourceUIDLongCodeValueURNCodeValueEquivalentCodeSequenceMappingResourceNameContextGroupIdentificationSequenceMappingResourceIdentificationSequenceTimezoneOffsetFromUTCResponsibleGroupCodeSequenceEquipmentModalityManufacturerRelatedModelGroupPrivateDataElementCharacteristicsSequencePrivateGroupReferencePrivateCreatorReferenceBlockIdentifyingInformationStatusNonidentifyingPrivateElementsDeidentificationActionSequenceIdentifyingPrivateElementsDeidentificationActionPrivateDataElementPrivateDataElementValueMultiplicityPrivateDataElementValueRepresentationPrivateDataElementNumberOfItemsPrivateDataElementNamePrivateDataElementKeywordPrivateDataElementDescriptionPrivateDataElementEncodingPrivateDataElementDefinitionSequenceScopeOfInventorySequenceInventoryPurposeInventoryInstanceDescriptionInventoryLevelItemInventoryDateTimeRemovedFromOperationalUseReasonForRemovalCodeSequenceStoredInstanceBaseURIFolderAccessURIFileAccessURIContainerFileTypeFilenameInContainerFileOffsetInContainerFileLengthInContainerStoredInstanceTransferSyntaxUIDExtendedMatchingMechanismsRangeMatchingSequenceListOfUIDMatchingSequenceEmptyValueMatchingSequenceGeneralMatchingSequenceRequestedStatusIntervalRetainInstancesExpirationDateTimeTransactionStatusTransactionStatusCommentFileSetAccessSequenceFileAccessSequenceRecordKeyPriorRecordKeyMetadataSequenceUpdatedMetadataSequenceStudyUpdateDateTimeInventoryAccessEndPointsSequenceStudyAccessEndPointsSequenceIncorporatedInventoryInstanceSequenceInventoriedStudiesSequenceInventoriedSeriesSequenceInventoriedInstancesSequenceInventoryCompletionStatusNumberOfStudyRecordsInInstanceTotalNumberOfStudyRecordsMaximumNumberOfRecordsRETIRED_NetworkIDStationNameStudyDescriptionProcedureCodeSequenceSeriesDescriptionSeriesDescriptionCodeSequenceInstitutionalDepartmentNameInstitutionalDepartmentTypeCodeSequencePhysiciansOfRecordPhysiciansOfRecordIdentificationSequencePerformingPhysicianNamePerformingPhysicianIdentificationSequenceNameOfPhysiciansReadingStudyPhysiciansReadingStudyIdentificationSequenceOperatorsNameOperatorIdentificationSequenceAdmittingDiagnosesDescriptionAdmittingDiagnosesCodeSequencePyramidDescriptionManufacturerModelNameRETIRED_ReferencedResultsSequenceReferencedStudySequenceReferencedPerformedProcedureStepSequenceReferencedInstancesBySOPClassSequenceReferencedSeriesSequenceReferencedPatientSequenceReferencedVisitSequenceRETIRED_ReferencedOverlaySequenceReferencedStereometricInstanceSequenceReferencedWaveformSequenceReferencedImageSequenceRETIRED_ReferencedCurveSequenceReferencedInstanceSequenceReferencedRealWorldValueMappingInstanceSequenceReferencedSOPClassUIDReferencedSOPInstanceUIDDefinitionSourceSequenceSOPClassesSupportedReferencedFrameNumberSimpleFrameListCalculatedFrameListTimeRangeFrameExtractionSequenceMultiFrameSourceSOPInstanceUIDRetrieveURLTransactionUIDWarningReasonFailureReasonFailedSOPSequenceReferencedSOPSequenceOtherFailuresSequenceFailedStudySequenceStudiesContainingOtherReferencedInstancesSequenceRelatedSeriesSequenceRETIRED_LossyImageCompressionRetiredDerivationDescriptionSourceImageSequenceStageNameStageNumberNumberOfStagesViewNameViewNumberNumberOfEventTimersNumberOfViewsInStageEventElapsedTimesEventTimerNamesEventTimerSequenceEventTimeOffsetEventCodeSequenceStartTrimStopTrimRecommendedDisplayFrameRateRETIRED_TransducerPositionRETIRED_TransducerOrientationRETIRED_AnatomicStructureAnatomicRegionSequenceAnatomicRegionModifierSequencePrimaryAnatomicStructureSequenceAnatomicStructureSpaceOrRegionSequencePrimaryAnatomicStructureModifierSequenceRETIRED_TransducerPositionSequenceRETIRED_TransducerPositionModifierSequenceRETIRED_TransducerOrientationSequenceRETIRED_TransducerOrientationModifierSequenceRETIRED_AnatomicStructureSpaceOrRegionCodeSequenceTrialRETIRED_AnatomicPortalOfEntranceCodeSequenceTrialRETIRED_AnatomicApproachDirectionCodeSequenceTrialRETIRED_AnatomicPerspectiveDescriptionTrialRETIRED_AnatomicPerspectiveCodeSequenceTrialRETIRED_AnatomicLocationOfExaminingInstrumentDescriptionTrialRETIRED_AnatomicLocationOfExaminingInstrumentCodeSequenceTrialRETIRED_AnatomicStructureSpaceOrRegionModifierCodeSequenceTrialRETIRED_OnAxisBackgroundAnatomicStructureCodeSequenceTrialAlternateRepresentationSequenceAvailableTransferSyntaxUIDIrradiationEventUIDSourceIrradiationEventSequenceRadiopharmaceuticalAdministrationEventUIDRETIRED_IdentifyingCommentsFrameTypeReferencedImageEvidenceSequenceReferencedRawDataSequenceCreatorVersionUIDDerivationImageSequenceSourceImageEvidenceSequencePixelPresentationVolumetricPropertiesVolumeBasedCalculationTechniqueComplexImageComponentAcquisitionContrastDerivationCodeSequenceReferencedPresentationStateSequenceReferencedOtherPlaneSequenceFrameDisplaySequenceRecommendedDisplayFrameRateInFloatSkipFrameRangeFlagPatientNamePatientIDIssuerOfPatientIDTypeOfPatientIDIssuerOfPatientIDQualifiersSequenceSourcePatientGroupIdentificationSequenceGroupOfPatientsIdentificationSequenceSubjectRelativePositionInImagePatientBirthDatePatientBirthTimePatientBirthDateInAlternativeCalendarPatientDeathDateInAlternativeCalendarPatientAlternativeCalendarPatientSexPatientInsurancePlanCodeSequencePatientPrimaryLanguageCodeSequencePatientPrimaryLanguageModifierCodeSequenceQualityControlSubjectQualityControlSubjectTypeCodeSequenceStrainDescriptionStrainNomenclatureStrainStockNumberStrainSourceRegistryCodeSequenceStrainStockSequenceStrainSourceStrainAdditionalInformationStrainCodeSequenceGeneticModificationsSequenceGeneticModificationsDescriptionGeneticModificationsNomenclatureGeneticModificationsCodeSequenceOtherPatientIDsOtherPatientNamesOtherPatientIDsSequencePatientBirthNamePatientAgePatientSizePatientSizeCodeSequencePatientBodyMassIndexMeasuredAPDimensionMeasuredLateralDimensionPatientWeightPatientAddressRETIRED_InsurancePlanIdentificationPatientMotherBirthNameMilitaryRankBranchOfServiceMedicalRecordLocatorReferencedPatientPhotoSequenceMedicalAlertsAllergiesCountryOfResidenceRegionOfResidencePatientTelephoneNumbersPatientTelecomInformationEthnicGroupEthnicGroupCodeSequenceOccupationSmokingStatusAdditionalPatientHistoryPregnancyStatusLastMenstrualDatePatientReligiousPreferencePatientSpeciesDescriptionPatientSpeciesCodeSequencePatientSexNeuteredAnatomicalOrientationTypePatientBreedDescriptionPatientBreedCodeSequenceBreedRegistrationSequenceBreedRegistrationNumberBreedRegistryCodeSequenceResponsiblePersonResponsiblePersonRoleResponsibleOrganizationPatientCommentsExaminedBodyThicknessClinicalTrialSponsorNameClinicalTrialProtocolIDClinicalTrialProtocolNameIssuerOfClinicalTrialProtocolIDOtherClinicalTrialProtocolIDsSequenceClinicalTrialSiteIDClinicalTrialSiteNameIssuerOfClinicalTrialSiteIDClinicalTrialSubjectIDIssuerOfClinicalTrialSubjectIDClinicalTrialSubjectReadingIDIssuerOfClinicalTrialSubjectReadingIDClinicalTrialTimePointIDClinicalTrialTimePointDescriptionLongitudinalTemporalOffsetFromEventLongitudinalTemporalEventTypeClinicalTrialTimePointTypeCodeSequenceIssuerOfClinicalTrialTimePointIDClinicalTrialCoordinatingCenterNamePatientIdentityRemovedDeidentificationMethodDeidentificationMethodCodeSequenceClinicalTrialSeriesIDClinicalTrialSeriesDescriptionIssuerOfClinicalTrialSeriesIDClinicalTrialProtocolEthicsCommitteeNameClinicalTrialProtocolEthicsCommitteeApprovalNumberConsentForClinicalTrialUseSequenceDistributionTypeConsentForDistributionFlagEthicsCommitteeApprovalEffectivenessStartDateEthicsCommitteeApprovalEffectivenessEndDateRETIRED_CADFileFormatRETIRED_ComponentReferenceSystemComponentManufacturingProcedureComponentManufacturerMaterialThicknessMaterialPipeDiameterMaterialIsolationDiameterMaterialGradeMaterialPropertiesDescriptionRETIRED_MaterialPropertiesFileFormatRetiredMaterialNotesComponentShapeCurvatureTypeOuterDiameterInnerDiameterComponentWelderIDsSecondaryApprovalStatusSecondaryReviewDateSecondaryReviewTimeSecondaryReviewerNameRepairIDMultipleComponentApprovalSequenceOtherApprovalStatusOtherSecondaryApprovalStatusDataElementLabelSequenceDataElementLabelItemSequenceDataElementDataElementNameDataElementDescriptionDataElementConditionalityDataElementMinimumCharactersDataElementMaximumCharactersActualEnvironmentalConditionsExpiryDateEnvironmentalConditionsEvaluatorSequenceEvaluatorNumberEvaluatorNameEvaluationAttemptIndicationSequenceIndicationNumberIndicationLabelIndicationDescriptionIndicationTypeIndicationDispositionIndicationROISequenceIndicationPhysicalPropertySequencePropertyLabelCoordinateSystemNumberOfAxesCoordinateSystemAxesSequenceCoordinateSystemAxisDescriptionCoordinateSystemDataSetMappingCoordinateSystemAxisNumberCoordinateSystemAxisTypeCoordinateSystemAxisUnitsCoordinateSystemAxisValuesCoordinateSystemTransformSequenceTransformDescriptionTransformNumberOfAxesTransformOrderOfAxesTransformedAxisUnitsCoordinateSystemTransformRotationAndScaleMatrixCoordinateSystemTransformTranslationMatrixInternalDetectorFrameTimeNumberOfFramesIntegratedDetectorTemperatureSequenceSensorNameHorizontalOffsetOfSensorVerticalOffsetOfSensorSensorTemperatureDarkCurrentSequenceDarkCurrentCountsGainCorrectionReferenceSequenceAirCountsKVUsedInGainCalibrationMAUsedInGainCalibrationNumberOfFramesUsedForIntegrationFilterMaterialUsedInGainCalibrationFilterThicknessUsedInGainCalibrationDateOfGainCalibrationTimeOfGainCalibrationBadPixelImageCalibrationNotesLinearityCorrectionTechniqueBeamHardeningCorrectionTechniquePulserEquipmentSequencePulserTypePulserNotesReceiverEquipmentSequenceAmplifierTypeReceiverNotesPreAmplifierEquipmentSequencePreAmplifierNotesTransmitTransducerSequenceReceiveTransducerSequenceNumberOfElementsElementShapeElementDimensionAElementDimensionBElementPitchAMeasuredBeamDimensionAMeasuredBeamDimensionBLocationOfMeasuredBeamDiameterNominalFrequencyMeasuredCenterFrequencyMeasuredBandwidthElementPitchBPulserSettingsSequencePulseWidthExcitationFrequencyModulationTypeDampingReceiverSettingsSequenceAcquiredSoundpathLengthAcquisitionCompressionTypeAcquisitionSampleSizeRectifierSmoothingDACSequenceDACTypeDACGainPointsDACTimePointsDACAmplitudePreAmplifierSettingsSequenceTransmitTransducerSettingsSequenceReceiveTransducerSettingsSequenceIncidentAngleCouplingTechniqueCouplingMediumCouplingVelocityProbeCenterLocationXProbeCenterLocationZSoundPathLengthDelayLawIdentifierGateSettingsSequenceGateThresholdVelocityOfSoundCalibrationSettingsSequenceCalibrationProcedureProcedureVersionProcedureCreationDateProcedureExpirationDateProcedureLastModifiedDateCalibrationTimeCalibrationDateProbeDriveEquipmentSequenceDriveTypeProbeDriveNotesDriveProbeSequenceProbeInductanceProbeResistanceReceiveProbeSequenceProbeDriveSettingsSequenceBridgeResistorsProbeOrientationAngleUserSelectedGainYUserSelectedPhaseUserSelectedOffsetXUserSelectedOffsetYChannelSettingsSequenceChannelThresholdScannerSettingsSequenceScanProcedureTranslationRateXTranslationRateYChannelOverlapImageQualityIndicatorTypeImageQualityIndicatorMaterialImageQualityIndicatorSizeLINACEnergyLINACOutputActiveApertureTotalApertureApertureElevationMainLobeAngleMainRoofAngleConnectorTypeWedgeModelNumberWedgeAngleFloatWedgeRoofAngleWedgeElement1PositionWedgeMaterialVelocityWedgeMaterialWedgeOffsetZWedgeOriginOffsetXWedgeTimeDelayWedgeNameWedgeManufacturerNameWedgeDescriptionNominalBeamAngleWedgeOffsetXWedgeOffsetYWedgeTotalLengthWedgeInContactLengthWedgeFrontGapWedgeTotalHeightWedgeFrontHeightWedgeRearHeightWedgeTotalWidthWedgeInContactWidthWedgeChamferHeightWedgeCurveRadiusAlongWedgeWhitePointPrimaryChromaticitiesBatteryLevelExposureTimeInSecondsFNumberOECFRowsOECFColumnsOECFColumnNamesOECFValuesSpatialFrequencyResponseRowsSpatialFrequencyResponseColumnsSpatialFrequencyResponseColumnNamesSpatialFrequencyResponseValuesColorFilterArrayPatternRowsColorFilterArrayPatternColumnsColorFilterArrayPatternValuesFlashFiringStatusFlashReturnStatusFlashModeFlashFunctionPresentFlashRedEyeModeExposureProgramSpectralSensitivityPhotographicSensitivitySelfTimerModeSensitivityTypeStandardOutputSensitivityRecommendedExposureIndexISOSpeedISOSpeedLatitudeyyyISOSpeedLatitudezzzEXIFVersionShutterSpeedValueApertureValueBrightnessValueExposureBiasValueMaxApertureValueSubjectDistanceMeteringModeLightSourceFocalLengthSubjectAreaMakerNoteTemperatureHumidityPressureWaterDepthAccelerationCameraElevationAngleFlashEnergySubjectLocationPhotographicExposureIndexSensingMethodFileSourceSceneTypeCustomRenderedExposureModeWhiteBalanceDigitalZoomRatioFocalLengthIn35mmFilmSceneCaptureTypeGainControlContrastSaturationSharpnessDeviceSettingDescriptionSubjectDistanceRangeCameraOwnerNameLensSpecificationLensMakeLensModelLensSerialNumberInteroperabilityIndexInteroperabilityVersionGPSVersionIDGPSLatitudeRefGPSLatitudeGPSLongitudeRefGPSLongitudeGPSAltitudeRefGPSAltitudeGPSTimeStampGPSSatellitesGPSStatusGPSMeasureModeGPSDOPGPSSpeedRefGPSSpeedGPSTrackRefGPSTrackGPSImgDirectionRefGPSImgDirectionGPSMapDatumGPSDestLatitudeRefGPSDestLatitudeGPSDestLongitudeRefGPSDestLongitudeGPSDestBearingRefGPSDestBearingGPSDestDistanceRefGPSDestDistanceGPSProcessingMethodGPSAreaInformationGPSDateStampGPSDifferentialLightSourcePolarizationEmitterColorTemperatureContactMethodImmersionMediaOpticalMagnificationFactorContrastBolusAgentContrastBolusAgentSequenceContrastBolusT1RelaxivityContrastBolusAdministrationRouteSequenceBodyPartExaminedScanningSequenceSequenceVariantScanOptionsMRAcquisitionTypeSequenceNameAngioFlagInterventionDrugInformationSequenceInterventionDrugStopTimeInterventionDrugDoseInterventionDrugCodeSequenceAdditionalDrugSequenceRETIRED_RadionuclideRadiopharmaceuticalRETIRED_EnergyWindowCenterlineRETIRED_EnergyWindowTotalWidthInterventionDrugNameInterventionDrugStartTimeInterventionSequenceRETIRED_TherapyTypeInterventionStatusRETIRED_TherapyDescriptionInterventionDescriptionCineRateInitialCineRunStateSliceThicknessKVPRETIRED_undefinedCountsAccumulatedAcquisitionTerminationConditionEffectiveDurationAcquisitionStartConditionAcquisitionStartConditionDataAcquisitionTerminationConditionDataRepetitionTimeEchoTimeInversionTimeNumberOfAveragesImagingFrequencyImagedNucleusEchoNumbersMagneticFieldStrengthSpacingBetweenSlicesNumberOfPhaseEncodingStepsDataCollectionDiameterEchoTrainLengthPercentSamplingPercentPhaseFieldOfViewPixelBandwidthDeviceSerialNumberDeviceUIDDeviceIDPlateIDGeneratorIDGridIDCassetteIDGantryIDUniqueDeviceIdentifierUDISequenceManufacturerDeviceClassUIDSecondaryCaptureDeviceIDRETIRED_HardcopyCreationDeviceIDDateOfSecondaryCaptureTimeOfSecondaryCaptureSecondaryCaptureDeviceManufacturerRETIRED_HardcopyDeviceManufacturerSecondaryCaptureDeviceManufacturerModelNameSecondaryCaptureDeviceSoftwareVersionsRETIRED_HardcopyDeviceSoftwareVersionRETIRED_HardcopyDeviceManufacturerModelNameSoftwareVersionsVideoImageFormatAcquiredDigitalImageFormatAcquiredProtocolNameContrastBolusRouteContrastBolusVolumeContrastBolusStartTimeContrastBolusStopTimeContrastBolusTotalDoseSyringeCountsContrastFlowRateContrastFlowDurationContrastBolusIngredientContrastBolusIngredientConcentrationSpatialResolutionTriggerTimeTriggerSourceOrTypeNominalIntervalFrameTimeCardiacFramingTypeFrameTimeVectorFrameDelayImageTriggerDelayMultiplexGroupTimeOffsetTriggerTimeOffsetSynchronizationTriggerSynchronizationChannelTriggerSamplePositionRadiopharmaceuticalRouteRadiopharmaceuticalVolumeRadiopharmaceuticalStartTimeRadiopharmaceuticalStopTimeRadionuclideTotalDoseRadionuclideHalfLifeRadionuclidePositronFractionRadiopharmaceuticalSpecificActivityRadiopharmaceuticalStartDateTimeRadiopharmaceuticalStopDateTimeBeatRejectionFlagLowRRValueHighRRValueIntervalsAcquiredIntervalsRejectedPVCRejectionSkipBeatsHeartRateCardiacNumberOfImagesTriggerWindowReconstructionDiameterDistanceSourceToDetectorDistanceSourceToPatientEstimatedRadiographicMagnificationFactorGantryDetectorTiltGantryDetectorSlewTableHeightTableTraverseTableMotionTableVerticalIncrementTableLateralIncrementTableLongitudinalIncrementTableAngleTableTypeRotationDirectionRETIRED_AngularPositionRadialPositionScanArcAngularStepCenterOfRotationOffsetRETIRED_RotationOffsetFieldOfViewShapeFieldOfViewDimensionsExposureTimeXRayTubeCurrentExposureExposureInuAsAveragePulseWidthRadiationSettingRectificationTypeRadiationModeImageAndFluoroscopyAreaDoseProductFilterTypeTypeOfFiltersIntensifierSizeImagerPixelSpacingGridGeneratorPowerCollimatorGridNameCollimatorTypeFocalDistanceXFocusCenterYFocusCenterFocalSpotsAnodeTargetMaterialBodyPartThicknessCompressionForceCompressionPressurePaddleDescriptionCompressionContactAreaAcquisitionModeDoseModeNameAcquiredSubtractionMaskFlagFluoroscopyPersistenceFlagFluoroscopyLastImageHoldPersistenceFlagUpperLimitNumberOfPersistentFluoroscopyFramesContrastBolusAutoInjectionTriggerFlagContrastBolusInjectionDelayXAAcquisitionPhaseDetailsSequenceXAAcquisitionFrameRateXAPlaneDetailsSequenceAcquisitionFieldOfViewLabelXRayFilterDetailsSequenceXAAcquisitionDurationReconstructionPipelineTypeImageFilterDetailsSequenceAppliedMaskSubtractionFlagRequestedSeriesDescriptionCodeSequenceDateOfLastCalibrationTimeOfLastCalibrationDateTimeOfLastCalibrationCalibrationDateTimeDateOfManufactureDateOfInstallationConvolutionKernelRETIRED_UpperLowerPixelValuesActualFrameDurationCountRatePreferredPlaybackSequencingReceiveCoilNameTransmitCoilNamePlateTypePhosphorTypeWaterEquivalentDiameterWaterEquivalentDiameterCalculationMethodCodeSequenceScanVelocityWholeBodyTechniqueScanLengthAcquisitionMatrixInPlanePhaseEncodingDirectionFlipAngleVariableFlipAngleFlagSARdBdtB1rmsAcquisitionDeviceProcessingDescriptionAcquisitionDeviceProcessingCodeCassetteOrientationCassetteSizeExposuresOnPlateRelativeXRayExposureExposureIndexTargetExposureIndexDeviationIndexColumnAngulationTomoLayerHeightTomoAngleTomoTimeTomoTypeTomoClassNumberOfTomosynthesisSourceImagesPositionerMotionPositionerTypePositionerPrimaryAnglePositionerSecondaryAnglePositionerPrimaryAngleIncrementPositionerSecondaryAngleIncrementDetectorPrimaryAngleDetectorSecondaryAngleShutterShapeShutterLeftVerticalEdgeShutterRightVerticalEdgeShutterUpperHorizontalEdgeShutterLowerHorizontalEdgeCenterOfCircularShutterRadiusOfCircularShutterVerticesOfThePolygonalShutterShutterPresentationValueShutterOverlayGroupShutterPresentationColorCIELabValueOutlineShapeTypeOutlineLeftVerticalEdgeOutlineRightVerticalEdgeOutlineUpperHorizontalEdgeOutlineLowerHorizontalEdgeCenterOfCircularOutlineDiameterOfCircularOutlineNumberOfPolygonalVerticesVerticesOfThePolygonalOutlineCollimatorShapeCollimatorLeftVerticalEdgeCollimatorRightVerticalEdgeCollimatorUpperHorizontalEdgeCollimatorLowerHorizontalEdgeCenterOfCircularCollimatorRadiusOfCircularCollimatorVerticesOfThePolygonalCollimatorAcquisitionTimeSynchronizedTimeSourceTimeDistributionProtocolNTPSourceAddressPageNumberVectorFrameLabelVectorFramePrimaryAngleVectorFrameSecondaryAngleVectorSliceLocationVectorDisplayWindowLabelVectorNominalScannedPixelSpacingDigitizingDeviceTransportDirectionRotationOfScannedFilmBiopsyTargetSequenceTargetUIDLocalizingCursorPositionCalculatedTargetPositionTargetLabelDisplayedZValueIVUSAcquisitionIVUSPullbackRateIVUSGatedRateIVUSPullbackStartFrameNumberIVUSPullbackStopFrameNumberLesionNumberRETIRED_AcquisitionCommentsOutputPowerTransducerDataTransducerIdentificationSequenceFocusDepthProcessingFunctionRETIRED_PostprocessingFunctionMechanicalIndexBoneThermalIndexCranialThermalIndexSoftTissueThermalIndexSoftTissueFocusThermalIndexSoftTissueSurfaceThermalIndexRETIRED_DynamicRangeRETIRED_TotalGainDepthOfScanFieldPatientPositionViewPositionProjectionEponymousNameCodeSequenceRETIRED_ImageTransformationMatrixRETIRED_ImageTranslationVectorSensitivitySequenceOfUltrasoundRegionsRegionSpatialFormatRegionDataTypeRegionFlagsRegionLocationMinX0RegionLocationMinY0RegionLocationMaxX1RegionLocationMaxY1ReferencePixelX0ReferencePixelY0PhysicalUnitsXDirectionPhysicalUnitsYDirectionReferencePixelPhysicalValueXReferencePixelPhysicalValueYPhysicalDeltaXPhysicalDeltaYTransducerFrequencyTransducerTypePulseRepetitionFrequencyDopplerCorrectionAngleSteeringAngleRETIRED_DopplerSampleVolumeXPositionRetiredDopplerSampleVolumeXPositionRETIRED_DopplerSampleVolumeYPositionRetiredDopplerSampleVolumeYPositionRETIRED_TMLinePositionX0RetiredTMLinePositionX0RETIRED_TMLinePositionY0RetiredTMLinePositionY0RETIRED_TMLinePositionX1RetiredTMLinePositionX1RETIRED_TMLinePositionY1RetiredTMLinePositionY1PixelComponentOrganizationPixelComponentMaskPixelComponentRangeStartPixelComponentRangeStopPixelComponentPhysicalUnitsPixelComponentDataTypeNumberOfTableBreakPointsTableOfXBreakPointsTableOfYBreakPointsNumberOfTableEntriesTableOfPixelValuesTableOfParameterValuesRWaveTimeVectorActiveImageAreaOverlayGroupDetectorConditionsNominalFlagDetectorTemperatureDetectorTypeDetectorConfigurationDetectorDescriptionDetectorModeDetectorIDDateOfLastDetectorCalibrationTimeOfLastDetectorCalibrationExposuresOnDetectorSinceLastCalibrationExposuresOnDetectorSinceManufacturedDetectorTimeSinceLastExposureDetectorActiveTimeDetectorActivationOffsetFromExposureDetectorBinningDetectorElementPhysicalSizeDetectorElementSpacingDetectorActiveShapeDetectorActiveDimensionsDetectorActiveOriginDetectorManufacturerNameDetectorManufacturerModelNameFieldOfViewOriginFieldOfViewRotationFieldOfViewHorizontalFlipPixelDataAreaOriginRelativeToFOVPixelDataAreaRotationAngleRelativeToFOVGridAbsorbingMaterialGridSpacingMaterialGridThicknessGridPitchGridAspectRatioGridPeriodGridFocalDistanceFilterMaterialFilterThicknessMinimumFilterThicknessMaximumFilterBeamPathLengthMinimumFilterBeamPathLengthMaximumExposureControlModeExposureControlModeDescriptionExposureStatusPhototimerSettingExposureTimeInuSXRayTubeCurrentInuAContentQualificationPulseSequenceNameMRImagingModifierSequenceEchoPulseSequenceInversionRecoveryFlowCompensationMultipleSpinEchoMultiPlanarExcitationPhaseContrastTimeOfFlightContrastSpoilingSteadyStatePulseSequenceEchoPlanarPulseSequenceTagAngleFirstAxisMagnetizationTransferT2PreparationBloodSignalNullingSaturationRecoverySpectrallySelectedSuppressionSpectrallySelectedExcitationSpatialPresaturationTaggingOversamplingPhaseTagSpacingFirstDimensionGeometryOfKSpaceTraversalSegmentedKSpaceTraversalRectilinearPhaseEncodeReorderingTagThicknessPartialFourierDirectionCardiacSynchronizationTechniqueReceiveCoilManufacturerNameMRReceiveCoilSequenceReceiveCoilTypeQuadratureReceiveCoilMultiCoilDefinitionSequenceMultiCoilConfigurationMultiCoilElementNameMultiCoilElementUsedMRTransmitCoilSequenceTransmitCoilManufacturerNameTransmitCoilTypeSpectralWidthChemicalShiftReferenceVolumeLocalizationTechniqueMRAcquisitionFrequencyEncodingStepsDecouplingDecoupledNucleusDecouplingFrequencyDecouplingMethodDecouplingChemicalShiftReferenceKSpaceFilteringTimeDomainFilteringNumberOfZeroFillsBaselineCorrectionParallelReductionFactorInPlaneCardiacRRIntervalSpecifiedAcquisitionDurationFrameAcquisitionDateTimeDiffusionDirectionalityDiffusionGradientDirectionSequenceParallelAcquisitionParallelAcquisitionTechniqueInversionTimesMetaboliteMapDescriptionPartialFourierEffectiveEchoTimeMetaboliteMapCodeSequenceChemicalShiftSequenceCardiacSignalSourceDiffusionBValueDiffusionGradientOrientationVelocityEncodingDirectionVelocityEncodingMinimumValueVelocityEncodingAcquisitionSequenceNumberOfKSpaceTrajectoriesCoverageOfKSpaceSpectroscopyAcquisitionPhaseRowsRETIRED_ParallelReductionFactorInPlaneRetiredTransmitterFrequencyResonantNucleusFrequencyCorrectionMRSpectroscopyFOVGeometrySequenceSlabThicknessSlabOrientationMidSlabPositionMRSpatialSaturationSequenceMRTimingAndRelatedParametersSequenceMREchoSequenceMRModifierSequenceMRDiffusionSequenceCardiacSynchronizationSequenceMRAveragesSequenceMRFOVGeometrySequenceVolumeLocalizationSequenceSpectroscopyAcquisitionDataColumnsDiffusionAnisotropyTypeFrameReferenceDateTimeMRMetaboliteMapSequenceParallelReductionFactorOutOfPlaneSpectroscopyAcquisitionOutOfPlanePhaseStepsRETIRED_BulkMotionStatusParallelReductionFactorSecondInPlaneCardiacBeatRejectionTechniqueRespiratoryMotionCompensationTechniqueRespiratorySignalSourceBulkMotionCompensationTechniqueBulkMotionSignalSourceApplicableSafetyStandardAgencyApplicableSafetyStandardDescriptionOperatingModeSequenceOperatingModeTypeOperatingModeSpecificAbsorptionRateDefinitionGradientOutputTypeSpecificAbsorptionRateValueGradientOutputFlowCompensationDirectionTaggingDelayRespiratoryMotionCompensationTechniqueDescriptionRespiratorySignalSourceIDRETIRED_ChemicalShiftMinimumIntegrationLimitInHzRETIRED_ChemicalShiftMaximumIntegrationLimitInHzMRVelocityEncodingSequenceFirstOrderPhaseCorrectionWaterReferencedPhaseCorrectionMRSpectroscopyAcquisitionTypeRespiratoryCyclePositionVelocityEncodingMaximumValueTagSpacingSecondDimensionTagAngleSecondAxisFrameAcquisitionDurationMRImageFrameTypeSequenceMRSpectroscopyFrameTypeSequenceMRAcquisitionPhaseEncodingStepsInPlaneMRAcquisitionPhaseEncodingStepsOutOfPlaneSpectroscopyAcquisitionPhaseColumnsCardiacCyclePositionSpecificAbsorptionRateSequenceRFEchoTrainLengthGradientEchoTrainLengthArterialSpinLabelingContrastMRArterialSpinLabelingSequenceASLTechniqueDescriptionASLSlabNumberASLSlabThicknessASLSlabOrientationASLMidSlabPositionASLContextASLPulseTrainDurationASLCrusherFlagASLCrusherFlowLimitASLCrusherDescriptionASLBolusCutoffFlagASLBolusCutoffTimingSequenceASLBolusCutoffTechniqueASLBolusCutoffDelayTimeASLSlabSequenceChemicalShiftMinimumIntegrationLimitInppmChemicalShiftMaximumIntegrationLimitInppmWaterReferenceAcquisitionEchoPeakPositionCTAcquisitionTypeSequenceAcquisitionTypeTubeAngleCTAcquisitionDetailsSequenceRevolutionTimeSingleCollimationWidthTotalCollimationWidthCTTableDynamicsSequenceTableSpeedTableFeedPerRotationSpiralPitchFactorCTGeometrySequenceDataCollectionCenterPatientCTReconstructionSequenceReconstructionAlgorithmConvolutionKernelGroupReconstructionFieldOfViewReconstructionTargetCenterPatientReconstructionAngleImageFilterCTExposureSequenceReconstructionPixelSpacingExposureModulationTypeEstimatedDoseSavingCTXRayDetailsSequenceCTPositionSequenceTablePositionExposureTimeInmsCTImageFrameTypeSequenceXRayTubeCurrentInmAExposureInmAsConstantVolumeFlagFluoroscopyFlagDistanceSourceToDataCollectionCenterContrastBolusAgentNumberContrastBolusIngredientCodeSequenceContrastAdministrationProfileSequenceContrastBolusUsageSequenceContrastBolusAgentAdministeredContrastBolusAgentDetectedContrastBolusAgentPhaseCTDIvolCTDIPhantomTypeCodeSequenceCalciumScoringMassFactorPatientCalciumScoringMassFactorDeviceEnergyWeightingFactorCTAdditionalXRaySourceSequenceMultienergyCTAcquisitionMultienergyCTAcquisitionSequenceMultienergyCTProcessingSequenceMultienergyCTCharacteristicsSequenceMultienergyCTXRaySourceSequenceXRaySourceIndexXRaySourceIDMultienergySourceTechniqueSourceStartDateTimeSourceEndDateTimeSwitchingPhaseNumberSwitchingPhaseNominalDurationSwitchingPhaseTransitionDurationEffectiveBinEnergyMultienergyCTXRayDetectorSequenceXRayDetectorIndexXRayDetectorIDMultienergyDetectorTypeXRayDetectorLabelNominalMaxEnergyNominalMinEnergyReferencedXRayDetectorIndexReferencedXRaySourceIndexReferencedPathIndexMultienergyCTPathSequenceMultienergyCTPathIndexMultienergyAcquisitionDescriptionMonoenergeticEnergyEquivalentMaterialCodeSequenceDecompositionMethodDecompositionDescriptionDecompositionAlgorithmIdentificationSequenceDecompositionMaterialSequenceMaterialAttenuationSequencePhotonEnergyXRayMassAttenuationCoefficientProjectionPixelCalibrationSequenceDistanceSourceToIsocenterDistanceObjectToTableTopObjectPixelSpacingInCenterOfBeamPositionerPositionSequenceTablePositionSequenceCollimatorShapeSequencePlanesInAcquisitionXAXRFFrameCharacteristicsSequenceFrameAcquisitionSequenceXRayReceptorTypeAcquisitionProtocolNameAcquisitionProtocolDescriptionContrastBolusIngredientOpaqueDistanceReceptorPlaneToDetectorHousingIntensifierActiveShapeIntensifierActiveDimensionsPhysicalDetectorSizePositionOfIsocenterProjectionFieldOfViewSequenceFieldOfViewDescriptionExposureControlSensingRegionsSequenceExposureControlSensingRegionShapeExposureControlSensingRegionLeftVerticalEdgeExposureControlSensingRegionRightVerticalEdgeExposureControlSensingRegionUpperHorizontalEdgeExposureControlSensingRegionLowerHorizontalEdgeCenterOfCircularExposureControlSensingRegionRadiusOfCircularExposureControlSensingRegionVerticesOfThePolygonalExposureControlSensingRegionColumnAngulationPatientBeamAngleFrameDetectorParametersSequenceCalculatedAnatomyThicknessCalibrationSequenceObjectThicknessSequencePlaneIdentificationFieldOfViewDimensionsInFloatIsocenterReferenceSystemSequencePositionerIsocenterPrimaryAnglePositionerIsocenterSecondaryAnglePositionerIsocenterDetectorRotationAngleTableXPositionToIsocenterTableYPositionToIsocenterTableZPositionToIsocenterTableHorizontalRotationAngleTableHeadTiltAngleTableCradleTiltAngleFrameDisplayShutterSequenceAcquiredImageAreaDoseProductCArmPositionerTabletopRelationshipXRayGeometrySequenceIrradiationEventIdentificationSequenceXRay3DFrameTypeSequenceContributingSourcesSequenceXRay3DAcquisitionSequencePrimaryPositionerScanArcSecondaryPositionerScanArcPrimaryPositionerScanStartAngleSecondaryPositionerScanStartAnglePrimaryPositionerIncrementSecondaryPositionerIncrementStartAcquisitionDateTimeEndAcquisitionDateTimePrimaryPositionerIncrementSignSecondaryPositionerIncrementSignApplicationNameApplicationVersionApplicationManufacturerAlgorithmTypeAlgorithmDescriptionXRay3DReconstructionSequenceReconstructionDescriptionPerProjectionAcquisitionSequenceDetectorPositionSequenceXRayAcquisitionDoseSequenceXRaySourceIsocenterPrimaryAngleXRaySourceIsocenterSecondaryAngleBreastSupportIsocenterPrimaryAngleBreastSupportIsocenterSecondaryAngleBreastSupportXPositionToIsocenterBreastSupportYPositionToIsocenterBreastSupportZPositionToIsocenterDetectorIsocenterPrimaryAngleDetectorIsocenterSecondaryAngleDetectorXPositionToIsocenterDetectorYPositionToIsocenterDetectorZPositionToIsocenterXRayGridSequenceXRayFilterSequenceDetectorActiveAreaTLHCPositionDetectorActiveAreaOrientationPositionerPrimaryAngleDirectionDiffusionBMatrixSequenceDiffusionBValueXXDiffusionBValueXYDiffusionBValueXZDiffusionBValueYYDiffusionBValueYZDiffusionBValueZZFunctionalMRSequenceFunctionalSettlingPhaseFramesPresentFunctionalSyncPulseSettlingPhaseFrameDecayCorrectionDateTimeStartDensityThresholdStartRelativeDensityDifferenceThresholdStartCardiacTriggerCountThresholdStartRespiratoryTriggerCountThresholdTerminationCountsThresholdTerminationDensityThresholdTerminationRelativeDensityThresholdTerminationTimeThresholdTerminationCardiacTriggerCountThresholdTerminationRespiratoryTriggerCountThresholdDetectorGeometryTransverseDetectorSeparationAxialDetectorDimensionRadiopharmaceuticalAgentNumberPETFrameAcquisitionSequencePETDetectorMotionDetailsSequencePETTableDynamicsSequencePETPositionSequencePETFrameCorrectionFactorsSequenceRadiopharmaceuticalUsageSequenceAttenuationCorrectionSourceNumberOfIterationsNumberOfSubsetsPETReconstructionSequencePETFrameTypeSequenceTimeOfFlightInformationUsedReconstructionTypeDecayCorrectedAttenuationCorrectedScatterCorrectedDeadTimeCorrectedGantryMotionCorrectedPatientMotionCorrectedCountLossNormalizationCorrectedRandomsCorrectedNonUniformRadialSamplingCorrectedSensitivityCalibratedDetectorNormalizationCorrectionIterativeReconstructionMethodAttenuationCorrectionTemporalRelationshipPatientPhysiologicalStateSequencePatientPhysiologicalStateCodeSequenceDepthsOfFocusExcludedIntervalsSequenceExclusionStartDateTimeExclusionDurationUSImageDescriptionSequenceImageDataTypeSequenceDataTypeTransducerScanPatternCodeSequenceAliasedDataTypePositionMeasuringDeviceUsedTransducerGeometryCodeSequenceTransducerBeamSteeringCodeSequenceTransducerApplicationCodeSequenceZeroVelocityPixelValuePhotoacousticExcitationCharacteristicsSequenceExcitationSpectralWidthExcitationEnergyExcitationPulseDurationExcitationWavelengthSequenceExcitationWavelengthIlluminationTranslationFlagAcousticCouplingMediumFlagAcousticCouplingMediumCodeSequenceAcousticCouplingMediumTemperatureTransducerResponseSequenceCenterFrequencyFractionalBandwidthLowerCutoffFrequencyUpperCutoffFrequencyTransducerTechnologySequenceSoundSpeedCorrectionMechanismCodeSequenceObjectSoundSpeedAcousticCouplingMediumSoundSpeedPhotoacousticImageFrameTypeSequenceImageDataTypeCodeSequenceReferenceLocationLabelReferenceLocationDescriptionReferenceBasisCodeSequenceReferenceGeometryCodeSequenceOffsetDistanceOffsetDirectionPotentialScheduledProtocolCodeSequencePotentialRequestedProcedureCodeSequencePotentialReasonsForProcedurePotentialReasonsForProcedureCodeSequencePotentialDiagnosticTasksContraindicationsCodeSequenceReferencedDefinedProtocolSequenceReferencedPerformedProtocolSequencePredecessorProtocolSequenceProtocolPlanningInformationProtocolDesignRationalePatientSpecificationSequenceModelSpecificationSequenceParametersSpecificationSequenceInstructionSequenceInstructionIndexInstructionTextInstructionDescriptionInstructionPerformedFlagInstructionPerformedDateTimeInstructionPerformanceCommentPatientPositioningInstructionSequencePositioningMethodCodeSequencePositioningLandmarkSequenceTargetFrameOfReferenceUIDAcquisitionProtocolElementSpecificationSequenceAcquisitionProtocolElementSequenceProtocolElementNumberProtocolElementNameProtocolElementCharacteristicsSummaryProtocolElementPurposeAcquisitionMotionAcquisitionStartLocationSequenceAcquisitionEndLocationSequenceReconstructionProtocolElementSpecificationSequenceReconstructionProtocolElementSequenceStorageProtocolElementSpecificationSequenceStorageProtocolElementSequenceRequestedSeriesDescriptionSourceAcquisitionProtocolElementNumberSourceAcquisitionBeamNumberSourceReconstructionProtocolElementNumberReconstructionStartLocationSequenceReconstructionEndLocationSequenceReconstructionAlgorithmSequenceReconstructionTargetCenterLocationSequenceImageFilterDescriptionCTDIvolNotificationTriggerDLPNotificationTriggerAutoKVPSelectionTypeAutoKVPUpperBoundAutoKVPLowerBoundProtocolDefinedPatientPositionContributingEquipmentSequenceContributionDateTimeContributionDescriptionStudyInstanceUIDSeriesInstanceUIDStudyIDSeriesNumberAcquisitionNumberInstanceNumberRETIRED_IsotopeNumberRETIRED_PhaseNumberRETIRED_IntervalNumberRETIRED_TimeSlotNumberRETIRED_AngleNumberItemNumberPatientOrientationRETIRED_OverlayNumberRETIRED_CurveNumberRETIRED_LUTNumberPyramidLabelRETIRED_ImagePositionImagePositionPatientRETIRED_ImageOrientationImageOrientationPatientRETIRED_LocationFrameOfReferenceUIDLateralityImageLateralityRETIRED_ImageGeometryTypeRETIRED_MaskingImageRETIRED_ReportNumberTemporalPositionIdentifierNumberOfTemporalPositionsTemporalResolutionSynchronizationFrameOfReferenceUIDSOPInstanceUIDOfConcatenationSourceRETIRED_SeriesInStudyRETIRED_AcquisitionsInSeriesImagesInAcquisitionRETIRED_ImagesInSeriesRETIRED_AcquisitionsInStudyRETIRED_ImagesInStudyRETIRED_ReferenceTargetPositionReferenceIndicatorPositionReferenceIndicatorSliceLocationRETIRED_OtherStudyNumbersNumberOfPatientRelatedStudiesNumberOfPatientRelatedSeriesNumberOfPatientRelatedInstancesNumberOfStudyRelatedSeriesNumberOfStudyRelatedInstancesNumberOfSeriesRelatedInstancesRETIRED_ModifyingDeviceIDRETIRED_ModifiedImageIDRETIRED_ModifiedImageDateRETIRED_ModifyingDeviceManufacturerRETIRED_ModifiedImageTimeRETIRED_ModifiedImageDescriptionImageCommentsRETIRED_OriginalImageIdentificationRETIRED_OriginalImageIdentificationNomenclatureStackIDInStackPositionNumberFrameAnatomySequenceFrameLateralityFrameContentSequencePlanePositionSequencePlaneOrientationSequenceTemporalPositionIndexNominalCardiacTriggerDelayTimeNominalCardiacTriggerTimePriorToRPeakActualCardiacTriggerTimePriorToRPeakFrameAcquisitionNumberDimensionIndexValuesFrameCommentsConcatenationUIDInConcatenationNumberInConcatenationTotalNumberDimensionOrganizationUIDDimensionIndexPointerFunctionalGroupPointerUnassignedSharedConvertedAttributesSequenceUnassignedPerFrameConvertedAttributesSequenceConversionSourceAttributesSequenceDimensionIndexPrivateCreatorDimensionOrganizationSequenceDimensionIndexSequenceConcatenationFrameOffsetNumberFunctionalGroupPrivateCreatorNominalPercentageOfCardiacPhaseNominalPercentageOfRespiratoryPhaseStartingRespiratoryAmplitudeStartingRespiratoryPhaseEndingRespiratoryAmplitudeEndingRespiratoryPhaseRespiratoryTriggerTypeRRIntervalTimeNominalActualCardiacTriggerDelayTimeRespiratorySynchronizationSequenceRespiratoryIntervalTimeNominalRespiratoryTriggerDelayTimeRespiratoryTriggerDelayThresholdActualRespiratoryTriggerDelayTimeImagePositionVolumeImageOrientationVolumeUltrasoundAcquisitionGeometryApexPositionVolumeToTransducerMappingMatrixVolumeToTableMappingMatrixVolumeToTransducerRelationshipPatientFrameOfReferenceSourceTemporalPositionTimeOffsetPlanePositionVolumeSequencePlaneOrientationVolumeSequenceTemporalPositionSequenceDimensionOrganizationTypeVolumeFrameOfReferenceUIDTableFrameOfReferenceUIDDimensionDescriptionLabelPatientOrientationInFrameSequenceFrameLabelAcquisitionIndexContributingSOPInstancesReferenceSequenceReconstructionIndexLightPathFilterPassThroughWavelengthLightPathFilterPassBandImagePathFilterPassThroughWavelengthImagePathFilterPassBandPatientEyeMovementCommandedPatientEyeMovementCommandCodeSequenceSphericalLensPowerCylinderLensPowerCylinderAxisEmmetropicMagnificationIntraOcularPressureHorizontalFieldOfViewPupilDilatedDegreeOfDilationVertexDistanceStereoBaselineAngleStereoBaselineDisplacementStereoHorizontalPixelOffsetStereoVerticalPixelOffsetStereoRotationAcquisitionDeviceTypeCodeSequenceIlluminationTypeCodeSequenceLightPathFilterTypeStackCodeSequenceImagePathFilterTypeStackCodeSequenceLensesCodeSequenceChannelDescriptionCodeSequenceRefractiveStateSequenceMydriaticAgentCodeSequenceRelativeImagePositionCodeSequenceCameraAngleOfViewStereoPairsSequenceLeftImageSequenceRightImageSequenceStereoPairsPresentAxialLengthOfTheEyeOphthalmicFrameLocationSequenceReferenceCoordinatesDepthSpatialResolutionMaximumDepthDistortionAlongScanSpatialResolutionMaximumAlongScanDistortionOphthalmicImageOrientationDepthOfTransverseImageMydriaticAgentConcentrationUnitsSequenceAcrossScanSpatialResolutionMaximumAcrossScanDistortionMydriaticAgentConcentrationIlluminationWaveLengthIlluminationPowerIlluminationBandwidthMydriaticAgentSequenceOphthalmicAxialMeasurementsRightEyeSequenceOphthalmicAxialMeasurementsLeftEyeSequenceOphthalmicAxialMeasurementsDeviceTypeOphthalmicAxialLengthMeasurementsTypeOphthalmicAxialLengthSequenceOphthalmicAxialLengthLensStatusCodeSequenceVitreousStatusCodeSequenceIOLFormulaCodeSequenceIOLFormulaDetailKeratometerIndexSourceOfOphthalmicAxialLengthCodeSequenceSourceOfCornealSizeDataCodeSequenceTargetRefractionRefractiveProcedureOccurredRefractiveSurgeryTypeCodeSequenceOphthalmicUltrasoundMethodCodeSequenceSurgicallyInducedAstigmatismSequenceTypeOfOpticalCorrectionToricIOLPowerSequencePredictedToricErrorSequencePreSelectedForImplantationToricIOLPowerForExactEmmetropiaSequenceToricIOLPowerForExactTargetRefractionSequenceOphthalmicAxialLengthMeasurementsSequenceIOLPowerPredictedRefractiveErrorOphthalmicAxialLengthVelocityLensStatusDescriptionVitreousStatusDescriptionIOLPowerSequenceLensConstantSequenceIOLManufacturerRETIRED_LensConstantDescriptionImplantNameKeratometryMeasurementTypeCodeSequenceImplantPartNumberReferencedOphthalmicAxialMeasurementsSequenceOphthalmicAxialLengthMeasurementsSegmentNameCodeSequenceRefractiveErrorBeforeRefractiveSurgeryCodeSequenceIOLPowerForExactEmmetropiaIOLPowerForExactTargetRefractionAnteriorChamberDepthDefinitionCodeSequenceLensThicknessSequenceAnteriorChamberDepthSequenceCalculationCommentSequenceCalculationCommentTypeCalculationCommentLensThicknessAnteriorChamberDepthSourceOfLensThicknessDataCodeSequenceSourceOfAnteriorChamberDepthDataCodeSequenceSourceOfRefractiveMeasurementsSequenceSourceOfRefractiveMeasurementsCodeSequenceOphthalmicAxialLengthMeasurementModifiedOphthalmicAxialLengthDataSourceCodeSequenceRETIRED_OphthalmicAxialLengthAcquisitionMethodCodeSequenceSignalToNoiseRatioOphthalmicAxialLengthDataSourceDescriptionOphthalmicAxialLengthMeasurementsTotalLengthSequenceOphthalmicAxialLengthMeasurementsSegmentalLengthSequenceOphthalmicAxialLengthMeasurementsLengthSummationSequenceUltrasoundOphthalmicAxialLengthMeasurementsSequenceOpticalOphthalmicAxialLengthMeasurementsSequenceUltrasoundSelectedOphthalmicAxialLengthSequenceOphthalmicAxialLengthSelectionMethodCodeSequenceOpticalSelectedOphthalmicAxialLengthSequenceSelectedSegmentalOphthalmicAxialLengthSequenceSelectedTotalOphthalmicAxialLengthSequenceOphthalmicAxialLengthQualityMetricSequenceRETIRED_OphthalmicAxialLengthQualityMetricTypeCodeSequenceRETIRED_OphthalmicAxialLengthQualityMetricTypeDescriptionIntraocularLensCalculationsRightEyeSequenceIntraocularLensCalculationsLeftEyeSequenceReferencedOphthalmicAxialLengthMeasurementQCImageSequenceOphthalmicMappingDeviceTypeAcquisitionMethodCodeSequenceAcquisitionMethodAlgorithmSequenceOphthalmicThicknessMapTypeCodeSequenceOphthalmicThicknessMappingNormalsSequenceRetinalThicknessDefinitionCodeSequencePixelValueMappingToCodedConceptSequenceMappedPixelValuePixelValueMappingExplanationOphthalmicThicknessMapQualityThresholdSequenceOphthalmicThicknessMapThresholdQualityRatingAnatomicStructureReferencePointRegistrationToLocalizerSequenceRegisteredLocalizerUnitsRegisteredLocalizerTopLeftHandCornerRegisteredLocalizerBottomRightHandCornerOphthalmicThicknessMapQualityRatingSequenceRelevantOPTAttributesSequenceTransformationMethodCodeSequenceTransformationAlgorithmSequenceOphthalmicAxialLengthMethodOphthalmicFOVTwoDimensionalToThreeDimensionalMapSequenceWideFieldOphthalmicPhotographyQualityRatingSequenceWideFieldOphthalmicPhotographyQualityThresholdSequenceWideFieldOphthalmicPhotographyThresholdQualityRatingXCoordinatesCenterPixelViewAngleYCoordinatesCenterPixelViewAngleNumberOfMapPointsTwoDimensionalToThreeDimensionalMapDataDerivationAlgorithmSequenceOphthalmicImageTypeCodeSequenceOphthalmicImageTypeDescriptionScanPatternTypeCodeSequenceReferencedSurfaceMeshIdentificationSequenceOphthalmicVolumetricPropertiesFlagOphthalmicAnatomicReferencePointXCoordinateOphthalmicAnatomicReferencePointYCoordinateOphthalmicEnFaceImageQualityRatingSequenceQualityThresholdOCTBscanAnalysisAcquisitionParametersSequenceNumberofBscansPerFrameBscanSlabThicknessDistanceBetweenBscanSlabsBscanCycleTimeBscanCycleTimeVectorAscanRateBscanRateSurfaceMeshZPixelOffsetVisualFieldHorizontalExtentVisualFieldVerticalExtentVisualFieldShapeScreeningTestModeCodeSequenceMaximumStimulusLuminanceBackgroundLuminanceStimulusColorCodeSequenceBackgroundIlluminationColorCodeSequenceStimulusAreaStimulusPresentationTimeFixationSequenceFixationMonitoringCodeSequenceVisualFieldCatchTrialSequenceFixationCheckedQuantityPatientNotProperlyFixatedQuantityPresentedVisualStimuliDataFlagNumberOfVisualStimuliExcessiveFixationLossesDataFlagExcessiveFixationLossesStimuliRetestingQuantityCommentsOnPatientPerformanceOfVisualFieldFalseNegativesEstimateFlagFalseNegativesEstimateNegativeCatchTrialsQuantityFalseNegativesQuantityExcessiveFalseNegativesDataFlagExcessiveFalseNegativesFalsePositivesEstimateFlagFalsePositivesEstimateCatchTrialsDataFlagPositiveCatchTrialsQuantityTestPointNormalsDataFlagTestPointNormalsSequenceGlobalDeviationProbabilityNormalsFlagFalsePositivesQuantityExcessiveFalsePositivesDataFlagExcessiveFalsePositivesVisualFieldTestNormalsFlagResultsNormalsSequenceAgeCorrectedSensitivityDeviationAlgorithmSequenceGlobalDeviationFromNormalGeneralizedDefectSensitivityDeviationAlgorithmSequenceLocalizedDeviationFromNormalPatientReliabilityIndicatorVisualFieldMeanSensitivityGlobalDeviationProbabilityLocalDeviationProbabilityNormalsFlagLocalizedDeviationProbabilityShortTermFluctuationCalculatedShortTermFluctuationShortTermFluctuationProbabilityCalculatedShortTermFluctuationProbabilityCorrectedLocalizedDeviationFromNormalCalculatedCorrectedLocalizedDeviationFromNormalCorrectedLocalizedDeviationFromNormalProbabilityCalculatedCorrectedLocalizedDeviationFromNormalProbabilityGlobalDeviationProbabilitySequenceLocalizedDeviationProbabilitySequenceFovealSensitivityMeasuredFovealSensitivityVisualFieldTestDurationVisualFieldTestPointSequenceVisualFieldTestPointXCoordinateVisualFieldTestPointYCoordinateAgeCorrectedSensitivityDeviationValueStimulusResultsSensitivityValueRetestStimulusSeenRetestSensitivityValueVisualFieldTestPointNormalsSequenceQuantifiedDefectAgeCorrectedSensitivityDeviationProbabilityValueGeneralizedDefectCorrectedSensitivityDeviationFlagGeneralizedDefectCorrectedSensitivityDeviationValueGeneralizedDefectCorrectedSensitivityDeviationProbabilityValueMinimumSensitivityValueBlindSpotLocalizedBlindSpotXCoordinateBlindSpotYCoordinateVisualAcuityMeasurementSequenceRefractiveParametersUsedOnPatientSequenceMeasurementLateralityOphthalmicPatientClinicalInformationLeftEyeSequenceOphthalmicPatientClinicalInformationRightEyeSequenceFovealPointNormativeDataFlagFovealPointProbabilityValueScreeningBaselineMeasuredScreeningBaselineMeasuredSequenceScreeningBaselineTypeScreeningBaselineValueAlgorithmSourceDataSetNameDataSetVersionDataSetSourceDataSetDescriptionVisualFieldTestReliabilityGlobalIndexSequenceVisualFieldGlobalResultsIndexSequenceDataObservationSequenceIndexNormalsFlagIndexProbabilityIndexProbabilitySequenceSamplesPerPixelSamplesPerPixelUsedPhotometricInterpretationRETIRED_ImageDimensionsPlanarConfigurationNumberOfFramesFrameIncrementPointerFrameDimensionPointerRowsColumnsRETIRED_PlanesUltrasoundColorDataPresentPixelSpacingZoomFactorZoomCenterPixelAspectRatioRETIRED_ImageFormatRETIRED_ManipulatedImageCorrectedImageRETIRED_CompressionRecognitionCodeRETIRED_CompressionCodeRETIRED_CompressionOriginatorRETIRED_CompressionLabelRETIRED_CompressionDescriptionRETIRED_CompressionSequenceRETIRED_CompressionStepPointersRETIRED_RepeatIntervalRETIRED_BitsGroupedRETIRED_PerimeterTableRETIRED_PerimeterValueRETIRED_PredictorRowsRETIRED_PredictorColumnsRETIRED_PredictorConstantsRETIRED_BlockedPixelsRETIRED_BlockRowsRETIRED_BlockColumnsRETIRED_RowOverlapRETIRED_ColumnOverlapBitsAllocatedBitsStoredHighBitPixelRepresentationRETIRED_SmallestValidPixelValueRETIRED_LargestValidPixelValueSmallestImagePixelValueLargestImagePixelValueSmallestPixelValueInSeriesLargestPixelValueInSeriesRETIRED_SmallestImagePixelValueInPlaneRETIRED_LargestImagePixelValueInPlanePixelPaddingValuePixelPaddingRangeLimitFloatPixelPaddingValueDoubleFloatPixelPaddingValueFloatPixelPaddingRangeLimitDoubleFloatPixelPaddingRangeLimitRETIRED_ImageLocationQualityControlImageBurnedInAnnotationRecognizableVisualFeaturesLongitudinalTemporalInformationModifiedReferencedColorPaletteInstanceUIDRETIRED_TransformLabelRETIRED_TransformVersionNumberRETIRED_NumberOfTransformStepsRETIRED_SequenceOfCompressedDataRETIRED_DetailsOfCoefficientsRETIRED_RowsForNthOrderCoefficientsRETIRED_ColumnsForNthOrderCoefficientsRETIRED_CoefficientCodingRETIRED_CoefficientCodingPointersRETIRED_DCTLabelRETIRED_DataBlockDescriptionRETIRED_DataBlockRETIRED_NormalizationFactorFormatRETIRED_ZonalMapNumberFormatRETIRED_ZonalMapLocationRETIRED_ZonalMapFormatRETIRED_AdaptiveMapFormatRETIRED_CodeNumberFormatRETIRED_CodeLabelRETIRED_NumberOfTablesRETIRED_CodeTableLocationRETIRED_BitsForCodeWordRETIRED_ImageDataLocationPixelSpacingCalibrationTypePixelSpacingCalibrationDescriptionPixelIntensityRelationshipPixelIntensityRelationshipSignWindowCenterWindowWidthRescaleInterceptRescaleSlopeRescaleTypeWindowCenterWidthExplanationVOILUTFunctionRETIRED_GrayScaleRecommendedViewingModeRETIRED_GrayLookupTableDescriptorRedPaletteColorLookupTableDescriptorGreenPaletteColorLookupTableDescriptorBluePaletteColorLookupTableDescriptorAlphaPaletteColorLookupTableDescriptorRETIRED_LargeRedPaletteColorLookupTableDescriptorRETIRED_LargeGreenPaletteColorLookupTableDescriptorRETIRED_LargeBluePaletteColorLookupTableDescriptorPaletteColorLookupTableUIDRETIRED_GrayLookupTableDataRedPaletteColorLookupTableDataGreenPaletteColorLookupTableDataBluePaletteColorLookupTableDataAlphaPaletteColorLookupTableDataRETIRED_LargeRedPaletteColorLookupTableDataRETIRED_LargeGreenPaletteColorLookupTableDataRETIRED_LargeBluePaletteColorLookupTableDataRETIRED_LargePaletteColorLookupTableUIDSegmentedRedPaletteColorLookupTableDataSegmentedGreenPaletteColorLookupTableDataSegmentedBluePaletteColorLookupTableDataSegmentedAlphaPaletteColorLookupTableDataStoredValueColorRangeSequenceMinimumStoredValueMappedMaximumStoredValueMappedBreastImplantPresentPartialViewPartialViewDescriptionPartialViewCodeSequenceSpatialLocationsPreservedDataFrameAssignmentSequenceDataPathAssignmentBitsMappedToColorLookupTableBlendingLUT1SequenceBlendingLUT1TransferFunctionBlendingWeightConstantBlendingLookupTableDescriptorBlendingLookupTableDataEnhancedPaletteColorLookupTableSequenceBlendingLUT2SequenceBlendingLUT2TransferFunctionDataPathIDRGBLUTTransferFunctionAlphaLUTTransferFunctionICCProfileColorSpaceLossyImageCompressionLossyImageCompressionRatioLossyImageCompressionMethodModalityLUTSequenceVariableModalityLUTSequenceLUTDescriptorLUTExplanationModalityLUTTypeLUTDataVOILUTSequenceSoftcopyVOILUTSequenceRETIRED_ImagePresentationCommentsRETIRED_BiPlaneAcquisitionSequenceRepresentativeFrameNumberFrameNumbersOfInterestFrameOfInterestDescriptionFrameOfInterestTypeRETIRED_MaskPointersRWavePointerMaskSubtractionSequenceMaskOperationApplicableFrameRangeMaskFrameNumbersContrastFrameAveragingMaskSubPixelShiftTIDOffsetMaskOperationExplanationEquipmentAdministratorSequenceNumberOfDisplaySubsystemsCurrentConfigurationIDDisplaySubsystemIDDisplaySubsystemNameDisplaySubsystemDescriptionSystemStatusSystemStatusCommentTargetLuminanceCharacteristicsSequenceLuminanceCharacteristicsIDDisplaySubsystemConfigurationSequenceConfigurationIDConfigurationNameConfigurationDescriptionReferencedTargetLuminanceCharacteristicsIDQAResultsSequenceDisplaySubsystemQAResultsSequenceConfigurationQAResultsSequenceMeasurementEquipmentSequenceMeasurementFunctionsMeasurementEquipmentTypeVisualEvaluationResultSequenceDisplayCalibrationResultSequenceDDLValueCIExyWhitePointDisplayFunctionTypeGammaValueNumberOfLuminancePointsLuminanceResponseSequenceTargetMinimumLuminanceTargetMaximumLuminanceLuminanceValueLuminanceResponseDescriptionWhitePointFlagDisplayDeviceTypeCodeSequenceDisplaySubsystemSequenceLuminanceResultSequenceAmbientLightValueSourceMeasuredCharacteristicsLuminanceUniformityResultSequenceVisualEvaluationTestSequenceTestResultTestResultCommentTestImageValidationTestPatternCodeSequenceMeasurementPatternCodeSequenceVisualEvaluationMethodCodeSequencePixelDataProviderURLDataPointRowsDataPointColumnsSignalDomainColumnsRETIRED_LargestMonochromePixelValueDataRepresentationPixelMeasuresSequenceFrameVOILUTSequencePixelValueTransformationSequenceSignalDomainRowsDisplayFilterPercentageFramePixelShiftSequenceSubtractionItemIDPixelIntensityRelationshipLUTSequenceFramePixelDataPropertiesSequenceGeometricalPropertiesGeometricMaximumDistortionImageProcessingAppliedMaskSelectionModeLUTFunctionMaskVisibilityPercentagePixelShiftSequenceRegionPixelShiftSequenceVerticesOfTheRegionMultiFramePresentationSequencePixelShiftFrameRangeLUTFrameRangeImageToEquipmentMappingMatrixEquipmentCoordinateSystemIdentificationRETIRED_StudyStatusIDRETIRED_StudyPriorityIDRETIRED_StudyIDIssuerRETIRED_StudyVerifiedDateRETIRED_StudyVerifiedTimeRETIRED_StudyReadDateRETIRED_StudyReadTimeRETIRED_ScheduledStudyStartDateRETIRED_ScheduledStudyStartTimeRETIRED_ScheduledStudyStopDateRETIRED_ScheduledStudyStopTimeRETIRED_ScheduledStudyLocationRETIRED_ScheduledStudyLocationAETitleRETIRED_ReasonForStudyRequestingPhysicianIdentificationSequenceRequestingPhysicianRequestingServiceRequestingServiceCodeSequenceRETIRED_StudyArrivalDateRETIRED_StudyArrivalTimeRETIRED_StudyCompletionDateRETIRED_StudyCompletionTimeRETIRED_StudyComponentStatusIDRequestedProcedureDescriptionRequestedProcedureCodeSequenceRequestedLateralityCodeSequenceReasonForVisitReasonForVisitCodeSequenceRequestedContrastAgentRETIRED_StudyCommentsFlowIdentifierSequenceFlowIdentifierFlowTransferSyntaxUIDFlowRTPSamplingRateSourceIdentifierFrameOriginTimestampIncludesImagingSubjectFrameUsefulnessGroupSequenceRealTimeBulkDataFlowSequenceCameraPositionGroupSequenceIncludesInformationTimeOfFrameGroupSequenceReferencedPatientAliasSequenceVisitStatusIDAdmissionIDRETIRED_IssuerOfAdmissionIDIssuerOfAdmissionIDSequenceRouteOfAdmissionsRETIRED_ScheduledAdmissionDateRETIRED_ScheduledAdmissionTimeRETIRED_ScheduledDischargeDateRETIRED_ScheduledDischargeTimeRETIRED_ScheduledPatientInstitutionResidenceAdmittingDateAdmittingTimeRETIRED_DischargeDateRETIRED_DischargeTimeRETIRED_DischargeDiagnosisDescriptionRETIRED_DischargeDiagnosisCodeSequenceSpecialNeedsServiceEpisodeIDRETIRED_IssuerOfServiceEpisodeIDServiceEpisodeDescriptionIssuerOfServiceEpisodeIDSequencePertinentDocumentsSequencePertinentResourcesSequenceResourceDescriptionCurrentPatientLocationPatientInstitutionResidencePatientStatePatientClinicalTrialParticipationSequenceVisitCommentsWaveformOriginalityNumberOfWaveformChannelsNumberOfWaveformSamplesSamplingFrequencyMultiplexGroupLabelChannelDefinitionSequenceWaveformChannelNumberChannelLabelChannelStatusChannelSourceSequenceChannelSourceModifiersSequenceSourceWaveformSequenceChannelDerivationDescriptionChannelSensitivityChannelSensitivityUnitsSequenceChannelSensitivityCorrectionFactorChannelBaselineChannelTimeSkewChannelSampleSkewChannelOffsetWaveformBitsStoredFilterLowFrequencyFilterHighFrequencyNotchFilterFrequencyNotchFilterBandwidthWaveformDataDisplayScaleWaveformDisplayBackgroundCIELabValueWaveformPresentationGroupSequencePresentationGroupNumberChannelDisplaySequenceChannelRecommendedDisplayCIELabValueChannelPositionDisplayShadingFlagFractionalChannelDisplayScaleAbsoluteChannelDisplayScaleMultiplexedAudioChannelsDescriptionCodeSequenceChannelIdentificationCodeChannelModeMultiplexGroupUIDPowerlineFrequencyChannelImpedanceSequenceImpedanceValueImpedanceMeasurementDateTimeImpedanceMeasurementFrequencyImpedanceMeasurementCurrentTypeWaveformAmplifierTypeFilterLowFrequencyCharacteristicsSequenceFilterHighFrequencyCharacteristicsSequenceSummarizedFilterLookupTableNotchFilterCharacteristicsSequenceWaveformFilterTypeAnalogFilterCharacteristicsSequenceAnalogFilterRollOffAnalogFilterTypeDigitalFilterCharacteristicsSequenceDigitalFilterOrderDigitalFilterTypeCodeSequenceWaveformFilterDescriptionFilterLookupTableSequenceFilterLookupTableDescriptionFrequencyEncodingCodeSequenceMagnitudeEncodingCodeSequenceFilterLookupTableDataScheduledStationAETitleScheduledProcedureStepStartDateScheduledProcedureStepStartTimeScheduledProcedureStepEndDateScheduledProcedureStepEndTimeScheduledPerformingPhysicianNameScheduledProcedureStepDescriptionScheduledProtocolCodeSequenceScheduledProcedureStepIDStageCodeSequenceScheduledPerformingPhysicianIdentificationSequenceScheduledStationNameScheduledProcedureStepLocationPreMedicationScheduledProcedureStepStatusOrderPlacerIdentifierSequenceOrderFillerIdentifierSequenceLocalNamespaceEntityIDUniversalEntityIDUniversalEntityIDTypeIdentifierTypeCodeAssigningFacilitySequenceAssigningJurisdictionCodeSequenceAssigningAgencyOrDepartmentCodeSequenceScheduledProcedureStepSequenceReferencedNonImageCompositeSOPInstanceSequencePerformedStationAETitlePerformedStationNamePerformedLocationPerformedProcedureStepStartDatePerformedProcedureStepStartTimePerformedProcedureStepEndDatePerformedProcedureStepEndTimePerformedProcedureStepStatusPerformedProcedureStepIDPerformedProcedureStepDescriptionPerformedProcedureTypeDescriptionPerformedProtocolCodeSequencePerformedProtocolTypeScheduledStepAttributesSequenceRequestAttributesSequenceCommentsOnThePerformedProcedureStepPerformedProcedureStepDiscontinuationReasonCodeSequenceQuantitySequenceQuantityMeasuringUnitsSequenceBillingItemSequenceTotalTimeOfFluoroscopyTotalNumberOfExposuresEntranceDoseExposedAreaDistanceSourceToEntranceRETIRED_DistanceSourceToSupportExposureDoseSequenceCommentsOnRadiationDoseXRayOutputHalfValueLayerOrganDoseOrganExposedBillingProcedureStepSequenceFilmConsumptionSequenceBillingSuppliesAndDevicesSequenceRETIRED_ReferencedProcedureStepSequencePerformedSeriesSequenceCommentsOnTheScheduledProcedureStepProtocolContextSequenceContentItemModifierSequenceScheduledSpecimenSequenceRETIRED_SpecimenAccessionNumberContainerIdentifierIssuerOfTheContainerIdentifierSequenceAlternateContainerIdentifierSequenceContainerTypeCodeSequenceContainerDescriptionContainerComponentSequenceRETIRED_SpecimenSequenceSpecimenIdentifierRETIRED_SpecimenDescriptionSequenceTrialRETIRED_SpecimenDescriptionTrialSpecimenUIDAcquisitionContextSequenceAcquisitionContextDescriptionSpecimenDescriptionSequenceIssuerOfTheSpecimenIdentifierSequenceSpecimenTypeCodeSequenceSpecimenShortDescriptionSpecimenDetailedDescriptionSpecimenPreparationSequenceSpecimenPreparationStepContentItemSequenceSpecimenLocalizationContentItemSequenceRETIRED_SlideIdentifierWholeSlideMicroscopyImageFrameTypeSequenceImageCenterPointCoordinatesSequenceXOffsetInSlideCoordinateSystemYOffsetInSlideCoordinateSystemZOffsetInSlideCoordinateSystemRETIRED_PixelSpacingSequenceRETIRED_CoordinateSystemAxisCodeSequenceMeasurementUnitsCodeSequenceRETIRED_VitalStainCodeSequenceTrialRequestedProcedureIDReasonForTheRequestedProcedureRequestedProcedurePriorityPatientTransportArrangementsRequestedProcedureLocationRETIRED_PlacerOrderNumberProcedureRETIRED_FillerOrderNumberProcedureConfidentialityCodeReportingPriorityReasonForRequestedProcedureCodeSequenceNamesOfIntendedRecipientsOfResultsIntendedRecipientsOfResultsIdentificationSequenceReasonForPerformedProcedureCodeSequenceRETIRED_RequestedProcedureDescriptionTrialPersonIdentificationCodeSequencePersonAddressPersonTelephoneNumbersPersonTelecomInformationRequestedProcedureCommentsRETIRED_ReasonForTheImagingServiceRequestIssueDateOfImagingServiceRequestIssueTimeOfImagingServiceRequestRETIRED_PlacerOrderNumberImagingServiceRequestRetiredRETIRED_FillerOrderNumberImagingServiceRequestRetiredOrderEnteredByOrderEntererLocationOrderCallbackPhoneNumberOrderCallbackTelecomInformationPlacerOrderNumberImagingServiceRequestFillerOrderNumberImagingServiceRequestImagingServiceRequestCommentsConfidentialityConstraintOnPatientDataDescriptionRETIRED_GeneralPurposeScheduledProcedureStepStatusRETIRED_GeneralPurposePerformedProcedureStepStatusRETIRED_GeneralPurposeScheduledProcedureStepPriorityRETIRED_ScheduledProcessingApplicationsCodeSequenceScheduledProcedureStepStartDateTimeRETIRED_MultipleCopiesFlagPerformedProcessingApplicationsCodeSequenceScheduledProcedureStepExpirationDateTimeHumanPerformerCodeSequenceScheduledProcedureStepModificationDateTimeExpectedCompletionDateTimeRETIRED_ResultingGeneralPurposePerformedProcedureStepsSequenceRETIRED_ReferencedGeneralPurposeScheduledProcedureStepSequenceScheduledWorkitemCodeSequencePerformedWorkitemCodeSequenceInputAvailabilityFlagInputInformationSequenceRETIRED_RelevantInformationSequenceRETIRED_ReferencedGeneralPurposeScheduledProcedureStepTransactionUIDScheduledStationNameCodeSequenceScheduledStationClassCodeSequenceScheduledStationGeographicLocationCodeSequencePerformedStationNameCodeSequencePerformedStationClassCodeSequencePerformedStationGeographicLocationCodeSequenceRETIRED_RequestedSubsequentWorkitemCodeSequenceRETIRED_NonDICOMOutputCodeSequenceOutputInformationSequenceScheduledHumanPerformersSequenceActualHumanPerformersSequenceHumanPerformerOrganizationHumanPerformerNameRawDataHandlingInputReadinessStatePerformedProcedureStepStartDateTimePerformedProcedureStepEndDateTimeProcedureStepCancellationDateTimeOutputDestinationSequenceDICOMStorageSequenceSTOWRSStorageSequenceStorageURLXDSStorageSequenceEntranceDoseInmGyEntranceDoseDerivationParametricMapFrameTypeSequenceReferencedImageRealWorldValueMappingSequenceRealWorldValueMappingSequencePixelValueMappingCodeSequenceLUTLabelRealWorldValueLastValueMappedRealWorldValueLUTDataDoubleFloatRealWorldValueLastValueMappedDoubleFloatRealWorldValueFirstValueMappedRealWorldValueFirstValueMappedQuantityDefinitionSequenceRealWorldValueInterceptRealWorldValueSlopeRETIRED_FindingsFlagTrialRelationshipTypeRETIRED_FindingsSequenceTrialRETIRED_FindingsGroupUIDTrialRETIRED_ReferencedFindingsGroupUIDTrialRETIRED_FindingsGroupRecordingDateTrialRETIRED_FindingsGroupRecordingTimeTrialRETIRED_FindingsSourceCategoryCodeSequenceTrialVerifyingOrganizationRETIRED_DocumentingOrganizationIdentifierCodeSequenceTrialVerificationDateTimeObservationDateTimeObservationStartDateTimeValueTypeConceptNameCodeSequenceRETIRED_MeasurementPrecisionDescriptionTrialContinuityOfContentRETIRED_UrgencyOrPriorityAlertsTrialRETIRED_SequencingIndicatorTrialRETIRED_DocumentIdentifierCodeSequenceTrialRETIRED_DocumentAuthorTrialRETIRED_DocumentAuthorIdentifierCodeSequenceTrialRETIRED_IdentifierCodeSequenceTrialVerifyingObserverSequenceRETIRED_ObjectBinaryIdentifierTrialVerifyingObserverNameRETIRED_DocumentingObserverIdentifierCodeSequenceTrialAuthorObserverSequenceParticipantSequenceCustodialOrganizationSequenceParticipationTypeParticipationDateTimeObserverTypeRETIRED_ProcedureIdentifierCodeSequenceTrialVerifyingObserverIdentificationCodeSequenceRETIRED_ObjectDirectoryBinaryIdentifierTrialRETIRED_EquivalentCDADocumentSequenceReferencedWaveformChannelsRETIRED_DateOfDocumentOrVerbalTransactionTrialRETIRED_TimeOfDocumentCreationOrVerbalTransactionTrialDateTimeDateTimePersonNameUIDRETIRED_ReportStatusIDTrialTemporalRangeTypeReferencedSamplePositionsReferencedFrameNumbersReferencedTimeOffsetsReferencedDateTimeTextValueFloatingPointValueRationalNumeratorValueRationalDenominatorValueRETIRED_ObservationCategoryCodeSequenceTrialConceptCodeSequenceRETIRED_BibliographicCitationTrialPurposeOfReferenceCodeSequenceObservationUIDRETIRED_ReferencedObservationUIDTrialRETIRED_ReferencedObservationClassTrialRETIRED_ReferencedObjectObservationClassTrialAnnotationGroupNumberRETIRED_ObservationDateTrialRETIRED_ObservationTimeTrialRETIRED_MeasurementAutomationTrialModifierCodeSequenceRETIRED_IdentificationDescriptionTrialRETIRED_CoordinatesSetGeometricTypeTrialRETIRED_AlgorithmCodeSequenceTrialRETIRED_AlgorithmDescriptionTrialRETIRED_PixelCoordinatesSetTrialMeasuredValueSequenceNumericValueQualifierCodeSequenceRETIRED_CurrentObserverTrialNumericValueRETIRED_ReferencedAccessionSequenceTrialRETIRED_ReportStatusCommentTrialRETIRED_ProcedureContextSequenceTrialRETIRED_VerbalSourceTrialRETIRED_AddressTrialRETIRED_TelephoneNumberTrialRETIRED_VerbalSourceIdentifierCodeSequenceTrialPredecessorDocumentsSequenceReferencedRequestSequencePerformedProcedureCodeSequenceCurrentRequestedProcedureEvidenceSequenceRETIRED_ReportDetailSequenceTrialPertinentOtherEvidenceSequenceHL7StructuredDocumentReferenceSequenceRETIRED_ObservationSubjectUIDTrialRETIRED_ObservationSubjectClassTrialRETIRED_ObservationSubjectTypeCodeSequenceTrialCompletionFlagCompletionFlagDescriptionVerificationFlagArchiveRequestedPreliminaryFlagContentTemplateSequenceIdenticalDocumentsSequenceRETIRED_ObservationSubjectContextFlagTrialRETIRED_ObserverContextFlagTrialRETIRED_ProcedureContextFlagTrialContentSequenceRETIRED_RelationshipSequenceTrialRETIRED_RelationshipTypeCodeSequenceTrialRETIRED_LanguageCodeSequenceTrialTabulatedValuesSequenceNumberOfTableRowsNumbeOfTableColumnsTableRowNumberTableColumnNumberTableRowDefinitionSequenceTableColumnDefinitionSequenceCellValuesSequenceRETIRED_UniformResourceLocatorTrialWaveformAnnotationSequenceTemplateIdentifierRETIRED_TemplateVersionRETIRED_TemplateLocalVersionRETIRED_TemplateExtensionFlagRETIRED_TemplateExtensionOrganizationUIDRETIRED_TemplateExtensionCreatorUIDReferencedContentItemIdentifierHL7InstanceIdentifierHL7DocumentEffectiveTimeHL7DocumentTypeCodeSequenceDocumentClassCodeSequenceRetrieveURIRetrieveLocationUIDTypeOfInstancesDICOMRetrievalSequenceDICOMMediaRetrievalSequenceWADORetrievalSequenceXDSRetrievalSequenceWADORSRetrievalSequenceRepositoryUniqueIDHomeCommunityIDDocumentTitleEncapsulatedDocumentMIMETypeOfEncapsulatedDocumentSourceInstanceSequenceListOfMIMETypesEncapsulatedDocumentLengthProductPackageIdentifierSubstanceAdministrationApprovalApprovalStatusFurtherDescriptionApprovalStatusDateTimeProductTypeCodeSequenceProductNameProductDescriptionProductLotIdentifierProductExpirationDateTimeSubstanceAdministrationDateTimeSubstanceAdministrationNotesSubstanceAdministrationDeviceIDProductParameterSequenceSubstanceAdministrationParameterSequenceApprovalSequenceAssertionCodeSequenceAssertionUIDAsserterIdentificationSequenceAssertionDateTimeAssertionExpirationDateTimeAssertionCommentsRelatedAssertionSequenceReferencedAssertionUIDApprovalSubjectSequenceOrganizationalRoleCodeSequenceLensDescriptionRightLensSequenceLeftLensSequenceUnspecifiedLateralityLensSequenceCylinderSequencePrismSequenceHorizontalPrismPowerHorizontalPrismBaseVerticalPrismPowerVerticalPrismBaseLensSegmentTypeOpticalTransmittanceChannelWidthPupilSizeCornealSizeCornealSizeSequenceAutorefractionRightEyeSequenceAutorefractionLeftEyeSequenceDistancePupillaryDistanceNearPupillaryDistanceIntermediatePupillaryDistanceOtherPupillaryDistanceKeratometryRightEyeSequenceKeratometryLeftEyeSequenceSteepKeratometricAxisSequenceRadiusOfCurvatureKeratometricPowerKeratometricAxisFlatKeratometricAxisSequenceBackgroundColorOptotypeOptotypePresentationSubjectiveRefractionRightEyeSequenceSubjectiveRefractionLeftEyeSequenceAddNearSequenceAddIntermediateSequenceAddOtherSequenceAddPowerViewingDistanceCorneaMeasurementsSequenceSourceOfCorneaMeasurementDataCodeSequenceSteepCornealAxisSequenceFlatCornealAxisSequenceCornealPowerCornealAxisCorneaMeasurementMethodCodeSequenceRefractiveIndexOfCorneaRefractiveIndexOfAqueousHumorVisualAcuityTypeCodeSequenceVisualAcuityRightEyeSequenceVisualAcuityLeftEyeSequenceVisualAcuityBothEyesOpenSequenceViewingDistanceTypeVisualAcuityModifiersDecimalVisualAcuityOptotypeDetailedDefinitionReferencedRefractiveMeasurementsSequenceSpherePowerCylinderPowerCornealTopographySurfaceCornealVertexLocationPupilCentroidXCoordinatePupilCentroidYCoordinateEquivalentPupilRadiusCornealTopographyMapTypeCodeSequenceVerticesOfTheOutlineOfPupilCornealTopographyMappingNormalsSequenceMaximumCornealCurvatureSequenceMaximumCornealCurvatureMaximumCornealCurvatureLocationMinimumKeratometricSequenceSimulatedKeratometricCylinderSequenceAverageCornealPowerCornealISValueAnalyzedAreaSurfaceRegularityIndexSurfaceAsymmetryIndexCornealEccentricityIndexKeratoconusPredictionIndexDecimalPotentialVisualAcuityCornealTopographyMapQualityEvaluationSourceImageCornealProcessedDataSequenceCornealPointLocationCornealPointEstimatedAxialPowerTangentialPowerRefractivePowerRelativeElevationCornealWavefrontImagedVolumeWidthImagedVolumeHeightImagedVolumeDepthTotalPixelMatrixColumnsTotalPixelMatrixRowsTotalPixelMatrixOriginSequenceSpecimenLabelInImageFocusMethodExtendedDepthOfFieldNumberOfFocalPlanesDistanceBetweenFocalPlanesRecommendedAbsentPixelCIELabValueIlluminatorTypeCodeSequenceImageOrientationSlideOpticalPathSequenceOpticalPathIdentifierOpticalPathDescriptionIlluminationColorCodeSequenceSpecimenReferenceSequenceCondenserLensPowerObjectiveLensPowerObjectiveLensNumericalApertureConfocalModeTissueLocationConfocalMicroscopyImageFrameTypeSequenceImageAcquisitionDepthPaletteColorLookupTableSequenceReferencedImageNavigationSequenceTopLeftHandCornerOfLocalizerAreaBottomRightHandCornerOfLocalizerAreaOpticalPathIdentificationSequencePlanePositionSlideSequenceColumnPositionInTotalImagePixelMatrixRowPositionInTotalImagePixelMatrixPixelOriginInterpretationNumberOfOpticalPathsTotalPixelMatrixFocalPlanesCalibrationImageDeviceSequenceContainerComponentTypeCodeSequenceContainerComponentThicknessDeviceLengthContainerComponentWidthDeviceDiameterDeviceDiameterUnitsDeviceVolumeInterMarkerDistanceContainerComponentMaterialContainerComponentIDContainerComponentLengthContainerComponentDiameterContainerComponentDescriptionDeviceDescriptionLongDeviceDescriptionContrastBolusIngredientPercentByVolumeOCTFocalDistanceBeamSpotSizeEffectiveRefractiveIndexOCTAcquisitionDomainOCTOpticalCenterWavelengthAxialResolutionRangingDepthALineRateALinesPerFrameCatheterRotationalRateALinePixelSpacingModeOfPercutaneousAccessSequenceIntravascularOCTFrameTypeSequenceOCTZOffsetAppliedIntravascularFrameContentSequenceIntravascularLongitudinalDistanceIntravascularOCTFrameContentSequenceOCTZOffsetCorrectionCatheterDirectionOfRotationSeamLineLocationFirstALineLocationSeamLineIndexNumberOfPaddedALinesInterpolationTypeRefractiveIndexAppliedEnergyWindowVectorNumberOfEnergyWindowsEnergyWindowInformationSequenceEnergyWindowRangeSequenceEnergyWindowLowerLimitEnergyWindowUpperLimitRadiopharmaceuticalInformationSequenceResidualSyringeCountsEnergyWindowNameDetectorVectorNumberOfDetectorsDetectorInformationSequencePhaseVectorNumberOfPhasesPhaseInformationSequenceNumberOfFramesInPhasePhaseDelayPauseBetweenFramesPhaseDescriptionRotationVectorNumberOfRotationsRotationInformationSequenceNumberOfFramesInRotationRRIntervalVectorNumberOfRRIntervalsGatedInformationSequenceDataInformationSequenceTimeSlotVectorNumberOfTimeSlotsTimeSlotInformationSequenceTimeSlotTimeSliceVectorNumberOfSlicesAngularViewVectorTimeSliceVectorNumberOfTimeSlicesStartAngleTypeOfDetectorMotionTriggerVectorNumberOfTriggersInPhaseViewCodeSequenceViewModifierCodeSequenceRadionuclideCodeSequenceAdministrationRouteCodeSequenceRadiopharmaceuticalCodeSequenceCalibrationDataSequenceEnergyWindowNumberImageIDPatientOrientationCodeSequencePatientOrientationModifierCodeSequencePatientGantryRelationshipCodeSequenceSliceProgressionDirectionScanProgressionDirectionSeriesTypeUnitsCountsSourceReprojectionMethodSUVTypeRandomsCorrectionMethodAttenuationCorrectionMethodDecayCorrectionReconstructionMethodDetectorLinesOfResponseUsedScatterCorrectionMethodAxialAcceptanceAxialMashTransverseMashDetectorElementSizeCoincidenceWindowWidthSecondaryCountsTypeFrameReferenceTimePrimaryPromptsCountsAccumulatedSecondaryCountsAccumulatedSliceSensitivityFactorDecayFactorDoseCalibrationFactorScatterFractionFactorDeadTimeFactorImageIndexRETIRED_CountsIncludedRETIRED_DeadTimeCorrectionFlagHistogramSequenceHistogramNumberOfBinsHistogramFirstBinValueHistogramLastBinValueHistogramBinWidthHistogramExplanationHistogramDataSegmentationTypeSegmentSequenceSegmentedPropertyCategoryCodeSequenceSegmentNumberSegmentLabelSegmentDescriptionSegmentationAlgorithmIdentificationSequenceSegmentAlgorithmTypeSegmentAlgorithmNameSegmentIdentificationSequenceReferencedSegmentNumberRecommendedDisplayGrayscaleValueRecommendedDisplayCIELabValueMaximumFractionalValueSegmentedPropertyTypeCodeSequenceSegmentationFractionalTypeSegmentedPropertyTypeModifierCodeSequenceUsedSegmentsSequenceSegmentsOverlapTrackingIDTrackingUIDDeformableRegistrationSequenceSourceFrameOfReferenceUIDDeformableRegistrationGridSequenceGridDimensionsGridResolutionVectorGridDataPreDeformationMatrixRegistrationSequencePostDeformationMatrixRegistrationSequenceNumberOfSurfacesSurfaceSequenceSurfaceNumberSurfaceCommentsSurfaceProcessingSurfaceProcessingRatioSurfaceProcessingDescriptionRecommendedPresentationOpacityRecommendedPresentationTypeFiniteVolumeManifoldSurfacePointsSequenceSurfacePointsNormalsSequenceSurfaceMeshPrimitivesSequenceNumberOfSurfacePointsPointCoordinatesDataPointPositionAccuracyMeanPointDistanceMaximumPointDistancePointsBoundingBoxCoordinatesAxisOfRotationCenterOfRotationNumberOfVectorsVectorDimensionalityVectorAccuracyVectorCoordinateDataDoublePointCoordinatesDataTrianglePointIndexListEdgePointIndexListVertexPointIndexListTriangleStripSequenceTriangleFanSequenceLineSequencePrimitivePointIndexListSurfaceCountReferencedSurfaceSequenceReferencedSurfaceNumberSegmentSurfaceGenerationAlgorithmIdentificationSequenceSegmentSurfaceSourceInstanceSequenceAlgorithmFamilyCodeSequenceAlgorithmNameCodeSequenceAlgorithmVersionAlgorithmParametersFacetSequenceSurfaceProcessingAlgorithmIdentificationSequenceAlgorithmNameRecommendedPointRadiusRecommendedLineThicknessLongPrimitivePointIndexListLongTrianglePointIndexListLongEdgePointIndexListLongVertexPointIndexListTrackSetSequenceTrackSequenceRecommendedDisplayCIELabValueListTrackingAlgorithmIdentificationSequenceTrackSetNumberTrackSetLabelTrackSetDescriptionTrackSetAnatomicalTypeCodeSequenceMeasurementsSequenceTrackSetStatisticsSequenceFloatingPointValuesTrackPointIndexListTrackStatisticsSequenceMeasurementValuesSequenceDiffusionAcquisitionCodeSequenceDiffusionModelCodeSequenceImplantSizeImplantTemplateVersionReplacedImplantTemplateSequenceImplantTypeDerivationImplantTemplateSequenceOriginalImplantTemplateSequenceEffectiveDateTimeImplantTargetAnatomySequenceInformationFromManufacturerSequenceNotificationFromManufacturerSequenceInformationIssueDateTimeInformationSummaryImplantRegulatoryDisapprovalCodeSequenceOverallTemplateSpatialToleranceHPGLDocumentSequenceHPGLDocumentIDHPGLDocumentLabelViewOrientationCodeSequenceViewOrientationModifierHPGLDocumentScalingHPGLDocumentHPGLContourPenNumberHPGLPenSequenceHPGLPenNumberHPGLPenLabelHPGLPenDescriptionRecommendedRotationPointBoundingRectangleImplantTemplate3DModelSurfaceNumberSurfaceModelDescriptionSequenceSurfaceModelLabelSurfaceModelScalingFactorMaterialsCodeSequenceCoatingMaterialsCodeSequenceImplantTypeCodeSequenceFixationMethodCodeSequenceMatingFeatureSetsSequenceMatingFeatureSetIDMatingFeatureSetLabelMatingFeatureSequenceMatingFeatureIDMatingFeatureDegreeOfFreedomSequenceDegreeOfFreedomIDDegreeOfFreedomTypeTwoDMatingFeatureCoordinatesSequenceReferencedHPGLDocumentIDTwoDMatingPointTwoDMatingAxesTwoDDegreeOfFreedomSequenceThreeDDegreeOfFreedomAxisRangeOfFreedomThreeDMatingPointThreeDMatingAxesTwoDDegreeOfFreedomAxisPlanningLandmarkPointSequencePlanningLandmarkLineSequencePlanningLandmarkPlaneSequencePlanningLandmarkIDPlanningLandmarkDescriptionPlanningLandmarkIdentificationCodeSequenceTwoDPointCoordinatesSequenceTwoDPointCoordinatesThreeDPointCoordinatesTwoDLineCoordinatesSequenceTwoDLineCoordinatesThreeDLineCoordinatesTwoDPlaneCoordinatesSequenceTwoDPlaneIntersectionThreeDPlaneOriginThreeDPlaneNormalModelModificationModelMirroringModelUsageCodeSequenceModelGroupUIDRelativeURIReferenceWithinEncapsulatedDocumentAnnotationCoordinateTypeAnnotationGroupSequenceAnnotationGroupUIDAnnotationGroupLabelAnnotationGroupDescriptionAnnotationGroupGenerationTypeAnnotationGroupAlgorithmIdentificationSequenceAnnotationPropertyCategoryCodeSequenceAnnotationPropertyTypeCodeSequenceAnnotationPropertyTypeModifierCodeSequenceNumberOfAnnotationsAnnotationAppliesToAllOpticalPathsReferencedOpticalPathIdentifierAnnotationAppliesToAllZPlanesCommonZCoordinateValueAnnotationIndexListGraphicAnnotationSequenceGraphicLayerBoundingBoxAnnotationUnitsAnchorPointAnnotationUnitsGraphicAnnotationUnitsUnformattedTextValueTextObjectSequenceGraphicObjectSequenceBoundingBoxTopLeftHandCornerBoundingBoxBottomRightHandCornerBoundingBoxTextHorizontalJustificationAnchorPointAnchorPointVisibilityGraphicDimensionsNumberOfGraphicPointsGraphicDataGraphicTypeGraphicFilledRETIRED_ImageRotationRetiredImageHorizontalFlipImageRotationRETIRED_DisplayedAreaTopLeftHandCornerTrialRETIRED_DisplayedAreaBottomRightHandCornerTrialDisplayedAreaTopLeftHandCornerDisplayedAreaBottomRightHandCornerDisplayedAreaSelectionSequenceGraphicLayerSequenceGraphicLayerOrderGraphicLayerRecommendedDisplayGrayscaleValueRETIRED_GraphicLayerRecommendedDisplayRGBValueGraphicLayerDescriptionContentLabelContentDescriptionPresentationCreationDatePresentationCreationTimeContentCreatorNameContentCreatorIdentificationCodeSequenceAlternateContentDescriptionSequencePresentationSizeModePresentationPixelSpacingPresentationPixelAspectRatioPresentationPixelMagnificationRatioGraphicGroupLabelGraphicGroupDescriptionCompoundGraphicSequenceCompoundGraphicInstanceIDFontNameFontNameTypeCSSFontNameRotationAngleTextStyleSequenceLineStyleSequenceFillStyleSequenceGraphicGroupSequenceTextColorCIELabValueHorizontalAlignmentVerticalAlignmentShadowStyleShadowOffsetXShadowOffsetYShadowColorCIELabValueUnderlinedBoldItalicPatternOnColorCIELabValuePatternOffColorCIELabValueLineThicknessLineDashingStyleLinePatternFillPatternFillModeShadowOpacityGapLengthDiameterOfVisibilityRotationPointTickAlignmentShowTickLabelTickLabelAlignmentCompoundGraphicUnitsPatternOnOpacityPatternOffOpacityMajorTicksSequenceTickPositionTickLabelCompoundGraphicTypeGraphicGroupIDShapeTypeRegistrationSequenceMatrixRegistrationSequenceMatrixSequenceFrameOfReferenceToDisplayedCoordinateSystemTransformationMatrixFrameOfReferenceTransformationMatrixTypeRegistrationTypeCodeSequenceFiducialDescriptionFiducialIdentifierFiducialIdentifierCodeSequenceContourUncertaintyRadiusUsedFiducialsSequenceUsedRTStructureSetROISequenceGraphicCoordinatesDataSequenceFiducialUIDReferencedFiducialUIDFiducialSetSequenceFiducialSequenceFiducialsPropertyCategoryCodeSequenceGraphicLayerRecommendedDisplayCIELabValueBlendingSequenceRelativeOpacityReferencedSpatialRegistrationSequenceBlendingPositionPresentationDisplayCollectionUIDPresentationSequenceCollectionUIDPresentationSequencePositionIndexRenderedImageReferenceSequenceVolumetricPresentationStateInputSequencePresentationInputTypeInputSequencePositionIndexCropCroppingSpecificationIndexCompositingMethodVolumetricPresentationInputNumberImageVolumeGeometryVolumetricPresentationInputSetUIDVolumetricPresentationInputSetSequenceGlobalCropGlobalCroppingSpecificationIndexRenderingMethodVolumeCroppingSequenceVolumeCroppingMethodBoundingBoxCropObliqueCroppingPlaneSequenceObliqueCroppingPlaneObliqueCroppingPlaneNormalCroppingSpecificationNumberMultiPlanarReconstructionStyleMPRThicknessTypeMPRSlabThicknessMPRTopLeftHandCornerMPRViewWidthDirectionMPRViewWidthNumberOfVolumetricCurvePointsVolumetricCurvePointsMPRViewHeightDirectionMPRViewHeightRenderProjectionViewpointPositionViewpointLookAtPointViewpointUpDirectionRenderFieldOfViewSamplingStepSizeShadingStyleAmbientReflectionIntensityLightDirectionDiffuseReflectionIntensitySpecularReflectionIntensityShininessPresentationStateClassificationComponentSequenceComponentTypeComponentInputSequenceVolumetricPresentationInputIndexPresentationStateCompositorComponentSequenceWeightingTransferFunctionSequenceWeightingLookupTableDescriptorWeightingLookupTableDataVolumetricAnnotationSequenceReferencedStructuredContextSequenceReferencedContentItemVolumetricPresentationInputAnnotationSequenceAnnotationClippingPresentationAnimationStyleRecommendedAnimationRateAnimationCurveSequenceAnimationStepSizeSwivelRangeVolumetricCurveUpDirectionsVolumeStreamSequenceRGBATransferFunctionDescriptionAdvancedBlendingSequenceBlendingInputNumberBlendingDisplayInputSequenceBlendingDisplaySequenceBlendingModeTimeSeriesBlendingGeometryForDisplayThresholdSequenceThresholdValueSequenceThresholdTypeThresholdValueHangingProtocolNameHangingProtocolDescriptionHangingProtocolLevelHangingProtocolCreatorHangingProtocolCreationDateTimeHangingProtocolDefinitionSequenceHangingProtocolUserIdentificationCodeSequenceHangingProtocolUserGroupNameSourceHangingProtocolSequenceNumberOfPriorsReferencedImageSetsSequenceImageSetSelectorSequenceImageSetSelectorUsageFlagSelectorAttributeSelectorValueNumberTimeBasedImageSetsSequenceImageSetNumberImageSetSelectorCategoryRelativeTimeRelativeTimeUnitsAbstractPriorValueAbstractPriorCodeSequenceImageSetLabelSelectorAttributeVRSelectorSequencePointerSelectorSequencePointerPrivateCreatorSelectorAttributePrivateCreatorSelectorAEValueSelectorASValueSelectorATValueSelectorDAValueSelectorCSValueSelectorDTValueSelectorISValueSelectorOBValueSelectorLOValueSelectorOFValueSelectorLTValueSelectorOWValueSelectorPNValueSelectorTMValueSelectorSHValueSelectorUNValueSelectorSTValueSelectorUCValueSelectorUTValueSelectorURValueSelectorDSValueSelectorODValueSelectorFDValueSelectorOLValueSelectorFLValueSelectorULValueSelectorUSValueSelectorSLValueSelectorSSValueSelectorUIValueSelectorCodeSequenceValueSelectorOVValueSelectorSVValueSelectorUVValueNumberOfScreensNominalScreenDefinitionSequenceNumberOfVerticalPixelsNumberOfHorizontalPixelsDisplayEnvironmentSpatialPositionScreenMinimumGrayscaleBitDepthScreenMinimumColorBitDepthApplicationMaximumRepaintTimeDisplaySetsSequenceDisplaySetNumberDisplaySetLabelDisplaySetPresentationGroupDisplaySetPresentationGroupDescriptionPartialDataDisplayHandlingSynchronizedScrollingSequenceDisplaySetScrollingGroupNavigationIndicatorSequenceNavigationDisplaySetReferenceDisplaySetsImageBoxesSequenceImageBoxNumberImageBoxLayoutTypeImageBoxTileHorizontalDimensionImageBoxTileVerticalDimensionImageBoxScrollDirectionImageBoxSmallScrollTypeImageBoxSmallScrollAmountImageBoxLargeScrollTypeImageBoxLargeScrollAmountImageBoxOverlapPriorityCineRelativeToRealTimeFilterOperationsSequenceFilterByCategoryFilterByAttributePresenceFilterByOperatorStructuredDisplayBackgroundCIELabValueEmptyImageBoxCIELabValueStructuredDisplayImageBoxSequenceStructuredDisplayTextBoxSequenceReferencedFirstFrameSequenceImageBoxSynchronizationSequenceSynchronizedImageBoxListTypeOfSynchronizationBlendingOperationTypeReformattingOperationTypeReformattingThicknessReformattingIntervalReformattingOperationInitialViewDirectionThreeDRenderingTypeSortingOperationsSequenceSortByCategorySortingDirectionDisplaySetPatientOrientationVOITypePseudoColorTypePseudoColorPaletteInstanceReferenceSequenceShowGrayscaleInvertedShowImageTrueSizeFlagShowGraphicAnnotationFlagShowPatientDemographicsFlagShowAcquisitionTechniquesFlagDisplaySetHorizontalJustificationDisplaySetVerticalJustificationContinuationStartMetersetContinuationEndMetersetProcedureStepStateProcedureStepProgressInformationSequenceProcedureStepProgressProcedureStepProgressDescriptionProcedureStepProgressParametersSequenceProcedureStepCommunicationsURISequenceContactURIContactDisplayNameProcedureStepDiscontinuationReasonCodeSequenceBeamTaskSequenceBeamTaskTypeRETIRED_BeamOrderIndexTrialAutosequenceFlagTableTopVerticalAdjustedPositionTableTopLongitudinalAdjustedPositionTableTopLateralAdjustedPositionPatientSupportAdjustedAngleTableTopEccentricAdjustedAngleTableTopPitchAdjustedAngleTableTopRollAdjustedAngleDeliveryVerificationImageSequenceVerificationImageTimingDoubleExposureFlagDoubleExposureOrderingRETIRED_DoubleExposureMetersetTrialRETIRED_DoubleExposureFieldDeltaTrialRelatedReferenceRTImageSequenceGeneralMachineVerificationSequenceConventionalMachineVerificationSequenceIonMachineVerificationSequenceFailedAttributesSequenceOverriddenAttributesSequenceConventionalControlPointVerificationSequenceIonControlPointVerificationSequenceAttributeOccurrenceSequenceAttributeOccurrencePointerAttributeItemSelectorAttributeOccurrencePrivateCreatorSelectorSequencePointerItemsScheduledProcedureStepPriorityWorklistLabelProcedureStepLabelScheduledProcessingParametersSequencePerformedProcessingParametersSequenceUnifiedProcedureStepPerformedProcedureSequenceRETIRED_RelatedProcedureStepSequenceRETIRED_ProcedureStepRelationshipTypeReplacedProcedureStepSequenceDeletionLockReceivingAERequestingAEReasonForCancellationSCPStatusSubscriptionListStatusUnifiedProcedureStepListStatusBeamOrderIndexDoubleExposureMetersetDoubleExposureFieldDeltaBrachyTaskSequenceContinuationStartTotalReferenceAirKermaContinuationEndTotalReferenceAirKermaContinuationPulseNumberChannelDeliveryOrderSequenceReferencedChannelNumberStartCumulativeTimeWeightEndCumulativeTimeWeightOmittedChannelSequenceReasonForChannelOmissionReasonForChannelOmissionDescriptionChannelDeliveryOrderIndexChannelDeliveryContinuationSequenceOmittedApplicationSetupSequenceImplantAssemblyTemplateNameImplantAssemblyTemplateIssuerImplantAssemblyTemplateVersionReplacedImplantAssemblyTemplateSequenceImplantAssemblyTemplateTypeOriginalImplantAssemblyTemplateSequenceDerivationImplantAssemblyTemplateSequenceImplantAssemblyTemplateTargetAnatomySequenceProcedureTypeCodeSequenceSurgicalTechniqueComponentTypesSequenceComponentTypeCodeSequenceExclusiveComponentTypeMandatoryComponentTypeComponentSequenceComponentIDComponentAssemblySequenceComponent1ReferencedIDComponent1ReferencedMatingFeatureSetIDComponent1ReferencedMatingFeatureIDComponent2ReferencedIDComponent2ReferencedMatingFeatureSetIDComponent2ReferencedMatingFeatureIDImplantTemplateGroupNameImplantTemplateGroupDescriptionImplantTemplateGroupIssuerImplantTemplateGroupVersionReplacedImplantTemplateGroupSequenceImplantTemplateGroupTargetAnatomySequenceImplantTemplateGroupMembersSequenceImplantTemplateGroupMemberIDThreeDImplantTemplateGroupMemberMatchingPointThreeDImplantTemplateGroupMemberMatchingAxesImplantTemplateGroupMemberMatching2DCoordinatesSequenceTwoDImplantTemplateGroupMemberMatchingPointTwoDImplantTemplateGroupMemberMatchingAxesImplantTemplateGroupVariationDimensionSequenceImplantTemplateGroupVariationDimensionNameImplantTemplateGroupVariationDimensionRankSequenceReferencedImplantTemplateGroupMemberIDImplantTemplateGroupVariationDimensionRankSurfaceScanAcquisitionTypeCodeSequenceSurfaceScanModeCodeSequenceRegistrationMethodCodeSequenceShotDurationTimeShotOffsetTimeSurfacePointPresentationValueDataSurfacePointColorCIELabValueDataUVMappingSequenceTextureLabelUValueDataVValueDataReferencedTextureSequenceReferencedSurfaceDataSequenceAssessmentSummaryAssessmentSummaryDescriptionAssessedSOPInstanceSequenceReferencedComparisonSOPInstanceSequenceNumberOfAssessmentObservationsAssessmentObservationsSequenceObservationSignificanceObservationDescriptionStructuredConstraintObservationSequenceAssessedAttributeValueSequenceAssessmentSetIDAssessmentRequesterSequenceSelectorAttributeNameSelectorAttributeKeywordAssessmentTypeCodeSequenceObservationBasisCodeSequenceAssessmentLabelConstraintTypeSpecificationSelectionGuidanceConstraintValueSequenceRecommendedDefaultValueSequenceConstraintViolationSignificanceConstraintViolationConditionModifiableConstraintFlagStorageMediaFileSetIDStorageMediaFileSetUIDIconImageSequenceRETIRED_TopicTitleRETIRED_TopicSubjectRETIRED_TopicAuthorRETIRED_TopicKeywordsSOPInstanceStatusSOPAuthorizationDateTimeSOPAuthorizationCommentAuthorizationEquipmentCertificationNumberMACIDNumberMACCalculationTransferSyntaxUIDMACAlgorithmDataElementsSignedDigitalSignatureUIDDigitalSignatureDateTimeCertificateTypeCertificateOfSignerSignatureCertifiedTimestampTypeCertifiedTimestampRETIRED_undefinedDigitalSignaturePurposeCodeSequenceReferencedDigitalSignatureSequenceReferencedSOPInstanceMACSequenceMACEncryptedAttributesSequenceEncryptedContentTransferSyntaxUIDEncryptedContentModifiedAttributesSequenceNonconformingModifiedAttributesSequenceNonconformingDataElementValueOriginalAttributesSequenceAttributeModificationDateTimeModifyingSystemSourceOfPreviousValuesReasonForTheAttributeModificationInstanceOriginStatusRETIRED_EscapeTripletRETIRED_RunLengthTripletRETIRED_HuffmanTableSizeRETIRED_HuffmanTableTripletRETIRED_ShiftTableSizeRETIRED_ShiftTableTripletRETIRED_ZonalMapNumberOfCopiesPrinterConfigurationSequencePrintPriorityMediumTypeFilmDestinationFilmSessionLabelMemoryAllocationMaximumMemoryAllocationRETIRED_ColorImagePrintingFlagRETIRED_CollationFlagRETIRED_AnnotationFlagRETIRED_ImageOverlayFlagRETIRED_PresentationLUTFlagRETIRED_ImageBoxPresentationLUTFlagMemoryBitDepthPrintingBitDepthMediaInstalledSequenceOtherMediaAvailableSequenceSupportedImageDisplayFormatsSequenceReferencedFilmBoxSequenceRETIRED_ReferencedStoredPrintSequenceImageDisplayFormatAnnotationDisplayFormatIDFilmOrientationFilmSizeIDPrinterResolutionIDDefaultPrinterResolutionIDMagnificationTypeSmoothingTypeDefaultMagnificationTypeOtherMagnificationTypesAvailableDefaultSmoothingTypeOtherSmoothingTypesAvailableBorderDensityEmptyImageDensityMinDensityMaxDensityTrimConfigurationInformationConfigurationInformationDescriptionMaximumCollatedFilmsIlluminationReflectedAmbientLightPrinterPixelSpacingReferencedFilmSessionSequenceReferencedImageBoxSequenceReferencedBasicAnnotationBoxSequenceImageBoxPositionPolarityRequestedImageSizeRequestedDecimateCropBehaviorRequestedResolutionIDRequestedImageSizeFlagDecimateCropResultBasicGrayscaleImageSequenceBasicColorImageSequenceRETIRED_ReferencedImageOverlayBoxSequenceRETIRED_ReferencedVOILUTBoxSequenceAnnotationPositionTextStringRETIRED_ReferencedOverlayPlaneSequenceRETIRED_ReferencedOverlayPlaneGroupsRETIRED_OverlayPixelDataSequenceRETIRED_OverlayMagnificationTypeRETIRED_OverlaySmoothingTypeRETIRED_OverlayOrImageMagnificationRETIRED_MagnifyToNumberOfColumnsRETIRED_OverlayForegroundDensityRETIRED_OverlayBackgroundDensityRETIRED_OverlayModeRETIRED_ThresholdDensityRETIRED_ReferencedImageBoxSequenceRetiredPresentationLUTSequencePresentationLUTShapeReferencedPresentationLUTSequenceRETIRED_PrintJobIDExecutionStatusExecutionStatusInfoCreationDateCreationTimeOriginatorRETIRED_DestinationAEOwnerIDNumberOfFilmsRETIRED_ReferencedPrintJobSequencePullStoredPrintPrinterStatusPrinterStatusInfoPrinterNameRETIRED_PrintQueueIDRETIRED_QueueStatusRETIRED_PrintJobDescriptionSequenceRETIRED_ReferencedPrintJobSequenceRETIRED_PrintManagementCapabilitiesSequenceRETIRED_PrinterCharacteristicsSequenceRETIRED_FilmBoxContentSequenceRETIRED_ImageBoxContentSequenceRETIRED_AnnotationContentSequenceRETIRED_ImageOverlayBoxContentSequenceRETIRED_PresentationLUTContentSequenceRETIRED_ProposedStudySequenceRETIRED_OriginalImageSequenceLabelUsingInformationExtractedFromInstancesLabelTextLabelStyleSelectionMediaDispositionBarcodeValueBarcodeSymbologyAllowMediaSplittingIncludeNonDICOMObjectsIncludeDisplayApplicationPreserveCompositeInstancesAfterMediaCreationTotalNumberOfPiecesOfMediaCreatedRequestedMediaApplicationProfileReferencedStorageMediaSequenceFailureAttributesAllowLossyCompressionRequestPriorityRTImageLabelRTImageNameRTImageDescriptionReportedValuesOriginRTImagePlaneXRayImageReceptorTranslationXRayImageReceptorAngleRTImageOrientationImagePlanePixelSpacingRTImagePositionRadiationMachineNameRadiationMachineSADRadiationMachineSSDRTImageSIDSourceToReferenceObjectDistanceFractionNumberExposureSequenceMetersetExposureDiaphragmPositionFluenceMapSequenceFluenceDataSourceFluenceDataScalePrimaryFluenceModeSequenceFluenceModeFluenceModeIDSelectedFrameNumberSelectedFrameFunctionalGroupsSequenceRTImageFrameGeneralContentSequenceRTImageFrameContextSequenceRTImageScopeSequenceBeamModifierCoordinatesPresenceFlagStartCumulativeMetersetStopCumulativeMetersetRTAcquisitionPatientPositionSequenceRTImageFrameImagingDevicePositionSequenceRTImageFramekVRadiationAcquisitionSequenceRTImageFrameMVRadiationAcquisitionSequenceRTImageFrameRadiationAcquisitionSequenceImagingSourcePositionSequenceImageReceptorPositionSequenceDevicePositionToEquipmentMappingMatrixDevicePositionParameterSequenceImagingSourceLocationSpecificationTypeImagingDeviceLocationMatrixSequenceImagingDeviceLocationParameterSequenceImagingApertureSequenceImagingApertureSpecificationTypeNumberOfAcquisitionDevicesAcquisitionDeviceSequenceAcquisitionTaskSequenceAcquisitionTaskWorkitemCodeSequenceAcquisitionSubtaskSequenceSubtaskWorkitemCodeSequenceAcquisitionTaskIndexAcquisitionSubtaskIndexReferencedBaselineParametersRTRadiationInstanceSequencePositionAcquisitionTemplateIdentificationSequencePositionAcquisitionTemplateIDPositionAcquisitionTemplateNamePositionAcquisitionTemplateCodeSequencePositionAcquisitionTemplateDescriptionAcquisitionTaskApplicabilitySequenceProjectionImagingAcquisitionParameterSequenceCTImagingAcquisitionParameterSequenceKVImagingGenerationParametersSequenceMVImagingGenerationParametersSequenceAcquisitionSignalTypeAcquisitionMethodScanStartPositionSequenceScanStopPositionSequenceImagingSourceToBeamModifierDefinitionPlaneDistanceScanArcTypeDetectorPositioningTypeAdditionalRTAccessoryDeviceSequenceDeviceSpecificAcquisitionParameterSequenceReferencedPositionReferenceInstanceSequenceEnergyDerivationCodeSequenceMaximumCumulativeMetersetExposureAcquisitionInitiationSequenceDVHTypeDoseUnitsDoseTypeSpatialTransformOfDoseDoseCommentNormalizationPointDoseSummationTypeGridFrameOffsetVectorDoseGridScalingRTDoseROISequenceDoseValueTissueHeterogeneityCorrectionDVHNormalizationPointDVHNormalizationDoseValueDVHSequenceDVHDoseScalingDVHVolumeUnitsDVHNumberOfBinsDVHDataDVHReferencedROISequenceDVHROIContributionTypeDVHMinimumDoseDVHMaximumDoseDVHMeanDoseStructureSetLabelStructureSetNameStructureSetDescriptionStructureSetDateStructureSetTimeReferencedFrameOfReferenceSequenceRTReferencedStudySequenceRTReferencedSeriesSequenceContourImageSequencePredecessorStructureSetSequenceStructureSetROISequenceROINumberReferencedFrameOfReferenceUIDROINameROIDescriptionROIDisplayColorROIVolumeROIDateTimeROIObservationDateTimeRTRelatedROISequenceRTROIRelationshipROIGenerationAlgorithmROIDerivationAlgorithmIdentificationSequenceROIGenerationDescriptionROIContourSequenceContourSequenceContourGeometricTypeContourSlabThicknessContourOffsetVectorNumberOfContourPointsContourNumberAttachedContoursSourcePixelPlanesCharacteristicsSequenceSourceSeriesSequenceSourceSeriesInformationSequenceROICreatorSequenceROIInterpreterSequenceROIObservationContextCodeSequenceContourDataRTROIObservationsSequenceObservationNumberReferencedROINumberROIObservationLabelRTROIIdentificationCodeSequenceROIObservationDescriptionRelatedRTROIObservationsSequenceRTROIInterpretedTypeROIInterpreterROIPhysicalPropertiesSequenceROIPhysicalPropertyROIPhysicalPropertyValueROIElementalCompositionSequenceROIElementalCompositionAtomicNumberROIElementalCompositionAtomicMassFractionAdditionalRTROIIdentificationCodeSequenceRETIRED_FrameOfReferenceRelationshipSequenceRETIRED_RelatedFrameOfReferenceUIDRETIRED_FrameOfReferenceTransformationTypeFrameOfReferenceTransformationMatrixFrameOfReferenceTransformationCommentPatientLocationCoordinatesSequencePatientLocationCoordinatesCodeSequencePatientSupportPositionSequenceMeasuredDoseReferenceSequenceMeasuredDoseDescriptionMeasuredDoseTypeMeasuredDoseValueTreatmentSessionBeamSequenceTreatmentSessionIonBeamSequenceCurrentFractionNumberTreatmentControlPointDateTreatmentControlPointTimeTreatmentTerminationStatusTreatmentTerminationCodeTreatmentVerificationStatusReferencedTreatmentRecordSequenceSpecifiedPrimaryMetersetSpecifiedSecondaryMetersetDeliveredPrimaryMetersetDeliveredSecondaryMetersetSpecifiedTreatmentTimeDeliveredTreatmentTimeControlPointDeliverySequenceIonControlPointDeliverySequenceSpecifiedMetersetDeliveredMetersetMetersetRateSetMetersetRateDeliveredScanSpotMetersetsDeliveredDoseRateDeliveredTreatmentSummaryCalculatedDoseReferenceSequenceCumulativeDoseToDoseReferenceFirstTreatmentDateMostRecentTreatmentDateNumberOfFractionsDeliveredOverrideSequenceParameterSequencePointerOverrideParameterPointerParameterItemIndexMeasuredDoseReferenceNumberParameterPointerOverrideReasonParameterValueNumberCorrectedParameterSequenceCorrectionValueCalculatedDoseReferenceSequenceCalculatedDoseReferenceNumberCalculatedDoseReferenceDescriptionCalculatedDoseReferenceDoseValueStartMetersetEndMetersetReferencedMeasuredDoseReferenceSequenceReferencedMeasuredDoseReferenceNumberReferencedCalculatedDoseReferenceSequenceReferencedCalculatedDoseReferenceNumberBeamLimitingDeviceLeafPairsSequenceEnhancedRTBeamLimitingDeviceSequenceEnhancedRTBeamLimitingOpeningSequenceEnhancedRTBeamLimitingDeviceDefinitionFlagParallelRTBeamDelimiterOpeningExtentsRecordedWedgeSequenceRecordedCompensatorSequenceRecordedBlockSequenceRecordedBlockSlabSequenceTreatmentSummaryMeasuredDoseReferenceSequenceRecordedSnoutSequenceRecordedRangeShifterSequenceRecordedLateralSpreadingDeviceSequenceRecordedRangeModulatorSequenceRecordedSourceSequenceSourceSerialNumberTreatmentSessionApplicationSetupSequenceApplicationSetupCheckRecordedBrachyAccessoryDeviceSequenceReferencedBrachyAccessoryDeviceNumberRecordedChannelSequenceSpecifiedChannelTotalTimeDeliveredChannelTotalTimeSpecifiedNumberOfPulsesDeliveredNumberOfPulsesSpecifiedPulseRepetitionIntervalDeliveredPulseRepetitionIntervalRecordedSourceApplicatorSequenceReferencedSourceApplicatorNumberRecordedChannelShieldSequenceReferencedChannelShieldNumberBrachyControlPointDeliveredSequenceSafePositionExitDateSafePositionExitTimeSafePositionReturnDateSafePositionReturnTimePulseSpecificBrachyControlPointDeliveredSequencePulseNumberBrachyPulseControlPointDeliveredSequenceCurrentTreatmentStatusTreatmentStatusCommentFractionGroupSummarySequenceReferencedFractionNumberFractionGroupTypeBeamStopperPositionFractionStatusSummarySequenceTreatmentDateTreatmentTimeRTPlanLabelRTPlanNameRTPlanDescriptionRTPlanDateRTPlanTimeTreatmentProtocolsPlanIntentTreatmentSitesRTPlanGeometryPrescriptionDescriptionDoseReferenceSequenceDoseReferenceNumberDoseReferenceUIDDoseReferenceStructureTypeNominalBeamEnergyUnitDoseReferenceDescriptionDoseReferencePointCoordinatesNominalPriorDoseDoseReferenceTypeConstraintWeightDeliveryWarningDoseDeliveryMaximumDoseTargetMinimumDoseTargetPrescriptionDoseTargetMaximumDoseTargetUnderdoseVolumeFractionOrganAtRiskFullVolumeDoseOrganAtRiskLimitDoseOrganAtRiskMaximumDoseOrganAtRiskOverdoseVolumeFractionToleranceTableSequenceToleranceTableNumberToleranceTableLabelGantryAngleToleranceBeamLimitingDeviceAngleToleranceBeamLimitingDeviceToleranceSequenceBeamLimitingDevicePositionToleranceSnoutPositionTolerancePatientSupportAngleToleranceTableTopEccentricAngleToleranceTableTopPitchAngleToleranceTableTopRollAngleToleranceTableTopVerticalPositionToleranceTableTopLongitudinalPositionToleranceTableTopLateralPositionToleranceTableTopPositionAlignmentUIDRTPlanRelationshipFractionGroupSequenceFractionGroupNumberFractionGroupDescriptionNumberOfFractionsPlannedNumberOfFractionPatternDigitsPerDayRepeatFractionCycleLengthFractionPatternNumberOfBeamsBeamDoseSpecificationPointReferencedDoseReferenceUIDBeamDoseBeamMetersetRETIRED_BeamDosePointDepthRETIRED_BeamDosePointEquivalentDepthRETIRED_BeamDosePointSSDBeamDoseMeaningBeamDoseVerificationControlPointSequenceAverageBeamDosePointDepthAverageBeamDosePointEquivalentDepthAverageBeamDosePointSSDBeamDoseTypeAlternateBeamDoseAlternateBeamDoseTypeDepthValueAveragingFlagBeamDosePointSourceToExternalContourDistanceNumberOfBrachyApplicationSetupsBrachyApplicationSetupDoseSpecificationPointBrachyApplicationSetupDoseBeamSequenceTreatmentMachineNamePrimaryDosimeterUnitSourceAxisDistanceBeamLimitingDeviceSequenceRTBeamLimitingDeviceTypeSourceToBeamLimitingDeviceDistanceIsocenterToBeamLimitingDeviceDistanceNumberOfLeafJawPairsLeafPositionBoundariesBeamNumberBeamNameBeamDescriptionBeamTypeBeamDeliveryDurationLimitRadiationTypeHighDoseTechniqueTypeReferenceImageNumberPlannedVerificationImageSequenceImagingDeviceSpecificAcquisitionParametersTreatmentDeliveryTypeNumberOfWedgesWedgeSequenceWedgeNumberWedgeTypeWedgeIDWedgeAngleWedgeFactorTotalWedgeTrayWaterEquivalentThicknessWedgeOrientationIsocenterToWedgeTrayDistanceSourceToWedgeTrayDistanceWedgeThinEdgePositionBolusIDBolusDescriptionEffectiveWedgeAngleNumberOfCompensatorsMaterialIDTotalCompensatorTrayFactorCompensatorSequenceCompensatorNumberCompensatorIDSourceToCompensatorTrayDistanceCompensatorRowsCompensatorColumnsCompensatorPixelSpacingCompensatorPositionCompensatorTransmissionDataCompensatorThicknessDataNumberOfBoliCompensatorTypeCompensatorTrayIDNumberOfBlocksTotalBlockTrayFactorTotalBlockTrayWaterEquivalentThicknessBlockSequenceBlockTrayIDSourceToBlockTrayDistanceIsocenterToBlockTrayDistanceBlockTypeAccessoryCodeBlockDivergenceBlockMountingPositionBlockNumberBlockNameBlockThicknessBlockTransmissionBlockNumberOfPointsBlockDataApplicatorSequenceApplicatorIDApplicatorTypeApplicatorDescriptionCumulativeDoseReferenceCoefficientFinalCumulativeMetersetWeightNumberOfControlPointsControlPointSequenceControlPointIndexNominalBeamEnergyDoseRateSetWedgePositionSequenceWedgePositionBeamLimitingDevicePositionSequenceLeafJawPositionsGantryAngleGantryRotationDirectionBeamLimitingDeviceAngleBeamLimitingDeviceRotationDirectionPatientSupportAnglePatientSupportRotationDirectionTableTopEccentricAxisDistanceTableTopEccentricAngleTableTopEccentricRotationDirectionTableTopVerticalPositionTableTopLongitudinalPositionTableTopLateralPositionIsocenterPositionSurfaceEntryPointSourceToSurfaceDistanceAverageBeamDosePointSourceToExternalContourSurfaceDistanceSourceToExternalContourDistanceExternalContourEntryPointCumulativeMetersetWeightTableTopPitchAngleTableTopPitchRotationDirectionTableTopRollAngleTableTopRollRotationDirectionHeadFixationAngleGantryPitchAngleGantryPitchRotationDirectionGantryPitchAngleToleranceFixationEyeChairHeadFramePositionHeadFixationAngleToleranceChairHeadFramePositionToleranceFixationLightAzimuthalAngleToleranceFixationLightPolarAngleTolerancePatientSetupSequencePatientSetupNumberPatientSetupLabelPatientAdditionalPositionFixationDeviceSequenceFixationDeviceTypeFixationDeviceLabelFixationDeviceDescriptionFixationDevicePositionFixationDevicePitchAngleFixationDeviceRollAngleShieldingDeviceSequenceShieldingDeviceTypeShieldingDeviceLabelShieldingDeviceDescriptionShieldingDevicePositionSetupTechniqueSetupTechniqueDescriptionSetupDeviceSequenceSetupDeviceTypeSetupDeviceLabelSetupDeviceDescriptionSetupDeviceParameterSetupReferenceDescriptionTableTopVerticalSetupDisplacementTableTopLongitudinalSetupDisplacementTableTopLateralSetupDisplacementBrachyTreatmentTechniqueBrachyTreatmentTypeTreatmentMachineSequenceSourceSequenceSourceNumberSourceTypeSourceManufacturerActiveSourceDiameterActiveSourceLengthSourceModelIDSourceDescriptionSourceEncapsulationNominalThicknessSourceEncapsulationNominalTransmissionSourceIsotopeNameSourceIsotopeHalfLifeSourceStrengthUnitsReferenceAirKermaRateSourceStrengthSourceStrengthReferenceDateSourceStrengthReferenceTimeApplicationSetupSequenceApplicationSetupTypeApplicationSetupNumberApplicationSetupNameApplicationSetupManufacturerTemplateNumberTemplateTypeTemplateNameTotalReferenceAirKermaBrachyAccessoryDeviceSequenceBrachyAccessoryDeviceNumberBrachyAccessoryDeviceIDBrachyAccessoryDeviceTypeBrachyAccessoryDeviceNameBrachyAccessoryDeviceNominalThicknessBrachyAccessoryDeviceNominalTransmissionChannelEffectiveLengthChannelInnerLengthAfterloaderChannelIDSourceApplicatorTipLengthChannelSequenceChannelNumberChannelLengthChannelTotalTimeSourceMovementTypeNumberOfPulsesPulseRepetitionIntervalSourceApplicatorNumberSourceApplicatorIDSourceApplicatorTypeSourceApplicatorNameSourceApplicatorLengthSourceApplicatorManufacturerSourceApplicatorWallNominalThicknessSourceApplicatorWallNominalTransmissionSourceApplicatorStepSizeApplicatorShapeReferencedROINumberTransferTubeNumberTransferTubeLengthChannelShieldSequenceChannelShieldNumberChannelShieldIDChannelShieldNameChannelShieldNominalThicknessChannelShieldNominalTransmissionFinalCumulativeTimeWeightBrachyControlPointSequenceControlPointRelativePositionControlPoint3DPositionCumulativeTimeWeightCompensatorDivergenceCompensatorMountingPositionSourceToCompensatorDistanceTotalCompensatorTrayWaterEquivalentThicknessIsocenterToCompensatorTrayDistanceCompensatorColumnOffsetIsocenterToCompensatorDistancesCompensatorRelativeStoppingPowerRatioCompensatorMillingToolDiameterIonRangeCompensatorSequenceCompensatorDescriptionRadiationMassNumberRadiationAtomicNumberRadiationChargeStateScanModeModulatedScanModeTypeVirtualSourceAxisDistancesSnoutSequenceSnoutPositionSnoutIDNumberOfRangeShiftersRangeShifterSequenceRangeShifterNumberRangeShifterIDRangeShifterTypeRangeShifterDescriptionNumberOfLateralSpreadingDevicesLateralSpreadingDeviceSequenceLateralSpreadingDeviceNumberLateralSpreadingDeviceIDLateralSpreadingDeviceTypeLateralSpreadingDeviceDescriptionLateralSpreadingDeviceWaterEquivalentThicknessNumberOfRangeModulatorsRangeModulatorSequenceRangeModulatorNumberRangeModulatorIDRangeModulatorTypeRangeModulatorDescriptionBeamCurrentModulationIDPatientSupportTypePatientSupportIDPatientSupportAccessoryCodeTrayAccessoryCodeFixationLightAzimuthalAngleFixationLightPolarAngleMetersetRateRangeShifterSettingsSequenceRangeShifterSettingIsocenterToRangeShifterDistanceRangeShifterWaterEquivalentThicknessLateralSpreadingDeviceSettingsSequenceLateralSpreadingDeviceSettingIsocenterToLateralSpreadingDeviceDistanceRangeModulatorSettingsSequenceRangeModulatorGatingStartValueRangeModulatorGatingStopValueRangeModulatorGatingStartWaterEquivalentThicknessRangeModulatorGatingStopWaterEquivalentThicknessIsocenterToRangeModulatorDistanceScanSpotTimeOffsetScanSpotTuneIDScanSpotPrescribedIndicesNumberOfScanSpotPositionsScanSpotReorderedScanSpotPositionMapScanSpotReorderingAllowedScanSpotMetersetWeightsScanningSpotSizeScanSpotSizesDeliveredNumberOfPaintingsIonToleranceTableSequenceIonBeamSequenceIonBeamLimitingDeviceSequenceIonBlockSequenceIonControlPointSequenceIonWedgeSequenceIonWedgePositionSequenceReferencedSetupImageSequenceSetupImageCommentMotionSynchronizationSequenceControlPointOrientationGeneralAccessorySequenceGeneralAccessoryIDGeneralAccessoryDescriptionGeneralAccessoryTypeGeneralAccessoryNumberSourceToGeneralAccessoryDistanceIsocenterToGeneralAccessoryDistanceApplicatorGeometrySequenceApplicatorApertureShapeApplicatorOpeningApplicatorOpeningXApplicatorOpeningYSourceToApplicatorMountingPositionDistanceNumberOfBlockSlabItemsBlockSlabSequenceBlockSlabThicknessBlockSlabNumberDeviceMotionControlSequenceDeviceMotionExecutionModeDeviceMotionObservationModeDeviceMotionParameterCodeSequenceDistalDepthFractionDistalDepthNominalRangeModulationFractionsNominalRangeModulatedRegionDepthsDepthDoseParametersSequenceDeliveredDepthDoseParametersSequenceDeliveredDistalDepthFractionDeliveredDistalDepthDeliveredNominalRangeModulationFractionsDeliveredNominalRangeModulatedRegionDepthsDeliveredReferenceDoseDefinitionReferenceDoseDefinitionRTControlPointIndexRadiationGenerationModeIndexReferencedDefinedDeviceIndexRadiationDoseIdentificationIndexNumberOfRTControlPointsReferencedRadiationGenerationModeIndexTreatmentPositionIndexReferencedDeviceIndexTreatmentPositionGroupLabelTreatmentPositionGroupUIDTreatmentPositionGroupSequenceReferencedTreatmentPositionIndexReferencedRadiationDoseIdentificationIndexRTAccessoryHolderWaterEquivalentThicknessReferencedRTAccessoryHolderDeviceIndexRTAccessoryHolderSlotExistenceFlagRTAccessoryHolderSlotSequenceRTAccessoryHolderSlotIDRTAccessoryHolderSlotDistanceRTAccessorySlotDistanceRTAccessoryHolderDefinitionSequenceRTAccessoryDeviceSlotIDRTRadiationSequenceRadiationDoseSequenceRadiationDoseIdentificationSequenceRadiationDoseIdentificationLabelReferenceDoseTypePrimaryDoseValueIndicatorDoseValuesSequenceDoseValuePurposeReferenceDosePointCoordinatesRadiationDoseValuesParametersSequenceMetersetToDoseMappingSequenceExpectedInVivoMeasurementValuesSequenceExpectedInVivoMeasurementValueIndexRadiationDoseInVivoMeasurementLabelRadiationDoseCentralAxisDisplacementRadiationDoseValueRadiationDoseSourceToSkinDistanceRadiationDoseMeasurementPointCoordinatesRadiationDoseSourceToExternalContourDistanceRTToleranceSetSequenceRTToleranceSetLabelAttributeToleranceValuesSequenceToleranceValuePatientSupportPositionToleranceSequenceTreatmentTimeLimitCArmPhotonElectronControlPointSequenceReferencedRTRadiationSequenceReferencedRTInstanceSequenceReferencedRTPatientSetupSequenceSourceToPatientSurfaceDistanceTreatmentMachineSpecialModeCodeSequenceIntendedNumberOfFractionsRTRadiationSetIntentRTRadiationPhysicalAndGeometricContentDetailFlagRTRecordFlagTreatmentDeviceIdentificationSequenceReferencedRTPhysicianIntentSequenceCumulativeMetersetDeliveryRateDeliveryRateUnitSequenceTreatmentPositionSequenceRadiationSourceAxisDistanceNumberOfRTBeamLimitingDevicesRTBeamLimitingDeviceProximalDistanceRTBeamLimitingDeviceDistalDistanceParallelRTBeamDelimiterDeviceOrientationLabelCodeSequenceBeamModifierOrientationAngleFixedRTBeamDelimiterDeviceSequenceParallelRTBeamDelimiterDeviceSequenceNumberOfParallelRTBeamDelimitersParallelRTBeamDelimiterBoundariesParallelRTBeamDelimiterPositionsRTBeamLimitingDeviceOffsetRTBeamDelimiterGeometrySequenceRTBeamLimitingDeviceDefinitionSequenceParallelRTBeamDelimiterOpeningModeParallelRTBeamDelimiterLeafMountingSidePatientSetupUIDWedgeDefinitionSequenceRadiationBeamWedgeAngleRadiationBeamWedgeThinEdgeDistanceRadiationBeamEffectiveWedgeAngleNumberOfWedgePositionsRTBeamLimitingDeviceOpeningSequenceNumberOfRTBeamLimitingDeviceOpeningsRadiationDosimeterUnitSequenceRTDeviceDistanceReferenceLocationCodeSequenceRadiationDeviceConfigurationAndCommissioningKeySequencePatientSupportPositionParameterSequencePatientSupportPositionSpecificationMethodPatientSupportPositionDeviceParameterSequenceDeviceOrderIndexPatientSupportPositionParameterOrderIndexPatientSupportPositionDeviceToleranceSequencePatientSupportPositionToleranceOrderIndexCompensatorDefinitionSequenceCompensatorMapOrientationCompensatorProximalThicknessMapCompensatorDistalThicknessMapCompensatorBasePlaneOffsetCompensatorShapeFabricationCodeSequenceCompensatorShapeSequenceRadiationBeamCompensatorMillingToolDiameterBlockDefinitionSequenceBlockEdgeDataBlockOrientationRadiationBeamBlockThicknessRadiationBeamBlockSlabThicknessBlockEdgeDataSequenceNumberOfRTAccessoryHoldersGeneralAccessoryDefinitionSequenceNumberOfGeneralAccessoriesBolusDefinitionSequenceNumberOfBolusesEquipmentFrameOfReferenceUIDEquipmentFrameOfReferenceDescriptionEquipmentReferencePointCoordinatesSequenceEquipmentReferencePointCodeSequenceRTBeamLimitingDeviceAngleSourceRollAngleRadiationGenerationModeSequenceRadiationGenerationModeLabelRadiationGenerationModeDescriptionRadiationGenerationModeMachineCodeSequenceRadiationTypeCodeSequenceNominalEnergyMinimumNominalEnergyMaximumNominalEnergyRadiationFluenceModifierCodeSequenceEnergyUnitCodeSequenceNumberOfRadiationGenerationModesPatientSupportDevicesSequenceNumberOfPatientSupportDevicesRTBeamModifierDefinitionDistanceBeamAreaLimitSequenceReferencedRTPrescriptionSequenceDoseValueInterpretationTreatmentSessionUIDRTRadiationUsageReferencedRTRadiationSetSequenceReferencedRTRadiationRecordSequenceRTRadiationSetDeliveryNumberClinicalFractionNumberRTTreatmentFractionCompletionStatusRTRadiationSetUsageTreatmentDeliveryContinuationFlagTreatmentRecordContentOriginRTTreatmentTerminationStatusRTTreatmentTerminationReasonCodeSequenceMachineSpecificTreatmentTerminationCodeSequenceRTRadiationSalvageRecordControlPointSequenceStartingMetersetValueKnownFlagTreatmentTerminationDescriptionTreatmentToleranceViolationSequenceTreatmentToleranceViolationCategoryTreatmentToleranceViolationAttributeSequenceTreatmentToleranceViolationDescriptionTreatmentToleranceViolationIdentificationTreatmentToleranceViolationDateTimeRecordedRTControlPointDateTimeReferencedRadiationRTControlPointIndexAlternateValueSequenceConfirmationSequenceInterlockSequenceInterlockDateTimeInterlockDescriptionInterlockOriginatingDeviceSequenceInterlockCodeSequenceInterlockResolutionCodeSequenceInterlockResolutionUserSequenceOverrideDateTimeTreatmentToleranceViolationTypeCodeSequenceTreatmentToleranceViolationCauseCodeSequenceMeasuredMetersetToDoseMappingSequenceReferencedExpectedInVivoMeasurementValueIndexDoseMeasurementDeviceCodeSequenceAdditionalParameterRecordingInstanceSequenceRETIRED_undefinedInterlockOriginDescriptionRTPatientPositionScopeSequenceReferencedTreatmentPositionGroupUIDRadiationOrderIndexOmittedRadiationSequenceReasonForOmissionCodeSequenceRTDeliveryStartPatientPositionSequenceRTTreatmentPreparationPatientPositionSequenceReferencedRTTreatmentPreparationSequenceReferencedPatientSetupPhotoSequencePatientTreatmentPreparationMethodCodeSequencePatientTreatmentPreparationProcedureParameterDescriptionPatientTreatmentPreparationDeviceSequencePatientTreatmentPreparationProcedureSequencePatientTreatmentPreparationProcedureCodeSequencePatientTreatmentPreparationMethodDescriptionPatientTreatmentPreparationProcedureParameterSequencePatientSetupPhotoDescriptionPatientTreatmentPreparationProcedureIndexReferencedPatientSetupProcedureIndexRTRadiationTaskSequenceRTPatientPositionDisplacementSequenceRTPatientPositionSequenceDisplacementReferenceLabelDisplacementMatrixPatientSupportDisplacementSequenceDisplacementReferenceLocationCodeSequenceRTRadiationSetDeliveryUsagePatientTreatmentPreparationSequencePatientToEquipmentRelationshipSequenceImagingEquipmentToTreatmentDeliveryDeviceRelationshipSequenceReferencedRTPlanSequenceReferencedBeamSequenceReferencedBeamNumberReferencedReferenceImageNumberStartCumulativeMetersetWeightEndCumulativeMetersetWeightReferencedBrachyApplicationSetupSequenceReferencedBrachyApplicationSetupNumberReferencedSourceNumberReferencedFractionGroupSequenceReferencedFractionGroupNumberReferencedVerificationImageSequenceReferencedReferenceImageSequenceReferencedDoseReferenceSequenceReferencedDoseReferenceNumberBrachyReferencedDoseReferenceSequenceReferencedStructureSetSequenceReferencedPatientSetupNumberReferencedDoseSequenceReferencedToleranceTableNumberReferencedBolusSequenceReferencedWedgeNumberReferencedCompensatorNumberReferencedBlockNumberReferencedControlPointIndexReferencedControlPointSequenceReferencedStartControlPointIndexReferencedStopControlPointIndexReferencedRangeShifterNumberReferencedLateralSpreadingDeviceNumberReferencedRangeModulatorNumberOmittedBeamTaskSequenceReasonForOmissionReasonForOmissionDescriptionPrescriptionOverviewSequenceTotalPrescriptionDosePlanOverviewSequencePlanOverviewIndexReferencedPlanOverviewIndexNumberOfFractionsIncludedDoseCalibrationConditionsSequenceAbsorbedDoseToMetersetRatioDelineatedRadiationFieldSizeDoseCalibrationConditionsVerifiedFlagCalibrationReferencePointDepthGatingBeamHoldTransitionSequenceBeamHoldTransitionBeamHoldTransitionDateTimeBeamHoldOriginatingDeviceSequenceBeamHoldTransitionTriggerSourceApprovalStatusReviewDateReviewTimeReviewerNameRadiobiologicalDoseEffectSequenceRadiobiologicalDoseEffectFlagEffectiveDoseCalculationMethodCategoryCodeSequenceEffectiveDoseCalculationMethodCodeSequenceEffectiveDoseCalculationMethodDescriptionConceptualVolumeUIDOriginatingSOPInstanceReferenceSequenceConceptualVolumeConstituentSequenceEquivalentConceptualVolumeInstanceReferenceSequenceEquivalentConceptualVolumesSequenceReferencedConceptualVolumeUIDConceptualVolumeCombinationExpressionConceptualVolumeConstituentIndexConceptualVolumeCombinationFlagConceptualVolumeCombinationDescriptionConceptualVolumeSegmentationDefinedFlagConceptualVolumeSegmentationReferenceSequenceConceptualVolumeConstituentSegmentationReferenceSequenceConstituentConceptualVolumeUIDDerivationConceptualVolumeSequenceSourceConceptualVolumeUIDConceptualVolumeDerivationAlgorithmSequenceConceptualVolumeDescriptionSourceConceptualVolumeSequenceAuthorIdentificationSequenceManufacturerModelVersionDeviceAlternateIdentifierDeviceAlternateIdentifierTypeDeviceAlternateIdentifierFormatSegmentationCreationTemplateLabelSegmentationTemplateUIDReferencedSegmentReferenceIndexSegmentReferenceSequenceSegmentReferenceIndexDirectSegmentReferenceSequenceCombinationSegmentReferenceSequenceConceptualVolumeSequenceSegmentedRTAccessoryDeviceSequenceSegmentCharacteristicsSequenceRelatedSegmentCharacteristicsSequenceSegmentCharacteristicsPrecedenceRTSegmentAnnotationSequenceSegmentAnnotationCategoryCodeSequenceSegmentAnnotationTypeCodeSequenceDeviceLabelDeviceTypeCodeSequenceSegmentAnnotationTypeModifierCodeSequencePatientEquipmentRelationshipCodeSequenceReferencedFiducialsUIDPatientTreatmentOrientationSequenceUserContentLabelUserContentLongLabelEntityLabelEntityNameEntityDescriptionEntityLongLabelDeviceIndexRTTreatmentPhaseIndexRTTreatmentPhaseUIDRTPrescriptionIndexRTSegmentAnnotationIndexBasisRTTreatmentPhaseIndexRelatedRTTreatmentPhaseIndexReferencedRTTreatmentPhaseIndexReferencedRTPrescriptionIndexReferencedParentRTPrescriptionIndexManufacturerDeviceIdentifierInstanceLevelReferencedPerformedProcedureStepSequenceRTTreatmentPhaseIntentPresenceFlagRadiotherapyTreatmentTypeTeletherapyRadiationTypeBrachytherapySourceTypeReferencedRTTreatmentPhaseSequenceReferencedDirectSegmentInstanceSequenceIntendedRTTreatmentPhaseSequenceIntendedPhaseStartDateIntendedPhaseEndDateRTTreatmentPhaseIntervalSequenceTemporalRelationshipIntervalAnchorMinimumNumberOfIntervalDaysMaximumNumberOfIntervalDaysPertinentSOPClassesInStudyPertinentSOPClassesInSeriesRTPrescriptionLabelRTPhysicianIntentPredecessorSequenceRTTreatmentApproachLabelRTPhysicianIntentSequenceRTPhysicianIntentIndexRTTreatmentIntentTypeRTPhysicianIntentNarrativeRTProtocolCodeSequenceReasonForSupersedingRTDiagnosisCodeSequenceReferencedRTPhysicianIntentIndexRTPhysicianIntentInputInstanceSequenceRTAnatomicPrescriptionSequencePriorTreatmentDoseDescriptionPriorTreatmentReferenceSequenceDosimetricObjectiveEvaluationScopeTherapeuticRoleCategoryCodeSequenceTherapeuticRoleTypeCodeSequenceConceptualVolumeOptimizationPrecedenceConceptualVolumeCategoryCodeSequenceConceptualVolumeBlockingConstraintConceptualVolumeTypeCodeSequenceConceptualVolumeTypeModifierCodeSequenceRTPrescriptionSequenceDosimetricObjectiveSequenceDosimetricObjectiveTypeCodeSequenceDosimetricObjectiveUIDReferencedDosimetricObjectiveUIDDosimetricObjectiveParameterSequenceReferencedDosimetricObjectivesSequenceAbsoluteDosimetricObjectiveFlagDosimetricObjectiveWeightDosimetricObjectivePurposePlanningInputInformationSequenceTreatmentSiteTreatmentSiteCodeSequenceFractionPatternSequenceTreatmentTechniqueNotesPrescriptionNotesNumberOfIntervalFractionsNumberOfFractionsIntendedDeliveryDurationFractionationNotesRTTreatmentTechniqueCodeSequencePrescriptionNotesSequenceFractionBasedRelationshipSequenceFractionBasedRelationshipIntervalAnchorMinimumHoursBetweenFractionsIntendedFractionStartTimeIntendedStartDayOfWeekWeekdayFractionPatternSequenceDeliveryTimeStructureCodeSequenceTreatmentSiteModifierCodeSequenceRoboticBaseLocationIndicatorRoboticPathNodeSetCodeSequenceRoboticNodeIdentifierRTTreatmentSourceCoordinatesRadiationSourceCoordinateSystemYawAngleRadiationSourceCoordinateSystemRollAngleRadiationSourceCoordinateSystemPitchAngleRoboticPathControlPointSequenceTomotherapeuticControlPointSequenceTomotherapeuticLeafOpenDurationsTomotherapeuticLeafInitialClosedDurationsConceptualVolumeIdentificationSequenceRETIRED_ArbitraryRETIRED_TextCommentsRETIRED_ResultsIDRETIRED_ResultsIDIssuerRETIRED_ReferencedInterpretationSequenceRETIRED_ReportProductionStatusTrialRETIRED_InterpretationRecordedDateRETIRED_InterpretationRecordedTimeRETIRED_InterpretationRecorderRETIRED_ReferenceToRecordedSoundRETIRED_InterpretationTranscriptionDateRETIRED_InterpretationTranscriptionTimeRETIRED_InterpretationTranscriberRETIRED_InterpretationTextRETIRED_InterpretationAuthorRETIRED_InterpretationApproverSequenceRETIRED_InterpretationApprovalDateRETIRED_InterpretationApprovalTimeRETIRED_PhysicianApprovingInterpretationRETIRED_InterpretationDiagnosisDescriptionRETIRED_InterpretationDiagnosisCodeSequenceRETIRED_ResultsDistributionListSequenceRETIRED_DistributionNameRETIRED_DistributionAddressRETIRED_InterpretationIDRETIRED_InterpretationIDIssuerRETIRED_InterpretationTypeIDRETIRED_InterpretationStatusIDRETIRED_ImpressionsRETIRED_ResultsCommentsLowEnergyDetectorsHighEnergyDetectorsDetectorGeometrySequenceThreatROIVoxelSequenceThreatROIBaseThreatROIExtentsThreatROIBitmapRouteSegmentIDGantryTypeOOIOwnerTypeRouteSegmentSequencePotentialThreatObjectIDThreatSequenceThreatCategoryThreatCategoryDescriptionATDAbilityAssessmentATDAssessmentFlagATDAssessmentProbabilityMassDensityZEffectiveBoardingPassIDCenterOfMassCenterOfPTOBoundingPolygonRouteSegmentStartLocationIDRouteSegmentEndLocationIDRouteSegmentLocationIDTypeAbortReasonVolumeOfPTOAbortFlagRouteSegmentStartTimeRouteSegmentEndTimeTDRTypeInternationalRouteSegmentThreatDetectionAlgorithmandVersionAssignedLocationAlarmDecisionTimeAlarmDecisionNumberOfTotalObjectsNumberOfAlarmObjectsPTORepresentationSequenceATDAssessmentSequenceTIPTypeDICOSVersionOOIOwnerCreationTimeOOITypeOOISizeAcquisitionStatusBasisMaterialsCodeSequencePhantomTypeOOIOwnerSequenceScanTypeItineraryIDItineraryIDTypeItineraryIDAssigningAuthorityRouteIDRouteIDAssigningAuthorityInboundArrivalTypeCarrierIDCarrierIDAssigningAuthoritySourceOrientationSourcePositionBeltHeightAlgorithmRoutingCodeSequenceTransportClassificationOOITypeDescriptorTotalProcessingTimeDetectorCalibrationDataAdditionalScreeningPerformedAdditionalInspectionSelectionCriteriaAdditionalInspectionMethodSequenceAITDeviceTypeQRMeasurementsSequenceTargetMaterialSequenceSNRThresholdImageScaleRepresentationReferencedPTOSequenceReferencedTDRInstanceSequencePTOLocationDescriptionAnomalyLocatorIndicatorSequenceAnomalyLocatorIndicatorPTORegionSequenceInspectionSelectionCriteriaSecondaryInspectionMethodSequencePRCSToRCSOrientationMACParametersSequenceSharedFunctionalGroupsSequencePerFrameFunctionalGroupsSequenceWaveformSequenceChannelMinimumValueChannelMaximumValueWaveformBitsAllocatedWaveformSampleInterpretationWaveformPaddingValueWaveformDataFirstOrderPhaseCorrectionAngleSpectroscopyDataExtendedOffsetTableExtendedOffsetTableLengthsEncapsulatedPixelDataValueTotalLengthFloatPixelDataDoubleFloatPixelDataPixelDataRETIRED_CoefficientsSDVNRETIRED_CoefficientsSDHNRETIRED_CoefficientsSDDNDigitalSignaturesSequenceDataSetTrailingPaddingItemItemDelimitationItemSequenceDelimitationItem\";\n\nconst _b64 = {\n groups_b64:\n \"AAACAAQACAAQABIAFAAWABgAIAAiACQAKAAyADQAOAA6AEAAQgBEAEYASABQAFIAVABgAGIAZABmAGgAagBwAHIAdAB2AHgAgACCAIgAAAEABAAQEBAAIBAgICAwIEAgUCAAIRAhICEwIQAiAjAEMAYwCDAKMAwwDjAQMABACEAQQP5PAFIAVABW4H/6//z//v8=\",\n groupStart_b64:\n \"AAAAAC4AAAA6AAAATQAAAFUBAACiAQAAwgEAAIwCAAD6AgAAegYAAPQGAACjBwAACAgAAP8IAAAdCQAAKQkAAEcJAACGCQAAzgoAANQKAADtCgAARgsAAGsLAAB8CwAAlgsAAOcLAADuCwAAAwwAAAsMAABPDAAAmgwAAKoMAABmDQAA4g0AACwOAABDDgAAVQ4AAGIOAAB6DgAAgQ4AAIUOAAChDgAApw4AAKgOAAC9DgAA1w4AAOIOAADkDgAA8A4AAPMOAAD9DgAAAQ8AAAQPAAANDwAAHQ8AAGwPAACEDwAAww8AACcQAACOEgAAwBIAAMQSAABYEwAAWhMAAHYTAADMEwAAzRMAAM8TAADWEwAA2BMAAOETAADiEwAA4xMAAA==\",\n elems_b64:\n \"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AKMBowejCqMTozqjQKNSo1OjVKNYo2CjcKNyo3WjgKOFo5CjAqQDpASkkaSSpJOklKSWpASlJaUApgGmA6YwpzGnMqdEpwGoAqgDqASoBagGqAeoCKiSqSCwANsG2wfbC9sM2w3bc9sB4ATgBuAI4BDgEeAg4CHgIuAj4CTgJeAw4DHgEAARABIAEwAUABUAAQACAAMABAAHAAgACQAKAAsAEAARABIAEwAZAAABAQECAQMBBAEFAQYBBwEIAQkBCgESABQAFQAWABgAKAAwADIANAA2ADgAQABCAEQARgBHAFAAUgBgAGIAYwBkAHAAcQB0AHUAdgB3AIAAkgCUAJUAlwCYAAABAQECAQQBBgEQAREBEgETARQBFQEWARcBGAEhASIBIwEkASUBNQE3ATkBRQFGAUcBAQICAgMCBAIFAgcCCAIQAhECEgITAhUCGAIgAiQCJwIwAjICNAI2AjgCQgJEAkcCSAJJAlACUQJSAlMCAQACAAMABgAHAAgAEAARABIAEwAUABUAAAECAQUBBgEHAQgBEAERARIBEwEUARUBFgEXASABAAIBAgICBwIaAh4CHwIBAwIDAwMEABAAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAgACEAAQACAAMABAAGAAcACAAJABEAEgATABQAFgAlACYAJwAoACkAMAAxADMANAA2ADgAOQA6ABAAEQASABMAFAAVABYAFwAYACAAIQAiADAAMQAyADMANgA4ADkAUABRAFIAUwBgAGEAYgBjAHAAcQByAHMAgACBAJAAAAEBAQACAgIQAhECIAIiAgADAgMEAwYDCAMABBAEEgQUBAAFAQUAEAEQAhAEEAYQABEBEQIRAxEEEQURABIBEgISAxIQEiASABMQExETIBMhEyITIxMkEzATABQBFAAwAjAEMAYwCDAQMCAwAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAgACEAAgADAAUABwAIAAkADwAQAAEAAgADAAQACQAKAAsADAANAA4AEAARABIAEwAVABYAFwAYABkAGgAbABwAHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIANAA1ADYANwA4AEAAQQBCAEMAAQECAQMBBAEFAQYBBwEIASEBJAElASkBMAEyATMBNAEQYiFiImIjYiRiJWImYjBiYGJlYnBigGKgYqViwGLQYtVi4GLwYvJiAGMQYyBjMGNAY0VjRmNHY1BjYGOAY5BjoGOkY6hjrGOwY8Bj0GPgY/BjAGQQZCBkMGRAZFBkYGRwZJBkoGTAZNBk8GQAZRBlIGUwZUBlRWVQZWBlkGWgZbBl0GXgZfBlEGYgZgFwAnADcARwBXABAAIAAwAFAAYABwAIAAkACgALAAwADQAOAA8AEAARAAEAAgADAAQABQAGAAgACQAQABEAEgAUABUAIAAhACIAIwAkAEAAQQBCAFAAUQBSAFMAWgBgAGIAZgBnAGgAgACBAIIAgwCEAIYAhwAAAQEBAgEDAQcCCAIJAiYCJwIoAikCMAIxAjICMwI0AkECQgJDAkQCRQJGAkcCSAJJAlACUQJSAlMCVAJVAlYCVwJYAmECYgJzAnQCeAJ5AoIChAKFAocCiAKJApQClQIGAwgDCQMKAwsDDAMNAw8DEAMRAxIDFAMVAxgDGgMbAxwDHgMfAwEEAgQDBAQEBQQBEQIRAxEEEQESAhIDEgQSBRIGEgcSCBIJEgoSCxIMEg0SARMCEwMTBBMFEwYTCRMBFQIVAxUFFQcVCBUMFQ0VERUSFQIWAxYEFgUWBhYHFgEXAhcDFwQXBRcGFwEYAhgDGAQYBRgGGAcYCBgBGQMZBBkFGQcZARoDGgQaBRoGGgcaCBoJGgEbAhsDGwQbBhsHGwgbERsSGxMbFBsCAAQABgAIAAoADAAOABAAEgAUACAAIgAkACYAKAAwADIANAA4ADoAPAA+AEAAUABSAFQAVgBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHgAegB8AH4AfwCAAIEAggCDAAABAgEEAQYBCAEKAQwBDgEAAgICAwIEAgYCCAIQAhICFAIWAhgCAAMCAwQDBgMIAxADEgMUAxYDGAMgAzADAAQCBAQEBgQgBCEEIgQkBCcEMAQyBDQEAAUQBRIFFAUWBSAFAAYCBgQGAAcCBwQHBQcGBxAHEgcUBxYHFwcYByABIQEAEAIQBBAGEAcQCBAKEAwQDhAgECIQJBAlECYQJxAoECoQKxAsEC0QMBAyEDQQNhA4EDoQQBBCEEQQRhBIEEoQTBBOEFAQUhBUEFYQVxAAEgISBBIQEhISFhIgEiISJBIwEjQSNhI4EkISRBJGEiQTOBM6EwEUAhQDFAQUBRQGFAcUCBQJFAoUCxQMFA0UDhQBAAMABgAIAAoADAAOABAAIAAwADIANAA2ADgAQABVAGAAcACAAJAAoACwAMAAAQAQACAAJAAmACgAKgAuAFAAYABwAJAAoACwALIAtAC2ALgAAQACAAMABAAFAAYABwAIAAkAEAARABIAEwABAAMABAAFAAYABwAIAAoADAAQABYAFwAYABkAIQAiACMAMgAzADQANQA2ADcAOAAwAUABAAIECQYJEAkSCRAEIAQkBCYEBQAQABUAIAAAAQUBEAEVASABBQMQAxUDAQQCBAMEBAQABRAFIAVQBVEFUgVhBWIFYwVkBWUFAAYQABEAEgATABQAFQAEABAAHgAgADAAQABQAGAAYQBiAGMAZQBnAGkAagCgAKEAogCkAKgAAAUQBRAAMABAAFAAUgBUAGAAgACmAKcAqACpAAABEAEgATABQAFQAVIBVAFeAWABdgMABRAFIAUQACAAMABAAFAAoACiABABEQEwAUABEAAgABAAEQAgAGAAcAByAHQAgACCAJAAAAEABRAAIAAABRAAIAAwAEAAUABwAEABYAFwAQAFEAAgADAAmQAQAFAAcAAQABUAMABAAFAAYACAAKAAwAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAgAAIAAwAEAAoADAANAA4AEAARABIAIAAiACQAJgAoACkAMAAyADQAQABBAEIAUABRAFIAAAEBAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBAQACAAQABQAGAAgACgAMAA4AEAASABQAQABCAFAAUgBUAFYAWABgAGIAcAByAHQAAgAEAAYACAAJABAAEgAUABYAGAAgACIAJAAmACgAKgAsAC0ALgAwADMANgA3ADgAOQBAAEIARABFAEYASABJAEoASwBMAE0ATgBPAFAAgACCAIQAhQCGAIgAoACkAKYAsACyALQAtgC3ALgAuQDAAMIAxADGAMgAyQDKAMsAEAASABQAFgAgACEAIgAkACUAKgArACwAMAAyADMANgA3ADoAOwBAAEEAQgBEAEUARgBHAEgAUABSAFQAVgBaAGAAYQBiAGMAZABlAGYAZwBoAGoAcAByAHQAdgB4AHoAgACCAJAAkgCgAKEAogCjAKQAsADAANAA0QDgAPAA8gD0APYAAAEFARABFgEgASIBMAEyATQBNgE4AToBPAFAAUIBUAFSAWABYgFkAWYBaAFxAXIBcwEAAgICIAIjAiQCMAJAAlACUQICAAMABAAGAAcACQAKAAsADAAOABAAEgATABQAFQAWABgAGgAgACEAIgAjACUAJgAnACgAKgArACwALQBAAEIAQwBEAEYASABKAEsATABOAE8AUABRAFIAUwBUAFUAcABxAHIAeAB5AHoAewCAAIIAgwCEAIYAiACJAIoAiwCMAI0AjgCPAJAAkQCSAJMAlACgAKIApACwALIAswC0ALYAuAC6ALsAvAC+AMAAwgDDAMQAxQDGAMcAyADKAMwAzgDQANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDgAOEA4gDjAOQA5QDmAOcA6ADpAOoA6wDsAO0A7gDvAPAA8gDzAPQA9QD2APcA+AD5APoA+wD8AP4AAAECAQQBBgEHAQgBCQEKAQwBDgEQAREBEgEUARUBFgEYARoBHAEeAR8BIAEhASIBIwEkASUBJgEoASkBKgEsAS4BMAExATIBMwE0AUABQgFEAUYBSAFKAUwBTgFQAVEBUgFTAVQBVQGAAYIBgwGEAZABkgGUAZYBmAGZAZoBoAGiAaQBpgGoAbABsgG0AbYBuAG6AbwB0AHSAdQB1gEAAgICBgIQAhICFAIWAhgCGgIbAhwCIgIkAiYCKAIpAioCKwIsAi4CMAIyAjQCNgI4AkACQgJEAlACYAJiAmMCZAJmAmoCbAJxAnICcwJ0AoACggKEAoYCiAKKAowCkAKRApIClAKWApgCnAKeAqACoQKiAqQCsAKyArMCtAK4AroCyALQAtIC1ALWAuAC4QLiAuMC5ALlAuYC5wLoAuoC6wICAwQDBgMIAwkDCgMMAw0DDwMSAxQDFgMYAyADIgMwAzIDNAM2AzgDOgM8A0ADQgNEA0YDSANKA0wDUANSA1QDVQNWA1gDWgNgA2IDZANmA3ADcgN0A4ADggOEA4YDiAOKA48DkAORA5IDkwOUA5UDlgOYA5kDmgOgA6IDpAOmA6gDqgOsAwEEAgQQBBIEIAQhBCIEIwQkBCUEJgQxBDIEMwQ0BDUENgRABEEEQgRDBFAEUQRSBFMEAQUCBQMFBAUFBQYFBwUIBQkFEAURBRIFAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGNAY1BjYGNwY4BjkGOgY7BjwGPQY+Bj8GQAZBBkIGQwZEBkUGRgZHBkgGSQZKBksGTAZNBk4GTwZQBlEGUgZTBlQGVQZWBlcGWAZZBloGWwZcBl0GXgZfBmAGYQZiBmMGZAZlBmYGZwZoBmkGagZrBmwGbQZuBm8GcAZxBnIGcwZ0BnUGdgZ3BngGeQZ6BnsGfAZ9Bn4GfwaABoEGggaDBoQGhQaGBocGiAaJBooGiwYABwEHAgcDBwQHBQcGBwcHCAcJBxQHFQcWByIHIwcwBzEHMgczBzQHNQc2BzoHOwc+Bz8HQAdBB0IHQwdEB0UHRgdgB2EHYgdyB3MHdAeAB4IHgweEB4UHhgeHB4gHiQeKB4sHjAeNB44HjweQB5EHkgeTB5QHlQeWB5cHmAeZB5oHmwecB50HngefB6AHoQcCAAQABgAHAAgACQAKAAwADgAgACIAQABCAFAAUQBVAGAAagCAAKAAsADAANAA4ADwAPIA9AD2AAABAgEEAREBEgETARQBFQEWARcBGAEZASABIQEiASMBJAElASYBJwEoASkBAgAEAAUACAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcwB0AHUAdgB3AHgAeQB6AHsAfAB9AH4AfwCAAIEAggCDAIQAhQCGAIcAiACJAJAAkQCSAJMAlACVAJYAlwCYAJkAmgCgABAAAEBAAEIAUAD/AAABAQECAQMBCAEJAQoBCwEMAREBEgETARQBFQEXARgBGQEaAQACAgIQAhICAAMAQAEAAgAEAAEQBBAFEAYQBxAIEAkQChAQEBEQEhATEBQQFRAWEBcQGBAZEBoQGxAcEB0QHhAfECAQIRAjECQQJRAmECcQKBApECoQKxAxEDMQNBA3EDgQORA6EEEQQhBDEEQQRRBGEEcQSBBREFIQUxBUEFUQVhBYEFkQYBBhEGIQZBBnEGgQaRBsEG0QbhBvEHAQcRByEHMQdRB2EHcQeBB5EHoQexB8EH0QfhABACmSMJIAARABEgEEEAYQChAQEBAAIAABAAIAAwAIAAkAEAAgADAAQAD6//z/AOAN4N3g\",\n vrCode_b64:\n \"AAABAQIDAwMEBAQEAwMDAwMFBgMBAQMFAwMDAwMEAwcHAgIHBwgICAgJCAgIAwAKAQEBAQIEBAQBCggICAsLAwwLAwsIAQgLAQEBAQAACAwIAg0OAQ8BAQEBAQEIDQ0NDQ0NDw4ODg4ODgMGCAIMCAgEBAgBCAgBDAgIBgYQDBEQAgwRDAIGAgIGCA8PBwwICAEBEggMBhAQEAEBExIMBgwMAgwIBgwDBggDDAMIAwAIABMTFBQMDAcHCA8IDBISEggSFRUBCAwMDAwDCA8IBwwMCgoMDA8MDAwMDAwIABUVBAIGDAYMBgwRDBEMEQwRDAYMBgYMDAwMDAwMDAwMDAwMDAEBDAEJAAAWDAESAQMDDAwMDAwMCBAMAgkJAgkJCRcGDBYMCQkJCAgIDAwMDAwMDAwMDAwMEAwQDAwMDAEBDAEHCAwMAQwMCAgICAgMDAwMGAgRBgYIDAwMAw0OBgYICAwMDAgMEwYGDAwGFAwMEwYMBhEMERkXDBcXFxcGBhEGBgYMBgYGBgIHAgwCCAcDDQYGDAgIBgwMBgwRCAYHGAYGBgYMBgYGBgYGBgYQFggMBgYIBgwGBgYGBgwICA0NEBAQEBcXFxAQEAcICBcXBggNDhEQDAgIDAwFBgYICQkQDRAMCREJDAkCEAgIDAwCCQwQCAkICAoMEAkJCBcXFxcMEBcXFwwaDBoXFxcGFw0OCgcHBwwIBwwIBwwHDAwDCBcXFxcXFxcXFxcMFxcIFwwXCAkXDAgXFxcMDAwXEBAXFxcXEAwXFwwQAg0NDQ4NDAgHDBcXDAwXFxcXFxcMFwwQFxcXBgYGCQkDFxcXFwgCFxcIFwIXFxcCAgYXFxcXFxcXFxcXFxcIFxcXFBcXCQkTFwkJExcJCRcDAwMDAwMUCQkDCQkJCQkUFxcXFxcXAwMXCQoXFxcXFxcXCRcDAwMDAwMXCQMDAwMDCgMUFxQUFAgKCggXCBcDFw8UCAgXCBcIFwgXFAgXCBcIFwgXCgoPCQgXCAgXBgwYDAgICAgIAggMDhcMDAYGFxcGDgwICAgQCQgXFxcJCBcICQkXFxcXFwIJFxcJFwkXFxcGAQYGBgYGBhQMAQYGDQ4GBgYGBgYGAgYGBhcODhcJFxcIFxcXBgkXBhcXFxcXCAMABhcODhcXFxcPDwgJCQkJBgkJCQkXFxcXFxcXFwgXFxcXCAgXFxcXFxcICQkJCQkXCAgIFwIGFxcICQIICRcXFwgXFxcGFwYGCAgICQgWDBYMBgwWCAwIDA0ODw8NDQIJCQkDAgICBhYMFwgJAwgXCBcXGAYGCAgDCRcXFxcXFxcICAkICBcXFxcXFwgJCQkJCQkJAwMDCBYWFhYWFgAbCAkJCQkJCQkIAggGCQIXFxcCFwgXDAEYGAIYCBcXCQkJBwIGDBcGBhcXFxcXFxcXCQgIDBcXFwwDAwAAAAAAHBwDAxYWFhYACAAWFgAcABwAHAAcABwAHAMAAAADAwAAFgAAGBgDCBcICAcHAg0OCQkXFxcXFxcIFxcGBhcXCBgYBwcXFwkXFwgXFxgYCAcIFxcXCAIMCAgICAgICAgICBYICAgICAgICAgWCAgIFggIBgwICAwGAggMBggWFggDCAgWCBYICAMIFhYWDwgMCAgWEAgWDAwIFhYWFgwDCAAWFggIDBYWFgwMDAwMDAwMDAAIDwwWAAgWCAgICAgIBgwICAgIFhYIFhACFhYMCAgICBYWHRYMDAMDAAgMAwMIDAYDFhYWCAAIFgYIDAYADBYWCAkMCBYMFhYWDBYWFgwWDAgIFhYWAgwWCBYMDBYWDBYWCAgWAwwMDAgICBYMGBgYDAgMDAwMAxMIDw8DFxcXDAMTCBAXFwMDAwwDFBYMCBQMDAwXFwwYGBgMDAwIDAwIBgcIGAgYGBgMBgwIHR0dHR0DHRgYDBgMDAgYDBgYGBgYGBgYGAwYCAwMDAwMGBgYGBgYDw8dHQYGBggGDAYMDAwWFhYWFhYWFhYWFhYMDBYWCAwWFhYWFhYMCA8IDxYWFhYWFhYWFhYIFhYDDAwMDAwMCAMDDAwICAgICAgICAgICAgICAgMDBYMDxYMDAgMCAgMDAweDBYWFgwWCAgMFgwWFhYWDAwWFgwMBhQMDBcIDAwTDBMMDAwMFBQMDAwMAwYUCA8UDAwMAQwMAwYUFAgMDAwMDAwGAwMDDAwMDBQWFggWFggMDxABAQIJCQkJCQkJCQkICQkJBhcXFxcXAQgIBggJCQkXAQEJCQkJCQkGBgYXCQkJCQkJCQgIDQYOBgcFBgIADAgMDAwAFhgYAwAHAQMDAQUFDAwMBgwMAAYYGBgIGAgIFhYMFhYWFhYWCBYWFggIFgwMDAgBAQYMBgMMAwMDAwMIDBgYGBgYGAgYFhgYGBgYDAwMDAwMDAwMGAwMDAgYDBgYGBgYCBgMGBgXGBgYDAwMCAgMGAwMDAYYDAwYCAwMDAgMDAgMDAwYGBgGBgwMBgYGDAYMDAwYGAwMDAwIBxgYDAwMDAgMDBgGDAwMDAwMDAwMDAwMBgwMDAgMDAwMDAweBgwYGAwIGBgMDAwMCBgMDAwYGBgAGwwMBgwMCBgYDBcMABgYGBgYGAAYGAgMGBgMDBgYDAwMAwMIAwgIAwcIGAMDCAgIGAgDCAwIAwgICAwMGAwYBhgYCBgIGAgYCBgIGAwMCBgYDBgYGAgYCBgMGBgIGBgYCBgYDAwIDAwIGAgMCBgGBgYGBgwMDAgYDAMDCAMDCQUFAwMDAxcXFwkIBggGCAIGAggFAwMDHgMDAwgDAwMDAwMDAx4eHh4eHh4eHh4YFhgWAwgICAgBBgYDBgUDAwYFBggFAwMFAwMDCAMFAwUIBggdFxcXFwYGCAgIHh4eHgMeHh4BHyAgICAgICABICAgIAwWFggIEAwIDAgDDAgWAyAMDAgICAgKCAgXCAwMHgYGHwwMBwwDAwYIAwMMCAMDAxgdEAwDAwMCBggGDAMMAwIGAwwMDAwICAwMAxgIGAMMGBgYBggMDAwICAwMCAYIDAwMEgAACAMIDAwMCBgMAwwMCBgICAgYDAwdDAMDFwgICAYNDg0ODQ4NDgYEBgwRBgwNDg0OCAYMDBQMBgcMCgEACgoIDAwMCAwMCAYGDAYNDg0OBg0ODQ4GDAYGBgYMDAwGBgYGDAcIAwAXAgwJAggMDAwGFwwXFxcXFwMXFxcXGAMMAwwDGAgYGAwJCAEXDBcPFwgIDAwMDAgMFwwMCQwQDBAMDCEEDQ4NDhEGDAIMDAICBggMDBQUCAgMDAwMDAQCAg0ODQ4IAgYGDAgMDBAMDBcMDAMDAwMXFwwQFxcXCAwMDAwMBwwMDAYGDAwMBgwMBgwQAQwQDAwMBhQMDAwGDAwXFxcMDAwMAgYCBgYCAgYCDBEMDAYMEAYHBwYNDgICEQICBwYGBwYICAgMDwgMDwwPDwwMDAwIDAwBDAwMDAwMDAwMDAwGEQgIDw8PDAwMEgwXCAwMDAwCHhYWFh4MFhYICAwBAQ0ODAYMDw8PCAwGCAgGDBEMDAwKEQwMDAwIDwgMDAoMAw0ODw0OEQEICAADFw8UFhwADAwQDAEBCAgDDQ4IDBAIDBAcDAwRFwwQDBEQBgwMDAwMDAwMAQgMCAYICAgMDAgICAwMDAwMAAAAAAwMDBAMCA8PCAEBABAPDAwSAQgMDAwMDAEBEAoGDAYAEAgHDwwGBwYPDwYGDAwMDAEMDw8UDAEMDAYMDAwMDBYIFggIFhYWFgwMDBYWFhYMDAwWFhYMCAgIDAwMDAwWFgwMDAwWFgwYGAwMDAwIHRYGDBYWCBgYGBgMCQwMGBgMDBgYGBgYGBgYCAwYCBgYGBgYGBgYAAAMCAgIAxgDDBcMAhAMDBcXFwgIDBYMDAMDDAwcHAgAAAgMDBYXFhcIFxcIBhYWBgYQGBYWFggWFhYWAxYWDAwIDBYMHQgWFgMDCAgDAwwMFxcMCQIDAwwDAwwDCQkIAwMMAwMDDAwDAwwXAwMDAwMXCAkDDAwMDAwMAwIMDAwICAgICAgICAYIBgYGFwkJFxcIFwkJFxcXFxcDCAgMAx4eAwYACAwMAwYQDAgGDAMDAwMMCAwMCBQBDAEMABYbDAwADAAHCBgGGAgICAwMDAAbGBgYGBgYAAMYGyEgICAMDAwgAAwADAwMDAYHDAwGGBgAAAAADAwgDAAGFAwMDBsiDAwMDAYGDAgMDA8MDAwPEAwWDAMGDBYWCgMMAwYQFhYDDAYWDAwMDAwDBgwDDAMIDAMWFgwWFhYWFgwMDAMGDAwWFgwWFgwWFhYICAwBEggMAQYUCAwMDAwACAIIFiIMCAgICBAMDBgYCBgIAwMYCAgJCAMDAxwcDAwJAwMGCAYNDhEMDAgXCRgGEAwABggGFgwMDAwDCAgIGBgDCAgIAwMYCAAKCBgYGBgICAgIGBgMGAIIAAgMDAwWCAwQAgwWDAwMAQEMDAwDDBgMCAEBAwwMCAMIAwgDCAEMCAMIDAgWDBYWAwgIFhYWFhghFhYIFhYWFhYIFhYWFhYMCAwDDAwDCgwMAQwICBYMFhYhDAYMAwwMCAgIDAwIFgIGCAYPDAwGDAMMDAgFAwwDCAMIHQwGCAUGBgQZBQ0IDwkKBhsHIBEOAiMQExQSFyEWIhgAAxwdAQwkJRUDDAMDFgMDAwwDBgMGCAwDDAMDDAMIAwMICAMIAwMWDAgICAMDDAwMDAMICAgWFggIDAgICAgIDAgICAgICAgWFggMFxAMDBIGDAwICQgWFhYWFhYWDAgICBcXDAwMDAwMDAwMBQAGCQgGBgwMDAwGDAYEBAcICAgAFhYMFxcJDAkXFwwIBgkMDAYGBgwIDAwMDAYMCAgIDAMMAwMDAwMDBhAGBgwMDAMWFgwWFgwGDAMDDAwMFhYDAwwCGxsMDAgUDAwADAgUDAwGDAYGDAwGCBQMDAgUCAIBDAYQBgYIDwcGAwEIBQEPCAoKCAoYDAwMCgwBCgwMCgwPBgYICAMDAwMDAwMJDAgICAYJCQgICAgICAMDDAwMDAwQCAgICAgICAgICAgICAMDCBAHCQMDFwwMDAMIFwgICAgMDAwMAwYMAwwICAgDCAgICAwMCAwCCAgNDgQEAgkMCAgGAggMDAwMDAwMDAwMDAgUCAcHCAgICAgDBgwFCAgCBhAICBcXFxcXAhcXFxcJDBcXDAgXDAgCCQwMDAwIFhYMDAwMDAwMFgwIDAwMCAMMDAwMDAMDDAwQBgwHDAwMDAwICAwMFggIDAwMDBYMCAgICAYXCBcXDBcIFxcMFwgJFwwIFxcXAgYQDQ4MDAwMDAwJAQYQCRcPDwwICAwGDAwIFxcJCQkMDAwMDAwXDAkJAgwQDAgRDAgXDAMYDAwBCBcGDAwMDBAIFwwMCQ0OCAIIDBcXFxcXFwwMFxcYGBgXDBcNDQkMBQUJCQUQAwwYDAkQFxcXDAkMCQwMDAgWDAwMDAwMDAwMDAYMCAwJDBcXCQkXFwwJDAkMDQ4NDgwDDAgQDAkICAwNDgIGEA0OBggGCBAMCQEICAYXFwgXFxcXFxcXFxcXFwwJAhcXDBcYFxcYGBcXFwEIDAkGCQkJBwkXARcXGBgYCAwYGBgIFwgIFwkXFwwCCBcMCBcYCRcJBhAIFggICQwGCAkMCQgCCRcYFxgXGAIQFwkCFwwJAhcJCRcXFxcJCAIJFxgMAhcYCAYICAkGFxcJFwwCCAYXFwkMCRcXDAgMFxcIFwgXCBcXCBcXFxcXFxgYGBcYCBgIGBgIGAgXFxcXFwwJBgYMCAIQAhgYDAgCEAIIEAwIAhAXEBcXFwgIDAwJCAYXFwIGFxcGFwgXFw0ODAgJBgYJAgYXDAkCCAYXFxcXAhcMCRcXCAkXCQIIBhcGFxcXCQkXDAkCBhcXFwwXFxcICBcYGBgYGBgMBwkJHQgIGAwYAgkMCQIIBgkMCQIIBhgJDAkCCAYCCAIGBhgYGAwGGBgMBhgMGBgYGBgYAgkJCBgIGBgYCQwMDAwMDAwMEAwYDAIQCAkYFwwIGBgYGAkMFwMMCAgMGBgYGAwMGBgYGAgIAwMDAwMDAwMGAQwDAxYDCAwGFhYMBgwMDAYICAwIFgwMDAMGFhYWFhYMBgwWDBYMDAwMFgwDCAgIDAwWFgwMFgMWFgwWDAwDFhYWDAwICAEMFhYWAwwDDAwMDAgMAwMMAwwIGxsWDAwWDBsIFhYMAwwDDAMBEAwMFhYMAhAMDBcXFwwMAwwDFgwMCAEIDAwDAwgICAgIDAwMCBAMCAwQEA8PAwwMDA8QDAwMDA8MDAwDDAwDEAwBAwwMDAwMDAwHDAwMBwwHAwMMDAwGFgwMCAwMDAwMCQkXFwwJCQwJDAwMCQwMCQwJDAkJCQkMCQkJCQkMCAYMGAwDAwMMFhYIFgwIDwwICA0OEQwIDAwGAQwMDAwBFAMIEAgMDAEMAQwQDAwGEwgHBgEDDAMMDAwMDAwDDAwMBgwMDAEMAgYCBhAGAwMBAwMDAwMDAxAMCAgICAwMDA0NDAgWFgEBBgwGDAMIFAwQDAMMDBQMCAwMAwwIDAwMDAwBAQwMCBYIDAYMDBQUCQMDFAwMDAgWDgcMDAwIDAAWFhYWDAwWFgwHBwIGDAgNDhEGDQ4REBEMDQ4RBwwMEQYCBggIEBAICAwMGBgKAggIDAMMCAcICBgYGBgCGBgYAgIICBgIDw8ICAYCDwgDAwwMCAgPCBgIDAgMCAYCBgICCAIIGBgYDAgHGAoICAwIDAwWFwwMEAwYDAgMFwwMDAwaGgMIGhobGyQkFRshGiAgIAwKJiYm\",\n vmCode_b64:\n \"AAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAIAAAAAAQAAAQADAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAEBAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAQABQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQYHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAQAAAAAAAQEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAQAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAABAQAAAQEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAFBwAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAJAAkAAAAAAAAAAAAAAAAAAAAJAAkAAAAAAAAAAAAAAAEAAAAAAAABAQEAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAQABAAAAAAAAAAAAAQEAAAAAAAAAAAEAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAQAAAAEABQAAAAAAAAAAAAABAAcBAAAABQUFAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAEBAAAAAAAAAAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAQAAAAABwALAAAJAAAAAAAHAAAABAAAAAAHAAsAAAAAAQEBAQEBBwAAAAAHCQAAAAAAAAABAAEBAAAAAAAAAAAAAAAAAAAAAAwJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEAAAAAAAAAAAAAAAAAAAAHBwcABQcAAAcAAAcAAAAAAAcAAAEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQAAAAUFAAUABQUAAAAAAAAAAAABAAAAAAAAAAkJAAAAAAAABQUAAAAJCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAABwkAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAFBwcAAAAAAAAAAAcAAwAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAkJDAwAAAAAAAEAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkMAAkNDQAAAAAAAAAAAAAAAAEAAAAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAABwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAcHBwcAAQEAAAAAAAEBAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAEBAAEBAAABAAAAAQABAAEAAAAAAQEAAAABAAAACQkJCQkICAgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAABAQAACQAAAQAAAAAAAQEBAQEAAAsBAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAcAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAALAAsLDQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAkAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAHAAEBAQEAAQEBAAAAAAAAAAAAAAAAAAAAAAALAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAcAAAAACwAAAAcAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAJAAwAAAAAAAAAAAAAAAAAAAcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAABAAABAAAAAAAAAQAAAAEAAAABAAAAAQABAQAAAAEAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAcABwABAAABAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAEACQAAAAAAAAAAAAAACQkAAAAAAAAAAAAAAAAAAAAAAAAACQAADAkJAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBgsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAABwgBAAAAAAAAAAAAAAAAAAAAAAAHCAAJBwkOCQAAAAAAAAAHCQAIDAAICQkAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAAAAAAAAAAcHAAcAAAADAAAAAAAHBwcHAAAAAAkAAAAAAAAAAAAHBwAAAAAAAAAAAAAAAAAJAAAAAAAJAAAACQkAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAMAAgJAAAAAAkJAAAACQAACQkJDAAAAAkAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAEBAAEBAQEBAQEAAQAAAAEBAQAAAQAAAQABAAEBAQEBAQAAAQEAAAAACAAAAAAAAAAAAAADAAABAAAAAAAAAAAAAAAAAAAAAAkJAAAAAAMAAAAAAAABAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJDgAHCAAAAAAAAAAAAAABBgAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJAAkACQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAkADAcHAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAMAAAAECQAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAkAAAEAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAABEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHAQEAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAkJAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAEAAAABAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAEAAQcLAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwAAAAAHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQAAAAAABwAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkAAAAAAAAAAAAAAAAAAAAACQkSAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAACQkAAAAAAAAAAAAAAAAAAAAAAAAJAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n nameOff_b64:\n \"AAAAABIAAAAsAAAAPwAAAFMAAABxAAAAfQAAAIYAAACfAAAAsAAAAMAAAADUAAAA4wAAAOsAAAD9AAAAFAEAADIBAAA4AQAASAEAAFQBAABbAQAAcQEAAIgBAACTAQAAqgEAALYBAADUAQAA8gEAAA0CAAApAgAATQIAAGQCAAB6AgAAjgIAAKICAAC2AgAAywIAAOECAAD1AgAACgMAAB4DAAAtAwAAOwMAAFsDAABoAwAAdQMAAIUDAACjAwAAvQMAANQDAADuAwAA/wMAABUEAAAuBAAASgQAAGcEAACGBAAAogQAALQEAAC9BAAA1AQAAP8EAAA2BQAAbAUAAIIFAACZBQAAtwUAAMYFAADxBQAABAYAABQGAAAkBgAARQYAAGAGAAB+BgAAnwYAAMgGAADiBgAA9QYAAAkHAAAdBwAAJgcAAD0HAABRBwAAZQcAAHcHAACPBwAAmgcAAKgHAAC2BwAAwAcAANkHAAD3BwAABAgAAA0IAAAXCAAAJggAADEIAABECAAAVQgAAGgIAABxCAAAewgAAIoIAACVCAAAqAgAALkIAADMCAAA4ggAAAMJAAASCQAAMQkAAEMJAABUCQAAYwkAAHEJAACFCQAAnQkAAKUJAAC2CQAAxwkAAOkJAAD3CQAADQoAABkKAAAoCgAAOgoAAFEKAABnCgAAgAoAAKIKAADKCgAA4QoAAAoLAAATCwAAJAsAADoLAABNCwAAWAsAAGcLAAB6CwAAkgsAAKULAADCCwAA1QsAAO4LAAD9CwAAHAwAACsMAAA8DAAAXgwAAHIMAACIDAAAmAwAALsMAADFDAAA1wwAAOQMAADwDAAABg0AABkNAAA7DQAAYA0AAHUNAACRDQAAog0AAL8NAADoDQAA/Q0AABQOAAA1DgAAUg4AAHAOAACKDgAAoA4AALIOAADVDgAA+g4AABkPAAAvDwAASA8AAGUPAAB/DwAAow8AALsPAADLDwAA5w8AAPUPAAAKEAAAIxAAAD8QAABUEAAAYxAAAHAQAACBEAAAlBAAAKkQAAC+EAAA3RAAAPcQAAAMEQAAJREAAD8RAABWEQAAbREAAHwRAACOEQAAnxEAALcRAADMEQAA3hEAAOcRAAD1EQAABRIAABwSAAAvEgAATxIAAGsSAACQEgAAqhIAAMMSAADfEgAA+BIAABYTAAAvEwAARRMAAFYTAABhEwAAcRMAAIYTAACXEwAAtBMAAM8TAAD2EwAACBQAADAUAABHFAAAcBQAAIwUAAC4FAAAxRQAAOMUAAAAFQAAHhUAADAVAABFFQAAZhUAAH0VAAClFQAAyhUAAOIVAAD7FQAAEhYAADMWAABZFgAAcxYAAIoWAACpFgAAwxYAAPIWAAAHFwAAHxcAADcXAABKFwAAXxcAAG4XAACBFwAAihcAAKEXAAC/FwAAyhcAANgXAADlFwAA8hcAAAMYAAAYGAAALRgAAEAYAABxGAAAhhgAAKoYAAC/GAAA0hgAANsYAADmGAAA9BgAAPwYAAAGGQAAGRkAAC0ZAAA+GQAATRkAAF8ZAABuGQAAfxkAAIgZAACQGQAAqxkAAMUZAADiGQAA+xkAABEaAAAvGgAATxoAAHUaAACdGgAAvxoAAOkaAAAOGwAAOxsAAHIbAACjGwAA1RsAAAAcAAAsHAAAaRwAAKccAADmHAAAIB0AAD8dAABZHQAAbB0AAIodAACzHQAAzh0AANcdAAD2HQAADx4AACAeAAA3HgAAUh4AAGMeAAB3HgAAlh4AAKseAAC+HgAA1B4AAPceAAATHwAAJx8AAEkfAABbHwAAZh8AAG8fAACAHwAAjx8AALIfAADaHwAA/x8AAB0gAAAtIAAAPSAAAGIgAACHIAAAoSAAAKsgAADLIAAA7SAAABchAAAsIQAAUSEAAGIhAAB0IQAAhSEAAKUhAAC4IQAAxCEAAN8hAADxIQAADSIAACwiAABMIgAAbCIAAHsiAACMIgAAoyIAALMiAAC9IgAAyCIAAN8iAADzIgAABiMAAB4jAAArIwAAOSMAAFwjAAByIwAAfiMAAI0jAAChIwAAvyMAAMwjAADVIwAA5yMAAPgjAAAPJAAAKCQAADMkAABKJAAAVCQAAGEkAAB5JAAAiCQAAJkkAACzJAAAzCQAAOYkAAD4JAAAESUAACglAABAJQAAWSUAAHAlAACJJQAAmiUAAK8lAADGJQAA1SUAAOolAAACJgAAGSYAADImAABRJgAAdiYAAIkmAACeJgAAuSYAAM8mAADtJgAACicAAC8nAABHJwAAaCcAAIsnAACoJwAAzicAAO4nAAARKAAAJygAAD0oAABfKAAAdCgAAJIoAACvKAAA1ygAAAkpAAArKQAAOykAAFUpAACCKQAArSkAAMIpAADiKQAAASoAABYqAAAnKgAAOyoAAFQqAABhKgAAfioAAKkqAAC2KgAAxCoAANEqAADeKgAA6yoAAP0qAAAUKwAAJysAADorAABPKwAAVysAAHgrAACLKwAApysAAL8rAADbKwAA5isAAPUrAAALLAAAJCwAAEAsAABcLAAAeSwAAIMsAACaLAAAqywAALosAADHLAAA2CwAAOosAAD6LAAACS0AAB4tAAAsLQAAQS0AAFYtAAB4LQAAhS0AAKEtAAC9LQAA3C0AAPotAAAULgAALC4AAEUuAABfLgAAgC4AAJQuAACpLgAAvS4AANEuAAAALwAAKi8AAEMvAABbLwAAdi8AAIAvAACYLwAAri8AAL8vAADSLwAA4y8AAAIwAAALMAAAIjAAADkwAABZMAAAfDAAAKAwAAC1MAAAyjAAANcwAADnMAAAAzEAACMxAAA6MQAARDEAAE8xAABoMQAAdTEAAIIxAACfMQAAsDEAAMoxAADjMQAA8zEAAP8xAAAQMgAAITIAAC4yAABEMgAAWjIAAHgyAACIMgAAnzIAALAyAAC9MgAA0zIAAN0yAADwMgAA/jIAAAUzAAAdMwAANDMAAE4zAABjMwAAdTMAAIAzAACHMwAAlDMAAKEzAACtMwAAyTMAAOszAAAMNAAAGTQAACo0AAA4NAAASDQAAFw0AABwNAAAfzQAAJE0AAClNAAAsjQAAME0AADcNAAA8DQAAAA1AAAVNQAALDUAAEU1AABUNQAAYzUAAH41AACHNQAAljUAAKg1AAC3NQAAxjUAANo1AAD0NQAAAzYAABg2AAApNgAAOjYAAE02AABgNgAAdzYAAIc2AACeNgAAqzYAALs2AADLNgAA2TYAAPI2AAAPNwAAKDcAADM3AAA+NwAATDcAAFk3AABqNwAAdzcAAIQ3AACRNwAAoTcAALA3AAC+NwAA0zcAAOg3AAD1NwAAATgAABM4AAAhOAAAKjgAAD84AABPOAAAXzgAAGs4AAB3OAAAhzgAAJs4AACoOAAAuDgAAMg4AADXOAAA5jgAAPk4AAALOQAAFTkAACU5AAAvOQAARDkAAFA5AABlOQAAbDkAAHQ5AAB/OQAAjjkAAJg5AAC0OQAA0zkAAPY5AAAUOgAALzoAAE06AABqOgAAezoAAIw6AACVOgAAqToAALg6AADHOgAA2joAAPE6AAD+OgAADTsAACY7AAA+OwAARjsAAFk7AABsOwAAdzsAAIg7AACVOwAApDsAALU7AADFOwAA1DsAAOA7AADrOwAA9jsAAAE8AAAKPAAAFTwAAB08AAAlPAAALzwAADs8AABPPAAAWjwAAGk8AACCPAAAjzwAAJk8AACiPAAAsDwAALw8AADIPAAA2DwAAO08AAD9PAAACD0AABA9AAAaPQAAIz0AADs9AABPPQAAXj0AAG89AAB3PQAAgD0AAJA9AAClPQAAvD0AAMg9AADWPQAA4T0AAPA9AAD8PQAACj4AABU+AAAhPgAALj4AADc+AABFPgAASz4AAFY+AABePgAAaT4AAHE+AACDPgAAkj4AAJ0+AACvPgAAvj4AANE+AADhPgAA8j4AAAA/AAASPwAAIT8AADQ/AABGPwAAUj8AAGE/AAB4PwAAjz8AAJw/AACqPwAAxD8AANY/AADwPwAACUAAADFAAABBQAAAUUAAAGBAAABrQAAAfEAAAIhAAACRQAAAtEAAAMxAAADgQAAA/EAAABJBAAAmQQAAOUEAAFdBAAB1QQAAiUEAAKJBAAC2QQAAyUEAANtBAAD1QQAADEIAABRCAAAnQgAANUIAADhCAABJQgAAWkIAAHlCAACKQgAAo0IAAMBCAADjQgAA8UIAAPlCAAAGQwAAFkMAACZDAAAzQwAAPkMAAFNDAABnQwAAgUMAAJdDAACmQwAAtUMAAMxDAADaQwAA7EMAAPVDAAD9QwAABEQAAA9EAAAVRAAAH0QAACdEAAA9RAAASEQAAGJEAAB6RAAAmkQAALBEAADGRAAA6EQAAApFAAA1RQAAW0UAAIBFAACrRQAAu0UAANNFAADtRQAA+UUAAAtGAAAeRgAANEYAAElGAABfRgAAbEYAAHxGAACQRgAAp0YAAMtGAADcRgAA50YAAPpGAAAJRwAAEkcAACRHAAAzRwAAPUcAAE5HAABmRwAAd0cAAI1HAACjRwAAuEcAANBHAADpRwAABUgAACBIAAA1SAAASUgAAGVIAACISAAAqEgAAMdIAADYSAAA4kgAAO1IAAD+SAAAD0kAABtJAAAkSQAALUkAAEJJAABPSQAAZUkAAH1JAACUSQAAvEkAAM5JAADgSQAA60kAAPhJAAADSgAAGUoAAC5KAABISgAAUkoAAFtKAABsSgAAg0oAAJFKAACYSgAAo0oAALlKAADPSgAA30oAAPRKAAAASwAAD0sAABdLAAAkSwAANUsAAEVLAABWSwAAY0sAAIVLAACPSwAAnEsAAKtLAAC9SwAAwUsAAM9LAADhSwAA70sAAPxLAAAITAAAFEwAAB5MAAAxTAAAQkwAAFJMAABlTAAAdkwAAIxMAACbTAAAp0wAAMJMAADcTAAAA00AADBNAABVTQAAcE0AAJFNAACnTQAAvU0AANhNAADxTQAABk4AACBOAAA6TgAAVE4AAHpOAACPTgAApE4AAL1OAADQTgAA4U4AAPNOAAAETwAAIU8AADRPAAA9TwAAWE8AAGdPAAB3TwAAgE8AAIxPAACjTwAA108AAONPAAD1TwAA/08AABBQAAAtUAAANlAAAEtQAABOUAAAUlAAAFdQAAB9UAAAnFAAAK9QAAC7UAAAy1AAAN9QAADsUAAA/1AAAA1RAAAdUQAALFEAADVRAAA9UQAARVEAAE5RAABvUQAAf1EAAI1RAACjUQAAu1EAANpRAAD7UQAAD1IAACVSAAAxUgAASFIAAGBSAAB6UgAAlFIAAKtSAADCUgAA31IAAPdSAAAKUwAALVMAAD1TAABUUwAAbFMAAIZTAACgUwAAt1MAANBTAADpUwAABlQAABVUAAAvVAAASlQAAGdUAACEVAAAnlQAALhUAADYVAAA81QAAP1UAAAVVQAAJVUAADVVAABFVQAAXFUAAHVVAACIVQAAoFUAALpVAADcVQAA8VUAAAVWAAAOVgAAJlYAAD5WAABJVgAAWFYAAGdWAAB3VgAAhFYAAKBWAAC7VgAAx1YAAOJWAADtVgAA+1YAABtXAAAlVwAAN1cAAFVXAABkVwAAdFcAAIdXAACdVwAAuFcAANVXAADpVwAA+lcAAApYAAAZWAAAJVgAAEhYAABpWAAAh1gAAJJYAACtWAAAwFgAAM5YAADZWAAA7FgAAP9YAAASWQAAJVkAADVZAABFWQAAXFkAAHNZAACPWQAAq1kAALlZAADHWQAA2lkAAOhZAAAAWgAAFloAACNaAABOWgAAaloAAJVaAACxWgAA0FoAAOBaAAD/WgAAD1sAAC5bAAA+WwAAXVsAAG1bAACHWwAAmVsAALFbAADIWwAA41sAAPlbAAARXAAAJFwAADdcAABLXAAAXVwAAHNcAACCXAAAnVwAALpcAADNXAAA2VwAAO5cAAABXQAADV0AABddAAA0XQAAUV0AAHhdAACcXQAAuV0AAMtdAADvXQAA/l0AABleAAAvXgAAQl4AAFpeAABuXgAAhl4AAKNeAAC0XgAAx14AAOBeAAAAXwAAJ18AADxfAABPXwAAXF8AAGVfAAB0XwAAfl8AAI9fAACdXwAAs18AAMlfAADkXwAA/18AABJgAAAwYAAAPmAAAE9gAABfYAAAcmAAAIZgAACXYAAAsGAAAMFgAADSYAAA4mAAAPJgAAAHYQAAFGEAAChhAAAwYQAASGEAAF9hAABwYQAAhWEAAJJhAACkYQAAtmEAANNhAADvYQAAA2IAAApiAAAbYgAAM2IAAExiAABkYgAAhGIAAJBiAACnYgAAxmIAAOFiAAD2YgAABWMAABpjAAA1YwAAS2MAAF9jAABzYwAAiWMAAKVjAAC1YwAAwmMAANhjAADzYwAAFmQAACBkAAAwZAAAQ2QAAFNkAABzZAAAgmQAAJVkAACmZAAAuGQAANZkAADwZAAAA2UAABtlAAAyZQAAVGUAAGdlAACDZQAAkWUAAKllAAC3ZQAAyGUAAOFlAAD2ZQAACWYAABhmAAA0ZgAATWYAAGlmAACMZgAApmYAALZmAADWZgAAA2cAABdnAAAmZwAAOWcAAFpnAABnZwAAdmcAAIVnAACgZwAAxGcAANJnAADkZwAA92cAABVoAAAnaAAAPGgAAFZoAAB4aAAAj2gAAKVoAAC8aAAA3WgAAAhpAAAgaQAARGkAAGFpAACHaQAAnmkAAL1pAADTaQAA8WkAABRqAAApagAAOmoAAEdqAABnagAAeWoAAJRqAACiagAAu2oAAMdqAAD4agAAEWsAAEFrAABxawAAi2sAAKRrAADCawAA32sAAPdrAAATbAAALGwAAD5sAABWbAAAbmwAAI1sAACzbAAA3GwAAP9sAAATbQAAMW0AAEJtAABZbQAAdW0AAJNtAACqbQAAt20AAMdtAADZbQAA620AAPVtAAAKbgAAGG4AACtuAABAbgAAUm4AAG5uAACFbgAAnG4AAKtuAADUbgAA/W4AABZvAAAmbwAAP28AAE5vAABXbwAAc28AAIFvAACXbwAArG8AAMNvAADNbwAA4W8AAPJvAAAEcAAAH3AAADdwAABOcAAAZHAAAH1wAACecAAAsXAAALxwAADOcAAA6HAAAP5wAAARcQAAJnEAADhxAABFcQAAVXEAAG1xAACAcQAAjXEAAJ9xAACucQAA0nEAAOpxAAANcgAAMnIAAExyAABqcgAAhHIAAJtyAACicgAAvXIAANxyAAD6cgAAD3MAAC1zAABFcwAAZXMAAIRzAACocwAAx3MAANZzAADicwAA/HMAAA90AAAgdAAANHQAAFF0AABxdAAAg3QAAKR0AAC1dAAAw3QAANp0AADrdAAA+3QAAAt1AAAmdQAAP3UAAFJ1AABrdQAAgXUAAKJ1AAC/dQAA03UAAOZ1AAD+dQAAKnYAAEd2AABidgAAbnYAAIx2AACudgAAx3YAAN92AAD/dgAAGXcAAC53AABFdwAAWHcAAHl3AACRdwAAoXcAALh3AADWdwAA83cAABl4AAAveAAASngAAF54AAB7eAAAjngAAKR4AADJeAAA6ngAABZ5AABDeQAAcnkAAKF5AADNeQAA+XkAACt6AABCegAAS3oAAGp6AACEegAAl3oAAK56AADBegAA3XoAAP16AAAcewAAPXsAAGV7AAB+ewAAl3sAALB7AADMewAA3nsAAPJ7AAANfAAAKXwAAEt8AABffAAAhXwAAJx8AAC3fAAA0HwAAOh8AAACfQAAIX0AAEJ9AABcfQAAeH0AAJB9AACmfQAAxH0AAOR9AADzfQAABX4AABx+AAApfgAAPX4AAFl+AAByfgAAkn4AAKp+AADFfgAA5H4AAAV/AAAnfwAAS38AAGx/AACNfwAArn8AAMt/AADqfwAABoAAACKAAAA+gAAAToAAAGCAAAB+gAAAm4AAALqAAADSgAAA44AAAPSAAAAFgQAAFoEAACeBAAA4gQAATIEAAHCBAACDgQAAlYEAAKyBAADBgQAA6IEAAAmCAAAuggAASIIAAGOCAACGggAAnoIAAMWCAADwggAAAIMAAByDAAAygwAAUIMAAGuDAACLgwAAo4MAALaDAADXgwAA94MAABKEAAAkhAAAM4QAAEyEAABghAAAe4QAAI2EAACbhAAAr4QAAL+EAADQhAAA5YQAAPuEAAAahQAAKoUAAEuFAABghQAAf4UAAJyFAADFhQAA5oUAAAuGAAAYhgAAMYYAAEeGAABYhgAAcoYAAIeGAACPhgAAsIYAAL+GAADahgAA+IYAABqHAAA7hwAAUYcAAH+HAACWhwAApocAAL2HAADZhwAA7YcAAAiIAAAiiAAARIgAAGWIAAB/iAAAjogAAKGIAAC1iAAAyYgAAOWIAAAOiQAAHokAAD6JAABhiQAAeokAAJCJAACsiQAAxokAAOOJAADxiQAAAIoAACaKAABNigAAaYoAAJGKAACpigAAxooAAOeKAAAKiwAAJYsAAECLAABXiwAAc4sAAI2LAACsiwAAv4sAAM+LAADeiwAA9IsAAAyMAAAojAAARYwAAGqMAACHjAAAoowAALuMAADqjAAADI0AACGNAAA0jQAAWY0AAG+NAACAjQAAoI0AAL6NAADwjQAAFY4AAECOAABejgAAeI4AAJ6OAAC5jgAA4o4AAAWPAAAmjwAARY8AAG+PAACFjwAAn48AALWPAADJjwAA2o8AAOuPAAAJkAAAJpAAADqQAABRkAAAYZAAAHKQAAB5kAAAhZAAAJaQAACkkAAAuZAAAMyQAADikAAA+JAAAAuRAAAVkQAAJ5EAADyRAABPkQAAYJEAAGyRAACBkQAAlZEAAK2RAADEkQAA1JEAAOeRAADxkQAAAJIAABmSAAAtkgAAQZIAAFuSAAB0kgAAhpIAAKiSAADLkgAA4JIAAPySAAAPkwAAJZMAAECTAABVkwAAZpMAAIaTAACgkwAArZMAAMaTAADjkwAA/5MAAB6UAAA4lAAAVZQAAHOUAACMlAAAo5QAALyUAADflAAA+JQAABiVAAAllQAASJUAAHeVAAB+lQAAk5UAAKeVAAC2lQAAypUAAN+VAAD3lQAADJYAACqWAABPlgAAc5YAAImWAACdlgAAqpYAALqWAADPlgAA6ZYAAAGXAAAWlwAALJcAAFeXAACElwAAppcAAMKXAADflwAA9ZcAABOYAAAwmAAAT5gAAHKYAACOmAAAppgAAMCYAADWmAAA7JgAAAGZAAAemQAAQJkAAFeZAAB5mQAAmZkAALqZAADNmQAA45kAAACaAAAMmgAAK5oAAEWaAABjmgAAgJoAAJqaAAC1mgAA05oAAOuaAAAEmwAAHZsAADWbAABOmwAAb5sAAHmbAACJmwAAspsAAMWbAADpmwAAAJwAACScAAA7nAAAVpwAAHucAACNnAAAnpwAAKqcAADBnAAA1JwAAOmcAAD1nAAABZ0AABOdAAAmnQAAQJ0AAFudAAB0nQAAgp0AAKOdAAC/nQAA450AAAeeAAAZngAAN54AAE6eAABongAAiZ4AAJqeAACtngAAvp4AANCeAADingAA9Z4AABSfAAAonwAAPp8AAFSfAABunwAAiJ8AAKKfAAC4nwAA4J8AAPufAAAWoAAAMaAAAEegAABYoAAAbaAAAIOgAACuoAAA2KAAAP2gAAAioQAAP6EAAFShAABqoQAAhKEAAJqhAACqoQAAuqEAAOOhAAAGogAAFqIAADGiAABSogAAeKIAAJyiAACzogAAyKIAAOOiAAD9ogAAJKMAAFGjAAB6owAAgqMAAJqjAAC3owAAzKMAAOWjAAD1owAACaQAABikAAA3pAAAQqQAAGikAAB5pAAApqQAAN6kAAAQpQAAKqUAAEqlAAB0pQAAiaUAAKWlAAC/pQAA1aUAAOelAAD0pQAACKYAAC2mAABZpgAAf6YAAKmmAADRpgAA/KYAADanAABIpwAAcqcAAKanAADepwAAFqgAAEmoAAB5qAAAqKgAANioAAAEqQAAMqkAAFypAACGqQAAwKkAAPmpAAAkqgAATqoAAIeqAACiqgAAv6oAAOGqAAAHqwAAMKsAAFarAAB9qwAAjasAAKmrAADXqwAAA6wAACKsAABBrAAAWawAAH2sAAClrAAA0KwAAO2sAAANrQAALK0AAEetAABUrQAAf60AALKtAADorQAAHK4AADyuAABcrgAAba4AAJSuAACvrgAAzq4AAOyuAAAHrwAAMq8AAFSvAAB/rwAAqq8AANSvAADkrwAAEbAAACewAAA5sAAAUrAAAGCwAAB0sAAAfbAAAIawAACdsAAAuLAAANGwAADhsAAA/rAAABaxAAApsQAAQrEAAGmxAAB1sQAAjbEAAJ2xAAC7sQAA2LEAAO+xAAAQsgAALrIAAEOyAABisgAAebIAAJGyAAC6sgAA1LIAAOqyAAAFswAAG7MAADqzAABRswAAa7MAAIGzAACUswAAr7MAAMezAADfswAABLQAABq0AAA5tAAAULQAAGq0AACAtAAAsbQAAMq0AAAAtQAAHLUAADe1AABRtQAAa7UAAI+1AACstQAAyrUAAN61AAAHtgAAJrYAAFW2AAB6tgAAtLYAAOS2AAAGtwAAK7cAAES3AABVtwAAbLcAAIi3AACntwAAxrcAAOu3AAD6twAACrgAABy4AAAyuAAAVbgAAGW4AACVuAAAx7gAAPq4AAA4uQAAT7kAAGG5AAB1uQAAibkAAKi5AADRuQAA5rkAABm6AABNugAAaboAAIS6AACdugAAvroAANO6AADpugAA+LoAAAO7AAARuwAAHrsAADC7AABduwAAgrsAAJm7AACpuwAAubsAANG7AADguwAA87sAAAy8AAAjvAAANrwAAES8AABZvAAAbrwAAHK8AAB5vAAAh7wAAKG8AACtvAAAt7wAAMG8AADRvAAA5LwAAPy8AAAKvQAALL0AAEO9AABgvQAAeL0AAJa9AACxvQAA0L0AAOa9AAD5vQAAD74AACW+AAA6vgAAUr4AAGy+AACBvgAAkr4AAKa+AAC4vgAAzb4AANq+AADkvgAA674AAP6+AAAdvwAAO78AAFK/AABovwAAgr8AAJu/AADBvwAA5r8AAPe/AAANwAAAI8AAAD/AAABawAAAe8AAAJDAAACjwAAAtcAAAM/AAAD2wAAAF8EAAC3BAABLwQAAacEAAInBAACmwQAAycEAAO/BAAAIwgAAKcIAADnCAABVwgAAZsIAAIfCAACjwgAAu8IAANHCAADqwgAAAsMAABPDAAApwwAAQsMAAFnDAABywwAAjcMAAK/DAADJwwAA58MAAPPDAAD+wwAADsQAABrEAAAlxAAAQcQAAE/EAABgxAAAdsQAAJfEAAC7xAAA4cQAAAbFAAAsxQAAXcUAAJDFAADCxQAA3MUAAPfFAAAVxgAANcYAAFTGAAB0xgAAn8YAAMzGAAD4xgAAH8cAAEbHAABvxwAAl8cAAMDHAADdxwAA9ccAAA3IAAAhyAAALMgAAELIAABZyAAAcsgAAI3IAACfyAAAu8gAAM/IAADryAAAAckAAB7JAAA1yQAAXMkAAHDJAACMyQAAlskAAKzJAADEyQAAzskAANjJAADtyQAAB8oAACLKAAA1ygAAUMoAAF3KAABrygAAesoAAIHKAACPygAApcoAAMbKAADoygAAAcsAABfLAAAxywAARMsAAFjLAABkywAAe8sAAIjLAACcywAArMsAAMLLAADTywAA3MsAAPTLAAASzAAAK8wAAEHMAABTzAAAZ8wAAILMAACOzAAAocwAAMfMAADhzAAABs0AABXNAAAmzQAAPs0AAGjNAAB5zQAAms0AALjNAADUzQAA6M0AAADOAAAezgAAPs4AAEbOAABVzgAAaM4AAHLOAACJzgAAos4AALjOAADOzgAA3M4AAPjOAAAGzwAAI88AADvPAABSzwAAac8AAIDPAAChzwAAvc8AAMfPAADYzwAA688AAALQAAAg0AAAQtAAAFbQAABj0AAAc9AAAIbQAACp0AAAu9AAANDQAADj0AAAA9EAABPRAAAq0QAAQdEAAFLRAAB30QAAl9EAAKzRAADG0QAA3NEAAO3RAAD40QAAENIAACLSAAA60gAATdIAAGvSAAB/0gAAjNIAAKnSAADQ0gAA5dIAAPzSAAAR0wAAKtMAAEPTAABY0wAAbdMAAIzTAACr0wAAydMAAOfTAAAF1AAAKtQAAEDUAABp1AAAfNQAAI3UAACq1AAAwtQAANrUAAD11AAAENUAAC7VAABL1QAAadUAAIjVAACW1QAAsNUAAMbVAADb1QAA8dUAAP/VAAAU1gAAJ9YAADfWAABL1gAAYdYAAH3WAACZ1gAAtNYAAMfWAADf1gAA/dYAAArXAAAV1wAAMNcAAEvXAABc1wAAetcAAJjXAAC21wAA1NcAAADYAAAN2AAAGtgAAC/YAABE2AAAadgAAI/YAACb2AAAq9gAAMvYAADk2AAABNkAAB7ZAAA42QAAS9kAAGHZAAB82QAAiNkAALHZAAC+2QAA0dkAAOnZAAAA2gAAEdoAACTaAAA92gAAUtoAAF7aAABr2gAAgNoAAJ7aAAC02gAA0NoAAOLaAAAB2wAAI9sAADLbAABB2wAAUtsAAF/bAABx2wAAg9sAAJbbAACq2wAAvtsAANbbAAD62wAAG9wAADLcAABI3AAAbNwAAHvcAACN3AAAqtwAAMXcAAD03AAADd0AABjdAAAp3QAAO90AAFPdAABh3QAAfd0AAJrdAAC53QAAzt0AAPfdAAAh3gAAPN4AAF7eAABw3gAAk94AAKbeAAC23gAA2t4AAOzeAAAJ3wAAIt8AADvfAABX3wAAdN8AAJHfAACm3wAAvd8AANzfAAD73wAAGOAAADXgAABV4AAAduAAAJPgAACr4AAAvOAAAO7gAAAC4QAAIOEAAC3hAABJ4QAAZuEAAIPhAACZ4QAAquEAAL/hAADR4QAA6uEAAAviAAAy4gAAUOIAAH7iAACV4gAAqeIAALriAADZ4gAA+OIAABXjAAAy4wAATuMAAGbjAACH4wAAqOMAAMXjAADa4wAA+eMAABLkAAA15AAAbOQAAHzkAACE5AAAmuQAAK3kAADD5AAA2eQAAOXkAADw5AAACOUAACflAAA75QAAUuUAAFzlAABq5QAAc+UAAH/lAACb5QAAsuUAANPlAAD65QAAEeYAADTmAABL5gAAZuYAAH/mAACe5gAAseYAANfmAAD75gAAFOcAACjnAABC5wAAWucAAGznAACU5wAAtOcAAL/nAADZ5wAA9ucAABHoAAA26AAATugAAGboAACB6AAAnOgAAMboAADt6AAABOkAAC7pAABR6QAAb+kAAI3pAACr6QAAx+kAAO/pAAAL6gAALuoAAELqAABg6gAAeuoAAJbqAACw6gAA0uoAAPTqAAAH6wAAGOsAAD/rAABh6wAAkusAALnrAADj6wAAA+wAABDsAAAm7AAAPuwAAFjsAACB7AAAoewAAMHsAAD27AAAK+0AADntAABN7QAAZe0AAITtAACq7QAA0O0AAO3tAAAe7gAAUO4AAILuAAC27gAA6e4AAAzvAAAm7wAAUe8AAHnvAACT7wAAve8AANfvAAAV8AAAU/AAAHDwAACN8AAAovAAALrwAADd8AAAIfEAAEHxAABi8QAAkPEAALDxAADR8QAA//EAAC7yAABQ8gAAafIAAInyAACm8gAAwPIAANLyAADh8gAA9PIAABfzAAA48wAAWfMAAHLzAACG8wAAm/MAAKXzAAC38wAAyPMAAN7zAAD88wAAKPQAAEX0AABi9AAAavQAAIf0AACc9AAAxPQAAO30AAAL9QAAJfUAADz1AABP9QAAaPUAAHj1AACV9QAAsvUAANn1AAAA9gAAJ/YAAFb2AABr9gAApfYAALn2AADM9gAA5PYAAO32AAAE9wAAMPcAAEP3AABn9wAAh/cAALL3AADN9wAA/vcAACH4AAA6+AAAXfgAAHL4AACo+AAAvvgAANH4AADu+AAA//gAABT5AAAg+QAATPkAAHf5AACj+QAAyPkAAOL5AAAQ+gAARvoAAE76AABS+gAAVvoAAGD6AABj+gAAfvoAAI/6AACo+gAAvvoAANP6AADl+gAA7voAAAD7AAAW+wAALvsAAFr7AABt+wAAj/sAAK37AAC7+wAA4PsAAAf8AAA0/AAASfwAAGX8AACB/AAAo/wAALf8AADd/AAABf0AACf9AABI/QAA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\",\n nameLen_b64:\n \"EgAaABMAFAAeAAwACQAZABEAEAAUAA8ACAASABcAHgAGABAADAAHABYAFwALABcADAAeAB4AGwAcACQAFwAWABQAFAAUABUAFgAUABUAFAAPAA4AIAANAA0AEAAeABoAFwAaABEAFgAZABwAHQAfABwAEgAJABcAKwA3ADYAFgAXAB4ADwArABMAEAAQACEAGwAeACEAKQAaABMAFAAUAAkAFwAUABQAEgAYAAsADgAOAAoAGQAeAA0ACQAKAA8ACwATABEAEwAJAAoADwALABMAEQATABYAIQAPAB8AEgARAA8ADgAUABgACAARABEAIgAOABYADAAPABIAFwAWABkAIgAoABcAKQAJABEAFgATAAsADwATABgAEwAdABMAGQAPAB8ADwARACIAFAAWABAAIwAKABIADQAMABYAEwAiACUAFQAcABEAHQApABUAFwAhAB0AHgAaABYAEgAjACUAHwAWABkAHQAaACQAGAAQABwADgAVABkAHAAVAA8ADQARABMAFQAVAB8AGgAVABkAGgAXABcADwASABEAGAAVABIACQAOABAAFwATACAAHAAlABoAGQAcABkAHgAZABYAEQALABAAFQARAB0AGwAnABIAKAAXACkAHAAsAA0AHgAdAB4AEgAVACEAFwAoACUAGAAZABcAIQAmABoAFwAfABoALwAVABgAGAATABUADwATAAkAFwAeAAsADgANAA0AEQAVABUAEwAxABUAJAAVABMACQALAA4ACAAKABMAFAARAA8AEgAPABEACQAIABsAGgAdABkAFgAeACAAJgAoACIAKgAlAC0ANwAxADIAKwAsAD0APgA/ADoAHwAaABMAHgApABsACQAfABkAEQAXABsAEQAUAB8AFQATABYAIwAcABQAIgASAAsACQARAA8AIwAoACUAHgAQABAAJQAlABoACgAgACIAKgAVACUAEQASABEAIAATAAwAGwASABwAHwAgACAADwARABcAEAAKAAsAFwAUABMAGAANAA4AIwAWAAwADwAUAB4ADQAJABIAEQAXABkACwAXAAoADQAYAA8AEQAaABkAGgASABkAFwAYABkAFwAZABEAFQAXAA8AFQAYABcAGQAfACUAEwAVABsAFgAeAB0AJQAYACEAIwAdACYAIAAjABYAFgAiABUAHgAdACgAMgAiABAAGgAtACsAFQAgAB8AFQARABQAGQANAB0AKwANAA4ADQANAA0AEgAXABMAEwAVAAgAIQATABwAGAAcAAsADwAWABkAHAAcAB0ACgAXABEADwANABEAEgAQAA8AFQAOABUAFQAiAA0AHAAcAB8AHgAaABgAGQAaACEAFAAVABQAFAAvACoAGQAYABsACgAYABYAEQATABEAHwAJABcAFwAgACMAJAAVABUADQAQABwAIAAXAAoACwAZAA0ADQAdABEAGgAZABAADAARABEADQAWABYAHgAQABcAEQANABYACgATAA4ABwAYABcAGgAVABIACwAHAA0ADQAMABwAIgAhAA0AEQAOABAAFAAUAA8AEgAUAA0ADwAbABQAEAAVABcAGQAPAA8AGwAJAA8AEgAPAA8AFAAaAA8AFQARABEAEwATABcAEAAXAA0AEAAQAA4AGQAdABkACwALAA4ADQARAA0ADQANABAADwAOABUAFQANAAwAEgAOAAkAFQAQABAADAAMABAAFAANABAAEAAPAA8AEwASAAoAEAAKABUADAAVAAcACAALAA8ACgAcAB8AIwAeABsAHgAdABEAEQAJABQADwAPABMAFwANAA8AGQAYAAgAEwATAAsAEQANAA8AEQAQAA8ADAALAAsACwAJAAsACAAIAAoADAAUAAsADwAZAA0ACgAJAA4ADAAMABAAFQAQAAsACAAKAAkAGAAUAA8AEQAIAAkAEAAVABcADAAOAAsADwAMAA4ACwAMAA0ACQAOAAYACwAIAAsACAASAA8ACwASAA8AEwAQABEADgASAA8AEwASAAwADwAXABcADQAOABoAEgAaABkAKAAQABAADwALABEADAAJACMAGAAUABwAFgAUABMAHgAeABQAGQAUABMAEgAaABcACAATAA4AAwARABEAHwARABkAHQAjAA4ACAANABAAEAANAAsAFQAUABoAFgAPAA8AFwAOABIACQAIAAcACwAGAAoACAAWAAsAGgAYACAAFgAWACIAIgArACYAJQArABAAGAAaAAwAEgATABYAFQAWAA0AEAAUABcAJAARAAsAEwAPAAkAEgAPAAoAEQAYABEAFgAWABUAGAAZABwAGwAVABQAHAAjACAAHwARAAoACwARABEADAAJAAkAFQANABYAGAAXACgAEgASAAsADQALABYAFQAaAAoACQARABcADgAHAAsAFgAWABAAFQAMAA8ACAANABEAEAARAA0AIgAKAA0ADwASAAQADgASAA4ADQAMAAwACgATABEAEAATABEAFgAPAAwAGwAaACcALQAlABsAIQAWABYAGwAZABUAGgAaABoAJgAVABUAGQATABEAEgARAB0AEwAJABsADwAQAAkADAAXADQADAASAAoAEQAdAAkAFQADAAQABQAmAB8AEwAMABAAFAANABMADgAQAA8ACQAIAAgACQAhABAADgAWABgAHwAhABQAFgAMABcAGAAaABoAFwAXAB0AGAATACMAEAAXABgAGgAaABcAGQAZAB0ADwAaABsAHQAdABoAGgAgABsACgAYABAAEAAQABcAGQATABgAGgAiABUAFAAJABgAGAALAA8ADwAQAA0AHAAbAAwAGwALAA4AIAAKABIAHgAPABAAEwAWABsAHQAUABEAEAAPAAwAIwAhAB4ACwAbABMADgALABMAEwATABMAEAAQABcAFwAcABwADgAOABMADgAYABYADQArABwAKwAcAB8AEAAfABAAHwAQAB8AEAAaABIAGAAXABsAFgAYABMAEwAUABIAFgAPABsAHQATAAwAFQATAAwACgAdAB0AJwAkAB0AEgAkAA8AGwAWABMAGAAUABgAHQARABMAGQAgACcAFQATAA0ACQAPAAoAEQAOABYAFgAbABsAEwAeAA4AEQAQABMAFAARABkAEQARABAAEAAVAA0AFAAIABgAFwARABUADQASABIAHQAcABQABwARABgAGQAYACAADAAXAB8AGwAVAA8AFQAbABYAFAAUABYAHAAQAA0AFgAbACMACgAQABMAEAAgAA8AEwARABIAHgAaABMAGAAXACIAEwAcAA4AGAAOABEAGQAVABMADwAcABkAHAAjABoAEAAgAC0AFAAPABMAIQANAA8ADwAbACQADgASABMAHgASABUAGgAiABcAFgAXACEAKwAYACQAHQAmABcAHwAWAB4AIwAVABEADQAgABIAGwAOABkADAAxABkAMAAwABoAGQAeAB0AGAAcABkAEgAYABgAHwAmACkAIwAUAB4AEQAXABwAHgAXAA0AEAASABIACgAVAA4AEwAVABIAHAAXABcADwApACkAGQAQABkADwAJABwADgAWABUAFwAKABQAEQASABsAGAAXABYAGQAhABMACwASABoAFgATABUAEgANABAAGAATAA0AEgAPACQAGAAjACUAGgAeABoAFwAHABsAHwAeABUAHgAYACAAHwAkAB8ADwAMABoAEwARABQAHQAgABIAIQARAA4AFwARABAAEAAbABkAEwAZABYAIQAdABQAEwAYACwAHQAbAAwAHgAiABkAGAAgABoAFQAXABMAIQAYABAAFwAeAB0AJgAWABsAFAAdABMAFgAlACEALAAtAC8ALwAsACwAMgAXAAkAHwAaABMAFwATABwAIAAfACEAKAAZABkAGQAcABIAFAAbABwAIgAUACYAFwAbABkAGAAaAB8AIQAaABwAGAAWAB4AIAAPABIAFwANABQAHAAZACAAGAAbAB8AIQAiACQAIQAhACEAHQAfABwAHAAcABAAEgAeAB0AHwAYABEAEQARABEAEQARABQAJAATABIAFwAVACcAIQAlABoAGwAjABgAJwArABAAHAAWAB4AGwAgABgAEwAhACAAGwASAA8AGQAUABsAEgAOABQAEAARABUAFgAfABAAIQAVAB8AHQApACEAJQANABkAFgARABoAFQAIACEADwAbAB4AIgAhABYALgAXABAAFwAcABQAGwAaACIAIQAaAA8AEwAUABQAHAApABAAIAAjABkAFgAcABoAHQAOAA8AJgAnABwAKAAYAB0AIQAjABsAGwAXABwAGgAfABMAEAAPABYAGAAcAB0AJQAdABsAGQAvACIAFQATACUAFgARACAAHgAyACUAKwAeABoAJgAbACkAIwAhAB8AKgAWABoAFgAUABEAEQAeAB0AFAAXABAAEQAHAAwAEQAOABUAEwAWABYAEwAKABIAFQATABEADAAVABQAGAAXABAAEwAKAA8AGQAUABQAGgAZABIAIgAjABUAHAATABYAGwAVABEAIAAaAA0AGQAdABwAHwAaAB0AHgAZABcAGQAjABkAIAANACMALwAHABUAFAAPABQAFQAYABUAHgAlACQAFgAUAA0AEAAVABoAGAAVABYAKwAtACIAHAAdABYAHgAdAB8AIwAcABgAGgAWABYAFQAdACIAFwAiACAAIQATABYAHQAMAB8AGgAeAB0AGgAbAB4AGAAZABkAGAAZACEACgAQACkAEwAkABcAJAAXABsAJQASABEADAAXABMAFQAMABAADgATABoAGwAZAA4AIQAcACQAJAASAB4AFwAaACEAEQATABEAEgASABMAHwAUABYAFgAaABoAGgAWACgAGwAbABsAFgARABUAFgArACoAJQAlAB0AFQAWABoAFgAQABAAKQAjABAAGwAhACYAJAAXABUAGwAaACcALQApAAgAGAAdABUAGQAQABQADwAfAAsAJgARAC0AOAAyABoAIAAqABUAHAAaABYAEgANABQAJQAsACYAKgAoACsAOgASACoANAA4ADgAMwAwAC8AMAAsAC4AKgAqADoAOQArACoAOQAbAB0AIgAmACkAJgAnABAAHAAuACwAHwAfABgAJAAoACsAHQAgAB8AGwANACsAMwA2ADQAIAAgABEAJwAbAB8AHgAbACsAIgArACsAKgAQAC0AFgASABkADgAUAAkACQAXABsAGQAQAB0AGAATABkAJwAMABgAEAAeAB0AFwAhAB4AFQAfABcAGAApABoAFgAbABYAHwAXABoAFgATABsAGAAYACUAFgAfABcAGgAWADEAGQA2ABwAGwAaABoAJAAdAB4AFAApAB8ALwAlADoAMAAiACUAGQARABcAHAAfAB8AJQAPABAAEgAWACMAEAAwADIAMwA+ABcAEgAUABQAHwApABUAMwA0ABwAGwAZACEAFQAWAA8ACwAOAA0AEgAtACUAFwAQABAAGAAPABMAGQAXABMADgAVABUABAAHAA4AGgAMAAoACgAQABMAGAAOACIAFwAdABgAHgAbAB8AFgATABYAFgAVABgAGgAVABEAFAASABUADQAKAAcAEwAfAB4AFwAWABoAGQAmACUAEQAWABYAHAAbACEAFQATABIAGgAnACEAFgAeAB4AIAAdACMAJgAZACEAEAAcABEAIQAcABgAFgAZABgAEQAWABkAFwAZABsAIgAaAB4ADAALABAADAALABwADgARABYAIQAkACYAJQAmADEAMwAyABoAGwAeACAAHwAgACsALQAsACcAJwApACgAKQAdABgAGAAUAAsAFgAXABkAGwASABwAFAAcABYAHQAXACcAFAAcAAoAFgAYAAoACgAVABoAGwATABsADQAOAA8ABwAOABYAIQAiABkAFgAaABMAFAAMABcADQAUABAAFgARAAkAGAAeABkAFgASABQAGwAMABMAJgAaACUADwARABgAKgARACEAHgAcABQAGAAeACAACAAPABMACgAXABkAFgAWAA4AHAAOAB0AGAAXABcAFwAhABwACgARABMAFwAeACIAFAANABAAEwAjABIAFQATACAAEAAXABcAEQAlACAAFQAaABYAEQALABgAEgAYABMAHgAUAA0AHQAnABUAFwAVABkAGQAVABUAHwAfAB4AHgAeACUAFgApABMAEQAdABgAGAAbABsAHgAdAB4AHwAOABoAFgAVABYADgAVABMAEAAUABYAHAAcABsAEwAYAB4ADQALABsAGwARAB4AHgAeAB4ALAANAA0AFQAVACUAJgAMABAAIAAZACAAGgAaABMAFgAbAAwAKQANABMAGAAXABEAEwAZABUADAANABUAHgAWABwAEgAfACIADwAPABEADQASABIAEwAUABQAGAAkACEAFwAWACQADwASAB0AGwAvABkACwARABIAGAAOABwAHQAfABUAKQAqABsAIgASACMAEwAQACQAEgAdABkAGQAcAB0AHQAVABcAHwAfAB0AHQAgACEAHQAYABEAMgAUAB4ADQAcAB0AHQAWABEAFQASABkAIQAnAB4ALgAXABQAEQAfAB8AHQAdABwAGAAhACEAHQAVAB8AGQAjADcAEAAIABYAEwAWABYADAALABgAHwAUABcACgAOAAkADAAcABcAIQAnABcAIwAXABsAGQAfABMAJgAkABkAFAAaABgAEgAoACAACwAaAB0AGwAlABgAGAAbABsAKgAnABcAKgAjAB4AHgAeABwAKAAcACMAFAAeABoAHAAaACIAIgATABEAJwAiADEAJwAqACAADQAWABgAGgApACAAIAA1ADUADgAUABgAHwAmACYAHQAxADIAMgA0ADMAIwAaACsAKAAaACoAGgA+AD4AHQAdABUAGAAjAEQAIAAhAC4AIAAhAC4ALwAiABkAIAAdABoAEgAPABMAIwAhACEAGQAUABUACgASABEAFgAeACwAHQAdAAgAHQAVACgAKQAeABoAFwATABkAEAAdAB0AJwAnACcALwAVADoAFAATABgACQAXACwAEwAkACAAKwAbADEAIwAZACMAFQA2ABYAEwAdABEAFQAMACwAKwAsACUAGgAuADYACAAEAAQACgADABsAEQAZABYAFQASAAkAEgAWABgALAATACIAHgAOACUAJwAtABUAHAAcACIAFAAmACgAIgAhACAAFQAhABwADAAoACAAJQAZABQAHAAvABwAGQAeACkAIQAeACYAIgAkAC8ADgAZABAAEAAPABcAGgAqACAAIQAPACEAKQAhABcAEQATAA4AEQAaAB0AEgAjABoAEgAXABwAHQAoACMAHwAVABgAGwAZAAsAEwAPABYAGwAVABQAFwASAA8ADQAUAB4AFgAPABoAGAAfACAAFgAXAAsAEgAUABkAHwAcAB8AGAAoABAAFQAMAB4AEQAbABEAGAAWABcAHgAPABEAEAAhABAADQAUABMAEgARAA8AFAAMAAkACwATAB4AHQAZABUAHQAWABsAGgAdABEAEQAQABwADwAIABQAJAAjAA8AFwAQAAgADwAaACkAGAAXAAwACwAjABcAHQAcABwAGwAgABMAFQATABoAKAALAA0AGAAVABgAGAAVACQAGwAnAB8AFwAfABsAJQATAA4ADAAWABUAGAAaABwAJQAnABQAFQAKAA8ADwARABAAEQASABEAFwAUAB4AFAALABQAEwAaACEAGwAVABMAFQAWAB0AGQASABIAHgAMAA4AKAAVAB8AIQAgACQAIQAaACUAIgAZABQAGwAQAA4AIgAbAAwAFwAOABMADAATABoAFAAYABoAHQARABUAJgAQAAwAGAAUABoADwAMAAkADgAWABEAIAAhABEAIQAhACQAFAAbABAAEgANABQAEQAWABIAFQAfABkAFgAWACYAFQAQAA4AEQAbAAsADgAYABUACgASABAADgARABsAGAAQABMAGAAXAA4AEQAbAAwACwAOABEADwASAAoAFAANABcAEAAYABgAHwAfABcAEgAHAB4AJgAlABkAGAAKAAUADAASAAcAFwAbAA8AFAAbABcADwAJAA4AEwAWABMAEgAfABoAFgALABUAFQAOAAoAFgAeABEAFQAWABUAEQAUAA0AEAAPACUADQAMABIAKwAUABQAHQAXACAAHQAWACEAGgApABQADwAKAAsAHgAZACIADgAOAA4AKAApABAADwANAA8AEQAWABwAHgAbAAwACAAVABwAHQAVABQAFQARABQAHAAOABAADwAUAA4AFAAaABYAEgAUABUAEwAMABcADAAZABcANwAkABsAGQAQABMADQAwAA0AFgAYABsAGgAWABgAEAANACEAJwAOAA0AEwAiABQAGgATABMAFwAZACAAGgALABYAHwALACEAHwARABwAIwAkABgAEgAoAB8AFAAOABEAGwAXABMADAAUAA8ADQAMABIAGAARACMAHwARABkAFQAcABcAGgAZABIAFQAVAA8AJAARABMAJAAYAA8ADgAbABkADgARABAAFwAdABwAHQASABsAKgAcABQAFgAbABMAFQAcABUAEQARABEADgAWAA0ALgAYABcAEgAUABoAHQAuACYAIgAqABMAIgAfAB0AFgATABkADAAaABoAFgAUABIAFQAcACAAJgALABUAEQAVAAsACwANABwAEwANACsALwAeACIAHgAUABEALAAuABcADAASABgAGAASACgAIwAUABgAHAAjABEAFwAXABkACAAMAAsADQARABEAEQAUABQAEwARAAsADQANABYACgAEAAYAGQAaAA0AEAALAAsACAANAAkAFAANAA0ADQASABQAEAARABIADAAJABMADgAJABQAGgAOAD8AKAAcABMAEgAeABgAFQAdAB4ACwAVABMAEAAlACkAEAAPACUAEAAgACEAIQAeACgAFQAaAAQAGgARACEAEwAhACYACgAgAA8AFgAUAA8AHAAUABoAGwAeABAAEAAUABUADAAdABUAFgANABAAEQAUABQAEQAQAAwAGgAOABoAGwAJADAADQAWACAALAAhAB4AGAAcACMAFQAtABIAGgAYABYAEQALABsAFAAfABgAEwAcABcADAASABIAEQAWAA0ADgATABoAFAAWAB8AIQAtABwAHQAYABEAGAAZABEAEwAaAA4AGAAMABEAEgAZAA0AEwAXACUAHwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAZAA8ADwAPAA8AHwAWABgAIQAeABoAHQATABAADwAbACYAGgAdABgAGwAUABQAEgAOABIAHwAdABcAFwAZABcAGQAXABYAGAAQABkAEAAmABgAIQAgABwAHwAYABUAFQAZABUAFAApABMAGQAOABAAHAAHAA8AKwAVABUAGQAbAB0AIQAfABkAFwASACgAFQAgACcAJgAKABIALgAQAAwAGwAQACAAJAAfABsAHgAaABkAIQAXABIAFgAjACUAHwAiACcAHgAYABwALAAjABsAGgAVACEAHAAeAA0AEgAlACUALgAkACUAHQAMAAsADAAVAAkAFgAeAA4AFgAYABIAJwAlABcAHAAXABkAFwAWABgAIwAZACMAHwAbAB0AHgAnABsAJwApACwAGQARABYAGQAWABYAEQALABkAFgAmACMAFgAmACMAGAAfABoAGwAkACkAIwAcAC0ALAA3ACsAKgAuACoAMgAmACoAJgAbAB4AEAAOACEAIAARAAwACgAKABkAHQARABwAGwAnAB4AHgAXABYAJwAeAA8AGwAVABgAGgAcAA8ADgAeABcAHwAfABwAGAAVABYAEQASABQAEwAVABEAGAAXACkACwAfAAwAEgATABgADwATAAkAFgASABEAIwAiACAAAwAbACEAEAAaACcAHQAaAB0ADwAWACEAFAAVABgAGAAbABYAGQAQAA4AHAANAAoADwAQABAAFwAeABUAFgAYABsAIwAOABAAFgAbACQAGQAlABIAGQAPAAoAEwAaABEADQAYACAAFAAcAA0AEQAKAAoABAAYACMAFAAMABUAEwAdABoAJAAQAAgAEgAdABUAFgASABsAFwApACMAEgAKACYAJAAgACAAHAAjACAAIAAgABMAGAApABcAFAAhABIADwATAAwADAAKABUABwANADEADQARAAsAFAATACMAIgArACYAHgAfACEAJgAmAB0AHQArAAkAEwAQAAwAEAATABYAGQAsACEAIAAeABEAFQAPAAwACwASABQADAAcABYAEgAWAA8AFAATABMACgAfAA4AEAAQABEAEgARABAAGgALAA0AEwAlACIAGwAUACMAFwAWACQAKQAqACoAKAAdAB0AJgAfACYAIwAmABcAIAAaABkAFwAjABoAGwAUABcANwAxAB0AHwAnACYAJAAtACUAJQAlABUAEQAZABgAMgALABcAIwAqACsAHAAhAB0ABwAJAAgAFgALABIAEQAVAA8AEQAJAB0AFQAZAAsADgAOAA8ABwAYABYADgAOAAsAEQAQABcAEAAQACIAGQAaABQAHwAXAAkAHQAHAA4ADwAJAAsAFgAUABEAFgAsABgAEgAPABQAFAATABUADQAQACgAFAAfABIAFgAhAAsAGQARABMAEwAfABkAIAAUAA4AHQATABgAHwAjACkAKQAsACIAKgAkACUAIgAmAB4AHQAXABAAEQAcAB8AFQAZABkAGgAYABsAIQAYABoAGAAaABYAFgAcAB8AEQARAA8AFQAaABEALwAdABIAFwAaABAAGAAYABIAGwAQAA4AFAAaAA8AHwAdACIAIAANAAsAJwAlACkAJwAjACQAJQAqACUAFQAbABUAGQAtABUAHAAmAB4AFgASACgAFQAlACUAFwAZABkAFwAXACAAIAAgACAAHQAdACMAFAAUABYAFgAwAAsAKAAWABYAHAAYABEAEwAdAA0ADQALAAoAEQAKAAoAEgAKAA4ADgAXABUAEwAQABoAFQAYAB0AEAARABAAEwATABEAFgARAB0AGQAUABYAIQAWABQAEwAUACAAIwAjABYAHAAfABsAGgAhACUAIAAcABIAFQATABgAGAAjABkADwANABoAGgAIAAwAGgAkABgADwAoABkAIwAXAAwAEQAVABcALAAfACwAGgAMABQAFAASABoAGAAiACUAFAAWAAoACAAPAAgAGQANABUAFAAgACoAFQAOAA0ACwAJAAcACgALACYAEAAcABkAFQAHABAAEwAUAAoAGgATABEADQAfAA8AEgAXABMAGwAYAAwADwARAA4AFAAmAA0ACwAZABwACQANAA8AFQALAAkADgARABMACQASAAwADgAVACIAHQAVABQAEQARAAsAFQANACIAEAALABcAFwAjABMAHwAdABYAIgAYABwAFwARABEAFwA6AB8AGQAYABIAHgARAB0AEQAQABwAGQALABYAGgAfACQAIAAUABIAEQAZABYAEgATABkAFgAYABcAFwATABQAGgAXAA4AGQATAA8AEAAWABQAGQAhACUAIAAYABMAGAAOAAwACgASABQAEgANABEAIwAmABEAFQATABUADgAbABsAGAAUABYAFAAcAA4ADAAMABYAHQAbABcAGQAZACUAKAAWABIAFAAZAA8ADQANABAAEgAOABcAFgASABQAFAAWABwAJAAnABgAIgASABIAFQATAA8AEQAdACAAGQAaABwAFgAUABUAGwAbACwAIgAXAB8AJQAeABsAFgATABUAFAAIABUAGgANAA0ABwAVABQAEgAOABAAFwAfAB4AHAAYABoAIQAuABcAFgAUABAAEgAZABcAEgAQABsAEQAbABcADAAcABMAHwAkACYAHQApAB4AHgAdADEAMAAhABIADgAZABkAEQATABkAFwAQABYAEQAZAA8AHQAQABcAEAAYABwAEQAdABcAGAASABsAFAAWACAAIwAaABcAEQASABIAKgAWABEAEgAPABsAGQAbACEAEwALAB8AIQAbACQAHAAUACgAKgAgABcAEwAcABwAIAAXACYAFgAVABsAGQAeACAAKgApACYAIgAdABcAHQAXACMAFwATABUAIwAgABEAGQASABAAHQAlAB0AJwAjACMAJAASACEAKAAsABYAEwAgAA4AJwASACYAHQAcACAAHgAnABkAFAAwAAwAJQAjABIADAAYABkAGwAdACQAIgA5ABwAIgAlACAAIQAgABoAHwAmACIAJwAPABcAFwAiACAAFgAjACQAHgAtADcAJwApAC0AEAApAC0AKQAdABkAHwAdABoAJwAYACsAFwANABAAGwAfABUAGgAiABoAFwAPABwAJAAqACMAGQAPAB8AHAAiACoAGQANABQAFAAkABYAIAAdAB0AIAAVACAAFwATABAAIAAjABwAFgAjABMAIQAcABwAKAAvACwAHgAfACMAIwAsACYAKQAjAB4AJgAWABQAEQARABQAIgAVAB8AHwAQACsALAAlAC0AIQAsABEAGgAeACMAEwAYAB0AJgAtACgAIwAtADgAKQAsADAALAA1ABwAKQAkABcAJQAZABoAEgAiACkAGwAjACYAPQAYABYAFAAeAB0AGwAoACYAFgAfAB0AIwAgAB8AHQAlAB4AHAAWAB4AFwAVABsAFQAbAB4AIAAfABwAJgAeABcAEQAcABwAFQAUABEAGwAZACEAGwAcACUAHgAgABIAGgAhAB8ADgAKAAoADAAhAB0AMgAqACkAEwAnACMAMwAjAB0AJQAgAB8AJgAnAC0AOAAeACIAGQArABsAHgAcABgAGQAdAB8AIQAXAB8AGAAVAB4AIwAYACIAHgAlACAAGwAlACEACwAWACkAKAAWACMAEAAUAAsACgARAA8ACwAVABMAEwAYABoAHAAfAB0AIwAcADUAIgAZABgAFwAiACcAIAAWABQAIAAiABsAGwAaABsAEwAkABgAGQAWABUAGgAWABQAFwAgACYAHgAdAB8AIgAjAB8AJgAkACIAIAAoABYAGwAjABYAIAAkACYAHwAZABoAIAANABkAFwAXABEAGQARABgAEgAgABkAIQAnABwAGQAWAB4AIQAhABwAHgAVABwAJwAoACkAHwAjACAAKQAmABEAFAARABcAKAAjACIAIgAeACAAJwAnACEAGgAcACYAIgAiACgAKgArACcAGAAbABgAHgAcAB4AEwAXABIAEwAYABYADQAQAA8ADgAKAAwAFAAXAA4ADgAZABQAEQAYAAQABwAKAA4ADAALAA8AGwAZABoACwALAAkAFQATAAcAGQAiABAAEQANABQAFAAZABUABwAMABQABwAHABEAGgALABAACAALAA8AHQAHABkAEgAJABsAEQAOAAoAHAAXABEAEwAXABwAJQAiAA0AFgAWAAwAGAAVAB0AFgAfABcAEQAbACEAFAAVAB4AIAAQABMAEwAVABwAFAAMAB4AEAATABoAJQAOABQACQAYABgAGAAZABYABAAUABgA\"\n};\n\nlet _init;\n\nfunction _decodeB64ToU8(b64) {\n // Browser: atob; Node: Buffer\n if (typeof Buffer !== \"undefined\") {\n return Uint8Array.from(Buffer.from(b64, \"base64\"));\n }\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nfunction _u8ToTyped(u8, Ctor) {\n // Ensure proper alignment by copying into a fresh ArrayBuffer\n const buf = u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength);\n return new Ctor(buf);\n}\n\nexport function initPacked() {\n if (_init) return _init;\n const groupsU8 = _decodeB64ToU8(_b64.groups_b64);\n const groupStartU8 = _decodeB64ToU8(_b64.groupStart_b64);\n const elemsU8 = _decodeB64ToU8(_b64.elems_b64);\n const vrCodeU8 = _decodeB64ToU8(_b64.vrCode_b64);\n const vmCodeU8 = _decodeB64ToU8(_b64.vmCode_b64);\n const nameOffU8 = _decodeB64ToU8(_b64.nameOff_b64);\n const nameLenU8 = _decodeB64ToU8(_b64.nameLen_b64);\n\n _init = {\n groups: _u8ToTyped(groupsU8, Uint16Array),\n groupStart: _u8ToTyped(groupStartU8, Uint32Array),\n elems: _u8ToTyped(elemsU8, Uint16Array),\n vrCode: vrCodeU8, // already Uint8Array\n vmCode: vmCodeU8, // already Uint8Array\n nameOff: _u8ToTyped(nameOffU8, Uint32Array),\n nameLen: _u8ToTyped(nameLenU8, Uint16Array)\n };\n return _init;\n}\n","// AUTO-GENERATED from dictionary.mjs by generate/pack_ranges.mjs\n// Repeating group ranges (5000-50FF Curves, 6000-60FF Overlays). Used when exact tag lookup fails.\n\nexport const rangeEntries = [\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 5,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_CurveDimensions\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 16,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_NumberOfPoints\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 32,\n vr: \"CS\",\n vm: \"1\",\n name: \"RETIRED_TypeOfData\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 34,\n vr: \"LO\",\n vm: \"1\",\n name: \"RETIRED_CurveDescription\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 48,\n vr: \"SH\",\n vm: \"1-n\",\n name: \"RETIRED_AxisUnits\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 64,\n vr: \"SH\",\n vm: \"1-n\",\n name: \"RETIRED_AxisLabels\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 259,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_DataValueRepresentation\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 260,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_MinimumCoordinateValue\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 261,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_MaximumCoordinateValue\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 262,\n vr: \"SH\",\n vm: \"1-n\",\n name: \"RETIRED_CurveRange\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 272,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_CurveDataDescriptor\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 274,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_CoordinateStartValue\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 276,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_CoordinateStepValue\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 4097,\n vr: \"CS\",\n vm: \"1\",\n name: \"RETIRED_CurveActivationLayer\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8192,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_AudioType\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8194,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_AudioSampleFormat\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8196,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_NumberOfChannels\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8198,\n vr: \"UL\",\n vm: \"1\",\n name: \"RETIRED_NumberOfSamples\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8200,\n vr: \"UL\",\n vm: \"1\",\n name: \"RETIRED_SampleRate\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8202,\n vr: \"UL\",\n vm: \"1\",\n name: \"RETIRED_TotalTime\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8204,\n vr: \"ox\",\n vm: \"1\",\n name: \"RETIRED_AudioSampleData\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 8206,\n vr: \"LT\",\n vm: \"1\",\n name: \"RETIRED_AudioComments\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 9472,\n vr: \"LO\",\n vm: \"1\",\n name: \"RETIRED_CurveLabel\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 9728,\n vr: \"SQ\",\n vm: \"1\",\n name: \"RETIRED_CurveReferencedOverlaySequence\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 9744,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_CurveReferencedOverlayGroup\"\n },\n {\n groupMin: 20480,\n groupMax: 20735,\n elem: 12288,\n vr: \"ox\",\n vm: \"1\",\n name: \"RETIRED_CurveData\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 16,\n vr: \"US\",\n vm: \"1\",\n name: \"OverlayRows\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 17,\n vr: \"US\",\n vm: \"1\",\n name: \"OverlayColumns\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 18,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayPlanes\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 21,\n vr: \"IS\",\n vm: \"1\",\n name: \"NumberOfFramesInOverlay\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 34,\n vr: \"LO\",\n vm: \"1\",\n name: \"OverlayDescription\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 64,\n vr: \"CS\",\n vm: \"1\",\n name: \"OverlayType\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 69,\n vr: \"LO\",\n vm: \"1\",\n name: \"OverlaySubtype\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 80,\n vr: \"SS\",\n vm: \"2\",\n name: \"OverlayOrigin\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 81,\n vr: \"US\",\n vm: \"1\",\n name: \"ImageFrameOrigin\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 82,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayPlaneOrigin\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 96,\n vr: \"CS\",\n vm: \"1\",\n name: \"RETIRED_OverlayCompressionCode\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 97,\n vr: \"SH\",\n vm: \"1\",\n name: \"RETIRED_OverlayCompressionOriginator\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 98,\n vr: \"SH\",\n vm: \"1\",\n name: \"RETIRED_OverlayCompressionLabel\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 99,\n vr: \"CS\",\n vm: \"1\",\n name: \"RETIRED_OverlayCompressionDescription\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 102,\n vr: \"AT\",\n vm: \"1-n\",\n name: \"RETIRED_OverlayCompressionStepPointers\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 104,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayRepeatInterval\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 105,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayBitsGrouped\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 256,\n vr: \"US\",\n vm: \"1\",\n name: \"OverlayBitsAllocated\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 258,\n vr: \"US\",\n vm: \"1\",\n name: \"OverlayBitPosition\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 272,\n vr: \"CS\",\n vm: \"1\",\n name: \"RETIRED_OverlayFormat\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 512,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayLocation\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 2048,\n vr: \"CS\",\n vm: \"1-n\",\n name: \"RETIRED_OverlayCodeLabel\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 2050,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayNumberOfTables\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 2051,\n vr: \"AT\",\n vm: \"1-n\",\n name: \"RETIRED_OverlayCodeTableLocation\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 2052,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayBitsForCodeWord\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4097,\n vr: \"CS\",\n vm: \"1\",\n name: \"OverlayActivationLayer\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4352,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayDescriptorGray\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4353,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayDescriptorRed\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4354,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayDescriptorGreen\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4355,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_OverlayDescriptorBlue\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4608,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_OverlaysGray\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4609,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_OverlaysRed\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4610,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_OverlaysGreen\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4611,\n vr: \"US\",\n vm: \"1-n\",\n name: \"RETIRED_OverlaysBlue\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4865,\n vr: \"IS\",\n vm: \"1\",\n name: \"ROIArea\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4866,\n vr: \"DS\",\n vm: \"1\",\n name: \"ROIMean\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 4867,\n vr: \"DS\",\n vm: \"1\",\n name: \"ROIStandardDeviation\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 5376,\n vr: \"LO\",\n vm: \"1\",\n name: \"OverlayLabel\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 12288,\n vr: \"ox\",\n vm: \"1\",\n name: \"OverlayData\"\n },\n {\n groupMin: 24576,\n groupMax: 24831,\n elem: 16384,\n vr: \"LT\",\n vm: \"1\",\n name: \"RETIRED_OverlayComments\"\n },\n {\n groupMin: 32512,\n groupMax: 32767,\n elem: 16,\n vr: \"ox\",\n vm: \"1\",\n name: \"RETIRED_VariablePixelData\"\n },\n {\n groupMin: 32512,\n groupMax: 32767,\n elem: 17,\n vr: \"US\",\n vm: \"1\",\n name: \"RETIRED_VariableNextDataGroup\"\n },\n {\n groupMin: 32512,\n groupMax: 32767,\n elem: 32,\n vr: \"OW\",\n vm: \"1\",\n name: \"RETIRED_VariableCoefficientsSDVN\"\n },\n {\n groupMin: 32512,\n groupMax: 32767,\n elem: 48,\n vr: \"OW\",\n vm: \"1\",\n name: \"RETIRED_VariableCoefficientsSDHN\"\n },\n {\n groupMin: 32512,\n groupMax: 32767,\n elem: 64,\n vr: \"OW\",\n vm: \"1\",\n name: \"RETIRED_VariableCoefficientsSDDN\"\n }\n];\n","import { initPacked, vrTable, vmTable, nameBlob } from \"./dicom.packed.js\";\nimport { rangeEntries } from \"./dictionary.ranges.data.js\";\n\nlet _groupIndex;\nfunction _ensureGroupIndex(groups) {\n if (_groupIndex) return _groupIndex;\n const m = new Map();\n for (let i = 0; i < groups.length; i++) m.set(groups[i], i);\n _groupIndex = m;\n return m;\n}\n\nfunction _binSearchU16(arr, start, end, target) {\n let lo = start,\n hi = end - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const v = arr[mid];\n if (v < target) lo = mid + 1;\n else if (v > target) hi = mid - 1;\n else return mid;\n }\n return -1;\n}\n\nexport function lookupTagHex(hex8) {\n // hex8 like '00080005'\n if (typeof hex8 !== \"string\" || hex8.length !== 8) return undefined;\n const group = parseInt(hex8.slice(0, 4), 16);\n const elem = parseInt(hex8.slice(4, 8), 16);\n if (!Number.isFinite(group) || !Number.isFinite(elem)) return undefined;\n\n const { groups, groupStart, elems, vrCode, vmCode, nameOff, nameLen } =\n initPacked();\n const gi = _ensureGroupIndex(groups).get(group);\n if (gi === undefined) return undefined;\n\n const start = groupStart[gi];\n const end = gi + 1 < groupStart.length ? groupStart[gi + 1] : elems.length;\n const ei = _binSearchU16(elems, start, end, elem);\n if (ei < 0) return undefined;\n\n const vr = vrTable[vrCode[ei]];\n const vm = vmTable[vmCode[ei]];\n const off = nameOff[ei];\n const len = nameLen[ei];\n const name = nameBlob.slice(off, off + len);\n\n return { vr, vm, name };\n}\n\n/**\n * Look up a tag by hex8 (e.g. '50010005') in the range dictionary (repeating groups 50xx, 60xx, etc.).\n * Returns undefined if the tag does not fall within any defined range.\n */\nexport function lookupTagRangeHex(hex8) {\n if (typeof hex8 !== \"string\" || hex8.length !== 8) return undefined;\n const group = parseInt(hex8.slice(0, 4), 16);\n const elem = parseInt(hex8.slice(4, 8), 16);\n if (!Number.isFinite(group) || !Number.isFinite(elem)) return undefined;\n for (let i = 0; i < rangeEntries.length; i++) {\n const r = rangeEntries[i];\n if (group >= r.groupMin && group <= r.groupMax && elem === r.elem) {\n return { vr: r.vr, vm: r.vm, name: r.name };\n }\n }\n return undefined;\n}\n\nfunction _pad4(hex) {\n return (\"0000\" + hex).slice(-4);\n}\n\n/**\n * Yields all standard (packed + range) tag entries for building nameMap.\n * Each entry has { tag, vr, vm, name } with tag as \"(GGGG,EEEE)\".\n */\nexport function getAllStandardTagEntries() {\n const out = [];\n const { groups, groupStart, elems, vrCode, vmCode, nameOff, nameLen } =\n initPacked();\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n const start = groupStart[gi];\n const end =\n gi + 1 < groupStart.length ? groupStart[gi + 1] : elems.length;\n const gHex = _pad4(group.toString(16).toUpperCase());\n for (let ei = start; ei < end; ei++) {\n const elem = elems[ei];\n const eHex = _pad4(elem.toString(16).toUpperCase());\n const tag = \"(\" + gHex + \",\" + eHex + \")\";\n const vr = vrTable[vrCode[ei]];\n const vm = vmTable[vmCode[ei]];\n const off = nameOff[ei];\n const len = nameLen[ei];\n const name = nameBlob.slice(off, off + len);\n out.push({ tag, vr, vm, name });\n }\n }\n for (let i = 0; i < rangeEntries.length; i++) {\n const r = rangeEntries[i];\n const gHex = _pad4(r.groupMin.toString(16).toUpperCase());\n const eHex = _pad4(r.elem.toString(16).toUpperCase());\n const tag = \"(\" + gHex + \",\" + eHex + \")\";\n out.push({ tag, vr: r.vr, vm: r.vm, name: r.name });\n }\n return out;\n}\n","import { lookupTagHex, lookupTagRangeHex } from \"./dicom.lookup.js\";\n\n/** Set by registerPrivatesModule() at startup (index.js / index.umd). */\nlet privateModule = null;\n\n/**\n * Register the private tag module (e.g. from dictionary.private.data.js).\n * Called at startup so privates are always available.\n */\nexport function registerPrivatesModule(module) {\n privateModule = module;\n}\n\nconst cache = new Map();\n\nfunction isPrivateTagKey(prop) {\n return (\n typeof prop === \"string\" && prop.length > 11 && prop.indexOf('\"') !== -1\n );\n}\n\nfunction _toHex8FromParenKey(k) {\n // '(0008,0005)' -> '00080005'\n return k.slice(1, 5) + k.slice(6, 10);\n}\n\nfunction _toParenKeyFromHex8(hex8) {\n // '00080005' -> '(0008,0005)'\n return \"(\" + hex8.slice(0, 4) + \",\" + hex8.slice(4, 8) + \")\";\n}\n\n/**\n * Register a tag entry in the cache so it is returned by the dictionary for that tag.\n * Use for tags not in the standard or private dictionaries.\n *\n * @param {string} tagOrHex - Tag as '(GGGG,EEEE)' or 'GGGGEEEE'\n * @param {{ name: string, vr: string, vm?: string, [key: string]: unknown }} entry - At least name and vr; vm and other fields optional\n * @returns {void}\n */\nexport function registerTag(tagOrHex, entry) {\n if (\n typeof tagOrHex !== \"string\" ||\n !entry ||\n typeof entry.name !== \"string\" ||\n typeof entry.vr !== \"string\"\n ) {\n return;\n }\n let parenKey;\n let hex8;\n if (\n tagOrHex.length === 11 &&\n tagOrHex[0] === \"(\" &&\n tagOrHex[5] === \",\" &&\n tagOrHex[10] === \")\"\n ) {\n parenKey = tagOrHex;\n hex8 = _toHex8FromParenKey(tagOrHex);\n } else if (tagOrHex.length === 8) {\n hex8 = tagOrHex;\n parenKey = _toParenKeyFromHex8(tagOrHex);\n } else {\n return;\n }\n const cached = {\n tag: parenKey,\n ...entry,\n version: entry.version ?? \"User\"\n };\n cache.set(parenKey, cached);\n cache.set(hex8, cached);\n}\n\nexport const dictionary = new Proxy(Object.create(null), {\n get(_t, prop) {\n if (typeof prop !== \"string\") return undefined;\n if (Object.prototype.hasOwnProperty.call(_t, prop)) return _t[prop];\n if (cache.has(prop)) return cache.get(prop);\n\n // Accept '(GGGG,EEEE)'\n if (\n prop.length === 11 &&\n prop[0] === \"(\" &&\n prop[5] === \",\" &&\n prop[10] === \")\"\n ) {\n const hex8 = _toHex8FromParenKey(prop);\n const v = lookupTagHex(hex8) || lookupTagRangeHex(hex8);\n if (!v) {\n return undefined;\n }\n const entry = { tag: prop, ...v, version: \"DICOM\" };\n cache.set(prop, entry);\n return entry;\n }\n\n // Optional: accept raw 'GGGGEEEE'\n if (prop.length === 8) {\n let v = lookupTagHex(prop);\n if (!v) v = lookupTagRangeHex(prop);\n if (!v) return undefined;\n const tag = \"(\" + prop.slice(0, 4) + \",\" + prop.slice(4, 8) + \")\";\n const entry = { tag, ...v, version: \"DICOM\" };\n cache.set(prop, entry);\n return entry;\n }\n\n // Private tags: require registerPrivatesModule() at startup\n if (isPrivateTagKey(prop)) {\n if (!privateModule) return undefined;\n const v = privateModule.lookupPrivateTag(prop);\n if (!v) return undefined;\n const entry = { tag: prop, ...v, version: \"PrivateTag\" };\n cache.set(prop, entry);\n return entry;\n }\n\n return undefined;\n },\n has(_t, prop) {\n if (typeof prop !== \"string\") return false;\n if (cache.has(prop)) return true;\n if (\n prop.length === 11 &&\n prop[0] === \"(\" &&\n prop[5] === \",\" &&\n prop[10] === \")\"\n ) {\n const hex8 = _toHex8FromParenKey(prop);\n return (\n lookupTagHex(hex8) !== undefined ||\n lookupTagRangeHex(hex8) !== undefined\n );\n }\n if (prop.length === 8)\n return (\n lookupTagHex(prop) !== undefined ||\n lookupTagRangeHex(prop) !== undefined\n );\n if (isPrivateTagKey(prop) && privateModule)\n return privateModule.lookupPrivateTag(prop) !== undefined;\n return false;\n }\n});\n","import { WriteBufferStream } from \"./BufferStream.js\";\nimport {\n EXPLICIT_LITTLE_ENDIAN,\n IMPLICIT_LITTLE_ENDIAN,\n SEQUENCE_DELIMITER_TAG,\n SEQUENCE_ITEM_TAG,\n UNDEFINED_LENGTH\n} from \"./constants/dicom\";\nimport { ValueRepresentation } from \"./ValueRepresentation.js\";\n\nfunction paddingLeft(paddingValue, string) {\n return String(paddingValue + string).slice(-paddingValue.length);\n}\n\nlet DicomMessage;\n\nclass Tag {\n constructor(value) {\n this.value = value;\n }\n\n /** Helper method to avoid circular dependencies */\n static setDicomMessageClass(dicomMessageClass) {\n DicomMessage = dicomMessageClass;\n }\n\n toString() {\n return (\n \"(\" +\n paddingLeft(\"0000\", this.group().toString(16).toUpperCase()) +\n \",\" +\n paddingLeft(\"0000\", this.element().toString(16).toUpperCase()) +\n \")\"\n );\n }\n\n toCleanString() {\n return (\n paddingLeft(\"0000\", this.group().toString(16).toUpperCase()) +\n paddingLeft(\"0000\", this.element().toString(16).toUpperCase())\n );\n }\n\n get cleanString() {\n this._cleanString ||= this.toCleanString();\n return this._cleanString;\n }\n\n is(t) {\n return this.value == t;\n }\n\n /**\n * @returns true if the tag is an Item or Delimiter instruction\n */\n isInstruction() {\n return this.group() === 0xfffe;\n }\n\n group() {\n return this.value >>> 16;\n }\n\n element() {\n return this.value & 0xffff;\n }\n\n isPixelDataTag() {\n return this.is(0x7fe00010);\n }\n\n isPrivateCreator() {\n const group = this.group();\n const element = this.element();\n return group % 2 === 1 && element < 0x100 && element > 0x00;\n }\n\n isMetaInformation() {\n return this.group() < 0x0008;\n }\n\n isPrivateValue() {\n const group = this.group();\n const element = this.element();\n return group % 2 === 1 && element > 0x100;\n }\n\n static fromString(str) {\n var group = parseInt(str.substring(0, 4), 16),\n element = parseInt(str.substring(4), 16);\n return Tag.fromNumbers(group, element);\n }\n\n static fromPString(str) {\n var group = parseInt(str.substring(1, 5), 16),\n element = parseInt(str.substring(6, 10), 16);\n return Tag.fromNumbers(group, element);\n }\n\n static fromNumbers(group, element) {\n return new Tag(((group << 16) | element) >>> 0);\n }\n\n static readTag(stream) {\n var group = stream.readUint16(),\n element = stream.readUint16();\n return Tag.fromNumbers(group, element);\n }\n\n /**\n * Reads the stream looking for the sequence item tags, returning them\n * as a buffer, and returning null on sequence delimiter tag.\n */\n static getNextSequenceItemData(stream) {\n const nextTag = this.readTag(stream);\n if (nextTag.is(SEQUENCE_ITEM_TAG)) {\n const itemLength = stream.readUint32();\n const buffer = stream.getBuffer(\n stream.offset,\n stream.offset + itemLength\n );\n stream.increment(itemLength);\n return buffer;\n } else if (nextTag.is(SEQUENCE_DELIMITER_TAG)) {\n // Read SequenceDelimiterItem value for the SequenceDelimiterTag\n if (stream.readUint32() !== 0) {\n throw Error(\"SequenceDelimiterItem tag value was not zero\");\n }\n return null;\n }\n\n throw Error(\"Invalid tag in sequence\");\n }\n\n write(stream, vrType, values, syntax, writeOptions) {\n const vr = ValueRepresentation.createByTypeString(vrType);\n const useSyntax = DicomMessage._normalizeSyntax(syntax);\n\n const implicit = useSyntax === IMPLICIT_LITTLE_ENDIAN;\n const isLittleEndian =\n useSyntax === IMPLICIT_LITTLE_ENDIAN ||\n useSyntax === EXPLICIT_LITTLE_ENDIAN;\n const isEncapsulated =\n this.isPixelDataTag() && DicomMessage.isEncapsulated(syntax);\n\n const oldEndian = stream.isLittleEndian;\n stream.setEndian(isLittleEndian);\n\n stream.writeUint16(this.group());\n stream.writeUint16(this.element());\n\n var tagStream = new WriteBufferStream(256),\n valueLength;\n tagStream.setEndian(isLittleEndian);\n\n if (vrType == \"OW\" || vrType == \"OB\" || vrType == \"UN\") {\n valueLength = vr.writeBytes(\n tagStream,\n values,\n useSyntax,\n isEncapsulated,\n writeOptions\n );\n } else if (vrType == \"SQ\") {\n valueLength = vr.writeBytes(\n tagStream,\n values,\n useSyntax,\n writeOptions\n );\n } else {\n valueLength = vr.writeBytes(tagStream, values, writeOptions);\n }\n\n if (vrType == \"SQ\") {\n valueLength = UNDEFINED_LENGTH;\n }\n var written = tagStream.size + 4;\n\n if (implicit) {\n stream.writeUint32(valueLength);\n written += 4;\n } else {\n // Big 16 length objects are encodings for values larger than\n // 16 bit lengths which would normally use a 16 bit length field.\n // This uses a VR=UN instead of the original VR, and a 32 bit length\n const isBig16Length =\n !vr.isLength32() &&\n valueLength >= 0x10000 &&\n valueLength !== UNDEFINED_LENGTH;\n if (vr.isLength32() || isBig16Length) {\n // Write as vr UN for big values\n stream.writeAsciiString(isBig16Length ? \"UN\" : vr.type);\n stream.writeUint16(0);\n stream.writeUint32(valueLength);\n written += 8;\n } else {\n stream.writeAsciiString(vr.type);\n stream.writeUint16(valueLength);\n written += 4;\n }\n }\n\n stream.concat(tagStream);\n\n stream.setEndian(oldEndian);\n\n return written;\n }\n}\n\nValueRepresentation.setTagClass(Tag);\n\nexport { Tag };\n","const handler = {\n /**\n * Get a proxied value from the array or property value\n * Note that the property value get works even if you update the underlying object.\n * Also, return true of proxy.__isProxy in order to distinguish proxies and not double proxy them.\n */\n get: (target, prop) => {\n if (prop == \"__isProxy\") return true;\n if (prop in target) return target[prop];\n return target[0][prop];\n },\n\n set: (obj, prop, value) => {\n if (typeof prop === \"number\") {\n obj[prop] = value;\n } else if (prop in obj) {\n obj[prop] = value;\n } else {\n obj[0][prop] = value;\n }\n return true;\n }\n};\n\n/**\n * Add a proxy object for sqZero or the src[0] element if sqZero is unspecified, AND\n * src is an array of length 1.\n *\n * If sqZero isn't passed in, then assume this is a create call on the destination object\n * itself, by:\n * 1. If not an object, return dest\n * 2. If an array of length != 1, return dest\n * 3. If an array, use dest[0] as sqZero\n * 4. Use dest as sqZero\n *\n * @example\n * src = [{a:5,b:'string', c:null}]\n * addAccessors(src)\n * src.c = 'outerChange'\n * src[0].b='innerChange'\n *\n * assert src.a===5\n * assert src[0].c === 'outerChange'\n * assert src.b === 'innerChange'\n */\nconst addAccessors = (dest, sqZero) => {\n if (dest.__isProxy) return dest;\n let itemZero = sqZero;\n if (itemZero === undefined) {\n if (typeof dest !== \"object\") return dest;\n if (Array.isArray(dest) && dest.length !== 1) return dest;\n itemZero = Array.isArray(dest) ? dest[0] : dest;\n }\n // dest may have some decorations so keep the object\n if (Array.isArray(dest)) {\n dest.length = 0;\n dest.push(itemZero);\n return new Proxy(dest, handler);\n } else {\n return new Proxy([itemZero], handler);\n }\n};\n\nexport default addAccessors;\n","import { dictionary } from \"./dictionary.fast.js\";\nimport { getAllStandardTagEntries } from \"./dicom.lookup.js\";\nimport log from \"./log.js\";\nimport addAccessors from \"./utilities/addAccessors\";\nimport { ValueRepresentation } from \"./ValueRepresentation\";\n\nexport class DicomMetaDictionary {\n // intakes a custom dictionary that will be used to parse/denaturalize the dataset\n constructor(customDictionary) {\n this.customDictionary = customDictionary;\n this.customNameMap =\n DicomMetaDictionary._generateCustomNameMap(customDictionary);\n }\n\n static punctuateTag(rawTag) {\n if (rawTag.indexOf(\",\") !== -1) {\n return rawTag;\n }\n if (rawTag.length === 8 && rawTag === rawTag.match(/[0-9a-fA-F]*/)[0]) {\n var tag = rawTag.toUpperCase();\n return \"(\" + tag.substring(0, 4) + \",\" + tag.substring(4, 8) + \")\";\n }\n }\n\n static unpunctuateTag(tag) {\n if (tag.indexOf(\",\") === -1) {\n return tag;\n }\n return tag.substring(1, 10).replace(\",\", \"\");\n }\n\n static parseIntFromTag(tag) {\n const integerValue = parseInt(\n \"0x\" + DicomMetaDictionary.unpunctuateTag(tag)\n );\n return integerValue;\n }\n\n static tagAsIntegerFromName(name) {\n const item = DicomMetaDictionary.nameMap[name];\n if (item != undefined) {\n return this.parseIntFromTag(item.tag);\n } else {\n return undefined;\n }\n }\n\n // fixes some common errors in VRs\n // TODO: if this gets longer it could go in ValueRepresentation.js\n // or in a dedicated class\n static cleanDataset(dataset) {\n const cleanedDataset = {};\n Object.keys(dataset).forEach(tag => {\n const data = Object.assign({}, dataset[tag]);\n if (data.vr == \"SQ\") {\n const cleanedValues = [];\n Object.keys(data.Value).forEach(index => {\n cleanedValues.push(\n DicomMetaDictionary.cleanDataset(data.Value[index])\n );\n });\n data.Value = cleanedValues;\n } else {\n // remove null characters from strings\n data.Value = Object.keys(data.Value).map(index => {\n const item = data.Value[index];\n if (item.constructor.name == \"String\") {\n return item.replace(/\\0/, \"\");\n }\n return item;\n });\n }\n cleanedDataset[tag] = data;\n });\n return cleanedDataset;\n }\n\n // unlike naturalizeDataset, this only\n // changes the names of the member variables\n // but leaves the values intact\n static namifyDataset(dataset) {\n var namedDataset = {};\n Object.keys(dataset).forEach(tag => {\n const data = Object.assign({}, dataset[tag]);\n if (data.vr == \"SQ\") {\n var namedValues = [];\n Object.keys(data.Value).forEach(index => {\n namedValues.push(\n DicomMetaDictionary.namifyDataset(data.Value[index])\n );\n });\n data.Value = namedValues;\n }\n var punctuatedTag = DicomMetaDictionary.punctuateTag(tag);\n var entry = DicomMetaDictionary.dictionary[punctuatedTag];\n var name = tag;\n if (entry) {\n name = entry.name;\n }\n namedDataset[name] = data;\n });\n return namedDataset;\n }\n\n /**\n * converts from DICOM JSON Model dataset to a natural dataset\n * - sequences become lists\n * - single element lists are replaced by their first element,\n * with single element lists remaining lists, but being a\n * proxy for the child values, see addAccessors for examples\n * - object member names are dictionary, not group/element tag\n */\n static naturalizeDataset(dataset) {\n const naturalDataset = ValueRepresentation.addTagAccessors({\n _vrMap: {}\n });\n\n Object.keys(dataset).forEach(tag => {\n const data = dataset[tag];\n const punctuatedTag = DicomMetaDictionary.punctuateTag(tag);\n const entry = DicomMetaDictionary.dictionary[punctuatedTag];\n let naturalName = tag;\n\n if (entry) {\n naturalName = entry.name;\n\n if (entry.vr == \"ox\") {\n // when the vr is data-dependent, keep track of the original type\n naturalDataset._vrMap[naturalName] = data.vr;\n }\n if (data.vr !== entry.vr) {\n // save origin vr if it different that in dictionary\n naturalDataset._vrMap[naturalName] = data.vr;\n }\n }\n\n if (data.Value === undefined) {\n // In the case of type 2, add this tag but explictly set it null to indicate its empty.\n naturalDataset[naturalName] = null;\n\n if (data.InlineBinary) {\n naturalDataset[naturalName] = {\n InlineBinary: data.InlineBinary\n };\n } else if (data.BulkDataURI) {\n naturalDataset[naturalName] = {\n BulkDataURI: data.BulkDataURI\n };\n }\n } else {\n if (data.vr === \"SQ\") {\n // convert sequence to list of values\n const naturalValues = [];\n\n Object.keys(data.Value).forEach(index => {\n naturalValues.push(\n DicomMetaDictionary.naturalizeDataset(\n data.Value[index]\n )\n );\n });\n\n naturalDataset[naturalName] = naturalValues;\n } else {\n naturalDataset[naturalName] = data.Value;\n }\n\n if (naturalDataset[naturalName].length === 1) {\n const sqZero = naturalDataset[naturalName][0];\n if (\n sqZero &&\n typeof sqZero === \"object\" &&\n !sqZero.length\n ) {\n naturalDataset[naturalName] = addAccessors(\n naturalDataset[naturalName],\n sqZero\n );\n } else {\n naturalDataset[naturalName] = sqZero;\n }\n }\n }\n });\n\n return naturalDataset;\n }\n\n static denaturalizeValue(naturalValue) {\n let value = naturalValue;\n if (!Array.isArray(value)) {\n value = [value];\n } else {\n const thereIsUndefinedValues = naturalValue.some(\n item => item === undefined\n );\n if (thereIsUndefinedValues) {\n throw new Error(\n \"There are undefined values at the array naturalValue in DicomMetaDictionary.denaturalizeValue\"\n );\n }\n }\n\n value = value.map(entry =>\n entry.constructor.name == \"Number\" ? String(entry) : entry\n );\n\n return value;\n }\n\n // keep the static function to support previous calls to the class\n static denaturalizeDataset(dataset, nameMap = DicomMetaDictionary.nameMap) {\n var unnaturalDataset = {};\n Object.keys(dataset).forEach(naturalName => {\n // check if it's a sequence\n var name = naturalName;\n var entry = nameMap[name];\n if (entry) {\n let dataValue = dataset[naturalName];\n\n if (dataValue === undefined) {\n // handle the case where it was deleted from the object but is in keys\n return;\n }\n // process this one entry\n const vr =\n dataset._vrMap && dataset._vrMap[naturalName]\n ? dataset._vrMap[naturalName]\n : entry.vr;\n\n var dataItem = ValueRepresentation.addTagAccessors({ vr });\n\n dataItem.Value = dataset[naturalName];\n\n if (dataValue !== null) {\n if (entry.vr == \"ox\") {\n if (dataset._vrMap && dataset._vrMap[naturalName]) {\n dataItem.vr = dataset._vrMap[naturalName];\n } else {\n log.error(\n \"No value representation given for\",\n naturalName\n );\n }\n }\n\n let vr = ValueRepresentation.createByTypeString(\n dataItem.vr\n );\n\n dataItem.Value = DicomMetaDictionary.denaturalizeValue(\n dataItem.Value\n );\n\n if (entry.vr == \"SQ\") {\n var unnaturalValues = [];\n for (\n let datasetIndex = 0;\n datasetIndex < dataItem.Value.length;\n datasetIndex++\n ) {\n const nestedDataset = dataItem.Value[datasetIndex];\n unnaturalValues.push(\n DicomMetaDictionary.denaturalizeDataset(\n nestedDataset,\n nameMap\n )\n );\n }\n dataItem.Value = unnaturalValues;\n }\n\n if (!vr.isBinary() && vr.maxLength) {\n dataItem.Value = dataItem.Value.map(value => {\n let maxLength = vr.maxLength;\n if (vr.rangeMatchingMaxLength) {\n maxLength = vr.rangeMatchingMaxLength;\n }\n\n if (value.length > maxLength) {\n log.warn(\n `Truncating value ${value} of ${naturalName} because it is longer than ${maxLength}`\n );\n return value.slice(0, maxLength);\n } else {\n return value;\n }\n });\n }\n }\n\n var tag = DicomMetaDictionary.unpunctuateTag(entry.tag);\n unnaturalDataset[tag] = dataItem;\n } else {\n const validMetaNames = [\"_vrMap\", \"_meta\"];\n if (validMetaNames.indexOf(name) == -1) {\n log.warn(\n \"Unknown name in dataset\",\n name,\n \":\",\n dataset[name]\n );\n }\n }\n });\n return unnaturalDataset;\n }\n\n static uid() {\n let uid = \"2.25.\" + Math.floor(1 + Math.random() * 9);\n for (let index = 0; index < 38; index++) {\n uid = uid + Math.floor(Math.random() * 10);\n }\n return uid;\n }\n\n // date and time in UTC\n static date() {\n let now = new Date();\n return now.toISOString().replace(/-/g, \"\").slice(0, 8);\n }\n\n static time() {\n let now = new Date();\n return now.toISOString().replace(/:/g, \"\").slice(11, 17);\n }\n\n static dateTime() {\n // \"2017-07-07T16:09:18.079Z\" -> \"20170707160918.079\"\n let now = new Date();\n return now.toISOString().replace(/[:\\-TZ]/g, \"\");\n }\n\n static _generateNameMap() {\n DicomMetaDictionary.nameMap = {};\n const entries = getAllStandardTagEntries();\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i];\n const dict = {\n tag: e.tag,\n vr: e.vr,\n vm: e.vm,\n name: e.name,\n version: \"DICOM\"\n };\n DicomMetaDictionary.nameMap[e.name] = dict;\n }\n Object.keys(DicomMetaDictionary.dictionary).forEach(tag => {\n const dict = DicomMetaDictionary.dictionary[tag];\n if (dict && dict.version !== \"PrivateTag\") {\n DicomMetaDictionary.nameMap[dict.name] = dict;\n }\n });\n }\n\n static _generateCustomNameMap(dictionary) {\n const nameMap = {};\n if (dictionary === DicomMetaDictionary.dictionary) {\n const entries = getAllStandardTagEntries();\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i];\n nameMap[e.name] = {\n tag: e.tag,\n vr: e.vr,\n vm: e.vm,\n name: e.name,\n version: \"DICOM\"\n };\n }\n Object.keys(dictionary).forEach(tag => {\n const dict = dictionary[tag];\n if (dict && dict.version !== \"PrivateTag\") {\n nameMap[dict.name] = dict;\n }\n });\n return nameMap;\n }\n Object.keys(dictionary).forEach(tag => {\n var dict = dictionary[tag];\n if (dict && dict.version != \"PrivateTag\") {\n nameMap[dict.name] = dict;\n }\n });\n return nameMap;\n }\n\n static _generateUIDMap() {\n DicomMetaDictionary.sopClassUIDsByName = {};\n Object.keys(DicomMetaDictionary.sopClassNamesByUID).forEach(uid => {\n var name = DicomMetaDictionary.sopClassNamesByUID[uid];\n DicomMetaDictionary.sopClassUIDsByName[name] = uid;\n });\n }\n\n // denaturalizes dataset using custom dictionary and nameMap\n denaturalizeDataset(dataset) {\n return DicomMetaDictionary.denaturalizeDataset(\n dataset,\n this.customNameMap\n );\n }\n}\n\n// Subset of those listed at:\n// http://dicom.nema.org/medical/dicom/current/output/html/part04.html#sect_B.5\nDicomMetaDictionary.sopClassNamesByUID = {\n \"1.2.840.10008.5.1.4.1.1.20\": \"NMImage\",\n \"1.2.840.10008.5.1.4.1.1.2\": \"CTImage\",\n \"1.2.840.10008.5.1.4.1.1.2.1\": \"EnhancedCTImage\",\n \"1.2.840.10008.5.1.4.1.1.2.2\": \"LegacyConvertedEnhancedCTImage\",\n \"1.2.840.10008.5.1.4.1.1.3.1\": \"USMultiframeImage\",\n \"1.2.840.10008.5.1.4.1.1.4\": \"MRImage\",\n \"1.2.840.10008.5.1.4.1.1.4.1\": \"EnhancedMRImage\",\n \"1.2.840.10008.5.1.4.1.1.4.2\": \"MRSpectroscopy\",\n \"1.2.840.10008.5.1.4.1.1.4.3\": \"EnhancedMRColorImage\",\n \"1.2.840.10008.5.1.4.1.1.4.4\": \"LegacyConvertedEnhancedMRImage\",\n \"1.2.840.10008.5.1.4.1.1.6.1\": \"USImage\",\n \"1.2.840.10008.5.1.4.1.1.6.2\": \"EnhancedUSVolume\",\n \"1.2.840.10008.5.1.4.1.1.7\": \"SecondaryCaptureImage\",\n \"1.2.840.10008.5.1.4.1.1.30\": \"ParametricMapStorage\",\n \"1.2.840.10008.5.1.4.1.1.66\": \"RawData\",\n \"1.2.840.10008.5.1.4.1.1.66.1\": \"SpatialRegistration\",\n \"1.2.840.10008.5.1.4.1.1.66.2\": \"SpatialFiducials\",\n \"1.2.840.10008.5.1.4.1.1.66.3\": \"DeformableSpatialRegistration\",\n \"1.2.840.10008.5.1.4.1.1.66.4\": \"Segmentation\",\n \"1.2.840.10008.5.1.4.1.1.66.7\": \"LabelmapSegmentation\", // Labelmap Segmentation SOP Class UID\n \"1.2.840.10008.5.1.4.1.1.67\": \"RealWorldValueMapping\",\n \"1.2.840.10008.5.1.4.1.1.88.11\": \"BasicTextSR\",\n \"1.2.840.10008.5.1.4.1.1.88.22\": \"EnhancedSR\",\n \"1.2.840.10008.5.1.4.1.1.88.33\": \"ComprehensiveSR\",\n \"1.2.840.10008.5.1.4.1.1.88.34\": \"Comprehensive3DSR\",\n \"1.2.840.10008.5.1.4.1.1.128\": \"PETImage\",\n \"1.2.840.10008.5.1.4.1.1.130\": \"EnhancedPETImage\",\n \"1.2.840.10008.5.1.4.1.1.128.1\": \"LegacyConvertedEnhancedPETImage\",\n \"1.2.840.10008.5.1.4.1.1.77.1.5.1\": \"OphthalmicPhotography8BitImage\",\n \"1.2.840.10008.5.1.4.1.1.77.1.5.4\": \"OphthalmicTomographyImage\"\n};\n\n// Avoid loops in imports\nValueRepresentation.setDicomMetaDictionary(DicomMetaDictionary);\n\nDicomMetaDictionary.dictionary = dictionary;\n\nDicomMetaDictionary._generateNameMap();\nDicomMetaDictionary._generateUIDMap();\n","/**\n * Performs a deep equality check between two objects. Used primarily during DICOM write operations\n * to determine whether a data element underlying value has changed since it was initially read.\n *\n * @param {Object} obj1 - The first object to compare.\n * @param {Object} obj2 - The second object to compare.\n * @returns {boolean} - Returns `true` if the structures and values of the objects are deeply equal, `false` otherwise.\n */\nexport function deepEqual(obj1, obj2) {\n // Use Object.is to consider for treatment of `NaN` and signed 0's i.e. `+0` or `-0` in IS/DS\n if (Object.is(obj1, obj2)) {\n return true;\n }\n\n // expect objects or a null instance if initial check failed\n if (\n typeof obj1 !== \"object\" ||\n typeof obj2 !== \"object\" ||\n obj1 === null ||\n obj2 === null\n ) {\n return false;\n }\n\n // all keys should match a deep equality check\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import { DeflatedReadBufferStream, ReadBufferStream } from \"./BufferStream.js\";\nimport {\n DEFLATED_EXPLICIT_LITTLE_ENDIAN,\n EXPLICIT_BIG_ENDIAN,\n EXPLICIT_LITTLE_ENDIAN,\n IMPLICIT_LITTLE_ENDIAN,\n VM_DELIMITER,\n TagHex,\n encodingMapping,\n unencapsulatedTransferSyntaxes,\n UNDEFINED_LENGTH\n} from \"./constants/dicom.js\";\nimport { DicomDict } from \"./DicomDict.js\";\nimport { DicomMetaDictionary } from \"./DicomMetaDictionary.js\";\nimport { Tag } from \"./Tag.js\";\nimport { log } from \"./log.js\";\nimport { deepEqual } from \"./utilities/deepEqual\";\nimport { ValueRepresentation } from \"./ValueRepresentation.js\";\n\nexport const singleVRs = [\"SQ\", \"OF\", \"OW\", \"OB\", \"UN\", \"LT\"];\n\nexport class DicomMessage {\n static read(\n bufferStream,\n syntax,\n ignoreErrors,\n untilTag = null,\n includeUntilTagValue = false\n ) {\n log.warn(\"DicomMessage.read to be deprecated after dcmjs 0.24.x\");\n return this._read(bufferStream, syntax, {\n ignoreErrors: ignoreErrors,\n untilTag: untilTag,\n includeUntilTagValue: includeUntilTagValue\n });\n }\n\n static readTag(\n bufferStream,\n syntax,\n untilTag = null,\n includeUntilTagValue = false\n ) {\n log.warn(\"DicomMessage.readTag to be deprecated after dcmjs 0.24.x\");\n return this._readTag(bufferStream, syntax, {\n untilTag: untilTag,\n includeUntilTagValue: includeUntilTagValue\n });\n }\n\n static _read(\n bufferStream,\n syntax,\n options = {\n ignoreErrors: false,\n untilTag: null,\n includeUntilTagValue: false,\n stopOnGreaterTag: false\n }\n ) {\n const { ignoreErrors, untilTag, stopOnGreaterTag } = options;\n var dict = {};\n try {\n let previousTagOffset;\n while (!bufferStream.end()) {\n previousTagOffset = bufferStream.offset;\n const readInfo = DicomMessage._readTag(\n bufferStream,\n syntax,\n options\n );\n const cleanTagString = readInfo.tag.toCleanString();\n if (untilTag && stopOnGreaterTag && cleanTagString > untilTag) {\n bufferStream.offset = previousTagOffset;\n break;\n }\n if (cleanTagString === TagHex.SpecificCharacterSet) {\n if (readInfo.values.length > 0) {\n let coding = readInfo.values[0];\n coding = coding.replace(/[_ ]/g, \"-\").toLowerCase();\n if (coding in encodingMapping) {\n coding = encodingMapping[coding];\n bufferStream.setDecoder(new TextDecoder(coding));\n } else if (ignoreErrors) {\n log.warn(\n `Unsupported character set: ${coding}, using default character set`\n );\n } else {\n throw Error(`Unsupported character set: ${coding}`);\n }\n }\n if (readInfo.values.length > 1) {\n if (ignoreErrors) {\n log.warn(\n \"Using multiple character sets is not supported, proceeding with just the first character set\",\n readInfo.values\n );\n } else {\n throw Error(\n `Using multiple character sets is not supported: ${readInfo.values}`\n );\n }\n }\n readInfo.values = [\"ISO_IR 192\"]; // change SpecificCharacterSet to UTF-8\n }\n\n dict[cleanTagString] = ValueRepresentation.addTagAccessors({\n vr: readInfo.vr.type\n });\n dict[cleanTagString].Value = readInfo.values;\n dict[cleanTagString]._rawValue = readInfo.rawValues;\n\n if (untilTag && untilTag === cleanTagString) {\n break;\n }\n }\n return dict;\n } catch (err) {\n if (ignoreErrors) {\n log.warn(\"WARN:\", err);\n return dict;\n }\n throw err;\n }\n }\n\n static _normalizeSyntax(syntax) {\n if (\n syntax == IMPLICIT_LITTLE_ENDIAN ||\n syntax == EXPLICIT_LITTLE_ENDIAN ||\n syntax == EXPLICIT_BIG_ENDIAN\n ) {\n return syntax;\n } else {\n return EXPLICIT_LITTLE_ENDIAN;\n }\n }\n\n static isEncapsulated(syntax) {\n return !unencapsulatedTransferSyntaxes[syntax];\n }\n\n static readFile(\n buffer,\n options = {\n ignoreErrors: false,\n untilTag: null,\n includeUntilTagValue: false,\n noCopy: false,\n forceStoreRaw: false\n }\n ) {\n var stream = new ReadBufferStream(buffer, null, {\n noCopy: options.noCopy\n }),\n useSyntax = EXPLICIT_LITTLE_ENDIAN;\n stream.reset();\n stream.increment(128);\n if (stream.readAsciiString(4) !== \"DICM\") {\n throw new Error(\"Invalid DICOM file, expected header is missing\");\n }\n\n // save position before reading first tag\n var metaStartPos = stream.offset;\n\n // read the first tag to check if it's the meta length tag\n var el = DicomMessage._readTag(stream, useSyntax);\n\n var metaHeader = {};\n if (el.tag.cleanString !== TagHex.FileMetaInformationGroupLength) {\n // meta length tag is missing\n if (!options.ignoreErrors) {\n throw new Error(\n \"Invalid DICOM file, meta length tag is malformed or not present.\"\n );\n }\n\n // reset stream to the position where we started reading tags\n stream.offset = metaStartPos;\n\n // read meta header elements sequentially\n metaHeader = DicomMessage._read(stream, useSyntax, {\n untilTag: \"00030000\",\n stopOnGreaterTag: true,\n ignoreErrors: true\n });\n } else {\n // meta length tag is present\n var metaLength = el.values[0];\n\n // read header buffer using the specified meta length\n var metaStream = stream.more(metaLength);\n metaHeader = DicomMessage._read(metaStream, useSyntax, options);\n }\n\n //get the syntax\n var mainSyntax = metaHeader[TagHex.TransferSyntaxUID].Value[0];\n\n //in case of deflated dataset, decompress and continue\n if (mainSyntax === DEFLATED_EXPLICIT_LITTLE_ENDIAN) {\n stream = new DeflatedReadBufferStream(stream, {\n noCopy: options.noCopy\n });\n }\n\n mainSyntax = DicomMessage._normalizeSyntax(mainSyntax);\n var objects = DicomMessage._read(stream, mainSyntax, options);\n\n var dicomDict = new DicomDict(metaHeader);\n dicomDict.dict = objects;\n\n return dicomDict;\n }\n\n static writeTagObject(stream, tagString, vr, values, syntax, writeOptions) {\n var tag = Tag.fromString(tagString);\n\n tag.write(stream, vr, values, syntax, writeOptions);\n }\n\n static write(jsonObjects, useStream, syntax, writeOptions) {\n var written = 0;\n\n var sortedTags = Object.keys(jsonObjects).sort();\n sortedTags.forEach(function (tagString) {\n var tag = Tag.fromString(tagString),\n tagObject = jsonObjects[tagString],\n vrType = tagObject.vr;\n\n var values = DicomMessage._getTagWriteValues(vrType, tagObject);\n\n written += tag.write(\n useStream,\n vrType,\n values,\n syntax,\n writeOptions\n );\n });\n\n return written;\n }\n\n static _getTagWriteValues(vrType, tagObject) {\n if (!tagObject._rawValue) {\n return tagObject.Value;\n }\n\n // apply VR specific formatting to the original _rawValue and compare to the Value\n const vr = ValueRepresentation.createByTypeString(vrType);\n\n let originalValue;\n if (Array.isArray(tagObject._rawValue)) {\n originalValue = tagObject._rawValue.map(val =>\n vr.applyFormatting(val)\n );\n } else {\n originalValue = vr.applyFormatting(tagObject._rawValue);\n }\n\n // if Value has not changed, write _rawValue unformatted back into the file\n if (deepEqual(tagObject.Value, originalValue)) {\n return tagObject._rawValue;\n } else {\n return tagObject.Value;\n }\n }\n\n static _readTag(\n stream,\n syntax,\n options = {\n untilTag: null,\n includeUntilTagValue: false\n }\n ) {\n const { untilTag, includeUntilTagValue } = options;\n var implicit = syntax == IMPLICIT_LITTLE_ENDIAN ? true : false,\n isLittleEndian =\n syntax == IMPLICIT_LITTLE_ENDIAN ||\n syntax == EXPLICIT_LITTLE_ENDIAN\n ? true\n : false;\n\n var oldEndian = stream.isLittleEndian;\n stream.setEndian(isLittleEndian);\n var tag = Tag.readTag(stream);\n\n if (untilTag === tag.toCleanString() && untilTag !== null) {\n if (!includeUntilTagValue) {\n return { tag: tag, vr: 0, values: 0 };\n }\n }\n\n var length = null,\n vr = null,\n vrType;\n\n if (implicit) {\n length = stream.readUint32();\n var elementData = DicomMessage.lookupTag(tag);\n if (elementData) {\n vrType = elementData.vr;\n } else {\n //unknown tag\n if (length == UNDEFINED_LENGTH) {\n vrType = \"SQ\";\n } else if (tag.isPixelDataTag()) {\n vrType = \"OW\";\n } else if (vrType == \"xs\") {\n vrType = \"US\";\n } else if (tag.isPrivateCreator()) {\n vrType = \"LO\";\n } else {\n vrType = \"UN\";\n }\n }\n vr = ValueRepresentation.createByTypeString(vrType);\n } else {\n vrType = stream.readVR();\n\n if (\n vrType === \"UN\" &&\n DicomMessage.lookupTag(tag) &&\n DicomMessage.lookupTag(tag).vr\n ) {\n vrType = DicomMessage.lookupTag(tag).vr;\n\n vr = ValueRepresentation.parseUnknownVr(vrType);\n } else {\n vr = ValueRepresentation.createByTypeString(vrType);\n }\n\n if (vr.isLength32()) {\n stream.increment(2);\n length = stream.readUint32();\n } else {\n length = stream.readUint16();\n }\n }\n\n var values = [];\n var rawValues = [];\n if (vr.isBinary() && length > vr.maxLength && !vr.noMultiple) {\n var times = length / vr.maxLength,\n i = 0;\n while (i++ < times) {\n const { rawValue, value } = vr.read(\n stream,\n vr.maxLength,\n syntax,\n options\n );\n rawValues.push(rawValue);\n values.push(value);\n }\n } else {\n const { rawValue, value } =\n vr.read(stream, length, syntax, options) || {};\n if (!vr.isBinary() && singleVRs.indexOf(vr.type) == -1) {\n rawValues = rawValue;\n values = value;\n if (typeof value === \"string\") {\n const delimiterChar = String.fromCharCode(VM_DELIMITER);\n rawValues = vr.dropPadByte(rawValue.split(delimiterChar));\n values = vr.dropPadByte(value.split(delimiterChar));\n }\n } else if (vr.type == \"SQ\") {\n rawValues = rawValue;\n values = value;\n } else if (vr.type == \"OW\" || vr.type == \"OB\") {\n rawValues = rawValue;\n values = value;\n } else {\n Array.isArray(value) ? (values = value) : values.push(value);\n Array.isArray(rawValue)\n ? (rawValues = rawValue)\n : rawValues.push(rawValue);\n }\n }\n stream.setEndian(oldEndian);\n\n const retObj = ValueRepresentation.addTagAccessors({\n tag: tag,\n vr: vr\n });\n retObj.values = values;\n retObj.rawValues = rawValues;\n return retObj;\n }\n\n static lookupTag(tag) {\n return DicomMetaDictionary.dictionary[tag.toString()];\n }\n}\n","// AUTO-GENERATED from dictionary.mjs by generate/pack_private.mjs\n// Private tags only (creator strings). Decoded on first use; use ensurePrivateLoaded() if needed.\n\nexport const vrTable = [\n \"\",\n \"UL\",\n \"LO\",\n \"US\",\n \"DA\",\n \"TM\",\n \"IS\",\n \"UN\",\n \"LT\",\n \"SQ\",\n \"UI\",\n \"SH\",\n \"OW\",\n \"CS\",\n \"ST\",\n \"DS\",\n \"SL\",\n \"FD\",\n \"OB\",\n \"SS\",\n \"FL\",\n \"DT\",\n \"AT\",\n \"UT\",\n \"ox\"\n];\nexport const vmTable = [\n \"\",\n \"1\",\n \"1-n\",\n \"4\",\n \"2\",\n \"5\",\n \"3\",\n \"6\",\n \"4-4n\",\n \"7\",\n \"16\",\n \"2-2n\",\n \"3-3n\",\n \"8\",\n \"24\",\n \"1-2\",\n \"5-n\",\n \"7-7n\",\n \"9\",\n \"256\"\n];\nexport const keyBlob =\n '(0000-u-FFFF,0000)(0001-o-0007,0000)(0001-o-0007,0010-u-00FF)(0003,\"AEGIS_DICOM_2.00\",00)(0003,\"SIEMENS ISI\",08)(0003,\"SIEMENS ISI\",11)(0003,\"SIEMENS ISI\",12)(0003,\"SIEMENS ISI\",13)(0003,\"SIEMENS ISI\",14)(0003,\"SIEMENS ISI\",20)(0003,\"SIEMENS ISI\",30)(0003,\"SIEMENS ISI\",31)(0005,\"AEGIS_DICOM_2.00\",00)(0009,\"ACUSON\",00)(0009,\"ACUSON\",01)(0009,\"ACUSON\",02)(0009,\"ACUSON\",03)(0009,\"ACUSON\",04)(0009,\"ACUSON\",05)(0009,\"ACUSON\",06)(0009,\"ACUSON\",07)(0009,\"ACUSON\",08)(0009,\"ACUSON\",09)(0009,\"ACUSON\",0a)(0009,\"ACUSON\",0b)(0009,\"ACUSON\",0c)(0009,\"ACUSON\",0d)(0009,\"ACUSON\",0e)(0009,\"ACUSON\",0f)(0009,\"ACUSON\",10)(0009,\"ACUSON\",11)(0009,\"ACUSON\",12)(0009,\"ACUSON\",13)(0009,\"ACUSON\",14)(0009,\"ACUSON\",15)(0009,\"AEGIS_DICOM_2.00\",00)(0009,\"AGFA\",10)(0009,\"AGFA\",11)(0009,\"AGFA\",13)(0009,\"AGFA\",14)(0009,\"AGFA\",15)(0009,\"CARDIO-D.R. 1.0\",00)(0009,\"CARDIO-D.R. 1.0\",01)(0009,\"CARDIO-D.R. 1.0\",40)(0009,\"DCMTK_ANONYMIZER\",00)(0009,\"DCMTK_ANONYMIZER\",10)(0009,\"DCMTK_ANONYMIZER\",20)(0009,\"DCMTK_ANONYMIZER\",30)(0009,\"DCMTK_ANONYMIZER\",40)(0009,\"DCMTK_ANONYMIZER\",50)(0009,\"FDMS 1.0\",04)(0009,\"FDMS 1.0\",05)(0009,\"FDMS 1.0\",06)(0009,\"FDMS 1.0\",08)(0009,\"FDMS 1.0\",09)(0009,\"FDMS 1.0\",0C)(0009,\"FDMS 1.0\",10)(0009,\"FDMS 1.0\",80)(0009,\"FDMS 1.0\",90)(0009,\"FDMS 1.0\",92)(0009,\"FDMS 1.0\",F0)(0009,\"FFP DATA\",01)(0009,\"GEMS_ACQU_01\",24)(0009,\"GEMS_ACQU_01\",25)(0009,\"GEMS_ACQU_01\",3e)(0009,\"GEMS_ACQU_01\",3f)(0009,\"GEMS_ACQU_01\",42)(0009,\"GEMS_ACQU_01\",43)(0009,\"GEMS_ACQU_01\",f8)(0009,\"GEMS_ACQU_01\",fb)(0009,\"GEMS_GENIE_1\",10)(0009,\"GEMS_GENIE_1\",11)(0009,\"GEMS_GENIE_1\",12)(0009,\"GEMS_GENIE_1\",1e)(0009,\"GEMS_GENIE_1\",20)(0009,\"GEMS_GENIE_1\",21)(0009,\"GEMS_GENIE_1\",22)(0009,\"GEMS_GENIE_1\",23)(0009,\"GEMS_GENIE_1\",24)(0009,\"GEMS_GENIE_1\",25)(0009,\"GEMS_GENIE_1\",26)(0009,\"GEMS_GENIE_1\",27)(0009,\"GEMS_GENIE_1\",29)(0009,\"GEMS_GENIE_1\",2a)(0009,\"GEMS_GENIE_1\",2c)(0009,\"GEMS_GENIE_1\",2d)(0009,\"GEMS_GENIE_1\",2e)(0009,\"GEMS_GENIE_1\",30)(0009,\"GEMS_GENIE_1\",35)(0009,\"GEMS_GENIE_1\",37)(0009,\"GEMS_GENIE_1\",38)(0009,\"GEMS_GENIE_1\",39)(0009,\"GEMS_GENIE_1\",3a)(0009,\"GEMS_GENIE_1\",40)(0009,\"GEMS_GENIE_1\",41)(0009,\"GEMS_GENIE_1\",42)(0009,\"GEMS_GENIE_1\",43)(0009,\"GEMS_IDEN_01\",01)(0009,\"GEMS_IDEN_01\",02)(0009,\"GEMS_IDEN_01\",04)(0009,\"GEMS_IDEN_01\",17)(0009,\"GEMS_IDEN_01\",1a)(0009,\"GEMS_IDEN_01\",20)(0009,\"GEMS_IDEN_01\",27)(0009,\"GEMS_IDEN_01\",2f)(0009,\"GEMS_IDEN_01\",30)(0009,\"GEMS_IDEN_01\",31)(0009,\"GEMS_IDEN_01\",e2)(0009,\"GEMS_IDEN_01\",e3)(0009,\"GEMS_IDEN_01\",e6)(0009,\"GEMS_IDEN_01\",e7)(0009,\"GEMS_IDEN_01\",e8)(0009,\"GEMS_IDEN_01\",e9)(0009,\"INTEGRIS 1.0\",08)(0009,\"INTEGRIS 1.0\",32)(0009,\"ISI\",01)(0009,\"MERGE TECHNOLOGIES, INC.\",00)(0009,\"PAPYRUS\",00)(0009,\"PAPYRUS\",10)(0009,\"PAPYRUS\",18)(0009,\"PHILIPS MR\",10)(0009,\"PHILIPS MR\",12)(0009,\"SIEMENS CM VA0 CMS\",00)(0009,\"SIEMENS CM VA0 CMS\",10)(0009,\"SIEMENS CM VA0 CMS\",12)(0009,\"SIEMENS CM VA0 CMS\",26)(0009,\"SIEMENS CM VA0 CMS\",27)(0009,\"SIEMENS CM VA0 LAB\",10)(0009,\"SIEMENS CM VA0 LAB\",11)(0009,\"SIEMENS CM VA0 LAB\",12)(0009,\"SIEMENS CM VA0 LAB\",13)(0009,\"SIEMENS CM VA0 LAB\",14)(0009,\"SIEMENS CM VA0 LAB\",15)(0009,\"SIEMENS CM VA0 LAB\",16)(0009,\"SIEMENS CM VA0 LAB\",20)(0009,\"SIEMENS CT VA0 IDE\",10)(0009,\"SIEMENS CT VA0 IDE\",30)(0009,\"SIEMENS CT VA0 IDE\",31)(0009,\"SIEMENS CT VA0 IDE\",32)(0009,\"SIEMENS CT VA0 IDE\",34)(0009,\"SIEMENS CT VA0 IDE\",40)(0009,\"SIEMENS CT VA0 IDE\",42)(0009,\"SIEMENS CT VA0 IDE\",50)(0009,\"SIEMENS CT VA0 IDE\",51)(0009,\"SIEMENS CT VA0 ORI\",20)(0009,\"SIEMENS CT VA0 ORI\",30)(0009,\"SIEMENS DICOM\",10)(0009,\"SIEMENS DICOM\",12)(0009,\"SIEMENS ISI\",01)(0009,\"SIEMENS MED\",10)(0009,\"SIEMENS MED\",30)(0009,\"SIEMENS MED\",31)(0009,\"SIEMENS MED\",40)(0009,\"SIEMENS MED\",41)(0009,\"SIEMENS MED\",50)(0009,\"SIEMENS MED\",51)(0009,\"SIEMENS MED\",f5)(0009,\"SIEMENS MED\",f6)(0009,\"SIENET\",01)(0009,\"SIENET\",14)(0009,\"SIENET\",16)(0009,\"SIENET\",29)(0009,\"SPI RELEASE 1\",10)(0009,\"SPI RELEASE 1\",15)(0009,\"SPI RELEASE 1\",40)(0009,\"SPI RELEASE 1\",41)(0009,\"SPI Release 1\",10)(0009,\"SPI Release 1\",15)(0009,\"SPI Release 1\",40)(0009,\"SPI Release 1\",41)(0009,\"SPI\",10)(0009,\"SPI\",15)(0009,\"SPI\",40)(0009,\"SPI\",41)(0009,\"SPI-P Release 1\",00)(0009,\"SPI-P Release 1\",04)(0009,\"SPI-P Release 1\",08)(0009,\"SPI-P Release 1\",12)(0009,\"SPI-P Release 1\",15)(0009,\"SPI-P Release 1\",16)(0009,\"SPI-P Release 1\",18)(0009,\"SPI-P Release 1\",21)(0009,\"SPI-P Release 1\",31)(0009,\"SPI-P Release 1\",34)(0009,\"SPI-P Release 1\",38)(0009,\"SPI-P Release 1\",39)(0009,\"SPI-P Release 1\",51)(0009,\"SPI-P Release 1\",61)(0009,\"SPI-P Release 1\",91)(0009,\"SPI-P Release 1\",f2)(0009,\"SPI-P Release 1\",f3)(0009,\"SPI-P Release 1\",f4)(0009,\"SPI-P Release 1\",f5)(0009,\"SPI-P Release 1\",f7)(0009,\"SPI-P Release 1;1\",c0)(0009,\"SPI-P Release 1;1\",c1)(0009,\"SPI-P-GV-CT Release 1\",00)(0009,\"SPI-P-GV-CT Release 1\",10)(0009,\"SPI-P-GV-CT Release 1\",20)(0009,\"SPI-P-GV-CT Release 1\",30)(0009,\"SPI-P-GV-CT Release 1\",40)(0009,\"SPI-P-GV-CT Release 1\",50)(0009,\"SPI-P-GV-CT Release 1\",60)(0009,\"SPI-P-GV-CT Release 1\",70)(0009,\"SPI-P-GV-CT Release 1\",75)(0009,\"SPI-P-GV-CT Release 1\",80)(0009,\"SPI-P-GV-CT Release 1\",90)(0009,\"TOSHIBA_MEC_1.0\",01)(0009,\"TOSHIBA_MEC_1.0\",02)(0009,\"TOSHIBA_MEC_1.0\",03)(0009,\"TOSHIBA_MEC_1.0\",04)(0009-o-FFFF,0000)(0009-o-FFFF,0010-u-00FF)(0011,\"DLX_PATNT_01\",01)(0011,\"GEMS_GENIE_1\",0a)(0011,\"GEMS_GENIE_1\",0b)(0011,\"GEMS_GENIE_1\",0c)(0011,\"GEMS_GENIE_1\",0d)(0011,\"GEMS_GENIE_1\",10)(0011,\"GEMS_GENIE_1\",12)(0011,\"GEMS_GENIE_1\",13)(0011,\"GEMS_GENIE_1\",15)(0011,\"GEMS_GENIE_1\",16)(0011,\"GEMS_GENIE_1\",17)(0011,\"GEMS_GENIE_1\",18)(0011,\"GEMS_GENIE_1\",19)(0011,\"GEMS_GENIE_1\",1a)(0011,\"GEMS_GENIE_1\",1b)(0011,\"GEMS_GENIE_1\",1c)(0011,\"GEMS_GENIE_1\",1d)(0011,\"GEMS_GENIE_1\",1f)(0011,\"GEMS_GENIE_1\",23)(0011,\"GEMS_GENIE_1\",24)(0011,\"GEMS_GENIE_1\",25)(0011,\"GEMS_GENIE_1\",26)(0011,\"GEMS_GENIE_1\",27)(0011,\"GEMS_GENIE_1\",28)(0011,\"GEMS_GENIE_1\",30)(0011,\"GEMS_GENIE_1\",33)(0011,\"GEMS_GENIE_1\",34)(0011,\"GEMS_GENIE_1\",35)(0011,\"GEMS_GENIE_1\",36)(0011,\"GEMS_GENIE_1\",37)(0011,\"GEMS_GENIE_1\",38)(0011,\"GEMS_GENIE_1\",3a)(0011,\"GEMS_GENIE_1\",3b)(0011,\"GEMS_GENIE_1\",3c)(0011,\"GEMS_GENIE_1\",3e)(0011,\"GEMS_GENIE_1\",3f)(0011,\"GEMS_GENIE_1\",44)(0011,\"GEMS_GENIE_1\",45)(0011,\"GEMS_GENIE_1\",46)(0011,\"GEMS_GENIE_1\",55)(0011,\"GEMS_GENIE_1\",56)(0011,\"GEMS_PATI_01\",10)(0011,\"SIEMENS CM VA0 CMS\",0a)(0011,\"SIEMENS CM VA0 CMS\",10)(0011,\"SIEMENS CM VA0 CMS\",11)(0011,\"SIEMENS CM VA0 CMS\",22)(0011,\"SIEMENS CM VA0 CMS\",23)(0011,\"SIEMENS CM VA0 CMS\",40)(0011,\"SIEMENS ISI\",03)(0011,\"SIEMENS ISI\",04)(0011,\"SIEMENS ISI\",0a)(0011,\"SIEMENS ISI\",22)(0011,\"SIEMENS ISI\",23)(0011,\"SIEMENS ISI\",a1)(0011,\"SIEMENS ISI\",a2)(0011,\"SIEMENS ISI\",b0)(0011,\"SIEMENS ISI\",b2)(0011,\"SIEMENS ISI\",b4)(0011,\"SIEMENS ISI\",bc)(0011,\"SIEMENS ISI\",c0)(0011,\"SIEMENS ISI\",d0)(0011,\"SIEMENS ISI\",d2)(0011,\"SIEMENS RA GEN\",20)(0011,\"SIEMENS RA GEN\",25)(0011,\"SIEMENS RA GEN\",26)(0011,\"SIEMENS RA GEN\",30)(0011,\"SIEMENS RA GEN\",35)(0011,\"SIEMENS RA GEN\",40)(0011,\"SIEMENS RA PLANE A\",28)(0011,\"SIEMENS RA PLANE A\",29)(0011,\"SIEMENS RA PLANE A\",2a)(0011,\"SIEMENS RA PLANE A\",2b)(0011,\"SIEMENS RA PLANE A\",2c)(0011,\"SIEMENS RA PLANE B\",28)(0011,\"SIEMENS RA PLANE B\",29)(0011,\"SIEMENS RA PLANE B\",2a)(0011,\"SIEMENS RA PLANE B\",2b)(0011,\"SIEMENS RA PLANE B\",2c)(0011,\"SIEMENS RIS\",10)(0011,\"SIEMENS RIS\",11)(0011,\"SIEMENS RIS\",20)(0011,\"SIEMENS RIS\",21)(0011,\"SIEMENS RIS\",30)(0011,\"SIEMENS RIS\",31)(0011,\"SIEMENS RIS\",40)(0011,\"SIEMENS RIS\",41)(0011,\"SIEMENS RIS\",42)(0011,\"SPI RELEASE 1\",10)(0011,\"SPI RELEASE 1\",15)(0011,\"SPI RELEASE 1\",20)(0011,\"SPI Release 1\",10)(0011,\"SPI Release 1\",15)(0011,\"SPI Release 1\",20)(0011,\"SPI\",10)(0011,\"SPI\",15)(0011,\"SPI\",20)(0011,\"SPI-P Release 1\",10)(0011,\"SPI-P Release 1\",21)(0011,\"SPI-P Release 1\",22)(0011,\"SPI-P Release 1\",31)(0011,\"SPI-P Release 1\",32)(0011,\"SPI-P Release 2;1\",18)(0011,\"TOSHIBA_MEC_1.0\",01)(0011,\"TOSHIBA_MEC_1.0\",02)(0013,\"GEMS_GENIE_1\",10)(0013,\"GEMS_GENIE_1\",11)(0013,\"GEMS_GENIE_1\",12)(0013,\"GEMS_GENIE_1\",16)(0013,\"GEMS_GENIE_1\",17)(0013,\"GEMS_GENIE_1\",18)(0013,\"GEMS_GENIE_1\",19)(0013,\"GEMS_GENIE_1\",1a)(0013,\"GEMS_GENIE_1\",1c)(0013,\"GEMS_GENIE_1\",1d)(0013,\"GEMS_GENIE_1\",1e)(0013,\"GEMS_GENIE_1\",26)(0013,\"SIEMENS CM VA0 CMS\",00)(0013,\"SIEMENS CM VA0 CMS\",10)(0013,\"SIEMENS CM VA0 CMS\",12)(0013,\"SIEMENS CM VA0 CMS\",20)(0013,\"SIEMENS CM VA0 CMS\",22)(0013,\"SIEMENS CM VA0 CMS\",30)(0013,\"SIEMENS CM VA0 CMS\",31)(0013,\"SIEMENS CM VA0 CMS\",32)(0013,\"SIEMENS CM VA0 CMS\",33)(0013,\"SIEMENS CM VA0 CMS\",34)(0013,\"SIEMENS CM VA0 CMS\",35)(0013,\"SIEMENS CM VA0 CMS\",40)(0013,\"SIEMENS CM VA0 CMS\",42)(0013,\"SIEMENS CM VA0 CMS\",44)(0013,\"SIEMENS CM VA0 CMS\",46)(0013,\"SIEMENS CM VA0 CMS\",50)(0013,\"SIEMENS CM VA0 CMS\",51)(0013,\"SIEMENS CM VA0 CMS\",52)(0013,\"SIEMENS CM VA0 CMS\",53)(0013,\"SIEMENS CM VA0 CMS\",54)(0013,\"SIEMENS CM VA0 CMS\",55)(0013,\"SIEMENS CM VA0 CMS\",56)(0015,\"DLX_EXAMS_01\",01)(0015,\"DLX_EXAMS_01\",02)(0015,\"DLX_EXAMS_01\",03)(0017,\"SVISION\",00)(0017,\"SVISION\",10)(0017,\"SVISION\",F0)(0019,\"1.2.840.113681\",10)(0019,\"1.2.840.113681\",11)(0019,\"1.2.840.113681\",12)(0019,\"1.2.840.113681\",13)(0019,\"AEGIS_DICOM_2.00\",00)(0019,\"CARDIO-D.R. 1.0\",00)(0019,\"CARDIO-D.R. 1.0\",02)(0019,\"CARDIO-D.R. 1.0\",04)(0019,\"CARDIO-D.R. 1.0\",06)(0019,\"CARDIO-D.R. 1.0\",08)(0019,\"CARDIO-D.R. 1.0\",10)(0019,\"CARDIO-D.R. 1.0\",12)(0019,\"CARDIO-D.R. 1.0\",30)(0019,\"DIDI TO PCR 1.1\",22)(0019,\"DIDI TO PCR 1.1\",23)(0019,\"DIDI TO PCR 1.1\",24)(0019,\"DIDI TO PCR 1.1\",25)(0019,\"DIDI TO PCR 1.1\",26)(0019,\"DIDI TO PCR 1.1\",27)(0019,\"DIDI TO PCR 1.1\",70)(0019,\"DIDI TO PCR 1.1\",71)(0019,\"DIDI TO PCR 1.1\",90)(0019,\"DIDI TO PCR 1.1\",91)(0019,\"DIDI TO PCR 1.1\",92)(0019,\"DIDI TO PCR 1.1\",A0)(0019,\"DIDI TO PCR 1.1\",A1)(0019,\"DIDI TO PCR 1.1\",A2)(0019,\"DIDI TO PCR 1.1\",A3)(0019,\"DIDI TO PCR 1.1\",A4)(0019,\"DIDI TO PCR 1.1\",A5)(0019,\"DIDI TO PCR 1.1\",A6)(0019,\"DIDI TO PCR 1.1\",A7)(0019,\"DIDI TO PCR 1.1\",A8)(0019,\"DIDI TO PCR 1.1\",A9)(0019,\"DIDI TO PCR 1.1\",AA)(0019,\"DIDI TO PCR 1.1\",AB)(0019,\"DIDI TO PCR 1.1\",AC)(0019,\"DIDI TO PCR 1.1\",AD)(0019,\"DIDI TO PCR 1.1\",AE)(0019,\"DIDI TO PCR 1.1\",AF)(0019,\"DIDI TO PCR 1.1\",B0)(0019,\"DIDI TO PCR 1.1\",B1)(0019,\"DIDI TO PCR 1.1\",B2)(0019,\"DIDI TO PCR 1.1\",B3)(0019,\"DIDI TO PCR 1.1\",B4)(0019,\"DIDI TO PCR 1.1\",B5)(0019,\"DIDI TO PCR 1.1\",B6)(0019,\"DLX_SERIE_01\",01)(0019,\"DLX_SERIE_01\",02)(0019,\"DLX_SERIE_01\",03)(0019,\"DLX_SERIE_01\",04)(0019,\"DLX_SERIE_01\",05)(0019,\"DLX_SERIE_01\",06)(0019,\"DLX_SERIE_01\",07)(0019,\"DLX_SERIE_01\",08)(0019,\"DLX_SERIE_01\",09)(0019,\"DLX_SERIE_01\",0a)(0019,\"DLX_SERIE_01\",10)(0019,\"DLX_SERIE_01\",11)(0019,\"DLX_SERIE_01\",14)(0019,\"DLX_SERIE_01\",15)(0019,\"DLX_SERIE_01\",16)(0019,\"DLX_SERIE_01\",17)(0019,\"DLX_SERIE_01\",18)(0019,\"DLX_SERIE_01\",19)(0019,\"DLX_SERIE_01\",1a)(0019,\"DLX_SERIE_01\",1b)(0019,\"DLX_SERIE_01\",1c)(0019,\"DLX_SERIE_01\",1d)(0019,\"DLX_SERIE_01\",1e)(0019,\"DLX_SERIE_01\",1f)(0019,\"FDMS 1.0\",15)(0019,\"FDMS 1.0\",32)(0019,\"FDMS 1.0\",40)(0019,\"FDMS 1.0\",50)(0019,\"FDMS 1.0\",60)(0019,\"FDMS 1.0\",70)(0019,\"FDMS 1.0\",71)(0019,\"FDMS 1.0\",80)(0019,\"FDMS 1.0\",81)(0019,\"FDMS 1.0\",90)(0019,\"FDMS 1.0\",91)(0019,\"GE ??? From Adantage Review CS\",30)(0019,\"GE ??? From Adantage Review CS\",40)(0019,\"GE ??? From Adantage Review CS\",50)(0019,\"GE ??? From Adantage Review CS\",70)(0019,\"GE ??? From Adantage Review CS\",80)(0019,\"GE ??? From Adantage Review CS\",90)(0019,\"GEMS_ACQU_01\",01)(0019,\"GEMS_ACQU_01\",02)(0019,\"GEMS_ACQU_01\",03)(0019,\"GEMS_ACQU_01\",04)(0019,\"GEMS_ACQU_01\",05)(0019,\"GEMS_ACQU_01\",06)(0019,\"GEMS_ACQU_01\",0e)(0019,\"GEMS_ACQU_01\",0f)(0019,\"GEMS_ACQU_01\",11)(0019,\"GEMS_ACQU_01\",12)(0019,\"GEMS_ACQU_01\",13)(0019,\"GEMS_ACQU_01\",14)(0019,\"GEMS_ACQU_01\",15)(0019,\"GEMS_ACQU_01\",16)(0019,\"GEMS_ACQU_01\",17)(0019,\"GEMS_ACQU_01\",18)(0019,\"GEMS_ACQU_01\",19)(0019,\"GEMS_ACQU_01\",1a)(0019,\"GEMS_ACQU_01\",1b)(0019,\"GEMS_ACQU_01\",1e)(0019,\"GEMS_ACQU_01\",20)(0019,\"GEMS_ACQU_01\",22)(0019,\"GEMS_ACQU_01\",23)(0019,\"GEMS_ACQU_01\",24)(0019,\"GEMS_ACQU_01\",25)(0019,\"GEMS_ACQU_01\",26)(0019,\"GEMS_ACQU_01\",27)(0019,\"GEMS_ACQU_01\",2a)(0019,\"GEMS_ACQU_01\",2b)(0019,\"GEMS_ACQU_01\",2c)(0019,\"GEMS_ACQU_01\",2d)(0019,\"GEMS_ACQU_01\",2e)(0019,\"GEMS_ACQU_01\",2f)(0019,\"GEMS_ACQU_01\",39)(0019,\"GEMS_ACQU_01\",3a)(0019,\"GEMS_ACQU_01\",3b)(0019,\"GEMS_ACQU_01\",3c)(0019,\"GEMS_ACQU_01\",3e)(0019,\"GEMS_ACQU_01\",3f)(0019,\"GEMS_ACQU_01\",40)(0019,\"GEMS_ACQU_01\",41)(0019,\"GEMS_ACQU_01\",42)(0019,\"GEMS_ACQU_01\",43)(0019,\"GEMS_ACQU_01\",44)(0019,\"GEMS_ACQU_01\",47)(0019,\"GEMS_ACQU_01\",48)(0019,\"GEMS_ACQU_01\",49)(0019,\"GEMS_ACQU_01\",4a)(0019,\"GEMS_ACQU_01\",4b)(0019,\"GEMS_ACQU_01\",52)(0019,\"GEMS_ACQU_01\",54)(0019,\"GEMS_ACQU_01\",57)(0019,\"GEMS_ACQU_01\",58)(0019,\"GEMS_ACQU_01\",5a)(0019,\"GEMS_ACQU_01\",5d)(0019,\"GEMS_ACQU_01\",5e)(0019,\"GEMS_ACQU_01\",5f)(0019,\"GEMS_ACQU_01\",60)(0019,\"GEMS_ACQU_01\",61)(0019,\"GEMS_ACQU_01\",62)(0019,\"GEMS_ACQU_01\",6a)(0019,\"GEMS_ACQU_01\",6b)(0019,\"GEMS_ACQU_01\",70)(0019,\"GEMS_ACQU_01\",71)(0019,\"GEMS_ACQU_01\",72)(0019,\"GEMS_ACQU_01\",73)(0019,\"GEMS_ACQU_01\",74)(0019,\"GEMS_ACQU_01\",75)(0019,\"GEMS_ACQU_01\",76)(0019,\"GEMS_ACQU_01\",7d)(0019,\"GEMS_ACQU_01\",7e)(0019,\"GEMS_ACQU_01\",7f)(0019,\"GEMS_ACQU_01\",81)(0019,\"GEMS_ACQU_01\",82)(0019,\"GEMS_ACQU_01\",83)(0019,\"GEMS_ACQU_01\",84)(0019,\"GEMS_ACQU_01\",85)(0019,\"GEMS_ACQU_01\",86)(0019,\"GEMS_ACQU_01\",87)(0019,\"GEMS_ACQU_01\",88)(0019,\"GEMS_ACQU_01\",8a)(0019,\"GEMS_ACQU_01\",8b)(0019,\"GEMS_ACQU_01\",8d)(0019,\"GEMS_ACQU_01\",8f)(0019,\"GEMS_ACQU_01\",90)(0019,\"GEMS_ACQU_01\",91)(0019,\"GEMS_ACQU_01\",92)(0019,\"GEMS_ACQU_01\",93)(0019,\"GEMS_ACQU_01\",94)(0019,\"GEMS_ACQU_01\",95)(0019,\"GEMS_ACQU_01\",96)(0019,\"GEMS_ACQU_01\",97)(0019,\"GEMS_ACQU_01\",98)(0019,\"GEMS_ACQU_01\",99)(0019,\"GEMS_ACQU_01\",9b)(0019,\"GEMS_ACQU_01\",9c)(0019,\"GEMS_ACQU_01\",9d)(0019,\"GEMS_ACQU_01\",9e)(0019,\"GEMS_ACQU_01\",9f)(0019,\"GEMS_ACQU_01\",a0)(0019,\"GEMS_ACQU_01\",a1)(0019,\"GEMS_ACQU_01\",a2)(0019,\"GEMS_ACQU_01\",a3)(0019,\"GEMS_ACQU_01\",a4)(0019,\"GEMS_ACQU_01\",a5)(0019,\"GEMS_ACQU_01\",a7)(0019,\"GEMS_ACQU_01\",a8)(0019,\"GEMS_ACQU_01\",a9)(0019,\"GEMS_ACQU_01\",aa)(0019,\"GEMS_ACQU_01\",ab)(0019,\"GEMS_ACQU_01\",ac)(0019,\"GEMS_ACQU_01\",ad)(0019,\"GEMS_ACQU_01\",ae)(0019,\"GEMS_ACQU_01\",af)(0019,\"GEMS_ACQU_01\",b0)(0019,\"GEMS_ACQU_01\",b1)(0019,\"GEMS_ACQU_01\",b2)(0019,\"GEMS_ACQU_01\",b3)(0019,\"GEMS_ACQU_01\",b4)(0019,\"GEMS_ACQU_01\",b5)(0019,\"GEMS_ACQU_01\",b6)(0019,\"GEMS_ACQU_01\",b7)(0019,\"GEMS_ACQU_01\",b8)(0019,\"GEMS_ACQU_01\",b9)(0019,\"GEMS_ACQU_01\",ba)(0019,\"GEMS_ACQU_01\",bb)(0019,\"GEMS_ACQU_01\",bc)(0019,\"GEMS_ACQU_01\",bd)(0019,\"GEMS_ACQU_01\",be)(0019,\"GEMS_ACQU_01\",c0)(0019,\"GEMS_ACQU_01\",c1)(0019,\"GEMS_ACQU_01\",c2)(0019,\"GEMS_ACQU_01\",c3)(0019,\"GEMS_ACQU_01\",c4)(0019,\"GEMS_ACQU_01\",c5)(0019,\"GEMS_ACQU_01\",c6)(0019,\"GEMS_ACQU_01\",c7)(0019,\"GEMS_ACQU_01\",c8)(0019,\"GEMS_ACQU_01\",c9)(0019,\"GEMS_ACQU_01\",ca)(0019,\"GEMS_ACQU_01\",cb)(0019,\"GEMS_ACQU_01\",cc)(0019,\"GEMS_ACQU_01\",cd)(0019,\"GEMS_ACQU_01\",ce)(0019,\"GEMS_ACQU_01\",cf)(0019,\"GEMS_ACQU_01\",d0)(0019,\"GEMS_ACQU_01\",d2)(0019,\"GEMS_ACQU_01\",d3)(0019,\"GEMS_ACQU_01\",d4)(0019,\"GEMS_ACQU_01\",d5)(0019,\"GEMS_ACQU_01\",d6)(0019,\"GEMS_ACQU_01\",d7)(0019,\"GEMS_ACQU_01\",d8)(0019,\"GEMS_ACQU_01\",d9)(0019,\"GEMS_ACQU_01\",da)(0019,\"GEMS_ACQU_01\",db)(0019,\"GEMS_ACQU_01\",dc)(0019,\"GEMS_ACQU_01\",dd)(0019,\"GEMS_ACQU_01\",de)(0019,\"GEMS_ACQU_01\",df)(0019,\"GEMS_ACQU_01\",e0)(0019,\"GEMS_ACQU_01\",e1)(0019,\"GEMS_ACQU_01\",e2)(0019,\"GEMS_ACQU_01\",e3)(0019,\"GEMS_ACQU_01\",e4)(0019,\"GEMS_ACQU_01\",e5)(0019,\"GEMS_ACQU_01\",e6)(0019,\"GEMS_ACQU_01\",e8)(0019,\"GEMS_ACQU_01\",e9)(0019,\"GEMS_ACQU_01\",eb)(0019,\"GEMS_ACQU_01\",ec)(0019,\"GEMS_ACQU_01\",f0)(0019,\"GEMS_ACQU_01\",f1)(0019,\"GEMS_ACQU_01\",f2)(0019,\"GEMS_ACQU_01\",f3)(0019,\"GEMS_ACQU_01\",f4)(0019,\"GEMS_ACQU_01\",f9)(0019,\"GE_GENESIS_REV3.0\",39)(0019,\"GE_GENESIS_REV3.0\",8f)(0019,\"GE_GENESIS_REV3.0\",9c)(0019,\"GE_GENESIS_REV3.0\",9f)(0019,\"GE_GENESIS_REV3.0\",a4)(0019,\"GE_GENESIS_REV3.0\",c0)(0019,\"GE_GENESIS_REV3.0\",c1)(0019,\"GE_GENESIS_REV3.0\",cb)(0019,\"GE_GENESIS_REV3.0\",cc)(0019,\"GE_GENESIS_REV3.0\",d5)(0019,\"GE_GENESIS_REV3.0\",d8)(0019,\"GE_GENESIS_REV3.0\",d9)(0019,\"GE_GENESIS_REV3.0\",f2)(0019,\"INTEGRIS 1.0\",00)(0019,\"INTEGRIS 1.0\",40)(0019,\"PHILIPS MR R5.5/PART\",1000)(0019,\"PHILIPS MR R5.6/PART\",1000)(0019,\"PHILIPS MR SPECTRO;1\",01)(0019,\"PHILIPS MR SPECTRO;1\",02)(0019,\"PHILIPS MR SPECTRO;1\",03)(0019,\"PHILIPS MR SPECTRO;1\",04)(0019,\"PHILIPS MR SPECTRO;1\",05)(0019,\"PHILIPS MR SPECTRO;1\",06)(0019,\"PHILIPS MR SPECTRO;1\",07)(0019,\"PHILIPS MR SPECTRO;1\",08)(0019,\"PHILIPS MR SPECTRO;1\",09)(0019,\"PHILIPS MR SPECTRO;1\",10)(0019,\"PHILIPS MR SPECTRO;1\",12)(0019,\"PHILIPS MR SPECTRO;1\",13)(0019,\"PHILIPS MR SPECTRO;1\",14)(0019,\"PHILIPS MR SPECTRO;1\",15)(0019,\"PHILIPS MR SPECTRO;1\",16)(0019,\"PHILIPS MR SPECTRO;1\",17)(0019,\"PHILIPS MR SPECTRO;1\",18)(0019,\"PHILIPS MR SPECTRO;1\",20)(0019,\"PHILIPS MR SPECTRO;1\",21)(0019,\"PHILIPS MR SPECTRO;1\",22)(0019,\"PHILIPS MR SPECTRO;1\",23)(0019,\"PHILIPS MR SPECTRO;1\",24)(0019,\"PHILIPS MR SPECTRO;1\",25)(0019,\"PHILIPS MR SPECTRO;1\",26)(0019,\"PHILIPS MR SPECTRO;1\",27)(0019,\"PHILIPS MR SPECTRO;1\",28)(0019,\"PHILIPS MR SPECTRO;1\",29)(0019,\"PHILIPS MR SPECTRO;1\",31)(0019,\"PHILIPS MR SPECTRO;1\",32)(0019,\"PHILIPS MR SPECTRO;1\",41)(0019,\"PHILIPS MR SPECTRO;1\",42)(0019,\"PHILIPS MR SPECTRO;1\",43)(0019,\"PHILIPS MR SPECTRO;1\",45)(0019,\"PHILIPS MR SPECTRO;1\",46)(0019,\"PHILIPS MR SPECTRO;1\",47)(0019,\"PHILIPS MR SPECTRO;1\",48)(0019,\"PHILIPS MR SPECTRO;1\",49)(0019,\"PHILIPS MR SPECTRO;1\",50)(0019,\"PHILIPS MR SPECTRO;1\",60)(0019,\"PHILIPS MR SPECTRO;1\",61)(0019,\"PHILIPS MR SPECTRO;1\",70)(0019,\"PHILIPS MR SPECTRO;1\",71)(0019,\"PHILIPS MR SPECTRO;1\",72)(0019,\"PHILIPS MR SPECTRO;1\",73)(0019,\"PHILIPS MR SPECTRO;1\",74)(0019,\"PHILIPS MR SPECTRO;1\",76)(0019,\"PHILIPS MR SPECTRO;1\",77)(0019,\"PHILIPS MR SPECTRO;1\",78)(0019,\"PHILIPS MR SPECTRO;1\",79)(0019,\"PHILIPS MR SPECTRO;1\",80)(0019,\"PHILIPS MR/LAST\",09)(0019,\"PHILIPS MR/LAST\",0e)(0019,\"PHILIPS MR/LAST\",b1)(0019,\"PHILIPS MR/LAST\",b2)(0019,\"PHILIPS MR/LAST\",b3)(0019,\"PHILIPS MR/LAST\",b4)(0019,\"PHILIPS MR/LAST\",b5)(0019,\"PHILIPS MR/LAST\",c0)(0019,\"PHILIPS MR/LAST\",c6)(0019,\"PHILIPS MR/LAST\",ce)(0019,\"PHILIPS MR/LAST\",d5)(0019,\"PHILIPS MR/LAST\",d6)(0019,\"PHILIPS MR/LAST\",d9)(0019,\"PHILIPS MR/LAST\",e0)(0019,\"PHILIPS MR/LAST\",e1)(0019,\"PHILIPS MR/LAST\",e2)(0019,\"PHILIPS MR/LAST\",e3)(0019,\"PHILIPS MR/LAST\",f0)(0019,\"PHILIPS MR/LAST\",f1)(0019,\"PHILIPS MR/LAST\",f2)(0019,\"PHILIPS MR/LAST\",f3)(0019,\"PHILIPS MR/PART\",1000)(0019,\"PHILIPS MR/PART\",1005)(0019,\"PHILIPS MR/PART\",1006)(0019,\"PHILIPS MR/PART\",1007)(0019,\"PHILIPS MR/PART\",1008)(0019,\"PHILIPS MR/PART\",1009)(0019,\"PHILIPS MR/PART\",100a)(0019,\"PHILIPS MR/PART\",100b)(0019,\"PHILIPS MR/PART\",100c)(0019,\"PHILIPS MR/PART\",100d)(0019,\"PHILIPS MR/PART\",100e)(0019,\"PHILIPS MR/PART\",100f)(0019,\"PHILIPS MR/PART\",1010)(0019,\"PHILIPS MR/PART\",1011)(0019,\"PHILIPS MR/PART\",1015)(0019,\"PHILIPS MR/PART\",1018)(0019,\"PHILIPS MR/PART\",1019)(0019,\"PHILIPS MR/PART\",101a)(0019,\"PHILIPS MR/PART\",101b)(0019,\"PHILIPS MR/PART\",1021)(0019,\"PHILIPS MR/PART\",1022)(0019,\"PHILIPS MR/PART\",1024)(0019,\"PHILIPS MR/PART\",1064)(0019,\"PHILIPS MR/PART\",1065)(0019,\"PHILIPS MR/PART\",1069)(0019,\"PHILIPS MR/PART\",106a)(0019,\"PHILIPS MR/PART\",106b)(0019,\"PHILIPS MR/PART\",106c)(0019,\"PHILIPS MR/PART\",106d)(0019,\"PHILIPS MR/PART\",106e)(0019,\"PHILIPS MR/PART\",1080)(0019,\"PHILIPS MR/PART\",1081)(0019,\"PHILIPS MR/PART\",1084)(0019,\"PHILIPS MR/PART\",1085)(0019,\"PHILIPS MR/PART\",1094)(0019,\"PHILIPS MR/PART\",1095)(0019,\"PHILIPS MR/PART\",1096)(0019,\"PHILIPS MR/PART\",1097)(0019,\"PHILIPS MR/PART\",10a0)(0019,\"PHILIPS MR/PART\",10a1)(0019,\"PHILIPS MR/PART\",10a3)(0019,\"PHILIPS MR/PART\",10a4)(0019,\"PHILIPS MR/PART\",10c8)(0019,\"PHILIPS MR/PART\",10c9)(0019,\"PHILIPS MR/PART\",10ca)(0019,\"PHILIPS MR/PART\",10cb)(0019,\"PHILIPS MR/PART\",10cc)(0019,\"PHILIPS MR/PART\",10cd)(0019,\"PHILIPS MR/PART\",10ce)(0019,\"PHILIPS MR/PART\",10cf)(0019,\"PHILIPS MR/PART\",10d0)(0019,\"PHILIPS MR/PART\",10d2)(0019,\"PHILIPS MR/PART\",10d4)(0019,\"PHILIPS MR/PART\",10d5)(0019,\"PHILIPS MR/PART\",10d6)(0019,\"PHILIPS MR/PART\",10d7)(0019,\"PHILIPS MR/PART\",10d8)(0019,\"PHILIPS MR/PART\",10d9)(0019,\"PHILIPS MR/PART\",10da)(0019,\"PHILIPS MR/PART\",10db)(0019,\"PHILIPS MR/PART\",10e0)(0019,\"PHILIPS MR/PART\",10e1)(0019,\"PHILIPS MR/PART\",1100)(0019,\"PHILIPS MR/PART\",1101)(0019,\"PHILIPS MR/PART\",1102)(0019,\"PHILIPS MR/PART\",110b)(0019,\"PHILIPS MR/PART\",110c)(0019,\"PHILIPS MR/PART\",110d)(0019,\"PHILIPS MR/PART\",1145)(0019,\"PHILIPS MR/PART\",11fc)(0019,\"PHILIPS MR/PART\",12c0)(0019,\"PHILIPS MR/PART\",12e0)(0019,\"PHILIPS MR/PART\",12e1)(0019,\"PHILIPS MR/PART\",12e3)(0019,\"PHILIPS-MR-1\",11)(0019,\"PHILIPS-MR-1\",12)(0019,\"SIEMENS CM VA0 ACQU\",10)(0019,\"SIEMENS CM VA0 ACQU\",11)(0019,\"SIEMENS CM VA0 ACQU\",12)(0019,\"SIEMENS CM VA0 ACQU\",13)(0019,\"SIEMENS CM VA0 ACQU\",14)(0019,\"SIEMENS CM VA0 CMS\",10)(0019,\"SIEMENS CM VA0 CMS\",20)(0019,\"SIEMENS CM VA0 CMS\",30)(0019,\"SIEMENS CM VA0 CMS\",50)(0019,\"SIEMENS CM VA0 CMS\",60)(0019,\"SIEMENS CT VA0 COAD\",10)(0019,\"SIEMENS CT VA0 COAD\",11)(0019,\"SIEMENS CT VA0 COAD\",20)(0019,\"SIEMENS CT VA0 COAD\",21)(0019,\"SIEMENS CT VA0 COAD\",22)(0019,\"SIEMENS CT VA0 COAD\",23)(0019,\"SIEMENS CT VA0 COAD\",24)(0019,\"SIEMENS CT VA0 COAD\",50)(0019,\"SIEMENS CT VA0 COAD\",52)(0019,\"SIEMENS CT VA0 COAD\",54)(0019,\"SIEMENS CT VA0 COAD\",60)(0019,\"SIEMENS CT VA0 COAD\",65)(0019,\"SIEMENS CT VA0 COAD\",66)(0019,\"SIEMENS CT VA0 COAD\",67)(0019,\"SIEMENS CT VA0 COAD\",70)(0019,\"SIEMENS CT VA0 COAD\",71)(0019,\"SIEMENS CT VA0 COAD\",80)(0019,\"SIEMENS CT VA0 COAD\",82)(0019,\"SIEMENS CT VA0 COAD\",90)(0019,\"SIEMENS CT VA0 COAD\",92)(0019,\"SIEMENS CT VA0 COAD\",93)(0019,\"SIEMENS CT VA0 COAD\",94)(0019,\"SIEMENS CT VA0 COAD\",96)(0019,\"SIEMENS CT VA0 COAD\",A3)(0019,\"SIEMENS CT VA0 COAD\",A4)(0019,\"SIEMENS CT VA0 COAD\",A5)(0019,\"SIEMENS CT VA0 COAD\",A6)(0019,\"SIEMENS CT VA0 COAD\",A7)(0019,\"SIEMENS CT VA0 COAD\",A8)(0019,\"SIEMENS CT VA0 COAD\",A9)(0019,\"SIEMENS CT VA0 COAD\",AA)(0019,\"SIEMENS CT VA0 COAD\",AB)(0019,\"SIEMENS CT VA0 COAD\",AC)(0019,\"SIEMENS CT VA0 COAD\",AD)(0019,\"SIEMENS CT VA0 COAD\",AE)(0019,\"SIEMENS CT VA0 COAD\",AF)(0019,\"SIEMENS CT VA0 COAD\",B0)(0019,\"SIEMENS CT VA0 COAD\",BD)(0019,\"SIEMENS CT VA0 COAD\",BE)(0019,\"SIEMENS CT VA0 COAD\",BF)(0019,\"SIEMENS CT VA0 COAD\",C0)(0019,\"SIEMENS CT VA0 COAD\",C1)(0019,\"SIEMENS CT VA0 COAD\",C2)(0019,\"SIEMENS CT VA0 COAD\",C3)(0019,\"SIEMENS CT VA0 GEN\",10)(0019,\"SIEMENS CT VA0 GEN\",11)(0019,\"SIEMENS CT VA0 GEN\",20)(0019,\"SIEMENS CT VA0 GEN\",21)(0019,\"SIEMENS CT VA0 GEN\",25)(0019,\"SIEMENS CT VA0 GEN\",26)(0019,\"SIEMENS CT VA0 GEN\",40)(0019,\"SIEMENS CT VA0 GEN\",42)(0019,\"SIEMENS CT VA0 GEN\",44)(0019,\"SIEMENS CT VA0 GEN\",45)(0019,\"SIEMENS CT VA0 GEN\",62)(0019,\"SIEMENS CT VA0 GEN\",70)(0019,\"SIEMENS CT VA0 GEN\",71)(0019,\"SIEMENS CT VA0 GEN\",74)(0019,\"SIEMENS CT VA0 GEN\",75)(0019,\"SIEMENS CT VA0 GEN\",80)(0019,\"SIEMENS CT VA0 GEN\",81)(0019,\"SIEMENS CT VA0 GEN\",82)(0019,\"SIEMENS CT VA0 GEN\",88)(0019,\"SIEMENS DLR.01\",10)(0019,\"SIEMENS DLR.01\",11)(0019,\"SIEMENS DLR.01\",15)(0019,\"SIEMENS DLR.01\",20)(0019,\"SIEMENS DLR.01\",21)(0019,\"SIEMENS DLR.01\",22)(0019,\"SIEMENS DLR.01\",23)(0019,\"SIEMENS DLR.01\",24)(0019,\"SIEMENS DLR.01\",25)(0019,\"SIEMENS DLR.01\",26)(0019,\"SIEMENS DLR.01\",27)(0019,\"SIEMENS DLR.01\",28)(0019,\"SIEMENS DLR.01\",30)(0019,\"SIEMENS DLR.01\",31)(0019,\"SIEMENS DLR.01\",32)(0019,\"SIEMENS DLR.01\",40)(0019,\"SIEMENS DLR.01\",41)(0019,\"SIEMENS DLR.01\",42)(0019,\"SIEMENS DLR.01\",50)(0019,\"SIEMENS DLR.01\",51)(0019,\"SIEMENS DLR.01\",52)(0019,\"SIEMENS DLR.01\",53)(0019,\"SIEMENS DLR.01\",60)(0019,\"SIEMENS DLR.01\",61)(0019,\"SIEMENS DLR.01\",62)(0019,\"SIEMENS DLR.01\",63)(0019,\"SIEMENS DLR.01\",64)(0019,\"SIEMENS DLR.01\",65)(0019,\"SIEMENS DLR.01\",66)(0019,\"SIEMENS DLR.01\",67)(0019,\"SIEMENS DLR.01\",68)(0019,\"SIEMENS DLR.01\",69)(0019,\"SIEMENS DLR.01\",70)(0019,\"SIEMENS DLR.01\",71)(0019,\"SIEMENS DLR.01\",75)(0019,\"SIEMENS DLR.01\",76)(0019,\"SIEMENS DLR.01\",80)(0019,\"SIEMENS DLR.01\",90)(0019,\"SIEMENS DLR.01\",a0)(0019,\"SIEMENS DLR.01\",a1)(0019,\"SIEMENS MR VA0 COAD\",12)(0019,\"SIEMENS MR VA0 COAD\",14)(0019,\"SIEMENS MR VA0 COAD\",16)(0019,\"SIEMENS MR VA0 COAD\",20)(0019,\"SIEMENS MR VA0 COAD\",21)(0019,\"SIEMENS MR VA0 COAD\",22)(0019,\"SIEMENS MR VA0 COAD\",24)(0019,\"SIEMENS MR VA0 COAD\",26)(0019,\"SIEMENS MR VA0 COAD\",50)(0019,\"SIEMENS MR VA0 COAD\",51)(0019,\"SIEMENS MR VA0 COAD\",52)(0019,\"SIEMENS MR VA0 COAD\",54)(0019,\"SIEMENS MR VA0 COAD\",55)(0019,\"SIEMENS MR VA0 COAD\",56)(0019,\"SIEMENS MR VA0 COAD\",60)(0019,\"SIEMENS MR VA0 COAD\",62)(0019,\"SIEMENS MR VA0 COAD\",70)(0019,\"SIEMENS MR VA0 COAD\",71)(0019,\"SIEMENS MR VA0 COAD\",72)(0019,\"SIEMENS MR VA0 COAD\",80)(0019,\"SIEMENS MR VA0 COAD\",82)(0019,\"SIEMENS MR VA0 COAD\",90)(0019,\"SIEMENS MR VA0 COAD\",91)(0019,\"SIEMENS MR VA0 COAD\",92)(0019,\"SIEMENS MR VA0 COAD\",a0)(0019,\"SIEMENS MR VA0 COAD\",a1)(0019,\"SIEMENS MR VA0 COAD\",a2)(0019,\"SIEMENS MR VA0 COAD\",a5)(0019,\"SIEMENS MR VA0 COAD\",a6)(0019,\"SIEMENS MR VA0 COAD\",b0)(0019,\"SIEMENS MR VA0 COAD\",c1)(0019,\"SIEMENS MR VA0 COAD\",c2)(0019,\"SIEMENS MR VA0 COAD\",c3)(0019,\"SIEMENS MR VA0 COAD\",c4)(0019,\"SIEMENS MR VA0 COAD\",c5)(0019,\"SIEMENS MR VA0 COAD\",d1)(0019,\"SIEMENS MR VA0 COAD\",d2)(0019,\"SIEMENS MR VA0 COAD\",d3)(0019,\"SIEMENS MR VA0 COAD\",d4)(0019,\"SIEMENS MR VA0 COAD\",d5)(0019,\"SIEMENS MR VA0 COAD\",d6)(0019,\"SIEMENS MR VA0 COAD\",d7)(0019,\"SIEMENS MR VA0 COAD\",d8)(0019,\"SIEMENS MR VA0 COAD\",d9)(0019,\"SIEMENS MR VA0 COAD\",da)(0019,\"SIEMENS MR VA0 GEN\",10)(0019,\"SIEMENS MR VA0 GEN\",11)(0019,\"SIEMENS MR VA0 GEN\",12)(0019,\"SIEMENS MR VA0 GEN\",13)(0019,\"SIEMENS MR VA0 GEN\",14)(0019,\"SIEMENS MR VA0 GEN\",16)(0019,\"SIEMENS MR VA0 GEN\",18)(0019,\"SIEMENS MR VA0 GEN\",20)(0019,\"SIEMENS MR VA0 GEN\",21)(0019,\"SIEMENS MR VA0 GEN\",26)(0019,\"SIEMENS MR VA0 GEN\",28)(0019,\"SIEMENS MR VA0 GEN\",30)(0019,\"SIEMENS MR VA0 GEN\",31)(0019,\"SIEMENS MR VA0 GEN\",40)(0019,\"SIEMENS MR VA0 GEN\",41)(0019,\"SIEMENS MR VA0 GEN\",42)(0019,\"SIEMENS MR VA0 GEN\",43)(0019,\"SIEMENS MR VA0 GEN\",44)(0019,\"SIEMENS MR VA0 GEN\",45)(0019,\"SIEMENS MR VA0 GEN\",46)(0019,\"SIEMENS MR VA0 GEN\",50)(0019,\"SIEMENS MR VA0 GEN\",60)(0019,\"SIEMENS MR VA0 GEN\",70)(0019,\"SIEMENS MR VA0 GEN\",81)(0019,\"SIEMENS MR VA0 GEN\",82)(0019,\"SIEMENS MR VA0 GEN\",83)(0019,\"SIEMENS MR VA0 GEN\",84)(0019,\"SIEMENS MR VA0 GEN\",85)(0019,\"SIEMENS MR VA0 GEN\",86)(0019,\"SIEMENS MR VA0 GEN\",87)(0019,\"SIEMENS MR VA0 GEN\",88)(0019,\"SIEMENS MR VA0 GEN\",90)(0019,\"SIEMENS MR VA0 GEN\",91)(0019,\"SIEMENS MR VA0 GEN\",92)(0019,\"SIEMENS MR VA0 GEN\",93)(0019,\"SIEMENS MR VA0 GEN\",94)(0019,\"SIEMENS MR VA0 GEN\",96)(0019,\"SIEMENS MR VA0 GEN\",97)(0019,\"SIEMENS MR VA0 GEN\",98)(0019,\"SIEMENS MR VA0 GEN\",a0)(0019,\"SIEMENS MR VA0 GEN\",a1)(0019,\"SIEMENS RA GEN\",15)(0019,\"SIEMENS RA GEN\",1f)(0019,\"SIEMENS RA GEN\",20)(0019,\"SIEMENS RA GEN\",22)(0019,\"SIEMENS RA GEN\",24)(0019,\"SIEMENS RA GEN\",26)(0019,\"SIEMENS RA GEN\",28)(0019,\"SIEMENS RA GEN\",2a)(0019,\"SIEMENS RA GEN\",2c)(0019,\"SIEMENS RA GEN\",2e)(0019,\"SIEMENS RA GEN\",30)(0019,\"SIEMENS RA GEN\",32)(0019,\"SIEMENS RA GEN\",34)(0019,\"SIEMENS RA GEN\",36)(0019,\"SIEMENS RA GEN\",38)(0019,\"SIEMENS RA GEN\",3a)(0019,\"SIEMENS RA GEN\",3c)(0019,\"SIEMENS RA GEN\",3e)(0019,\"SIEMENS RA GEN\",40)(0019,\"SIEMENS RA GEN\",42)(0019,\"SIEMENS RA GEN\",44)(0019,\"SIEMENS RA GEN\",46)(0019,\"SIEMENS RA GEN\",48)(0019,\"SIEMENS RA GEN\",4a)(0019,\"SIEMENS RA GEN\",4c)(0019,\"SIEMENS RA GEN\",50)(0019,\"SIEMENS RA GEN\",52)(0019,\"SIEMENS RA GEN\",54)(0019,\"SIEMENS RA GEN\",56)(0019,\"SIEMENS RA GEN\",58)(0019,\"SIEMENS RA GEN\",5a)(0019,\"SIEMENS RA GEN\",5c)(0019,\"SIEMENS RA GEN\",5e)(0019,\"SIEMENS RA GEN\",60)(0019,\"SIEMENS RA GEN\",62)(0019,\"SIEMENS RA GEN\",64)(0019,\"SIEMENS RA GEN\",66)(0019,\"SIEMENS RA GEN\",68)(0019,\"SIEMENS RA GEN\",6a)(0019,\"SIEMENS RA GEN\",70)(0019,\"SIEMENS RA GEN\",72)(0019,\"SIEMENS RA GEN\",74)(0019,\"SIEMENS RA GEN\",76)(0019,\"SIEMENS RA GEN\",78)(0019,\"SIEMENS RA GEN\",7a)(0019,\"SIEMENS RA GEN\",7c)(0019,\"SIEMENS RA GEN\",7e)(0019,\"SIEMENS RA GEN\",80)(0019,\"SIEMENS RA GEN\",82)(0019,\"SIEMENS RA GEN\",84)(0019,\"SIEMENS RA GEN\",86)(0019,\"SIEMENS RA GEN\",88)(0019,\"SIEMENS RA GEN\",8a)(0019,\"SIEMENS RA GEN\",8c)(0019,\"SIEMENS RA GEN\",8e)(0019,\"SIEMENS RA GEN\",92)(0019,\"SIEMENS RA GEN\",94)(0019,\"SIEMENS RA GEN\",96)(0019,\"SIEMENS RA GEN\",98)(0019,\"SIEMENS RA GEN\",9a)(0019,\"SIEMENS RA GEN\",9c)(0019,\"SIEMENS RA GEN\",9e)(0019,\"SIEMENS RA GEN\",a2)(0019,\"SIEMENS RA GEN\",a4)(0019,\"SIEMENS RA GEN\",a5)(0019,\"SIEMENS RA GEN\",a6)(0019,\"SIEMENS RA GEN\",a7)(0019,\"SIEMENS RA GEN\",a8)(0019,\"SIEMENS RA GEN\",a9)(0019,\"SIEMENS RA GEN\",aa)(0019,\"SIEMENS RA GEN\",ab)(0019,\"SIEMENS RA GEN\",ac)(0019,\"SIEMENS RA GEN\",ad)(0019,\"SIEMENS RA GEN\",ff)(0019,\"SIEMENS RA PLANE A\",15)(0019,\"SIEMENS RA PLANE A\",18)(0019,\"SIEMENS RA PLANE A\",19)(0019,\"SIEMENS RA PLANE A\",1a)(0019,\"SIEMENS RA PLANE A\",1b)(0019,\"SIEMENS RA PLANE A\",1c)(0019,\"SIEMENS RA PLANE A\",1d)(0019,\"SIEMENS RA PLANE A\",1e)(0019,\"SIEMENS RA PLANE A\",1f)(0019,\"SIEMENS RA PLANE A\",20)(0019,\"SIEMENS RA PLANE A\",22)(0019,\"SIEMENS RA PLANE A\",24)(0019,\"SIEMENS RA PLANE A\",26)(0019,\"SIEMENS RA PLANE A\",28)(0019,\"SIEMENS RA PLANE A\",2a)(0019,\"SIEMENS RA PLANE A\",2c)(0019,\"SIEMENS RA PLANE A\",2e)(0019,\"SIEMENS RA PLANE A\",30)(0019,\"SIEMENS RA PLANE A\",32)(0019,\"SIEMENS RA PLANE A\",34)(0019,\"SIEMENS RA PLANE A\",36)(0019,\"SIEMENS RA PLANE A\",38)(0019,\"SIEMENS RA PLANE A\",3a)(0019,\"SIEMENS RA PLANE A\",3c)(0019,\"SIEMENS RA PLANE A\",3e)(0019,\"SIEMENS RA PLANE A\",40)(0019,\"SIEMENS RA PLANE A\",42)(0019,\"SIEMENS RA PLANE A\",44)(0019,\"SIEMENS RA PLANE A\",46)(0019,\"SIEMENS RA PLANE A\",48)(0019,\"SIEMENS RA PLANE A\",4a)(0019,\"SIEMENS RA PLANE A\",4c)(0019,\"SIEMENS RA PLANE A\",4e)(0019,\"SIEMENS RA PLANE A\",50)(0019,\"SIEMENS RA PLANE A\",52)(0019,\"SIEMENS RA PLANE A\",54)(0019,\"SIEMENS RA PLANE A\",56)(0019,\"SIEMENS RA PLANE A\",58)(0019,\"SIEMENS RA PLANE A\",5a)(0019,\"SIEMENS RA PLANE A\",5c)(0019,\"SIEMENS RA PLANE A\",5e)(0019,\"SIEMENS RA PLANE A\",60)(0019,\"SIEMENS RA PLANE A\",62)(0019,\"SIEMENS RA PLANE A\",64)(0019,\"SIEMENS RA PLANE A\",66)(0019,\"SIEMENS RA PLANE A\",68)(0019,\"SIEMENS RA PLANE A\",6a)(0019,\"SIEMENS RA PLANE A\",6c)(0019,\"SIEMENS RA PLANE A\",6e)(0019,\"SIEMENS RA PLANE A\",70)(0019,\"SIEMENS RA PLANE A\",72)(0019,\"SIEMENS RA PLANE A\",74)(0019,\"SIEMENS RA PLANE A\",76)(0019,\"SIEMENS RA PLANE A\",78)(0019,\"SIEMENS RA PLANE A\",7a)(0019,\"SIEMENS RA PLANE A\",7c)(0019,\"SIEMENS RA PLANE A\",7e)(0019,\"SIEMENS RA PLANE A\",80)(0019,\"SIEMENS RA PLANE A\",82)(0019,\"SIEMENS RA PLANE A\",84)(0019,\"SIEMENS RA PLANE A\",86)(0019,\"SIEMENS RA PLANE A\",88)(0019,\"SIEMENS RA PLANE A\",8a)(0019,\"SIEMENS RA PLANE A\",8c)(0019,\"SIEMENS RA PLANE A\",8e)(0019,\"SIEMENS RA PLANE A\",90)(0019,\"SIEMENS RA PLANE A\",92)(0019,\"SIEMENS RA PLANE A\",94)(0019,\"SIEMENS RA PLANE A\",96)(0019,\"SIEMENS RA PLANE A\",98)(0019,\"SIEMENS RA PLANE A\",9a)(0019,\"SIEMENS RA PLANE A\",9c)(0019,\"SIEMENS RA PLANE A\",9e)(0019,\"SIEMENS RA PLANE A\",a0)(0019,\"SIEMENS RA PLANE A\",a2)(0019,\"SIEMENS RA PLANE A\",a4)(0019,\"SIEMENS RA PLANE A\",a6)(0019,\"SIEMENS RA PLANE A\",a8)(0019,\"SIEMENS RA PLANE A\",aa)(0019,\"SIEMENS RA PLANE A\",ac)(0019,\"SIEMENS RA PLANE A\",ae)(0019,\"SIEMENS RA PLANE A\",b0)(0019,\"SIEMENS RA PLANE A\",b1)(0019,\"SIEMENS RA PLANE A\",b2)(0019,\"SIEMENS RA PLANE A\",b3)(0019,\"SIEMENS RA PLANE A\",b4)(0019,\"SIEMENS RA PLANE A\",b5)(0019,\"SIEMENS RA PLANE A\",b6)(0019,\"SIEMENS RA PLANE A\",b7)(0019,\"SIEMENS RA PLANE A\",b8)(0019,\"SIEMENS RA PLANE A\",b9)(0019,\"SIEMENS RA PLANE A\",bb)(0019,\"SIEMENS RA PLANE A\",bc)(0019,\"SIEMENS RA PLANE A\",bd)(0019,\"SIEMENS RA PLANE A\",be)(0019,\"SIEMENS RA PLANE A\",bf)(0019,\"SIEMENS RA PLANE A\",c0)(0019,\"SIEMENS RA PLANE A\",c1)(0019,\"SIEMENS RA PLANE A\",c2)(0019,\"SIEMENS RA PLANE A\",c3)(0019,\"SIEMENS RA PLANE A\",c4)(0019,\"SIEMENS RA PLANE A\",c5)(0019,\"SIEMENS RA PLANE A\",c6)(0019,\"SIEMENS RA PLANE A\",c7)(0019,\"SIEMENS RA PLANE A\",c8)(0019,\"SIEMENS RA PLANE A\",c9)(0019,\"SIEMENS RA PLANE A\",ca)(0019,\"SIEMENS RA PLANE A\",cb)(0019,\"SIEMENS RA PLANE A\",cc)(0019,\"SIEMENS RA PLANE A\",cd)(0019,\"SIEMENS RA PLANE A\",ce)(0019,\"SIEMENS RA PLANE A\",cf)(0019,\"SIEMENS RA PLANE A\",d1)(0019,\"SIEMENS RA PLANE A\",d2)(0019,\"SIEMENS RA PLANE A\",d3)(0019,\"SIEMENS RA PLANE A\",d4)(0019,\"SIEMENS RA PLANE A\",d5)(0019,\"SIEMENS RA PLANE A\",d6)(0019,\"SIEMENS RA PLANE A\",d7)(0019,\"SIEMENS RA PLANE A\",d8)(0019,\"SIEMENS RA PLANE A\",d9)(0019,\"SIEMENS RA PLANE A\",da)(0019,\"SIEMENS RA PLANE A\",db)(0019,\"SIEMENS RA PLANE A\",dc)(0019,\"SIEMENS RA PLANE A\",dd)(0019,\"SIEMENS RA PLANE A\",de)(0019,\"SIEMENS RA PLANE A\",df)(0019,\"SIEMENS RA PLANE A\",e0)(0019,\"SIEMENS RA PLANE B\",18)(0019,\"SIEMENS RA PLANE B\",19)(0019,\"SIEMENS RA PLANE B\",1a)(0019,\"SIEMENS RA PLANE B\",1b)(0019,\"SIEMENS RA PLANE B\",1c)(0019,\"SIEMENS RA PLANE B\",1d)(0019,\"SIEMENS RA PLANE B\",1e)(0019,\"SIEMENS RA PLANE B\",1f)(0019,\"SIEMENS RA PLANE B\",20)(0019,\"SIEMENS RA PLANE B\",22)(0019,\"SIEMENS RA PLANE B\",24)(0019,\"SIEMENS RA PLANE B\",26)(0019,\"SIEMENS RA PLANE B\",28)(0019,\"SIEMENS RA PLANE B\",2a)(0019,\"SIEMENS RA PLANE B\",2c)(0019,\"SIEMENS RA PLANE B\",2e)(0019,\"SIEMENS RA PLANE B\",30)(0019,\"SIEMENS RA PLANE B\",32)(0019,\"SIEMENS RA PLANE B\",34)(0019,\"SIEMENS RA PLANE B\",36)(0019,\"SIEMENS RA PLANE B\",38)(0019,\"SIEMENS RA PLANE B\",3a)(0019,\"SIEMENS RA PLANE B\",3c)(0019,\"SIEMENS RA PLANE B\",3e)(0019,\"SIEMENS RA PLANE B\",40)(0019,\"SIEMENS RA PLANE B\",42)(0019,\"SIEMENS RA PLANE B\",44)(0019,\"SIEMENS RA PLANE B\",46)(0019,\"SIEMENS RA PLANE B\",48)(0019,\"SIEMENS RA PLANE B\",4a)(0019,\"SIEMENS RA PLANE B\",4c)(0019,\"SIEMENS RA PLANE B\",4e)(0019,\"SIEMENS RA PLANE B\",50)(0019,\"SIEMENS RA PLANE B\",52)(0019,\"SIEMENS RA PLANE B\",54)(0019,\"SIEMENS RA PLANE B\",56)(0019,\"SIEMENS RA PLANE B\",58)(0019,\"SIEMENS RA PLANE B\",5a)(0019,\"SIEMENS RA PLANE B\",5c)(0019,\"SIEMENS RA PLANE B\",5e)(0019,\"SIEMENS RA PLANE B\",60)(0019,\"SIEMENS RA PLANE B\",62)(0019,\"SIEMENS RA PLANE B\",64)(0019,\"SIEMENS RA PLANE B\",66)(0019,\"SIEMENS RA PLANE B\",68)(0019,\"SIEMENS RA PLANE B\",6a)(0019,\"SIEMENS RA PLANE B\",6c)(0019,\"SIEMENS RA PLANE B\",6e)(0019,\"SIEMENS RA PLANE B\",70)(0019,\"SIEMENS RA PLANE B\",72)(0019,\"SIEMENS RA PLANE B\",74)(0019,\"SIEMENS RA PLANE B\",76)(0019,\"SIEMENS RA PLANE B\",78)(0019,\"SIEMENS RA PLANE B\",7a)(0019,\"SIEMENS RA PLANE B\",7c)(0019,\"SIEMENS RA PLANE B\",7e)(0019,\"SIEMENS RA PLANE B\",80)(0019,\"SIEMENS RA PLANE B\",82)(0019,\"SIEMENS RA PLANE B\",84)(0019,\"SIEMENS RA PLANE B\",86)(0019,\"SIEMENS RA PLANE B\",88)(0019,\"SIEMENS RA PLANE B\",8a)(0019,\"SIEMENS RA PLANE B\",8c)(0019,\"SIEMENS RA PLANE B\",8e)(0019,\"SIEMENS RA PLANE B\",90)(0019,\"SIEMENS RA PLANE B\",92)(0019,\"SIEMENS RA PLANE B\",94)(0019,\"SIEMENS RA PLANE B\",96)(0019,\"SIEMENS RA PLANE B\",98)(0019,\"SIEMENS RA PLANE B\",9a)(0019,\"SIEMENS RA PLANE B\",9c)(0019,\"SIEMENS RA PLANE B\",9e)(0019,\"SIEMENS RA PLANE B\",a0)(0019,\"SIEMENS RA PLANE B\",a2)(0019,\"SIEMENS RA PLANE B\",a4)(0019,\"SIEMENS RA PLANE B\",a6)(0019,\"SIEMENS RA PLANE B\",a8)(0019,\"SIEMENS RA PLANE B\",aa)(0019,\"SIEMENS RA PLANE B\",ac)(0019,\"SIEMENS SMS-AX VIEW 1.0\",00)(0019,\"SIEMENS SMS-AX VIEW 1.0\",01)(0019,\"SIEMENS SMS-AX VIEW 1.0\",02)(0019,\"SIEMENS SMS-AX VIEW 1.0\",03)(0019,\"SIEMENS SMS-AX VIEW 1.0\",04)(0019,\"SIEMENS SMS-AX VIEW 1.0\",05)(0019,\"SIEMENS SMS-AX VIEW 1.0\",06)(0019,\"SIEMENS SMS-AX VIEW 1.0\",07)(0019,\"SIEMENS SMS-AX VIEW 1.0\",08)(0019,\"SIEMENS SMS-AX VIEW 1.0\",09)(0019,\"SIEMENS SMS-AX VIEW 1.0\",0A)(0019,\"SIEMENS SMS-AX VIEW 1.0\",0B)(0019,\"SIEMENS SMS-AX VIEW 1.0\",0C)(0019,\"SIEMENS SMS-AX VIEW 1.0\",0D)(0019,\"SIEMENS SMS-AX VIEW 1.0\",0E)(0019,\"SIEMENS SMS-AX VIEW 1.0\",0F)(0019,\"SIEMENS SMS-AX VIEW 1.0\",10)(0019,\"SIEMENS SMS-AX VIEW 1.0\",12)(0019,\"SIEMENS SMS-AX VIEW 1.0\",13)(0019,\"SIEMENS SMS-AX VIEW 1.0\",14)(0019,\"SIEMENS SMS-AX VIEW 1.0\",15)(0019,\"SIEMENS SMS-AX VIEW 1.0\",16)(0019,\"SIEMENS SMS-AX VIEW 1.0\",17)(0019,\"SIEMENS SMS-AX VIEW 1.0\",1A)(0019,\"SIEMENS SMS-AX VIEW 1.0\",1B)(0019,\"SIEMENS SMS-AX VIEW 1.0\",1C)(0019,\"SIEMENS SMS-AX VIEW 1.0\",1D)(0019,\"SPI-P Release 1\",00)(0019,\"SPI-P Release 1\",01)(0019,\"SPI-P Release 1\",02)(0019,\"SPI-P Release 1\",10)(0019,\"SPI-P Release 1\",25)(0019,\"SPI-P Release 1\",30)(0019,\"SPI-P Release 1\",31)(0019,\"SPI-P Release 1\",32)(0019,\"SPI-P Release 1\",33)(0019,\"SPI-P Release 1\",50)(0019,\"SPI-P Release 1\",51)(0019,\"SPI-P Release 1\",60)(0019,\"SPI-P Release 1\",61)(0019,\"SPI-P Release 1\",62)(0019,\"SPI-P Release 1\",63)(0019,\"SPI-P Release 1\",64)(0019,\"SPI-P Release 1\",65)(0019,\"SPI-P Release 1\",70)(0019,\"SPI-P Release 1\",71)(0019,\"SPI-P Release 1\",72)(0019,\"SPI-P Release 1\",80)(0019,\"SPI-P Release 1\",81)(0019,\"SPI-P Release 1\",90)(0019,\"SPI-P Release 1\",a0)(0019,\"SPI-P Release 1\",a1)(0019,\"SPI-P Release 1;1\",00)(0019,\"SPI-P Release 1;1\",01)(0019,\"SPI-P Release 1;1\",02)(0019,\"SPI-P Release 1;1\",03)(0019,\"SPI-P Release 1;1\",04)(0019,\"SPI-P Release 1;1\",05)(0019,\"SPI-P Release 1;1\",06)(0019,\"SPI-P Release 1;1\",07)(0019,\"SPI-P Release 1;1\",08)(0019,\"SPI-P Release 1;1\",09)(0019,\"SPI-P Release 1;1\",0a)(0019,\"SPI-P Release 1;1\",10)(0019,\"SPI-P Release 1;1\",11)(0019,\"SPI-P Release 1;1\",12)(0019,\"SPI-P Release 1;1\",13)(0019,\"SPI-P Release 1;1\",14)(0019,\"SPI-P Release 1;1\",15)(0019,\"SPI-P Release 1;1\",16)(0019,\"SPI-P Release 1;1\",17)(0019,\"SPI-P Release 1;1\",18)(0019,\"SPI-P Release 1;1\",19)(0019,\"SPI-P Release 1;1\",1a)(0019,\"SPI-P-GV-CT Release 1\",08)(0019,\"SPI-P-GV-CT Release 1\",09)(0019,\"SPI-P-GV-CT Release 1\",0a)(0019,\"SPI-P-GV-CT Release 1\",10)(0019,\"SPI-P-GV-CT Release 1\",20)(0019,\"SPI-P-GV-CT Release 1\",50)(0019,\"SPI-P-GV-CT Release 1\",60)(0019,\"SPI-P-GV-CT Release 1\",61)(0019,\"SPI-P-GV-CT Release 1\",63)(0019,\"SPI-P-GV-CT Release 1\",64)(0019,\"SPI-P-GV-CT Release 1\",65)(0019,\"SPI-P-GV-CT Release 1\",70)(0019,\"SPI-P-GV-CT Release 1\",80)(0019,\"SPI-P-GV-CT Release 1\",81)(0019,\"SPI-P-GV-CT Release 1\",90)(0019,\"SPI-P-GV-CT Release 1\",a0)(0019,\"SPI-P-GV-CT Release 1\",a1)(0019,\"SPI-P-GV-CT Release 1\",a2)(0019,\"SPI-P-GV-CT Release 1\",a3)(0019,\"SPI-P-GV-CT Release 1\",b0)(0019,\"SPI-P-GV-CT Release 1\",b1)(0019,\"SPI-P-PCR Release 2\",30)(0019,\"SPI-P-Private-DCI Release 1\",10)(0019,\"SPI-P-Private-DCI Release 1\",11)(0019,\"SPI-P-Private-DCI Release 1\",12)(0019,\"SPI-P-Private-DCI Release 1\",13)(0019,\"SPI-P-Private-DCI Release 1\",14)(0019,\"SPI-P-Private-DCI Release 1\",15)(0019,\"SPI-P-Private-DCI Release 1\",16)(0019,\"SPI-P-Private-DCI Release 1\",17)(0019,\"SPI-P-Private_ICS Release 1\",30)(0019,\"SPI-P-Private_ICS Release 1\",31)(0019,\"SPI-P-XSB-DCI Release 1\",10)(0019,\"SPI-P-XSB-DCI Release 1\",11)(0019,\"SPI-P-XSB-DCI Release 1\",12)(0019,\"SPI-P-XSB-DCI Release 1\",13)(0019,\"SPI-P-XSB-DCI Release 1\",20)(0019,\"SVISION\",00)(0019,\"SVISION\",01)(0019,\"SVISION\",02)(0019,\"SVISION\",10)(0019,\"SVISION\",18)(0019,\"SVISION\",20)(0019,\"SVISION\",28)(0019,\"SVISION\",30)(0019,\"SVISION\",34)(0019,\"SVISION\",38)(0019,\"SVISION\",40)(0019,\"SVISION\",41)(0019,\"SVISION\",50)(0019,\"SVISION\",60)(0019,\"SVISION\",68)(0019,\"SVISION\",69)(0019,\"SVISION\",70)(0019,\"SVISION\",74)(0019,\"SVISION\",75)(0019,\"SVISION\",78)(0019,\"SVISION\",79)(0019,\"SVISION\",80)(0019,\"SVISION\",81)(0019,\"SVISION\",90)(0019,\"SVISION\",A0)(0019,\"SVISION\",A1)(0019,\"SVISION\",A8)(0019,\"TOSHIBA_MEC_1.0\",01)(0019,\"TOSHIBA_MEC_1.0\",02)(0019,\"TOSHIBA_MEC_CT_1.0\",01)(0019,\"TOSHIBA_MEC_CT_1.0\",02)(0019,\"TOSHIBA_MEC_CT_1.0\",03)(0019,\"TOSHIBA_MEC_CT_1.0\",04)(0019,\"TOSHIBA_MEC_CT_1.0\",05)(0019,\"TOSHIBA_MEC_CT_1.0\",06)(0019,\"TOSHIBA_MEC_CT_1.0\",07)(0019,\"TOSHIBA_MEC_CT_1.0\",08)(0019,\"TOSHIBA_MEC_CT_1.0\",09)(0019,\"TOSHIBA_MEC_CT_1.0\",0a)(0019,\"TOSHIBA_MEC_CT_1.0\",0b)(0019,\"TOSHIBA_MEC_CT_1.0\",0c)(0019,\"TOSHIBA_MEC_CT_1.0\",0d)(0019,\"TOSHIBA_MEC_CT_1.0\",0e)(0020,3100-31FF)(0021,\"CARDIO-D.R. 1.0\",13)(0021,\"FDMS 1.0\",10)(0021,\"FDMS 1.0\",30)(0021,\"FDMS 1.0\",40)(0021,\"FDMS 1.0\",50)(0021,\"FDMS 1.0\",80)(0021,\"GEMS_RELA_01\",03)(0021,\"GEMS_RELA_01\",05)(0021,\"GEMS_RELA_01\",07)(0021,\"GEMS_RELA_01\",15)(0021,\"GEMS_RELA_01\",16)(0021,\"GEMS_RELA_01\",18)(0021,\"GEMS_RELA_01\",19)(0021,\"GEMS_RELA_01\",20)(0021,\"GEMS_RELA_01\",35)(0021,\"GEMS_RELA_01\",36)(0021,\"GEMS_RELA_01\",37)(0021,\"GEMS_RELA_01\",4a)(0021,\"GEMS_RELA_01\",4e)(0021,\"GEMS_RELA_01\",4f)(0021,\"GEMS_RELA_01\",50)(0021,\"GEMS_RELA_01\",51)(0021,\"GEMS_RELA_01\",52)(0021,\"GEMS_RELA_01\",53)(0021,\"GEMS_RELA_01\",54)(0021,\"GEMS_RELA_01\",55)(0021,\"GEMS_RELA_01\",56)(0021,\"GEMS_RELA_01\",57)(0021,\"GEMS_RELA_01\",58)(0021,\"GEMS_RELA_01\",59)(0021,\"GEMS_RELA_01\",5a)(0021,\"GEMS_RELA_01\",5b)(0021,\"GEMS_RELA_01\",5c)(0021,\"GEMS_RELA_01\",5d)(0021,\"GEMS_RELA_01\",5e)(0021,\"GEMS_RELA_01\",5f)(0021,\"GEMS_RELA_01\",70)(0021,\"GEMS_RELA_01\",71)(0021,\"GEMS_RELA_01\",81)(0021,\"GEMS_RELA_01\",82)(0021,\"GEMS_RELA_01\",83)(0021,\"GEMS_RELA_01\",84)(0021,\"GEMS_RELA_01\",90)(0021,\"GEMS_RELA_01\",91)(0021,\"GEMS_RELA_01\",92)(0021,\"GEMS_RELA_01\",93)(0021,\"INTEGRIS 1.0\",12)(0021,\"PHILIPS MR/LAST\",00)(0021,\"PHILIPS MR/LAST\",10)(0021,\"PHILIPS MR/LAST\",20)(0021,\"PHILIPS MR/LAST\",21)(0021,\"PHILIPS MR/LAST\",22)(0021,\"PHILIPS MR/PART\",1000)(0021,\"PHILIPS MR/PART\",1010)(0021,\"PHILIPS MR/PART\",1020)(0021,\"PHILIPS MR/PART\",1030)(0021,\"PHILIPS MR/PART\",1031)(0021,\"PHILIPS MR/PART\",1035)(0021,\"PHILIPS MR/PART\",1040)(0021,\"PHILIPS MR/PART\",1050)(0021,\"PHILIPS MR/PART\",1060)(0021,\"PHILIPS MR/PART\",1061)(0021,\"PHILIPS MR/PART\",1062)(0021,\"PHILIPS MR/PART\",1100)(0021,\"PHILIPS MR/PART\",1110)(0021,\"PHILIPS MR/PART\",1221)(0021,\"PHILIPS-MR-1\",01)(0021,\"PHILIPS-MR-1\",02)(0021,\"SIEMENS CM VA0 CMS\",20)(0021,\"SIEMENS CM VA0 CMS\",22)(0021,\"SIEMENS CM VA0 CMS\",24)(0021,\"SIEMENS CM VA0 CMS\",26)(0021,\"SIEMENS CM VA0 CMS\",30)(0021,\"SIEMENS CM VA0 CMS\",32)(0021,\"SIEMENS CM VA0 CMS\",60)(0021,\"SIEMENS CM VA0 CMS\",61)(0021,\"SIEMENS CM VA0 CMS\",63)(0021,\"SIEMENS CM VA0 CMS\",65)(0021,\"SIEMENS CM VA0 CMS\",6a)(0021,\"SIEMENS CM VA0 CMS\",6b)(0021,\"SIEMENS CM VA0 CMS\",70)(0021,\"SIEMENS CM VA0 CMS\",71)(0021,\"SIEMENS CM VA0 CMS\",80)(0021,\"SIEMENS CM VA0 CMS\",82)(0021,\"SIEMENS CT VA0 GEN\",10)(0021,\"SIEMENS CT VA0 GEN\",11)(0021,\"SIEMENS CT VA0 GEN\",20)(0021,\"SIEMENS CT VA0 GEN\",30)(0021,\"SIEMENS CT VA0 GEN\",32)(0021,\"SIEMENS CT VA0 GEN\",34)(0021,\"SIEMENS CT VA0 GEN\",36)(0021,\"SIEMENS CT VA0 GEN\",40)(0021,\"SIEMENS CT VA0 GEN\",45)(0021,\"SIEMENS CT VA0 GEN\",46)(0021,\"SIEMENS CT VA0 GEN\",47)(0021,\"SIEMENS CT VA0 GEN\",48)(0021,\"SIEMENS CT VA0 GEN\",49)(0021,\"SIEMENS CT VA0 GEN\",4a)(0021,\"SIEMENS CT VA0 GEN\",50)(0021,\"SIEMENS CT VA0 GEN\",51)(0021,\"SIEMENS CT VA0 GEN\",52)(0021,\"SIEMENS CT VA0 GEN\",53)(0021,\"SIEMENS CT VA0 GEN\",60)(0021,\"SIEMENS CT VA0 GEN\",62)(0021,\"SIEMENS CT VA0 GEN\",70)(0021,\"SIEMENS CT VA0 GEN\",72)(0021,\"SIEMENS CT VA0 GEN\",75)(0021,\"SIEMENS CT VA0 GEN\",76)(0021,\"SIEMENS CT VA0 GEN\",7a)(0021,\"SIEMENS CT VA0 GEN\",7b)(0021,\"SIEMENS CT VA0 GEN\",7c)(0021,\"SIEMENS CT VA0 GEN\",a0)(0021,\"SIEMENS CT VA0 GEN\",a2)(0021,\"SIEMENS CT VA0 GEN\",a7)(0021,\"SIEMENS CT VA0 RAW\",10)(0021,\"SIEMENS CT VA0 RAW\",20)(0021,\"SIEMENS CT VA0 RAW\",30)(0021,\"SIEMENS CT VA0 RAW\",40)(0021,\"SIEMENS CT VA0 RAW\",41)(0021,\"SIEMENS CT VA0 RAW\",42)(0021,\"SIEMENS CT VA0 RAW\",43)(0021,\"SIEMENS CT VA0 RAW\",44)(0021,\"SIEMENS CT VA0 RAW\",50)(0021,\"SIEMENS MED\",10)(0021,\"SIEMENS MED\",11)(0021,\"SIEMENS MED\",12)(0021,\"SIEMENS MED\",20)(0021,\"SIEMENS MR VA0 GEN\",20)(0021,\"SIEMENS MR VA0 GEN\",21)(0021,\"SIEMENS MR VA0 GEN\",22)(0021,\"SIEMENS MR VA0 GEN\",24)(0021,\"SIEMENS MR VA0 GEN\",30)(0021,\"SIEMENS MR VA0 GEN\",31)(0021,\"SIEMENS MR VA0 GEN\",34)(0021,\"SIEMENS MR VA0 GEN\",36)(0021,\"SIEMENS MR VA0 GEN\",39)(0021,\"SIEMENS MR VA0 GEN\",40)(0021,\"SIEMENS MR VA0 GEN\",41)(0021,\"SIEMENS MR VA0 GEN\",42)(0021,\"SIEMENS MR VA0 GEN\",43)(0021,\"SIEMENS MR VA0 GEN\",44)(0021,\"SIEMENS MR VA0 GEN\",45)(0021,\"SIEMENS MR VA0 GEN\",46)(0021,\"SIEMENS MR VA0 GEN\",47)(0021,\"SIEMENS MR VA0 GEN\",48)(0021,\"SIEMENS MR VA0 GEN\",49)(0021,\"SIEMENS MR VA0 GEN\",4a)(0021,\"SIEMENS MR VA0 GEN\",4f)(0021,\"SIEMENS MR VA0 GEN\",50)(0021,\"SIEMENS MR VA0 GEN\",52)(0021,\"SIEMENS MR VA0 GEN\",53)(0021,\"SIEMENS MR VA0 GEN\",54)(0021,\"SIEMENS MR VA0 GEN\",56)(0021,\"SIEMENS MR VA0 GEN\",57)(0021,\"SIEMENS MR VA0 GEN\",58)(0021,\"SIEMENS MR VA0 GEN\",59)(0021,\"SIEMENS MR VA0 GEN\",60)(0021,\"SIEMENS MR VA0 GEN\",70)(0021,\"SIEMENS MR VA0 GEN\",72)(0021,\"SIEMENS MR VA0 GEN\",73)(0021,\"SIEMENS MR VA0 GEN\",80)(0021,\"SIEMENS MR VA0 GEN\",91)(0021,\"SIEMENS MR VA0 GEN\",92)(0021,\"SIEMENS MR VA0 GEN\",93)(0021,\"SIEMENS MR VA0 GEN\",94)(0021,\"SIEMENS MR VA0 GEN\",95)(0021,\"SIEMENS MR VA0 GEN\",96)(0021,\"SIEMENS MR VA0 RAW\",00)(0021,\"SIEMENS MR VA0 RAW\",01)(0021,\"SIEMENS MR VA0 RAW\",02)(0021,\"SIEMENS MR VA0 RAW\",03)(0021,\"SIEMENS MR VA0 RAW\",04)(0021,\"SIEMENS MR VA0 RAW\",05)(0021,\"SIEMENS MR VA0 RAW\",06)(0021,\"SIEMENS MR VA0 RAW\",07)(0021,\"SIEMENS MR VA0 RAW\",08)(0021,\"SIEMENS MR VA0 RAW\",09)(0021,\"SIEMENS MR VA0 RAW\",10)(0021,\"SIEMENS MR VA0 RAW\",11)(0021,\"SIEMENS MR VA0 RAW\",12)(0021,\"SIEMENS MR VA0 RAW\",13)(0021,\"SIEMENS MR VA0 RAW\",14)(0021,\"SIEMENS MR VA0 RAW\",15)(0021,\"SIEMENS MR VA0 RAW\",16)(0021,\"SIEMENS MR VA0 RAW\",17)(0021,\"SIEMENS MR VA0 RAW\",18)(0021,\"SIEMENS MR VA0 RAW\",19)(0021,\"SIEMENS MR VA0 RAW\",20)(0021,\"SIEMENS MR VA0 RAW\",21)(0021,\"SIEMENS MR VA0 RAW\",30)(0021,\"SIEMENS MR VA0 RAW\",31)(0021,\"SIEMENS MR VA0 RAW\",50)(0021,\"SIEMENS MR VA0 RAW\",51)(0021,\"SIEMENS MR VA0 RAW\",52)(0021,\"SIEMENS MR VA0 RAW\",53)(0021,\"SIEMENS MR VA0 RAW\",54)(0021,\"SIEMENS MR VA0 RAW\",55)(0021,\"SIEMENS RA GEN\",15)(0021,\"SIEMENS RA GEN\",20)(0021,\"SIEMENS RA GEN\",25)(0021,\"SIEMENS RA GEN\",27)(0021,\"SIEMENS RA GEN\",28)(0021,\"SIEMENS RA GEN\",30)(0021,\"SIEMENS RA GEN\",40)(0021,\"SIEMENS SMS-AX ACQ 1.0\",00)(0021,\"SIEMENS SMS-AX ACQ 1.0\",01)(0021,\"SIEMENS SMS-AX ACQ 1.0\",02)(0021,\"SIEMENS SMS-AX ACQ 1.0\",03)(0021,\"SIEMENS SMS-AX ACQ 1.0\",04)(0021,\"SIEMENS SMS-AX ACQ 1.0\",05)(0021,\"SIEMENS SMS-AX ACQ 1.0\",06)(0021,\"SIEMENS SMS-AX ACQ 1.0\",07)(0021,\"SIEMENS SMS-AX ACQ 1.0\",08)(0021,\"SIEMENS SMS-AX ACQ 1.0\",0A)(0021,\"SIEMENS SMS-AX ACQ 1.0\",0B)(0021,\"SIEMENS SMS-AX ACQ 1.0\",0C)(0021,\"SIEMENS SMS-AX ACQ 1.0\",0D)(0021,\"SIEMENS SMS-AX ACQ 1.0\",0E)(0021,\"SIEMENS SMS-AX ACQ 1.0\",0F)(0021,\"SIEMENS SMS-AX ACQ 1.0\",10)(0021,\"SIEMENS SMS-AX ACQ 1.0\",11)(0021,\"SIEMENS SMS-AX ACQ 1.0\",12)(0021,\"SIEMENS SMS-AX ACQ 1.0\",13)(0021,\"SIEMENS SMS-AX ACQ 1.0\",14)(0021,\"SIEMENS SMS-AX ACQ 1.0\",15)(0021,\"SIEMENS SMS-AX ACQ 1.0\",16)(0021,\"SIEMENS SMS-AX ACQ 1.0\",17)(0021,\"SIEMENS SMS-AX ACQ 1.0\",18)(0021,\"SIEMENS SMS-AX ACQ 1.0\",19)(0021,\"SIEMENS SMS-AX ACQ 1.0\",1A)(0021,\"SIEMENS SMS-AX ACQ 1.0\",1B)(0021,\"SIEMENS SMS-AX ACQ 1.0\",1C)(0021,\"SIEMENS SMS-AX ACQ 1.0\",1D)(0021,\"SIEMENS SMS-AX ACQ 1.0\",1E)(0021,\"SIEMENS SMS-AX ACQ 1.0\",1F)(0021,\"SIEMENS SMS-AX ACQ 1.0\",20)(0021,\"SIEMENS SMS-AX ACQ 1.0\",21)(0021,\"SIEMENS SMS-AX ACQ 1.0\",22)(0021,\"SIEMENS SMS-AX ACQ 1.0\",23)(0021,\"SIEMENS SMS-AX ACQ 1.0\",24)(0021,\"SIEMENS SMS-AX ACQ 1.0\",25)(0021,\"SIEMENS SMS-AX ACQ 1.0\",26)(0021,\"SPI-P Release 1\",12)(0021,\"SPI-P Release 1\",14)(0021,\"SPI-P-GV-CT Release 1\",20)(0021,\"SPI-P-GV-CT Release 1\",30)(0021,\"SPI-P-GV-CT Release 1\",40)(0021,\"SPI-P-GV-CT Release 1\",50)(0021,\"SPI-P-GV-CT Release 1\",60)(0021,\"SPI-P-GV-CT Release 1\",70)(0021,\"SPI-P-GV-CT Release 1\",80)(0021,\"SPI-P-GV-CT Release 1\",90)(0021,\"SPI-P-GV-CT Release 1\",a0)(0021,\"SPI-P-GV-CT Release 1\",a1)(0021,\"SPI-P-GV-CT Release 1\",a2)(0021,\"SPI-P-GV-CT Release 1\",a3)(0021,\"SPI-P-GV-CT Release 1\",a4)(0021,\"SPI-P-GV-CT Release 1\",b0)(0021,\"SPI-P-GV-CT Release 1\",c0)(0021,\"SPI-P-Private-CWS Release 1\",00)(0021,\"SPI-P-Private-CWS Release 1\",01)(0021,\"SPI-P-Private-CWS Release 1\",02)(0021,\"SPI-P-Private_CDS Release 1\",40)(0021,\"SVISION\",00)(0021,\"SVISION\",01)(0021,\"SVISION\",02)(0021,\"SVISION\",03)(0021,\"SVISION\",10)(0021,\"SVISION\",11)(0021,\"SVISION\",20)(0021,\"SVISION\",30)(0021,\"SVISION\",31)(0021,\"SVISION\",40)(0021,\"SVISION\",41)(0021,\"SVISION\",90)(0021,\"SVISION\",91)(0021,\"SVISION\",92)(0021,\"TOSHIBA_MEC_1.0\",01)(0021,\"TOSHIBA_MEC_1.0\",02)(0021,\"TOSHIBA_MEC_1.0\",03)(0023,\"FDMS 1.0\",10)(0023,\"FDMS 1.0\",20)(0023,\"FDMS 1.0\",30)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",00)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",10)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",20)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",30)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",40)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",50)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",60)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",70)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",80)(0023,\"GEMS_ACRQA_1.0 BLOCK1\",90)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",00)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",10)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",20)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",30)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",40)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",50)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",60)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",70)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",80)(0023,\"GEMS_ACRQA_1.0 BLOCK2\",90)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",00)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",10)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",20)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",30)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",40)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",50)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",60)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",70)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",80)(0023,\"GEMS_ACRQA_1.0 BLOCK3\",90)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",00)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",10)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",20)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",30)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",40)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",50)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",60)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",70)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",80)(0023,\"GEMS_ACRQA_2.0 BLOCK1\",90)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",00)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",10)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",20)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",30)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",40)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",50)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",60)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",70)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",80)(0023,\"GEMS_ACRQA_2.0 BLOCK2\",90)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",00)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",10)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",20)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",30)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",40)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",50)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",60)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",70)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",80)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",90)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",f0)(0023,\"GEMS_ACRQA_2.0 BLOCK3\",ff)(0023,\"GEMS_STDY_01\",01)(0023,\"GEMS_STDY_01\",02)(0023,\"GEMS_STDY_01\",10)(0023,\"GEMS_STDY_01\",50)(0023,\"GEMS_STDY_01\",70)(0023,\"GEMS_STDY_01\",74)(0023,\"GEMS_STDY_01\",7d)(0023,\"SIEMENS SMS-AX QUANT 1.0\",00)(0023,\"SIEMENS SMS-AX QUANT 1.0\",01)(0023,\"SIEMENS SMS-AX QUANT 1.0\",02)(0023,\"SIEMENS SMS-AX QUANT 1.0\",03)(0023,\"SIEMENS SMS-AX QUANT 1.0\",04)(0023,\"SIEMENS SMS-AX QUANT 1.0\",05)(0023,\"SIEMENS SMS-AX QUANT 1.0\",06)(0023,\"SIEMENS SMS-AX QUANT 1.0\",07)(0023,\"SIEMENS SMS-AX QUANT 1.0\",08)(0023,\"SPI-P Release 2;1\",0d)(0023,\"SPI-P Release 2;1\",0e)(0023,\"SVISION\",00)(0023,\"SVISION\",01)(0023,\"SVISION\",02)(0023,\"SVISION\",03)(0023,\"SVISION\",F0)(0025,\"CMR42 CIRCLECVI\",1010)(0025,\"CMR42 CIRCLECVI\",1020)(0025,\"CMR42 CIRCLECVI\",1030)(0025,\"FDMS 1.0\",10)(0025,\"FDMS 1.0\",11)(0025,\"FDMS 1.0\",12)(0025,\"FDMS 1.0\",13)(0025,\"FDMS 1.0\",15)(0025,\"FDMS 1.0\",20)(0025,\"FDMS 1.0\",21)(0025,\"FDMS 1.0\",30)(0025,\"FDMS 1.0\",31)(0025,\"FDMS 1.0\",32)(0025,\"FDMS 1.0\",33)(0025,\"FDMS 1.0\",34)(0025,\"FDMS 1.0\",40)(0025,\"FDMS 1.0\",41)(0025,\"FDMS 1.0\",42)(0025,\"FDMS 1.0\",43)(0025,\"FDMS 1.0\",50)(0025,\"FDMS 1.0\",51)(0025,\"FDMS 1.0\",52)(0025,\"FDMS 1.0\",53)(0025,\"FDMS 1.0\",60)(0025,\"FDMS 1.0\",61)(0025,\"FDMS 1.0\",62)(0025,\"FDMS 1.0\",63)(0025,\"FDMS 1.0\",70)(0025,\"FDMS 1.0\",71)(0025,\"FDMS 1.0\",72)(0025,\"FDMS 1.0\",73)(0025,\"FDMS 1.0\",74)(0025,\"FDMS 1.0\",80)(0025,\"FDMS 1.0\",81)(0025,\"FDMS 1.0\",82)(0025,\"FDMS 1.0\",83)(0025,\"FDMS 1.0\",84)(0025,\"FDMS 1.0\",90)(0025,\"FDMS 1.0\",91)(0025,\"FDMS 1.0\",92)(0025,\"FDMS 1.0\",93)(0025,\"FDMS 1.0\",94)(0025,\"FDMS 1.0\",95)(0025,\"FDMS 1.0\",96)(0025,\"FDMS 1.0\",a0)(0025,\"FDMS 1.0\",a1)(0025,\"FDMS 1.0\",a2)(0025,\"FDMS 1.0\",a3)(0025,\"GEMS_SERS_01\",06)(0025,\"GEMS_SERS_01\",07)(0025,\"GEMS_SERS_01\",10)(0025,\"GEMS_SERS_01\",11)(0025,\"GEMS_SERS_01\",14)(0025,\"GEMS_SERS_01\",17)(0025,\"GEMS_SERS_01\",18)(0025,\"GEMS_SERS_01\",19)(0025,\"GEMS_SERS_01\",1a)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",00)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",01)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",02)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",03)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",04)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",05)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",06)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",07)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",08)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",09)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",0A)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",0B)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",0C)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",0D)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",0E)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",0F)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",10)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",11)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",12)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",13)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",14)(0025,\"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0\",15)(0025,\"SVISION\",00)(0025,\"SVISION\",01)(0025,\"SVISION\",02)(0025,\"SVISION\",03)(0025,\"SVISION\",04)(0025,\"SVISION\",05)(0025,\"SVISION\",06)(0025,\"SVISION\",07)(0025,\"SVISION\",08)(0025,\"SVISION\",20)(0025,\"SVISION\",21)(0027,\"FDMS 1.0\",10)(0027,\"FDMS 1.0\",20)(0027,\"FDMS 1.0\",30)(0027,\"FDMS 1.0\",40)(0027,\"FDMS 1.0\",50)(0027,\"FDMS 1.0\",60)(0027,\"FDMS 1.0\",70)(0027,\"FDMS 1.0\",80)(0027,\"FDMS 1.0\",a0)(0027,\"FDMS 1.0\",a1)(0027,\"FDMS 1.0\",a2)(0027,\"FDMS 1.0\",a3)(0027,\"GEMS_IMAG_01\",06)(0027,\"GEMS_IMAG_01\",10)(0027,\"GEMS_IMAG_01\",1c)(0027,\"GEMS_IMAG_01\",1d)(0027,\"GEMS_IMAG_01\",1e)(0027,\"GEMS_IMAG_01\",1f)(0027,\"GEMS_IMAG_01\",20)(0027,\"GEMS_IMAG_01\",30)(0027,\"GEMS_IMAG_01\",31)(0027,\"GEMS_IMAG_01\",32)(0027,\"GEMS_IMAG_01\",33)(0027,\"GEMS_IMAG_01\",35)(0027,\"GEMS_IMAG_01\",36)(0027,\"GEMS_IMAG_01\",40)(0027,\"GEMS_IMAG_01\",41)(0027,\"GEMS_IMAG_01\",42)(0027,\"GEMS_IMAG_01\",43)(0027,\"GEMS_IMAG_01\",44)(0027,\"GEMS_IMAG_01\",45)(0027,\"GEMS_IMAG_01\",46)(0027,\"GEMS_IMAG_01\",47)(0027,\"GEMS_IMAG_01\",48)(0027,\"GEMS_IMAG_01\",49)(0027,\"GEMS_IMAG_01\",4a)(0027,\"GEMS_IMAG_01\",4b)(0027,\"GEMS_IMAG_01\",4c)(0027,\"GEMS_IMAG_01\",4d)(0027,\"GEMS_IMAG_01\",50)(0027,\"GEMS_IMAG_01\",51)(0027,\"GEMS_IMAG_01\",52)(0027,\"GEMS_IMAG_01\",53)(0027,\"GEMS_IMAG_01\",54)(0027,\"GEMS_IMAG_01\",55)(0027,\"GEMS_IMAG_01\",60)(0027,\"GEMS_IMAG_01\",61)(0027,\"GEMS_IMAG_01\",62)(0027,\"PHILIPS MR/LAST\",00)(0027,\"PHILIPS MR/LAST\",11)(0027,\"PHILIPS MR/LAST\",12)(0027,\"PHILIPS MR/LAST\",13)(0027,\"PHILIPS MR/LAST\",14)(0027,\"PHILIPS MR/LAST\",15)(0027,\"PHILIPS MR/LAST\",16)(0027,\"SVISION\",00)(0027,\"SVISION\",01)(0027,\"SVISION\",10)(0027,\"SVISION\",11)(0027,\"SVISION\",12)(0027,\"SVISION\",13)(0029,\"AEGIS_DICOM_2.00\",00)(0029,\"CAMTRONICS IP\",10)(0029,\"CAMTRONICS IP\",20)(0029,\"CAMTRONICS IP\",30)(0029,\"CAMTRONICS IP\",40)(0029,\"CAMTRONICS\",10)(0029,\"CAMTRONICS\",20)(0029,\"CAMTRONICS\",50)(0029,\"CAMTRONICS\",60)(0029,\"CAMTRONICS\",70)(0029,\"CAMTRONICS\",80)(0029,\"CAMTRONICS\",90)(0029,\"CARDIO-D.R. 1.0\",00)(0029,\"CARDIO-D.R. 1.0\",01)(0029,\"CARDIO-D.R. 1.0\",02)(0029,\"CARDIO-D.R. 1.0\",03)(0029,\"DIGISCAN IMAGE\",31)(0029,\"DIGISCAN IMAGE\",32)(0029,\"DIGISCAN IMAGE\",33)(0029,\"DIGISCAN IMAGE\",34)(0029,\"FDMS 1.0\",20)(0029,\"FDMS 1.0\",30)(0029,\"FDMS 1.0\",34)(0029,\"FDMS 1.0\",44)(0029,\"FDMS 1.0\",50)(0029,\"GEMS_IMPS_01\",04)(0029,\"GEMS_IMPS_01\",05)(0029,\"GEMS_IMPS_01\",06)(0029,\"GEMS_IMPS_01\",07)(0029,\"GEMS_IMPS_01\",08)(0029,\"GEMS_IMPS_01\",09)(0029,\"GEMS_IMPS_01\",0a)(0029,\"GEMS_IMPS_01\",15)(0029,\"GEMS_IMPS_01\",16)(0029,\"GEMS_IMPS_01\",17)(0029,\"GEMS_IMPS_01\",18)(0029,\"GEMS_IMPS_01\",1a)(0029,\"GEMS_IMPS_01\",26)(0029,\"GEMS_IMPS_01\",34)(0029,\"GEMS_IMPS_01\",35)(0029,\"INTEGRIS 1.0\",08)(0029,\"INTELERAD MEDICAL SYSTEMS\",01)(0029,\"INTELERAD MEDICAL SYSTEMS\",02)(0029,\"INTELERAD MEDICAL SYSTEMS\",03)(0029,\"INTELERAD MEDICAL SYSTEMS\",10)(0029,\"INTELERAD MEDICAL SYSTEMS\",11)(0029,\"INTELERAD MEDICAL SYSTEMS\",12)(0029,\"INTELERAD MEDICAL SYSTEMS\",13)(0029,\"INTELERAD MEDICAL SYSTEMS\",14)(0029,\"INTELERAD MEDICAL SYSTEMS\",15)(0029,\"INTELERAD MEDICAL SYSTEMS\",20)(0029,\"INTELERAD MEDICAL SYSTEMS\",21)(0029,\"INTELERAD MEDICAL SYSTEMS\",22)(0029,\"ISG shadow\",70)(0029,\"ISG shadow\",80)(0029,\"ISG shadow\",90)(0029,\"OCULUS Optikgeraete GmbH\",1010)(0029,\"OCULUS Optikgeraete GmbH\",1012)(0029,\"OCULUS Optikgeraete GmbH\",1020)(0029,\"OCULUS Optikgeraete GmbH\",1022)(0029,\"PHILIPS MR/LAST\",10)(0029,\"PHILIPS MR/LAST\",20)(0029,\"PHILIPS MR/LAST\",30)(0029,\"PHILIPS MR/LAST\",40)(0029,\"PHILIPS MR/LAST\",50)(0029,\"PHILIPS MR/LAST\",60)(0029,\"PHILIPS MR/LAST\",61)(0029,\"PHILIPS MR/LAST\",70)(0029,\"PHILIPS MR/LAST\",71)(0029,\"PHILIPS MR/LAST\",72)(0029,\"PHILIPS MR/LAST\",80)(0029,\"PHILIPS MR/LAST\",81)(0029,\"PHILIPS MR/LAST\",82)(0029,\"PHILIPS MR/LAST\",83)(0029,\"PHILIPS MR/PART\",00)(0029,\"PHILIPS MR/PART\",04)(0029,\"PHILIPS MR/PART\",10)(0029,\"PHILIPS MR/PART\",11)(0029,\"PHILIPS MR/PART\",20)(0029,\"PHILIPS MR/PART\",31)(0029,\"PHILIPS MR/PART\",32)(0029,\"PHILIPS MR/PART\",c3)(0029,\"PHILIPS MR/PART\",c4)(0029,\"PHILIPS MR/PART\",d5)(0029,\"SIEMENS CM VA0 CMS\",10)(0029,\"SIEMENS CM VA0 CMS\",11)(0029,\"SIEMENS CM VA0 CMS\",13)(0029,\"SIEMENS CM VA0 CMS\",20)(0029,\"SIEMENS CM VA0 CMS\",22)(0029,\"SIEMENS CM VA0 CMS\",50)(0029,\"SIEMENS CM VA0 CMS\",51)(0029,\"SIEMENS CM VA0 CMS\",52)(0029,\"SIEMENS CM VA0 CMS\",53)(0029,\"SIEMENS CM VA0 CMS\",60)(0029,\"SIEMENS CSA HEADER\",08)(0029,\"SIEMENS CSA HEADER\",09)(0029,\"SIEMENS CSA HEADER\",10)(0029,\"SIEMENS CSA HEADER\",18)(0029,\"SIEMENS CSA HEADER\",19)(0029,\"SIEMENS CSA HEADER\",20)(0029,\"SIEMENS CSA NON-IMAGE\",08)(0029,\"SIEMENS CSA NON-IMAGE\",09)(0029,\"SIEMENS CSA NON-IMAGE\",10)(0029,\"SIEMENS MED DISPLAY\",04)(0029,\"SIEMENS MED DISPLAY\",10)(0029,\"SIEMENS MED DISPLAY\",11)(0029,\"SIEMENS MED DISPLAY\",20)(0029,\"SIEMENS MED DISPLAY\",21)(0029,\"SIEMENS MED DISPLAY\",50)(0029,\"SIEMENS MED DISPLAY\",99)(0029,\"SIEMENS MED DISPLAY\",a0)(0029,\"SIEMENS MED DISPLAY\",a1)(0029,\"SIEMENS MED DISPLAY\",a2)(0029,\"SIEMENS MED DISPLAY\",b0)(0029,\"SIEMENS MED DISPLAY\",b2)(0029,\"SIEMENS MED DISPLAY\",c1)(0029,\"SIEMENS MED HG\",10)(0029,\"SIEMENS MED HG\",15)(0029,\"SIEMENS MED HG\",20)(0029,\"SIEMENS MED HG\",30)(0029,\"SIEMENS MED HG\",40)(0029,\"SIEMENS MED HG\",50)(0029,\"SIEMENS MED HG\",60)(0029,\"SIEMENS MED HG\",70)(0029,\"SIEMENS MED MG\",10)(0029,\"SIEMENS MED MG\",15)(0029,\"SIEMENS MED MG\",20)(0029,\"SIEMENS MED MG\",30)(0029,\"SIEMENS MED MG\",40)(0029,\"SIEMENS MED MG\",50)(0029,\"SIEMENS MED MG\",60)(0029,\"SIEMENS MED MG\",70)(0029,\"SIEMENS MEDCOM HEADER\",08)(0029,\"SIEMENS MEDCOM HEADER\",09)(0029,\"SIEMENS MEDCOM HEADER\",10)(0029,\"SIEMENS MEDCOM HEADER\",20)(0029,\"SIEMENS MEDCOM HEADER\",31)(0029,\"SIEMENS MEDCOM HEADER\",32)(0029,\"SIEMENS MEDCOM HEADER\",33)(0029,\"SIEMENS MEDCOM HEADER\",34)(0029,\"SIEMENS MEDCOM HEADER\",35)(0029,\"SIEMENS MEDCOM HEADER\",40)(0029,\"SIEMENS MEDCOM HEADER\",41)(0029,\"SIEMENS MEDCOM HEADER\",42)(0029,\"SIEMENS MEDCOM HEADER\",43)(0029,\"SIEMENS MEDCOM HEADER\",44)(0029,\"SIEMENS MEDCOM HEADER\",50)(0029,\"SIEMENS MEDCOM HEADER\",51)(0029,\"SIEMENS MEDCOM HEADER\",52)(0029,\"SIEMENS MEDCOM HEADER\",53)(0029,\"SIEMENS MEDCOM HEADER\",54)(0029,\"SIEMENS MEDCOM HEADER\",55)(0029,\"SIEMENS MEDCOM HEADER\",70)(0029,\"SIEMENS MEDCOM HEADER\",71)(0029,\"SIEMENS MEDCOM HEADER\",72)(0029,\"SIEMENS MEDCOM HEADER\",73)(0029,\"SIEMENS MEDCOM HEADER\",74)(0029,\"SIEMENS MEDCOM HEADER\",75)(0029,\"SIEMENS MEDCOM HEADER\",76)(0029,\"SIEMENS MEDCOM HEADER2\",60)(0029,\"SIEMENS MEDCOM OOG\",08)(0029,\"SIEMENS MEDCOM OOG\",09)(0029,\"SIEMENS MEDCOM OOG\",10)(0029,\"SPI RELEASE 1\",60)(0029,\"SPI Release 1\",60)(0029,\"SPI\",60)(0029,\"SPI-P Release 1\",00)(0029,\"SPI-P Release 1\",20)(0029,\"SPI-P Release 1\",25)(0029,\"SPI-P Release 1\",30)(0029,\"SPI-P Release 1\",38)(0029,\"SPI-P Release 1\",60)(0029,\"SPI-P Release 1\",61)(0029,\"SPI-P Release 1\",67)(0029,\"SPI-P Release 1\",70)(0029,\"SPI-P Release 1\",71)(0029,\"SPI-P Release 1\",72)(0029,\"SPI-P Release 1\",77)(0029,\"SPI-P Release 1\",78)(0029,\"SPI-P Release 1\",79)(0029,\"SPI-P Release 1\",7e)(0029,\"SPI-P Release 1\",7f)(0029,\"SPI-P Release 1\",80)(0029,\"SPI-P Release 1\",81)(0029,\"SPI-P Release 1\",8e)(0029,\"SPI-P Release 1\",8f)(0029,\"SPI-P Release 1\",c0)(0029,\"SPI-P Release 1\",c1)(0029,\"SPI-P Release 1\",c5)(0029,\"SPI-P Release 1\",ce)(0029,\"SPI-P Release 1\",cf)(0029,\"SPI-P Release 1;1\",00)(0029,\"SPI-P Release 1;1\",01)(0029,\"SPI-P Release 1;1\",03)(0029,\"SPI-P Release 1;1\",04)(0029,\"SPI-P Release 1;1\",0e)(0029,\"SPI-P Release 1;1\",0f)(0029,\"SPI-P Release 1;1\",40)(0029,\"SPI-P Release 1;1\",41)(0029,\"SPI-P Release 1;1\",43)(0029,\"SPI-P Release 1;1\",44)(0029,\"SPI-P Release 1;1\",4e)(0029,\"SPI-P Release 1;1\",4f)(0029,\"SPI-P Release 1;2\",00)(0029,\"SPI-P Release 1;2\",04)(0029,\"SPI-P Release 1;2\",0c)(0029,\"SPI-P Release 1;2\",1e)(0029,\"SPI-P Release 1;2\",1f)(0029,\"SPI-P Release 1;3\",00)(0029,\"SPI-P Release 1;3\",01)(0029,\"SPI-P Release 1;3\",02)(0029,\"SPI-P Release 1;3\",03)(0029,\"SPI-P Release 1;3\",04)(0029,\"SPI-P Release 1;3\",05)(0029,\"SPI-P Release 1;3\",06)(0029,\"SPI-P Release 1;3\",0c)(0029,\"SPI-P Release 1;3\",1e)(0029,\"SPI-P Release 1;3\",1f)(0029,\"SPI-P-GV-CT Release 1\",10)(0029,\"SPI-P-GV-CT Release 1\",30)(0029,\"SPI-P-GV-CT Release 1\",31)(0029,\"SPI-P-GV-CT Release 1\",32)(0029,\"SPI-P-GV-CT Release 1\",33)(0029,\"SPI-P-GV-CT Release 1\",80)(0029,\"SPI-P-GV-CT Release 1\",90)(0029,\"SPI-P-GV-CT Release 1\",d0)(0029,\"SPI-P-GV-CT Release 1\",d1)(0029,\"SPI-P-Private_CDS Release 1\",00)(0029,\"SPI-P-Private_ICS Release 1\",08)(0029,\"SPI-P-Private_ICS Release 1\",0f)(0029,\"SPI-P-Private_ICS Release 1\",10)(0029,\"SPI-P-Private_ICS Release 1\",1b)(0029,\"SPI-P-Private_ICS Release 1\",1c)(0029,\"SPI-P-Private_ICS Release 1\",21)(0029,\"SPI-P-Private_ICS Release 1\",43)(0029,\"SPI-P-Private_ICS Release 1\",44)(0029,\"SPI-P-Private_ICS Release 1\",4C)(0029,\"SPI-P-Private_ICS Release 1\",67)(0029,\"SPI-P-Private_ICS Release 1\",68)(0029,\"SPI-P-Private_ICS Release 1\",6A)(0029,\"SPI-P-Private_ICS Release 1\",6B)(0029,\"SPI-P-Private_ICS Release 1;1\",00)(0029,\"SPI-P-Private_ICS Release 1;1\",05)(0029,\"SPI-P-Private_ICS Release 1;1\",06)(0029,\"SPI-P-Private_ICS Release 1;1\",20)(0029,\"SPI-P-Private_ICS Release 1;1\",21)(0029,\"SPI-P-Private_ICS Release 1;1\",CD)(0029,\"SPI-P-Private_ICS Release 1;2\",00)(0029,\"SPI-P-Private_ICS Release 1;2\",01)(0029,\"SPI-P-Private_ICS Release 1;2\",02)(0029,\"SPI-P-Private_ICS Release 1;2\",03)(0029,\"SPI-P-Private_ICS Release 1;2\",04)(0029,\"SPI-P-Private_ICS Release 1;2\",05)(0029,\"SPI-P-Private_ICS Release 1;3\",C0)(0029,\"SPI-P-Private_ICS Release 1;3\",C1)(0029,\"SPI-P-Private_ICS Release 1;3\",C2)(0029,\"SPI-P-Private_ICS Release 1;3\",C3)(0029,\"SPI-P-Private_ICS Release 1;3\",C4)(0029,\"SPI-P-Private_ICS Release 1;3\",C5)(0029,\"SPI-P-Private_ICS Release 1;4\",02)(0029,\"SPI-P-Private_ICS Release 1;4\",9A)(0029,\"SPI-P-Private_ICS Release 1;4\",E0)(0029,\"SPI-P-Private_ICS Release 1;5\",50)(0029,\"SPI-P-Private_ICS Release 1;5\",55)(0029,\"Silhouette Annot V1.0\",11)(0029,\"Silhouette Annot V1.0\",12)(0029,\"Silhouette Annot V1.0\",13)(0029,\"Silhouette Annot V1.0\",14)(0029,\"Silhouette Annot V1.0\",15)(0029,\"Silhouette Annot V1.0\",16)(0029,\"Silhouette Annot V1.0\",17)(0029,\"Silhouette Annot V1.0\",18)(0029,\"Silhouette Annot V1.0\",19)(0029,\"Silhouette Annot V1.0\",20)(0029,\"Silhouette Annot V1.0\",21)(0029,\"Silhouette Annot V1.0\",22)(0029,\"Silhouette Annot V1.0\",23)(0029,\"Silhouette Annot V1.0\",24)(0029,\"Silhouette Annot V1.0\",25)(0029,\"Silhouette Annot V1.0\",26)(0029,\"Silhouette Annot V1.0\",27)(0029,\"Silhouette Annot V1.0\",28)(0029,\"Silhouette Annot V1.0\",29)(0029,\"Silhouette Annot V1.0\",30)(0029,\"Silhouette Annot V1.0\",31)(0029,\"Silhouette Annot V1.0\",32)(0029,\"Silhouette Annot V1.0\",33)(0029,\"Silhouette Annot V1.0\",34)(0029,\"Silhouette Annot V1.0\",35)(0029,\"Silhouette Annot V1.0\",36)(0029,\"Silhouette Annot V1.0\",37)(0029,\"Silhouette Annot V1.0\",38)(0029,\"Silhouette Annot V1.0\",39)(0029,\"Silhouette Annot V1.0\",40)(0029,\"Silhouette Annot V1.0\",41)(0029,\"Silhouette Annot V1.0\",42)(0029,\"Silhouette Annot V1.0\",43)(0029,\"Silhouette Annot V1.0\",44)(0029,\"Silhouette Annot V1.0\",45)(0029,\"Silhouette Graphics Export V1.0\",00)(0029,\"Silhouette Line V1.0\",11)(0029,\"Silhouette Line V1.0\",12)(0029,\"Silhouette Line V1.0\",13)(0029,\"Silhouette Line V1.0\",14)(0029,\"Silhouette Line V1.0\",15)(0029,\"Silhouette Line V1.0\",16)(0029,\"Silhouette Line V1.0\",17)(0029,\"Silhouette Line V1.0\",18)(0029,\"Silhouette Line V1.0\",19)(0029,\"Silhouette Line V1.0\",20)(0029,\"Silhouette Line V1.0\",21)(0029,\"Silhouette Line V1.0\",22)(0029,\"Silhouette Line V1.0\",23)(0029,\"Silhouette Line V1.0\",24)(0029,\"Silhouette Line V1.0\",25)(0029,\"Silhouette Line V1.0\",26)(0029,\"Silhouette Line V1.0\",27)(0029,\"Silhouette Line V1.0\",28)(0029,\"Silhouette Line V1.0\",29)(0029,\"Silhouette ROI V1.0\",11)(0029,\"Silhouette ROI V1.0\",12)(0029,\"Silhouette ROI V1.0\",13)(0029,\"Silhouette ROI V1.0\",14)(0029,\"Silhouette ROI V1.0\",15)(0029,\"Silhouette ROI V1.0\",16)(0029,\"Silhouette ROI V1.0\",17)(0029,\"Silhouette ROI V1.0\",18)(0029,\"Silhouette ROI V1.0\",19)(0029,\"Silhouette ROI V1.0\",20)(0029,\"Silhouette ROI V1.0\",21)(0029,\"Silhouette ROI V1.0\",22)(0029,\"Silhouette ROI V1.0\",23)(0029,\"Silhouette ROI V1.0\",24)(0029,\"Silhouette ROI V1.0\",25)(0029,\"Silhouette ROI V1.0\",26)(0029,\"Silhouette ROI V1.0\",27)(0029,\"Silhouette ROI V1.0\",28)(0029,\"Silhouette ROI V1.0\",29)(0029,\"Silhouette ROI V1.0\",30)(0029,\"Silhouette ROI V1.0\",31)(0029,\"Silhouette ROI V1.0\",32)(0029,\"Silhouette ROI V1.0\",33)(0029,\"Silhouette ROI V1.0\",34)(0029,\"Silhouette Sequence Ids V1.0\",41)(0029,\"Silhouette Sequence Ids V1.0\",42)(0029,\"Silhouette Sequence Ids V1.0\",43)(0029,\"Silhouette V1.0\",13)(0029,\"Silhouette V1.0\",14)(0029,\"Silhouette V1.0\",17)(0029,\"Silhouette V1.0\",18)(0029,\"Silhouette V1.0\",19)(0029,\"Silhouette V1.0\",1a)(0029,\"Silhouette V1.0\",1b)(0029,\"Silhouette V1.0\",1c)(0029,\"Silhouette V1.0\",1d)(0029,\"Silhouette V1.0\",1e)(0029,\"Silhouette V1.0\",21)(0029,\"Silhouette V1.0\",22)(0029,\"Silhouette V1.0\",23)(0029,\"Silhouette V1.0\",24)(0029,\"Silhouette V1.0\",25)(0029,\"Silhouette V1.0\",27)(0029,\"Silhouette V1.0\",28)(0029,\"Silhouette V1.0\",29)(0029,\"Silhouette V1.0\",30)(0029,\"Silhouette V1.0\",52)(0029,\"Silhouette V1.0\",53)(0029,\"Silhouette V1.0\",54)(0029,\"Silhouette V1.0\",55)(0029,\"Silhouette V1.0\",56)(0029,\"Silhouette V1.0\",57)(0031,\"AGFA PACS Archive Mirroring 1.0\",00)(0031,\"AGFA PACS Archive Mirroring 1.0\",01)(0031,\"SIEMENS ISI\",12)(0031,\"SIEMENS ISI\",30)(0031,\"SIEMENS ISI\",32)(0031,\"SIEMENS ISI\",33)(0031,\"SIEMENS ISI\",4a)(0031,\"SIEMENS ISI\",80)(0031,\"SIEMENS RIS\",10)(0031,\"SIEMENS RIS\",45)(0031,\"SIEMENS RIS\",50)(0033,\"GEMS_CTHD_01\",02)(0033,\"GEMS_GNHD_01\",01)(0033,\"GEMS_GNHD_01\",02)(0033,\"GEMS_YMHD_01\",05)(0033,\"GEMS_YMHD_01\",06)(0033,\"SIEMENS RIS\",10)(0037,\"GEMS_DRS_1\",10)(0037,\"GEMS_DRS_1\",20)(0037,\"GEMS_DRS_1\",40)(0037,\"GEMS_DRS_1\",42)(0037,\"GEMS_DRS_1\",50)(0037,\"GEMS_DRS_1\",60)(0039,\"GEMS_ADWSoft_DPO\",80)(0039,\"GEMS_ADWSoft_DPO\",85)(0039,\"GEMS_ADWSoft_DPO\",90)(0039,\"GEMS_ADWSoft_DPO\",95)(0039,\"GEMS_ADWSoft_DPO\",AA)(0041,\"INTEGRIS 1.0\",20)(0041,\"INTEGRIS 1.0\",30)(0041,\"INTEGRIS 1.0\",40)(0041,\"INTEGRIS 1.0\",41)(0041,\"INTEGRIS 1.0\",50)(0041,\"PAPYRUS 3.0\",00)(0041,\"PAPYRUS 3.0\",10)(0041,\"PAPYRUS 3.0\",11)(0041,\"PAPYRUS 3.0\",12)(0041,\"PAPYRUS 3.0\",13)(0041,\"PAPYRUS 3.0\",14)(0041,\"PAPYRUS 3.0\",15)(0041,\"PAPYRUS 3.0\",21)(0041,\"PAPYRUS 3.0\",22)(0041,\"PAPYRUS 3.0\",31)(0041,\"PAPYRUS 3.0\",32)(0041,\"PAPYRUS 3.0\",41)(0041,\"PAPYRUS 3.0\",42)(0041,\"PAPYRUS 3.0\",50)(0041,\"PAPYRUS\",00)(0041,\"PAPYRUS\",10)(0041,\"PAPYRUS\",11)(0041,\"PAPYRUS\",20)(0041,\"PAPYRUS\",30)(0041,\"PAPYRUS\",32)(0041,\"PAPYRUS\",34)(0041,\"PAPYRUS\",36)(0041,\"PAPYRUS\",40)(0041,\"PAPYRUS\",50)(0041,\"PAPYRUS\",60)(0041,\"PAPYRUS\",62)(0041,\"PAPYRUS\",a0)(0041,\"PAPYRUS\",a1)(0041,\"PAPYRUS\",a2)(0041,\"PAPYRUS\",a3)(0041,\"PAPYRUS\",b0)(0041,\"PAPYRUS\",b1)(0041,\"PAPYRUS\",b2)(0041,\"PAPYRUS\",b3)(0041,\"SIEMENS DLR.01\",10)(0041,\"SIEMENS DLR.01\",20)(0041,\"SIEMENS DLR.01\",30)(0041,\"SIEMENS DLR.01\",31)(0043,\"GEMS_PARM_01\",01)(0043,\"GEMS_PARM_01\",02)(0043,\"GEMS_PARM_01\",03)(0043,\"GEMS_PARM_01\",04)(0043,\"GEMS_PARM_01\",05)(0043,\"GEMS_PARM_01\",06)(0043,\"GEMS_PARM_01\",07)(0043,\"GEMS_PARM_01\",08)(0043,\"GEMS_PARM_01\",09)(0043,\"GEMS_PARM_01\",0a)(0043,\"GEMS_PARM_01\",0b)(0043,\"GEMS_PARM_01\",0c)(0043,\"GEMS_PARM_01\",0d)(0043,\"GEMS_PARM_01\",0e)(0043,\"GEMS_PARM_01\",0f)(0043,\"GEMS_PARM_01\",10)(0043,\"GEMS_PARM_01\",11)(0043,\"GEMS_PARM_01\",12)(0043,\"GEMS_PARM_01\",13)(0043,\"GEMS_PARM_01\",14)(0043,\"GEMS_PARM_01\",15)(0043,\"GEMS_PARM_01\",16)(0043,\"GEMS_PARM_01\",17)(0043,\"GEMS_PARM_01\",18)(0043,\"GEMS_PARM_01\",19)(0043,\"GEMS_PARM_01\",1a)(0043,\"GEMS_PARM_01\",1b)(0043,\"GEMS_PARM_01\",1c)(0043,\"GEMS_PARM_01\",1d)(0043,\"GEMS_PARM_01\",1e)(0043,\"GEMS_PARM_01\",1f)(0043,\"GEMS_PARM_01\",20)(0043,\"GEMS_PARM_01\",21)(0043,\"GEMS_PARM_01\",25)(0043,\"GEMS_PARM_01\",26)(0043,\"GEMS_PARM_01\",27)(0043,\"GEMS_PARM_01\",28)(0043,\"GEMS_PARM_01\",29)(0043,\"GEMS_PARM_01\",2a)(0043,\"GEMS_PARM_01\",2b)(0043,\"GEMS_PARM_01\",2c)(0043,\"GEMS_PARM_01\",2d)(0043,\"GEMS_PARM_01\",2e)(0043,\"GEMS_PARM_01\",2f)(0043,\"GEMS_PARM_01\",30)(0043,\"GEMS_PARM_01\",31)(0043,\"GEMS_PARM_01\",32)(0043,\"GEMS_PARM_01\",33)(0043,\"GEMS_PARM_01\",34)(0043,\"GEMS_PARM_01\",35)(0043,\"GEMS_PARM_01\",36)(0043,\"GEMS_PARM_01\",37)(0043,\"GEMS_PARM_01\",38)(0043,\"GEMS_PARM_01\",39)(0043,\"GEMS_PARM_01\",40)(0043,\"GEMS_PARM_01\",41)(0043,\"GEMS_PARM_01\",42)(0043,\"GEMS_PARM_01\",43)(0043,\"GEMS_PARM_01\",44)(0043,\"GEMS_PARM_01\",45)(0043,\"GEMS_PARM_01\",46)(0043,\"GEMS_PARM_01\",47)(0043,\"GEMS_PARM_01\",48)(0043,\"GEMS_PARM_01\",49)(0043,\"GEMS_PARM_01\",4a)(0043,\"GEMS_PARM_01\",4b)(0043,\"GEMS_PARM_01\",4c)(0043,\"GEMS_PARM_01\",4d)(0043,\"GEMS_PARM_01\",4e)(0043,\"GEMS_PARM_01\",60)(0043,\"GEMS_PARM_01\",61)(0043,\"GEMS_PARM_01\",62)(0043,\"GEMS_PARM_01\",6f)(0043,\"GEMS_PARM_01\",70)(0043,\"GEMS_PARM_01\",71)(0043,\"GEMS_PARM_01\",72)(0043,\"GEMS_PARM_01\",73)(0043,\"GEMS_PARM_01\",74)(0043,\"GEMS_PARM_01\",75)(0043,\"GEMS_PARM_01\",76)(0043,\"GEMS_PARM_01\",77)(0043,\"GEMS_PARM_01\",78)(0043,\"GEMS_PARM_01\",79)(0043,\"GEMS_PARM_01\",7a)(0043,\"GEMS_PARM_01\",7b)(0043,\"GEMS_PARM_01\",7c)(0043,\"GEMS_PARM_01\",7d)(0043,\"GEMS_PARM_01\",7e)(0043,\"GEMS_PARM_01\",7f)(0043,\"GEMS_PARM_01\",80)(0043,\"GEMS_PARM_01\",81)(0043,\"GEMS_PARM_01\",82)(0043,\"GEMS_PARM_01\",83)(0043,\"GEMS_PARM_01\",84)(0043,\"GEMS_PARM_01\",85)(0043,\"GEMS_PARM_01\",86)(0043,\"GEMS_PARM_01\",87)(0043,\"GEMS_PARM_01\",88)(0043,\"GEMS_PARM_01\",89)(0043,\"GEMS_PARM_01\",8a)(0043,\"GEMS_PARM_01\",8b)(0043,\"GEMS_PARM_01\",8c)(0043,\"GEMS_PARM_01\",8d)(0043,\"GEMS_PARM_01\",8e)(0043,\"GEMS_PARM_01\",8f)(0043,\"GEMS_PARM_01\",90)(0043,\"GEMS_PARM_01\",91)(0043,\"GEMS_PARM_01\",92)(0043,\"GEMS_PARM_01\",93)(0043,\"GEMS_PARM_01\",94)(0043,\"GEMS_PARM_01\",95)(0043,\"GEMS_PARM_01\",96)(0043,\"GEMS_PARM_01\",97)(0043,\"GEMS_PARM_01\",98)(0043,\"GEMS_PARM_01\",99)(0043,\"GEMS_PARM_01\",9a)(0043,\"GEMS_PARM_01\",9b)(0043,\"GEMS_PARM_01\",9c)(0043,\"GEMS_PARM_01\",9d)(0043,\"GEMS_PARM_01\",9e)(0043,\"GEMS_PARM_01\",9f)(0043,\"GE_GENESIS_REV3.0\",1e)(0043,\"GE_GENESIS_REV3.0\",27)(0045,\"GEMS_SENO_02\",04)(0045,\"GEMS_SENO_02\",06)(0045,\"GEMS_SENO_02\",09)(0045,\"GEMS_SENO_02\",0b)(0045,\"GEMS_SENO_02\",0c)(0045,\"GEMS_SENO_02\",0d)(0045,\"GEMS_SENO_02\",11)(0045,\"GEMS_SENO_02\",12)(0045,\"GEMS_SENO_02\",13)(0045,\"GEMS_SENO_02\",14)(0045,\"GEMS_SENO_02\",15)(0045,\"GEMS_SENO_02\",16)(0045,\"GEMS_SENO_02\",1B)(0045,\"GEMS_SENO_02\",1D)(0045,\"GEMS_SENO_02\",1E)(0045,\"GEMS_SENO_02\",1F)(0045,\"GEMS_SENO_02\",20)(0045,\"GEMS_SENO_02\",21)(0045,\"GEMS_SENO_02\",22)(0045,\"GEMS_SENO_02\",23)(0045,\"GEMS_SENO_02\",24)(0045,\"GEMS_SENO_02\",25)(0045,\"GEMS_SENO_02\",26)(0045,\"GEMS_SENO_02\",27)(0045,\"GEMS_SENO_02\",28)(0045,\"GEMS_SENO_02\",29)(0045,\"GEMS_SENO_02\",2a)(0045,\"GEMS_SENO_02\",2b)(0045,\"GEMS_SENO_02\",39)(0045,\"GEMS_SENO_02\",3a)(0045,\"GEMS_SENO_02\",3b)(0045,\"GEMS_SENO_02\",3c)(0045,\"GEMS_SENO_02\",3d)(0045,\"GEMS_SENO_02\",3e)(0045,\"GEMS_SENO_02\",3f)(0047,\"GEMS_ADWSoft_3D1\",01)(0047,\"GEMS_ADWSoft_3D1\",50)(0047,\"GEMS_ADWSoft_3D1\",51)(0047,\"GEMS_ADWSoft_3D1\",53)(0047,\"GEMS_ADWSoft_3D1\",54)(0047,\"GEMS_ADWSoft_3D1\",55)(0047,\"GEMS_ADWSoft_3D1\",57)(0047,\"GEMS_ADWSoft_3D1\",58)(0047,\"GEMS_ADWSoft_3D1\",59)(0047,\"GEMS_ADWSoft_3D1\",60)(0047,\"GEMS_ADWSoft_3D1\",61)(0047,\"GEMS_ADWSoft_3D1\",63)(0047,\"GEMS_ADWSoft_3D1\",64)(0047,\"GEMS_ADWSoft_3D1\",65)(0047,\"GEMS_ADWSoft_3D1\",70)(0047,\"GEMS_ADWSoft_3D1\",71)(0047,\"GEMS_ADWSoft_3D1\",72)(0047,\"GEMS_ADWSoft_3D1\",80)(0047,\"GEMS_ADWSoft_3D1\",85)(0047,\"GEMS_ADWSoft_3D1\",89)(0047,\"GEMS_ADWSoft_3D1\",8A)(0047,\"GEMS_ADWSoft_3D1\",8B)(0047,\"GEMS_ADWSoft_3D1\",91)(0047,\"GEMS_ADWSoft_3D1\",92)(0047,\"GEMS_ADWSoft_3D1\",93)(0047,\"GEMS_ADWSoft_3D1\",94)(0047,\"GEMS_ADWSoft_3D1\",95)(0047,\"GEMS_ADWSoft_3D1\",96)(0047,\"GEMS_ADWSoft_3D1\",98)(0047,\"GEMS_ADWSoft_3D1\",99)(0047,\"GEMS_ADWSoft_3D1\",9A)(0047,\"GEMS_ADWSoft_3D1\",9B)(0047,\"GEMS_ADWSoft_3D1\",9C)(0047,\"GEMS_ADWSoft_3D1\",B0)(0047,\"GEMS_ADWSoft_3D1\",B1)(0047,\"GEMS_ADWSoft_3D1\",B2)(0047,\"GEMS_ADWSoft_3D1\",B5)(0047,\"GEMS_ADWSoft_3D1\",B6)(0047,\"GEMS_ADWSoft_3D1\",B7)(0047,\"GEMS_ADWSoft_3D1\",B8)(0047,\"GEMS_ADWSoft_3D1\",B9)(0047,\"GEMS_ADWSoft_3D1\",BA)(0047,\"GEMS_ADWSoft_3D1\",BB)(0047,\"GEMS_ADWSoft_3D1\",BC)(0047,\"GEMS_ADWSoft_3D1\",C0)(0047,\"GEMS_ADWSoft_3D1\",C1)(0047,\"GEMS_ADWSoft_3D1\",C2)(0047,\"GEMS_ADWSoft_3D1\",D1)(0047,\"GEMS_ADWSoft_3D1\",D2)(0047,\"GEMS_ADWSoft_3D1\",D3)(0047,\"GEMS_ADWSoft_3D1\",D4)(0047,\"GEMS_ADWSoft_3D1\",D5)(0051,\"SIEMENS CM VA0 CMS\",10)(0055,\"SIEMENS ISI\",46)(0087,\"1.2.840.113708.794.1.1.2.0\",10)(0087,\"1.2.840.113708.794.1.1.2.0\",20)(0087,\"1.2.840.113708.794.1.1.2.0\",50)(0089,\"DIDI TO PCR 1.1\",10)(0095,\"SIENET\",01)(0095,\"SIENET\",04)(0095,\"SIENET\",05)(0095,\"SIENET\",07)(0099,\"SIENET\",02)(00E1,\"ELSCINT1\",01)(00E1,\"ELSCINT1\",14)(00E1,\"ELSCINT1\",22)(00E1,\"ELSCINT1\",23)(00E1,\"ELSCINT1\",24)(00E1,\"ELSCINT1\",25)(00E1,\"ELSCINT1\",40)(0135,\"SONOWAND AS\",10)(0135,\"SONOWAND AS\",11)(0135,\"SONOWAND AS\",12)(0193,\"SIEMENS ISI\",02)(0307,\"SIEMENS ISI\",01)(0309,\"SIEMENS ISI\",01)(0601,\"ELSCINT1\",00)(0601,\"ELSCINT1\",20)(0601,\"ELSCINT1\",21)(0601,\"ELSCINT1\",30)(0601,\"ELSCINT1\",31)(0601,\"ELSCINT1\",50)(0601,\"ELSCINT1\",70)(0601,\"ELSCINT1\",71)(0601,\"ELSCINT1\",72)(1369,\"AEGIS_DICOM_2.00\",00)(2001,\"PHILIPS IMAGING DD 001\",01)(2001,\"PHILIPS IMAGING DD 001\",02)(2001,\"PHILIPS IMAGING DD 001\",03)(2001,\"PHILIPS IMAGING DD 001\",04)(2001,\"PHILIPS IMAGING DD 001\",06)(2001,\"PHILIPS IMAGING DD 001\",07)(2001,\"PHILIPS IMAGING DD 001\",08)(2001,\"PHILIPS IMAGING DD 001\",09)(2001,\"PHILIPS IMAGING DD 001\",0a)(2001,\"PHILIPS IMAGING DD 001\",0b)(2001,\"PHILIPS IMAGING DD 001\",0c)(2001,\"PHILIPS IMAGING DD 001\",0e)(2001,\"PHILIPS IMAGING DD 001\",0f)(2001,\"PHILIPS IMAGING DD 001\",10)(2001,\"PHILIPS IMAGING DD 001\",11)(2001,\"PHILIPS IMAGING DD 001\",12)(2001,\"PHILIPS IMAGING DD 001\",13)(2001,\"PHILIPS IMAGING DD 001\",14)(2001,\"PHILIPS IMAGING DD 001\",15)(2001,\"PHILIPS IMAGING DD 001\",16)(2001,\"PHILIPS IMAGING DD 001\",17)(2001,\"PHILIPS IMAGING DD 001\",18)(2001,\"PHILIPS IMAGING DD 001\",19)(2001,\"PHILIPS IMAGING DD 001\",1a)(2001,\"PHILIPS IMAGING DD 001\",1b)(2001,\"PHILIPS IMAGING DD 001\",1c)(2001,\"PHILIPS IMAGING DD 001\",1d)(2001,\"PHILIPS IMAGING DD 001\",1f)(2001,\"PHILIPS IMAGING DD 001\",20)(2001,\"PHILIPS IMAGING DD 001\",21)(2001,\"PHILIPS IMAGING DD 001\",22)(2001,\"PHILIPS IMAGING DD 001\",23)(2001,\"PHILIPS IMAGING DD 001\",24)(2001,\"PHILIPS IMAGING DD 001\",25)(2001,\"PHILIPS IMAGING DD 001\",26)(2001,\"PHILIPS IMAGING DD 001\",2d)(2001,\"PHILIPS IMAGING DD 001\",32)(2001,\"PHILIPS IMAGING DD 001\",33)(2001,\"PHILIPS IMAGING DD 001\",35)(2001,\"PHILIPS IMAGING DD 001\",36)(2001,\"PHILIPS IMAGING DD 001\",3f)(2001,\"PHILIPS IMAGING DD 001\",58)(2001,\"PHILIPS IMAGING DD 001\",5f)(2001,\"PHILIPS IMAGING DD 001\",60)(2001,\"PHILIPS IMAGING DD 001\",61)(2001,\"PHILIPS IMAGING DD 001\",62)(2001,\"PHILIPS IMAGING DD 001\",63)(2001,\"PHILIPS IMAGING DD 001\",67)(2001,\"PHILIPS IMAGING DD 001\",77)(2001,\"PHILIPS IMAGING DD 001\",7b)(2001,\"PHILIPS IMAGING DD 001\",81)(2001,\"PHILIPS IMAGING DD 001\",9f)(2001,\"PHILIPS IMAGING DD 001\",a1)(2001,\"PHILIPS IMAGING DD 001\",f1)(2001,\"PHILIPS IMAGING DD 001\",f2)(2001,\"Philips Imaging DD 001\",01)(2001,\"Philips Imaging DD 001\",02)(2001,\"Philips Imaging DD 001\",03)(2001,\"Philips Imaging DD 001\",04)(2001,\"Philips Imaging DD 001\",06)(2001,\"Philips Imaging DD 001\",07)(2001,\"Philips Imaging DD 001\",08)(2001,\"Philips Imaging DD 001\",09)(2001,\"Philips Imaging DD 001\",0a)(2001,\"Philips Imaging DD 001\",0b)(2001,\"Philips Imaging DD 001\",0c)(2001,\"Philips Imaging DD 001\",0e)(2001,\"Philips Imaging DD 001\",0f)(2001,\"Philips Imaging DD 001\",10)(2001,\"Philips Imaging DD 001\",11)(2001,\"Philips Imaging DD 001\",12)(2001,\"Philips Imaging DD 001\",13)(2001,\"Philips Imaging DD 001\",14)(2001,\"Philips Imaging DD 001\",15)(2001,\"Philips Imaging DD 001\",16)(2001,\"Philips Imaging DD 001\",17)(2001,\"Philips Imaging DD 001\",18)(2001,\"Philips Imaging DD 001\",19)(2001,\"Philips Imaging DD 001\",1a)(2001,\"Philips Imaging DD 001\",1b)(2001,\"Philips Imaging DD 001\",1c)(2001,\"Philips Imaging DD 001\",1d)(2001,\"Philips Imaging DD 001\",1f)(2001,\"Philips Imaging DD 001\",20)(2001,\"Philips Imaging DD 001\",21)(2001,\"Philips Imaging DD 001\",22)(2001,\"Philips Imaging DD 001\",23)(2001,\"Philips Imaging DD 001\",24)(2001,\"Philips Imaging DD 001\",25)(2001,\"Philips Imaging DD 001\",26)(2001,\"Philips Imaging DD 001\",2d)(2001,\"Philips Imaging DD 001\",32)(2001,\"Philips Imaging DD 001\",33)(2001,\"Philips Imaging DD 001\",35)(2001,\"Philips Imaging DD 001\",36)(2001,\"Philips Imaging DD 001\",3f)(2001,\"Philips Imaging DD 001\",58)(2001,\"Philips Imaging DD 001\",5f)(2001,\"Philips Imaging DD 001\",60)(2001,\"Philips Imaging DD 001\",61)(2001,\"Philips Imaging DD 001\",62)(2001,\"Philips Imaging DD 001\",63)(2001,\"Philips Imaging DD 001\",67)(2001,\"Philips Imaging DD 001\",77)(2001,\"Philips Imaging DD 001\",7b)(2001,\"Philips Imaging DD 001\",81)(2001,\"Philips Imaging DD 001\",9f)(2001,\"Philips Imaging DD 001\",a1)(2001,\"Philips Imaging DD 001\",f1)(2001,\"Philips Imaging DD 001\",f2)(2005,\"PHILIPS MR IMAGING DD 001\",05)(2005,\"PHILIPS MR IMAGING DD 001\",1e)(2005,\"PHILIPS MR IMAGING DD 001\",1f)(2005,\"PHILIPS MR IMAGING DD 001\",20)(2005,\"PHILIPS MR IMAGING DD 001\",2d)(2005,\"PHILIPS MR IMAGING DD 001\",83)(2005,\"PHILIPS MR IMAGING DD 001\",a1)(2005,\"PHILIPS MR IMAGING DD 001\",b0)(2005,\"PHILIPS MR IMAGING DD 001\",b1)(2005,\"PHILIPS MR IMAGING DD 001\",b2)(2005,\"Philips MR Imaging DD 001\",05)(2005,\"Philips MR Imaging DD 001\",1e)(2005,\"Philips MR Imaging DD 001\",1f)(2005,\"Philips MR Imaging DD 001\",20)(2005,\"Philips MR Imaging DD 001\",2d)(2005,\"Philips MR Imaging DD 001\",83)(2005,\"Philips MR Imaging DD 001\",a1)(2005,\"Philips MR Imaging DD 001\",b0)(2005,\"Philips MR Imaging DD 001\",b1)(2005,\"Philips MR Imaging DD 001\",b2)(2005,\"Philips MR Imaging DD 005\",02)(2011,\"FDMS 1.0\",11)(3f01,\"INTELERAD MEDICAL SYSTEMS\",01)(3f01,\"INTELERAD MEDICAL SYSTEMS\",02)(3f01,\"INTELERAD MEDICAL SYSTEMS\",03)(3f01,\"INTELERAD MEDICAL SYSTEMS\",04)(3f01,\"INTELERAD MEDICAL SYSTEMS\",05)(3f01,\"INTELERAD MEDICAL SYSTEMS\",06)(3f01,\"INTELERAD MEDICAL SYSTEMS\",07)(3f01,\"INTELERAD MEDICAL SYSTEMS\",08)(4009,\"SIEMENS ISI\",01)(4009,\"SIEMENS ISI\",20)(4009,\"SIEMENS ISI\",30)(4009,\"SIEMENS ISI\",70)(4009,\"SIEMENS ISI\",e0)(4009,\"SIEMENS ISI\",e1)(4009,\"SIEMENS ISI\",e3)(50F1,\"FDMS 1.0\",06)(50F1,\"FDMS 1.0\",07)(50F1,\"FDMS 1.0\",08)(50F1,\"FDMS 1.0\",09)(50F1,\"FDMS 1.0\",10)(50F1,\"FDMS 1.0\",20)(6001,\"PHILIPS MR/LAST\",00)(6001-o-60ff,\"DLX_LKUP_01\",01)(6001-o-60ff,\"DLX_LKUP_01\",02)(6001-o-60ff,\"PAPYRUS 3.0\",00)(6001-o-60ff,\"PAPYRUS 3.0\",01)(6001-o-60ff,\"PAPYRUS 3.0\",10)(6001-o-60ff,\"PAPYRUS 3.0\",11)(6001-o-60ff,\"PAPYRUS 3.0\",40)(6001-o-60ff,\"PAPYRUS 3.0\",50)(6001-o-60ff,\"PAPYRUS 3.0\",60)(6001-o-60ff,\"PAPYRUS 3.0\",70)(6001-o-60ff,\"PAPYRUS 3.0\",72)(6001-o-60ff,\"PAPYRUS 3.0\",74)(6001-o-60ff,\"PAPYRUS 3.0\",76)(6001-o-60ff,\"PAPYRUS 3.0\",78)(6001-o-60ff,\"PAPYRUS 3.0\",80)(6001-o-60ff,\"PAPYRUS 3.0\",82)(6001-o-60ff,\"PAPYRUS 3.0\",a0)(6001-o-60ff,\"PAPYRUS 3.0\",a2)(6001-o-60ff,\"PAPYRUS 3.0\",a4)(6001-o-60ff,\"PAPYRUS 3.0\",b0)(6001-o-60ff,\"PAPYRUS 3.0\",b2)(6001-o-60ff,\"PAPYRUS 3.0\",ba)(6001-o-60ff,\"PAPYRUS 3.0\",bc)(6001-o-60ff,\"PAPYRUS 3.0\",c0)(6021,\"SIEMENS CM VA0 CMS\",00)(6021,\"SIEMENS CM VA0 CMS\",10)(6021,\"SIEMENS CT VA0 OST\",00)(6021,\"SIEMENS CT VA0 OST\",10)(7001,\"Picker NM Private Group\",01)(7001,\"Picker NM Private Group\",02)(7001,\"SIEMENS MED\",10)(7001-o-70ff,\"DLX_ANNOT_01\",04)(7001-o-70ff,\"DLX_ANNOT_01\",05)(7001-o-70ff,\"DLX_ANNOT_01\",07)(7003,\"SIEMENS MED\",10)(7005,\"SIEMENS MED\",10)(7FE1,\"SIEMENS CSA NON-IMAGE\",10)(7FE1,\"SPI-P Release 1\",10)(7fe1,\"SIEMENS CM VA0 CMS\",00)(7fe3,\"SIEMENS NUMARIS II\",00)(7fe3,\"SIEMENS NUMARIS II\",10)(7fe3,\"SIEMENS NUMARIS II\",20)(7ff1,\"TOSHIBA_MEC_1.0\",01)(7ff1,\"TOSHIBA_MEC_1.0\",02)(7ff1,\"TOSHIBA_MEC_1.0\",03)(7ff1,\"TOSHIBA_MEC_1.0\",10)(7ff1,\"TOSHIBA_MEC_CT_1.0\",01)(7ff1,\"TOSHIBA_MEC_CT_1.0\",02)(7ff1,\"TOSHIBA_MEC_CT_1.0\",03)(7ff1,\"TOSHIBA_MEC_CT_1.0\",04)(7ff1,\"TOSHIBA_MEC_CT_1.0\",05)(7ff1,\"TOSHIBA_MEC_CT_1.0\",07)(7ff1,\"TOSHIBA_MEC_CT_1.0\",08)(7ff1,\"TOSHIBA_MEC_CT_1.0\",09)(7ff1,\"TOSHIBA_MEC_CT_1.0\",0a)(7ff1,\"TOSHIBA_MEC_CT_1.0\",0b)(7ff1,\"TOSHIBA_MEC_CT_1.0\",0c)(7ff1,\"TOSHIBA_MEC_CT_1.0\",0d)';\nexport const nameBlob =\n \"GenericGroupLengthIllegalGroupLengthIllegalPrivateCreatorUnknownISICommandFieldAttachIDApplicationCodeAttachIDMessageCountAttachIDDateAttachIDTimeMessageTypeMaxWaitingDateMaxWaitingTimeUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownFileLocationFileSizeAlternateImageSequenceAnonymizerUIDMapAnonymizerUIDKeyAnonymizerUIDValueAnonymizerPatientIDMapAnonymizerPatientIDKeyAnonymizerPatientIDValueImageControlUnitImageUIDRouteImageUIDImageDisplayInformationVersionNoPatientInformationVersionNoFilmUIDExposureUnitTypeCodeKanjiHospitalNameDistributionCodeKanjiDepartmentNameBlackeningProcessFlagCRHeaderInformationUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownStudyFlagsStudyTypeUnknownUnknownSeriesFlagsUserOrientationInitiationTypeInitiationDelayInitiationCountRateNumberEnergySetsNumberDetectorsUnknownUnknownSeriesCommentsTrackBeatAverageDistancePrescribedUnknownGantryLocusTypeStartingHeartRateRRWindowWidthRRWindowOffsetPercentCycleImagedUnknownPatientFlagsPatientCreationDatePatientCreationTimeFullFidelitySuiteIdProductIdUnknownUnknownUnknownImageActualDateUnknownServiceIdMobileLocationNumberUnknownEquipmentUIDGenesisVersionNowExamRecordChecksumUnknownActualSeriesDataTimeStampExposureChannelExposureStartTimeSIENETGeneralPurposeIMGEFUnknownOriginalFileNameOriginalFileLocationDataSetIdentifierSPIReleaseUnknownNumberOfMeasurementsStorageModeEvaluationMaskImageLastMoveDateLastMoveTimeGeneratorIdentificationLabelGantryIdentificationLabelX-RayTubeIdentificationLabelDetectorIdentificationLabelDASIdentificationLabelSMIIdentificationLabelCPUIdentificationLabelHeaderVersionUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownRISPatientInfoIMGEFRecognitionCodeByteOffsetOfOriginalHeaderLengthOfOriginalHeaderByteOffsetOfPixelmatrixLengthOfPixelmatrixInBytesUnknownUnknownPDMEFIDPlaceholderPDMDataObjectTypeExtensionSIENETCommandFieldReceiverPLATransferPriorityActualUserCommentsSPIImageUIDDataObjectTypeDataObjectSubtypeCommentsSPIImageUIDDataObjectTypeDataObjectSubtypeCommentsSPIImageUIDDataObjectTypeDataObjectSubtypeDataObjectRecognitionCodeImageDataConsistenceUnknownUnknownUniqueIdentifierUnknownUnknownUnknownPACSUniqueIdentifierClusterUniqueIdentifierSystemUniqueIdentifierUnknownStudyUniqueIdentifierSeriesUniqueIdentifierUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownPrivateGroupLengthPrivateCreatorPatientDOBSeriesTypeEffectiveSeriesDurationNumBeatsRadioNuclideNameUnknownDatasetNameDatasetTypeDetectorNumberEnergyNumberRRIntervalWindowNumberMGBinNumberRadiusOfRotationDetectorCountZoneNumEnergyWindowsEnergyOffsetEnergyRangeImageOrientationUseFOVMaskFOVMaskYCutoffAngleFOVMaskCutoffAngleTableOrientationROITopLeftROIBottomRightUnknownEnergyCorrectNameSpatialCorrectNameTuningCalibNameUniformityCorrectNameAcquisitionSpecificCorrectNameByteOrderPictureFormatPixelScalePixelOffsetFOVShapeDatasetFlagsThresholdCenterThresholdWidthInterpolationTypePeriodElapsedTimePatientStatusUnknownRegistrationDateRegistrationTimeUnknownUsedPatientWeightOrganCodePatientUIDPatientIDCaseIDRequestIDExaminationUIDPatientRegistrationDatePatientRegistrationTimePatientLastNamePatientFirstNamePatientHospitalStatusCurrentLocationTimePatientInsuranceStatusPatientBillingTypePatientBillingAddressFluoroTimerPtopDoseAreaProductPtopTotalSkinDoseUnknownPatientInitialPuckCounterSPIDataObjectTypeFluoroTimerAFluoroSkinDoseATotalSkinDoseAFluoroDoseAreaProductATotalDoseAreaProductAFluoroTimerBFluoroSkinDoseBTotalSkinDoseBFluoroDoseAreaProductBTotalDoseAreaProductBPatientUIDPatientIDPatientRegistrationDatePatientRegistrationTimePatientnameRISPatientprenameRISPatientHospitalStatusMedicalAlertsContrastAllergiesOrganAllergyIndicationPregnancyOrganAllergyIndicationPregnancyOrganAllergyIndicationPregnancyPatientEntryIDUnknownUnknownUnknownUnknownUnknownUnknownUnknownDigitalFOVUnknownUnknownAutoTrackPeakAutoTrackWidthTransmissionScanTimeTransmissionMaskWidthCopperAttenuatorThicknessUnknownUnknownTomoViewOffsetStudyCommentsModifyingPhysicianModificationDateModificationTimePatientNamePatientIdPatientBirthdatePatientWeightPatientsMaidenNameReferringPhysicianAdmittingDiagnosisPatientSexProcedureDescriptionRestDirectionPatientPositionViewDirectionUnknownUnknownUnknownUnknownUnknownUnknownUnknownStenosisCalibrationRatioStenosisMagnificationCardiacCalibrationRatioExtendedBodyPartExtendedViewPositionImagesSOPClassCRImageParamsCommonCRImageIPParamsSingleCRImageIPParamsLeftCRImageIPParamsRightUnknownImageBlankingShapeImageBlankingLeftVerticalEdgeImageBlankingRightVerticalEdgeImageBlankingUpperHorizontalEdgeImageBlankingLowerHorizontalEdgeCenterOfCircularImageBlankingRadiusOfCircularImageBlankingMaximumImageFrameSizeRouteAETPCRPrintScalePCRPrintJobEndPCRNoFilmCopiesPCRFilmLayoutPositionPCRPrintReportNameRADProtocolPrinterRADProtocolMediumUnprocessedFlagKeyValuesDestinationPostprocessingFunctionVersionRangingModeAbdomenBrightnessFixedBrightnessDetailContrastContrastBalanceStructureBoostStructurePreferenceNoiseRobustnessNoiseDoseLimitNoiseDoseStepNoiseFrequencyLimitWeakContrastLimitStrongContrastLimitStructureBoostOffsetSmoothGainMeasureField1MeasureField2KeyPercentile1KeyPercentile2DensityLUTBrightnessGammaAngleValueLArmAngleValuePArmAngleValueCArmAngleLabelLArmAngleLabelPArmAngleLabelCArmProcedureNameExamNamePatientSizeRecordViewInjectorDelayAutoInjectAcquisitionModeCameraRotationEnabledReverseSweepSpatialFilterStrengthZoomFactorXZoomCenterYZoomCenterFocusDoseSideMarkPercentageLandscapeExposureDurationKanjiBodyPartForExposureKanjiMenuNameImageProcessingTypeEDRModeRadiographersCodeSplitExposureFormatNoOfSplitExposureFramesReadingPositionSpecificationReadingSensitivityCenterFilmAnnotationCharacterString1FilmAnnotationCharacterString2CREDRModeCRLatitudeCRGroupNumberCRImageSerialNumberCRBarCodeNumberCRFilmOutputExposuresUnknownNumberOfCellsInDetectorCellNumberAtThetaCellSpacingUnknownUnknownUnknownHorizontalFrameOfReferenceSeriesContrastLastPseqStartNumberForBaselineEnd NumberForBaselineStartNumberForEnhancedScansEndNumberForEnhancedScansSeriesPlaneFirstScanRASFirstScanLocationLastScanRASLastScanLocationDisplayFieldOfViewUnknownUnknownTableSpeedMidScanTimeMidScanFlagDegreesOfAzimuthGantryPeriodXrayOnPositionXrayOffPositionNumberOfTriggersUnknownAngleOfFirstViewTriggerFrequencyScanFOVTypeUnknownUnknownUnknownUnknownUnknownStatReconFlagComputeTypeSegmentNumberTotalSegmentsRequestedInterscanDelayViewCompressionFactorUnknownUnknownTotalNumberOfRefChannelsDataSizeForScanDataReconPostProcessingFlagUnknownCTWaterNumberCTBoneNumberAcquisitionDurationUnknownNumberOfChannels1To512IncrementBetweenChannelsStartingViewNumberOfViewsIncrementBetweenViewsDependantOnNumberOfViewsProcessedFieldOfViewInDetectorCellsValueOfBackProjectionButtonSetIfFatqEstimatesWereUsedZChannelAvgOverViewsAvgOfLeftRefChannelsOverViewsMaxLeftChannelOverViewsAvgOfRightRefChannelsOverViewsMaxRightChannelOverViewsSecondEchoNumberOfEchosTableDeltaContiguousUnknownUnknownPeakSARMonitorSARUnknownCardiacRepetition TimeImagesPerCardiacCycleActualReceiveGainAnalogActualReceiveGainDigitalDelayAfterTriggerSwapPhaseFrequencyPauseIntervalPulseTimeSliceOffsetOnFrequencyAxisCenterFrequencyTransmitGainAnalogReceiverGainDigitalReceiverGainBitmapDefiningCVsCenterFrequencyMethodUnknownPulseSequenceModePulseSequenceNamePulseSequenceDateInternalPulseSequenceNameTransmittingCoilSurfaceCoilTypeExtremityCoilFlagRawDataRunNumberCalibratedFieldStrengthSATFatWaterBoneReceiveBandwidthUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataUserDataProjectionAngleSaturationPlanesSurfaceCoilIntensityCorrectionFlagSATLocationRSATLocationLSATLocationASATLocationPSATLocationHSATLocationFSATThicknessRLSATThicknessAPSATThicknessHFPrescribedFlowAxisVelocityEncodingThicknessDisclaimerPrescanTypePrescanStatusRawDataTypeProjectionAlgorithmProjectionAlgorithmUnknownFractionalEchoPrepPulseCardiacPhasesVariableEchoFlagConcatenatedSATReferenceChannelUsedBackProjectorCoefficientPrimarySpeedCorrectionUsedOverrangeCorrectionUsedDynamicZAlphaValueUserDataUserDataUnknownVelocityEncodeScaleUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownFastPhasesUnknownUnknownTransmitGainAxialTypeSwapPhaseFrequencyPulseSequenceNameCoilTypeSATFatWaterBoneBitmapOfSATSelectionsSurfaceCoilIntensityCorrectionFlagPhaseContrastFlowAxisPhaseContrastVelocityEncodingFractionalEchoVariableEchoFlagConcatenatedSatNumberOfPhasesAPRNameFrameRateFieldOfViewFieldOfViewUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownMainMagneticFieldFlowCompensationMinimumRRIntervalMaximumRRIntervalNumberOfRejectionsNumberOfRRIntervalsArrhythmiaRejectionUnknownCycledMultipleSliceRESTUnknownFourierInterpolationUnknownPrepulsePrepulseDelayUnknownUnknownWSProtocolString1WSProtocolString2WSProtocolString3WSProtocolString4FieldOfViewCCAngulationAPAngulationLRAngulationPatientPositionPatientOrientationSliceOrientationLROffcenterCCOffcenterAPOffcenterUnknownNumberOfSlicesSliceFactorEchoTimesDynamicStudyHeartbeatIntervalRepetitionTimeFFEFFEFlipAngleNumberOfScansUnknownDynamicScanTimeBeginUnknownRepetitionTimeSERepetitionTimeIRNumberOfPhasesCardiacFrequencyInversionDelayGateDelayGateWidthTriggerDelayTimeNumberOfChemicalShiftsChemicalShiftNumberOfRowsNumberOfSamplesMagnetizationTransferContrastSpectralPresaturationWithInversionRecoveryUnknownUnknownUnknownUnknownUnknownUnknownUnknownFoldoverDirectionTransverseFoldoverDirectionSagittalFoldoverDirectionCoronalUnknownUnknownUnknownNumberOfEchoesScanResolutionWaterFatShiftArtifactReductionUnknownUnknownScanPercentageHalfscanEPIFactorTurboFactorUnknownPercentageOfScanCompletedUnknownNumberOfStacksStackTypeUnknownLROffcenterCCOffcenterAPOffcenterReconstructionResolutionResonanceFrequencyTriggerDelayTimesPrepulseTypePrepulseDelayPhaseContrastVelocityChemicalShiftNumberPhaseNumberParameterFileNameSequenceFileNameSequenceFileOwnerSequenceDescriptionEPIFileNameNetFrequencyMeasurementModeCalculationModeNoiseLevelNumberOfDataBytesDistanceSourceToSourceSideCollimatorDistanceSourceToDetectorSideCollimatorNumberOfPossibleChannelsMeanChannelNumberDetectorSpacingDetectorCenterReadingIntegrationTimeDetectorAlignmentUnknownUnknownFocusAlignmentFocalSpotDeflectionAmplitudeFocalSpotDeflectionPhaseFocalSpotDeflectionOffsetWaterScalingFactorInterpolationFactorPatientRegionPatientPhaseOfLifeOsteoOffsetOsteoRegressionLineSlopeOsteoRegressionLineInterceptOsteoStandardizationCodeOsteoPhantomNumberUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownFeedPerRotationPulmoTriggerLevelExpiratoricReserveVolumeVitalCapacityPulmoWaterPulmoAirPulmoDatePulmoTimeSourceSideCollimatorApertureDetectorSideCollimatorApertureExposureTimeExposureCurrentKVPGeneratorPowerCurrentGeneratorVoltageMasterControlMaskProcessingMaskUnknownUnknownNumberOfVirtuellChannelsNumberOfReadingsUnknownNumberOfProjectionsNumberOfBytesReconstructionAlgorithmSetReconstructionAlgorithmIndexRegenerationSoftwareVersionUnknownMeasurementModeImageTypeSoftwareVersionMPMCodeLatitudeSensitivityEDRLFixSFixPresetModeRegionSubregionOrientationMarkOnFilmRotationOnDRCReaderTypeSubModalityReaderSerialNumberCassetteScaleCassetteMatrixCassetteSubmatrixBarcodeContrastTypeRotationAmountRotationCenterDensityShiftFrequencyRankFrequencyEnhancementFrequencyTypeKernelLengthKernelModeConvolutionModePLASourcePLADestinationUIDOriginalImageUnknownReaderHeaderPLAOfSecondaryDestinationUnknownUnknownMagneticFieldStrengthADCVoltageADCOffsetTransmitterAmplitudeNumberOfTransmitterAmplitudesTransmitterAttenuatorTransmitterCalibrationTransmitterReferenceReceiverTotalGainReceiverAmplifierGainReceiverPreamplifierGainReceiverCableAttenuationReceiverReferenceGainReceiverFilterFrequencyReconstructionScaleFactorReferenceScaleFactorPhaseGradientAmplitudeReadoutGradientAmplitudeSelectionGradientAmplitudeGradientDelayTimeTotalGradientDelayTimeSensitivityCorrectionLabelSaturationPhaseEncodingVectorCoronalComponentSaturationReadoutVectorCoronalComponentRFWatchdogMaskEPIReconstructionSlopeRFPowerErrorIndicatorSpecificAbsorptionRateWholeBodySpecificEnergyDoseAdjustmentStatusMaskEPICapacityEPIInductanceEPISwitchConfigurationCodeEPISwitchHardwareCodeEPISwitchDelayTimeFlowSensitivityCalculationSubmodeFieldOfViewRatioBaseRawMatrixSize2DOversamplingLines3DPhaseOversamplingPartitionsEchoLinePositionEchoColumnPositionLinesPerSegmentPhaseCodingDirectionTotalMeasurementTimeNominalTotalMeasurementTimeCurrentStartDelayTimeDwellTimeNumberOfPhasesSequenceControlMaskMeasurementStatusMaskNumberOfFourierLinesNominalNumberOfFourierLinesCurrentNumberOfFourierLinesAfterZeroFirstMeasuredFourierLineAcquisitionColumnsReconstructionColumnsArrayCoilElementNumberArrayCoilElementSelectMaskArrayCoilElementDataMaskArrayCoilElementToADCConnectArrayCoilElementNoiseLevelArrayCoilADCPairNumberArrayCoilCombinationMaskNumberOfAveragesFlipAngleNumberOfPrescansFilterTypeForRawDataFilterParameterForRawDataFilterTypeForImageDataFilterParameterForImageDataFilterTypeForPhaseCorrectionFilterParameterForPhaseCorrectionNormalizationFilterTypeForImageDataNormalizationFilterParameterForImageDataNumberOfSaturationRegionsSaturationPhaseEncodingVectorSagittalComponentSaturationReadoutVectorSagittalComponentEPIStimulationMonitorModeImageRotationAngleCoilIDMaskCoilClassMaskCoilPositionEPIReconstructionPhaseEPIReconstructionSlopeAcquiredPlaneDefaultTableIsoCenterHeightSceneFlagRefPhotofileFlagSceneNameAcquisitionIndexMixedPulseModeNoOfPositionsNoOfPhasesFrameRateForPositionsNoOfFramesForPositionsSteppingDirectionUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownImageTransferDelayInversFlagUnknownUnknownBlankingCircleDiameterStandDataValidTableTiltTableAxisRotationTableLongitudalPositionTableSideOffsetTableIsoCenterHeightUnknownCollimationDataValidPeriSequenceNoPeriTotalScenesPeriOverlapTopPeriOverlapBottomRawImageNumberXRayDataValidUnknownUnknownUnknownFillingAverageFactorUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownIntensifierLevelCalibrationFactorNativeReviewFlagSceneNumberAcquisitionModeAcquisitonFrameRateECGFlagAdditionalSceneDataFileCopyFlagPhlebovisionFlagCo2FlagMaxSpeedStepWidthDigitalAcquisitionZoomInternalOfflineUIDInternalInternalInternalInternalInternalInternalInternalInternalSystemCalibFactorPlaneAXRayParameterSetNoXRaySystemUnknownAcquiredDisplayModeAcquisitionDelayUnknownMaxFramesLimitMaximumFrameSizeNIUSubtractedFilterTypeFilterFactorNativeAnatomicBackgroundFactorWindowUpperLimitNativeWindowLowerLimitNativeWindowBrightnessPhase1WindowBrightnessPhase2WindowContrastPhase1WindowContrastPhase2FilterFactorSubPeakOpacifiedMaskFrameBIHFrameCentBeamAngulationCaudCranCentBeamAngulationLRAnteriorLongitudinalPositionSideOffsetIsoCenterHeightImageTwistSourceImageDistanceMechanicalMagnificationFactorCalibrationFlagCalibrationAngleCranCaudCalibrationAngleRAOLAOCalibrationTableToFloorDistCalibrationIsocenterToFloorDistCalibrationIsocenterToSourceDistCalibrationSourceToIICalibrationIIZoomCalibrationIIFieldCalibrationFactorCalibrationObjectToImageDistanceCalibrationSystemFactorCalibrationSystemCorrectionCalibrationSystemIIFormatsCalibrationGantryDataValidCollimatorSquareBreadthCollimatorSquareHeightCollimatorSquareDiameterCollimaterFingerTurnAngleCollimaterFingerPositionCollimaterDiaphragmTurnAngleCollimaterDiaphragmPosition1CollimaterDiaphragmPosition2CollimaterDiaphragmModeCollimaterBeamLimitBreadthCollimaterBeamLimitHeightCollimaterBeamLimitDiameterX-RayControlMOdeX-RaySystemFocalSpotExposureControlXRayVoltageXRayCurrentXRayCurrentTimeProductXRayPulseTimeXRaySceneTimeFluoroClockMaximumPulseRatePulsesPerSceneDoseAreaProductOfSceneDoseDoseRateIIToCoverDistanceLastFramePhase1FrameRatePhase1LastFramePhase2FrameRatePhase2LastFramePhase3FrameRatePhase3LastFramePhase4FrameRatePhase4GammaOfNativeImageGammaOfTVSystemPixelshiftXPixelshiftYMaskAverageFactorBlankingCircleFlagCircleRowStartCircleRowEndCircleColumnStartCircleColumnEndCircleDiameterRectangularCollimaterFlagRectangleRowStartRectangleRowEndRectangleColumnStartRectangleColumnEndRectangleAngulationIrisCollimatorFlagIrisRowStartIrisRowEndIrisColumnStartIrisColumnEndIrisAngulationNumberOfFramesPlaneInternalInternalInternalInternalInternalInternalInternalInternalInternalInternalInternalAnatomicBackgroundAutoWindowBaseInternalInternalInternalInternalInternalInternalInternalInternalInternalInternalSystemCalibFactorPlaneBUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownReviewModeAnatomicalBackgroundPercentNumberOfPhasesApplyAnatomicalBackgroundPixelShiftArrayBrightnessContrastEnabledNativeEdgeEnhancementPercentGainNativeEdgeEnhancementLUTIndexNativeEdgeEnhancementKernelSizeSubtrEdgeEnhancementPercentGainSubtrEdgeEnhancementLUTIndexSubtrEdgeEnhancementKernelSizeFadePercentFlippedBeforeLateralityAppliedApplyFadeZoomPanXPanYNativeEdgeEnhancementAdvPercGainSubtrEdgeEnhancementAdvPercGainInvertFlagQuant1KOverlayOriginalResolutionAutoWindowCenterAutoWindowWidthUnknownUnknownUnknownMainsFrequencyOriginalPixelDataQualityECGTriggeringECG1OffsetECG2Offset1ECG2Offset2VideoScanModeVideoLineRateXrayTechniqueImageIdentifierFromatIrisDiaphragmFilterCineParallelCineMasterExposureChannelExposureChannelFirstImageProcessingChannelAcquisitionDelayRelativeImageTimeVideoWhiteCompressionAngulationRotationPhysiologicalDataTypePhysiologicalDataChannelAndKindSampleBitsAllocatedSampleBitsStoredSampleHighBitSampleRepresentationSmallestSampleValueLargestSampleValueNumberOfSamplesSampleDataSampleRatePhysiologicalDataType2PhysiologicalDataChannelAndKind2SampleBitsAllocated2SampleBitsStored2SampleHighBit2SampleRepresentation2SmallestSampleValue2LargestSampleValue2NumberOfSamples2SampleData2SampleRate2UnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownECGTimeMapDataBitsAllocatedECGTimeMapDataBitsStoredECGTimeMapDataHighBitECGTimeMapDataRepresentationECGTimeMapDataSmallestDataValueECGTimeMapDataLargestDataValueECGTimeMapDataNumberOfDataValuesECGTimeMapDataUnknownUnknownVideoBeamBoostChannelGeneratingVideoSyncVideoGainVideoOffsetRTDDataCompressionFactorAECFieldAECFilmScreenAECDensityPatientThicknessBeamDistanceWorkstationNumberTubeNumberBuckyGridFocusChildCollimatorDistanceXCollimatorDistanceYCentralBeamHeightBuckyAngleCArmAngleCollimatorAngleFilterNumberFilterMaterial1FilterMaterial2FilterThickness1FilterThickness2BuckyFormatObjectPositionDeskCommandExtendedExposureTimeActualExposureTimeExtendedXRayTubeCurrentUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownOrientationHeadFeetViewDirectionOrientationSupineProneUnknownUnknownTimeUnknownRETIRED_SourceImageIDsImageSequenceNumberFCRImageIDSetNoImageNoInTheSetPairProcessingInformationEquipmentTypeSpecificInformationSeriesFromWhichPrescribedGenesisVersionNowSeriesRecordChecksumUnknownUnknownGenesisVersionNowAcqReconRecordChecksumTableStartLocationSeriesFromWhichPrescribedImageFromWhichPrescribedScreenFormatAnatomicalReferenceForScoutUnknownLocationsInAcquisitionGraphicallyPrescribedRotationFromSourceXRotRotationFromSourceYRotRotationFromSourceZRotImagePositionImageOrientationIntegerSlopIntegerSlopIntegerSlopIntegerSlopIntegerSlopFloatSlopFloatSlopFloatSlopFloatSlopFloatSlopUnknownUnknownAutoWindowLevelAlphaAutoWindowLevelBetaAutoWindowLevelWindowAutoWindowLevelLevelTubeFocalSpotPositionBiopsyPositionBiopsyTLocationBiopsyRefLocationExposureNumberUnknownUnknownUnknownSliceGapStackRadialAngleReconstructionNumberImageTypeSliceNumberEchoNumberPatientReferenceIDChemicalShiftNumberPhaseNumberDynamicScanNumberNumberOfRowsInObjectRowNumberUnknownScanDateScanTimeSliceGapReconstructionNumberSliceNumberFoVImageMagnificationFactorImageScrollOffsetImagePixelOffsetViewDirectionPatientRestDirectionImagePositionImageNormalImageDistanceImagePositioningHistoryMaskImageRowImageColumnPatientOrientationSet1PatientOrientationSet2StudyNameStudyTypeRotationAngleStartAngleUnknownTopogramTubePositionLengthOfTopogramTopogramCorrectionFactorMaximumTablePositionTableMoveDirectionCodeVOIStartRowVOIStopRowVOIStartColumnVOIStopColumnVOIStartSliceVOIStopSliceVectorStartRowVectorRowStepVectorStartColumnVectorColumnStepRangeTypeCodeReferenceTypeCodeObjectOrientationLightOrientationLightBrightnessLightContrastOverlayThresholdSurfaceThresholdGreyScaleThresholdUnknownUnknownUnknownCreationMaskEvaluationMaskExtendedProcessingMaskUnknownUnknownUnknownUnknownUnknownUnknownZoomTargetTubeAngleROIMaskPhaseCorrectionRowsSequencePhaseCorrectionColumnsSequencePhaseCorrectionRowsReconstructionPhaseCorrectionColumnsReconstructionNumberOf3DRawPartitionsNominalNumberOf3DRawPartitionsCurrentNumberOf3DImagePartitionsActual3DImagePartitionNumberSlabThicknessNumberOfSlicesNominalNumberOfSlicesCurrentCurrentSliceNumberCurrentGroupNumberCurrentSliceDistanceFactorMIPStartRowMIPStopRowMIPStartColumnMIPStartColumnMIPStartSlice Name=MIPStartSliceOrderofSlicesSignalMaskDelayAfterTriggerRRIntervalNumberOfTriggerPulsesRepetitionTimeEffectiveGatePhaseGateThresholdGatedRatioNumberOfInterpolatedImagesNumberOfEchoesSecondEchoTimeSecondRepetitionTimeCardiacCodeSaturationPhaseEncodingVectorTransverseComponentSaturationReadoutVectorTransverseComponentEPIChangeValueOfMagnitudeEPIChangeValueOfXComponentEPIChangeValueOfYComponentEPIChangeValueOfZComponentSequenceTypeVectorSizeOriginalVectorSizeExtendedAcquiredSpectralRangeVOIPositionVOISizeCSIMatrixSizeOriginalCSIMatrixSizeExtendedSpatialGridShiftSignalLimitsMinimumSignalLimitsMaximumSpecInfoMaskEPITimeRateOfChangeOfMagnitudeEPITimeRateOfChangeOfXComponentEPITimeRateOfChangeOfYComponentEPITimeRateOfChangeOfZComponentEPITimeRateOfChangeLegalLimit1EPIOperationModeFlagEPIFieldCalculationSafetyFactorEPILegalLimit1OfChangeValueEPILegalLimit2OfChangeValueEPIRiseTimeArrayCoilADCOffsetArrayCoilPreamplifierGainSaturationTypeSaturationNormalVectorSaturationPositionVectorSaturationThicknessSaturationWidthSaturationDistanceImagesInStudyScenesInStudyImagesInPhotofilePlaneBImagesExistNoOf2MBChunksImagesInAllScenesArchiveSWInternalVersionAcquisitionTypeAcquisitionModeFootswitchIndexAcquisitionRoomCurrentTimeProductDoseSkinDosePercentSkinDoseAccumulationSkinDoseRateCopperFilterMeasuringFieldPostBlankingCircleDynaAnglesTotalStepsDynaXRayInfoModalityLUTInputGammaModalityLUTOutputGammaSH_STPARAcquisitionZoomDynaAngulationStepWidthHarmonizationDRSingleFlagSourceToIsocenterPressureDataECGIndexArrayFDFlagSH_ZOOMSH_COLPARK_FactorEVETotalSceneTimeRestoreFlagStandMovementFlagFDRowsFDColumnsTableMovementFlagOriginalOrganProgramNameCrispyXPIFilterSeriesUniqueIdentifierUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownWindowOfImagesIDWindowOfImagesTypeWindowOfImagesScopeUnknownNoiseReductionContrastAmplificationEdgeContrastBoostingLatitudeReductionFindRangeAlgorithmThresholdCAlgorithmSensometricCurveLowerWindowOffsetUpperWindowOffsetMinPrintableDensityMaxPrintableDensityBrightnessContrastShapeFactorUnknownUnknownUnknownUnknownUnknownUnknownCRExposureMenuCodeCRExposureMenuStringCREDRModeCRLatitudeCRGroupNumberCRImageSerialNumberCRBarCodeNumberCRFilmOutputExposureCRFilmFormatCRSShiftStringCRSShiftCRCShiftCRGTCRGACRGCCRGSCRRTCRRECRRNCRDRTCRDRECRDRNCRORECRORNCRORDCRCassetteSizeCRMachineIDCRMachineTypeCRTechnicianCodeCREnergySubtractionParametersCRExposureMenuCodeCRExposureMenuStringCREDRModeCRLatitudeCRGroupNumberCRImageSerialNumberCRBarCodeNumberCRFilmOutputExposureCRFilmFormatCRSShiftStringCRSShiftCRCShiftCRGTCRGACRGCCRGSCRRTCRRECRRNCRDRTCRDRECRDRNCRORECRORNCRORDCRCassetteSizeCRMachineIDCRMachineTypeCRTechnicianCodeCREnergySubtractionParametersCRDistributionCodeCRShuttersAppliedNumberOfSeriesInStudyNumberOfUnarchivedSeriesReferenceImageFieldSummaryImageStartTimeSecsInFirstAxialNumberOfUpdatesToHeaderIndicatesIfStudyHasCompleteInfoHorizontalCalibrationPixelSizeVerticalCalibrationPixelSizeCalibrationObjectCalibrationObjectSizeCalibrationMethodFilenameFrameNumberCalibrationFactorMultiplicityCalibrationTODValueUnknownUnknownImageLateralityLetterPositionBurnedInAnnotationUnknownImageSOPClassWorkspaceIDWorkspaceTimeStringWorkspaceStreamRelativeLightEmissionAmountSkTermOfCorrectionForEachIPTypeStReadingGainGpUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownLastPulseSequenceUsedImagesInSeriesLandmarkCounterNumberOfAcquisitionsIndicatesNumberOfUpdatesToHeaderSeriesCompleteFlagNumberOfImagesArchivedLastImageNumberUsedPrimaryReceiverSuiteAndHostViewNativeOriginalSeriesNumberOriginalImageNumberWinCenterWinWidthWinBrightnessWinContrastOriginalFrameNumberOriginalMaskFrameNumberOpacOriginalNumberOfFramesOriginalSceneDurationIdentifierLOIDOriginalSceneVFRInfoOriginalFrameECGPositionOriginalECG1stFrameOffset_retiredZoomFlagFlexNumberOfMaskFramesNumberOfFillFramesSeriesNumberImageNumberOriginalImageNotProcessedImageCutOutImageDuplicatedImageStoredImageRetrievedImageRemoteImageMediaStoredImageImageStateSourceImageFileUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownImageArchiveFlagScoutTypeVmaMampVmaPhaseVmaModVmaClipSmartScanOnOffFlagForeignImageRevisionImagingModePulseSequenceImagingOptionsPlaneTypeObliquePlaneRASLetterOfImageLocationImageLocationCenterRCoordOfPlaneImageCenterACoordOfPlaneImageCenterSCoordOfPlaneImageNormalRCoordNormalACoordNormalSCoordRCoordOfTopRightCornerACoordOfTopRightCornerSCoordOfTopRightCornerRCoordOfBottomRightCornerACoordOfBottomRightCornerSCoordOfBottomRightCornerTableStartLocationTableEndLocationRASLetterForSideOfImageRASLetterForAnteriorPosteriorRASLetterForScoutStartLocRASLetterForScoutEndLocImageDimensionXImageDimensionYNumberOfExcitationsUnknownUnknownUnknownUnknownUnknownUnknownUnknownNumberOfSeriesNumberOfStudiesOldestSeriesNewestSeriesOldestStudyNewestStudyUnknownUnknownUnknownUnknownUnknownCommentlineEdgeEnhancementCoefficientSceneTextImageTextPixelShiftHorizontalPixelShiftVerticalUnknownEdgeEnhancementSequenceConvolutionKernelSizeConvolutionKernelCoefficientsEdgeEnhancementGainUnknownUnknownUnknownUnknownImageScanningDirectionExtendedReadingSizeValueMagnificationReductionRatioLineDensityCodeDataCompressionCodeLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsLowerRangeOfPixelsUpperRangeOfPixelsLengthOfTotalHeaderInBytesVersionOfHeaderStructureAdvantageCompOverflowAdvantageCompUnderflowNumberOfExposureResultsImageCompressionFractionImageQualityImageBytesTransferredJ2cParameterTypeJ2cPixelRepresentationJ2cBitsAllocatedJ2cPixelShiftValueJ2cPlanarConfigurationJ2cRescaleInterceptPixelDataMD5SumPerFrameHistogramPercentileLabelsHistogramPercentileValuesUnknownUnknownUnknownOriginalMeasuringDataOriginalMeasuringDataLengthOriginalMeasuringRawDataOriginalMeasuringRawDataLengthFPMinFPMaxScaledMinimumScaledMaximumWindowMinimumWindowMaximumUnknownUnknownUnknownUnknownViewCenterViewSizeViewZoomViewTransformUnknownUnknownUnknownUnknownUnknownUnknownUnknownScanResolutionFieldOfViewSliceThicknessWindowStyleUnknownUnknownPixelQualityCodePixelQualityValueArchiveCodeExposureCodeSortCodeUnknownSplashCSAImageHeaderTypeCSAImageHeaderVersionCSAImageHeaderInfoCSASeriesHeaderTypeCSASeriesHeaderVersionCSASeriesHeaderInfoCSADataTypeCSADataVersionCSADataInfoPhotometricInterpretationRowsOfSubmatrixColumnsOfSubmatrixUnknownUnknownOriginOfSubmatrixShutterTypeRowsOfRectangularShutterColumnsOfRectangularShutterOriginOfRectangularShutterRadiusOfCircularShutterOriginOfCircularShutterContourOfIrregularShutterListOfGroupNumbersListOfShadowOwnerCodesListOfElementNumbersListOfTotalDisplayLengthListOfDisplayPrefixListOfDisplayPostfixListOfTextPositionListOfTextConcatenationListOfGroupNumbersListOfShadowOwnerCodesListOfElementNumbersListOfTotalDisplayLengthListOfDisplayPrefixListOfDisplayPostfixListOfTextPositionListOfTextConcatenationMedComHeaderTypeMedComHeaderVersionMedComHeaderInfoMedComHistoryInformationPMTFInformation1PMTFInformation2PMTFInformation3PMTFInformation4PMTFInformation5ApplicationHeaderSequenceApplicationHeaderTypeApplicationHeaderIDApplicationHeaderVersionApplicationHeaderInfoWorkflowControlFlagsArchiveManagementFlagKeepOnlineArchiveManagementFlagDoNotArchiveImageLocationStatusEstimatedRetrieveTimeDataSizeOfRetrievedImagesSiemensLinkSequenceReferencedTagReferencedTagTypeReferencedValueLengthReferencedObjectDeviceTypeReferencedObjectDeviceLocationReferencedObjectDeviceIDSeriesWorkflowStatusMEDCOMOOGTypeMEDCOMOOGVersionMEDCOMOOGInfoCompressionAlgorithmCompressionAlgorithmCompressionAlgorithmUnknownPixelAspectRatioProcessedPixelDataQualityUnknownUnknownUnknownUnknownUnknownWindowIDVideoInvertSubtractedVideoInvertNonsubtractedWindowSelectStatusECGDisplayPrintingIDECGDisplayPrintingECGDisplayPrintingEnableStatusECGDisplayPrintingSelectStatusPhysiologicalDisplayIDPreferredPhysiologicalChannelDisplayPhysiologicalDisplayEnableStatusPhysiologicalDisplaySelectStatusFunctionalShutterIDFieldOfShutterFieldOfShutterRectangleShutterEnableStatusShutterSelectStatusZoomIDZoomRectangleZoomFactorZoomFunctionZoomEnableStatusZoomSelectStatusMagnifyingGlassIDMagnifyingGlassRectangleMagnifyingGlassFactorMagnifyingGlassFunctionMagnifyingGlassEnableStatusMagnifyingGlassSelectStatusSubtractionMaskIDMaskingFunctionProprietaryMaskingParametersSubtractionMaskEnableStatusSubtractionMaskSelectStatusImageEnhancementIDImageEnhancementConvolutionIDConvolutionTypeConvolutionKernelSizeIDConvolutionKernelSizeConvolutionKernelEnhancementGainImageEnhancementEnableStatusImageEnhancementSelectStatusUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownAnnotationNameAnnotationFontAnnotationTextForegroundColorAnnotationTextBackgroundColorAnnotationTextBackingModeAnnotationTextJustificationAnnotationTextLocationAnnotationTextStringAnnotationTextAttachModeAnnotationTextCursorModeAnnotationTextShadowOffsetXAnnotationTextShadowOffsetYAnnotationLineColorAnnotationLineThicknessAnnotationLineTypeAnnotationLineStyleAnnotationLineDashLengthAnnotationLineAttachModeAnnotationLinePointCountAnnotationLinePointsAnnotationLineControlSizeAnnotationMarkerColorAnnotationMarkerTypeAnnotationMarkerSizeAnnotationMarkerLocationAnnotationMarkerAttachModeAnnotationGeomColorAnnotationGeomThicknessAnnotationGeomLineStyleAnnotationGeomDashLengthAnnotationGeomFillPatternAnnotationInteractivityAnnotationArrowLengthAnnotationArrowAngleAnnotationDontSaveUnknownLineNameLineNameFontLineNameDisplayLineNormalColorLineTypeLineThicknessLineStyleLineDashLengthLineInteractivityLineMeasurementColorLineMeasurementFontLineMeasurementDashLengthLinePointSpaceLinePointsLineControlPointSizeLineControlPointSpaceLineControlPointsLineLabelLineDontSaveROINameROINameFontROINormalColorROIFillPatternROIBpSegROIBpSegPairsROISeedSpaceROISeedsROILineThicknessROILineStyleROILineDashLengthROIInteractivityROINamePositionROINameDisplayROILabelROIShapeROIShapeTiltROIShapePointsCountROIShapePointsSpaceROIShapePointsROIShapeControlPointsCountROIShapeControlPointsSpaceROIShapeControlPointsROIDontSaveUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownStudyStatusDateTimeVerifiedExaminationReasonRequestedDateWorklistRequestStartTimeWorklistRequestEndTimeRequestedTimeRequestedLocationRequestUIDRequestingPhysicianRequestedPhysicianUnknownUnknownUnknownUnknownUnknownPatientStudyUIDReferringDepartmentScreenNumberLeftOrientationRightOrientationInversionDSAPrivateEntityNumberPrivateEntityDatePrivateEntityTimePrivateEntityLaunchCommandPrivateEntityTypeAccumulatedFluoroscopyDoseAccumulatedExposureDoseTotalDoseTotalNumberOfFramesExposureInformationSequencePapyrusCommentsPointerSequenceImagePointerPixelOffsetImageIdentifierSequenceExternalFileReferenceSequenceNumberOfImagesReferencedSOPClassUIDReferencedSOPInstanceUIDReferencedFileNameReferencedFilePathReferencedImageSOPClassUIDReferencedImageSOPInstanceUIDImageSequencePapyrusCommentsFolderTypePatientFolderDataSetIDFolderNameCreationDateCreationTimeModifiedDateModifiedTimeOwnerNameFolderStatusNumberOfImagesNumberOfOtherExternalFolderElementDSIDExternalFolderElementDataSetTypeExternalFolderElementFileLocationExternalFolderElementLengthInternalFolderElementDSIDInternalFolderElementDataSetTypeInternalOffsetToDataSetInternalOffsetToImageNumberOfHardcopiesFilmFormatFilmSizeFullFilmFormatBitmapOfPrescanOptionsGradientOffsetInXGradientOffsetInYGradientOffsetInZImageIsOriginalOrUnoriginalNumberOfEPIShotsViewsPerSegmentRespiratoryRateInBPMRespiratoryTriggerPointTypeOfReceiverUsedPeakRateOfChangeOfGradientFieldLimitsInUnitsOfPercentPSDEstimatedLimitPSDEstimatedLimitInTeslaPerSecondSARAvgHeadWindowValueTotalInputViewsXrayChainReconKernelParametersCalibrationParametersTotalOutputViewsNumberOfOverrangesIBHImageScaleFactorsBBHCoefficientsNumberOfBBHChainsToBlendStartingChannelNumberPPScanParametersGEImageIntegrityLevelValueDeltaStartTimeMaxOverrangesInAViewAvgOverrangesAllViewsCorrectedAfterglowTermsReferenceChannelsNoViewsRefChannelsBlockedScanPitchRatioUniqueImageIdentifierHistogramTablesUserDefinedDataPrivateScanOptionsEffectiveEchoSpacingStringSlopField1StringSlopField2RawDataTypeRawDataTypeRACoordOfTargetReconCentreRawDataTypeNegScanSpacingOffsetFrequencyUserUsageTagUserFillMapMSWUserFillMapLSWUser25ToUser48SlopInteger6ToSlopInteger9TriggerOnPositionDegreeOfRotationDASTriggerSourceDASFpaGainDASOutputSourceDASAdInputDASCalModeDASCalFrequencyDASRegXmDASAutoZeroStartingChannelOfViewDASXmPatternTGGCTriggerModeStartScanToXrayOnDelayDurationOfXrayOnSlopInteger10ToSlopInteger17ScannerStudyEntityUIDScannerStudyIDScannerTableEntryParadigmNameParadigmDescriptionParadigmUIDExperimentTypeNumberOfRestVolumesNumberOfActiveVolumesNumberOfDummyScansApplicationNameApplicationVersionSlicesPerVolumeExpectedTimePointsRegressorValuesDelayAfterSliceGroupReconModeFlagWordPACCSpecificInformationEDWIScaleFactorCoilIDDataGECoilNameSystemConfigurationInformationAssetRFactorsAdditionalAssetDataDebugDataTextFormatDebugDataBinaryFormatScannerSoftwareVersionLongFormPUREAcquisitionCalibrationSeriesUIDGoverningBodydBdtAndSARDefinitionPrivateInPlanePhaseEncodingDirectionFMRIBinaryDataBlockVoxelLocationSATBandLocationsSpectroPrescanValuesSpectroParametersSARDefinitionSARValueImageErrorTextSpectroQuantitationValuesSpectroRatioValuesPrescanReuseStringContentQualificationImageFilteringParametersASSETAcquisitionCalibrationSeriesUIDExtendedOptionsRxStackIdentificationNPWFactorResearchTag1ResearchTag2ResearchTag3ResearchTag4DeltaStartTimeScanPitchRatioAESAngulationRealMagnificationFactorSenographTypeIntegrationTimeROIOriginXYReceptorSizeCmXYReceptorSizePixelsXYScreenPixelPitchMicronsPixelDepthBitsBinningFactorXYClinicalViewMeanOfRawGrayLevelsMeanOfOffsetGrayLevelsMeanOfCorrectedGrayLevelsMeanOfRegionGrayLevelsMeanOfLogRegionGrayLevelsStandardDeviationOfRawGrayLevelsStandardDeviationOfCorrectedGrayLevelsStandardDeviationOfRegionGrayLevelsStandardDeviationOfLogRegionGrayLevelsMAOBufferSetNumberWindowingTypeWindowingParametersCrosshairCursorXCoordinatesCrosshairCursorYCoordinatesVignetteRowsVignetteColumnsVignetteBitsAllocatedVignetteBitsStoredVignetteHighBitVignettePixelRepresentationVignettePixelDataReconstruction Parameters SequenceVolumeVoxelCountVolumeSegmentCountVolumeSliceSizeVolumeSliceCountVolumeThresholdValueVolumeVoxelRatioVolumeVoxelSizeVolumeZPositionSizeVolumeBaseLineVolumeCenterPointVolumeSkewBaseVolumeRegistrationTransformRotationMatrixVolumeRegistrationTransformTranslationVectorKVPListXRayTubeCurrentListExposureListAcquisitionDLXIdentifierAcquisitionDLX2DSeriesSequenceContrastAgentVolumeListNumberOfInjectionsFrameCountXA3DReconstructionAlgorithmNameXA3DReconstructionAlgorithmVersionDLXCalibrationDateDLXCalibrationTimeDLXCalibrationStatusUsedFramesTransformCountTransformSequenceTransformRotationMatrixTransformTranslationVectorTransformLabelWireframeListWireframeCountLocationSystemWireframeNameWireframeGroupNameWireframeColorWireframeAttributesWireframePointCountWireframeTimestampWireframePointListWireframePointsCoordinatesVolumeUpperLeftHighCornerRASVolumeSliceToRASRotationMatrixVolumeUpperLeftHighCornerTLOCVolumeSegmentListVolumeGradientListVolumeDensityListVolumeZPositionListVolumeOriginalIndexListImageTextCurrentWardMediaTypeMediaLocationEstimatedRetrieveTimeUnknownExaminationFolderIDFolderReportedStatusFolderReportingRadiologistSIENETISAPLADataObjectAttributesDataDictionaryVersionUnknownUnknownUnknownUnknownUnknownOffsetFromCTMRImagesUltrasoundScannerNameTransducerSerialProbeApplicationRISKeyRISWorklistIMGEFRISReportIMGEFImplementationVersionRelativeTablePositionRelativeTableHeightSurviewDirectionSurviewLengthImageViewTypeBatchNumberBatchSizeBatchSliceNumberUnknownChemicalShiftChemicalShiftNumberMRDiffusionBFactorDiffusionDirectionImageEnhancedImageTypeEDESPhaseNumberImagePrepulseDelaySliceNumberMRSliceOrientationArrhythmiaRejectionCardiacCycledCardiacGateWidthCardiacSyncDiffusionEchoTimeDynamicSeriesEPIFactorNumberOfEchoesNumberOfLocationsNumberOfPCDirectionsNumberOfPhasesMRNumberOfSlicesMRPartialMatrixScannedPCVelocityPrepulseDelayPrepulseTypeReconstructionNumberMRRespirationSyncScanningTechniqueSPIRWaterFatShiftFlipAnglePhilipsSeriesIsInteractiveEchoTimeDisplayMRPresentationStateSubtractionActiveStackNumberOfSlicesStackRadialAngleStackRadialAxisStackSliceNumberStackTypeZoomModeContrastTransferTasteStackSequenceNumberOfStacksSeriesTransmittedSeriesCommittedExaminationSourceLinearPresentationGLTrafoShapeSubGLTrafoTypeAcquisitionNumberNumberOfDynamicScansPixelProcessingKernelSizeIsRawImageProspectiveMotionCorrectionRetrospectiveMotionCorrectionChemicalShiftChemicalShiftNumberMRDiffusionBFactorDiffusionDirectionImageEnhancedImageTypeEDESPhaseNumberImagePrepulseDelaySliceNumberMRSliceOrientationArrhythmiaRejectionCardiacCycledCardiacGateWidthCardiacSyncDiffusionEchoTimeDynamicSeriesEPIFactorNumberOfEchoesNumberOfLocationsNumberOfPCDirectionsNumberOfPhasesMRNumberOfSlicesMRPartialMatrixScannedPCVelocityPrepulseDelayPrepulseTypeReconstructionNumberMRRespirationSyncScanningTechniqueSPIRWaterFatShiftFlipAnglePhilipsSeriesIsInteractiveEchoTimeDisplayMRPresentationStateSubtractionActiveStackNumberOfSlicesStackRadialAngleStackRadialAxisStackSliceNumberStackTypeZoomModeContrastTransferTasteStackSequenceNumberOfStacksSeriesTransmittedSeriesCommittedExaminationSourceLinearPresentationGLTrafoShapeSubGLTrafoTypeAcquisitionNumberNumberOfDynamicScansPixelProcessingKernelSizeIsRawImageProspectiveMotionCorrectionRetrospectiveMotionCorrectionSynergyReconstructionTypeMIPProtocolMPRProtocolNumberOfChemicalShiftsNumberOfStackSlicesUnknownSyncraScanTypeDiffusionDirectionRLDiffusionDirectionAPDiffusionDirectionFHSynergyReconstructionTypeMIPProtocolMPRProtocolNumberOfChemicalShiftsNumberOfStackSlicesUnknownSyncraScanTypeDiffusionDirectionRLDiffusionDirectionAPDiffusionDirectionFHUnknownImagePosition SpecifyingFlagInstitutionCodeRoutedTransferAESourceAEDeferredValidationSeriesOwnerOrderGroupNumberStrippedPixelDataPendingMoveRequestReportIDReportStatusReportCreationDateReportApprovingPhysicianReportTextReportAuthorReportingRadiologistEnergySubtractionParamSubtractionRegistrationResultEnergySubtractionParam2AfinConversionCoefficientFilmOutputFormatImageProcessingModificationFlagUnknownGrayPaletteColorLookupTableDescriptorGrayPaletteColorLookupTableDataOverlayIDLinkedOverlaysOverlayRowsOverlayColumnsOverlayTypeOverlayOriginEditableOverlayFontOverlayStyleOverlayFontSizeOverlayColorShadowSizeFillPatternOverlayPenSizeLabelPostItTextAnchorPointROITypeAttachedAnnotationContourPointsMaskDataUINOverlaySequenceImageGraphicsFormatCodeImageGraphicsOsteoContourCommentOsteoContourBufferUnknownUnknownDummyTextAnnotationBoxArrowEndHeaderDummyCSADataPixelDataBinaryDataImageGraphicsFormatCodeImageGraphicsImageGraphicsDummyUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknownUnknown\";\n\nconst _b64 = {\n keyOff_b64:\n \"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FnYAADR2AABSdgAAcHYAAI52AACsdgAAynYAAOh2AAAGdwAAJHcAAEJ3AABgdwAAfncAAJx3AAC6dwAA2HcAAPZ3AAAUeAAAMngAAFB4AABueAAAjHgAAKp4AADIeAAA5ngAAAR5AAAieQAAQHkAAF55AAB8eQAAmnkAALh5AADWeQAA9HkAABJ6AAAwegAATnoAAGx6AACKegAAqHoAAMZ6AADkegAAAnsAACB7AAA+ewAAXHsAAHp7AACYewAAtnsAANR7AADyewAAEHwAAC58AABMfAAAanwAAIh8AACmfAAAxHwAAOJ8AAAAfQAAHn0AADx9AABafQAAeH0AAJZ9AAC0fQAA0n0AAPB9AAAOfgAALH4AAEp+AABofgAAhn4AAKR+AADCfgAA4H4AAP5+AAAcfwAAOn8AAFh/AAB2fwAAlH8AALJ/AADQfwAA7n8AAAyAAAAqgAAASIAAAGaAAACEgAAAooAAAMCAAADegAAA/IAAABqBAAA4gQAAVoEAAHSBAACSgQAAsIEAAM6BAADsgQAACoIAACiCAABGggAAZIIAAIKCAACgggAAvoIAANyCAAD6ggAAGIMAADaDAABUgwAAcoMAAJCDAACugwAAzIMAAOqDAAAIhAAAJoQAAESEAABihAAAgIQAAJ6EAAC8hAAA2oQAAPiEAAAWhQAANIUAAFKFAABwhQAAjoUAAKyFAADKhQAA6IUAAAaGAAAkhgAAQoYAAGCGAAB+hgAAnIYAALqGAADehgAAAocAACaHAABKhwAAbocAAJKHAAC2hwAA2ocAAP6HAAAiiAAARogAAGqIAACOiAAAsogAANaIAAD6iAAAHokAAEKJAABmiQAAiokAAK6JAADSiQAA9okAABqKAAA+igAAYooAAIaKAAChigAAvIoAANeKAADyigAADYsAACiLAABDiwAAXosAAHmLAACUiwAAr4sAAMqLAADliwAAAIwAABuMAAA2jAAAUYwAAGyMAACHjAAAoowAAL2MAADYjAAA84wAAA6NAAApjQAARo0AAGONAACAjQAAnY0AALqNAADXjQAA9I0AABGOAAAujgAAS44AAGiOAACFjgAAoo4AAL+OAADcjgAA+Y4AABaPAAAzjwAAUI8AAG2PAACKjwAAp48AAMiPAADpjwAACpAAACuQAABMkAAAbZAAAI6QAACvkAAA0JAAAPGQAAASkQAAM5EAAFSRAAB1kQAAlpEAALeRAADYkQAA+ZEAABqSAAA7kgAAXJIAAHuSAACikgAAyZIAAPCSAAAXkwAAPpMAAGWTAACMkwAAs5MAANqTAAABlAAAJJQAAEeUAABqlAAAjZQAALCUAADDlAAA1pQAAOmUAAD8lAAAD5UAACKVAAA1lQAASJUAAFuVAABulQAAgZUAAJSVAACnlQAAupUAAM2VAADglQAA85UAAAaWAAAZlgAALJYAAD+WAABSlgAAZZYAAHiWAACLlgAAnpYAALGWAADMlgAA55YAAAWXAAAjlwAAQZcAAF+XAAB9lwAAm5cAALmXAADXlwAA9ZcAABOYAAAxmAAAT5gAAG2YAACLmAAAm5gAALaYAADKmAAA3pgAAPKYAAAGmQAAGpkAADKZAABKmQAAYpkAAHqZAACSmQAAqpkAAMKZAADamQAA8pkAAAqaAAAimgAAOpoAAFKaAABqmgAAgpoAAJqaAACymgAAypoAAOKaAAD6mgAAEpsAACqbAABCmwAAWpsAAHKbAACKmwAAopsAALqbAADSmwAA6psAAAKcAAAanAAAMpwAAEqcAABinAAAepwAAJKcAACqnAAAwpwAANqcAADynAAADZ0AACidAABDnQAAXp0AAHmdAACWnQAAs50AANCdAADtnQAACp4AACeeAABEngAAYZ4AAH6eAACbngAAuJ4AANWeAADyngAAD58AACefAAA/nwAAXp8AAH2fAACcnwAAu58AANqfAAD5nwAAGKAAADegAABWoAAAdaAAAJSgAACzoAAA0qAAAPGgAAAQoQAAL6EAAE6hAABtoQAAjKEAAKuhAADKoQAA6aEAAAiiAAAnogAARqIAAGWiAACEogAAo6IAAMKiAADhogAAAKMAAB+jAAA+owAAXaMAAHyjAACbowAAuqMAANmjAAD4owAAF6QAADakAABVpAAAdKQAAJOkAACypAAA0aQAAPCkAAAPpQAALqUAAE2lAABspQAAi6UAAKqlAADJpQAA6KUAAP+lAAAWpgAALaYAAESmAABjpgAAgqYAAKGmAADApgAA36YAAP6mAAAdpwAAPKcAAFunAAB6pwAAmacAALinAADXpwAA9qcAABWoAAA0qAAAU6gAAHKoAACRqAAAsKgAAM+oAADuqAAADakAACypAABLqQAA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\",\n keyLen_b64:\n \"AAASABIAGQAcABcAFwAXABcAFwAXABcAFwAcABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAHAAQABAAEAAQABAAGwAbABsAHAAcABwAHAAcABwAFAAUABQAFAAUABQAFAAUABQAFAAUABQAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAA8AJAATABMAEwAWABYAHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AGQAZABcAFwAXABcAFwAXABcAFwAXABcAEgASABIAEgAZABkAGQAZABkAGQAZABkADwAPAA8ADwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAHQAdACEAIQAhACEAIQAhACEAIQAhACEAIQAbABsAGwAbABIAGQAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAfAB8AHwAfAB8AHwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAGgAaABoAGgAaABoAHgAeAB4AHgAeAB4AHgAeAB4AHgAXABcAFwAXABcAFwAXABcAFwAZABkAGQAZABkAGQAPAA8ADwAbABsAGwAbABsAHQAbABsAGAAYABgAGAAYABgAGAAYABgAGAAYABgAHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAYABgAGAATABMAEwAaABoAGgAaABwAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAFAAUABQAFAAUABQAFAAUABQAFAAUACoAKgAqACoAKgAqABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AGAAYACIAIgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdABgAGAAgACAAIAAgACAAHwAfAB8AHwAfACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAHwAnACcAJwAnACcAJwAnACcAJwAnACMAIwAjACMAIwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwAbABsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABAAGwAUABQAFAAUABQAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABsAGwAbABsAGwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AGAAYAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AFwAXABcAFwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfABoAGgAaABoAGgAaABoAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjACMAIwAjABsAGwAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAnACcAJwAnABMAEwATABMAEwATABMAEwATABMAEwATABMAEwAbABsAGwAUABQAFAAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAGAAYABgAGAAYABgAGAAlACUAJQAlACUAJQAlACUAJQAdAB0AEwATABMAEwATAB0AHQAdABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABgAGAAYABgAGAAYABgAGAAYADMAMwAzADMAMwAzADMAMwAzADMAMwAzADMAMwAzADMAMwAzADMAMwAzADMAEwATABMAEwATABMAEwATABMAEwATABQAFAAUABQAFAAUABQAFAAUABQAFAAUABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABsAGwAbABsAGwAbABsAEwATABMAEwATABMAHAAZABkAGQAZABYAFgAWABYAFgAWABYAGwAbABsAGwAaABoAGgAaABQAFAAUABQAFAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYACUAJQAlACUAJQAlACUAJQAlACUAJQAlABYAFgAWACYAJgAmACYAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAHwAfAB8AHwAfAB8AHwAfAB8AHwAeAB4AHgAeAB4AHgAhACEAIQAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIgAeAB4AHgAZABkADwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdACEAIQAhACEAIQAhACEAIQAhACcAJwAnACcAJwAnACcAJwAnACcAJwAnACcAJwApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACsAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAfAB8AHwAoACgAKAAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbACsAKwAXABcAFwAXABcAFwAXABcAFwAYABgAGAAYABgAFwAWABYAFgAWABYAFgAcABwAHAAcABwAGAAYABgAGAAYABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAGgAaABoAGgAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAB0AHQAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAfABcAJgAmACYAGwASABIAEgASABIAFAAUABQAFAAUABQAFAAXABcAFwAXABcAFwAUABQAFAAUABQAFAAUABQAFAAcACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAUACUAJQAlACUAJQAlACUAJQAXABcAFwAXABcAFwAXABQAFAAUABQAFAAUABsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHwAfAB8AHwAjACMAFwAfAB8AHwAXABcAIQAbAB8AHgAeAB4AGwAbABsAGwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgA=\",\n vrCode_b64:\n \"AAEBAgMDAwEEBQMEBQMGBgcHBwcHBwgIBgYGBgYHBgcGBggHAwICAgICAQEJCQoKCQICCwwMAQEMDQIOCw0HDwMDAwMDAwYCEBAKAhALEBAQEBAQEAIQEQIQEBAQEAIQBAUCCwsIAwMQCAsLCAoLAQEQDQUHEggICAICDwgBBAUICAgICAgICAgICAgICAgICAgIBwgHAgEBAQEICAgIAwgDCAgCAwIIAgMCAgIDCAgCAwICAgIICAgICAgICAgHCAcICAgCAgICAgICAgICAggDAwMBAggQEBACAgIQEBAQEBEQEBAQEBAQEBAQEAICAgICAhAQEREQEBEREBEREwgEBQgPBggICAgIBAUICAgFCAgIEBAQCAITEBAQEBAQEBAQEAgIBAUICAgICAICAgICAggICAgHBwcHCAgDERAQEBAREREREREICAQFAgIEDwgICAICAgIICAgICAgICA8PDwICBg4ODg4DDQYGBgYGBgEHDwcGBgcHBwIHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDw8PDQ0NDg4LBg8NBg0NBgYGBg8NBgYPAgINDQsGBgYGCwsCAgICAgIIEA8PCAcDDxMTExMTExMCDwIPDw8PDw8TEA8PDxADDw8TBggHBwcTExMTDxMDAxMQEwcTExQDEBAQEBATExMTDw8PDw8PEw8TAw8PEwMPExMTDxMTDxAPExMTEBMDEwIVAhMTExABEw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8TExMTExMTExMTExMTExMTCxMLAxMTExMPEw8TEw8PDw8PCAgGAw8PDwMHCBMICA8TExMTExMTExMTEw8TAg8PDwMDAwMDAwYGBgYGBgMDBgYHBgYGBgYGBgYGBgMDCAYGAwMGBgMHAwMHBgMDAwMDAwMGDwYGBgYGBg8GBg8GBgYPBg8ICAgIDw8PDwYGBg8PDw8GDw8GDw8PBg8PBg8PBgYPDw8PBg8GBgICBgIGDw8NBgYGBgYGBgYGAgYGBg8GBgYGBgYGBgYPDw8GBg8GDw8GBggCCAgIDwgIBgYPDwYGDw8PDw8PDwEBAQ8PCAgPDw8PBgMPDwMDAw8IDw8PDw8PBg8PDw8EBQ8PDw8PDwEDAwMGBggGBggICA8ICAgICAgICAgICAgICAgICAgICAgICAgICAMICAgBAQgICAgICA8PDw8PDwYPDw8PDw8PDw8PDw8PDw8PCA8PAw8PDw8BDw8GBg8PCA8GBgYGBgYIDw8PDwYBAQYGBgYGBgYBAQYPBgEGDwYIDwgPCA8IDwYPDw8PAQEPDw8CExAQAhMTExMTExMDAwMDAwMDAxMQAwMTEBMTExMTBxAQEBAQEBADAwMQAwMDAwMDAwMDAwMDAwMDAwMQEBATExAQEBAQExMQEwgTExMTExMTExMTEwMTEwMTAxMTExMTExMTExMTEBATExMTExMTExAQEBAQEBAQEBAQEBAQEBMTExMTExMTExMTExMTExMQEBAQEBMTEBMTEBMTExMTExMTExMQEBAQEBAQEBAQEBAQEBAQEBAQEBATExMTExMTExMTExMQEBMQExMTExMTExMQAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwcHBwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAxMTAxMTAwMDAxMTExMDEgMPDwcHBwMIAwcHBwMDAw8DDQ0NAwcDDwcNAwMHBwMDAwMHBwcHBwcHAwMDAwcHBwcHBgYGAgUCDwMCAwYIAgICAgMDAwICAwcHBwcHBwcHDwIIAwMDDwYGBgYGBgYGBgYGBgYGBgYGAgIPDwYGAg8PDwMDBgYDCAgDAwgICA8DBQ8NBg0NBg0SEwsBAxMLAQ8TExMCAxMTDw8PCwsQEBAQEA8PDw8PCAgPDw8PExMUFAYGBgYPDwYGBgYPBgYGBgYGBAUGBgYPDw8GCA0PDw8DDw8ICAgIBgYDBg8PDwYGBgYGBgYGBgYGBgYPDw8PBgYGDwgIAQEDAwMDAwMIDw8GAwYGBgYGBgYGDwYGBgYPBgYGBgYGCAMPBg8PCA8PBgYPDwYPDw8PDw8IBgYPDw8GBg8PDw8PDw8PDw8PDw8PDw8IDw8PDw8TExMTExMTAwMDAxAQEBAQAQMTExMQAwMSAxMDAxADEAMSEgMDEAMDAwMDAg8ICAIPAgIPDw8PAw8PCAgCAggNBgYPDw8PAg8CDw8PDw8PDwMDAwkJCQICAgICAwICAgIDDw8PDw8PDwMPDwMPAwMCAgICAgICAgICAwICAgIDAgIPDw8CDwMPDwMPAwMCAgICAgIDEBATExEQEw8PAg8CDgYGBgoKAgYGAgYCAhIDAwMDDQMDAxMDExMDAwMDAwMDAwMDAw0DAwMDAwMDAwMDAwMDAwMDDQMTAxMTEBATEBAQEAsDAwMDAwMDAwMDAw8CExMTEwMDAwMGBgYGBgYGBgYGAgoJCQkJCQkJCQYNDRMQExATEBATCxMTEBMQCxQUFBQUFBQUFBQUFBQUFAsLCwsUFBQDAw8PDw8CBgYVFRUVAwgHBwcIDwgIBgYGCQMPDwMDCAgNDQMNDRAPDxALCxMQEBAQEBMQEAYRERELAwMDAw8CAxEGBgYSARIBDw8PDw8PBg8PBgYGBgYPAw8PAg8PBgYICAgICAYICAgICA0CEg0CEg0CEggDAwMDAwgDAwMDAwMDCAMDCAgDCAMIAwMICAMIDQISEgIBAQ0BCQ0CAhICDQ0NDw8JFg0BDRISAg0CEggICA8PAggDCAgICA0NDQgNDQ0IAw0NCAMIDQ0IDw8DDQ0IDw8DDQ0IBwcNDQgICAgIAwMPDQ0CAQEBAQICBgYHCQkJCQkJCQkJAgMCAxAUFBQUCRERERAQEAkJCQkJCQkJCQ0NBggICAEBAQgBAQEBCAEBAQEBAREBCAEBEQEIAQEBAQEREQEKBggBCAEBAQEBCAgBAREBAREIAQYICAEBBwEHAQEBAQEBCAERAQERAQERAQkJCQEBBwcBBwEBBwcDAwMDAwcHBwcDCAcICAcNAQgEBQUFCAgICAcHBwcHCAIDCwsNAwYEBQINFBQUFAkICQEBCQkDCgoICAoKCQgDCAgEBQQFCAgBAQgDCAEIAwEBAwgICBMTExMTExMTExMPDw8PDwMDExMTExMPDxMQExMTDxAPExMDCxISEhMTCwsTEw8TFAYBAQEUBhQUEBAQEBAQEBATEBMUFAYKCw8CDgoDAwMDCwsDAxQUAwIPAgICDwIXEhcKAg0SDw8PDwIPAg8PAg0CCgIGDxISEhIPCw0PDw0PDw8GDg8GBg0PDw8PDw8PDw8SBg0PBgYDAwMDAwMSCQEBAwMQDw8DDw8QDw8PBgYCCQ8DAwINBAUNBgMJDw8CCQMDAgICEBAQCQ8PDw8SEhISEggIDQ0GCQgBCAgBAwgPDwgICwICAg8HBwsPDwsPCw8PDwMUBhQNDQ0GFAYNDQ0TDRQNEBATExAQDRQUDQYNAg0UDw0LDRMUDRMNDQEJEA0NDQ0NBgYDDRQUFAYUDQ0NBhQGDQ0NEw0UDRAQExMQEA0UFA0GDQINFA8NCw0TFA0TDQ0BCRANDQ0NDQYGAw0UFA0LCxATCQ0UFBQNCwsQEwkNFBQUCQ0CAgILAgILCwgIBAgICAgNDQ0QDQ0IAwMGCAMDAgMCAgIDAgMCAwIIAwIIAwMJCAgIAwoSCA4GBggIEhgSCBISAwMDAwMDBgYDAwMDCAMDAw==\",\n vmCode_b64:\n \"AAEBAQIBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgIBAQEBAQEBAQEBAQEBAQEBAQMBAQEBAQEEBAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAgEBAQQEAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQECAQIBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQIBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBAEBAQEBAQEBAQEBAgIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIBAQICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFAgIBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEEAQEBAQEBAQEBAQEBAQEBAQYBAQcHBgEBBgYBBwYCAgIBAQEBAQEBAQEBAQEBAQEEAQEBAQEBAQEBAQICAQEBAQEBAgECAQIBAgEHBwEBBgQGAQEBAQEBAQEBAQECAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgIBAgICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAQEBAQEBAgEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQECAgIBAQEBAQECAgICAgICAgICAgEBAQIBAQEBAQEBAQEBAQEBAQEBAgICAgIBAQIBAQEBAQEIAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAQECAQECAgEBAQECAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBgcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAQEBAQEEAQQBAQEGBgEBBgYGBgEGAQECAQEBAQEBAQEBAQEBAQEBAQEGBgEBBAQEAQEBBAQJAgICAgIBAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEHBwEBAQEBAQEBBgYGBgYBAQEBAQEBAQEBAQEBCgoBBgYHBwcBAQEBAQEBAQEBAQEBAQEBAQEGCwEMAQECAQEBAQEBAQEBAQENAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQQEAQEBAQEEAQEBAQEBAQEBAQEBAQEBAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgEBAQICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEEBAIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgIBAQEBAQEBAgEBAQEBAQEBAQEBAQQCAQICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEEAQEBAQQEAQEBAQEBBgYBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQENAQEBAQEBAQEBAQEBAQEBAQEBAQMBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgEBAQEBAgEBAQEBAQEBAQEBAQEBBAIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgEBAQIBAQEBAQEBAgEBAQICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBBgUGBgUBBgEBAQEBAQEBAQcHAQEBAQMBAQEBAQQBAQEBAQEOAwMDAwMDAwMDAwMDAwMDAw0BAQYBAQEBAQEBAQEBAQIBAQICAgECDxABAQEBBgEBBxEGBgICAQICAQESAQIBAQEBAQEBAQEBAQEBAQQEAQEBBAEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBEgYBEgYCAgIBAQIBAQEBAQEBAgEBEgYBAQEBAQEBAQEBAQYGEgEBAQEBAQIBAQEBAQEBAQEBAQEEBAEBAQEBAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBgEBAgEBAQIBAQEBAQEBAQEBBAEBAgIBAQEBEwEBAQEEBAEBAQECAQEBAgICAgICAQECAgICAQICAg==\",\n nameOff_b64:\n \"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2JkAAOmZAAD9mQAADZoAAB2aAAAxmgAAO5oAAEiaAABUmgAAapoAAHmaAACKmgAAjpoAAJuaAACrmgAAvpoAAM+aAADxmgAABJsAABSbAAAjmwAAM5sAADybAABEmwAAWZsAAGabAAB0mwAAhZsAAJSbAAClmwAAxpsAANGbAADimwAA9psAAA+cAAAZnAAANJwAAFGcAABqnAAAdZwAAICcAACWnAAAqZwAALCcAAC+nAAA0pwAAOacAAD6nAAAE50AAB6dAAApnQAAP50AAFKdAABZnQAAZ50AAHudAACPnQAAo50AAKqdAADGnQAA1Z0AAOWdAADtnQAA/50AAAqeAAAangAAK54AAD2eAABFngAAUZ4AAGOeAAB7ngAAhZ4AAJGeAAClngAAu54AANieAADvngAACJ8AABifAAA3nwAAPp8AAGOfAACCnwAAi58AAJmfAACknwAAsp8AAL2fAADKnwAA0p8AAN2fAADpnwAA+J8AAASgAAAOoAAAGaAAACegAAAsoAAANqAAAEGgAABIoAAAWqAAAGegAABvoAAAgaAAAJigAACloAAAuKAAAMqgAADRoAAA2KAAAN2gAADroAAA7qAAAPagAAD8oAAAAaEAAAihAAARoQAAG6EAADKhAAA/oQAAUaEAAFihAABfoQAAZqEAAG2hAAB0oQAAe6EAAIKhAACJoQAAkKEAAJehAACeoQAApaEAAKyhAACzoQAAuqEAAA==\",\n nameLen_b64:\n \"AAASABIAFQAHAA8AFwAUAAwADAALAA4ADgAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcADAAIABYAEAAQABIAFgAWABgAEAAIAA0AIAAbAAcAFAARABAAEwAVABMABwAHAAcABwAHAAcABwAHAAcACgAJAAcABwALAA8ADgAPABMAEAAPAAcABwAOABAAEgAHAA8AEQANAA4AEgAHAAwAEwATAAwABwAJAAcABwAHAA8ABwAJABQABwAMABEAEgAHABkADwARABkABwAQABQAEQAKAAcAFAALABMADAAMABwAGQAcABsAFgAWABYADQAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHABMADwAaABYAFwAaAAcABwASABoAEgALABAACgAIAAsADgARAAgACwAOABEACAALAA4AEQAZABQABwAHABAABwAHAAcAFAAXABYABwAVABYABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHABIADgAKAAoAFwAIABAABwALAAsADgAMABYACwAQABEAEAAMAAsAEAAKABMAEgAQAAoADgAHABEAEgAPABUAHgAJAA0ACgALAAgADAAPAA4AEQAGAAsADQAHABAAEAAHABEACQAKAAkABgAJAA4AFwAXAA8AEAAVABMAFgASABUACwATABEABwAZABEADAAPAA4AFgAVAAwADwAOABYAFQAKAAkAFwAXAA4AEQAVAA0AEQAFABEACQAFABEACQAFABEACQAOAAcABwAHAAcABwAHAAcACgAHAAcADQAOABQAFQAZAAcABwAOAA0AEgAQABAACwAJABAADQASABIAEgAKABQADQAPAA0ABwAHAAcABwAHAAcABwAYABUAFwAQABQADgATABUAEwAUAAcAEgAdAB4AIAAgAB0AHQAVAAgADQAOAA8AFQASABIAEQAPAAkAIQAHAAsAEQAPAA4ADwAOABMADwAOAA0AEwARABMAFAAKAA0ADQAOAA4ACgAKAAUADgAOAA4ADgAOAA4ADQAIAAsACgANAAoADwAVAAwAFQAKAAsACwAFAAQACAATABAAGAANABMABwARABMAFwAcABgAHgAeAAkACgANABMADwAVAAcAFwARAAsABwAHAAcAGgAOAAgAFgAVABsAGQALAAwAEQALABAAEgAHAAcACgALAAsAEAAMAA4ADwAQAAcAEAAQAAsABwAHAAcABwAHAA0ACwANABYADgAVAAcABwAYABMAFwAHAA0ADAATAAcAFgAYAAwADQAVACEAGgAbABoAFAAdABcAHgAYAAoADQAKAAoABwAHAAcACgAHABYAFQAXABgAEQASAA0ACQAaAA8ADAASABMAEQAVAAcAEQARABEAGQAQAA8AEQAQABcADwAQAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABAAIgAMAAwADAAMAAwADAAOAA4ADgASABAAEwALAA0ACwATABMABwAOAAkADQAQAA8AFAAYABoAFwASAAgACAAHABMABwAHAAcABwAHAAcABwAHAAcABwAKAAcABwAMAAkAEgARAAgADwAVACIAFQAdAA4AEAAPAA4ABwAJAAsACwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAEQAQABEAEQASABMAEwAHABMABAAHABQABwAIAA0ABwAHABEAEQARABEACwAMAAwADAAPABIAEAALAAsACwAHAA4ACwAJAAwAEQARAAwADQAHABQABwAQABAADgAQAA4ACQAJABAAFgANAAwADwAdACoABwAHAAcABwAHAAcABwAbABkAGAAHAAcABwAOAA4ADQARAAcABwAOAAgACQALAAcAGQAHAA4ACQAHAAsACwALABgAEgARAAwADQAVABMACwARABAAEQATAAsADAAPAA8ACgARACQAJgAYABEADwAOABYAEQAHAAcADgAcABgAGQASABMADQASAAsAGAAcABgAEgAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAA8AEQAYAA0ACgAIAAkACQAcAB4ADAAPABgAEAARAA4ABwAHABgAEAAHABMADQAaABwAGwAHAA8ACQAPAAcACAALAAMABAAEAAoABgAJAAsACgANAAoACwASAA0ADgARAAcADAAOAA4ADAANABQADQAMAAoADwAJAA4AEAAHAAwAGQAHAAcAFQAKAAkAFAAdABUAFgAUABEAFQAYABgAFQAXABkAFAAWABgAGgARABYAGgAtACcADgAWABUAHwASABQACwANABoAFQASAA8AEgAQABEAEwAdABAAEgAPABQAGwAbAA4ACQAOABMAFQAbABsAHQAYABIAFQAWABoAGAAcABoAFgAYABAACQAQABQAGQAWABsAHAAhACMAKAAZAC4AKAAZABIACgANAAwAFgAWAA0AGwAJABAACQAQAA4ADQAKABUAFgARAAcABwAHAAcABwAHAAcABwASAAoABwAHABYADgAJABEAFwAPABQABwAUAA4ADwAOABEADgANAAcABwAHABQABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHACEAEAALAA8AEwAHABMADAAQAAcACAAJABYACAAKAAgACAAIAAgACAAIAAgACAAXABIACgAHABMAEAAHAA4AEwAUABIAGAAWABYAFgAWABQAFAAPAA0ACQAIABoAHAAUAAoADwAKABMAHQAPABgAFgAbAB8AIAAVABEAEgARACAAFwAbABoAGgAXABYAGAAZABgAHAAcABwAFwAaABkAGwAQAAsACQAPAAsACwAWAA0AGAAQAA4AFgAEAAgAEQAPAA8ADwAPAA8ADwAPAA8AEgAPAAsACwARABIADgAMABEADwAOABkAEQAPABQAEgATABIADAAKAA8ADQAOABMACAAIAAgACAAIAAgACAAIAAgACAAIABIADgAIAAgACAAIAAgACAAIAAgACAAIABcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAKABsADgAZAA8ACgAIAAcAIAAdAB8AHwAcAB4ACwAeAAkABAAEAAQAIAAfAAoADgASABAADwAHAAcABwAOABgADQAKAAsACwANAA0ADQAVAA0ABgAMAAoADwAZABEAEAARABUACgAIABUAHwATABAADQAUABMAEgAPAAoACgAWACAAFAARAA4AFQAUABMAEAALAAsABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAbABgAFQAcAB8AHgAgAA4ABwAHAA4AGgAJAAsAGAAIAA0ACgAQAAwAEQAKAAkABQAFABMAEwARAAoACQAPAAwADwAPABAAEAALAA4ACwAUABIAFwAHAAcABwAHAAcABwAHAAcABwATAA0AFgAHAAcABAAHABYAEwAKAAUADwAZACAAGQARABQABwAHABEAFgASABkAGAAMABsABwAWABUAFgAWABYADQAQAAsACwALAAsACwAJAAkACQAJAAkABwAHABQAEwAVABQAFQAOAA8AEQAOAAcABwAHAAgAEAAUAAkACwAKABIAEwALABEAFAAJAAcACAAIAAgAFAALAAMAGAARABAADQAUAA0ACwANABsACAALABYAFgAJAAkADQAKAAcAFAAQABgAFAAWAAsACgAOAA0ADQAMAA4ADQARABAADQARABEAEAAPAA0AEAAQABIABwAHAAcADAAOABYABwAHAAcABwAHAAcABAAGAAkABwAbAB4AIQAkAB4AHgAZABwADQAVABUAEgASABoACwAKAA4ADgATAA0ADQAKABEACgAVABcACQANAAoAGgAOAA4AFAALADAAKgAZABoAGgAaAAwAEgASABUACwAHABUAFQAQABMAEwAMAB4AHwAfAB8AHgAUAB8AGwAbAAsAEgAZAA4AFgAYABMADwASAA0ADQARABEADQARABgADwAPAA8ADwASAAQADwAUAAwADAAOABIACgAKAAwAFQAWAAgADwAXAA0ADAARAAwADQAGAAcACQAIAAMADgALABEABgAJABEAGAAPABYABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAQABIAEwAHAA4AFQAUABEAEgATABAAEQARABMAEwAKAAgACwAHAAcABwAHAAcABwASABQACQAKAA0AEwAPABQADAAOAAgACAAEAAQABAAEAAQABAAEAAUABQAFAAUABQAFAA4ACwANABAAHQASABQACQAKAA0AEwAPABQADAAOAAgACAAEAAQABAAEAAQABAAEAAUABQAFAAUABQAFAA4ACwANABAAHQASABEAFQAYABMADAAZABcAHwAeABwAEQAVABEACAALAB0AEwAHAAcADwAOABIABwANAAsAEwAPAB0AHwANAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHABUADgAPABQAIAASABYAEwAbAAoAFAATAAkACAANAAsAEwAXAAQAFgAVAA4AFAAYACEACAAEABIAEgAMAAsADQARAAsADwALAA4ACwAQAAoADwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHABAACQAHAAgABgAHABIAFAALAA0ADgAJAAwAGAANABgAGAAYAAwADAAMABYAFgAWABkAGQAZABIAEAAXAB0AGQAXAA8ADwATAAcABwAHAAcABwAHAAcADgAPAAwADAALAAsABwAHAAcABwAHAAsAGgAJAAkAFAASAAcAFwAVAB0AEwAHAAcABwAHABYAGAAbAA8AEwASABIAEgASABIAEgASABIAEgASABIAGgAYABUAFgAXABgADAAVABAAFgAQABIAFgATABcAGQAZAAcABwAHABUAGwAYAB4ABQAFAA0ADQANAA0ABwAHAAcABwAKAAgACAANAAcABwAHAAcABwAHAAcADgALAA4ACwAHAAcAEAARAAsADAAIAAcABgASABUAEgATABYAEwALAA4ACwAZAA8AEgAHAAcAEQALABgAGwAaABcAFwAZABIAFgAUABgAEwAUABIAFwASABYAFAAYABMAFAASABcAEAATABAAGAAQABAAEAAQABAAGQAVABMAGAAVABQAHwAhABMAFQAZABMADQARABUAGgAeABgAFAANABAADQAUABQAFAAHABAAGQAHAAcABwAHAAcACAAVABgAEgAUABIAHgAeABYAJAAgACAAEwAOABcAEwATAAYADQAKAAwAEAAQABEAGAAVABcAGwAbABEADwAcABsAGwASABAADQAPABcAFQARAA8AHAAcAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcADgAOAB0AHQAZABsAFgAUABgAGAAbABsAEwAXABIAEwAYABgAGAAUABkAFQAUABQAGAAaABMAFwAXABgAGQAXABUAFAASAAcACAAMAA8ADwAIAA0ACQAOABEAFAATABkADgAKABQAFQARAAkADAAHAAsADgAOAAgADQAMAAgAEAAMABEAEAAPAA4ACAAIAAwAEwATAA4AGgAaABUACwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAsAEAARAA0AGAAWAA0AEQAKABMAEgAHAAcABwAHAAcADwATAAwADwAQAAkAAwATABEAEQAaABEAGgAXAAkAEwAbAA8ADwAMAAsAFwAdAA4AFQAYABIAEgAaAB0ADQAPAAoAFgAKAAwADAAMAAwACQAMAA4ADQAZACAAIQAbABkAIAAXABUAEgAKAAgADgAWABEAEQARABsAEAAPABQAFwASAB8AFgARACEACgALAA8ACQAVABUAEAASABQADwAYABUAEAAQAAoADgAUABUAFwARABkADgAVAA8ADwASABQAEAAQAAsACwAaAAsADgAPAAwADgAOAA4AGgARABAAEAAKAA8ACgAKAA8ACAALABUADAAPABYAEAAcABUADgARAAwAEwALAA4AEwAVABIADwASAA8AEgAPABQAEQAXAA8ACgAKAB4ADQATABMAFQAeACMAIQAkABMADQAQABQAEQANAAgADgAZABIAEgAUABgAJAAPABUACQAMAAwADAAMAA4ADgADAAoAFwANAA8ACwAQABQABgARAA4ADwAMABMAFgAZABYAGQAgACYAIwAmAAkACQANABMAGwAbAAwADwAVABIADwAbABEAIgAQABIADwAQABQAEAAPABMADgARAA4AKQAsAAcAEwAMABgAHgAXABIACgAfACIAEgASABQACgAOABEAFwAaAA4ADQAOAA4ADQASAA4AEwATABIAEgAaABwAHgAdABEAEgARABMAFwAJAAsACQANABUABwATABQAGgAMABQAFQAHAAcABwAHAAcAFAAVABAAEAAGABAADgAVABUAEwAQAA0ADQALAAkAEAAHAA0AFQAQABIADQANAAsAEgANABAAEwANABAACwARAA0ACQAOABEAFAAQABAAFAAKAA0ADAAWAA8AEQAEAA0AEAATABEAIgATABAADwAQAAkACAAVAA0ADgARAA8AEQAhAAsAEQAUABkACgAbAB0ADQAVABAAEgANAA0ACwASAA0AEAATAA0AEAALABEADQAJAA4AEQAUABAAEAAUAAoADQAMABYADwARAAQADQAQABMAEQAiABMAEAAPABAACQAIABUADQAOABEADwARACEACwARABQAGQAKABsAHQAZAAsACwAWABMABwAOABQAFAAUABkACwALABYAEwAHAA4AFAAUABQABwAcAA8AEAAIABIACwAQABEAEgAIAAwAEgAYAAoADAAUABYAHQAXABkAEAAfAAcAJQAfAAkADgALAA4ACwANAAgACwAMAA8ADAAKAAsADgAFAAoACwAHABIADQAIABIAFwANABMAEgAHAAcABQAOAAMACAAGAAUABwAJAAoAFwANABIABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwA=\"\n};\n\nlet _init;\n\nfunction _decodeB64ToU8(b64) {\n if (typeof Buffer !== \"undefined\") {\n return Uint8Array.from(Buffer.from(b64, \"base64\"));\n }\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nfunction _u8ToTyped(u8, Ctor) {\n const buf = u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength);\n return new Ctor(buf);\n}\n\nexport function initPackedPrivate() {\n if (_init) return _init;\n const keyOffU8 = _decodeB64ToU8(_b64.keyOff_b64);\n const keyLenU8 = _decodeB64ToU8(_b64.keyLen_b64);\n const vrCodeU8 = _decodeB64ToU8(_b64.vrCode_b64);\n const vmCodeU8 = _decodeB64ToU8(_b64.vmCode_b64);\n const nameOffU8 = _decodeB64ToU8(_b64.nameOff_b64);\n const nameLenU8 = _decodeB64ToU8(_b64.nameLen_b64);\n _init = {\n keyOff: _u8ToTyped(keyOffU8, Uint32Array),\n keyLen: _u8ToTyped(keyLenU8, Uint16Array),\n vrCode: vrCodeU8,\n vmCode: vmCodeU8,\n nameOff: _u8ToTyped(nameOffU8, Uint32Array),\n nameLen: _u8ToTyped(nameLenU8, Uint16Array)\n };\n return _init;\n}\n\nexport function lookupPrivateTag(keyStr) {\n if (typeof keyStr !== \"string\" || keyStr.length === 0) return undefined;\n const { keyOff, keyLen, vrCode, vmCode, nameOff, nameLen } =\n initPackedPrivate();\n let lo = 0;\n let hi = keyOff.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const start = keyOff[mid];\n const len = keyLen[mid];\n const candidate = keyBlob.slice(start, start + len);\n if (keyStr < candidate) hi = mid - 1;\n else if (keyStr > candidate) lo = mid + 1;\n else {\n const vr = vrTable[vrCode[mid]];\n const vm = vmTable[vmCode[mid]];\n const off = nameOff[mid];\n const nlen = nameLen[mid];\n const name = nameBlob.slice(off, off + nlen);\n return { vr, vm, name };\n }\n }\n return undefined;\n}\n","import log from \"./log.js\";\n\nclass DICOMWEB {\n /*\n JavaScript DICOMweb REST API for browser use.\n\n Design:\n * map rest api to high-level code with modern conventions\n ** ES6: classes, arrow functions, let...\n ** promises\n ** json converted to objects\n\n examples: see tests() method below.\n\n */\n\n constructor(options = {}) {\n this.rootURL = options.rootURL;\n this.progressCallback = options.progressCallback;\n }\n\n static responseType(endpoint) {\n const types = {\n wado: \"arraybuffer\"\n };\n return types[endpoint] ? types[endpoint] : \"json\";\n }\n\n // which URL service to use for each of the high level services\n static endpointService(endpoint) {\n const services = {\n wado: \"\"\n };\n return Object.keys(services).indexOf(endpoint) != -1\n ? services[endpoint]\n : \"rs/\";\n }\n\n static randomEntry(array) {\n return array[Math.floor(Math.random() * array.length)];\n }\n\n request(endpoint, parameters = {}, payload) {\n let responseType = DICOMWEB.responseType(endpoint);\n let service = DICOMWEB.endpointService(endpoint);\n let url = this.rootURL + \"/\" + service + endpoint;\n let firstParameter = true;\n Object.keys(parameters).forEach(parameter => {\n if (firstParameter) {\n url += \"?\";\n firstParameter = false;\n } else {\n url += \"&\";\n }\n url += parameter + \"=\" + encodeURIComponent(parameters[parameter]);\n });\n function promiseHandler(resolve, reject) {\n let request = new XMLHttpRequest();\n request.open(\"GET\", url);\n request.responseType = responseType;\n request.onload = () => {\n resolve(request.response);\n };\n request.onprogress = this.progressCallback;\n request.onerror = error => {\n log.error(request.response);\n reject(error);\n };\n request.send(payload);\n }\n let promise = new Promise(promiseHandler.bind(this));\n return promise;\n }\n\n patients() {\n return this.request(\"patients\");\n }\n\n studies(patientID) {\n return this.request(\"studies\", { PatientID: patientID });\n }\n\n series(studyInstanceUID) {\n return this.request(\"series\", { StudyInstanceUID: studyInstanceUID });\n }\n\n instances(studyInstanceUID, seriesInstanceUID) {\n return this.request(\"instances\", {\n StudyInstanceUID: studyInstanceUID,\n SeriesInstanceUID: seriesInstanceUID\n });\n }\n\n instance(studyInstanceUID, seriesInstanceUID, sopInstanceUID) {\n return this.request(\"wado\", {\n requestType: \"WADO\",\n studyUID: studyInstanceUID,\n seriesUID: seriesInstanceUID,\n objectUID: sopInstanceUID,\n contentType: \"application/dicom\"\n });\n }\n\n tests() {\n let testingServerURL =\n \"http://quantome.org:4242/dcm4chee-arc/aets/DCM4CHEE\";\n let testOptions = { rootURL: testingServerURL };\n\n new DICOMWEB(testOptions).patients().then(responses => {\n responses.forEach(patient => {\n log.info(patient);\n });\n });\n }\n}\n\nexport { DICOMWEB };\n","//\n// Handle DICOM and CIELAB colors\n// based on:\n// https://github.com/michaelonken/dcmtk/blob/3c68f0e882e22e6d9e2a42f836332c0ca21b3e7f/dcmiod/libsrc/cielabutil.cc\n//\n// RGB here refers to sRGB 0-1 per component.\n// dicomlab is CIELAB values as defined in the dicom standard\n// XYZ is CIEXYZ convention\n//\n// TODO: needs a test suite\n// TODO: only dicomlab2RGB tested on real data\n//\n//\n\nclass Colors {\n static d65WhitePointXYZ() {\n // white points of D65 light point (CIELAB standard white point)\n return [0.950456, 1.0, 1.088754];\n }\n\n static dicomlab2RGB(dicomlab) {\n return Colors.lab2RGB(Colors.dicomlab2LAB(dicomlab));\n }\n\n static rgb2DICOMLAB(rgb) {\n return Colors.lab2DICOMLAB(Colors.rgb2LAB(rgb));\n }\n\n static dicomlab2LAB(dicomlab) {\n return [\n (dicomlab[0] * 100.0) / 65535.0, // results in 0 <= L <= 100\n (dicomlab[1] * 255.0) / 65535.0 - 128, // results in -128 <= a <= 127\n (dicomlab[2] * 255.0) / 65535.0 - 128 // results in -128 <= b <= 127\n ];\n }\n\n static lab2DICOMLAB(lab) {\n return [\n (lab[0] * 65535.0) / 100.0, // results in 0 <= L <= 65535\n ((lab[1] + 128) * 65535.0) / 255.0, // results in 0 <= a <= 65535\n ((lab[2] + 128) * 65535.0) / 255.0 // results in 0 <= b <= 65535\n ];\n }\n\n static rgb2LAB(rgb) {\n return Colors.xyz2LAB(Colors.rgb2XYZ(rgb));\n }\n\n static gammaCorrection(n) {\n if (n <= 0.0031306684425005883) {\n return 12.92 * n;\n } else {\n return 1.055 * Math.pow(n, 1 / 2.4) - 0.055;\n }\n }\n\n static invGammaCorrection(n) {\n if (n <= 0.0404482362771076) {\n return n / 12.92;\n } else {\n return Math.pow((n + 0.055) / 1.055, 2.4);\n }\n }\n\n static rgb2XYZ(rgb) {\n let R = Colors.invGammaCorrection(rgb[0]);\n let G = Colors.invGammaCorrection(rgb[1]);\n let B = Colors.invGammaCorrection(rgb[2]);\n return [\n 0.4123955889674142161 * R +\n 0.3575834307637148171 * G +\n 0.1804926473817015735 * B,\n 0.2125862307855955516 * R +\n 0.7151703037034108499 * G +\n 0.07220049864333622685 * B,\n 0.01929721549174694484 * R +\n 0.1191838645808485318 * G +\n 0.950497125131579766 * B\n ];\n }\n\n static xyz2LAB(xyz) {\n let whitePoint = Colors.d65WhitePointXYZ();\n let X = xyz[0] / whitePoint[0];\n let Y = xyz[1] / whitePoint[1];\n let Z = xyz[2] / whitePoint[2];\n X = Colors.labf(X);\n Y = Colors.labf(Y);\n Z = Colors.labf(Z);\n return [116 * Y - 16, 500 * (X - Y), 200 * (Y - Z)];\n }\n\n static lab2RGB(lab) {\n return Colors.xyz2RGB(Colors.lab2XYZ(lab));\n }\n\n static lab2XYZ(lab) {\n let L = (lab[0] + 16) / 116;\n let a = L + lab[1] / 500;\n let b = L - lab[2] / 200;\n let whitePoint = Colors.d65WhitePointXYZ();\n return [\n whitePoint[0] * Colors.labfInv(a),\n whitePoint[1] * Colors.labfInv(L),\n whitePoint[2] * Colors.labfInv(b)\n ];\n }\n\n static xyz2RGB(xyz) {\n let R1 = 3.2406 * xyz[0] - 1.5372 * xyz[1] - 0.4986 * xyz[2];\n let G1 = -0.9689 * xyz[0] + 1.8758 * xyz[1] + 0.0415 * xyz[2];\n let B1 = 0.0557 * xyz[0] - 0.204 * xyz[1] + 1.057 * xyz[2];\n\n /* Force nonnegative values so that gamma correction is well-defined. */\n let minimumComponent = Math.min(R1, G1);\n minimumComponent = Math.min(minimumComponent, B1);\n if (minimumComponent < 0) {\n R1 -= minimumComponent;\n G1 -= minimumComponent;\n B1 -= minimumComponent;\n }\n\n /* Transform from RGB to R'G'B' */\n return [\n Colors.gammaCorrection(R1),\n Colors.gammaCorrection(G1),\n Colors.gammaCorrection(B1)\n ];\n }\n\n static labf(n) {\n if (n >= 8.85645167903563082e-3) {\n return Math.pow(n, 0.333333333333333);\n } else {\n return (841.0 / 108.0) * n + 4.0 / 29.0;\n }\n }\n\n static labfInv(n) {\n if (n >= 0.206896551724137931) {\n return n * n * n;\n } else {\n return (108.0 / 841.0) * (n - 4.0 / 29.0);\n }\n }\n}\n\nexport { Colors };\nexport default Colors;\n","import { TAG_NAME_MAP, DEFAULT_INFORMATION_TAGS } from \"../constants/dicom.js\";\n\n/**\n * Creates an information filter that tracks top-level DICOM attributes.\n *\n * @param {Set<string>} tags - Optional set of tag hex strings to track.\n * If not provided, uses DEFAULT_INFORMATION_TAGS.\n * @returns {Object} A filter object that adds listener.information attribute\n */\nexport function createInformationFilter(tags = DEFAULT_INFORMATION_TAGS) {\n const filter = {\n information: null,\n /**\n * Initializes the filter, synchronizing the information object with the parent listener\n */\n _init(options) {\n filter.information = options?.information || {};\n this.information = filter.information;\n },\n /**\n * Intercepts addTag calls to track top-level attributes in listener.information\n */\n addTag(next, tag, tagInfo) {\n // Check if this is a top-level tag (level 0) and is in our tracked set\n if (this.current?.level === 0 && tags.has(tag)) {\n // Store a reference to track this tag for value updates\n const normalizedName = TAG_NAME_MAP[tag] || tag;\n this.information[normalizedName] = null;\n\n // Mark this tag for tracking\n const result = next(tag, tagInfo);\n this.current._trackInformation = normalizedName;\n return result;\n }\n\n return next(tag, tagInfo);\n },\n\n /**\n * Intercepts value calls to populate information values\n */\n value(next, v) {\n // If current context is tracking information, store the first value\n if (this.current?._trackInformation) {\n const name = this.current._trackInformation;\n this.information[name] = v;\n this.current._trackInformation = null;\n }\n\n return next(v);\n }\n };\n\n return filter;\n}\n\n/**\n * A DICOM Metadata listener implements the basic listener for creating a dicom\n * metadata instance from a stream of notification events.\n *\n * There are additional listeners defined in @cornerstonejs/metadata as well as\n * other event sources in that package.\n *\n * **Important behaviors:**\n * - Each frame is ALWAYS delivered as an array (ArrayBuffer[]), even for single frames\n * - Video transfer syntaxes are handled as though they were a single frame\n * - Binary data can be delivered fragmented - a single frame may be split across multiple ArrayBuffer fragments\n * - Multiple fragments are combined into one array per frame\n *\n * **WARNING** This class is still under development, do not count on the API\n * not changing a bit over the next few dcmjs releases.\n */\nexport class DicomMetadataListener {\n current = null;\n fmi = null;\n dict = null;\n filters = [];\n information = null;\n\n /**\n * Optional backpressure (drain) function. When set, the reader will await\n * the returned promise before emitting more fragment values, to avoid\n * having too many open streams or overwhelming the consumer.\n */\n _drain = () => Promise.resolve();\n\n /**\n * Set the drain (pushback) function for backpressure. The function should\n * return a Promise that resolves when it is safe to emit more data (e.g.\n * when unsettled stream write count is below a limit). Node.js streams use\n * the term \"drain\" for this (see Writable 'drain' event).\n *\n * @param {(() => Promise<void>) | null} fn - Function that returns a Promise, or null to clear\n */\n setDrain(fn) {\n this._drain = typeof fn === \"function\" ? fn : null;\n }\n\n /**\n * Returns a Promise that resolves when the drain condition is met (or\n * immediately if no drain is set). Call this before emitting values to\n * apply backpressure.\n *\n * @returns {Promise<void>}\n */\n awaitDrain() {\n return this._drain() || Promise.resolve();\n }\n\n /**\n * Creates a new DicomMetadataListener instance.\n *\n * @param {Object} options - Configuration options\n * @param {Object} options.informationFilter - Optional information filter to use.\n * If not provided, creates one automatically.\n * @param {Set<string>} options.informationTags - Optional set of tag hex strings\n * to track in listener.information. If not provided, uses default tags.\n * @param {...Object} filters - Optional filter objects that can intercept\n * method calls. Each filter can have methods like addTag, startObject,\n * pop, or value. Each filter method receives a 'next'\n * function as the first argument, followed by the same arguments as\n * the original method.\n *\n * @example\n * const listener = new DicomMetadataListener();\n *\n * @example\n * const listener = new DicomMetadataListener(\n * { informationTags: new Set(['0020000D', '0020000E']) }\n * );\n *\n * @example\n * const listener = new DicomMetadataListener(\n * {},\n * {\n * addTag(next, tag, tagInfo) {\n * console.log('Adding tag:', tag);\n * return next(tag, tagInfo);\n * }\n * }\n * );\n */\n constructor(options = {}, ...filters) {\n // Handle legacy constructor format where first arg might be a filter\n if (\n typeof options.addTag === \"function\" ||\n typeof options.startObject === \"function\" ||\n typeof options.pop === \"function\" ||\n typeof options.value === \"function\"\n ) {\n // Legacy format: all arguments are filters\n filters = [options, ...filters];\n options = {};\n }\n\n // Information filter should always be first so it can track tags\n // Use the provided informationFilter or create a new one\n const informationFilter =\n options.informationFilter ||\n createInformationFilter(options.informationTags);\n\n this.filters = [informationFilter, ...filters];\n\n this._createMethodChains();\n\n // Initialize filters to synchronize state\n this.init(options);\n }\n\n /**\n * Initializes state, allowing it to be re-used.\n * @param {Object} options - Optional options to pass to the filters to re-initialize them\n * @param {Object} options.information - Optional information to pass to the filters\n * @returns {void}\n */\n init(options = undefined) {\n this.current = null;\n this.fmi = null;\n this.dict = null;\n this.information = null;\n\n for (const filter of this.filters) {\n filter._init?.call(this, options);\n }\n }\n\n /**\n * Creates method chains for each method that can be filtered.\n * @private\n */\n _createMethodChains() {\n const methods = [\"addTag\", \"startObject\", \"pop\", \"value\"];\n\n for (const methodName of methods) {\n const baseMethod =\n this[\n `_base${\n methodName.charAt(0).toUpperCase() + methodName.slice(1)\n }`\n ].bind(this);\n\n // Build the chain by wrapping each filter\n // Start with the base implementation\n let chain = baseMethod;\n\n // Apply filters in reverse order so they execute in forward order\n for (let i = this.filters.length - 1; i >= 0; i--) {\n const filter = this.filters[i];\n if (filter && typeof filter[methodName] === \"function\") {\n const filterFn = filter[methodName];\n const next = chain;\n chain = (...args) => filterFn.call(this, next, ...args);\n }\n }\n\n // Replace the method with the chained version\n this[methodName] = chain;\n }\n }\n\n /**\n * Base implementation: Adds a new tag value\n * @private\n */\n _baseAddTag(tag, tagInfo) {\n const dest = {\n vr: tagInfo?.vr,\n Value: null\n };\n if (this.current && this.current.dest) {\n this.current.dest[tag] = dest;\n }\n // Tags are at the same level as their parent (they're properties, not nested structures)\n const level = this.current ? this.current.level ?? 0 : 0;\n this.current = {\n parent: this.current,\n dest,\n type: tag,\n tag: tag,\n vr: tagInfo?.vr,\n level: level,\n length: tagInfo?.length\n };\n }\n\n /**\n * Base implementation: Starts a new object, using the provided value\n * @private\n */\n _baseStartObject(dest = {}) {\n // Objects/sequences are nested structures, so they increment the level\n // Root object is at level 0, nested objects are one level deeper\n const level = this.current ? (this.current.level ?? 0) + 1 : 0;\n if (this.current) {\n this.value(dest);\n }\n this.current = {\n parent: this.current,\n dest,\n type: \"object\",\n level: level\n };\n }\n\n /**\n * Base implementation: Pops the current value being created off the stack.\n * @private\n */\n _basePop() {\n const result = this.current.pop?.() ?? this.current.dest;\n if (result.InlineBinary) {\n console.log(\n \"********* InlineBinary already set\",\n result,\n this.current\n );\n }\n if (result.Value === null) {\n result.Value = [];\n } else if (\n result.Value?.length === 1 &&\n (result.Value[0] === null || result.Value[0] === undefined)\n ) {\n result.Value = [];\n }\n this.current = this.current.parent;\n return result;\n }\n\n /**\n * Base implementation: Registers a new value for the current destination being created.\n *\n * Note: Binary data (ArrayBuffer) can be delivered fragmented across multiple calls.\n * Multiple fragments are combined into arrays. Each frame is always delivered as an array.\n *\n * @private\n */\n _baseValue(v) {\n if (Array.isArray(this.current.dest)) {\n this.current.dest.push(v);\n return;\n }\n this.current.dest.Value ||= [];\n this.current.dest.Value.push(v);\n }\n\n /**\n * Gets the Transfer Syntax UID from the File Meta Information (FMI)\n * @returns {string|undefined} - Transfer syntax UID or undefined if not available\n */\n getTransferSyntaxUID() {\n if (!this.fmi) {\n return undefined;\n }\n const transferSyntaxTag = \"00020010\"; // TransferSyntaxUID tag\n if (\n this.fmi[transferSyntaxTag]?.Value &&\n Array.isArray(this.fmi[transferSyntaxTag].Value) &&\n this.fmi[transferSyntaxTag].Value.length > 0\n ) {\n return this.fmi[transferSyntaxTag].Value[0];\n }\n return undefined;\n }\n}\n","import { ReadBufferStream } from \"./BufferStream\";\nimport { ValueRepresentation } from \"./ValueRepresentation\";\nimport {\n EXPLICIT_BIG_ENDIAN,\n EXPLICIT_LITTLE_ENDIAN,\n IMPLICIT_LITTLE_ENDIAN,\n VM_DELIMITER,\n UNDEFINED_LENGTH,\n TagHex,\n encodingMapping,\n UNDEFINED_LENGTH_FIX,\n VALID_VRS,\n isVideoTransferSyntax\n} from \"./constants/dicom\";\nimport { Tag } from \"./Tag\";\nimport { DicomMessage, singleVRs } from \"./DicomMessage\";\nimport { DicomMetaDictionary } from \"./DicomMetaDictionary\";\nimport { DicomMetadataListener } from \"./utilities/DicomMetadataListener.js\";\nimport { log } from \"./log.js\";\n\nconst readLog = log.getLogger(\"AsyncDicomReader\");\n\n/**\n * This is an asynchronous binary DICOM reader.\n *\n * Assume this is still preliminary as to the exact interface as it is\n * initially being released for testing purposes only.\n *\n * There is no support for compressed streams.\n */\nexport class AsyncDicomReader {\n syntax = EXPLICIT_LITTLE_ENDIAN;\n\n constructor(options = {}) {\n this.isLittleEndian = options?.isLittleEndian;\n // Default maxFragmentSize is 128 MB (128 * 1024 * 1024 bytes)\n this.maxFragmentSize = options?.maxFragmentSize ?? 128 * 1024 * 1024;\n this.stream = new ReadBufferStream(null, this.isLittleEndian, {\n clearBuffers: true,\n ...options\n });\n }\n\n /** Sentinel returned when stream is Part 10 but has no preamble (starts with meta). */\n static PART10_NO_PREAMBLE = Symbol(\"PART10_NO_PREAMBLE\");\n\n /**\n * Reads the preamble and checks for the DICM marker.\n * Returns true if found/read, leaving the stream past the\n * marker; PART10_NO_PREAMBLE if the stream starts with group 0002 (meta);\n * or false for a raw dataset (no meta).\n *\n * If no preamble is found, checks the first tag: when it is (0002,xxxx)\n * the stream is treated as Part 10 without preamble; otherwise raw dataset\n * encoding is detected from the first tag structure.\n */\n async readPreamble() {\n const { stream } = this;\n await stream.ensureAvailable();\n stream.reset();\n stream.increment(128);\n if (stream.readAsciiString(4) !== \"DICM\") {\n stream.reset();\n await stream.ensureAvailable(4);\n stream.setEndian(true); // Part 10 meta and tag are little-endian\n const group = stream.readUint16();\n stream.readUint16(); // element\n stream.reset();\n if (group === 0x0002) {\n return AsyncDicomReader.PART10_NO_PREAMBLE;\n }\n await this.detectRawEncoding();\n return false;\n }\n return true;\n }\n\n /**\n * Detects whether a raw dataset (no Part 10 preamble) is LEI or LEE encoded.\n * This is done by examining the first tag structure:\n * - LEI: Tag (4 bytes) + Length (4 bytes) - no VR\n * - LEE: Tag (4 bytes) + VR (2 bytes ASCII) + Length (2 or 4 bytes)\n *\n * We check if bytes 4-5 look like a valid DICOM VR (2 ASCII letters that\n * match known VR codes). If a valid VR is detected, we use LEE, otherwise LEI.\n */\n async detectRawEncoding() {\n const { stream } = this;\n await stream.ensureAvailable(8); // Need at least 8 bytes (tag + length) to detect\n\n stream.reset();\n stream.setEndian(true); // Little endian for both LEI and LEE\n\n // Read the tag (first 4 bytes)\n const group = stream.readUint16();\n stream.readUint16();\n\n // Part 10 meta (group 0002) is handled in readPreamble; raw dataset can start with 0008, 0028, etc.\n if (group === 0x0002) {\n throw new Error(\n \"Invalid DICOM file: stream starts with meta (0002,xxxx) but was not handled as Part 10\"\n );\n }\n\n // Check if bytes 4-5 (after tag) look like a valid VR (2 ASCII letters)\n const byte4 = stream.peekUint8(0);\n const byte5 = stream.peekUint8(1);\n\n // If we're going to assume LEI, check the length is even (DICOM requirement)\n // Read the length value (4 bytes after tag in LEI format) as little-endian uint32\n await stream.ensureAvailable(8); // Need at least 8 bytes (tag + length)\n const potentialLength = stream.view.getUint32(stream.offset, true); // true = little endian\n\n const isASCIILetter = byte => {\n return (\n (byte >= 0x41 && byte <= 0x5a) || // A-Z\n (byte >= 0x61 && byte <= 0x7a)\n ); // a-z\n };\n\n if (isASCIILetter(byte4) && isASCIILetter(byte5)) {\n // Check if it's a valid VR code\n const vrCandidate = String.fromCharCode(byte4, byte5).toUpperCase();\n if (VALID_VRS.has(vrCandidate)) {\n // Valid VR detected - this is LEE (Explicit Little Endian)\n this.syntax = EXPLICIT_LITTLE_ENDIAN;\n } else {\n // ASCII letters but not a valid VR - assume LEI\n // But first check if the length is odd (invalid for DICOM)\n if (potentialLength % 2 !== 0) {\n throw new Error(\n `Invalid DICOM file: detected LEI encoding but length is odd (${potentialLength}), which is not allowed in DICOM`\n );\n }\n this.syntax = IMPLICIT_LITTLE_ENDIAN;\n }\n } else {\n // Not ASCII letters - must be LEI (Implicit Little Endian)\n // Check if the length is odd (invalid for DICOM)\n if (potentialLength % 2 !== 0) {\n throw new Error(\n `Invalid DICOM file: detected LEI encoding but length is odd (${potentialLength}), which is not allowed in DICOM`\n );\n }\n this.syntax = IMPLICIT_LITTLE_ENDIAN;\n }\n\n // Reset stream to beginning for reading\n stream.reset();\n }\n\n async readFile(options = undefined) {\n const hasPreamble = await this.readPreamble();\n if (hasPreamble === AsyncDicomReader.PART10_NO_PREAMBLE) {\n // Part 10 without preamble: stream starts at (0002,0000) or rest of meta\n // When (0002,0000) is stripped, meta can start with other 0002 tags.\n // Allow reading meta without group-length in this mode.\n this.meta = await this.readMeta({ ...options, ignoreErrors: true });\n const listener = options?.listener || new DicomMetadataListener();\n\n if (listener.information) {\n const { information } = listener;\n information.transferSyntaxUid = this.syntax;\n information.sopInstanceUid =\n this.meta?.[TagHex.MediaStoreSOPInstanceUID]?.Value[0];\n }\n\n this.dict ||= {};\n listener.startObject(this.dict);\n this.dict = await this.read(listener, options);\n\n return this;\n }\n if (!hasPreamble) {\n // Handle raw dataset (no Part 10 preamble)\n // Encoding should already be detected in readPreamble()\n this.meta = {}; // No meta header for raw datasets\n const listener = options?.listener || new DicomMetadataListener();\n\n if (listener.information) {\n const { information } = listener;\n information.transferSyntaxUid = this.syntax;\n }\n\n this.dict ||= {};\n listener.startObject(this.dict);\n this.dict = await this.read(listener, options);\n\n return this;\n }\n this.meta = await this.readMeta(options);\n const listener = options?.listener || new DicomMetadataListener();\n\n if (listener.information) {\n const { information } = listener;\n information.transferSyntaxUid = this.syntax;\n information.sopInstanceUid =\n this.meta?.[TagHex.MediaStoreSOPInstanceUID]?.Value[0];\n }\n\n this.dict ||= {};\n listener.startObject(this.dict);\n this.dict = await this.read(listener, options);\n\n return this;\n }\n\n /**\n * Reads the file meta information.\n *\n * @param options.maxSizeMeta - maximum number of bytes for reading the meta\n * header when it isn't in a group length section.\n * @param options.ignoreErrors - allow reading past some errors.\n * In this case, reading a meta section not inside a group length.\n */\n async readMeta(options = undefined) {\n const { stream } = this;\n await stream.ensureAvailable();\n const { offset: metaStartPos } = stream;\n const el = this.readTagHeader();\n if (el.tag !== TagHex.FileMetaInformationGroupLength) {\n // meta length tag is missing\n if (!options?.ignoreErrors) {\n throw new Error(\n \"Invalid DICOM file, meta length tag is malformed or not present.\"\n );\n }\n\n // reset stream to the position where we started reading tags\n stream.offset = metaStartPos;\n // Wait for at least 10k to be available to make sure there is enough\n // data to read the entire Meta header\n await stream.ensureAvailable(options?.maxSizeMeta || 1024 * 10);\n\n // read meta header elements sequentially\n this.meta = DicomMessage._read(stream, EXPLICIT_LITTLE_ENDIAN, {\n untilTag: \"00030000\",\n stopOnGreaterTag: true,\n ignoreErrors: true\n });\n } else {\n // meta length tag is present\n const metaLength = el.vrObj.readBytes(stream);\n await stream.ensureAvailable(metaLength);\n\n // read header buffer using the specified meta length\n const metaStream = stream.more(metaLength);\n this.meta = DicomMessage._read(\n metaStream,\n EXPLICIT_LITTLE_ENDIAN,\n {}\n );\n }\n this.syntax = this.meta[TagHex.TransferSyntaxUID].Value[0];\n\n return this.meta;\n }\n\n async read(listener, options) {\n const untilOffset = options?.untilOffset || Number.MAX_SAFE_INTEGER;\n this.listener = listener;\n const { stream } = this;\n await stream.ensureAvailable();\n while (stream.offset < untilOffset && stream.isAvailable(1, false)) {\n readLog.debug(\"read loop\", stream.offset, untilOffset);\n // Consume before reading the tag so that data before the\n // current tag can be cleared.\n stream.consume();\n const tagInfo = this.readTagHeader(options);\n\n // Stop when the requested tag boundary is reached. readTagHeader()\n // has already consumed the 4-byte tag but nothing beyond it, so\n // stream.offset now points at the first byte after the tag (i.e.\n // the VR field for explicit-LE). Callers that need the start\n // offset of the tag itself should subtract 4 from stream.offset.\n if (tagInfo.isUntilTag) {\n break;\n }\n\n const { tag, tagObj, length } = tagInfo;\n\n if (tag === TagHex.ItemDelimitationEnd) {\n return listener.pop();\n }\n if (tagObj.isInstruction()) {\n continue;\n }\n if (tagObj.group() === 0 || tag === TagHex.DataSetTrailingPadding) {\n // Group length\n stream.increment(tagObj.length);\n continue;\n }\n const addTagResult = listener.addTag(tag, tagInfo);\n if (this.isSequence(tagInfo)) {\n await this.readSequence(listener, tagInfo, options);\n } else if (tagObj.isPixelDataTag()) {\n await this.readPixelData(tagInfo);\n } else if (length === UNDEFINED_LENGTH_FIX) {\n throw new Error(\n `Can't handle tag ${tagInfo.tag} with -1 length and not sequence`\n );\n } else if (addTagResult?.expectsRaw === true && length > 0) {\n // Deliver raw binary data when requested\n await this.readRawBinary(tagInfo);\n } else {\n await this.readSingle(tagInfo, listener, options);\n }\n listener.pop();\n await this.stream.ensureAvailable();\n }\n return listener.pop();\n }\n\n async readSequence(listener, sqTagInfo, options) {\n const { length } = sqTagInfo;\n const { stream, syntax } = this;\n const endOffset =\n length === UNDEFINED_LENGTH_FIX\n ? Number.MAX_SAFE_INTEGER\n : stream.offset + length;\n while (stream.offset < endOffset && (await stream.ensureAvailable())) {\n readLog.debug(\"readSequence loop\", stream.offset, endOffset);\n const tagInfo = this.readTagHeader(syntax, options);\n const { tag } = tagInfo;\n if (tag === TagHex.Item) {\n listener.startObject();\n // For defined-length items, use the item's own end offset\n // so read() stops at the item boundary and returns control\n // to readSequence for the next item. Without this, all\n // items in a defined-length sequence get merged into the\n // first item because read() treats subsequent Item tags\n // as instructions and skips them.\n const itemLength = tagInfo.length;\n const itemUntilOffset =\n itemLength === UNDEFINED_LENGTH_FIX\n ? endOffset\n : Math.min(stream.offset + itemLength, endOffset);\n await this.read(listener, {\n ...options,\n untilOffset: itemUntilOffset\n });\n } else if (tag === TagHex.SequenceDelimitationEnd) {\n // Sequence of undefined lengths end in sequence delimitation item\n return;\n } else {\n console.warn(\"Unknown tag info\", length, tagInfo);\n throw new Error();\n }\n }\n // Sequences of defined length end at the end offset\n }\n\n readPixelData(tagInfo) {\n if (tagInfo.length === -1) {\n return this.readCompressed(tagInfo);\n }\n\n return this.readUncompressed(tagInfo);\n }\n\n /**\n * Emits one or more listener.value() calls for a fragment, splitting if needed.\n * This does NOT start/pop any array contexts; callers control the surrounding structure.\n */\n async _emitSplitValues(length) {\n const { stream, listener } = this;\n await listener.awaitDrain?.();\n const { maxFragmentSize } = this;\n if (typeof maxFragmentSize !== \"number\" || maxFragmentSize <= 0) {\n throw new Error(\n `maxFragmentSize must be a positive number, got ${maxFragmentSize}`\n );\n }\n let offset = 0;\n while (offset < length) {\n readLog.trace(\"_emitSplitValues loop\", offset, length);\n const chunkSize = Math.min(maxFragmentSize, length - offset);\n await stream.ensureAvailable(chunkSize);\n const buffer = stream.readArrayBuffer(chunkSize);\n listener.value(buffer);\n offset += chunkSize;\n stream.consume();\n }\n }\n\n /**\n * Reads compressed streams.\n */\n async readCompressed(_tagInfo) {\n const { stream, listener } = this;\n const transferSyntaxUid = this.syntax;\n\n await stream.ensureAvailable();\n\n // Check if this is a video transfer syntax\n const isVideo = isVideoTransferSyntax(transferSyntaxUid);\n\n // Check number of frames - only use video logic for single frame (or undefined)\n const numberOfFrames = listener.information?.numberOfFrames;\n const isSingleFrame = !numberOfFrames || parseInt(numberOfFrames) <= 1;\n\n let offsets = await this.readOffsets();\n\n const singleArray = isVideo || isSingleFrame;\n\n if (singleArray && !offsets) {\n offsets = [0];\n }\n if (offsets) {\n // Last frame ends when the sequence ends, so merge the frame data\n offsets.push(Number.MAX_SAFE_INTEGER / 2);\n }\n const startOffset = stream.offset;\n\n let frameNumber = 0;\n let lastFrame = null;\n\n while (true) {\n readLog.debug(\"readCompressed frame loop\", frameNumber);\n stream.consume();\n await stream.ensureAvailable();\n const frameTag = this.readTagHeader();\n if (frameTag.tag === TagHex.SequenceDelimitationEnd) {\n if (lastFrame) {\n // Always deliver frames as arrays, using streaming splitFrame\n listener.pop();\n }\n return;\n }\n if (frameTag.tag !== TagHex.Item) {\n throw new Error(`frame tag isn't item: ${frameTag.tag}`);\n }\n const { length } = frameTag;\n if (!lastFrame) {\n lastFrame = [];\n listener.startObject(lastFrame);\n }\n await this._emitSplitValues(length);\n\n if (\n !offsets ||\n stream.offset >= offsets[frameNumber + 1] + startOffset\n ) {\n lastFrame = null;\n listener.pop();\n frameNumber++;\n }\n }\n }\n\n async readOffsets() {\n const tagInfo = this.readTagHeader();\n if (tagInfo.tag !== TagHex.Item) {\n throw new Error(`Offsets tag is missing: ${tagInfo.tag}`);\n }\n if (tagInfo.length === 0) {\n return;\n }\n const offsets = [];\n const numOfFrames = tagInfo.length / 4;\n await this.stream.ensureAvailable(tagInfo.length);\n for (let i = 0; i < numOfFrames; i++) {\n readLog.trace(\"readOffsets loop\", i, numOfFrames);\n offsets.push(this.stream.readUint32());\n }\n return offsets;\n }\n\n /**\n * Reads uncompressed pixel data, delivering it to the listener streaming it.\n */\n async readUncompressed(tagInfo) {\n const { length } = tagInfo;\n const { listener } = this;\n\n const numberOfFrames = parseInt(\n listener.information?.numberOfFrames || 1\n );\n const frameLength = Math.floor(length / numberOfFrames);\n if (numberOfFrames > 1) {\n const rows = listener.information?.rows;\n const cols = listener.information?.columns;\n const samplesPerPixel = listener.information?.samplesPerPixel;\n const bitsAllocated = listener.information?.bitsAllocated;\n const bitsPerFrame = rows * cols * samplesPerPixel * bitsAllocated;\n if (bitsPerFrame % 8 !== 0) {\n // Check if this is an odd-length bit frame (bitsAllocated = 1)\n if (bitsAllocated === 1) {\n // Use readUncompressedBitFrame for odd-length bit frames\n return await this.readUncompressedBitFrame(tagInfo);\n }\n throw new Error(\n `Odd frame length must be single bit: ${rows},${cols} ${samplesPerPixel} ${bitsAllocated}`\n );\n }\n if (length % numberOfFrames !== 0) {\n throw new Error(\n `Invalid frame length: ${length} for ${numberOfFrames} frames`\n );\n }\n }\n\n for (let frameNumber = 0; frameNumber < numberOfFrames; frameNumber++) {\n readLog.trace(\"readUncompressed loop\", frameNumber, numberOfFrames);\n listener.startObject([]);\n await this._emitSplitValues(frameLength);\n listener.pop();\n // console.log(stream.getBufferMemoryInfo());\n }\n }\n\n /**\n * Reads uncompressed pixel data with support for odd frame lengths (in bits).\n * This method handles cases where frames are packed sequentially bit-by-bit,\n * without restarting at byte boundaries. Each frame is unpacked starting at byte 0.\n *\n * For odd-length bit frames:\n * - bitsAllocated is always 1 (single bit per pixel)\n * - rows * cols * samplesPerPixel is not a multiple of 8\n * - Frames are packed sequentially into bits without byte alignment\n * - Each frame is unpacked to start at byte 0\n *\n * @param {Object} tagInfo - Tag information containing length and other metadata\n */\n async readUncompressedBitFrame(tagInfo) {\n const { length } = tagInfo;\n const { listener, stream } = this;\n\n const numberOfFrames = parseInt(\n listener.information?.numberOfFrames || 1\n );\n\n const rows = listener.information?.rows;\n const cols = listener.information?.columns;\n const samplesPerPixel = listener.information?.samplesPerPixel || 1;\n const bitsAllocated = listener.information?.bitsAllocated;\n\n if (!rows || !cols || !bitsAllocated) {\n throw new Error(\n \"Missing required pixel data information: rows, columns, or bitsAllocated\"\n );\n }\n\n // For odd-length bit frames, bitsAllocated should be 1\n if (bitsAllocated !== 1) {\n throw new Error(\n `Odd-length bit frames require bitsAllocated=1, got ${bitsAllocated}`\n );\n }\n\n const bitsPerFrame = rows * cols * samplesPerPixel * bitsAllocated;\n const bytesPerFrame = Math.ceil(bitsPerFrame / 8);\n const totalBits = bitsPerFrame * numberOfFrames;\n const totalBytes = Math.ceil(totalBits / 8);\n if (totalBytes !== length) {\n throw new Error(\n `The calculated length ${totalBytes} does not match the actual length ${length}`\n );\n }\n\n // Read all pixel data at once since frames are packed sequentially\n await stream.ensureAvailable(length);\n const allPixelData = stream.readArrayBuffer(totalBytes);\n stream.consume();\n\n // Extract each frame, unpacking bits so each frame starts at byte 0\n for (let frameNumber = 0; frameNumber < numberOfFrames; frameNumber++) {\n readLog.trace(\n \"readUncompressedBitFrame loop\",\n frameNumber,\n numberOfFrames\n );\n listener.startObject([]);\n\n // Calculate the bit offset for this frame in the packed data\n const bitOffset = frameNumber * bitsPerFrame;\n\n // Create a buffer for this frame (starting at byte 0)\n const frameBuffer = new ArrayBuffer(bytesPerFrame);\n const frameView = new Uint8Array(frameBuffer);\n const sourceView = new Uint8Array(allPixelData);\n\n // Extract bits for this frame\n for (let bitIndex = 0; bitIndex < bitsPerFrame; bitIndex++) {\n const globalBitIndex = bitOffset + bitIndex;\n const sourceByteIndex = Math.floor(globalBitIndex / 8);\n const sourceBitIndex = globalBitIndex % 8;\n const targetByteIndex = Math.floor(bitIndex / 8);\n const targetBitIndex = bitIndex % 8;\n\n // Read the bit from source\n const sourceByte = sourceView[sourceByteIndex];\n const bitValue = (sourceByte >> (7 - sourceBitIndex)) & 1;\n\n // Write the bit to target (starting at byte 0)\n if (bitValue) {\n frameView[targetByteIndex] |= 1 << (7 - targetBitIndex);\n }\n }\n\n // Deliver the frame buffer\n listener.value(frameBuffer);\n listener.pop();\n }\n }\n\n /**\n * Reads raw binary data in chunks and delivers it to the listener.\n * This method reads data in 64KB chunks to manage memory efficiently.\n */\n async readRawBinary(tagInfo) {\n const { length } = tagInfo;\n await this._emitSplitValues(length);\n }\n\n isSequence(tagInfo) {\n const { vr, length } = tagInfo;\n return vr === \"SQ\" || (vr === \"UN\" && length === UNDEFINED_LENGTH_FIX);\n }\n\n /**\n * Reads a tag header.\n */\n readTagHeader(\n options = {\n untilTag: null,\n includeUntilTagValue: false\n }\n ) {\n const { stream, syntax } = this;\n const { untilTag, includeUntilTagValue } = options;\n const implicit = syntax == IMPLICIT_LITTLE_ENDIAN;\n const isLittleEndian = syntax !== EXPLICIT_BIG_ENDIAN;\n stream.setEndian(isLittleEndian);\n const tagObj = Tag.readTag(stream);\n const tag = tagObj.cleanString;\n\n if (untilTag && untilTag === tag) {\n if (!includeUntilTagValue) {\n return { tag, tagObj, vr: 0, values: 0, isUntilTag: true };\n }\n }\n\n let length = null;\n let vr = null;\n let vrType;\n\n const isCommand = tagObj.group() === 0;\n if (tagObj.isInstruction()) {\n length = stream.readUint32();\n vr = ValueRepresentation.createByTypeString(\"UN\");\n } else if (implicit && !isCommand) {\n length = stream.readUint32();\n var elementData = DicomMessage.lookupTag(tagObj);\n if (elementData) {\n vrType = elementData.vr;\n } else {\n //unknown tag\n if (length == UNDEFINED_LENGTH) {\n vrType = \"SQ\";\n } else if (tagObj.isPixelDataTag()) {\n vrType = \"OW\";\n } else if (vrType == \"xs\") {\n // This should work for any tag after PixelRepresentation,\n // which is all but 2 of the xs code values.\n const signed =\n this.listener.information?.pixelRepresentation === 0;\n vrType = signed ? \"SS\" : \"US\";\n } else if (tagObj.isPrivateCreator()) {\n vrType = \"LO\";\n } else {\n vrType = \"UN\";\n }\n }\n vr = ValueRepresentation.createByTypeString(vrType);\n } else {\n vrType = stream.readVR();\n\n if (vrType === \"UN\" && DicomMessage.lookupTag(tagObj)?.vr) {\n vrType = DicomMessage.lookupTag(tagObj).vr;\n\n vr = ValueRepresentation.parseUnknownVr(vrType);\n } else {\n vr = ValueRepresentation.createByTypeString(vrType);\n }\n\n if (vr.isLength32()) {\n stream.increment(2);\n length = stream.readUint32();\n } else {\n length = stream.readUint16();\n }\n }\n\n const punctuatedTag = DicomMetaDictionary.punctuateTag(tag);\n const entry = DicomMetaDictionary.dictionary[punctuatedTag];\n\n // Include both the string and object values for vr and tag\n const header = {\n vrObj: vr,\n vr: vr.type,\n tag,\n tagObj,\n vm: entry?.vm,\n name: entry?.name,\n length: length === UNDEFINED_LENGTH ? -1 : length\n };\n return header;\n }\n\n /**\n * Reads a single tag values and delivers them to the listener.\n *\n * If the tag is specific character set, will assign the decoder to that\n * character set.\n */\n async readSingle(tagInfo, listener, options) {\n const { length } = tagInfo;\n const { stream, syntax } = this;\n await this.stream.ensureAvailable(length);\n const vr = ValueRepresentation.createByTypeString(tagInfo.vr);\n let values = [];\n if (vr.isBinary() && length > vr.maxLength && !vr.noMultiple) {\n const times = length / vr.maxLength;\n let i = 0;\n while (i++ < times) {\n readLog.trace(\"readSingle multi-value loop\", i, times);\n const { value } = vr.read(stream, vr.maxLength, syntax);\n values.push(value);\n }\n } else {\n const value = vr.read(stream, length, syntax)?.value;\n if (!vr.isBinary() && singleVRs.indexOf(vr.type) == -1) {\n values = value;\n if (typeof value === \"string\") {\n const delimiterChar = String.fromCharCode(VM_DELIMITER);\n values = vr.dropPadByte(value.split(delimiterChar));\n }\n } else if (vr.type == \"OW\" || vr.type == \"OB\") {\n values = value;\n } else {\n Array.isArray(value) ? (values = value) : values.push(value);\n }\n }\n\n if (tagInfo.tag === TagHex.SpecificCharacterSet) {\n if (values.length > 0) {\n let [coding] = values;\n coding = coding.replace(/[_ ]/g, \"-\").toLowerCase();\n if (coding in encodingMapping) {\n coding = encodingMapping[coding];\n this.stream.setDecoder(new TextDecoder(coding));\n } else if (options?.ignoreErrors) {\n log.warn(\n `Unsupported character set: ${coding}, using default character set`\n );\n } else {\n throw Error(`Unsupported character set: ${coding}`);\n }\n }\n // Normalize to UTF-8 in the stored value, matching the synchronous\n // DicomMessage path which always rewrites SpecificCharacterSet to\n // ISO_IR 192 after decoding (dcmjs always re-encodes output as UTF-8).\n //\n // TODO: the original charset value should also be preserved:\n // it is needed for bulk data decoding.\n values = [\"ISO_IR 192\"];\n }\n\n const valuesForListener = Array.isArray(values) ? values : [values];\n valuesForListener.forEach(value => listener.value(value));\n return values;\n }\n}\n","import { DicomMetaDictionary } from \"./DicomMetaDictionary.js\";\nimport { DicomDict } from \"./DicomDict.js\";\n\nfunction datasetToDict(dataset) {\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n const TransferSyntaxUID =\n dataset._meta.TransferSyntaxUID &&\n dataset._meta.TransferSyntaxUID.Value &&\n dataset._meta.TransferSyntaxUID.Value[0]\n ? dataset._meta.TransferSyntaxUID.Value[0]\n : \"1.2.840.10008.1.2.1\";\n\n dataset._meta = {\n MediaStorageSOPClassUID: dataset.SOPClassUID,\n MediaStorageSOPInstanceUID: dataset.SOPInstanceUID,\n ImplementationVersionName: \"dcmjs-0.0\",\n TransferSyntaxUID,\n ImplementationClassUID:\n \"2.25.80302813137786398554742050926734630921603366648225212145404\",\n FileMetaInformationVersion: fileMetaInformationVersionArray.buffer\n };\n\n const denaturalized = DicomMetaDictionary.denaturalizeDataset(\n dataset._meta\n );\n const dicomDict = new DicomDict(denaturalized);\n dicomDict.dict = DicomMetaDictionary.denaturalizeDataset(dataset);\n return dicomDict;\n}\n\nfunction datasetToBuffer(dataset) {\n return Buffer.from(datasetToDict(dataset).write());\n}\n\nfunction datasetToBlob(dataset) {\n const buffer = datasetToBuffer(dataset);\n return new Blob([buffer], { type: \"application/dicom\" });\n}\n\nexport { datasetToBlob, datasetToBuffer, datasetToDict };\n","import { DicomMetaDictionary } from \"../DicomMetaDictionary.js\";\n\nexport default class DerivedDataset {\n constructor(datasets, options = {}) {\n this.options = JSON.parse(JSON.stringify(options));\n let o = this.options;\n\n o.Manufacturer = options.Manufacturer || \"Unspecified\";\n o.ManufacturerModelName =\n options.ManufacturerModelName || \"Unspecified\";\n o.SeriesDescription =\n options.SeriesDescription || \"Research Derived series\";\n o.SeriesNumber = options.SeriesNumber || \"99\";\n o.SoftwareVersions = options.SoftwareVersions || \"0\";\n o.DeviceSerialNumber = options.DeviceSerialNumber || \"1\";\n\n let date = DicomMetaDictionary.date();\n let time = DicomMetaDictionary.time();\n\n o.SeriesDate = options.SeriesDate || date;\n o.SeriesTime = options.SeriesTime || time;\n o.ContentDate = options.ContentDate || date;\n o.ContentTime = options.ContentTime || time;\n\n o.SOPInstanceUID = options.SOPInstanceUID || DicomMetaDictionary.uid();\n o.SeriesInstanceUID =\n options.SeriesInstanceUID || DicomMetaDictionary.uid();\n\n o.ClinicalTrialTimePointID = options.ClinicalTrialTimePointID || \"\";\n o.ClinicalTrialCoordinatingCenterName =\n options.ClinicalTrialCoordinatingCenterName || \"\";\n o.ClinicalTrialSeriesID = options.ClinicalTrialSeriesID || \"\";\n\n // TODO: Move ImageComments (0020,4000) to DerivedPixels since it is not part of the Enhanced SR IOD.\n o.ImageComments = options.ImageComments || \"NOT FOR CLINICAL USE\";\n o.ContentQualification = \"RESEARCH\";\n\n this.referencedDatasets = datasets; // list of one or more dicom-like object instances\n this.referencedDataset = this.referencedDatasets[0];\n this.dataset = {\n _vrMap: this.referencedDataset._vrMap,\n _meta: this.referencedDataset._meta\n };\n\n this.derive();\n }\n\n assignToDataset(data) {\n Object.keys(data).forEach(key => (this.dataset[key] = data[key]));\n }\n\n assignFromReference(tags) {\n tags.forEach(\n tag => (this.dataset[tag] = this.referencedDataset[tag] || \"\")\n );\n }\n\n assignFromOptions(tags) {\n tags.forEach(tag => (this.dataset[tag] = this.options[tag] || \"\"));\n }\n\n derive() {\n // common for all instances in study\n this.assignFromReference([\n \"AccessionNumber\",\n \"ReferringPhysicianName\",\n \"StudyDate\",\n \"StudyID\",\n \"StudyTime\",\n \"PatientName\",\n \"PatientID\",\n \"PatientBirthDate\",\n \"PatientSex\",\n \"PatientAge\",\n \"StudyInstanceUID\",\n \"StudyID\"\n ]);\n\n this.assignFromOptions([\n \"Manufacturer\",\n \"SoftwareVersions\",\n \"DeviceSerialNumber\",\n \"ManufacturerModelName\",\n \"SeriesDescription\",\n \"SeriesNumber\",\n \"ImageComments\",\n \"SeriesDate\",\n \"SeriesTime\",\n \"ContentDate\",\n \"ContentTime\",\n \"ContentQualification\",\n \"SOPInstanceUID\",\n \"SeriesInstanceUID\"\n ]);\n }\n\n static copyDataset(dataset) {\n // copies everything but the buffers\n return JSON.parse(JSON.stringify(dataset));\n }\n}\n","import { DicomMetaDictionary } from \"../DicomMetaDictionary.js\";\nimport DerivedPixels from \"./DerivedPixels\";\nimport DerivedDataset from \"./DerivedDataset\";\nimport { BitArray } from \"../bitArray.js\";\n\nlet Normalizer;\n\nexport default class Segmentation extends DerivedPixels {\n constructor(datasets, options = { includeSliceSpacing: true }) {\n super(datasets, options);\n }\n\n static setNormalizer(normalizer) {\n Normalizer = normalizer;\n }\n\n derive() {\n super.derive();\n\n this.assignToDataset({\n SOPClassUID: DicomMetaDictionary.sopClassUIDsByName.Segmentation,\n Modality: \"SEG\",\n SamplesPerPixel: \"1\",\n PhotometricInterpretation: \"MONOCHROME2\",\n BitsAllocated: \"1\",\n BitsStored: \"1\",\n HighBit: \"0\",\n PixelRepresentation: \"0\",\n LossyImageCompression: \"00\",\n SegmentationType: \"BINARY\",\n ContentLabel: \"SEGMENTATION\"\n });\n\n let dimensionUID = DicomMetaDictionary.uid();\n this.dataset.DimensionOrganizationSequence = {\n DimensionOrganizationUID: dimensionUID\n };\n this.dataset.DimensionIndexSequence = [\n {\n DimensionOrganizationUID: dimensionUID,\n DimensionIndexPointer: 6422539,\n FunctionalGroupPointer: 6422538, // SegmentIdentificationSequence\n DimensionDescriptionLabel: \"ReferencedSegmentNumber\"\n },\n {\n DimensionOrganizationUID: dimensionUID,\n DimensionIndexPointer: 2097202,\n FunctionalGroupPointer: 2134291, // PlanePositionSequence\n DimensionDescriptionLabel: \"ImagePositionPatient\"\n }\n ];\n\n this.dataset.SegmentSequence = [];\n\n // TODO: check logic here.\n // If the referenced dataset itself references a series, then copy.\n // Otherwise, reference the dataset itself.\n // This should allow Slicer and others to get the correct original\n // images when loading Legacy Converted Images, but it's a workaround\n // that really doesn't belong here.\n if (this.referencedDataset.ReferencedSeriesSequence) {\n this.dataset.ReferencedSeriesSequence = DerivedDataset.copyDataset(\n this.referencedDataset.ReferencedSeriesSequence\n );\n } else {\n const ReferencedInstanceSequence = [];\n\n for (let i = 0; i < this.referencedDatasets.length; i++) {\n ReferencedInstanceSequence.push({\n ReferencedSOPClassUID:\n this.referencedDatasets[i].SOPClassUID,\n ReferencedSOPInstanceUID:\n this.referencedDatasets[i].SOPInstanceUID\n });\n }\n\n this.dataset.ReferencedSeriesSequence = {\n SeriesInstanceUID: this.referencedDataset.SeriesInstanceUID,\n StudyInstanceUID: this.referencedDataset.StudyInstanceUID,\n ReferencedInstanceSequence\n };\n }\n\n if (!this.options.includeSliceSpacing) {\n // per dciodvfy this should not be included, but dcmqi/Slicer requires it\n delete this.dataset.SharedFunctionalGroupsSequence\n .PixelMeasuresSequence.SpacingBetweenSlices;\n }\n\n if (\n this.dataset.SharedFunctionalGroupsSequence\n .PixelValueTransformationSequence\n ) {\n // If derived from a CT, this shouldn't be left in the SEG.\n delete this.dataset.SharedFunctionalGroupsSequence\n .PixelValueTransformationSequence;\n }\n\n // The pixelData array needs to be defined once you know how many frames you'll have.\n this.dataset.PixelData = undefined;\n this.dataset.NumberOfFrames = 0;\n\n this.dataset.PerFrameFunctionalGroupsSequence = [];\n }\n\n /**\n * setNumberOfFrames - Sets the number of frames of the segmentation object\n * and allocates (non-bitpacked) memory for the PixelData for constuction.\n *\n * @param {type} NumberOfFrames The number of segmentation frames.\n */\n setNumberOfFrames(NumberOfFrames) {\n const dataset = this.dataset;\n dataset.NumberOfFrames = NumberOfFrames;\n\n dataset.PixelData = new ArrayBuffer(\n dataset.Rows * dataset.Columns * NumberOfFrames\n );\n }\n\n /**\n * bitPackPixelData - Bitpacks the pixeldata, should be called after all\n * segments are addded.\n *\n * @returns {type} description\n */\n bitPackPixelData() {\n if (this.isBitpacked) {\n console.warn(\n `This.bitPackPixelData has already been called, it should only be called once, when all frames have been added. Exiting.`\n );\n }\n\n const dataset = this.dataset;\n const unpackedPixelData = dataset.PixelData;\n const uInt8ViewUnpackedPixelData = new Uint8Array(unpackedPixelData);\n const bitPackedPixelData = BitArray.pack(uInt8ViewUnpackedPixelData);\n\n dataset.PixelData = bitPackedPixelData.buffer;\n\n this.isBitpacked = true;\n }\n\n /**\n * addSegmentFromLabelmap - Adds a segment to the dataset,\n * where the labelmaps are a set of 2D labelmaps, from which to extract the binary maps.\n *\n * @param {type} Segment The segment metadata.\n * @param {Uint8Array[]} labelmaps labelmap arrays for each index of referencedFrameNumbers.\n * @param {number} segmentIndexInLabelmap The segment index to extract from the labelmap\n * (might be different to the segment metadata depending on implementation).\n * @param {number[]} referencedFrameNumbers The frames that the\n * segmentation references.\n *\n */\n addSegmentFromLabelmap(\n Segment,\n labelmaps,\n segmentIndexInLabelmap,\n referencedFrameNumbers\n ) {\n if (this.dataset.NumberOfFrames === 0) {\n throw new Error(\n \"Must set the total number of frames via setNumberOfFrames() before adding segments to the segmentation.\"\n );\n }\n\n this._addSegmentPixelDataFromLabelmaps(\n labelmaps,\n segmentIndexInLabelmap\n );\n const ReferencedSegmentNumber = this._addSegmentMetadata(Segment);\n this._addPerFrameFunctionalGroups(\n ReferencedSegmentNumber,\n referencedFrameNumbers\n );\n }\n\n _addSegmentPixelDataFromLabelmaps(labelmaps, segmentIndex) {\n const dataset = this.dataset;\n const existingFrames = dataset.PerFrameFunctionalGroupsSequence.length;\n const sliceLength = dataset.Rows * dataset.Columns;\n const byteOffset = existingFrames * sliceLength;\n\n const pixelDataUInt8View = new Uint8Array(\n dataset.PixelData,\n byteOffset,\n labelmaps.length * sliceLength\n );\n\n const occupiedValue = this._getOccupiedValue();\n\n for (let l = 0; l < labelmaps.length; l++) {\n const labelmap = labelmaps[l];\n\n for (let i = 0; i < labelmap.length; i++) {\n if (labelmap[i] === segmentIndex) {\n pixelDataUInt8View[l * sliceLength + i] = occupiedValue;\n }\n }\n }\n }\n\n _getOccupiedValue() {\n if (this.dataset.SegmentationType === \"FRACTIONAL\") {\n return 255;\n }\n\n return 1;\n }\n\n /**\n * addSegment - Adds a segment to the dataset.\n *\n * @param {type} Segment The segment metadata.\n * @param {Uint8Array} pixelData The pixelData array containing all frames\n * of the segmentation.\n * @param {Number[]} referencedFrameNumbers The frames that the\n * segmentation references.\n *\n */\n addSegment(Segment, pixelData, referencedFrameNumbers) {\n if (this.dataset.NumberOfFrames === 0) {\n throw new Error(\n \"Must set the total number of frames via setNumberOfFrames() before adding segments to the segmentation.\"\n );\n }\n\n this._addSegmentPixelData(pixelData);\n const ReferencedSegmentNumber = this._addSegmentMetadata(Segment);\n this._addPerFrameFunctionalGroups(\n ReferencedSegmentNumber,\n referencedFrameNumbers\n );\n }\n\n _addSegmentPixelData(pixelData) {\n const dataset = this.dataset;\n\n const existingFrames = dataset.PerFrameFunctionalGroupsSequence.length;\n const sliceLength = dataset.Rows * dataset.Columns;\n const byteOffset = existingFrames * sliceLength;\n\n const pixelDataUInt8View = new Uint8Array(\n dataset.PixelData,\n byteOffset,\n pixelData.length\n );\n\n for (let i = 0; i < pixelData.length; i++) {\n pixelDataUInt8View[i] = pixelData[i];\n }\n }\n\n _addPerFrameFunctionalGroups(\n ReferencedSegmentNumber,\n referencedFrameNumbers\n ) {\n const PerFrameFunctionalGroupsSequence =\n this.dataset.PerFrameFunctionalGroupsSequence;\n\n const ReferencedSeriesSequence =\n this.referencedDataset.ReferencedSeriesSequence;\n\n for (let i = 0; i < referencedFrameNumbers.length; i++) {\n const frameNumber = referencedFrameNumbers[i];\n\n const perFrameFunctionalGroups = {};\n\n perFrameFunctionalGroups.PlanePositionSequence =\n DerivedDataset.copyDataset(\n this.referencedDataset.PerFrameFunctionalGroupsSequence[\n frameNumber - 1\n ].PlanePositionSequence\n );\n\n // If the PlaneOrientationSequence is not in the SharedFunctionalGroupsSequence,\n // extract it from the PerFrameFunctionalGroupsSequence.\n if (\n !this.dataset.SharedFunctionalGroupsSequence\n .PlaneOrientationSequence\n ) {\n perFrameFunctionalGroups.PlaneOrientationSequence =\n DerivedDataset.copyDataset(\n this.referencedDataset.PerFrameFunctionalGroupsSequence[\n frameNumber - 1\n ].PlaneOrientationSequence\n );\n }\n\n perFrameFunctionalGroups.FrameContentSequence = {\n DimensionIndexValues: [ReferencedSegmentNumber, frameNumber]\n };\n\n perFrameFunctionalGroups.SegmentIdentificationSequence = {\n ReferencedSegmentNumber\n };\n\n let ReferencedSOPClassUID;\n let ReferencedSOPInstanceUID;\n let ReferencedFrameNumber;\n\n if (ReferencedSeriesSequence) {\n const referencedInstanceSequenceI =\n ReferencedSeriesSequence.ReferencedInstanceSequence[\n frameNumber - 1\n ];\n\n ReferencedSOPClassUID =\n referencedInstanceSequenceI.ReferencedSOPClassUID;\n ReferencedSOPInstanceUID =\n referencedInstanceSequenceI.ReferencedSOPInstanceUID;\n\n if (Normalizer.isMultiframeSOPClassUID(ReferencedSOPClassUID)) {\n ReferencedFrameNumber = frameNumber;\n }\n } else {\n ReferencedSOPClassUID = this.referencedDataset.SOPClassUID;\n ReferencedSOPInstanceUID =\n this.referencedDataset.SOPInstanceUID;\n ReferencedFrameNumber = frameNumber;\n }\n\n if (ReferencedFrameNumber) {\n perFrameFunctionalGroups.DerivationImageSequence = {\n SourceImageSequence: {\n ReferencedSOPClassUID,\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber,\n PurposeOfReferenceCodeSequence: {\n CodeValue: \"121322\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning:\n \"Source image for image processing operation\"\n }\n },\n DerivationCodeSequence: {\n CodeValue: \"113076\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Segmentation\"\n }\n };\n } else {\n perFrameFunctionalGroups.DerivationImageSequence = {\n SourceImageSequence: {\n ReferencedSOPClassUID,\n ReferencedSOPInstanceUID,\n PurposeOfReferenceCodeSequence: {\n CodeValue: \"121322\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning:\n \"Source image for image processing operation\"\n }\n },\n DerivationCodeSequence: {\n CodeValue: \"113076\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Segmentation\"\n }\n };\n }\n\n PerFrameFunctionalGroupsSequence.push(perFrameFunctionalGroups);\n }\n }\n\n _addSegmentMetadata(Segment) {\n if (\n !Segment.SegmentLabel ||\n !Segment.SegmentedPropertyCategoryCodeSequence ||\n !Segment.SegmentedPropertyTypeCodeSequence ||\n !Segment.SegmentAlgorithmType\n ) {\n throw new Error(\n `Segment does not contain all the required fields.`\n );\n }\n\n // Capitalise the SegmentAlgorithmType if it happens to be given in\n // Lower/mixed case.\n Segment.SegmentAlgorithmType =\n Segment.SegmentAlgorithmType.toUpperCase();\n\n // Check SegmentAlgorithmType and SegmentAlgorithmName if necessary.\n switch (Segment.SegmentAlgorithmType) {\n case \"AUTOMATIC\":\n case \"SEMIAUTOMATIC\":\n if (!Segment.SegmentAlgorithmName) {\n throw new Error(\n `If the SegmentAlgorithmType is SEMIAUTOMATIC or AUTOMATIC,\n SegmentAlgorithmName must be provided`\n );\n }\n\n break;\n case \"MANUAL\":\n break;\n default:\n throw new Error(\n `SegmentAlgorithmType ${Segment.SegmentAlgorithmType} invalid.`\n );\n }\n\n // Deep copy, so we don't change the segment index stored in cornerstoneTools.\n\n const SegmentSequence = this.dataset.SegmentSequence;\n\n const SegmentAlgorithmType = Segment.SegmentAlgorithmType;\n\n const reNumberedSegmentCopy = {\n SegmentedPropertyCategoryCodeSequence:\n Segment.SegmentedPropertyCategoryCodeSequence,\n SegmentNumber: (SegmentSequence.length + 1).toString(),\n SegmentLabel: Segment.SegmentLabel,\n SegmentAlgorithmType,\n RecommendedDisplayCIELabValue:\n Segment.RecommendedDisplayCIELabValue,\n SegmentedPropertyTypeCodeSequence:\n Segment.SegmentedPropertyTypeCodeSequence\n };\n\n if (Segment.SegmentDescription) {\n reNumberedSegmentCopy.SegmentDescription =\n Segment.SegmentDescription;\n }\n\n if (\n SegmentAlgorithmType === \"AUTOMATIC\" ||\n SegmentAlgorithmType === \"SEMIAUTOMATIC\"\n ) {\n reNumberedSegmentCopy.SegmentAlgorithmName =\n Segment.SegmentAlgorithmName;\n }\n\n SegmentSequence.push(reNumberedSegmentCopy);\n\n return reNumberedSegmentCopy.SegmentNumber;\n }\n}\n","import DerivedDataset from \"./DerivedDataset\";\n\nexport default class DerivedPixels extends DerivedDataset {\n constructor(datasets, options = {}) {\n super(datasets, options);\n let o = this.options;\n\n o.ContentLabel = options.ContentLabel || \"\";\n o.ContentDescription = options.ContentDescription || \"\";\n o.ContentCreatorName = options.ContentCreatorName || \"\";\n }\n\n // this assumes a normalized multiframe input and will create\n // a multiframe derived image\n derive() {\n super.derive();\n\n this.assignToDataset({\n ImageType: [\"DERIVED\", \"PRIMARY\"],\n LossyImageCompression: \"00\",\n InstanceNumber: \"1\"\n });\n\n this.assignFromReference([\n \"SOPClassUID\",\n \"Modality\",\n \"FrameOfReferenceUID\",\n \"PositionReferenceIndicator\",\n \"NumberOfFrames\",\n \"Rows\",\n \"Columns\",\n \"SamplesPerPixel\",\n \"PhotometricInterpretation\",\n \"BitsStored\",\n \"HighBit\"\n ]);\n\n this.assignFromOptions([\n \"ContentLabel\",\n \"ContentDescription\",\n \"ContentCreatorName\"\n ]);\n\n //\n // TODO: more carefully copy only PixelMeasures and related\n // TODO: add derivation references\n //\n if (this.referencedDataset.SharedFunctionalGroupsSequence) {\n this.dataset.SharedFunctionalGroupsSequence =\n DerivedDataset.copyDataset(\n this.referencedDataset.SharedFunctionalGroupsSequence\n );\n }\n if (this.referencedDataset.PerFrameFunctionalGroupsSequence) {\n this.dataset.PerFrameFunctionalGroupsSequence =\n DerivedDataset.copyDataset(\n this.referencedDataset.PerFrameFunctionalGroupsSequence\n );\n }\n\n // make an array of zeros for the pixels\n this.dataset.PixelData = new ArrayBuffer(\n this.referencedDataset.PixelData.byteLength\n );\n }\n}\n","import DerivedPixels from \"./DerivedPixels\";\n\nexport default class DerivedImage extends DerivedPixels {\n constructor(datasets, options = {}) {\n super(datasets, options);\n }\n\n derive() {\n super.derive();\n this.assignFromReference([\n \"WindowCenter\",\n \"WindowWidth\",\n \"BitsAllocated\",\n \"PixelRepresentation\",\n \"BodyPartExamined\",\n \"Laterality\",\n \"PatientPosition\",\n \"RescaleSlope\",\n \"RescaleIntercept\",\n \"PixelPresentation\",\n \"VolumetricProperties\",\n \"VolumeBasedCalculationTechnique\",\n \"PresentationLUTShape\"\n ]);\n }\n}\n","import DerivedDataset from \"./DerivedDataset.js\";\n\nexport default class ParametricMap extends DerivedDataset {\n constructor(datasets, options = {}) {\n super(datasets, options);\n }\n\n // this assumes a normalized multiframe input and will create\n // a multiframe derived image\n derive() {\n super.derive();\n\n this.assignToDataset({\n // TODO: ???\n });\n\n this.assignFromReference([]);\n }\n}\n","import DerivedDataset from \"./DerivedDataset\";\nimport { DicomMetaDictionary } from \"../DicomMetaDictionary\";\n\nexport default class StructuredReport extends DerivedDataset {\n constructor(datasets, options = {}) {\n super(datasets, options);\n }\n\n // this assumes a normalized multiframe input and will create\n // a multiframe derived image\n derive() {\n super.derive();\n\n this.assignToDataset({\n SOPClassUID: DicomMetaDictionary.sopClassUIDsByName.EnhancedSR,\n Modality: \"SR\",\n ValueType: \"CONTAINER\"\n });\n\n this.assignFromReference([]);\n }\n}\n","import log from \"./log.js\";\nimport { DicomMetaDictionary } from \"./DicomMetaDictionary.js\";\nimport { DerivedImage } from \"./derivations/index.js\";\nimport Segmentation from \"./derivations/Segmentation.js\";\n\nclass Normalizer {\n constructor(datasets) {\n this.datasets = datasets; // one or more dicom-like object instances\n this.dataset = undefined; // a normalized multiframe dicom object instance\n }\n\n static consistentSOPClassUIDs(datasets) {\n // return sopClassUID if all exist and match, otherwise undefined\n let sopClassUID;\n datasets.forEach(function (dataset) {\n if (!dataset.SOPClassUID) {\n return undefined;\n }\n if (!sopClassUID) {\n sopClassUID = dataset.SOPClassUID;\n }\n if (dataset.SOPClassUID !== sopClassUID) {\n log.error(\n \"inconsistent sopClassUIDs: \",\n dataset.SOPClassUID,\n sopClassUID\n );\n return undefined;\n }\n });\n return sopClassUID;\n }\n\n static normalizerForSOPClassUID(sopClassUID) {\n sopClassUID = sopClassUID.replace(/[^0-9.]/g, \"\"); // TODO: clean all VRs as part of normalizing\n let toUID = DicomMetaDictionary.sopClassUIDsByName;\n let sopClassUIDMap = {};\n sopClassUIDMap[toUID.NMImage] = NMImageNormalizer;\n sopClassUIDMap[toUID.CTImage] = CTImageNormalizer;\n sopClassUIDMap[toUID.ParametricMapStorage] = PMImageNormalizer;\n sopClassUIDMap[toUID.MRImage] = MRImageNormalizer;\n sopClassUIDMap[toUID.EnhancedCTImage] = EnhancedCTImageNormalizer;\n sopClassUIDMap[toUID.LegacyConvertedEnhancedCTImage] =\n EnhancedCTImageNormalizer;\n sopClassUIDMap[toUID.EnhancedMRImage] = EnhancedMRImageNormalizer;\n sopClassUIDMap[toUID.LegacyConvertedEnhancedMRImage] =\n EnhancedMRImageNormalizer;\n sopClassUIDMap[toUID.EnhancedUSVolume] = EnhancedUSVolumeNormalizer;\n sopClassUIDMap[toUID.PETImage] = PETImageNormalizer;\n sopClassUIDMap[toUID.EnhancedPETImage] = PETImageNormalizer;\n sopClassUIDMap[toUID.LegacyConvertedEnhancedPETImage] =\n PETImageNormalizer;\n sopClassUIDMap[toUID.Segmentation] = SEGImageNormalizer;\n sopClassUIDMap[toUID.DeformableSpatialRegistration] = DSRNormalizer;\n sopClassUIDMap[toUID.OphthalmicPhotography8BitImage] =\n OPImageNormalizer;\n sopClassUIDMap[toUID.OphthalmicTomographyImage] = OCTImageNormalizer;\n sopClassUIDMap[toUID.LabelmapSegmentation] = SEGImageNormalizer; // Labelmap Segmentation uses the same normalizer as Segmentation\n return sopClassUIDMap[sopClassUID];\n }\n\n static isMultiframeSOPClassUID(sopClassUID) {\n const toUID = DicomMetaDictionary.sopClassUIDsByName;\n const multiframeSOPClasses = [\n toUID.NMImage,\n toUID.EnhancedMRImage,\n toUID.LegacyConvertedEnhancedMRImage,\n toUID.EnhancedCTImage,\n toUID.LegacyConvertedEnhancedCTImage,\n toUID.EnhancedUSVolume,\n toUID.EnhancedPETImage,\n toUID.LegacyConvertedEnhancedPETImage,\n toUID.Segmentation,\n toUID.ParametricMapStorage,\n toUID.OphthalmicTomographyImage,\n toUID.LabelmapSegmentation // Labelmap Segmentation SOP Class UID\n ];\n return multiframeSOPClasses.indexOf(sopClassUID) !== -1;\n }\n\n static isMultiframeDataset(ds = this.dataset) {\n const sopClassUID = ds.SOPClassUID.replace(/[^0-9.]/g, \"\"); // TODO: clean all VRs as part of normalizing\n return Normalizer.isMultiframeSOPClassUID(sopClassUID);\n }\n\n normalize() {\n return \"No normalization defined\";\n }\n\n static normalizeToDataset(datasets) {\n let sopClassUID = Normalizer.consistentSOPClassUIDs(datasets);\n let normalizerClass = Normalizer.normalizerForSOPClassUID(sopClassUID);\n\n if (!normalizerClass) {\n log.error(\"no normalizerClass for \", sopClassUID);\n return undefined;\n }\n let normalizer = new normalizerClass(datasets);\n normalizer.normalize();\n return normalizer.dataset;\n }\n}\n\nclass ImageNormalizer extends Normalizer {\n normalize() {\n this.convertToMultiframe();\n this.normalizeMultiframe();\n }\n\n static vec3CrossProduct(a, b) {\n let ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2];\n let out = [];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n }\n\n static vec3Subtract(a, b) {\n let out = [];\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n }\n\n static vec3Dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n }\n\n convertToMultiframe() {\n if (\n this.datasets.length === 1 &&\n Normalizer.isMultiframeDataset(this.datasets[0])\n ) {\n // already a multiframe, so just use it\n this.dataset = this.datasets[0];\n return;\n }\n this.derivation = new DerivedImage(this.datasets);\n this.dataset = this.derivation.dataset;\n let ds = this.dataset;\n // create a new multiframe from the source datasets\n // fill in only those elements required to make a valid image\n // for volumetric processing\n let referenceDataset = this.datasets[0];\n ds.NumberOfFrames = this.datasets.length;\n\n // TODO: develop sets of elements to copy over in loops\n ds.SOPClassUID = referenceDataset.SOPClassUID;\n ds.Rows = referenceDataset.Rows;\n ds.Columns = referenceDataset.Columns;\n ds.BitsAllocated = referenceDataset.BitsAllocated;\n ds.PixelRepresentation = referenceDataset.PixelRepresentation;\n ds.RescaleSlope = referenceDataset.RescaleSlope || \"1\";\n ds.RescaleIntercept = referenceDataset.RescaleIntercept || \"0\";\n //ds.BurnedInAnnotation = referenceDataset.BurnedInAnnotation || \"YES\";\n\n // sort\n // https://github.com/pieper/Slicer3/blob/master/Base/GUI/Tcl/LoadVolume.tcl\n // TODO: add spacing checks:\n // https://github.com/Slicer/Slicer/blob/master/Modules/Scripted/DICOMPlugins/DICOMScalarVolumePlugin.py#L228-L250\n // TODO: put this information into the Shared and PerFrame functional groups\n // TODO: sorting of frames could happen in normalizeMultiframe instead, since other\n // multiframe converters may not sort the images\n // TODO: sorting can be seen as part of generation of the Dimension Multiframe Dimension Module\n // and should really be done in an acquisition-specific way (e.g. for DCE)\n let referencePosition = referenceDataset.ImagePositionPatient;\n let rowVector = referenceDataset.ImageOrientationPatient.slice(0, 3);\n let columnVector = referenceDataset.ImageOrientationPatient.slice(3, 6);\n let scanAxis = ImageNormalizer.vec3CrossProduct(\n rowVector,\n columnVector\n );\n let distanceDatasetPairs = [];\n this.datasets.forEach(function (dataset) {\n let position = dataset.ImagePositionPatient.slice();\n let positionVector = ImageNormalizer.vec3Subtract(\n position,\n referencePosition\n );\n let distance = ImageNormalizer.vec3Dot(positionVector, scanAxis);\n distanceDatasetPairs.push([distance, dataset]);\n });\n distanceDatasetPairs.sort(function (a, b) {\n return b[0] - a[0];\n });\n\n // assign array buffers\n if (ds.BitsAllocated !== 16) {\n log.error(\n \"Only works with 16 bit data, not \" +\n String(this.dataset.BitsAllocated)\n );\n }\n if (referenceDataset._vrMap && !referenceDataset._vrMap.PixelData) {\n log.warn(\"No vr map given for pixel data, using OW\");\n ds._vrMap = { PixelData: \"OW\" };\n } else {\n ds._vrMap = { PixelData: referenceDataset._vrMap.PixelData };\n }\n let frameSize = referenceDataset.PixelData.byteLength;\n ds.PixelData = new ArrayBuffer(ds.NumberOfFrames * frameSize);\n let frame = 0;\n distanceDatasetPairs.forEach(function (pair) {\n let dataset = pair[1];\n let pixels = new Uint16Array(dataset.PixelData);\n let frameView = new Uint16Array(\n ds.PixelData,\n frame * frameSize,\n frameSize / 2\n );\n try {\n frameView.set(pixels);\n } catch (e) {\n if (e instanceof RangeError) {\n const message =\n \"Error inserting pixels in PixelData\\n\" +\n `frameSize ${frameSize}\\n` +\n `NumberOfFrames ${ds.NumberOfFrames}\\n` +\n `pair ${pair}\\n` +\n `dataset PixelData size ${dataset.PixelData.length}`;\n log.error(message);\n }\n }\n frame++;\n });\n\n if (ds.NumberOfFrames < 2) {\n // TODO\n log.error(\n \"Cannot populate shared groups uniquely without multiple frames\"\n );\n }\n let [distance0, dataset0] = distanceDatasetPairs[0];\n let distance1 = distanceDatasetPairs[1][0];\n\n //\n // make the functional groups\n //\n // shared\n const SpacingBetweenSlices = Math.abs(distance1 - distance0);\n\n ds.SharedFunctionalGroupsSequence = {\n PlaneOrientationSequence: {\n ImageOrientationPatient: dataset0.ImageOrientationPatient\n },\n PixelMeasuresSequence: {\n PixelSpacing: dataset0.PixelSpacing,\n SpacingBetweenSlices: SpacingBetweenSlices,\n SliceThickness: SpacingBetweenSlices\n }\n };\n\n ds.ReferencedSeriesSequence = {\n SeriesInstanceUID: dataset0.SeriesInstanceUID,\n ReferencedInstanceSequence: []\n };\n\n // per-frame\n ds.PerFrameFunctionalGroupsSequence = [];\n\n // copy over each datasets window/level into the per-frame groups\n // and set the referenced series uid\n distanceDatasetPairs.forEach(function (pair) {\n const dataset = pair[1];\n\n ds.PerFrameFunctionalGroupsSequence.push({\n PlanePositionSequence: {\n ImagePositionPatient: dataset.ImagePositionPatient\n },\n FrameVOILUTSequence: {\n WindowCenter: dataset.WindowCenter,\n WindowWidth: dataset.WindowWidth\n }\n });\n\n ds.ReferencedSeriesSequence.ReferencedInstanceSequence.push({\n ReferencedSOPClassUID: dataset.SOPClassUID,\n ReferencedSOPInstanceUID: dataset.SOPInstanceUID\n });\n });\n\n let dimensionUID = DicomMetaDictionary.uid();\n this.dataset.DimensionOrganizationSequence = {\n DimensionOrganizationUID: dimensionUID\n };\n this.dataset.DimensionIndexSequence = [\n {\n DimensionOrganizationUID: dimensionUID,\n DimensionIndexPointer: 2097202,\n FunctionalGroupPointer: 2134291, // PlanePositionSequence\n DimensionDescriptionLabel: \"ImagePositionPatient\"\n }\n ];\n }\n\n normalizeMultiframe() {\n let ds = this.dataset;\n\n if (!ds.NumberOfFrames) {\n log.error(\"Missing number or frames not supported\");\n return;\n }\n\n if (!ds.PixelRepresentation) {\n // Required tag: guess signed\n ds.PixelRepresentation = 1;\n }\n\n if (!ds.StudyID || ds.StudyID === \"\") {\n // Required tag: fill in if needed\n ds.StudyID = \"No Study ID\";\n }\n\n let validLateralities = [\"R\", \"L\"];\n if (validLateralities.indexOf(ds.Laterality) === -1) {\n delete ds.Laterality;\n }\n\n if (!ds.PresentationLUTShape) {\n ds.PresentationLUTShape = \"IDENTITY\";\n }\n\n if (!ds.SharedFunctionalGroupsSequence) {\n log.error(\n \"Can only process multiframe data with SharedFunctionalGroupsSequence\"\n );\n }\n\n // TODO: special case!\n if (ds.BodyPartExamined === \"PROSTATE\") {\n ds.SharedFunctionalGroupsSequence.FrameAnatomySequence = {\n AnatomicRegionSequence: {\n CodeValue: \"T-9200B\",\n CodingSchemeDesignator: \"SRT\",\n CodeMeaning: \"Prostate\"\n },\n FrameLaterality: \"U\"\n };\n }\n\n let rescaleIntercept = ds.RescaleIntercept || 0;\n let rescaleSlope = ds.RescaleSlope || 1;\n ds.SharedFunctionalGroupsSequence.PixelValueTransformationSequence = {\n RescaleIntercept: rescaleIntercept,\n RescaleSlope: rescaleSlope,\n RescaleType: \"US\"\n };\n let frameNumber = 1;\n this.datasets.forEach(dataset => {\n if (ds.NumberOfFrames === 1)\n ds.PerFrameFunctionalGroupsSequence = [\n ds.PerFrameFunctionalGroupsSequence\n ];\n ds.PerFrameFunctionalGroupsSequence[\n frameNumber - 1\n ].FrameContentSequence = {\n FrameAcquisitionDuration: 0,\n StackID: 1,\n InStackPositionNumber: frameNumber,\n DimensionIndexValues: frameNumber\n };\n let frameTime = dataset.AcquisitionDate + dataset.AcquisitionTime;\n if (!isNaN(frameTime)) {\n let frameContentSequence =\n ds.PerFrameFunctionalGroupsSequence[frameNumber - 1]\n .FrameContentSequence;\n frameContentSequence.FrameAcquisitionDateTime = frameTime;\n frameContentSequence.FrameReferenceDateTime = frameTime;\n }\n\n frameNumber++;\n });\n\n //\n // TODO: convert this to shared functional group not top level element\n //\n if (ds.WindowCenter && ds.WindowWidth) {\n // if they exist as single values, make them lists for consistency\n if (!Array.isArray(ds.WindowCenter)) {\n ds.WindowCenter = [ds.WindowCenter];\n }\n if (!Array.isArray(ds.WindowWidth)) {\n ds.WindowWidth = [ds.WindowWidth];\n }\n }\n if (!ds.WindowCenter || !ds.WindowWidth) {\n // if they don't exist, make them empty lists and try to initialize them\n ds.WindowCenter = []; // both must exist and be the same length\n ds.WindowWidth = [];\n // provide a volume-level window/level guess (mean of per-frame)\n if (ds.PerFrameFunctionalGroupsSequence) {\n let wcww = { center: 0, width: 0, count: 0 };\n ds.PerFrameFunctionalGroupsSequence.forEach(function (\n functionalGroup\n ) {\n if (functionalGroup.FrameVOILUT) {\n let wc =\n functionalGroup.FrameVOILUTSequence.WindowCenter;\n let ww =\n functionalGroup.FrameVOILUTSequence.WindowWidth;\n if (functionalGroup.FrameVOILUTSequence && wc && ww) {\n if (Array.isArray(wc)) {\n wc = wc[0];\n }\n if (Array.isArray(ww)) {\n ww = ww[0];\n }\n wcww.center += Number(wc);\n wcww.width += Number(ww);\n wcww.count++;\n }\n }\n });\n if (wcww.count > 0) {\n ds.WindowCenter.push(String(wcww.center / wcww.count));\n ds.WindowWidth.push(String(wcww.width / wcww.count));\n }\n }\n }\n // last gasp, pick an arbitrary default\n if (ds.WindowCenter.length === 0) {\n ds.WindowCenter = [300];\n }\n if (ds.WindowWidth.length === 0) {\n ds.WindowWidth = [500];\n }\n }\n}\n\nclass MRImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n // TODO: make specialization for LegacyConverted vs normal EnhanceMRImage\n //let toUID = DicomMetaDictionary.sopClassUIDsByName;\n this.dataset.SOPClassUID = \"LegacyConvertedEnhancedMRImage\";\n //this.dataset.SOPClassUID = toUID.EnhancedMRImage;\n }\n\n normalizeMultiframe() {\n super.normalizeMultiframe();\n let ds = this.dataset;\n\n if (\n !ds.ImageType ||\n !ds.ImageType.constructor ||\n ds.ImageType.constructor.name != \"Array\" ||\n ds.ImageType.length != 4\n ) {\n ds.ImageType = [\"ORIGINAL\", \"PRIMARY\", \"OTHER\", \"NONE\"];\n }\n\n ds.SharedFunctionalGroupsSequence.MRImageFrameTypeSequence = {\n FrameType: ds.ImageType,\n PixelPresentation: \"MONOCHROME\",\n VolumetricProperties: \"VOLUME\",\n VolumeBasedCalculationTechnique: \"NONE\",\n ComplexImageComponent: \"MAGNITUDE\",\n AcquisitionContrast: \"UNKNOWN\"\n };\n }\n}\n\nclass EnhancedCTImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n }\n}\n\nclass EnhancedMRImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n }\n}\n\nclass EnhancedUSVolumeNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n }\n}\nclass NMImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n // TODO: provide option at export to swap in LegacyConverted UID\n let toUID = DicomMetaDictionary.sopClassUIDsByName;\n\n this.dataset.SOPClassUID = toUID.NMImage;\n }\n}\n\nclass CTImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n // TODO: provide option at export to swap in LegacyConverted UID\n let toUID = DicomMetaDictionary.sopClassUIDsByName;\n //this.dataset.SOPClassUID = \"LegacyConvertedEnhancedCTImage\";\n this.dataset.SOPClassUID = toUID.EnhancedCTImage;\n }\n}\n\nclass PETImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n // TODO: provide option at export to swap in LegacyConverted UID\n let toUID = DicomMetaDictionary.sopClassUIDsByName;\n //this.dataset.SOPClassUID = \"LegacyConvertedEnhancedPETImage\";\n this.dataset.SOPClassUID = toUID.EnhancedPETImage;\n }\n}\n\nclass SEGImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n }\n}\n\nclass PMImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n let ds = this.datasets[0];\n if (ds.BitsAllocated !== 32) {\n log.error(\n \"Only works with 32 bit data, not \" + String(ds.BitsAllocated)\n );\n }\n }\n}\n\nclass DSRNormalizer extends Normalizer {\n normalize() {\n this.dataset = this.datasets[0]; // only one dataset per series and for now we assume it is normalized\n }\n}\n\nclass OPImageNormalizer extends Normalizer {\n normalize() {\n this.dataset = this.datasets[0]; // only one dataset per series and for now we assume it is normalized\n }\n}\n\nclass OCTImageNormalizer extends ImageNormalizer {\n normalize() {\n super.normalize();\n }\n}\n\n// Avoid import loops\nSegmentation.setNormalizer(Normalizer);\n\nexport { Normalizer };\nexport { ImageNormalizer };\nexport { MRImageNormalizer };\nexport { EnhancedCTImageNormalizer };\nexport { EnhancedMRImageNormalizer };\nexport { EnhancedUSVolumeNormalizer };\nexport { NMImageNormalizer };\nexport { CTImageNormalizer };\nexport { PETImageNormalizer };\nexport { SEGImageNormalizer };\nexport { PMImageNormalizer };\nexport { DSRNormalizer };\nexport { OPImageNormalizer };\nexport { OCTImageNormalizer };\n","import addAccessors from \"../addAccessors\";\n\nexport default class TID1500MeasurementReport {\n constructor(TIDIncludeGroups) {\n this.TIDIncludeGroups = TIDIncludeGroups;\n\n const ImageLibraryContentSequence = [];\n const CurrentRequestedProcedureEvidenceSequence = [];\n\n this.ImageLibraryContentSequence = ImageLibraryContentSequence;\n this.CurrentRequestedProcedureEvidenceSequence =\n CurrentRequestedProcedureEvidenceSequence;\n\n this.PersonObserverName = {\n RelationshipType: \"HAS OBS CONTEXT\",\n ValueType: \"PNAME\",\n ConceptNameCodeSequence: {\n CodeValue: \"121008\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Person Observer Name\"\n },\n PersonName: \"unknown^unknown\"\n };\n\n this.tid1500 = {\n ConceptNameCodeSequence: {\n CodeValue: \"126000\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Imaging Measurement Report\"\n },\n ContinuityOfContent: \"SEPARATE\",\n PerformedProcedureCodeSequence: [],\n CompletionFlag: \"COMPLETE\",\n VerificationFlag: \"UNVERIFIED\",\n ReferencedPerformedProcedureStepSequence: [],\n InstanceNumber: 1,\n CurrentRequestedProcedureEvidenceSequence,\n CodingSchemeIdentificationSequence: {\n CodingSchemeDesignator: \"99dcmjs\",\n CodingSchemeName: \"Codes used for dcmjs\",\n CodingSchemeVersion: \"0\",\n CodingSchemeResponsibleOrganization:\n \"https://github.com/dcmjs-org/dcmjs\"\n },\n ContentTemplateSequence: {\n MappingResource: \"DCMR\",\n TemplateIdentifier: \"1500\"\n },\n ContentSequence: [\n {\n RelationshipType: \"HAS CONCEPT MOD\",\n ValueType: \"CODE\",\n ConceptNameCodeSequence: addAccessors({\n CodeValue: \"121049\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Language of Content Item and Descendants\"\n }),\n ConceptCodeSequence: addAccessors({\n CodeValue: \"en\",\n CodingSchemeDesignator: \"RFC5646\",\n CodeMeaning: \"English\"\n }),\n ContentSequence: addAccessors({\n RelationshipType: \"HAS CONCEPT MOD\",\n ValueType: \"CODE\",\n ConceptNameCodeSequence: addAccessors({\n CodeValue: \"121046\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Country of Language\"\n }),\n ConceptCodeSequence: addAccessors({\n CodeValue: \"US\",\n CodingSchemeDesignator: \"ISO3166_1\",\n CodeMeaning: \"United States\"\n })\n })\n },\n this.PersonObserverName,\n {\n RelationshipType: \"HAS CONCEPT MOD\",\n ValueType: \"CODE\",\n ConceptNameCodeSequence: addAccessors({\n CodeValue: \"121058\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Procedure reported\"\n }),\n ConceptCodeSequence: addAccessors({\n CodeValue: \"363679005\",\n CodingSchemeDesignator: \"SCT\",\n CodeMeaning: \"Imaging procedure\"\n })\n },\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"CONTAINER\",\n ConceptNameCodeSequence: {\n CodeValue: \"111028\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Image Library\"\n },\n ContinuityOfContent: \"SEPARATE\",\n ContentSequence: {\n RelationshipType: \"CONTAINS\",\n ValueType: \"CONTAINER\",\n ConceptNameCodeSequence: {\n CodeValue: \"126200\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Image Library Group\"\n },\n ContinuityOfContent: \"SEPARATE\",\n ContentSequence: ImageLibraryContentSequence\n }\n }\n ]\n };\n }\n\n validate() {}\n\n contentItem(derivationSourceDatasetOrDatasets, options = {}) {\n if (options.PersonName) {\n this.PersonObserverName.PersonName = options.PersonName;\n }\n\n // Note this is left in for compatibility with the Cornerstone Legacy adapter which only supports one series for now.\n const derivationSourceDatasets = Array.isArray(\n derivationSourceDatasetOrDatasets\n )\n ? derivationSourceDatasetOrDatasets\n : [derivationSourceDatasetOrDatasets];\n\n // Add the Measurement Groups to the Measurement Report\n this.addTID1501MeasurementGroups(derivationSourceDatasets, options);\n\n return this.tid1500;\n }\n\n addTID1501MeasurementGroups(derivationSourceDatasets, options = {}) {\n const {\n CurrentRequestedProcedureEvidenceSequence,\n ImageLibraryContentSequence\n } = this;\n\n const { sopInstanceUIDsToSeriesInstanceUIDMap } = options;\n\n if (\n derivationSourceDatasets.length > 1 &&\n sopInstanceUIDsToSeriesInstanceUIDMap === undefined\n ) {\n throw new Error(\n `addTID1501MeasurementGroups provided with ${derivationSourceDatasets.length} derivationSourceDatasets, with no sopInstanceUIDsToSeriesInstanceUIDMap in options.`\n );\n }\n\n const { TID1501MeasurementGroups } = this.TIDIncludeGroups;\n\n if (!TID1501MeasurementGroups) {\n return;\n }\n\n let ContentSequence = [];\n\n TID1501MeasurementGroups.forEach(child => {\n ContentSequence = ContentSequence.concat(child.contentItem());\n });\n\n const parsedSOPInstances = [];\n\n // For each measurement that is referenced, add a link to the\n // Image Library Group and the Current Requested Procedure Evidence\n // with the proper ReferencedSOPSequence\n TID1501MeasurementGroups.forEach(measurementGroup => {\n measurementGroup.TID300Measurements.forEach(measurement => {\n const { ReferencedSOPInstanceUID } =\n measurement.ReferencedSOPSequence;\n\n if (!parsedSOPInstances.includes(ReferencedSOPInstanceUID)) {\n ImageLibraryContentSequence.push({\n RelationshipType: \"CONTAINS\",\n ValueType: \"IMAGE\",\n ReferencedSOPSequence: measurement.ReferencedSOPSequence\n });\n\n let derivationSourceDataset;\n\n if (derivationSourceDatasets.length === 1) {\n // If there is only one derivationSourceDataset, use it.\n derivationSourceDataset = derivationSourceDatasets[0];\n } else {\n const SeriesInstanceUID =\n sopInstanceUIDsToSeriesInstanceUIDMap[\n ReferencedSOPInstanceUID\n ];\n\n derivationSourceDataset = derivationSourceDatasets.find(\n dsd => dsd.SeriesInstanceUID === SeriesInstanceUID\n );\n }\n\n /**\n * Note: the VM of the ReferencedSeriesSequence and ReferencedSOPSequence are 1, so\n * it is correct that we have a full `CurrentRequestedProcedureEvidenceSequence`\n * item per `SOPInstanceUID`.\n */\n CurrentRequestedProcedureEvidenceSequence.push({\n StudyInstanceUID:\n derivationSourceDataset.StudyInstanceUID,\n ReferencedSeriesSequence: {\n SeriesInstanceUID:\n derivationSourceDataset.SeriesInstanceUID,\n ReferencedSOPSequence:\n measurement.ReferencedSOPSequence\n }\n });\n\n parsedSOPInstances.push(ReferencedSOPInstanceUID);\n }\n });\n });\n\n const ImagingMeasurments = {\n RelationshipType: \"CONTAINS\",\n ValueType: \"CONTAINER\",\n ConceptNameCodeSequence: {\n CodeValue: \"126010\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Imaging Measurements\" // TODO: would be nice to abstract the code sequences (in a dictionary? a service?)\n },\n ContinuityOfContent: \"SEPARATE\",\n ContentSequence\n };\n\n this.tid1500.ContentSequence.push(ImagingMeasurments);\n }\n}\n","export default class TID1501MeasurementGroup {\n constructor(TID300Measurements) {\n this.TID300Measurements = TID300Measurements;\n }\n\n contentItem() {\n const { TID300Measurements } = this;\n\n // TODO: Is there nothing else in this group?\n let measurementGroups = [];\n\n TID300Measurements.forEach(TID300Measurement => {\n measurementGroups.push(\n this.getMeasurementGroup(TID300Measurement.contentItem())\n );\n });\n\n return measurementGroups;\n }\n\n getMeasurementGroup(contentSequenceEntries) {\n return {\n RelationshipType: \"CONTAINS\",\n ValueType: \"CONTAINER\",\n ConceptNameCodeSequence: {\n CodeValue: \"125007\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Measurement Group\"\n },\n ContinuityOfContent: \"SEPARATE\",\n ContentSequence: [...contentSequenceEntries]\n };\n }\n}\n","const toArray = function (x) {\n return Array.isArray(x) ? x : [x];\n};\n\nconst codeMeaningEquals = codeMeaningName => {\n return contentItem => {\n return (\n contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName\n );\n };\n};\n\nconst graphicTypeEquals = graphicType => {\n return contentItem => {\n return contentItem && contentItem.GraphicType === graphicType;\n };\n};\n\nexport { toArray, codeMeaningEquals, graphicTypeEquals };\n","import { Normalizer } from \"../../normalizers.js\";\nimport { DicomMetaDictionary } from \"../../DicomMetaDictionary.js\";\nimport { StructuredReport } from \"../../derivations/index.js\";\nimport TID1500MeasurementReport from \"../../utilities/TID1500/TID1500MeasurementReport.js\";\nimport TID1501MeasurementGroup from \"../../utilities/TID1500/TID1501MeasurementGroup.js\";\nimport addAccessors from \"../../utilities/addAccessors.js\";\n\nimport { toArray, codeMeaningEquals } from \"../helpers.js\";\n\nconst FINDING = { CodingSchemeDesignator: \"DCM\", CodeValue: \"121071\" };\nconst FINDING_SITE = { CodingSchemeDesignator: \"SCT\", CodeValue: \"363698007\" };\nconst FINDING_SITE_OLD = { CodingSchemeDesignator: \"SRT\", CodeValue: \"G-C0E3\" };\n\nconst codeValueMatch = (group, code, oldCode) => {\n const { ConceptNameCodeSequence } = group;\n if (!ConceptNameCodeSequence) return;\n const { CodingSchemeDesignator, CodeValue } = ConceptNameCodeSequence;\n return (\n (CodingSchemeDesignator == code.CodingSchemeDesignator &&\n CodeValue == code.CodeValue) ||\n (oldCode &&\n CodingSchemeDesignator == oldCode.CodingSchemeDesignator &&\n CodeValue == oldCode.CodeValue)\n );\n};\n\nfunction getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass\n) {\n const args = toolClass.getTID300RepresentationArguments(tool);\n args.ReferencedSOPSequence = ReferencedSOPSequence;\n\n const TID300Measurement = new toolClass.TID300Representation(args);\n\n return TID300Measurement;\n}\n\nfunction getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) {\n const toolTypeData = toolData[toolType];\n const toolClass =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType];\n if (\n !toolTypeData ||\n !toolTypeData.data ||\n !toolTypeData.data.length ||\n !toolClass\n ) {\n return;\n }\n\n // Loop through the array of tool instances\n // for this tool\n const Measurements = toolTypeData.data.map(tool => {\n return getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass\n );\n });\n\n return new TID1501MeasurementGroup(Measurements);\n}\n\nexport default class MeasurementReport {\n constructor() {}\n\n static getSetupMeasurementData(MeasurementGroup) {\n const { ContentSequence } = MeasurementGroup;\n\n const contentSequenceArr = toArray(ContentSequence);\n const findingGroup = contentSequenceArr.find(group =>\n codeValueMatch(group, FINDING)\n );\n const findingSiteGroups =\n contentSequenceArr.filter(group =>\n codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)\n ) || [];\n const NUMGroup = contentSequenceArr.find(\n group => group.ValueType === \"NUM\"\n );\n const SCOORDGroup = toArray(NUMGroup.ContentSequence).find(\n group => group.ValueType === \"SCOORD\"\n );\n const { ReferencedSOPSequence } = SCOORDGroup.ContentSequence;\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n ReferencedSOPSequence;\n\n const defaultState = {\n sopInstanceUid: ReferencedSOPInstanceUID,\n frameIndex: ReferencedFrameNumber || 1,\n complete: true,\n finding: findingGroup\n ? addAccessors(findingGroup.ConceptCodeSequence)\n : undefined,\n findingSites: findingSiteGroups.map(fsg => {\n return addAccessors(fsg.ConceptCodeSequence);\n })\n };\n if (defaultState.finding) {\n defaultState.description = defaultState.finding.CodeMeaning;\n }\n const findingSite =\n defaultState.findingSites && defaultState.findingSites[0];\n if (findingSite) {\n defaultState.location =\n (findingSite[0] && findingSite[0].CodeMeaning) ||\n findingSite.CodeMeaning;\n }\n return {\n defaultState,\n findingGroup,\n findingSiteGroups,\n NUMGroup,\n SCOORDGroup,\n ReferencedSOPSequence,\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber\n };\n }\n\n static generateReport(toolState, metadataProvider, options) {\n // ToolState for array of imageIDs to a Report\n // Assume Cornerstone metadata provider has access to Study / Series / Sop Instance UID\n\n let allMeasurementGroups = [];\n const firstImageId = Object.keys(toolState)[0];\n if (!firstImageId) {\n throw new Error(\"No measurements provided.\");\n }\n\n /* Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Date\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Time\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study ID\n */\n const generalSeriesModule = metadataProvider.get(\n \"generalSeriesModule\",\n firstImageId\n );\n\n //const sopCommonModule = metadataProvider.get('sopCommonModule', firstImageId);\n\n // NOTE: We are getting the Series and Study UIDs from the first imageId of the toolState\n // which means that if the toolState is for multiple series, the report will have the incorrect\n // SeriesInstanceUIDs\n const { studyInstanceUID, seriesInstanceUID } = generalSeriesModule;\n\n // Loop through each image in the toolData\n Object.keys(toolState).forEach(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n const frameNumber = metadataProvider.get(\"frameNumber\", imageId);\n const toolData = toolState[imageId];\n const toolTypes = Object.keys(toolData);\n\n const ReferencedSOPSequence = {\n ReferencedSOPClassUID: sopCommonModule.sopClassUID,\n ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID\n };\n\n if (\n Normalizer.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)\n ) {\n ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;\n }\n\n // Loop through each tool type for the image\n const measurementGroups = [];\n\n toolTypes.forEach(toolType => {\n const group = getMeasurementGroup(\n toolType,\n toolData,\n ReferencedSOPSequence\n );\n if (group) {\n measurementGroups.push(group);\n }\n });\n\n allMeasurementGroups =\n allMeasurementGroups.concat(measurementGroups);\n });\n\n const MeasurementReport = new TID1500MeasurementReport(\n { TID1501MeasurementGroups: allMeasurementGroups },\n options\n );\n\n // TODO: what is the correct metaheader\n // http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html\n // TODO: move meta creation to happen in derivations.js\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n const derivationSourceDataset = {\n StudyInstanceUID: studyInstanceUID,\n SeriesInstanceUID: seriesInstanceUID\n //SOPInstanceUID: sopInstanceUID, // TODO: Necessary?\n //SOPClassUID: sopClassUID,\n };\n\n const _meta = {\n FileMetaInformationVersion: {\n Value: [fileMetaInformationVersionArray.buffer],\n vr: \"OB\"\n },\n //MediaStorageSOPClassUID\n //MediaStorageSOPInstanceUID: sopCommonModule.sopInstanceUID,\n TransferSyntaxUID: {\n Value: [\"1.2.840.10008.1.2.1\"],\n vr: \"UI\"\n },\n ImplementationClassUID: {\n Value: [DicomMetaDictionary.uid()], // TODO: could be git hash or other valid id\n vr: \"UI\"\n },\n ImplementationVersionName: {\n Value: [\"dcmjs\"],\n vr: \"SH\"\n }\n };\n\n const _vrMap = {\n PixelData: \"OW\"\n };\n\n derivationSourceDataset._meta = _meta;\n derivationSourceDataset._vrMap = _vrMap;\n\n const report = new StructuredReport([derivationSourceDataset]);\n\n const contentItem = MeasurementReport.contentItem(\n derivationSourceDataset\n );\n\n // Merge the derived dataset with the content from the Measurement Report\n report.dataset = Object.assign(report.dataset, contentItem);\n report.dataset._meta = _meta;\n\n return report;\n }\n\n /**\n * Generate Cornerstone tool state from dataset\n * @param {object} dataset dataset\n * @param {object} hooks\n * @param {function} hooks.getToolClass Function to map dataset to a tool class\n * @returns\n */\n static generateToolState(dataset, hooks = {}) {\n // For now, bail out if the dataset is not a TID1500 SR with length measurements\n if (dataset.ContentTemplateSequence.TemplateIdentifier !== \"1500\") {\n throw new Error(\n \"This package can currently only interpret DICOM SR TID 1500\"\n );\n }\n\n const REPORT = \"Imaging Measurements\";\n const GROUP = \"Measurement Group\";\n const TRACKING_IDENTIFIER = \"Tracking Identifier\";\n\n // Identify the Imaging Measurements\n const imagingMeasurementContent = toArray(dataset.ContentSequence).find(\n codeMeaningEquals(REPORT)\n );\n\n // Retrieve the Measurements themselves\n const measurementGroups = toArray(\n imagingMeasurementContent.ContentSequence\n ).filter(codeMeaningEquals(GROUP));\n\n // For each of the supported measurement types, compute the measurement data\n const measurementData = {};\n\n const cornerstoneToolClasses =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\n\n const registeredToolClasses = [];\n\n Object.keys(cornerstoneToolClasses).forEach(key => {\n registeredToolClasses.push(cornerstoneToolClasses[key]);\n measurementData[key] = [];\n });\n\n measurementGroups.forEach(measurementGroup => {\n const measurementGroupContentSequence = toArray(\n measurementGroup.ContentSequence\n );\n\n const TrackingIdentifierGroup =\n measurementGroupContentSequence.find(\n contentItem =>\n contentItem.ConceptNameCodeSequence.CodeMeaning ===\n TRACKING_IDENTIFIER\n );\n\n const TrackingIdentifierValue = TrackingIdentifierGroup.TextValue;\n\n const toolClass = hooks.getToolClass\n ? hooks.getToolClass(\n measurementGroup,\n dataset,\n registeredToolClasses\n )\n : registeredToolClasses.find(tc =>\n tc.isValidCornerstoneTrackingIdentifier(\n TrackingIdentifierValue\n )\n );\n\n if (toolClass) {\n const measurement =\n toolClass.getMeasurementData(measurementGroup);\n\n console.log(`=== ${toolClass.toolType} ===`);\n console.log(measurement);\n\n measurementData[toolClass.toolType].push(measurement);\n }\n });\n\n // NOTE: There is no way of knowing the cornerstone imageIds as that could be anything.\n // That is up to the consumer to derive from the SOPInstanceUIDs.\n return measurementData;\n }\n\n static registerTool(toolClass) {\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[\n toolClass.utilityToolType\n ] = toolClass;\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[\n toolClass.toolType\n ] = toolClass;\n MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] =\n toolClass.utilityToolType;\n }\n}\n\nMeasurementReport.MEASUREMENT_BY_TOOLTYPE = {};\nMeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {};\nMeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {};\n","import { DicomMetaDictionary } from \"../../DicomMetaDictionary.js\";\nimport addAccessors from \"../addAccessors.js\";\n\nexport default class TID300Measurement {\n constructor(props) {\n this.ReferencedSOPSequence = props.ReferencedSOPSequence;\n this.props = props;\n }\n\n getMeasurement(contentSequenceEntries) {\n return [\n ...this.getTrackingGroups(),\n ...this.getFindingGroup(),\n ...this.getFindingSiteGroups(),\n ...contentSequenceEntries\n ];\n }\n\n getTrackingGroups() {\n let { trackingIdentifierTextValue } = this.props;\n\n return [\n {\n RelationshipType: \"HAS OBS CONTEXT\",\n ValueType: \"TEXT\",\n ConceptNameCodeSequence: {\n CodeValue: \"112039\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Tracking Identifier\"\n },\n TextValue: trackingIdentifierTextValue || \"web annotation\"\n },\n {\n RelationshipType: \"HAS OBS CONTEXT\",\n ValueType: \"UIDREF\",\n ConceptNameCodeSequence: {\n CodeValue: \"112040\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Tracking Unique Identifier\"\n },\n UID: DicomMetaDictionary.uid()\n }\n ];\n }\n\n getFindingGroup() {\n let finding = this.props.finding;\n\n if (!finding) {\n return [];\n }\n\n const { CodeValue, CodingSchemeDesignator, CodeMeaning } = finding;\n\n return [\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"CODE\",\n ConceptNameCodeSequence: addAccessors({\n CodeValue: \"121071\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Finding\"\n }),\n ConceptCodeSequence: addAccessors({\n CodeValue, //: \"SAMPLE FINDING\",\n CodingSchemeDesignator, //: \"99dcmjs\",\n CodeMeaning //: \"Sample Finding\"\n })\n }\n ];\n }\n\n getFindingSiteGroups() {\n let findingSites = this.props.findingSites || [];\n\n return findingSites.map(findingSite => {\n const { CodeValue, CodingSchemeDesignator, CodeMeaning } =\n findingSite;\n return {\n RelationshipType: \"CONTAINS\",\n ValueType: \"CODE\",\n ConceptNameCodeSequence: addAccessors({\n CodeValue: \"363698007\",\n CodingSchemeDesignator: \"SCT\",\n CodeMeaning: \"Finding Site\"\n }),\n ConceptCodeSequence: addAccessors({\n CodeValue, //: \"SAMPLE FINDING SITE\",\n CodingSchemeDesignator, //: \"99dcmjs\",\n CodeMeaning //: \"Sample Finding Site\"\n })\n };\n });\n }\n\n /**\n * Expands an array of points stored as objects into a flattened array of points\n *\n * @param param.points [{x: 0, y: 1}, {x: 1, y: 2}] or [{x: 0, y: 1, z: 0}, {x: 1, y: 2, z: 0}]\n * @param param.use3DSpatialCoordinates boolean: true for 3D points and false for 2D points.\n *\n * @return {Array} [point1x, point1y, point2x, point2y] or [point1x, point1y, point1z, point2x, point2y, point2z]\n */\n flattenPoints({ points, use3DSpatialCoordinates = false }) {\n const flattenedCoordinates = [];\n\n points.forEach(point => {\n flattenedCoordinates.push(point[0] || point.x);\n flattenedCoordinates.push(point[1] || point.y);\n if (use3DSpatialCoordinates) {\n flattenedCoordinates.push(point[2] || point.z);\n }\n });\n\n return flattenedCoordinates;\n }\n}\n","/**\n * Builds a DICOM SR ContentSequence block for geometric measurements\n * that share the same structure across tools (Circle, Ellipse, Polyline, etc.)\n */\nexport default class TID320ContentItem {\n constructor({\n graphicType,\n graphicData,\n use3DSpatialCoordinates = false,\n referencedSOPSequence,\n referencedFrameOfReferenceUID\n }) {\n this.graphicType = graphicType;\n this.graphicData = graphicData;\n this.use3DSpatialCoordinates = use3DSpatialCoordinates;\n this.referencedSOPSequence = referencedSOPSequence;\n this.referencedFrameOfReferenceUID = referencedFrameOfReferenceUID;\n }\n\n contentItem() {\n const content = {\n RelationshipType: \"INFERRED FROM\",\n ValueType: this.use3DSpatialCoordinates ? \"SCOORD3D\" : \"SCOORD\",\n GraphicType: this.graphicType,\n GraphicData: this.graphicData\n };\n\n if (this.use3DSpatialCoordinates) {\n content.ReferencedFrameOfReferenceUID =\n this.referencedFrameOfReferenceUID;\n } else {\n content.ContentSequence = {\n RelationshipType: \"SELECTED FROM\",\n ValueType: \"IMAGE\",\n ReferencedSOPSequence: this.referencedSOPSequence\n };\n }\n\n return content;\n }\n}\n","import TID300Measurement from \"./TID300Measurement.js\";\nimport TID320ContentItem from \"./TID320ContentItem.js\";\n\nexport default class OpenPolyline extends TID300Measurement {\n getPoints() {\n throw new Error(\"getPoints() must be implemented by subclass\");\n }\n\n getConceptNameCodeSequence() {\n throw new Error(\"getConceptNameCodeSequence() must be implemented\");\n }\n\n getMeasuredValueSequence() {\n return null;\n }\n\n buildGraphicContent() {\n const {\n use3DSpatialCoordinates = false,\n ReferencedSOPSequence,\n ReferencedFrameOfReferenceUID\n } = this.props;\n\n const GraphicData = this.flattenPoints({\n points: this.getPoints(),\n use3DSpatialCoordinates\n });\n\n return new TID320ContentItem({\n graphicType: \"POLYLINE\",\n graphicData: GraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n }\n\n contentItem() {\n const concept = this.getConceptNameCodeSequence();\n const measuredValue = this.getMeasuredValueSequence();\n\n return this.getMeasurement([\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"NUM\",\n ConceptNameCodeSequence: concept,\n MeasuredValueSequence: measuredValue,\n ContentSequence: this.buildGraphicContent()\n }\n ]);\n }\n}\n","import log from \"../../log.js\";\n\nconst knownUnits = [\n // Standard UCUM units.\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"mm\",\n CodeMeaning: \"mm\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"mm2\",\n CodeMeaning: \"mm2\"\n },\n // Units defined in https://dicom.nema.org/medical/dicom/current/output/chtml/part16/sect_CID_83.html\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"[hnsf'U]\",\n CodeMeaning: \"Hounsfield unit\"\n },\n // Units defined in https://dicom.nema.org/medical/dicom/current/output/chtml/part16/sect_CID_84.html\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"{counts}\",\n CodeMeaning: \"Counts\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"{counts}/s\",\n CodeMeaning: \"Counts per second\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"{propcounts}\",\n CodeMeaning: \"Proportional to counts\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"{propcounts}/s\",\n CodeMeaning: \"Proportional to counts per second\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"cm2\",\n CodeMeaning: \"cm2\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"cm2/ml\",\n CodeMeaning: \"cm2/ml\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"%\",\n CodeMeaning: \"Percent\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"Bq/ml\",\n CodeMeaning: \"Becquerels/milliliter\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"mg/min/ml\",\n CodeMeaning: \"Milligrams/minute/milliliter\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"umol/min/ml\",\n CodeMeaning: \"Micromole/minute/milliliter\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"ml/min/g\",\n CodeMeaning: \"Milliliter/minute/gram\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"ml/g\",\n CodeMeaning: \"Milliliter/gram\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"/cm\",\n CodeMeaning: \"/Centimeter\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"umol/ml\",\n CodeMeaning: \"Micromole/milliliter\"\n },\n // Units defined in https://dicom.nema.org/medical/dicom/current/output/chtml/part16/sect_CID_85.html\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"g/ml{SUVbw}\",\n CodeMeaning: \"Standardized Uptake Value body weight\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"g/ml{SUVlbm}\",\n CodeMeaning: \"Standardized Uptake Value lean body mass (James)\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"g/ml{SUVlbm(James128)}\",\n CodeMeaning:\n \"Standardized Uptake Value lean body mass (James 128 multiplier)\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"g/ml{SUVlbm(Janma)}\",\n CodeMeaning: \"Standardized Uptake Value lean body mass (Janma)\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"cm2/ml{SUVbsa}\",\n CodeMeaning: \"Standardized Uptake Value body surface area\"\n },\n {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"g/ml{SUVibw}\",\n CodeMeaning: \"Standardized Uptake Value ideal body weight\"\n }\n];\n\n// Create unitCodeMap from knownUnits for efficient lookup\nconst unitCodeMap = {};\nknownUnits.forEach(unit => {\n unitCodeMap[unit.CodeValue] = unit;\n});\n\nconst noUnitCodeValues = [\"px\", \"px\\xB2\"];\nconst NO_UNIT = {\n CodeValue: \"1\",\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeMeaning: \"px\"\n};\nnoUnitCodeValues.forEach(codeValue => {\n unitCodeMap[codeValue] = NO_UNIT;\n});\n\nunitCodeMap[\"HU\"] = {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"[hnsf'U]\",\n CodeMeaning: \"Hounsfield unit\"\n};\n\nunitCodeMap[\"mm\\xB2\"] = {\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeValue: \"mm2\",\n CodeMeaning: \"mm2\"\n};\n\n/** Converts the given unit into the\n * specified coding values.\n * Has .measurementMap on the function specifying global units for measurements.\n */\nconst unit2CodingValue = units => {\n if (!units) return NO_UNIT;\n const space = units.indexOf(\" \");\n const baseUnit = space === -1 ? units : units.substring(0, space);\n const codingUnit = unitCodeMap[units] || unitCodeMap[baseUnit];\n if (!codingUnit) {\n log.error(\"Unspecified units\", units);\n\n return {\n CodeValue: `[arb'U]{${units}}`,\n CodingSchemeDesignator: \"UCUM\",\n CodeMeaning: `arbitrary ${units}`\n };\n }\n return codingUnit;\n};\n\nunit2CodingValue.measurementMap = unitCodeMap;\n\nexport default unit2CodingValue;\n","import OpenPolyline from \"./OpenPolyline.js\";\nimport unit2CodingValue from \"./unit2CodingValue.js\";\n\nexport default class Length extends OpenPolyline {\n getPoints() {\n const { point1, point2 } = this.props;\n return [point1, point2];\n }\n\n getConceptNameCodeSequence() {\n return {\n CodeValue: \"410668003\",\n CodingSchemeDesignator: \"SCT\",\n CodeMeaning: \"Length\"\n };\n }\n\n getMeasuredValueSequence() {\n const { distance, unit = \"mm\" } = this.props;\n return {\n MeasurementUnitsCodeSequence: unit2CodingValue(unit),\n NumericValue: distance\n };\n }\n}\n","export default \"cornerstoneTools@^4.0.0\";\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Length from \"../../utilities/TID300/Length.js\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst LENGTH = \"Length\";\n\nclass Length {\n constructor() {}\n\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n length: NUMGroup.MeasuredValueSequence.NumericValue,\n toolType: Length.toolType,\n handles: {\n start: {},\n end: {},\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n [\n state.handles.start.x,\n state.handles.start.y,\n state.handles.end.x,\n state.handles.end.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites } = tool;\n const point1 = handles.start;\n const point2 = handles.end;\n const distance = tool.length;\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:Length\";\n\n return {\n point1,\n point2,\n distance,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nLength.toolType = LENGTH;\nLength.utilityToolType = LENGTH;\nLength.TID300Representation = TID300Length;\nLength.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === LENGTH;\n};\n\nMeasurementReport.registerTool(Length);\n\nexport default Length;\n","import unit2CodingValue from \"./TID300/unit2CodingValue\";\n\n/**\n * Utility class for constructing DICOM SR Numeric (NUM) measurement items\n * associated with a spatial coordinate (SCOORD) annotation.\n *\n * Each measurement produced by this builder includes:\n * - A NUM content item describing the measurement value\n * - A MeasuredValueSequence with its unit encoded in UCUM or another scheme\n * - A ContentSequence containing an INFERRED FROM reference linking the\n * measurement back to the SCOORD item using ReferencedContentItemIdentifier.\n *\n * This ensures that all derived measurements correctly reference the\n * annotation from which they were computed.\n */\nclass MeasurementBuilder {\n /**\n * Creates a NUM (Numeric Measurement) content item for a DICOM SR.\n *\n * @param {string} codeValue - Code value representing the type of measurement.\n * @param {string} codingScheme - Coding scheme designator (e.g., \"SCT\", \"DCM\").\n * @param {string} codeMeaning - Human-readable meaning of the measurement code.\n * @param {number|string} value - The numeric measurement value.\n * @param {Object} unit - Unit definition object (UCUM or other coding scheme).\n *\n * @returns {Object} DICOM SR content item representing a numeric measurement.\n */\n\n static createNumericMeasurement(\n codeValue,\n codingScheme,\n codeMeaning,\n value,\n unit,\n { scoordContentItem = null } = {}\n ) {\n const item = {\n RelationshipType: \"CONTAINS\",\n ValueType: \"NUM\",\n ConceptNameCodeSequence: {\n CodeValue: codeValue,\n CodingSchemeDesignator: codingScheme,\n CodeMeaning: codeMeaning\n },\n MeasuredValueSequence: {\n MeasurementUnitsCodeSequence: unit2CodingValue(unit),\n NumericValue: value\n }\n };\n\n if (scoordContentItem) {\n item.ContentSequence = scoordContentItem;\n }\n\n return item;\n }\n\n static createAreaMeasurement(area, areaUnit, { scoordContentItem }) {\n return MeasurementBuilder.createNumericMeasurement(\n \"42798000\",\n \"SCT\",\n \"Area\",\n area,\n areaUnit,\n { scoordContentItem }\n );\n }\n\n static createRadiusMeasurement(radius, radiusUnit, { scoordContentItem }) {\n return MeasurementBuilder.createNumericMeasurement(\n \"131190003\",\n \"SCT\",\n \"Radius\",\n radius,\n radiusUnit,\n { scoordContentItem }\n );\n }\n\n static createMaxMeasurement(max, modalityUnit, { scoordContentItem }) {\n return MeasurementBuilder.createNumericMeasurement(\n \"56851009\",\n \"SCT\",\n \"Maximum\",\n max,\n modalityUnit,\n { scoordContentItem }\n );\n }\n\n static createMinMeasurement(min, modalityUnit, { scoordContentItem }) {\n return MeasurementBuilder.createNumericMeasurement(\n \"255605001\",\n \"SCT\",\n \"Minimum\",\n min,\n modalityUnit,\n { scoordContentItem }\n );\n }\n\n static createMeanMeasurement(mean, modalityUnit, { scoordContentItem }) {\n return MeasurementBuilder.createNumericMeasurement(\n \"373098007\",\n \"SCT\",\n \"Mean\",\n mean,\n modalityUnit,\n { scoordContentItem }\n );\n }\n\n static createStdDevMeasurement(\n stdDev,\n modalityUnit,\n { scoordContentItem }\n ) {\n return MeasurementBuilder.createNumericMeasurement(\n \"386136009\",\n \"SCT\",\n \"Standard Deviation\",\n stdDev,\n modalityUnit,\n { scoordContentItem }\n );\n }\n\n static createPerimeterMeasurement(perimeter, unit, { scoordContentItem }) {\n return MeasurementBuilder.createNumericMeasurement(\n \"131191004\",\n \"SCT\",\n \"Perimeter\",\n perimeter,\n unit,\n { scoordContentItem }\n );\n }\n}\n\nexport default MeasurementBuilder;\n","import TID300Measurement from \"./TID300Measurement\";\nimport TID320ContentItem from \"./TID320ContentItem.js\";\nimport MeasurementBuilder from \"../MeasurementBuilder.js\";\n\nexport default class Polyline extends TID300Measurement {\n contentItem() {\n const {\n points,\n area,\n areaUnit = \"mm2\",\n ReferencedSOPSequence,\n use3DSpatialCoordinates = false,\n perimeter,\n unit = \"mm\",\n modalityUnit,\n min,\n max,\n mean,\n stdDev,\n ReferencedFrameOfReferenceUID\n } = this.props;\n\n const GraphicData = this.flattenPoints({\n points,\n use3DSpatialCoordinates\n });\n\n const measurementConfigs = [\n {\n value: perimeter,\n unit: unit,\n builder: MeasurementBuilder.createPerimeterMeasurement\n },\n {\n value: area,\n unit: areaUnit,\n builder: MeasurementBuilder.createAreaMeasurement\n },\n {\n value: max,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMaxMeasurement\n },\n {\n value: min,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMinMeasurement\n },\n {\n value: mean,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMeanMeasurement\n },\n {\n value: stdDev,\n unit: modalityUnit,\n builder: MeasurementBuilder.createStdDevMeasurement\n }\n ];\n const scoordContentItem = new TID320ContentItem({\n graphicType: \"POLYLINE\",\n graphicData: GraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n\n const measurements = measurementConfigs\n .filter(config => config.value !== undefined)\n .map((config, index) =>\n config.builder(config.value, config.unit, {\n scoordContentItem: index === 0 ? scoordContentItem : null\n })\n );\n\n return this.getMeasurement(measurements);\n }\n}\n","import MeasurementReport from \"./MeasurementReport\";\nimport TID300Polyline from \"../../utilities/TID300/Polyline\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nclass FreehandRoi {\n constructor() {}\n\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, SCOORDGroup, NUMGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n toolType: FreehandRoi.toolType,\n handles: {\n points: [],\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n cachedStats: {\n area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0\n },\n color: undefined,\n invalidated: true\n };\n const { GraphicData } = SCOORDGroup;\n for (let i = 0; i < GraphicData.length; i += 2) {\n state.handles.points.push({\n x: GraphicData[i],\n y: GraphicData[i + 1]\n });\n }\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites, cachedStats = {} } = tool;\n const { points } = handles;\n const { area = 0, perimeter = 0 } = cachedStats;\n\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:FreehandRoi\";\n\n return {\n points,\n area,\n perimeter,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nFreehandRoi.toolType = \"FreehandRoi\";\nFreehandRoi.utilityToolType = \"FreehandRoi\";\nFreehandRoi.TID300Representation = TID300Polyline;\nFreehandRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === FreehandRoi.toolType;\n};\n\nMeasurementReport.registerTool(FreehandRoi);\n\nexport default FreehandRoi;\n","import TID300Measurement from \"./TID300Measurement.js\";\nimport unit2CodingValue from \"./unit2CodingValue.js\";\nimport TID320ContentItem from \"./TID320ContentItem.js\";\n\nexport default class Bidirectional extends TID300Measurement {\n contentItem() {\n const {\n longAxis,\n shortAxis,\n longAxisLength,\n shortAxisLength,\n unit,\n use3DSpatialCoordinates = false,\n ReferencedSOPSequence,\n ReferencedFrameOfReferenceUID\n } = this.props;\n\n const longAxisGraphicData = this.flattenPoints({\n points: [longAxis.point1, longAxis.point2],\n use3DSpatialCoordinates\n });\n const shortAxisGraphicData = this.flattenPoints({\n points: [shortAxis.point1, shortAxis.point2],\n use3DSpatialCoordinates\n });\n\n const longAxisContentSequence = new TID320ContentItem({\n graphicType: \"POLYLINE\",\n graphicData: longAxisGraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n\n const shortAxisContentSequence = new TID320ContentItem({\n graphicType: \"POLYLINE\",\n graphicData: shortAxisGraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n\n return this.getMeasurement([\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"NUM\",\n ConceptNameCodeSequence: {\n CodeValue: \"103339001\",\n CodingSchemeDesignator: \"SCT\",\n CodeMeaning: \"Long Axis\"\n },\n MeasuredValueSequence: {\n MeasurementUnitsCodeSequence: unit2CodingValue(unit),\n NumericValue: longAxisLength\n },\n ContentSequence: longAxisContentSequence\n },\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"NUM\",\n ConceptNameCodeSequence: {\n CodeValue: \"103340004\",\n CodingSchemeDesignator: \"SCT\",\n CodeMeaning: \"Short Axis\"\n },\n MeasuredValueSequence: {\n MeasurementUnitsCodeSequence: unit2CodingValue(unit),\n NumericValue: shortAxisLength\n },\n ContentSequence: shortAxisContentSequence\n }\n ]);\n }\n}\n","import MeasurementReport from \"./MeasurementReport\";\nimport TID300Bidirectional from \"../../utilities/TID300/Bidirectional\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\nimport { toArray } from \"../helpers.js\";\n\nconst BIDIRECTIONAL = \"Bidirectional\";\nconst LONG_AXIS = \"Long Axis\";\nconst SHORT_AXIS = \"Short Axis\";\nconst FINDING = \"121071\";\nconst FINDING_SITE = \"G-C0E3\";\n\nclass Bidirectional {\n constructor() {}\n\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { ContentSequence } = MeasurementGroup;\n\n const findingGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeValue === FINDING\n );\n\n const findingSiteGroups = toArray(ContentSequence).filter(\n group => group.ConceptNameCodeSequence.CodeValue === FINDING_SITE\n );\n\n const longAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === LONG_AXIS\n );\n\n const longAxisSCOORDGroup = toArray(\n longAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const shortAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === SHORT_AXIS\n );\n\n const shortAxisSCOORDGroup = toArray(\n shortAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const { ReferencedSOPSequence } = longAxisSCOORDGroup.ContentSequence;\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n ReferencedSOPSequence;\n\n // Long axis\n\n const longestDiameter = String(\n longAxisNUMGroup.MeasuredValueSequence.NumericValue\n );\n\n const shortestDiameter = String(\n shortAxisNUMGroup.MeasuredValueSequence.NumericValue\n );\n\n const bottomRight = {\n x: Math.max(\n longAxisSCOORDGroup.GraphicData[0],\n longAxisSCOORDGroup.GraphicData[2],\n shortAxisSCOORDGroup.GraphicData[0],\n shortAxisSCOORDGroup.GraphicData[2]\n ),\n y: Math.max(\n longAxisSCOORDGroup.GraphicData[1],\n longAxisSCOORDGroup.GraphicData[3],\n shortAxisSCOORDGroup.GraphicData[1],\n shortAxisSCOORDGroup.GraphicData[3]\n )\n };\n\n const state = {\n sopInstanceUid: ReferencedSOPInstanceUID,\n frameIndex: ReferencedFrameNumber || 1,\n toolType: Bidirectional.toolType,\n active: false,\n handles: {\n start: {\n x: longAxisSCOORDGroup.GraphicData[0],\n y: longAxisSCOORDGroup.GraphicData[1],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 0\n },\n end: {\n x: longAxisSCOORDGroup.GraphicData[2],\n y: longAxisSCOORDGroup.GraphicData[3],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 1\n },\n perpendicularStart: {\n x: shortAxisSCOORDGroup.GraphicData[0],\n y: shortAxisSCOORDGroup.GraphicData[1],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 2\n },\n perpendicularEnd: {\n x: shortAxisSCOORDGroup.GraphicData[2],\n y: shortAxisSCOORDGroup.GraphicData[3],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 3\n },\n textBox: {\n highlight: false,\n hasMoved: true,\n active: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true,\n x: bottomRight.x + 10,\n y: bottomRight.y + 10\n }\n },\n invalidated: false,\n isCreating: false,\n longestDiameter,\n shortestDiameter,\n toolName: \"Bidirectional\",\n visible: true,\n finding: findingGroup\n ? findingGroup.ConceptCodeSequence\n : undefined,\n findingSites: findingSiteGroups.map(fsg => fsg.ConceptCodeSequence)\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { start, end, perpendicularStart, perpendicularEnd } =\n tool.handles;\n const { shortestDiameter, longestDiameter, finding, findingSites } =\n tool;\n\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:Bidirectional\";\n\n return {\n longAxis: {\n point1: start,\n point2: end\n },\n shortAxis: {\n point1: perpendicularStart,\n point2: perpendicularEnd\n },\n longAxisLength: longestDiameter,\n shortAxisLength: shortestDiameter,\n trackingIdentifierTextValue,\n finding: finding,\n findingSites: findingSites || []\n };\n }\n}\n\nBidirectional.toolType = BIDIRECTIONAL;\nBidirectional.utilityToolType = BIDIRECTIONAL;\nBidirectional.TID300Representation = TID300Bidirectional;\nBidirectional.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === BIDIRECTIONAL;\n};\n\nMeasurementReport.registerTool(Bidirectional);\n\nexport default Bidirectional;\n","import TID300Measurement from \"./TID300Measurement.js\";\nimport TID320ContentItem from \"./TID320ContentItem.js\";\nimport MeasurementBuilder from \"../MeasurementBuilder.js\";\n\nexport default class Ellipse extends TID300Measurement {\n contentItem() {\n const {\n points,\n use3DSpatialCoordinates = false,\n ReferencedSOPSequence,\n area,\n areaUnit,\n max,\n min,\n mean,\n stdDev,\n modalityUnit,\n ReferencedFrameOfReferenceUID\n } = this.props;\n\n const GraphicData = this.flattenPoints({\n points,\n use3DSpatialCoordinates\n });\n\n const measurementConfigs = [\n {\n value: area,\n unit: areaUnit,\n builder: MeasurementBuilder.createAreaMeasurement\n },\n {\n value: max,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMaxMeasurement\n },\n {\n value: min,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMinMeasurement\n },\n {\n value: mean,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMeanMeasurement\n },\n {\n value: stdDev,\n unit: modalityUnit,\n builder: MeasurementBuilder.createStdDevMeasurement\n }\n ];\n\n const scoordContentItem = new TID320ContentItem({\n graphicType: \"ELLIPSE\",\n graphicData: GraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n\n const measurements = measurementConfigs\n .filter(config => config.value !== undefined)\n .map((config, index) =>\n config.builder(config.value, config.unit, {\n scoordContentItem: index === 0 ? scoordContentItem : null\n })\n );\n\n return this.getMeasurement(measurements);\n }\n}\n","import MeasurementReport from \"./MeasurementReport\";\nimport TID300Ellipse from \"../../utilities/TID300/Ellipse\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst ELLIPTICALROI = \"EllipticalRoi\";\n\nclass EllipticalRoi {\n constructor() {}\n\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const { GraphicData } = SCOORDGroup;\n\n const majorAxis = [\n { x: GraphicData[0], y: GraphicData[1] },\n { x: GraphicData[2], y: GraphicData[3] }\n ];\n const minorAxis = [\n { x: GraphicData[4], y: GraphicData[5] },\n { x: GraphicData[6], y: GraphicData[7] }\n ];\n\n // Calculate two opposite corners of box defined by two axes.\n\n const minorAxisLength = Math.sqrt(\n Math.pow(minorAxis[0].x - minorAxis[1].x, 2) +\n Math.pow(minorAxis[0].y - minorAxis[1].y, 2)\n );\n\n const minorAxisDirection = {\n x: (minorAxis[1].x - minorAxis[0].x) / minorAxisLength,\n y: (minorAxis[1].y - minorAxis[0].y) / minorAxisLength\n };\n\n const halfMinorAxisLength = minorAxisLength / 2;\n\n // First end point of major axis + half minor axis vector\n const corner1 = {\n x: majorAxis[0].x + minorAxisDirection.x * halfMinorAxisLength,\n y: majorAxis[0].y + minorAxisDirection.y * halfMinorAxisLength\n };\n\n // Second end point of major axis - half of minor axis vector\n const corner2 = {\n x: majorAxis[1].x - minorAxisDirection.x * halfMinorAxisLength,\n y: majorAxis[1].y - minorAxisDirection.y * halfMinorAxisLength\n };\n const state = {\n ...defaultState,\n toolType: EllipticalRoi.toolType,\n active: false,\n cachedStats: {\n area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0\n },\n handles: {\n end: {\n x: corner1.x,\n y: corner1.y,\n highlight: false,\n active: false\n },\n initialRotation: 0,\n start: {\n x: corner2.x,\n y: corner2.y,\n highlight: false,\n active: false\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n invalidated: true,\n visible: true\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { cachedStats = {}, handles, finding, findingSites } = tool;\n const { start, end } = handles;\n const { area } = cachedStats;\n\n const halfXLength = Math.abs(start.x - end.x) / 2;\n const halfYLength = Math.abs(start.y - end.y) / 2;\n\n const points = [];\n\n const center = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };\n\n if (halfXLength > halfYLength) {\n // X-axis major\n // Major axis\n points.push({ x: center.x - halfXLength, y: center.y });\n points.push({ x: center.x + halfXLength, y: center.y });\n // Minor axis\n points.push({ x: center.x, y: center.y - halfYLength });\n points.push({ x: center.x, y: center.y + halfYLength });\n } else {\n // Y-axis major\n // Major axis\n points.push({ x: center.x, y: center.y - halfYLength });\n points.push({ x: center.x, y: center.y + halfYLength });\n // Minor axis\n points.push({ x: center.x - halfXLength, y: center.y });\n points.push({ x: center.x + halfXLength, y: center.y });\n }\n\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:EllipticalRoi\";\n\n return {\n area,\n points,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nEllipticalRoi.toolType = ELLIPTICALROI;\nEllipticalRoi.utilityToolType = ELLIPTICALROI;\nEllipticalRoi.TID300Representation = TID300Ellipse;\nEllipticalRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === ELLIPTICALROI;\n};\n\nMeasurementReport.registerTool(EllipticalRoi);\n\nexport default EllipticalRoi;\n","import TID300Measurement from \"./TID300Measurement.js\";\nimport TID320ContentItem from \"./TID320ContentItem.js\";\nimport MeasurementBuilder from \"../MeasurementBuilder.js\";\n\nexport default class Circle extends TID300Measurement {\n contentItem() {\n const {\n points,\n ReferencedSOPSequence,\n use3DSpatialCoordinates = false,\n perimeter,\n area,\n areaUnit = \"mm2\",\n unit = \"mm\",\n max,\n min,\n mean,\n stdDev,\n radiusUnit,\n modalityUnit,\n ReferencedFrameOfReferenceUID,\n radius\n } = this.props;\n\n // Combine all lengths to save the perimeter\n // @ToDO The permiter has to be implemented\n // const reducer = (accumulator, currentValue) => accumulator + currentValue;\n // const perimeter = lengths.reduce(reducer);\n const GraphicData = this.flattenPoints({\n points,\n use3DSpatialCoordinates\n });\n\n const measurementConfigs = [\n {\n value: perimeter,\n unit: unit,\n builder: MeasurementBuilder.createPerimeterMeasurement\n },\n {\n value: area,\n unit: areaUnit,\n builder: MeasurementBuilder.createAreaMeasurement\n },\n {\n value: radius,\n unit: radiusUnit,\n builder: MeasurementBuilder.createRadiusMeasurement\n },\n {\n value: max,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMaxMeasurement\n },\n {\n value: min,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMinMeasurement\n },\n {\n value: mean,\n unit: modalityUnit,\n builder: MeasurementBuilder.createMeanMeasurement\n },\n {\n value: stdDev,\n unit: modalityUnit,\n builder: MeasurementBuilder.createStdDevMeasurement\n }\n ];\n\n const scoordContentItem = new TID320ContentItem({\n graphicType: \"CIRCLE\",\n graphicData: GraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n\n const measurements = measurementConfigs\n .filter(config => config.value !== undefined)\n .map((config, index) =>\n config.builder(config.value, config.unit, {\n scoordContentItem: index === 0 ? scoordContentItem : null\n })\n );\n\n return this.getMeasurement(measurements);\n }\n}\n","import MeasurementReport from \"./MeasurementReport\";\nimport TID300Circle from \"../../utilities/TID300/Circle\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst CIRCLEROI = \"CircleRoi\";\n\nclass CircleRoi {\n constructor() {}\n\n /** Gets the measurement data for cornerstone, given DICOM SR measurement data. */\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const { GraphicData } = SCOORDGroup;\n\n const center = { x: GraphicData[0], y: GraphicData[1] };\n const end = { x: GraphicData[2], y: GraphicData[3] };\n\n const state = {\n ...defaultState,\n toolType: CircleRoi.toolType,\n active: false,\n cachedStats: {\n area: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : 0,\n // Dummy values to be updated by cornerstone\n radius: 0,\n perimeter: 0\n },\n handles: {\n end: {\n ...end,\n highlight: false,\n active: false\n },\n initialRotation: 0,\n start: {\n ...center,\n highlight: false,\n active: false\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n invalidated: true,\n visible: true\n };\n\n return state;\n }\n\n /**\n * Gets the TID 300 representation of a circle, given the cornerstone representation.\n *\n * @param {Object} tool\n * @returns\n */\n static getTID300RepresentationArguments(tool) {\n const { cachedStats = {}, handles, finding, findingSites } = tool;\n const { start: center, end } = handles;\n const { area, areaUnit = \"mm2\", unit = \"mm\", radius } = cachedStats;\n\n const perimeter = 2 * Math.PI * radius;\n const points = [];\n\n points.push(center);\n points.push(end);\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:CircleRoi\";\n\n return {\n area,\n areaUnit,\n perimeter,\n unit,\n radius,\n points,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nCircleRoi.toolType = CIRCLEROI;\nCircleRoi.utilityToolType = CIRCLEROI;\nCircleRoi.TID300Representation = TID300Circle;\nCircleRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === CIRCLEROI;\n};\n\nMeasurementReport.registerTool(CircleRoi);\n\nexport default CircleRoi;\n","import TID300Measurement from \"./TID300Measurement.js\";\nimport TID320ContentItem from \"./TID320ContentItem.js\";\n\nexport default class Point extends TID300Measurement {\n contentItem() {\n const {\n points,\n ReferencedSOPSequence,\n use3DSpatialCoordinates = false,\n ReferencedFrameOfReferenceUID\n } = this.props;\n\n // Point must contain exactly one coordinate\n const point = points[0];\n\n const GraphicData = use3DSpatialCoordinates\n ? [point.x, point.y, point.z]\n : [point.x, point.y];\n\n const graphicContentSequence = new TID320ContentItem({\n graphicType: \"POINT\",\n graphicData: GraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n\n return this.getMeasurement([\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"NUM\",\n ConceptNameCodeSequence: {\n CodeValue: \"111010\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"Center\"\n },\n\n // MeasuredValueSequence is required for NUM items per TID 300/1501\n MeasuredValueSequence: {\n NumericValue: 0,\n MeasurementUnitsCodeSequence: {\n CodeValue: \"1\",\n CodingSchemeDesignator: \"UCUM\",\n CodeMeaning: \"no units\"\n }\n },\n ContentSequence: graphicContentSequence\n }\n ]);\n }\n}\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Point from \"../../utilities/TID300/Point.js\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst ARROW_ANNOTATE = \"ArrowAnnotate\";\nconst CORNERSTONEFREETEXT = \"CORNERSTONEFREETEXT\";\n\nclass ArrowAnnotate {\n constructor() {}\n\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, SCOORDGroup, findingGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const text = findingGroup.ConceptCodeSequence.CodeMeaning;\n\n const { GraphicData } = SCOORDGroup;\n\n const state = {\n ...defaultState,\n toolType: ArrowAnnotate.toolType,\n active: false,\n handles: {\n start: {\n x: GraphicData[0],\n y: GraphicData[1],\n highlight: true,\n active: false\n },\n // Use a generic offset if the stored data doesn't have the endpoint, otherwise\n // use the actual endpoint.\n end: {\n x:\n GraphicData.length == 4\n ? GraphicData[2]\n : GraphicData[0] + 20,\n y:\n GraphicData.length == 4\n ? GraphicData[3]\n : GraphicData[1] + 20,\n highlight: true,\n active: false\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n invalidated: true,\n text,\n visible: true\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const points = [tool.handles.start, tool.handles.end];\n\n let { finding, findingSites } = tool;\n\n const TID300RepresentationArguments = {\n points,\n trackingIdentifierTextValue: `cornerstoneTools@^4.0.0:ArrowAnnotate`,\n findingSites: findingSites || []\n };\n\n // If freetext finding isn't present, add it from the tool text.\n if (!finding || finding.CodeValue !== CORNERSTONEFREETEXT) {\n finding = {\n CodeValue: CORNERSTONEFREETEXT,\n CodingSchemeDesignator: \"CST4\",\n CodeMeaning: tool.text\n };\n }\n\n TID300RepresentationArguments.finding = finding;\n\n return TID300RepresentationArguments;\n }\n}\n\nArrowAnnotate.toolType = ARROW_ANNOTATE;\nArrowAnnotate.utilityToolType = ARROW_ANNOTATE;\nArrowAnnotate.TID300Representation = TID300Point;\nArrowAnnotate.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === ARROW_ANNOTATE;\n};\n\nMeasurementReport.registerTool(ArrowAnnotate);\n\nexport default ArrowAnnotate;\n","/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n","var iota = require(\"iota-array\")\nvar isBuffer = require(\"is-buffer\")\n\nvar hasTypedArrays = ((typeof Float64Array) !== \"undefined\")\n\nfunction compare1st(a, b) {\n return a[0] - b[0]\n}\n\nfunction order() {\n var stride = this.stride\n var terms = new Array(stride.length)\n var i\n for(i=0; i<terms.length; ++i) {\n terms[i] = [Math.abs(stride[i]), i]\n }\n terms.sort(compare1st)\n var result = new Array(terms.length)\n for(i=0; i<result.length; ++i) {\n result[i] = terms[i][1]\n }\n return result\n}\n\nfunction compileConstructor(dtype, dimension) {\n var className = [\"View\", dimension, \"d\", dtype].join(\"\")\n if(dimension < 0) {\n className = \"View_Nil\" + dtype\n }\n var useGetters = (dtype === \"generic\")\n\n if(dimension === -1) {\n //Special case for trivial arrays\n var code =\n \"function \"+className+\"(a){this.data=a;};\\\nvar proto=\"+className+\".prototype;\\\nproto.dtype='\"+dtype+\"';\\\nproto.index=function(){return -1};\\\nproto.size=0;\\\nproto.dimension=-1;\\\nproto.shape=proto.stride=proto.order=[];\\\nproto.lo=proto.hi=proto.transpose=proto.step=\\\nfunction(){return new \"+className+\"(this.data);};\\\nproto.get=proto.set=function(){};\\\nproto.pick=function(){return null};\\\nreturn function construct_\"+className+\"(a){return new \"+className+\"(a);}\"\n var procedure = new Function(code)\n return procedure()\n } else if(dimension === 0) {\n //Special case for 0d arrays\n var code =\n \"function \"+className+\"(a,d) {\\\nthis.data = a;\\\nthis.offset = d\\\n};\\\nvar proto=\"+className+\".prototype;\\\nproto.dtype='\"+dtype+\"';\\\nproto.index=function(){return this.offset};\\\nproto.dimension=0;\\\nproto.size=1;\\\nproto.shape=\\\nproto.stride=\\\nproto.order=[];\\\nproto.lo=\\\nproto.hi=\\\nproto.transpose=\\\nproto.step=function \"+className+\"_copy() {\\\nreturn new \"+className+\"(this.data,this.offset)\\\n};\\\nproto.pick=function \"+className+\"_pick(){\\\nreturn TrivialArray(this.data);\\\n};\\\nproto.valueOf=proto.get=function \"+className+\"_get(){\\\nreturn \"+(useGetters ? \"this.data.get(this.offset)\" : \"this.data[this.offset]\")+\n\"};\\\nproto.set=function \"+className+\"_set(v){\\\nreturn \"+(useGetters ? \"this.data.set(this.offset,v)\" : \"this.data[this.offset]=v\")+\"\\\n};\\\nreturn function construct_\"+className+\"(a,b,c,d){return new \"+className+\"(a,d)}\"\n var procedure = new Function(\"TrivialArray\", code)\n return procedure(CACHED_CONSTRUCTORS[dtype][0])\n }\n\n var code = [\"'use strict'\"]\n\n //Create constructor for view\n var indices = iota(dimension)\n var args = indices.map(function(i) { return \"i\"+i })\n var index_str = \"this.offset+\" + indices.map(function(i) {\n return \"this.stride[\" + i + \"]*i\" + i\n }).join(\"+\")\n var shapeArg = indices.map(function(i) {\n return \"b\"+i\n }).join(\",\")\n var strideArg = indices.map(function(i) {\n return \"c\"+i\n }).join(\",\")\n code.push(\n \"function \"+className+\"(a,\" + shapeArg + \",\" + strideArg + \",d){this.data=a\",\n \"this.shape=[\" + shapeArg + \"]\",\n \"this.stride=[\" + strideArg + \"]\",\n \"this.offset=d|0}\",\n \"var proto=\"+className+\".prototype\",\n \"proto.dtype='\"+dtype+\"'\",\n \"proto.dimension=\"+dimension)\n\n //view.size:\n code.push(\"Object.defineProperty(proto,'size',{get:function \"+className+\"_size(){\\\nreturn \"+indices.map(function(i) { return \"this.shape[\"+i+\"]\" }).join(\"*\"),\n\"}})\")\n\n //view.order:\n if(dimension === 1) {\n code.push(\"proto.order=[0]\")\n } else {\n code.push(\"Object.defineProperty(proto,'order',{get:\")\n if(dimension < 4) {\n code.push(\"function \"+className+\"_order(){\")\n if(dimension === 2) {\n code.push(\"return (Math.abs(this.stride[0])>Math.abs(this.stride[1]))?[1,0]:[0,1]}})\")\n } else if(dimension === 3) {\n code.push(\n\"var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);\\\nif(s0>s1){\\\nif(s1>s2){\\\nreturn [2,1,0];\\\n}else if(s0>s2){\\\nreturn [1,2,0];\\\n}else{\\\nreturn [1,0,2];\\\n}\\\n}else if(s0>s2){\\\nreturn [2,0,1];\\\n}else if(s2>s1){\\\nreturn [0,1,2];\\\n}else{\\\nreturn [0,2,1];\\\n}}})\")\n }\n } else {\n code.push(\"ORDER})\")\n }\n }\n\n //view.set(i0, ..., v):\n code.push(\n\"proto.set=function \"+className+\"_set(\"+args.join(\",\")+\",v){\")\n if(useGetters) {\n code.push(\"return this.data.set(\"+index_str+\",v)}\")\n } else {\n code.push(\"return this.data[\"+index_str+\"]=v}\")\n }\n\n //view.get(i0, ...):\n code.push(\"proto.get=function \"+className+\"_get(\"+args.join(\",\")+\"){\")\n if(useGetters) {\n code.push(\"return this.data.get(\"+index_str+\")}\")\n } else {\n code.push(\"return this.data[\"+index_str+\"]}\")\n }\n\n //view.index:\n code.push(\n \"proto.index=function \"+className+\"_index(\", args.join(), \"){return \"+index_str+\"}\")\n\n //view.hi():\n code.push(\"proto.hi=function \"+className+\"_hi(\"+args.join(\",\")+\"){return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return [\"(typeof i\",i,\"!=='number'||i\",i,\"<0)?this.shape[\", i, \"]:i\", i,\"|0\"].join(\"\")\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"this.stride[\"+i + \"]\"\n }).join(\",\")+\",this.offset)}\")\n\n //view.lo():\n var a_vars = indices.map(function(i) { return \"a\"+i+\"=this.shape[\"+i+\"]\" })\n var c_vars = indices.map(function(i) { return \"c\"+i+\"=this.stride[\"+i+\"]\" })\n code.push(\"proto.lo=function \"+className+\"_lo(\"+args.join(\",\")+\"){var b=this.offset,d=0,\"+a_vars.join(\",\")+\",\"+c_vars.join(\",\"))\n for(var i=0; i<dimension; ++i) {\n code.push(\n\"if(typeof i\"+i+\"==='number'&&i\"+i+\">=0){\\\nd=i\"+i+\"|0;\\\nb+=c\"+i+\"*d;\\\na\"+i+\"-=d}\")\n }\n code.push(\"return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return \"a\"+i\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"c\"+i\n }).join(\",\")+\",b)}\")\n\n //view.step():\n code.push(\"proto.step=function \"+className+\"_step(\"+args.join(\",\")+\"){var \"+\n indices.map(function(i) {\n return \"a\"+i+\"=this.shape[\"+i+\"]\"\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"b\"+i+\"=this.stride[\"+i+\"]\"\n }).join(\",\")+\",c=this.offset,d=0,ceil=Math.ceil\")\n for(var i=0; i<dimension; ++i) {\n code.push(\n\"if(typeof i\"+i+\"==='number'){\\\nd=i\"+i+\"|0;\\\nif(d<0){\\\nc+=b\"+i+\"*(a\"+i+\"-1);\\\na\"+i+\"=ceil(-a\"+i+\"/d)\\\n}else{\\\na\"+i+\"=ceil(a\"+i+\"/d)\\\n}\\\nb\"+i+\"*=d\\\n}\")\n }\n code.push(\"return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return \"a\" + i\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"b\" + i\n }).join(\",\")+\",c)}\")\n\n //view.transpose():\n var tShape = new Array(dimension)\n var tStride = new Array(dimension)\n for(var i=0; i<dimension; ++i) {\n tShape[i] = \"a[i\"+i+\"]\"\n tStride[i] = \"b[i\"+i+\"]\"\n }\n code.push(\"proto.transpose=function \"+className+\"_transpose(\"+args+\"){\"+\n args.map(function(n,idx) { return n + \"=(\" + n + \"===undefined?\" + idx + \":\" + n + \"|0)\"}).join(\";\"),\n \"var a=this.shape,b=this.stride;return new \"+className+\"(this.data,\"+tShape.join(\",\")+\",\"+tStride.join(\",\")+\",this.offset)}\")\n\n //view.pick():\n code.push(\"proto.pick=function \"+className+\"_pick(\"+args+\"){var a=[],b=[],c=this.offset\")\n for(var i=0; i<dimension; ++i) {\n code.push(\"if(typeof i\"+i+\"==='number'&&i\"+i+\">=0){c=(c+this.stride[\"+i+\"]*i\"+i+\")|0}else{a.push(this.shape[\"+i+\"]);b.push(this.stride[\"+i+\"])}\")\n }\n code.push(\"var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}\")\n\n //Add return statement\n code.push(\"return function construct_\"+className+\"(data,shape,stride,offset){return new \"+className+\"(data,\"+\n indices.map(function(i) {\n return \"shape[\"+i+\"]\"\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"stride[\"+i+\"]\"\n }).join(\",\")+\",offset)}\")\n\n //Compile procedure\n var procedure = new Function(\"CTOR_LIST\", \"ORDER\", code.join(\"\\n\"))\n return procedure(CACHED_CONSTRUCTORS[dtype], order)\n}\n\nfunction arrayDType(data) {\n if(isBuffer(data)) {\n return \"buffer\"\n }\n if(hasTypedArrays) {\n switch(Object.prototype.toString.call(data)) {\n case \"[object Float64Array]\":\n return \"float64\"\n case \"[object Float32Array]\":\n return \"float32\"\n case \"[object Int8Array]\":\n return \"int8\"\n case \"[object Int16Array]\":\n return \"int16\"\n case \"[object Int32Array]\":\n return \"int32\"\n case \"[object Uint8Array]\":\n return \"uint8\"\n case \"[object Uint16Array]\":\n return \"uint16\"\n case \"[object Uint32Array]\":\n return \"uint32\"\n case \"[object Uint8ClampedArray]\":\n return \"uint8_clamped\"\n case \"[object BigInt64Array]\":\n return \"bigint64\"\n case \"[object BigUint64Array]\":\n return \"biguint64\"\n }\n }\n if(Array.isArray(data)) {\n return \"array\"\n }\n return \"generic\"\n}\n\nvar CACHED_CONSTRUCTORS = {\n \"float32\":[],\n \"float64\":[],\n \"int8\":[],\n \"int16\":[],\n \"int32\":[],\n \"uint8\":[],\n \"uint16\":[],\n \"uint32\":[],\n \"array\":[],\n \"uint8_clamped\":[],\n \"bigint64\": [],\n \"biguint64\": [],\n \"buffer\":[],\n \"generic\":[]\n}\n\n;(function() {\n for(var id in CACHED_CONSTRUCTORS) {\n CACHED_CONSTRUCTORS[id].push(compileConstructor(id, -1))\n }\n});\n\nfunction wrappedNDArrayCtor(data, shape, stride, offset) {\n if(data === undefined) {\n var ctor = CACHED_CONSTRUCTORS.array[0]\n return ctor([])\n } else if(typeof data === \"number\") {\n data = [data]\n }\n if(shape === undefined) {\n shape = [ data.length ]\n }\n var d = shape.length\n if(stride === undefined) {\n stride = new Array(d)\n for(var i=d-1, sz=1; i>=0; --i) {\n stride[i] = sz\n sz *= shape[i]\n }\n }\n if(offset === undefined) {\n offset = 0\n for(var i=0; i<d; ++i) {\n if(stride[i] < 0) {\n offset -= (shape[i]-1)*stride[i]\n }\n }\n }\n var dtype = arrayDType(data)\n var ctor_list = CACHED_CONSTRUCTORS[dtype]\n while(ctor_list.length <= d+1) {\n ctor_list.push(compileConstructor(dtype, ctor_list.length-1))\n }\n var ctor = ctor_list[d+1]\n return ctor(data, shape, stride, offset)\n}\n\nmodule.exports = wrappedNDArrayCtor\n","\"use strict\"\n\nfunction iota(n) {\n var result = new Array(n)\n for(var i=0; i<n; ++i) {\n result[i] = i\n }\n return result\n}\n\nmodule.exports = iota","/**\n * crossProduct3D - Returns the cross product of a and b.\n *\n * @param {Number[3]} a Vector a.\n * @param {Number[3]} b Vector b.\n * @return {Number[3]} The cross product.\n */\nexport default function (a, b) {\n return [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0]\n ];\n}\n","const flipImageOrientationPatient = {\n /**\n * h: Flips ImageOrientationPatient in the horizontal direction.\n * @param {Number[6]} iop - ImageOrientationPatient\n * @returns {Number[6]} The transformed ImageOrientationPatient\n */\n h: iop => {\n return [iop[0], iop[1], iop[2], -iop[3], -iop[4], -iop[5]];\n },\n /**\n * v: Flips ImageOrientationPatient in the vertical direction.\n * @param {Number[6]} iop - ImageOrientationPatient\n * @returns {Number[6]} The transformed ImageOrientationPatient\n */\n v: iop => {\n return [-iop[0], -iop[1], -iop[2], iop[3], iop[4], iop[5]];\n },\n /**\n * hv: Flips ImageOrientationPatient in the horizontal and vertical directions.\n * @param {Number[6]} iop - ImageOrientationPatient\n * @returns {Number[6]} The transformed ImageOrientationPatient\n */\n hv: iop => {\n return [-iop[0], -iop[1], -iop[2], -iop[3], -iop[4], -iop[5]];\n }\n};\n\nexport { flipImageOrientationPatient };\n","import crossProduct3D from \"./crossProduct3D.js\";\n\n/**\n * rotateVectorAroundUnitVector - Rotates vector v around unit vector k using\n * Rodrigues' rotation formula.\n *\n * @param {Number[3]} v The vector to rotate.\n * @param {Number[3]} k The unit vector of the axis of rotation.\n * @param {Number} theta The rotation magnitude in radians.\n * @return {Number[3]} The rotated v vector.\n */\nexport default function (v, k, theta) {\n const cosTheta = Math.cos(theta);\n const sinTheta = Math.sin(theta);\n const oneMinusCosTheta = 1.0 - cosTheta;\n const kdotv = k[0] * v[0] + k[1] * v[1] + k[2] * v[2];\n const vRot = [];\n const kxv = crossProduct3D(k, v);\n\n for (let i = 0; i <= 2; i++) {\n vRot[i] =\n v[i] * cosTheta +\n kxv[i] * sinTheta +\n k[i] * kdotv * oneMinusCosTheta;\n\n vRot[i] *= -1;\n }\n\n return vRot;\n}\n","import crossProduct3D from \"./crossProduct3D.js\";\nimport rotateVectorAroundUnitVector from \"./rotateVectorAroundUnitVector.js\";\n\n/**\n * rotateDirectionCosinesInPlane - rotates the row and column cosines around\n * their normal by angle theta.\n *\n * @param {Number[6]} iop The row (0..2) an column (3..5) direction cosines.\n * @param {Number} theta The rotation magnitude in radians.\n * @return {Number[6]} The rotate row (0..2) and column (3..5) direction cosines.\n */\nexport default function (iop, theta) {\n const r = [iop[0], iop[1], iop[2]];\n const c = [iop[3], iop[4], iop[5]];\n const rxc = crossProduct3D(r, c);\n\n const rRot = rotateVectorAroundUnitVector(r, rxc, theta);\n const cRot = rotateVectorAroundUnitVector(c, rxc, theta);\n\n return [...rRot, ...cRot];\n}\n","import ndarray from \"ndarray\";\n\nconst flipMatrix2D = {\n h,\n v\n};\n\nexport { flipMatrix2D };\n\n/**\n * flipMatrix2D.h - Flips a 2D matrix in the horizontal direction.\n *\n * @param {Ndarry} matrix The matrix to flip.\n * @return {Ndarry} The flipped matrix.\n */\nfunction h(matrix) {\n const [rows, cols] = matrix.shape;\n\n const result = ndarray(new Uint8Array(rows * cols), [rows, cols]);\n\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n result.set(i, j, matrix.get(i, cols - 1 - j));\n }\n }\n\n return result;\n}\n\n/**\n * flipMatrix2D.h - Flips a 2D matrix in the vertical direction.\n *\n * @param {Ndarry} matrix The matrix to flip.\n * @return {Ndarry} The flipped matrix.\n */\nfunction v(matrix) {\n const [rows, cols] = matrix.shape;\n\n const result = ndarray(new Uint8Array(rows * cols), [rows, cols]);\n\n for (let j = 0; j < cols; j++) {\n for (let i = 0; i < rows; i++) {\n result.set(i, j, matrix.get(rows - 1 - i, j));\n }\n }\n\n return result;\n}\n","import ndarray from \"ndarray\";\n\n/**\n * anonymous function - Rotates a matrix by 90 degrees.\n *\n * @param {Ndarray} matrix The matrix to rotate.\n * @return {Ndarry} The rotated matrix.\n */\nexport default function (matrix) {\n const [rows, cols] = matrix.shape;\n\n let result = ndarray(new Uint8Array(rows * cols), [cols, rows]);\n\n let resultColsMinus1 = result.shape[1] - 1;\n\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n result.set(j, resultColsMinus1 - i, matrix.get(i, j));\n }\n }\n\n return result;\n}\n","/**\n * nearlyEqual - Returns true if a and b are nearly equal\n * within a tolerance.\n *\n * Inspiration for this function logic source comes from:\n * https://floating-point-gui.de/errors/comparison/\n *\n * https://floating-point-gui.de is published under\n * the Creative Commons Attribution License (BY):\n * http://creativecommons.org/licenses/by/3.0/\n *\n * The actual implementation has been adjusted\n * as discussed here: https://github.com/dcmjs-org/dcmjs/pull/304\n *\n * More information on floating point comparison here:\n * http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/\n *\n * @param {Number} a\n * @param {Number} b\n * @param {Number} tolerance.\n * @return {Boolean} True if a and b are nearly equal.\n */\nexport default function nearlyEqual(a, b, epsilon) {\n const absA = Math.abs(a);\n const absB = Math.abs(b);\n const diff = Math.abs(a - b);\n if (a === b) {\n // shortcut, handles infinities\n return true;\n } else if (a === 0 || b === 0 || absA + absB < epsilon * epsilon) {\n // a or b is zero or both are extremely close to it\n // relative error is less meaningful here\n return diff < epsilon;\n } else {\n // use relative error\n return diff / Math.min(absA + absB, Number.MAX_VALUE) < epsilon;\n }\n}\n","import log from \"../../log.js\";\nimport ndarray from \"ndarray\";\nimport { BitArray } from \"../../bitArray.js\";\nimport { datasetToBlob } from \"../../datasetToBlob.js\";\nimport { DicomMessage } from \"../../DicomMessage.js\";\nimport { DicomMetaDictionary } from \"../../DicomMetaDictionary.js\";\nimport { Normalizer } from \"../../normalizers.js\";\nimport { Segmentation as SegmentationDerivation } from \"../../derivations/index.js\";\nimport {\n rotateDirectionCosinesInPlane,\n flipImageOrientationPatient as flipIOP,\n flipMatrix2D,\n rotateMatrix902D\n} from \"../../utilities/orientation/index.js\";\n\nconst Segmentation = {\n generateSegmentation,\n generateToolState\n};\n\nexport default Segmentation;\n\n/**\n *\n * @typedef {Object} BrushData\n * @property {Object} toolState - The cornerstoneTools global toolState.\n * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the\n * seriesInstanceUid.\n */\n\n/**\n * generateSegmentation - Generates cornerstoneTools brush data, given a stack of\n * imageIds, images and the cornerstoneTools brushData.\n *\n * @param {object[]} images An array of the cornerstone image objects.\n * @param {BrushData} brushData and object containing the brushData.\n * @returns {type} description\n */\nfunction generateSegmentation(\n images,\n brushData,\n options = { includeSliceSpacing: true }\n) {\n const { toolState, segments } = brushData;\n\n // Calculate the dimensions of the data cube.\n const image0 = images[0];\n\n const dims = {\n x: image0.columns,\n y: image0.rows,\n z: images.length\n };\n\n dims.xy = dims.x * dims.y;\n\n const numSegments = _getSegCount(seg, segments);\n\n if (!numSegments) {\n throw new Error(\"No segments to export!\");\n }\n\n const isMultiframe = image0.imageId.includes(\"?frame\");\n const seg = _createSegFromImages(images, isMultiframe, options);\n\n const { referencedFramesPerSegment, segmentIndicies } =\n _getNumberOfFramesPerSegment(toolState, images, segments);\n\n let NumberOfFrames = 0;\n\n for (let i = 0; i < referencedFramesPerSegment.length; i++) {\n NumberOfFrames += referencedFramesPerSegment[i].length;\n }\n\n seg.setNumberOfFrames(NumberOfFrames);\n\n for (let i = 0; i < segmentIndicies.length; i++) {\n const segmentIndex = segmentIndicies[i];\n const referencedFrameIndicies = referencedFramesPerSegment[i];\n\n // Frame numbers start from 1.\n const referencedFrameNumbers = referencedFrameIndicies.map(element => {\n return element + 1;\n });\n\n const segment = segments[segmentIndex];\n\n seg.addSegment(\n segment,\n _extractCornerstoneToolsPixelData(\n segmentIndex,\n referencedFrameIndicies,\n toolState,\n images,\n dims\n ),\n referencedFrameNumbers\n );\n }\n\n seg.bitPackPixelData();\n\n const segBlob = datasetToBlob(seg.dataset);\n\n return segBlob;\n}\n\nfunction _extractCornerstoneToolsPixelData(\n segmentIndex,\n referencedFrames,\n toolState,\n images,\n dims\n) {\n const pixelData = new Uint8Array(dims.xy * referencedFrames.length);\n\n let pixelDataIndex = 0;\n\n for (let i = 0; i < referencedFrames.length; i++) {\n const frame = referencedFrames[i];\n\n const imageId = images[frame].imageId;\n const imageIdSpecificToolState = toolState[imageId];\n\n const brushPixelData =\n imageIdSpecificToolState.brush.data[segmentIndex].pixelData;\n\n for (let p = 0; p < brushPixelData.length; p++) {\n pixelData[pixelDataIndex] = brushPixelData[p];\n pixelDataIndex++;\n }\n }\n\n return pixelData;\n}\n\nfunction _getNumberOfFramesPerSegment(toolState, images, segments) {\n const segmentIndicies = [];\n const referencedFramesPerSegment = [];\n\n for (let i = 0; i < segments.length; i++) {\n if (segments[i]) {\n segmentIndicies.push(i);\n referencedFramesPerSegment.push([]);\n }\n }\n\n for (let z = 0; z < images.length; z++) {\n const imageId = images[z].imageId;\n const imageIdSpecificToolState = toolState[imageId];\n\n for (let i = 0; i < segmentIndicies.length; i++) {\n const segIdx = segmentIndicies[i];\n\n if (\n imageIdSpecificToolState &&\n imageIdSpecificToolState.brush &&\n imageIdSpecificToolState.brush.data &&\n imageIdSpecificToolState.brush.data[segIdx] &&\n imageIdSpecificToolState.brush.data[segIdx].pixelData\n ) {\n referencedFramesPerSegment[i].push(z);\n }\n }\n }\n\n return {\n referencedFramesPerSegment,\n segmentIndicies\n };\n}\n\nfunction _getSegCount(seg, segments) {\n let numSegments = 0;\n\n for (let i = 0; i < segments.length; i++) {\n if (segments[i]) {\n numSegments++;\n }\n }\n\n return numSegments;\n}\n\n/**\n * _createSegFromImages - description\n *\n * @param {Object[]} images An array of the cornerstone image objects.\n * @param {Boolean} isMultiframe Whether the images are multiframe.\n * @returns {Object} The Seg derived dataSet.\n */\nfunction _createSegFromImages(images, isMultiframe, options) {\n const datasets = [];\n\n if (isMultiframe) {\n const image = images[0];\n const arrayBuffer = image.data.byteArray.buffer;\n\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n\n datasets.push(dataset);\n } else {\n for (let i = 0; i < images.length; i++) {\n const image = images[i];\n const arrayBuffer = image.data.byteArray.buffer;\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(\n dicomData.dict\n );\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n datasets.push(dataset);\n }\n }\n\n const multiframe = Normalizer.normalizeToDataset(datasets);\n\n return new SegmentationDerivation([multiframe], options);\n}\n\n/**\n * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,\n * derive cornerstoneTools toolState and brush metadata.\n *\n * @param {string[]} imageIds An array of the imageIds.\n * @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.\n * @param {*} metadataProvider\n * @returns {Object} The toolState and an object from which the\n * segment metadata can be derived.\n */\nfunction generateToolState(imageIds, arrayBuffer, metadataProvider) {\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n const multiframe = Normalizer.normalizeToDataset([dataset]);\n\n const imagePlaneModule = metadataProvider.get(\n \"imagePlaneModule\",\n imageIds[0]\n );\n\n if (!imagePlaneModule) {\n console.warn(\"Insufficient metadata, imagePlaneModule missing.\");\n }\n\n const ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines)\n ? [...imagePlaneModule.rowCosines, ...imagePlaneModule.columnCosines]\n : [\n imagePlaneModule.rowCosines.x,\n imagePlaneModule.rowCosines.y,\n imagePlaneModule.rowCosines.z,\n imagePlaneModule.columnCosines.x,\n imagePlaneModule.columnCosines.y,\n imagePlaneModule.columnCosines.z\n ];\n\n // Get IOP from ref series, compute supported orientations:\n const validOrientations = getValidOrientations(ImageOrientationPatient);\n\n const SharedFunctionalGroupsSequence =\n multiframe.SharedFunctionalGroupsSequence;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n\n const sliceLength = multiframe.Columns * multiframe.Rows;\n const segMetadata = getSegmentMetadata(multiframe);\n const pixelData = unpackPixelData(multiframe);\n\n const PerFrameFunctionalGroupsSequence =\n multiframe.PerFrameFunctionalGroupsSequence;\n\n const toolState = {};\n\n let inPlane = true;\n\n for (let i = 0; i < PerFrameFunctionalGroupsSequence.length; i++) {\n const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];\n\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n const pixelDataI2D = ndarray(\n new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength),\n [multiframe.Rows, multiframe.Columns]\n );\n\n const alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations\n );\n\n if (!alignedPixelDataI) {\n console.warn(\n \"This segmentation object is not in-plane with the source data. Bailing out of IO. It'd be better to render this with vtkjs. \"\n );\n inPlane = false;\n break;\n }\n\n const segmentIndex =\n PerFrameFunctionalGroups.SegmentIdentificationSequence\n .ReferencedSegmentNumber - 1;\n\n let SourceImageSequence;\n if (\n SharedFunctionalGroupsSequence.DerivationImageSequence &&\n SharedFunctionalGroupsSequence.DerivationImageSequence\n .SourceImageSequence\n ) {\n SourceImageSequence =\n SharedFunctionalGroupsSequence.DerivationImageSequence\n .SourceImageSequence[i];\n } else {\n SourceImageSequence =\n PerFrameFunctionalGroups.DerivationImageSequence\n .SourceImageSequence;\n }\n\n const imageId = getImageIdOfSourceImage(\n SourceImageSequence,\n imageIds,\n metadataProvider\n );\n\n addImageIdSpecificBrushToolState(\n toolState,\n imageId,\n segmentIndex,\n alignedPixelDataI\n );\n }\n\n if (!inPlane) {\n return;\n }\n\n return { toolState, segMetadata };\n}\n\n/**\n * unpackPixelData - Unpacks bitpacked pixelData if the Segmentation is BINARY.\n *\n * @param {Object} multiframe The multiframe dataset.\n * @return {Uint8Array} The unpacked pixelData.\n */\nfunction unpackPixelData(multiframe) {\n const segType = multiframe.SegmentationType;\n\n if (segType === \"BINARY\") {\n return BitArray.unpack(multiframe.PixelData);\n }\n\n const pixelData = new Uint8Array(multiframe.PixelData);\n\n const max = multiframe.MaximumFractionalValue;\n const onlyMaxAndZero =\n pixelData.find(element => element !== 0 && element !== max) ===\n undefined;\n\n if (!onlyMaxAndZero) {\n log.warn(\n \"This is a fractional segmentation, which is not currently supported.\"\n );\n return;\n }\n\n log.warn(\n \"This segmentation object is actually binary... processing as such.\"\n );\n\n return pixelData;\n}\n\n/**\n * addImageIdSpecificBrushToolState - Adds brush pixel data to cornerstoneTools\n * formatted toolState object.\n *\n * @param {Object} toolState The toolState object to modify\n * @param {String} imageId The imageId of the toolState to add the data.\n * @param {Number} segmentIndex The index of the segment data being added.\n * @param {Ndarray} pixelData2D The pixelData in Ndarry 2D format.\n */\nfunction addImageIdSpecificBrushToolState(\n toolState,\n imageId,\n segmentIndex,\n pixelData2D\n) {\n if (!toolState[imageId]) {\n toolState[imageId] = {};\n toolState[imageId].brush = {};\n toolState[imageId].brush.data = [];\n } else if (!toolState[imageId].brush) {\n toolState[imageId].brush = {};\n toolState[imageId].brush.data = [];\n } else if (!toolState[imageId].brush.data) {\n toolState[imageId].brush.data = [];\n }\n\n toolState[imageId].brush.data[segmentIndex] = {};\n\n const brushDataI = toolState[imageId].brush.data[segmentIndex];\n\n brushDataI.pixelData = new Uint8Array(pixelData2D.data.length);\n\n const cToolsPixelData = brushDataI.pixelData;\n\n for (let p = 0; p < cToolsPixelData.length; p++) {\n if (pixelData2D.data[p]) {\n cToolsPixelData[p] = 1;\n } else {\n cToolsPixelData[p] = 0;\n }\n }\n}\n\n/**\n * getImageIdOfSourceImage - Returns the Cornerstone imageId of the source image.\n *\n * @param {Object} SourceImageSequence Sequence describing the source image.\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} metadataProvider A Cornerstone metadataProvider to query\n * metadata from imageIds.\n * @return {String} The corresponding imageId.\n */\nfunction getImageIdOfSourceImage(\n SourceImageSequence,\n imageIds,\n metadataProvider\n) {\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n SourceImageSequence;\n\n return ReferencedFrameNumber\n ? getImageIdOfReferencedFrame(\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber,\n imageIds,\n metadataProvider\n )\n : getImageIdOfReferencedSingleFramedSOPInstance(\n ReferencedSOPInstanceUID,\n imageIds,\n metadataProvider\n );\n}\n\n/**\n * getImageIdOfReferencedSingleFramedSOPInstance - Returns the imageId\n * corresponding to the specified sopInstanceUid for single-frame images.\n *\n * @param {String} sopInstanceUid The sopInstanceUid of the desired image.\n * @param {String[]} imageIds The list of imageIds.\n * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids\n * from the cornerstone imageIds.\n * @return {String} The imageId that corresponds to the sopInstanceUid.\n */\nfunction getImageIdOfReferencedSingleFramedSOPInstance(\n sopInstanceUid,\n imageIds,\n metadataProvider\n) {\n return imageIds.find(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n if (!sopCommonModule) {\n return;\n }\n\n return sopCommonModule.sopInstanceUID === sopInstanceUid;\n });\n}\n\n/**\n * getImageIdOfReferencedFrame - Returns the imageId corresponding to the\n * specified sopInstanceUid and frameNumber for multi-frame images.\n *\n * @param {String} sopInstanceUid The sopInstanceUid of the desired image.\n * @param {Number} frameNumber The frame number.\n * @param {String} imageIds The list of imageIds.\n * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids\n * from the cornerstone imageIds.\n * @return {String} The imageId that corresponds to the sopInstanceUid.\n */\nfunction getImageIdOfReferencedFrame(\n sopInstanceUid,\n frameNumber,\n imageIds,\n metadataProvider\n) {\n const imageId = imageIds.find(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n if (!sopCommonModule) {\n return;\n }\n\n const imageIdFrameNumber = Number(imageId.split(\"frame=\")[1]);\n\n return (\n //frameNumber is zero indexed for cornerstoneWADOImageLoader image Ids.\n sopCommonModule.sopInstanceUID === sopInstanceUid &&\n imageIdFrameNumber === frameNumber - 1\n );\n });\n\n return imageId;\n}\n\n/**\n * getValidOrientations - returns an array of valid orientations.\n *\n * @param {Number[6]} iop The row (0..2) an column (3..5) direction cosines.\n * @return {Number[8][6]} An array of valid orientations.\n */\nfunction getValidOrientations(iop) {\n const orientations = [];\n\n // [0, 1, 2]: 0, 0hf, 0vf\n // [3, 4, 5]: 90, 90hf, 90vf\n // [6, 7]: 180, 270\n\n orientations[0] = iop;\n orientations[1] = flipIOP.h(iop);\n orientations[2] = flipIOP.v(iop);\n\n const iop90 = rotateDirectionCosinesInPlane(iop, Math.PI / 2);\n\n orientations[3] = iop90;\n orientations[4] = flipIOP.h(iop90);\n orientations[5] = flipIOP.v(iop90);\n\n orientations[6] = rotateDirectionCosinesInPlane(iop, Math.PI);\n orientations[7] = rotateDirectionCosinesInPlane(iop, 1.5 * Math.PI);\n\n return orientations;\n}\n\n/**\n * alignPixelDataWithSourceData -\n *\n * @param {Ndarray} pixelData2D The data to align.\n * @param {Number[6]} iop The orientation of the image slice.\n * @param {Number[8][6]} orientations An array of valid imageOrientationPatient values.\n * @return {Ndarray} The aligned pixelData.\n */\nfunction alignPixelDataWithSourceData(pixelData2D, iop, orientations) {\n if (compareIOP(iop, orientations[0])) {\n //Same orientation.\n return pixelData2D;\n } else if (compareIOP(iop, orientations[1])) {\n //Flipped vertically.\n return flipMatrix2D.v(pixelData2D);\n } else if (compareIOP(iop, orientations[2])) {\n //Flipped horizontally.\n return flipMatrix2D.h(pixelData2D);\n } else if (compareIOP(iop, orientations[3])) {\n //Rotated 90 degrees.\n return rotateMatrix902D(pixelData2D);\n } else if (compareIOP(iop, orientations[4])) {\n //Rotated 90 degrees and fliped horizontally.\n return flipMatrix2D.h(rotateMatrix902D(pixelData2D));\n } else if (compareIOP(iop, orientations[5])) {\n //Rotated 90 degrees and fliped vertically.\n return flipMatrix2D.v(rotateMatrix902D(pixelData2D));\n } else if (compareIOP(iop, orientations[6])) {\n //Rotated 180 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.\n return rotateMatrix902D(rotateMatrix902D(pixelData2D));\n } else if (compareIOP(iop, orientations[7])) {\n //Rotated 270 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.\n return rotateMatrix902D(\n rotateMatrix902D(rotateMatrix902D(pixelData2D))\n );\n }\n}\n\nconst dx = 1e-5;\n\n/**\n * compareIOP - Returns true if iop1 and iop2 are equal\n * within a tollerance, dx.\n *\n * @param {Number[6]} iop1 An ImageOrientationPatient array.\n * @param {Number[6]} iop2 An ImageOrientationPatient array.\n * @return {Boolean} True if iop1 and iop2 are equal.\n */\nfunction compareIOP(iop1, iop2) {\n return (\n Math.abs(iop1[0] - iop2[0]) < dx &&\n Math.abs(iop1[1] - iop2[1]) < dx &&\n Math.abs(iop1[2] - iop2[2]) < dx &&\n Math.abs(iop1[3] - iop2[3]) < dx &&\n Math.abs(iop1[4] - iop2[4]) < dx &&\n Math.abs(iop1[5] - iop2[5]) < dx\n );\n}\n\nfunction getSegmentMetadata(multiframe) {\n const data = [];\n\n const segmentSequence = multiframe.SegmentSequence;\n\n if (Array.isArray(segmentSequence)) {\n for (let segIdx = 0; segIdx < segmentSequence.length; segIdx++) {\n data.push(segmentSequence[segIdx]);\n }\n } else {\n // Only one segment, will be stored as an object.\n data.push(segmentSequence);\n }\n\n return {\n seriesInstanceUid:\n multiframe.ReferencedSeriesSequence.SeriesInstanceUID,\n data\n };\n}\n","import log from \"../../log.js\";\n\n/**\n * Encodes a non-bitpacked frame which has one sample per pixel.\n *\n * @param {*} buffer\n * @param {*} numberOfFrames\n * @param {*} rows\n * @param {*} cols\n */\nfunction encode(buffer, numberOfFrames, rows, cols) {\n const frameLength = rows * cols;\n\n const header = createHeader();\n let encodedFrames = [];\n\n for (let frame = 0; frame < numberOfFrames; frame++) {\n const frameOffset = frameLength * frame;\n\n encodedFrames.push(\n encodeFrame(buffer, frameOffset, rows, cols, header)\n );\n }\n\n return encodedFrames;\n}\n\nfunction encodeFrame(buffer, frameOffset, rows, cols, header) {\n // Add header to frame:\n let rleArray = [];\n\n for (let r = 0; r < rows; r++) {\n const rowOffset = r * cols;\n const uint8Row = new Uint8Array(buffer, frameOffset + rowOffset, cols);\n\n let i = 0;\n\n while (i < uint8Row.length) {\n const literalRunLength = getLiteralRunLength(uint8Row, i);\n\n if (literalRunLength) {\n // State how many in litteral run\n rleArray.push(literalRunLength - 1);\n // Append litteral run.\n const literalRun = uint8Row.slice(i, i + literalRunLength);\n\n rleArray = [...rleArray, ...literalRun];\n\n i += literalRunLength;\n }\n\n if (i >= uint8Row.length) {\n break;\n }\n\n // Next must be a replicate run.\n const replicateRunLength = getReplicateRunLength(uint8Row, i);\n\n if (replicateRunLength) {\n // State how many in replicate run\n rleArray.push(257 - replicateRunLength);\n rleArray.push(uint8Row[i]);\n\n i += replicateRunLength;\n }\n }\n }\n\n const headerLength = 64;\n\n const bodyLength =\n rleArray.length % 2 === 0 ? rleArray.length : rleArray.length + 1;\n\n const encodedFrameBuffer = new ArrayBuffer(headerLength + bodyLength);\n\n // Copy header into encodedFrameBuffer.\n const headerView = new Uint32Array(encodedFrameBuffer, 0, 16);\n\n for (let i = 0; i < headerView.length; i++) {\n headerView[i] = header[i];\n }\n\n for (let i = 0; i < headerView.length; i++) {\n rleArray.push(headerView[i]);\n }\n\n // Copy rle data into encodedFrameBuffer.\n const bodyView = new Uint8Array(encodedFrameBuffer, 64);\n\n for (let i = 0; i < rleArray.length; i++) {\n bodyView[i] = rleArray[i];\n }\n\n return encodedFrameBuffer;\n}\n\nfunction createHeader() {\n const headerUint32 = new Uint32Array(16);\n\n headerUint32[0] = 1; // 1 Segment.\n headerUint32[1] = 64; // Data offset is 64 bytes.\n\n // Return byte-array version of header:\n return headerUint32;\n}\n\nfunction getLiteralRunLength(uint8Row, i) {\n for (var l = 0; l < uint8Row.length - i; l++) {\n if (\n uint8Row[i + l] === uint8Row[i + l + 1] &&\n uint8Row[i + l + 1] === uint8Row[i + l + 2]\n ) {\n return l;\n }\n\n if (l === 128) {\n return l;\n }\n }\n return uint8Row.length - i;\n}\n\nfunction getReplicateRunLength(uint8Row, i) {\n const first = uint8Row[i];\n for (let l = 1; l < uint8Row.length - i; l++) {\n if (uint8Row[i + l] !== first) {\n return l;\n }\n\n if (l === 128) {\n return l;\n }\n }\n\n return uint8Row.length - i;\n}\n\nfunction decode(rleEncodedFrames, rows, cols) {\n const pixelData = new Uint8Array(rows * cols * rleEncodedFrames.length);\n const buffer = pixelData.buffer;\n const frameLength = rows * cols;\n\n for (let i = 0; i < rleEncodedFrames.length; i++) {\n const rleEncodedFrame = rleEncodedFrames[i];\n\n const uint8FrameView = new Uint8Array(\n buffer,\n i * frameLength,\n frameLength\n );\n\n decodeFrame(rleEncodedFrame, uint8FrameView);\n }\n\n return pixelData;\n}\n\nfunction decodeFrame(rleEncodedFrame, pixelData) {\n // Check HEADER:\n const header = new Uint32Array(rleEncodedFrame, 0, 16);\n\n if (header[0] !== 1) {\n log.error(\n `rleSingleSamplePerPixel only supports fragments with single Byte Segments (for rle encoded segmentation data) at the current time. This rleEncodedFrame has ${header[0]} Byte Segments.`\n );\n\n return;\n }\n\n if (header[1] !== 64) {\n log.error(\n \"Data offset of Byte Segment 1 should be 64 bytes, this rle fragment is encoded incorrectly.\"\n );\n\n return;\n }\n\n const uInt8Frame = new Uint8Array(rleEncodedFrame, 64);\n\n let pixelDataIndex = 0;\n let i = 0;\n\n while (pixelDataIndex < pixelData.length) {\n const byteValue = uInt8Frame[i];\n\n if (byteValue === undefined) {\n break;\n }\n\n if (byteValue <= 127) {\n // TODO -> Interpret the next N+1 bytes literally.\n const N = byteValue + 1;\n const next = i + 1;\n\n // Read the next N bytes literally.\n for (let p = next; p < next + N; p++) {\n pixelData[pixelDataIndex] = uInt8Frame[p];\n pixelDataIndex++;\n }\n i += N + 1;\n }\n\n if (byteValue >= 129) {\n const N = 257 - byteValue;\n const next = i + 1;\n\n // Repeat the next byte N times.\n for (let p = 0; p < N; p++) {\n pixelData[pixelDataIndex] = uInt8Frame[next];\n pixelDataIndex++;\n }\n\n i += 2;\n }\n\n if (i === uInt8Frame.length) {\n break;\n }\n }\n}\n\nexport { encode, decode };\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\nfunction addMapEntry(map, pair) {\n // Don't return `map.set` because it's not chainable in IE 11.\n map.set(pair[0], pair[1]);\n return map;\n}\n\n/**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\nfunction addSetEntry(set, value) {\n // Don't return `set.add` because it's not chainable in IE 11.\n set.add(value);\n return set;\n}\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {boolean} [isFull] Specify a clone including symbols.\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n var result;\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n if (isHostObject(value)) {\n return object ? value : {};\n }\n result = initCloneObject(isFunc ? {} : value);\n if (!isDeep) {\n return copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, baseClone, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (!isArr) {\n var props = isFull ? getAllKeys(value) : keys(value);\n }\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n });\n return result;\n}\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nfunction baseCreate(proto) {\n return isObject(proto) ? objectCreate(proto) : {};\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var result = new buffer.constructor(buffer.length);\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\n/**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\nfunction cloneMap(map, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n return arrayReduce(array, addMapEntry, new map.constructor);\n}\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\n/**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\nfunction cloneSet(set, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n return arrayReduce(array, addSetEntry, new set.constructor);\n}\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Copies own symbol properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Creates an array of the own enumerable symbol properties of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return cloneMap(object, isDeep, cloneFunc);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return cloneSet(object, isDeep, cloneFunc);\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, true, true);\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = cloneDeep;\n","import log from \"../../log.js\";\nimport ndarray from \"ndarray\";\nimport { BitArray } from \"../../bitArray.js\";\nimport { datasetToBlob } from \"../../datasetToBlob.js\";\nimport { DicomMessage } from \"../../DicomMessage.js\";\nimport { DicomMetaDictionary } from \"../../DicomMetaDictionary.js\";\nimport { Normalizer } from \"../../normalizers.js\";\nimport { Segmentation as SegmentationDerivation } from \"../../derivations/index.js\";\nimport {\n rotateDirectionCosinesInPlane,\n flipImageOrientationPatient as flipIOP,\n flipMatrix2D,\n rotateMatrix902D,\n nearlyEqual\n} from \"../../utilities/orientation/index.js\";\nimport {\n encode,\n decode\n} from \"../../utilities/compression/rleSingleSamplePerPixel\";\nimport cloneDeep from \"lodash.clonedeep\";\n\nconst Segmentation = {\n generateSegmentation,\n generateToolState,\n fillSegmentation\n};\n\nexport default Segmentation;\n\n/**\n *\n * @typedef {Object} BrushData\n * @property {Object} toolState - The cornerstoneTools global toolState.\n * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the\n * seriesInstanceUid.\n */\n\nconst generateSegmentationDefaultOptions = {\n includeSliceSpacing: true,\n rleEncode: true\n};\n\n/**\n * generateSegmentation - Generates cornerstoneTools brush data, given a stack of\n * imageIds, images and the cornerstoneTools brushData.\n *\n * @param {object[]} images An array of cornerstone images that contain the source\n * data under `image.data.byteArray.buffer`.\n * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.\n * @param {Object} userOptions Options to pass to the segmentation derivation and `fillSegmentation`.\n * @returns {Blob}\n */\nfunction generateSegmentation(images, inputLabelmaps3D, userOptions = {}) {\n const isMultiframe = images[0].imageId.includes(\"?frame\");\n const segmentation = _createSegFromImages(\n images,\n isMultiframe,\n userOptions\n );\n\n return fillSegmentation(segmentation, inputLabelmaps3D, userOptions);\n}\n\n/**\n * fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.\n *\n * @param {object[]} segmentation An empty segmentation derived dataset.\n * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.\n * @param {Object} userOptions Options object to override default options.\n * @returns {Blob} description\n */\nfunction fillSegmentation(segmentation, inputLabelmaps3D, userOptions = {}) {\n const options = Object.assign(\n {},\n generateSegmentationDefaultOptions,\n userOptions\n );\n\n // Use another variable so we don't redefine labelmaps3D.\n const labelmaps3D = Array.isArray(inputLabelmaps3D)\n ? inputLabelmaps3D\n : [inputLabelmaps3D];\n\n let numberOfFrames = 0;\n const referencedFramesPerLabelmap = [];\n\n for (\n let labelmapIndex = 0;\n labelmapIndex < labelmaps3D.length;\n labelmapIndex++\n ) {\n const labelmap3D = labelmaps3D[labelmapIndex];\n const { labelmaps2D, metadata } = labelmap3D;\n\n const referencedFramesPerSegment = [];\n\n for (let i = 1; i < metadata.length; i++) {\n if (metadata[i]) {\n referencedFramesPerSegment[i] = [];\n }\n }\n\n for (let i = 0; i < labelmaps2D.length; i++) {\n const labelmap2D = labelmaps2D[i];\n\n if (labelmaps2D[i]) {\n const { segmentsOnLabelmap } = labelmap2D;\n\n segmentsOnLabelmap.forEach(segmentIndex => {\n if (segmentIndex !== 0) {\n referencedFramesPerSegment[segmentIndex].push(i);\n numberOfFrames++;\n }\n });\n }\n }\n\n referencedFramesPerLabelmap[labelmapIndex] = referencedFramesPerSegment;\n }\n\n segmentation.setNumberOfFrames(numberOfFrames);\n\n for (\n let labelmapIndex = 0;\n labelmapIndex < labelmaps3D.length;\n labelmapIndex++\n ) {\n const referencedFramesPerSegment =\n referencedFramesPerLabelmap[labelmapIndex];\n\n const labelmap3D = labelmaps3D[labelmapIndex];\n const { metadata } = labelmap3D;\n\n for (\n let segmentIndex = 1;\n segmentIndex < referencedFramesPerSegment.length;\n segmentIndex++\n ) {\n const referencedFrameIndicies =\n referencedFramesPerSegment[segmentIndex];\n\n if (referencedFrameIndicies) {\n // Frame numbers start from 1.\n const referencedFrameNumbers = referencedFrameIndicies.map(\n element => {\n return element + 1;\n }\n );\n const segmentMetadata = metadata[segmentIndex];\n const labelmaps = _getLabelmapsFromRefernecedFrameIndicies(\n labelmap3D,\n referencedFrameIndicies\n );\n\n segmentation.addSegmentFromLabelmap(\n segmentMetadata,\n labelmaps,\n segmentIndex,\n referencedFrameNumbers\n );\n }\n }\n }\n\n if (options.rleEncode) {\n const rleEncodedFrames = encode(\n segmentation.dataset.PixelData,\n numberOfFrames,\n segmentation.dataset.Rows,\n segmentation.dataset.Columns\n );\n\n // Must use fractional now to RLE encode, as the DICOM standard only allows BitStored && BitsAllocated\n // to be 1 for BINARY. This is not ideal and there should be a better format for compression in this manner\n // added to the standard.\n segmentation.assignToDataset({\n BitsAllocated: \"8\",\n BitsStored: \"8\",\n HighBit: \"7\",\n SegmentationType: \"FRACTIONAL\",\n SegmentationFractionalType: \"PROBABILITY\",\n MaximumFractionalValue: \"255\"\n });\n\n segmentation.dataset._meta.TransferSyntaxUID = {\n Value: [\"1.2.840.10008.1.2.5\"],\n vr: \"UI\"\n };\n segmentation.dataset._vrMap.PixelData = \"OB\";\n segmentation.dataset.PixelData = rleEncodedFrames;\n } else {\n // If no rleEncoding, at least bitpack the data.\n segmentation.bitPackPixelData();\n }\n\n const segBlob = datasetToBlob(segmentation.dataset);\n\n return segBlob;\n}\n\nfunction _getLabelmapsFromRefernecedFrameIndicies(\n labelmap3D,\n referencedFrameIndicies\n) {\n const { labelmaps2D } = labelmap3D;\n\n const labelmaps = [];\n\n for (let i = 0; i < referencedFrameIndicies.length; i++) {\n const frame = referencedFrameIndicies[i];\n\n labelmaps.push(labelmaps2D[frame].pixelData);\n }\n\n return labelmaps;\n}\n\n/**\n * _createSegFromImages - description\n *\n * @param {Object[]} images An array of the cornerstone image objects.\n * @param {Boolean} isMultiframe Whether the images are multiframe.\n * @returns {Object} The Seg derived dataSet.\n */\nfunction _createSegFromImages(images, isMultiframe, options) {\n const datasets = [];\n\n if (isMultiframe) {\n const image = images[0];\n const arrayBuffer = image.data.byteArray.buffer;\n\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n\n datasets.push(dataset);\n } else {\n for (let i = 0; i < images.length; i++) {\n const image = images[i];\n const arrayBuffer = image.data.byteArray.buffer;\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(\n dicomData.dict\n );\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n datasets.push(dataset);\n }\n }\n\n const multiframe = Normalizer.normalizeToDataset(datasets);\n\n return new SegmentationDerivation([multiframe], options);\n}\n\n/**\n * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,\n * derive cornerstoneTools toolState and brush metadata.\n *\n * @param {string[]} imageIds - An array of the imageIds.\n * @param {ArrayBuffer} arrayBuffer - The SEG arrayBuffer.\n * @param {*} metadataProvider.\n * @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.\n * @param {number} tolerance - default value 1.e-3.\n *\n * @return {[]ArrayBuffer}a list of array buffer for each labelMap\n * @return {Object} an object from which the segment metadata can be derived\n * @return {[][][]} 2D list containing the track of segments per frame\n * @return {[][][]} 3D list containing the track of segments per frame for each labelMap\n * (available only for the overlapping case).\n */\nfunction generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider,\n skipOverlapping = false,\n tolerance = 1e-3\n) {\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n const multiframe = Normalizer.normalizeToDataset([dataset]);\n\n const imagePlaneModule = metadataProvider.get(\n \"imagePlaneModule\",\n imageIds[0]\n );\n\n const generalSeriesModule = metadataProvider.get(\n \"generalSeriesModule\",\n imageIds[0]\n );\n\n const SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;\n\n let ImageOrientationPatient;\n let validOrientations;\n\n const hasCoordinateSystem = \"FrameOfReferenceUID\" in multiframe;\n if (hasCoordinateSystem) {\n if (!imagePlaneModule) {\n console.warn(\"Insufficient metadata, imagePlaneModule missing.\");\n }\n\n ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines)\n ? [\n ...imagePlaneModule.rowCosines,\n ...imagePlaneModule.columnCosines\n ]\n : [\n imagePlaneModule.rowCosines.x,\n imagePlaneModule.rowCosines.y,\n imagePlaneModule.rowCosines.z,\n imagePlaneModule.columnCosines.x,\n imagePlaneModule.columnCosines.y,\n imagePlaneModule.columnCosines.z\n ];\n\n // Get IOP from ref series, compute supported orientations:\n validOrientations = getValidOrientations(ImageOrientationPatient);\n }\n\n const sliceLength = multiframe.Columns * multiframe.Rows;\n const segMetadata = getSegmentMetadata(multiframe, SeriesInstanceUID);\n\n const TransferSyntaxUID = multiframe._meta.TransferSyntaxUID.Value[0];\n\n let pixelData;\n\n if (TransferSyntaxUID === \"1.2.840.10008.1.2.5\") {\n const rleEncodedFrames = Array.isArray(multiframe.PixelData)\n ? multiframe.PixelData\n : [multiframe.PixelData];\n\n pixelData = decode(\n rleEncodedFrames,\n multiframe.Rows,\n multiframe.Columns\n );\n\n if (multiframe.BitsStored === 1) {\n console.warn(\"No implementation for rle + bitbacking.\");\n\n return;\n }\n } else {\n pixelData = unpackPixelData(multiframe);\n\n if (!pixelData) {\n throw new Error(\"Fractional segmentations are not yet supported\");\n }\n }\n\n let orientation;\n if (hasCoordinateSystem) {\n orientation = checkOrientation(\n multiframe,\n validOrientations,\n [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length],\n tolerance\n );\n } else {\n orientation = \"Planar\";\n }\n\n let overlapping = false;\n if (!skipOverlapping) {\n overlapping = checkSEGsOverlapping(\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance\n );\n }\n\n let insertFunction;\n\n switch (orientation) {\n case \"Planar\":\n if (overlapping) {\n insertFunction = insertOverlappingPixelDataPlanar;\n } else {\n insertFunction = insertPixelDataPlanar;\n }\n break;\n case \"Perpendicular\":\n //insertFunction = insertPixelDataPerpendicular;\n throw new Error(\n \"Segmentations orthogonal to the acquisition plane of the source data are not yet supported.\"\n );\n case \"Oblique\":\n throw new Error(\n \"Segmentations oblique to the acquisition plane of the source data are not yet supported.\"\n );\n }\n\n /* if SEGs are overlapping:\n 1) the labelmapBuffer will contain M volumes which have non-overlapping segments;\n 2) segmentsOnFrame will have M * numberOfFrames values to track in which labelMap are the segments;\n 3) insertFunction will return the number of LabelMaps\n 4) generateToolState return is an array*/\n\n const segmentsOnFrameArray = [];\n segmentsOnFrameArray[0] = [];\n const segmentsOnFrame = [];\n\n const arrayBufferLength = sliceLength * imageIds.length * 2; // 2 bytes per label voxel in cst4.\n const labelmapBufferArray = [];\n labelmapBufferArray[0] = new ArrayBuffer(arrayBufferLength);\n\n insertFunction(\n segmentsOnFrame,\n segmentsOnFrameArray,\n labelmapBufferArray,\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance\n );\n\n return {\n labelmapBufferArray,\n segMetadata,\n segmentsOnFrame,\n segmentsOnFrameArray\n };\n}\n\n/**\n * Find the reference frame of the segmentation frame in the source data.\n *\n * @param {Object} multiframe dicom metadata\n * @param {Int} frameSegment frame dicom index\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} metadataProvider A Cornerstone metadataProvider to query\n * metadata from imageIds.\n * @param {Float} tolerance The tolerance parameter\n *\n * @returns {String} Returns the imageId\n */\nfunction findReferenceSourceImageId(\n multiframe,\n frameSegment,\n imageIds,\n metadataProvider,\n tolerance\n) {\n let imageId = undefined;\n\n if (!multiframe) {\n return imageId;\n }\n\n const {\n FrameOfReferenceUID,\n PerFrameFunctionalGroupsSequence,\n SourceImageSequence,\n ReferencedSeriesSequence\n } = multiframe;\n\n if (\n !PerFrameFunctionalGroupsSequence ||\n PerFrameFunctionalGroupsSequence.length === 0\n ) {\n return imageId;\n }\n\n const PerFrameFunctionalGroup =\n PerFrameFunctionalGroupsSequence[frameSegment];\n\n if (!PerFrameFunctionalGroup) {\n return imageId;\n }\n\n let frameSourceImageSequence = undefined;\n if (PerFrameFunctionalGroup.DerivationImageSequence) {\n let DerivationImageSequence =\n PerFrameFunctionalGroup.DerivationImageSequence;\n if (Array.isArray(DerivationImageSequence)) {\n if (DerivationImageSequence.length !== 0) {\n DerivationImageSequence = DerivationImageSequence[0];\n } else {\n DerivationImageSequence = undefined;\n }\n }\n\n if (DerivationImageSequence) {\n frameSourceImageSequence =\n DerivationImageSequence.SourceImageSequence;\n if (Array.isArray(frameSourceImageSequence)) {\n if (frameSourceImageSequence.length !== 0) {\n frameSourceImageSequence = frameSourceImageSequence[0];\n } else {\n frameSourceImageSequence = undefined;\n }\n }\n }\n } else if (SourceImageSequence && SourceImageSequence.length !== 0) {\n frameSourceImageSequence = SourceImageSequence[frameSegment];\n }\n\n if (frameSourceImageSequence) {\n imageId = getImageIdOfSourceImagebySourceImageSequence(\n frameSourceImageSequence,\n imageIds,\n metadataProvider\n );\n }\n\n if (imageId === undefined && ReferencedSeriesSequence) {\n const referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence)\n ? ReferencedSeriesSequence[0]\n : ReferencedSeriesSequence;\n const ReferencedSeriesInstanceUID =\n referencedSeriesSequence.SeriesInstanceUID;\n\n imageId = getImageIdOfSourceImagebyGeometry(\n ReferencedSeriesInstanceUID,\n FrameOfReferenceUID,\n PerFrameFunctionalGroup,\n imageIds,\n metadataProvider,\n tolerance\n );\n }\n\n return imageId;\n}\n\n/**\n * Checks if there is any overlapping segmentations.\n * @returns {boolean} Returns a flag if segmentations overlapping\n */\n\nfunction checkSEGsOverlapping(\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance\n) {\n const {\n SharedFunctionalGroupsSequence,\n PerFrameFunctionalGroupsSequence,\n SegmentSequence,\n Rows,\n Columns\n } = multiframe;\n\n let numberOfSegs = SegmentSequence.length;\n if (numberOfSegs < 2) {\n return false;\n }\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n const sliceLength = Columns * Rows;\n const groupsLen = PerFrameFunctionalGroupsSequence.length;\n\n /** sort groupsLen to have all the segments for each frame in an array\n * frame 2 : 1, 2\n * frame 4 : 1, 3\n * frame 5 : 4\n */\n\n let frameSegmentsMapping = new Map();\n for (let frameSegment = 0; frameSegment < groupsLen; ++frameSegment) {\n const segmentIndex = getSegmentIndex(multiframe, frameSegment);\n if (segmentIndex === undefined) {\n console.warn(\n \"Could not retrieve the segment index for frame segment \" +\n frameSegment +\n \", skipping this frame.\"\n );\n continue;\n }\n\n const imageId = findReferenceSourceImageId(\n multiframe,\n frameSegment,\n imageIds,\n metadataProvider,\n tolerance\n );\n\n if (!imageId) {\n console.warn(\n \"Image not present in stack, can't import frame : \" +\n frameSegment +\n \".\"\n );\n continue;\n }\n\n const imageIdIndex = imageIds.findIndex(element => element === imageId);\n\n if (frameSegmentsMapping.has(imageIdIndex)) {\n let segmentArray = frameSegmentsMapping.get(imageIdIndex);\n if (!segmentArray.includes(frameSegment)) {\n segmentArray.push(frameSegment);\n frameSegmentsMapping.set(imageIdIndex, segmentArray);\n }\n } else {\n frameSegmentsMapping.set(imageIdIndex, [frameSegment]);\n }\n }\n\n for (let [, role] of frameSegmentsMapping.entries()) {\n let temp2DArray = new Uint16Array(sliceLength).fill(0);\n\n for (let i = 0; i < role.length; ++i) {\n const frameSegment = role[i];\n\n const PerFrameFunctionalGroups =\n PerFrameFunctionalGroupsSequence[frameSegment];\n\n const pixelDataI2D = ndarray(\n new Uint8Array(\n pixelData.buffer,\n frameSegment * sliceLength,\n sliceLength\n ),\n [Rows, Columns]\n );\n\n let alignedPixelDataI;\n\n const hasCoordinateSystem = \"FrameOfReferenceUID\" in multiframe;\n if (hasCoordinateSystem) {\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations,\n tolerance\n );\n } else {\n alignedPixelDataI = pixelDataI2D;\n }\n\n if (!alignedPixelDataI) {\n console.warn(\n \"Individual SEG frames are out of plane with respect to the first SEG frame, this is not yet supported, skipping this frame.\"\n );\n continue;\n }\n\n const data = alignedPixelDataI.data;\n for (let j = 0, len = data.length; j < len; ++j) {\n if (data[j] !== 0) {\n temp2DArray[j]++;\n if (temp2DArray[j] > 1) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n}\n\nfunction insertOverlappingPixelDataPlanar(\n segmentsOnFrame,\n segmentsOnFrameArray,\n labelmapBufferArray,\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance\n) {\n const {\n SharedFunctionalGroupsSequence,\n PerFrameFunctionalGroupsSequence,\n Rows,\n Columns\n } = multiframe;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n const sliceLength = Columns * Rows;\n const arrayBufferLength = sliceLength * imageIds.length * 2; // 2 bytes per label voxel in cst4.\n\n // indicate the number of labelMaps\n let M = 1;\n\n // indicate the current labelMap array index;\n let m = 0;\n\n // temp array for checking overlaps\n let tempBuffer = labelmapBufferArray[m].slice(0);\n\n // temp list for checking overlaps\n let tempSegmentsOnFrame = cloneDeep(segmentsOnFrameArray[m]);\n\n /** split overlapping SEGs algorithm for each segment:\n * A) copy the labelmapBuffer in the array with index 0\n * B) add the segment pixel per pixel on the copied buffer from (A)\n * C) if no overlap, copy the results back on the orignal array from (A)\n * D) if overlap, repeat increasing the index m up to M (if out of memory, add new buffer in the array and M++);\n */\n\n let numberOfSegs = multiframe.SegmentSequence.length;\n for (\n let segmentIndexToProcess = 1;\n segmentIndexToProcess <= numberOfSegs;\n ++segmentIndexToProcess\n ) {\n for (\n let i = 0, groupsLen = PerFrameFunctionalGroupsSequence.length;\n i < groupsLen;\n ++i\n ) {\n const PerFrameFunctionalGroups =\n PerFrameFunctionalGroupsSequence[i];\n\n const segmentIndex = getSegmentIndex(multiframe, i);\n if (segmentIndex === undefined) {\n throw new Error(\n \"Could not retrieve the segment index. Aborting segmentation loading.\"\n );\n }\n\n if (segmentIndex !== segmentIndexToProcess) {\n continue;\n }\n\n const pixelDataI2D = ndarray(\n new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength),\n [Rows, Columns]\n );\n\n let alignedPixelDataI;\n\n const hasCoordinateSystem = \"FrameOfReferenceUID\" in multiframe;\n if (hasCoordinateSystem) {\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations,\n tolerance\n );\n } else {\n alignedPixelDataI = pixelDataI2D;\n }\n\n if (!alignedPixelDataI) {\n throw new Error(\n \"Individual SEG frames are out of plane with respect to the first SEG frame. \" +\n \"This is not yet supported. Aborting segmentation loading.\"\n );\n }\n\n const imageId = findReferenceSourceImageId(\n multiframe,\n i,\n imageIds,\n metadataProvider,\n tolerance\n );\n\n if (!imageId) {\n console.warn(\n \"Image not present in stack, can't import frame : \" +\n i +\n \".\"\n );\n continue;\n }\n\n const sourceImageMetadata = metadataProvider.get(\n \"imagePixelModule\",\n imageId\n );\n if (\n Rows !== sourceImageMetadata.rows ||\n Columns !== sourceImageMetadata.columns\n ) {\n throw new Error(\n \"Individual SEG frames have different geometry dimensions (Rows and Columns) \" +\n \"respect to the source image reference frame. This is not yet supported. \" +\n \"Aborting segmentation loading. \"\n );\n }\n\n const imageIdIndex = imageIds.findIndex(\n element => element === imageId\n );\n const byteOffset = sliceLength * 2 * imageIdIndex; // 2 bytes/pixel\n\n const labelmap2DView = new Uint16Array(\n tempBuffer,\n byteOffset,\n sliceLength\n );\n\n const data = alignedPixelDataI.data;\n\n let segmentOnFrame = false;\n for (let j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {\n if (data[j]) {\n if (labelmap2DView[j] !== 0) {\n m++;\n if (m >= M) {\n labelmapBufferArray[m] = new ArrayBuffer(\n arrayBufferLength\n );\n segmentsOnFrameArray[m] = [];\n M++;\n }\n tempBuffer = labelmapBufferArray[m].slice(0);\n tempSegmentsOnFrame = cloneDeep(\n segmentsOnFrameArray[m]\n );\n\n i = 0;\n break;\n } else {\n labelmap2DView[j] = segmentIndex;\n segmentOnFrame = true;\n }\n }\n }\n\n if (segmentOnFrame) {\n if (!tempSegmentsOnFrame[imageIdIndex]) {\n tempSegmentsOnFrame[imageIdIndex] = [];\n }\n\n tempSegmentsOnFrame[imageIdIndex].push(segmentIndex);\n\n if (!segmentsOnFrame[imageIdIndex]) {\n segmentsOnFrame[imageIdIndex] = [];\n }\n\n segmentsOnFrame[imageIdIndex].push(segmentIndex);\n }\n }\n\n labelmapBufferArray[m] = tempBuffer.slice(0);\n segmentsOnFrameArray[m] = cloneDeep(tempSegmentsOnFrame);\n\n // reset temp variables/buffers for new segment\n m = 0;\n tempBuffer = labelmapBufferArray[m].slice(0);\n tempSegmentsOnFrame = cloneDeep(segmentsOnFrameArray[m]);\n }\n}\n\nconst getSegmentIndex = (multiframe, frame) => {\n const { PerFrameFunctionalGroupsSequence, SharedFunctionalGroupsSequence } =\n multiframe;\n const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[frame];\n return PerFrameFunctionalGroups &&\n PerFrameFunctionalGroups.SegmentIdentificationSequence\n ? PerFrameFunctionalGroups.SegmentIdentificationSequence\n .ReferencedSegmentNumber\n : SharedFunctionalGroupsSequence.SegmentIdentificationSequence\n ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence\n .ReferencedSegmentNumber\n : undefined;\n};\n\nfunction insertPixelDataPlanar(\n segmentsOnFrame,\n segmentsOnFrameArray,\n labelmapBufferArray,\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance\n) {\n const {\n SharedFunctionalGroupsSequence,\n PerFrameFunctionalGroupsSequence,\n Rows,\n Columns\n } = multiframe;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n const sliceLength = Columns * Rows;\n\n for (\n let i = 0, groupsLen = PerFrameFunctionalGroupsSequence.length;\n i < groupsLen;\n ++i\n ) {\n const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];\n\n const pixelDataI2D = ndarray(\n new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength),\n [Rows, Columns]\n );\n\n let alignedPixelDataI;\n\n const hasCoordinateSystem = \"FrameOfReferenceUID\" in multiframe;\n if (hasCoordinateSystem) {\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations,\n tolerance\n );\n } else {\n alignedPixelDataI = pixelDataI2D;\n }\n\n if (!alignedPixelDataI) {\n throw new Error(\n \"Individual SEG frames are out of plane with respect to the first SEG frame. \" +\n \"This is not yet supported. Aborting segmentation loading.\"\n );\n }\n\n const segmentIndex = getSegmentIndex(multiframe, i);\n if (segmentIndex === undefined) {\n throw new Error(\n \"Could not retrieve the segment index. Aborting segmentation loading.\"\n );\n }\n\n const imageId = findReferenceSourceImageId(\n multiframe,\n i,\n imageIds,\n metadataProvider,\n tolerance\n );\n\n if (!imageId) {\n console.warn(\n \"Image not present in stack, can't import frame : \" + i + \".\"\n );\n continue;\n }\n\n const sourceImageMetadata = metadataProvider.get(\n \"imagePixelModule\",\n imageId\n );\n if (\n Rows !== sourceImageMetadata.rows ||\n Columns !== sourceImageMetadata.columns\n ) {\n throw new Error(\n \"Individual SEG frames have different geometry dimensions (Rows and Columns) \" +\n \"respect to the source image reference frame. This is not yet supported. \" +\n \"Aborting segmentation loading. \"\n );\n }\n\n const imageIdIndex = imageIds.findIndex(element => element === imageId);\n const byteOffset = sliceLength * 2 * imageIdIndex; // 2 bytes/pixel\n\n const labelmap2DView = new Uint16Array(\n labelmapBufferArray[0],\n byteOffset,\n sliceLength\n );\n\n const data = alignedPixelDataI.data;\n for (let j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {\n if (data[j]) {\n for (let x = j; x < len; ++x) {\n if (data[x]) {\n labelmap2DView[x] = segmentIndex;\n }\n }\n\n if (!segmentsOnFrame[imageIdIndex]) {\n segmentsOnFrame[imageIdIndex] = [];\n }\n\n segmentsOnFrame[imageIdIndex].push(segmentIndex);\n\n break;\n }\n }\n }\n}\n\nfunction checkOrientation(\n multiframe,\n validOrientations,\n sourceDataDimensions,\n tolerance\n) {\n const { SharedFunctionalGroupsSequence, PerFrameFunctionalGroupsSequence } =\n multiframe;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n\n // Check if in plane.\n const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];\n\n const iop =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n const inPlane = validOrientations.some(operation =>\n compareArrays(iop, operation, tolerance)\n );\n\n if (inPlane) {\n return \"Planar\";\n }\n\n if (\n checkIfPerpendicular(iop, validOrientations[0], tolerance) &&\n sourceDataDimensions.includes(multiframe.Rows) &&\n sourceDataDimensions.includes(multiframe.Columns)\n ) {\n // Perpendicular and fits on same grid.\n return \"Perpendicular\";\n }\n\n return \"Oblique\";\n}\n\n/**\n * checkIfPerpendicular - Returns true if iop1 and iop2 are perpendicular\n * within a tolerance.\n *\n * @param {Number[6]} iop1 An ImageOrientationPatient array.\n * @param {Number[6]} iop2 An ImageOrientationPatient array.\n * @param {Number} tolerance.\n * @return {Boolean} True if iop1 and iop2 are equal.\n */\nfunction checkIfPerpendicular(iop1, iop2, tolerance) {\n const absDotColumnCosines = Math.abs(\n iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]\n );\n const absDotRowCosines = Math.abs(\n iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]\n );\n\n return (\n (absDotColumnCosines < tolerance ||\n Math.abs(absDotColumnCosines - 1) < tolerance) &&\n (absDotRowCosines < tolerance ||\n Math.abs(absDotRowCosines - 1) < tolerance)\n );\n}\n\n/**\n * unpackPixelData - Unpacks bitpacked pixelData if the Segmentation is BINARY.\n *\n * @param {Object} multiframe The multiframe dataset.\n * @return {Uint8Array} The unpacked pixelData.\n */\nfunction unpackPixelData(multiframe) {\n const segType = multiframe.SegmentationType;\n\n let data;\n if (Array.isArray(multiframe.PixelData)) {\n data = multiframe.PixelData[0];\n } else {\n data = multiframe.PixelData;\n }\n\n if (data === undefined) {\n log.error(\"This segmentation pixeldata is undefined.\");\n }\n\n if (segType === \"BINARY\") {\n return BitArray.unpack(data);\n }\n\n const pixelData = new Uint8Array(data);\n\n const max = multiframe.MaximumFractionalValue;\n const onlyMaxAndZero =\n pixelData.find(element => element !== 0 && element !== max) ===\n undefined;\n\n if (!onlyMaxAndZero) {\n // This is a fractional segmentation, which is not currently supported.\n return;\n }\n\n log.warn(\n \"This segmentation object is actually binary... processing as such.\"\n );\n\n return pixelData;\n}\n\n/**\n * getImageIdOfSourceImagebySourceImageSequence - Returns the Cornerstone imageId of the source image.\n *\n * @param {Object} SourceImageSequence Sequence describing the source image.\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} metadataProvider A Cornerstone metadataProvider to query\n * metadata from imageIds.\n * @return {String} The corresponding imageId.\n */\nfunction getImageIdOfSourceImagebySourceImageSequence(\n SourceImageSequence,\n imageIds,\n metadataProvider\n) {\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n SourceImageSequence;\n\n return ReferencedFrameNumber\n ? getImageIdOfReferencedFrame(\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber,\n imageIds,\n metadataProvider\n )\n : getImageIdOfReferencedSingleFramedSOPInstance(\n ReferencedSOPInstanceUID,\n imageIds,\n metadataProvider\n );\n}\n\n/**\n * getImageIdOfSourceImagebyGeometry - Returns the Cornerstone imageId of the source image.\n *\n * @param {String} ReferencedSeriesInstanceUID Referenced series of the source image.\n * @param {String} FrameOfReferenceUID Frame of reference.\n * @param {Object} PerFrameFunctionalGroup Sequence describing segmentation reference attributes per frame.\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} metadataProvider A Cornerstone metadataProvider to query\n * @param {Float} tolerance The tolerance parameter\n *\n * @return {String} The corresponding imageId.\n */\nfunction getImageIdOfSourceImagebyGeometry(\n ReferencedSeriesInstanceUID,\n FrameOfReferenceUID,\n PerFrameFunctionalGroup,\n imageIds,\n metadataProvider,\n tolerance\n) {\n if (\n ReferencedSeriesInstanceUID === undefined ||\n PerFrameFunctionalGroup.PlanePositionSequence === undefined ||\n PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined ||\n PerFrameFunctionalGroup.PlanePositionSequence[0]\n .ImagePositionPatient === undefined\n ) {\n return undefined;\n }\n\n for (\n let imageIdsIndexc = 0;\n imageIdsIndexc < imageIds.length;\n ++imageIdsIndexc\n ) {\n const sourceImageMetadata = metadataProvider.get(\n \"instance\",\n imageIds[imageIdsIndexc]\n );\n\n if (\n sourceImageMetadata === undefined ||\n sourceImageMetadata.ImagePositionPatient === undefined ||\n sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID ||\n sourceImageMetadata.SeriesInstanceUID !==\n ReferencedSeriesInstanceUID\n ) {\n continue;\n }\n\n if (\n compareArrays(\n PerFrameFunctionalGroup.PlanePositionSequence[0]\n .ImagePositionPatient,\n sourceImageMetadata.ImagePositionPatient,\n tolerance\n )\n ) {\n return imageIds[imageIdsIndexc];\n }\n }\n}\n\n/**\n * getImageIdOfReferencedSingleFramedSOPInstance - Returns the imageId\n * corresponding to the specified sopInstanceUid for single-frame images.\n *\n * @param {String} sopInstanceUid The sopInstanceUid of the desired image.\n * @param {String[]} imageIds The list of imageIds.\n * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids\n * from the cornerstone imageIds.\n * @return {String} The imageId that corresponds to the sopInstanceUid.\n */\nfunction getImageIdOfReferencedSingleFramedSOPInstance(\n sopInstanceUid,\n imageIds,\n metadataProvider\n) {\n return imageIds.find(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n if (!sopCommonModule) {\n return;\n }\n\n return sopCommonModule.sopInstanceUID === sopInstanceUid;\n });\n}\n\n/**\n * getImageIdOfReferencedFrame - Returns the imageId corresponding to the\n * specified sopInstanceUid and frameNumber for multi-frame images.\n *\n * @param {String} sopInstanceUid The sopInstanceUid of the desired image.\n * @param {Number} frameNumber The frame number.\n * @param {String} imageIds The list of imageIds.\n * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids\n * from the cornerstone imageIds.\n * @return {String} The imageId that corresponds to the sopInstanceUid.\n */\nfunction getImageIdOfReferencedFrame(\n sopInstanceUid,\n frameNumber,\n imageIds,\n metadataProvider\n) {\n const imageId = imageIds.find(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n if (!sopCommonModule) {\n return;\n }\n\n const imageIdFrameNumber = Number(imageId.split(\"frame=\")[1]);\n\n return (\n //frameNumber is zero indexed for cornerstoneWADOImageLoader image Ids.\n sopCommonModule.sopInstanceUID === sopInstanceUid &&\n imageIdFrameNumber === frameNumber - 1\n );\n });\n\n return imageId;\n}\n\n/**\n * getValidOrientations - returns an array of valid orientations.\n *\n * @param {Number[6]} iop The row (0..2) an column (3..5) direction cosines.\n * @return {Number[8][6]} An array of valid orientations.\n */\nfunction getValidOrientations(iop) {\n const orientations = [];\n\n // [0, 1, 2]: 0, 0hf, 0vf\n // [3, 4, 5]: 90, 90hf, 90vf\n // [6, 7]: 180, 270\n\n orientations[0] = iop;\n orientations[1] = flipIOP.h(iop);\n orientations[2] = flipIOP.v(iop);\n\n const iop90 = rotateDirectionCosinesInPlane(iop, Math.PI / 2);\n\n orientations[3] = iop90;\n orientations[4] = flipIOP.h(iop90);\n orientations[5] = flipIOP.v(iop90);\n\n orientations[6] = rotateDirectionCosinesInPlane(iop, Math.PI);\n orientations[7] = rotateDirectionCosinesInPlane(iop, 1.5 * Math.PI);\n\n return orientations;\n}\n\n/**\n * alignPixelDataWithSourceData -\n *\n * @param {Ndarray} pixelData2D - The data to align.\n * @param {Number[6]} iop - The orientation of the image slice.\n * @param {Number[8][6]} orientations - An array of valid imageOrientationPatient values.\n * @param {Number} tolerance.\n * @return {Ndarray} The aligned pixelData.\n */\nfunction alignPixelDataWithSourceData(\n pixelData2D,\n iop,\n orientations,\n tolerance\n) {\n if (compareArrays(iop, orientations[0], tolerance)) {\n return pixelData2D;\n } else if (compareArrays(iop, orientations[1], tolerance)) {\n // Flipped vertically.\n\n // Undo Flip\n return flipMatrix2D.v(pixelData2D);\n } else if (compareArrays(iop, orientations[2], tolerance)) {\n // Flipped horizontally.\n\n // Unfo flip\n return flipMatrix2D.h(pixelData2D);\n } else if (compareArrays(iop, orientations[3], tolerance)) {\n //Rotated 90 degrees\n\n // Rotate back\n return rotateMatrix902D(pixelData2D);\n } else if (compareArrays(iop, orientations[4], tolerance)) {\n //Rotated 90 degrees and fliped horizontally.\n\n // Undo flip and rotate back.\n return rotateMatrix902D(flipMatrix2D.h(pixelData2D));\n } else if (compareArrays(iop, orientations[5], tolerance)) {\n // Rotated 90 degrees and fliped vertically\n\n // Unfo flip and rotate back.\n return rotateMatrix902D(flipMatrix2D.v(pixelData2D));\n } else if (compareArrays(iop, orientations[6], tolerance)) {\n // Rotated 180 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.\n\n return rotateMatrix902D(rotateMatrix902D(pixelData2D));\n } else if (compareArrays(iop, orientations[7], tolerance)) {\n // Rotated 270 degrees\n\n // Rotate back.\n return rotateMatrix902D(\n rotateMatrix902D(rotateMatrix902D(pixelData2D))\n );\n }\n}\n\n/**\n * compareArrays - Returns true if array1 and array2 are equal\n * within a tolerance.\n *\n * @param {Number[]} array1 - An array.\n * @param {Number[]} array2 - An array.\n * @param {Number} tolerance.\n * @return {Boolean} True if array1 and array2 are equal.\n */\nfunction compareArrays(array1, array2, tolerance) {\n if (array1.length != array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; ++i) {\n if (!nearlyEqual(array1[i], array2[i], tolerance)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction getSegmentMetadata(multiframe, seriesInstanceUid) {\n const segmentSequence = multiframe.SegmentSequence;\n let data = [];\n\n if (Array.isArray(segmentSequence)) {\n data = [undefined, ...segmentSequence];\n } else {\n // Only one segment, will be stored as an object.\n data = [undefined, segmentSequence];\n }\n\n return {\n seriesInstanceUid,\n data\n };\n}\n","import Segmentation_3X from \"./Segmentation_3X\";\nimport Segmentation_4X from \"./Segmentation_4X\";\n\nconst Segmentation = {\n generateSegmentation,\n generateToolState,\n fillSegmentation\n};\n\nexport default Segmentation;\n\n/**\n * generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.\n *\n * @param {object[]} images An array of the cornerstone image objects.\n * @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.\n * For 3.X: the BrushData.\n * @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.\n * @returns {Object}\n */\nfunction generateSegmentation(\n images,\n labelmaps3DorBrushData,\n options = { includeSliceSpacing: true },\n cornerstoneToolsVersion = 4\n) {\n if (cornerstoneToolsVersion === 4) {\n return Segmentation_4X.generateSegmentation(\n images,\n labelmaps3DorBrushData,\n options\n );\n }\n\n if (cornerstoneToolsVersion === 3) {\n return Segmentation_3X.generateSegmentation(\n images,\n labelmaps3DorBrushData,\n options\n );\n }\n\n console.warn(\n `No generateSegmentation adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.`\n );\n}\n\n/**\n * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,\n * derive cornerstoneTools toolState and brush metadata.\n *\n * @param {string[]} imageIds An array of the imageIds.\n * @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.\n * @param {*} metadataProvider\n * @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.\n * @param {number} tolerance - default value 1.e-3.\n * @param {number} cornerstoneToolsVersion - default value 4.\n *\n * @returns {Object} The toolState and an object from which the\n * segment metadata can be derived.\n */\nfunction generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider,\n skipOverlapping = false,\n tolerance = 1e-3,\n cornerstoneToolsVersion = 4\n) {\n if (cornerstoneToolsVersion === 4) {\n return Segmentation_4X.generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider,\n skipOverlapping,\n tolerance\n );\n }\n\n if (cornerstoneToolsVersion === 3) {\n return Segmentation_3X.generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider\n );\n }\n\n console.warn(\n `No generateToolState adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.`\n );\n}\n\n/**\n * fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.\n *\n * @param {object[]} segmentation An empty segmentation derived dataset.\n * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.\n * @param {Object} userOptions Options object to override default options.\n * @returns {Blob} description\n */\nfunction fillSegmentation(\n segmentation,\n inputLabelmaps3D,\n options = { includeSliceSpacing: true },\n cornerstoneToolsVersion = 4\n) {\n if (cornerstoneToolsVersion === 4) {\n return Segmentation_4X.fillSegmentation(\n segmentation,\n inputLabelmaps3D,\n options\n );\n }\n\n console.warn(\n `No generateSegmentation adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.`\n );\n}\n","import OpenPolyline from \"./OpenPolyline.js\";\n\nexport default class CobbAngle extends OpenPolyline {\n getPoints() {\n const { point1, point2, point3, point4 } = this.props;\n return [point1, point2, point3, point4];\n }\n\n getConceptNameCodeSequence() {\n return {\n CodeValue: \"285285000\",\n CodingSchemeDesignator: \"SCT\",\n CodeMeaning: \"Cobb angle\"\n };\n }\n\n getMeasuredValueSequence() {\n const { rAngle } = this.props;\n return {\n MeasurementUnitsCodeSequence: {\n CodeValue: \"deg\",\n CodingSchemeDesignator: \"UCUM\",\n CodingSchemeVersion: \"1.4\",\n CodeMeaning: \"\\u00B0\"\n },\n NumericValue: rAngle\n };\n }\n}\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300CobbAngle from \"../../utilities/TID300/CobbAngle.js\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst COBB_ANGLE = \"CobbAngle\";\n\nclass CobbAngle {\n constructor() {}\n\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n rAngle: NUMGroup.MeasuredValueSequence.NumericValue,\n toolType: CobbAngle.toolType,\n handles: {\n start: {},\n end: {},\n start2: {\n highlight: true,\n drawnIndependently: true\n },\n end2: {\n highlight: true,\n drawnIndependently: true\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n [\n state.handles.start.x,\n state.handles.start.y,\n state.handles.end.x,\n state.handles.end.y,\n state.handles.start2.x,\n state.handles.start2.y,\n state.handles.end2.x,\n state.handles.end2.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites } = tool;\n const point1 = handles.start;\n const point2 = handles.end;\n const point3 = handles.start2;\n const point4 = handles.end2;\n const rAngle = tool.rAngle;\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:CobbAngle\";\n\n return {\n point1,\n point2,\n point3,\n point4,\n rAngle,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nCobbAngle.toolType = COBB_ANGLE;\nCobbAngle.utilityToolType = COBB_ANGLE;\nCobbAngle.TID300Representation = TID300CobbAngle;\nCobbAngle.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === COBB_ANGLE;\n};\n\nMeasurementReport.registerTool(CobbAngle);\n\nexport default CobbAngle;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300CobbAngle from \"../../utilities/TID300/CobbAngle.js\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst ANGLE = \"Angle\";\n\nclass Angle {\n constructor() {}\n\n /**\n * Generate TID300 measurement data for a plane angle measurement - use a CobbAngle, but label it as Angle\n * @param MeasurementGroup\n * @returns\n */\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n rAngle: NUMGroup.MeasuredValueSequence.NumericValue,\n toolType: Angle.toolType,\n handles: {\n start: {},\n middle: {},\n end: {},\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n [\n state.handles.start.x,\n state.handles.start.y,\n state.handles.middle.x,\n state.handles.middle.y,\n state.handles.middle.x,\n state.handles.middle.y,\n state.handles.end.x,\n state.handles.end.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites } = tool;\n const point1 = handles.start;\n const point2 = handles.middle;\n const point3 = handles.middle;\n const point4 = handles.end;\n const rAngle = tool.rAngle;\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:Angle\";\n\n return {\n point1,\n point2,\n point3,\n point4,\n rAngle,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nAngle.toolType = ANGLE;\nAngle.utilityToolType = ANGLE;\nAngle.TID300Representation = TID300CobbAngle;\nAngle.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === ANGLE;\n};\n\nMeasurementReport.registerTool(Angle);\n\nexport default Angle;\n","import MeasurementReport from \"./MeasurementReport\";\nimport TID300Polyline from \"../../utilities/TID300/Polyline\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nclass RectangleRoi {\n constructor() {}\n\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, SCOORDGroup, NUMGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n toolType: RectangleRoi.toolType,\n handles: {\n start: {},\n end: {},\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n },\n initialRotation: 0\n },\n cachedStats: {\n area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0\n },\n color: undefined,\n invalidated: true\n };\n const intermediate = {};\n\n [\n state.handles.start.x,\n state.handles.start.y,\n intermediate.x,\n intermediate.y,\n state.handles.end.x,\n state.handles.end.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { finding, findingSites, cachedStats = {}, handles } = tool;\n console.log(\"getTID300 Rectangle\", tool, cachedStats, handles);\n const { start, end } = handles;\n const points = [\n start,\n { x: start.x, y: end.y },\n end,\n { x: end.x, y: start.y }\n ];\n const { area, perimeter } = cachedStats;\n\n console.log(\"Point=\", points, \"cachedStats=\", cachedStats);\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:RectangleRoi\";\n\n return {\n points,\n area,\n perimeter,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nRectangleRoi.toolType = \"RectangleRoi\";\nRectangleRoi.utilityToolType = \"RectangleRoi\";\nRectangleRoi.TID300Representation = TID300Polyline;\nRectangleRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === RectangleRoi.toolType;\n};\n\nMeasurementReport.registerTool(RectangleRoi);\n\nexport default RectangleRoi;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport Length from \"./Length.js\";\nimport FreehandRoi from \"./FreehandRoi.js\";\nimport Bidirectional from \"./Bidirectional.js\";\nimport EllipticalRoi from \"./EllipticalRoi.js\";\nimport CircleRoi from \"./CircleRoi.js\";\nimport ArrowAnnotate from \"./ArrowAnnotate.js\";\nimport Segmentation from \"./Segmentation.js\";\nimport CobbAngle from \"./CobbAngle\";\nimport Angle from \"./Angle\";\nimport RectangleRoi from \"./RectangleRoi\";\n\nconst Cornerstone = {\n Length,\n FreehandRoi,\n Bidirectional,\n EllipticalRoi,\n CircleRoi,\n ArrowAnnotate,\n MeasurementReport,\n Segmentation,\n CobbAngle,\n Angle,\n RectangleRoi\n};\n\nexport default Cornerstone;\n","// This is a custom coding scheme defined to store some annotations from Cornerstone.\n// Note: CodeMeaning is VR type LO, which means we only actually support 64 characters\n// here this is fine for most labels, but may be problematic at some point.\n// CodeValue must be ≤ 16 characters (SH VR constraint)\nconst FREE_TEXT_CODE_VALUE = \"CS3DTEXT\";\n\n// Private coding scheme designator for dcmjs\nconst CodingSchemeDesignator = \"99dcmjs\";\n\n// Legacy code value for backward compatibility (deprecated, exceeds SH VR limit)\nconst CORNERSTONEFREETEXT = \"CORNERSTONEFREETEXT\";\n\nconst CodingScheme = {\n CodingSchemeDesignator,\n codeValues: {\n FREE_TEXT_CODE_VALUE: FREE_TEXT_CODE_VALUE,\n // Legacy support - kept for reading old files\n CORNERSTONEFREETEXT\n }\n};\n\nexport default CodingScheme;\n","import CodingScheme from \"./CodingScheme\";\n\n/**\n * Checks if the given code value is the free text annotation code value\n * @param {string} codeValue - The code value to check\n * @returns {boolean} True if the code value matches the free text annotation code (CS3DTEXT)\n */\nconst isFreeTextCodeValue = codeValue => {\n return codeValue === CodingScheme.FREE_TEXT_CODE_VALUE;\n};\n\n/**\n * Checks if the given code value is the legacy free text code value\n *\n * NOTE:\n * This is kept only for backward compatibility when reading old DICOM SRs.\n * New SRs must NOT use this legacy code value.\n *\n * @param {string} codeValue - The code value to check\n * @returns {boolean} True if the code value matches the legacy free text code (CORNERSTONEFREETEXT)\n */\nconst isLegacyFreeTextCodeValue = codeValue => {\n return codeValue === CodingScheme.CORNERSTONEFREETEXT;\n};\n\nexport { isFreeTextCodeValue, isLegacyFreeTextCodeValue };\n","import { Normalizer } from \"../../normalizers.js\";\nimport { DicomMetaDictionary } from \"../../DicomMetaDictionary.js\";\nimport { StructuredReport } from \"../../derivations/index.js\";\nimport TID1500MeasurementReport from \"../../utilities/TID1500/TID1500MeasurementReport.js\";\nimport TID1501MeasurementGroup from \"../../utilities/TID1500/TID1501MeasurementGroup.js\";\nimport addAccessors from \"../../utilities/addAccessors.js\";\nimport {\n isFreeTextCodeValue,\n isLegacyFreeTextCodeValue\n} from \"./freeTextCodeChecks.js\";\nimport { toArray, codeMeaningEquals } from \"../helpers.js\";\n\nconst FINDING = { CodingSchemeDesignator: \"DCM\", CodeValue: \"121071\" };\nconst FINDING_SITE = { CodingSchemeDesignator: \"SCT\", CodeValue: \"363698007\" };\nconst FINDING_SITE_OLD = { CodingSchemeDesignator: \"SRT\", CodeValue: \"G-C0E3\" };\n\nconst codeValueMatch = (group, code, oldCode) => {\n const { ConceptNameCodeSequence } = group;\n if (!ConceptNameCodeSequence) return;\n const { CodingSchemeDesignator, CodeValue } = ConceptNameCodeSequence;\n return (\n (CodingSchemeDesignator == code.CodingSchemeDesignator &&\n CodeValue == code.CodeValue) ||\n (oldCode &&\n CodingSchemeDesignator == oldCode.CodingSchemeDesignator &&\n CodeValue == oldCode.CodeValue)\n );\n};\n\nfunction getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass,\n worldToImageCoords\n) {\n const args = toolClass.getTID300RepresentationArguments(\n tool,\n worldToImageCoords\n );\n args.ReferencedSOPSequence = ReferencedSOPSequence;\n\n const TID300Measurement = new toolClass.TID300Representation(args);\n\n return TID300Measurement;\n}\n\nfunction getMeasurementGroup(\n toolType,\n toolData,\n ReferencedSOPSequence,\n worldToImageCoords\n) {\n const toolTypeData = toolData[toolType];\n const toolClass =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType];\n if (\n !toolTypeData ||\n !toolTypeData.data ||\n !toolTypeData.data.length ||\n !toolClass\n ) {\n return;\n }\n\n // Loop through the array of tool instances\n // for this tool\n const Measurements = toolTypeData.data.map(tool => {\n return getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass,\n worldToImageCoords\n );\n });\n\n return new TID1501MeasurementGroup(Measurements);\n}\n\nexport default class MeasurementReport {\n constructor() {}\n\n static getCornerstoneLabelFromDefaultState(defaultState) {\n const { findingSites = [], finding } = defaultState;\n\n // Check finding sites for new or legacy free text annotation codes\n let freeTextLabel = findingSites.find(\n fs =>\n isFreeTextCodeValue(fs.CodeValue) ||\n isLegacyFreeTextCodeValue(fs.CodeValue)\n );\n\n if (freeTextLabel) {\n return freeTextLabel.CodeMeaning;\n }\n\n // Check finding for new or legacy free text annotation codes\n if (\n finding &&\n (isFreeTextCodeValue(finding.CodeValue) ||\n isLegacyFreeTextCodeValue(finding.CodeValue))\n ) {\n return finding.CodeMeaning;\n }\n }\n\n static generateDatasetMeta() {\n // TODO: what is the correct metaheader\n // http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html\n // TODO: move meta creation to happen in derivations.js\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n const _meta = {\n FileMetaInformationVersion: {\n Value: [fileMetaInformationVersionArray.buffer],\n vr: \"OB\"\n },\n //MediaStorageSOPClassUID\n //MediaStorageSOPInstanceUID: sopCommonModule.sopInstanceUID,\n TransferSyntaxUID: {\n Value: [\"1.2.840.10008.1.2.1\"],\n vr: \"UI\"\n },\n ImplementationClassUID: {\n Value: [DicomMetaDictionary.uid()], // TODO: could be git hash or other valid id\n vr: \"UI\"\n },\n ImplementationVersionName: {\n Value: [\"dcmjs\"],\n vr: \"SH\"\n }\n };\n\n return _meta;\n }\n\n static generateDerivationSourceDataset(\n StudyInstanceUID,\n SeriesInstanceUID\n ) {\n const _vrMap = {\n PixelData: \"OW\"\n };\n\n const _meta = MeasurementReport.generateDatasetMeta();\n\n const derivationSourceDataset = {\n StudyInstanceUID,\n SeriesInstanceUID,\n _meta: _meta,\n _vrMap: _vrMap\n };\n\n return derivationSourceDataset;\n }\n\n static getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n toolType\n ) {\n const { ContentSequence } = MeasurementGroup;\n\n const contentSequenceArr = toArray(ContentSequence);\n const findingGroup = contentSequenceArr.find(group =>\n codeValueMatch(group, FINDING)\n );\n const findingSiteGroups =\n contentSequenceArr.filter(group =>\n codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)\n ) || [];\n const NUMGroup = contentSequenceArr.find(\n group => group.ValueType === \"NUM\"\n );\n const SCOORDGroup = toArray(NUMGroup.ContentSequence).find(\n group => group.ValueType === \"SCOORD\"\n );\n const { ReferencedSOPSequence } = SCOORDGroup.ContentSequence;\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n ReferencedSOPSequence;\n\n const referencedImageId =\n sopInstanceUIDToImageIdMap[ReferencedSOPInstanceUID];\n const imagePlaneModule = metadata.get(\n \"imagePlaneModule\",\n referencedImageId\n );\n\n const finding = findingGroup\n ? addAccessors(findingGroup.ConceptCodeSequence)\n : undefined;\n const findingSites = findingSiteGroups.map(fsg => {\n return addAccessors(fsg.ConceptCodeSequence);\n });\n\n const defaultState = {\n sopInstanceUid: ReferencedSOPInstanceUID,\n annotation: {\n annotationUID: DicomMetaDictionary.uid(),\n metadata: {\n toolName: toolType,\n referencedImageId,\n FrameOfReferenceUID: imagePlaneModule.frameOfReferenceUID,\n label: \"\"\n }\n },\n finding,\n findingSites\n };\n if (defaultState.finding) {\n defaultState.description = defaultState.finding.CodeMeaning;\n }\n\n defaultState.annotation.metadata.label =\n MeasurementReport.getCornerstoneLabelFromDefaultState(defaultState);\n\n return {\n defaultState,\n NUMGroup,\n SCOORDGroup,\n ReferencedSOPSequence,\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber\n };\n }\n\n static generateReport(\n toolState,\n metadataProvider,\n worldToImageCoords,\n options\n ) {\n // ToolState for array of imageIDs to a Report\n // Assume Cornerstone metadata provider has access to Study / Series / Sop Instance UID\n let allMeasurementGroups = [];\n\n /* Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Date\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Time\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study ID\n */\n\n const sopInstanceUIDsToSeriesInstanceUIDMap = {};\n const derivationSourceDatasets = [];\n\n const _meta = MeasurementReport.generateDatasetMeta();\n\n // Loop through each image in the toolData\n Object.keys(toolState).forEach(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n const generalSeriesModule = metadataProvider.get(\n \"generalSeriesModule\",\n imageId\n );\n\n const { sopInstanceUID, sopClassUID } = sopCommonModule;\n const { studyInstanceUID, seriesInstanceUID } = generalSeriesModule;\n\n sopInstanceUIDsToSeriesInstanceUIDMap[sopInstanceUID] =\n seriesInstanceUID;\n\n if (\n !derivationSourceDatasets.find(\n dsd => dsd.SeriesInstanceUID === seriesInstanceUID\n )\n ) {\n // Entry not present for series, create one.\n const derivationSourceDataset =\n MeasurementReport.generateDerivationSourceDataset(\n studyInstanceUID,\n seriesInstanceUID\n );\n\n derivationSourceDatasets.push(derivationSourceDataset);\n }\n\n const frameNumber = metadataProvider.get(\"frameNumber\", imageId);\n const toolData = toolState[imageId];\n const toolTypes = Object.keys(toolData);\n\n const ReferencedSOPSequence = {\n ReferencedSOPClassUID: sopClassUID,\n ReferencedSOPInstanceUID: sopInstanceUID\n };\n\n const instance = metadataProvider.get(\"instance\", imageId);\n if (\n (instance &&\n instance.NumberOfFrames &&\n instance.NumberOfFrames > 1) ||\n Normalizer.isMultiframeSOPClassUID(sopClassUID)\n ) {\n ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;\n }\n\n // Loop through each tool type for the image\n const measurementGroups = [];\n\n toolTypes.forEach(toolType => {\n const group = getMeasurementGroup(\n toolType,\n toolData,\n ReferencedSOPSequence,\n worldToImageCoords\n );\n if (group) {\n measurementGroups.push(group);\n }\n });\n\n allMeasurementGroups =\n allMeasurementGroups.concat(measurementGroups);\n });\n\n const tid1500MeasurementReport = new TID1500MeasurementReport(\n { TID1501MeasurementGroups: allMeasurementGroups },\n options\n );\n\n const report = new StructuredReport(derivationSourceDatasets);\n\n const contentItem = tid1500MeasurementReport.contentItem(\n derivationSourceDatasets,\n { sopInstanceUIDsToSeriesInstanceUIDMap }\n );\n\n // Merge the derived dataset with the content from the Measurement Report\n report.dataset = Object.assign(report.dataset, contentItem);\n report.dataset._meta = _meta;\n\n return report;\n }\n\n /**\n * Generate Cornerstone tool state from dataset\n * @param {object} dataset dataset\n * @param {object} hooks\n * @param {function} hooks.getToolClass Function to map dataset to a tool class\n * @returns\n */\n static generateToolState(\n dataset,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata,\n hooks = {}\n ) {\n // For now, bail out if the dataset is not a TID1500 SR with length measurements\n if (dataset.ContentTemplateSequence.TemplateIdentifier !== \"1500\") {\n throw new Error(\n \"This package can currently only interpret DICOM SR TID 1500\"\n );\n }\n\n const REPORT = \"Imaging Measurements\";\n const GROUP = \"Measurement Group\";\n const TRACKING_IDENTIFIER = \"Tracking Identifier\";\n\n // Identify the Imaging Measurements\n const imagingMeasurementContent = toArray(dataset.ContentSequence).find(\n codeMeaningEquals(REPORT)\n );\n\n // Retrieve the Measurements themselves\n const measurementGroups = toArray(\n imagingMeasurementContent.ContentSequence\n ).filter(codeMeaningEquals(GROUP));\n\n // For each of the supported measurement types, compute the measurement data\n const measurementData = {};\n\n const cornerstoneToolClasses =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\n\n const registeredToolClasses = [];\n\n Object.keys(cornerstoneToolClasses).forEach(key => {\n registeredToolClasses.push(cornerstoneToolClasses[key]);\n measurementData[key] = [];\n });\n\n measurementGroups.forEach(measurementGroup => {\n const measurementGroupContentSequence = toArray(\n measurementGroup.ContentSequence\n );\n\n const TrackingIdentifierGroup =\n measurementGroupContentSequence.find(\n contentItem =>\n contentItem.ConceptNameCodeSequence.CodeMeaning ===\n TRACKING_IDENTIFIER\n );\n\n const TrackingIdentifierValue = TrackingIdentifierGroup.TextValue;\n\n const toolClass = hooks.getToolClass\n ? hooks.getToolClass(\n measurementGroup,\n dataset,\n registeredToolClasses\n )\n : registeredToolClasses.find(tc =>\n tc.isValidCornerstoneTrackingIdentifier(\n TrackingIdentifierValue\n )\n );\n\n if (toolClass) {\n const measurement = toolClass.getMeasurementData(\n measurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n );\n\n console.log(`=== ${toolClass.toolType} ===`);\n console.log(measurement);\n\n measurementData[toolClass.toolType].push(measurement);\n }\n });\n\n // NOTE: There is no way of knowing the cornerstone imageIds as that could be anything.\n // That is up to the consumer to derive from the SOPInstanceUIDs.\n return measurementData;\n }\n\n static registerTool(toolClass) {\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[\n toolClass.utilityToolType\n ] = toolClass;\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[\n toolClass.toolType\n ] = toolClass;\n MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] =\n toolClass.utilityToolType;\n }\n}\n\nMeasurementReport.MEASUREMENT_BY_TOOLTYPE = {};\nMeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {};\nMeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {};\n","export default \"Cornerstone3DTools@^0.1.0\";\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Length from \"../../utilities/TID300/Length.js\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\n\nconst LENGTH = \"Length\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${LENGTH}`;\n\nclass Length {\n constructor() {}\n\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n Length.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [worldCoords[0], worldCoords[1]],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n length: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : 0\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"Length.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const start = worldToImageCoords(referencedImageId, handles.points[0]);\n const end = worldToImageCoords(referencedImageId, handles.points[1]);\n\n const point1 = { x: start[0], y: start[1] };\n const point2 = { x: end[0], y: end[1] };\n\n const { length: distance } =\n cachedStats[`imageId:${referencedImageId}`] || {};\n\n return {\n point1,\n point2,\n distance,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nLength.toolType = LENGTH;\nLength.utilityToolType = LENGTH;\nLength.TID300Representation = TID300Length;\nLength.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === LENGTH;\n};\n\nMeasurementReport.registerTool(Length);\n\nexport default Length;\n","import MeasurementReport from \"./MeasurementReport\";\nimport TID300Bidirectional from \"../../utilities/TID300/Bidirectional\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\n\nimport { toArray } from \"../helpers.js\";\n\nconst BIDIRECTIONAL = \"Bidirectional\";\nconst LONG_AXIS = \"Long Axis\";\nconst SHORT_AXIS = \"Short Axis\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${BIDIRECTIONAL}`;\n\nclass Bidirectional {\n constructor() {}\n\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n Bidirectional.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n const { ContentSequence } = MeasurementGroup;\n\n const longAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === LONG_AXIS\n );\n\n const longAxisSCOORDGroup = toArray(\n longAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const shortAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === SHORT_AXIS\n );\n\n const shortAxisSCOORDGroup = toArray(\n shortAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const worldCoords = [];\n\n [longAxisSCOORDGroup, shortAxisSCOORDGroup].forEach(group => {\n const { GraphicData } = group;\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n });\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [\n worldCoords[0],\n worldCoords[1],\n worldCoords[2],\n worldCoords[3]\n ],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n length: longAxisNUMGroup.MeasuredValueSequence.NumericValue,\n width: shortAxisNUMGroup.MeasuredValueSequence.NumericValue\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"Bidirectional.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const { length, width } =\n cachedStats[`imageId:${referencedImageId}`] || {};\n const { points } = handles;\n\n // Find the length and width point pairs by comparing the distances of the points at 0,1 to points at 2,3\n let firstPointPairs = [points[0], points[1]];\n let secondPointPairs = [points[2], points[3]];\n\n let firstPointPairsDistance = Math.sqrt(\n Math.pow(firstPointPairs[0][0] - firstPointPairs[1][0], 2) +\n Math.pow(firstPointPairs[0][1] - firstPointPairs[1][1], 2) +\n Math.pow(firstPointPairs[0][2] - firstPointPairs[1][2], 2)\n );\n\n let secondPointPairsDistance = Math.sqrt(\n Math.pow(secondPointPairs[0][0] - secondPointPairs[1][0], 2) +\n Math.pow(secondPointPairs[0][1] - secondPointPairs[1][1], 2) +\n Math.pow(secondPointPairs[0][2] - secondPointPairs[1][2], 2)\n );\n\n let shortAxisPoints;\n let longAxisPoints;\n if (firstPointPairsDistance > secondPointPairsDistance) {\n shortAxisPoints = firstPointPairs;\n longAxisPoints = secondPointPairs;\n } else {\n shortAxisPoints = secondPointPairs;\n longAxisPoints = firstPointPairs;\n }\n\n const longAxisStartImage = worldToImageCoords(\n referencedImageId,\n shortAxisPoints[0]\n );\n const longAxisEndImage = worldToImageCoords(\n referencedImageId,\n shortAxisPoints[1]\n );\n const shortAxisStartImage = worldToImageCoords(\n referencedImageId,\n longAxisPoints[0]\n );\n const shortAxisEndImage = worldToImageCoords(\n referencedImageId,\n longAxisPoints[1]\n );\n\n return {\n longAxis: {\n point1: {\n x: longAxisStartImage[0],\n y: longAxisStartImage[1]\n },\n point2: {\n x: longAxisEndImage[0],\n y: longAxisEndImage[1]\n }\n },\n shortAxis: {\n point1: {\n x: shortAxisStartImage[0],\n y: shortAxisStartImage[1]\n },\n point2: {\n x: shortAxisEndImage[0],\n y: shortAxisEndImage[1]\n }\n },\n longAxisLength: length,\n shortAxisLength: width,\n trackingIdentifierTextValue,\n finding: finding,\n findingSites: findingSites || []\n };\n }\n}\n\nBidirectional.toolType = BIDIRECTIONAL;\nBidirectional.utilityToolType = BIDIRECTIONAL;\nBidirectional.TID300Representation = TID300Bidirectional;\nBidirectional.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === BIDIRECTIONAL;\n};\n\nMeasurementReport.registerTool(Bidirectional);\n\nexport default Bidirectional;\n","/**\n * Common utilities\n * @module glMatrix\n */\n\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nexport var RANDOM = Math.random;\nexport var ANGLE_ORDER = \"zyx\";\n\n/**\n * Symmetric round\n * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background\n *\n * @param {Number} a value to round\n */\nexport function round(a) {\n if (a >= 0) return Math.round(a);\n return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nvar radian = 180 / Math.PI;\n\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\nexport function toRadian(a) {\n return a * degree;\n}\n\n/**\n * Convert Radian To Degree\n *\n * @param {Number} a Angle in Radians\n */\nexport function toDegree(a) {\n return a * radian;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @param {Number} tolerance Absolute or relative tolerance (default glMatrix.EPSILON)\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b));\n}","import * as glMatrix from \"./common.js\";\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n return out;\n}\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n\n/**\n * symmetric round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\nexport function round(out, a) {\n out[0] = glMatrix.round(a[0]);\n out[1] = glMatrix.round(a[1]);\n out[2] = glMatrix.round(a[2]);\n return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function slerp(out, a, b, t) {\n var angle = Math.acos(Math.min(Math.max(dot(a, b), -1), 1));\n var sinTotal = Math.sin(angle);\n var ratioA = Math.sin((1 - t) * angle) / sinTotal;\n var ratioB = Math.sin(t * angle) / sinTotal;\n out[0] = ratioA * a[0] + ratioB * b[0];\n out[1] = ratioA * a[1] + ratioB * b[1];\n out[2] = ratioA * a[2] + ratioB * b[2];\n return out;\n}\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec3} out\n */\nexport function random(out, scale) {\n scale = scale === undefined ? 1.0 : scale;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q normalized quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n // Fast Vector Rotation using Quaternions by Robert Eisele\n // https://raw.org/proof/vector-rotation-using-quaternions/\n\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var vx = a[0],\n vy = a[1],\n vz = a[2];\n\n // t = q x v\n var tx = qy * vz - qz * vy;\n var ty = qz * vx - qx * vz;\n var tz = qx * vy - qy * vx;\n\n // t = 2t\n tx = tx + tx;\n ty = ty + ty;\n tz = tz + tz;\n\n // v + w t + q x t\n out[0] = vx + qw * tx + qy * tz - qz * ty;\n out[1] = vy + qw * ty + qz * tx - qx * tz;\n out[2] = vz + qw * tz + qx * ty - qy * tx;\n return out;\n}\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2];\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)),\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nexport var sub = subtract;\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nexport var div = divide;\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nexport var dist = distance;\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nexport var sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nexport var len = length;\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nexport var sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n if (!stride) {\n stride = 3;\n }\n if (!offset) {\n offset = 0;\n }\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n return a;\n };\n}();","import { vec3 } from \"gl-matrix\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport TID300Ellipse from \"../../utilities/TID300/Ellipse\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\n\nconst ELLIPTICALROI = \"EllipticalROI\";\nconst EPSILON = 1e-4;\n\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${ELLIPTICALROI}`;\n\nclass EllipticalROI {\n constructor() {}\n\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n EllipticalROI.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n\n // GraphicData is ordered as [majorAxisStartX, majorAxisStartY, majorAxisEndX, majorAxisEndY, minorAxisStartX, minorAxisStartY, minorAxisEndX, minorAxisEndY]\n // But Cornerstone3D points are ordered as top, bottom, left, right for the\n // ellipse so we need to identify if the majorAxis is horizontal or vertical\n // in the image plane and then choose the correct points to use for the ellipse.\n const pointsWorld = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const worldPos = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n\n pointsWorld.push(worldPos);\n }\n\n const majorAxisStart = vec3.fromValues(...pointsWorld[0]);\n const majorAxisEnd = vec3.fromValues(...pointsWorld[1]);\n const minorAxisStart = vec3.fromValues(...pointsWorld[2]);\n const minorAxisEnd = vec3.fromValues(...pointsWorld[3]);\n\n const majorAxisVec = vec3.create();\n vec3.sub(majorAxisVec, majorAxisEnd, majorAxisStart);\n\n // normalize majorAxisVec to avoid scaling issues\n vec3.normalize(majorAxisVec, majorAxisVec);\n\n const minorAxisVec = vec3.create();\n vec3.sub(minorAxisVec, minorAxisEnd, minorAxisStart);\n vec3.normalize(minorAxisVec, minorAxisVec);\n\n const imagePlaneModule = metadata.get(\n \"imagePlaneModule\",\n referencedImageId\n );\n\n if (!imagePlaneModule) {\n throw new Error(\"imageId does not have imagePlaneModule metadata\");\n }\n\n const { columnCosines } = imagePlaneModule;\n\n // find which axis is parallel to the columnCosines\n const columnCosinesVec = vec3.fromValues(...columnCosines);\n\n const projectedMajorAxisOnColVec = vec3.dot(\n columnCosinesVec,\n majorAxisVec\n );\n\n const projectedMinorAxisOnColVec = vec3.dot(\n columnCosinesVec,\n minorAxisVec\n );\n\n const absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec);\n const absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec);\n\n let ellipsePoints = [];\n if (Math.abs(absoluteOfMajorDotProduct - 1) < EPSILON) {\n ellipsePoints = [\n pointsWorld[0],\n pointsWorld[1],\n pointsWorld[2],\n pointsWorld[3]\n ];\n } else if (Math.abs(absoluteOfMinorDotProduct - 1) < EPSILON) {\n ellipsePoints = [\n pointsWorld[2],\n pointsWorld[3],\n pointsWorld[0],\n pointsWorld[1]\n ];\n } else {\n console.warn(\"OBLIQUE ELLIPSE NOT YET SUPPORTED\");\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [...ellipsePoints],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n area: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : 0\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"EllipticalROI.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const top = worldToImageCoords(referencedImageId, handles.points[0]);\n const bottom = worldToImageCoords(referencedImageId, handles.points[1]);\n const left = worldToImageCoords(referencedImageId, handles.points[2]);\n const right = worldToImageCoords(referencedImageId, handles.points[3]);\n\n // find the major axis and minor axis\n const topBottomLength = Math.abs(top[1] - bottom[1]);\n const leftRightLength = Math.abs(left[0] - right[0]);\n\n let points = [];\n if (topBottomLength > leftRightLength) {\n // major axis is bottom to top\n points.push({ x: top[0], y: top[1] });\n points.push({ x: bottom[0], y: bottom[1] });\n\n // minor axis is left to right\n points.push({ x: left[0], y: left[1] });\n points.push({ x: right[0], y: right[1] });\n } else {\n // major axis is left to right\n points.push({ x: left[0], y: left[1] });\n points.push({ x: right[0], y: right[1] });\n\n // minor axis is bottom to top\n points.push({ x: top[0], y: top[1] });\n points.push({ x: bottom[0], y: bottom[1] });\n }\n\n const stats = cachedStats[`imageId:${referencedImageId}`] || {};\n\n return {\n area: stats.area,\n mean: stats.mean,\n max: stats.max,\n min: stats.min,\n stdDev: stats.stdDev,\n points,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nEllipticalROI.toolType = ELLIPTICALROI;\nEllipticalROI.utilityToolType = ELLIPTICALROI;\nEllipticalROI.TID300Representation = TID300Ellipse;\nEllipticalROI.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n // The following is needed since the new cornerstone3D has changed\n // the EllipticalRoi toolName (which was in the old cornerstone) to EllipticalROI\n return toolType.toLowerCase() === ELLIPTICALROI.toLowerCase();\n};\n\nMeasurementReport.registerTool(EllipticalROI);\n\nexport default EllipticalROI;\n","import OpenPolyline from \"./OpenPolyline\";\nimport addAccessors from \"../addAccessors.js\";\n\nexport default class ArrowAnnotate extends OpenPolyline {\n getPoints() {\n return this.props.points;\n }\n\n getConceptNameCodeSequence() {\n return addAccessors({\n CodeValue: \"111010\",\n CodingSchemeDesignator: \"DCM\",\n CodeMeaning: \"label\"\n });\n }\n\n getMeasuredValueSequence() {\n return {\n NumericValue: 0,\n MeasurementUnitsCodeSequence: {\n CodeValue: \"1\",\n CodingSchemeDesignator: \"UCUM\",\n CodeMeaning: \"no units\"\n }\n };\n }\n}\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300ArrowAnnotate from \"../../utilities/TID300/ArrowAnnotate.js\";\n\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport CodingScheme from \"./CodingScheme\";\nimport {\n isFreeTextCodeValue,\n isLegacyFreeTextCodeValue\n} from \"./freeTextCodeChecks.js\";\n\nconst ARROW_ANNOTATE = \"ArrowAnnotate\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${ARROW_ANNOTATE}`;\n\nconst { codeValues, CodingSchemeDesignator } = CodingScheme;\n\nclass ArrowAnnotate {\n constructor() {}\n\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n ArrowAnnotate.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const text = defaultState.annotation.metadata.label;\n\n const { GraphicData } = SCOORDGroup;\n\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n // Since the arrowAnnotate measurement is just a point, to generate the tool state\n // we derive the second point based on the image size relative to the first point.\n if (worldCoords.length === 1) {\n const imagePixelModule = metadata.get(\n \"imagePixelModule\",\n referencedImageId\n );\n\n let xOffset = 10;\n let yOffset = 10;\n\n if (imagePixelModule) {\n const { columns, rows } = imagePixelModule;\n xOffset = columns / 10;\n yOffset = rows / 10;\n }\n\n const secondPoint = imageToWorldCoords(referencedImageId, [\n GraphicData[0] + xOffset,\n GraphicData[1] + yOffset\n ]);\n\n worldCoords.push(secondPoint);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n text,\n handles: {\n arrowFirst: true,\n points: [worldCoords[0], worldCoords[1]],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, metadata } = tool;\n let { finding, findingSites } = tool;\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"ArrowAnnotate.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const { points, arrowFirst } = data.handles;\n\n let point;\n\n if (arrowFirst) {\n point = points[0];\n } else {\n point = points[1];\n }\n\n const pointImage = worldToImageCoords(referencedImageId, point);\n\n const TID300RepresentationArguments = {\n points: [\n {\n x: pointImage[0],\n y: pointImage[1]\n }\n ],\n trackingIdentifierTextValue,\n findingSites: findingSites || []\n };\n\n // If freetext finding isn't present, add it from the tool text.\n if (\n !finding ||\n (!isFreeTextCodeValue(finding.CodeValue) &&\n !isLegacyFreeTextCodeValue(finding.CodeValue))\n ) {\n finding = {\n CodeValue: codeValues.FREE_TEXT_CODE_VALUE,\n CodingSchemeDesignator,\n CodeMeaning: data.text\n };\n }\n\n TID300RepresentationArguments.finding = finding;\n\n return TID300RepresentationArguments;\n }\n}\n\nArrowAnnotate.toolType = ARROW_ANNOTATE;\nArrowAnnotate.utilityToolType = ARROW_ANNOTATE;\nArrowAnnotate.TID300Representation = TID300ArrowAnnotate;\nArrowAnnotate.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === ARROW_ANNOTATE;\n};\n\nMeasurementReport.registerTool(ArrowAnnotate);\n\nexport default ArrowAnnotate;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Point from \"../../utilities/TID300/Point.js\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\n\nconst PROBE = \"Probe\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${PROBE}`;\n\nclass Probe {\n constructor() {}\n\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n Probe.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: worldCoords,\n activeHandleIndex: null,\n textBox: {\n hasMoved: false\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, metadata } = tool;\n let { finding, findingSites } = tool;\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"Probe.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const { points } = data.handles;\n\n const pointsImage = points.map(point => {\n const pointImage = worldToImageCoords(referencedImageId, point);\n return {\n x: pointImage[0],\n y: pointImage[1]\n };\n });\n\n const TID300RepresentationArguments = {\n points: pointsImage,\n trackingIdentifierTextValue,\n findingSites: findingSites || [],\n finding\n };\n\n return TID300RepresentationArguments;\n }\n}\n\nProbe.toolType = PROBE;\nProbe.utilityToolType = PROBE;\nProbe.TID300Representation = TID300Point;\nProbe.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === PROBE;\n};\n\nMeasurementReport.registerTool(Probe);\n\nexport default Probe;\n","import MeasurementReport from \"./MeasurementReport\";\nimport TID300Polyline from \"../../utilities/TID300/Polyline\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport { vec3 } from \"gl-matrix\";\n\nconst PLANARFREEHANDROI = \"PlanarFreehandROI\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${PLANARFREEHANDROI}`;\nconst closedContourThreshold = 1e-5;\n\nclass PlanarFreehandROI {\n constructor() {}\n\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n PlanarFreehandROI.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n const { GraphicData } = SCOORDGroup;\n\n const worldCoords = [];\n\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n\n worldCoords.push(point);\n }\n\n const distanceBetweenFirstAndLastPoint = vec3.distance(\n worldCoords[worldCoords.length - 1],\n worldCoords[0]\n );\n\n let isOpenContour = true;\n\n // If the contour is closed, this should have been encoded as exactly the same point, so check for a very small difference.\n if (distanceBetweenFirstAndLastPoint < closedContourThreshold) {\n worldCoords.pop(); // Remove the last element which is duplicated.\n\n isOpenContour = false;\n }\n\n let points = [];\n\n if (isOpenContour) {\n points.push(worldCoords[0], worldCoords[worldCoords.length - 1]);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n polyline: worldCoords,\n isOpenContour,\n handles: {\n points,\n activeHandleIndex: null,\n textBox: {\n hasMoved: false\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { isOpenContour, polyline } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"PlanarFreehandROI.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const points = polyline.map(worldPos =>\n worldToImageCoords(referencedImageId, worldPos)\n );\n\n if (!isOpenContour) {\n // Need to repeat the first point at the end of to have an explicitly closed contour.\n const firstPoint = points[0];\n\n // Explicitly expand to avoid ciruclar references.\n points.push([firstPoint[0], firstPoint[1]]);\n }\n\n const area = 0; // TODO -> The tool doesn't have these stats yet.\n const perimeter = 0;\n\n return {\n points,\n area,\n perimeter,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nPlanarFreehandROI.toolType = PLANARFREEHANDROI;\nPlanarFreehandROI.utilityToolType = PLANARFREEHANDROI;\nPlanarFreehandROI.TID300Representation = TID300Polyline;\nPlanarFreehandROI.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === PLANARFREEHANDROI;\n};\n\nMeasurementReport.registerTool(PlanarFreehandROI);\n\nexport default PlanarFreehandROI;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport Length from \"./Length.js\";\nimport Bidirectional from \"./Bidirectional.js\";\nimport EllipticalROI from \"./EllipticalROI.js\";\nimport ArrowAnnotate from \"./ArrowAnnotate.js\";\nimport Probe from \"./Probe.js\";\nimport PlanarFreehandROI from \"./PlanarFreehandROI.js\";\nimport CodeScheme from \"./CodingScheme\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\n\nconst Cornerstone3D = {\n Length,\n Bidirectional,\n EllipticalROI,\n ArrowAnnotate,\n Probe,\n PlanarFreehandROI,\n MeasurementReport,\n CodeScheme,\n CORNERSTONE_3D_TAG\n};\n\nexport default Cornerstone3D;\n","import Colors from \"../../colors.js\";\nimport BitArray from \"../../bitArray.js\";\n\n// TODO: Is there a better name for this? RGBAInt?\n// Should we move it to Colors.js\nfunction dicomlab2RGBA(cielab) {\n const rgba = Colors.dicomlab2RGB(cielab).map(x => Math.round(x * 255));\n rgba.push(255);\n\n return rgba;\n}\n\n// TODO: Copied these functions in from VTK Math so we don't need a dependency.\n// I guess we should put them somewhere\n// https://github.com/Kitware/vtk-js/blob/master/Sources/Common/Core/Math/index.js\nfunction cross(x, y, out) {\n const Zx = x[1] * y[2] - x[2] * y[1];\n const Zy = x[2] * y[0] - x[0] * y[2];\n const Zz = x[0] * y[1] - x[1] * y[0];\n out[0] = Zx;\n out[1] = Zy;\n out[2] = Zz;\n}\n\nfunction norm(x, n = 3) {\n switch (n) {\n case 1:\n return Math.abs(x);\n case 2:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n case 3:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);\n default: {\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += x[i] * x[i];\n }\n return Math.sqrt(sum);\n }\n }\n}\n\nfunction normalize(x) {\n const den = norm(x);\n if (den !== 0.0) {\n x[0] /= den;\n x[1] /= den;\n x[2] /= den;\n }\n return den;\n}\n\nfunction subtract(a, b, out) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n}\n\n// TODO: This is a useful utility on its own. We should move it somewhere?\n// dcmjs.adapters.vtk.Multiframe? dcmjs.utils?\nfunction geometryFromFunctionalGroups(dataset, PerFrameFunctionalGroups) {\n const geometry = {};\n const pixelMeasures =\n dataset.SharedFunctionalGroupsSequence.PixelMeasuresSequence;\n const planeOrientation =\n dataset.SharedFunctionalGroupsSequence.PlaneOrientationSequence;\n\n // Find the origin of the volume from the PerFrameFunctionalGroups' ImagePositionPatient values\n //\n // TODO: assumes sorted frames. This should read the ImagePositionPatient from each frame and\n // sort them to obtain the first and last position along the acquisition axis.\n const firstFunctionalGroup = PerFrameFunctionalGroups[0];\n const lastFunctionalGroup =\n PerFrameFunctionalGroups[PerFrameFunctionalGroups.length - 1];\n const firstPosition =\n firstFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(\n Number\n );\n const lastPosition =\n lastFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(\n Number\n );\n\n geometry.origin = firstPosition;\n\n // NB: DICOM PixelSpacing is defined as Row then Column,\n // unlike ImageOrientationPatient\n geometry.spacing = [\n pixelMeasures.PixelSpacing[1],\n pixelMeasures.PixelSpacing[0],\n pixelMeasures.SpacingBetweenSlices\n ].map(Number);\n\n geometry.dimensions = [\n dataset.Columns,\n dataset.Rows,\n PerFrameFunctionalGroups.length\n ].map(Number);\n\n const orientation = planeOrientation.ImageOrientationPatient.map(Number);\n const columnStepToPatient = orientation.slice(0, 3);\n const rowStepToPatient = orientation.slice(3, 6);\n\n geometry.planeNormal = [];\n\n cross(columnStepToPatient, rowStepToPatient, geometry.planeNormal);\n\n geometry.sliceStep = [];\n subtract(lastPosition, firstPosition, geometry.sliceStep);\n normalize(geometry.sliceStep);\n geometry.direction = columnStepToPatient\n .concat(rowStepToPatient)\n .concat(geometry.sliceStep);\n\n return geometry;\n}\n\nexport default class Segmentation {\n constructor() {}\n\n /**\n * Produces an array of Segments from an input DICOM Segmentation dataset\n *\n * Segments are returned with Geometry values that can be used to create\n * VTK Image Data objects.\n *\n * @example Example usage to create VTK Volume actors from each segment:\n *\n * const actors = [];\n * const segments = generateToolState(dataset);\n * segments.forEach(segment => {\n * // now make actors using the segment information\n * const scalarArray = vtk.Common.Core.vtkDataArray.newInstance({\n * name: \"Scalars\",\n * numberOfComponents: 1,\n * values: segment.pixelData,\n * });\n *\n * const imageData = vtk.Common.DataModel.vtkImageData.newInstance();\n * imageData.getPointData().setScalars(scalarArray);\n * imageData.setDimensions(geometry.dimensions);\n * imageData.setSpacing(geometry.spacing);\n * imageData.setOrigin(geometry.origin);\n * imageData.setDirection(geometry.direction);\n *\n * const mapper = vtk.Rendering.Core.vtkVolumeMapper.newInstance();\n * mapper.setInputData(imageData);\n * mapper.setSampleDistance(2.);\n *\n * const actor = vtk.Rendering.Core.vtkVolume.newInstance();\n * actor.setMapper(mapper);\n *\n * actors.push(actor);\n * });\n *\n * @param dataset\n * @return {{}}\n */\n static generateSegments(dataset) {\n if (dataset.SegmentSequence.constructor.name !== \"Array\") {\n dataset.SegmentSequence = [dataset.SegmentSequence];\n }\n\n const segments = {};\n dataset.SegmentSequence.forEach(segment => {\n // TODO: other interesting fields could be extracted from the segment\n // TODO: Read SegmentsOverlay field\n // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.8.20.2.html\n\n // TODO: Looks like vtkColor only wants RGB in 0-1 values.\n // Why was this example converting to RGBA with 0-255 values?\n const color = dicomlab2RGBA(segment.RecommendedDisplayCIELabValue);\n\n segments[segment.SegmentNumber] = {\n color,\n functionalGroups: [],\n offset: null,\n size: null,\n pixelData: null\n };\n });\n\n // make a list of functional groups per segment\n dataset.PerFrameFunctionalGroupsSequence.forEach(functionalGroup => {\n const segmentNumber =\n functionalGroup.SegmentIdentificationSequence\n .ReferencedSegmentNumber;\n\n segments[segmentNumber].functionalGroups.push(functionalGroup);\n });\n\n // determine per-segment index into the pixel data\n // TODO: only handles one-bit-per pixel\n const frameSize = Math.ceil((dataset.Rows * dataset.Columns) / 8);\n let nextOffset = 0;\n\n Object.keys(segments).forEach(segmentNumber => {\n const segment = segments[segmentNumber];\n\n segment.numberOfFrames = segment.functionalGroups.length;\n segment.size = segment.numberOfFrames * frameSize;\n segment.offset = nextOffset;\n\n nextOffset = segment.offset + segment.size;\n\n const packedSegment = dataset.PixelData.slice(\n segment.offset,\n nextOffset\n );\n\n segment.pixelData = BitArray.unpack(packedSegment);\n\n const geometry = geometryFromFunctionalGroups(\n dataset,\n segment.functionalGroups\n );\n\n segment.geometry = geometry;\n });\n\n return segments;\n }\n}\n","import Segmentation from \"./Segmentation.js\";\n\nconst VTKjs = {\n Segmentation\n};\n\nexport default VTKjs;\n","import { DicomMetaDictionary } from \"../../DicomMetaDictionary.js\";\nimport { StructuredReport } from \"../../derivations/\";\nimport TID1500MeasurementReport from \"../../utilities/TID1500/TID1500MeasurementReport.js\";\nimport TID1501MeasurementGroup from \"../../utilities/TID1500/TID1501MeasurementGroup.js\";\nimport { toArray, codeMeaningEquals, graphicTypeEquals } from \"../helpers.js\";\n\nfunction getTID300ContentItem(tool, toolClass) {\n const args = toolClass.getTID300RepresentationArguments(tool);\n args.use3DSpatialCoordinates = true;\n return new toolClass.TID300Representation(args);\n}\n\nfunction getMeasurementGroup(graphicType, measurements) {\n const toolClass =\n MeasurementReport.MICROSCOPY_TOOL_CLASSES_BY_TOOL_TYPE[graphicType];\n\n // Loop through the array of tool instances\n // for this tool\n const Measurements = measurements.map(tool => {\n return getTID300ContentItem(tool, toolClass);\n });\n\n return new TID1501MeasurementGroup(Measurements);\n}\n\nexport default class MeasurementReport {\n constructor() {}\n\n static generateReport(rois, metadataProvider, options) {\n // Input is all ROIS returned via viewer.getALLROIs()\n // let report = MeasurementReport.generateReport(viewer.getAllROIs());\n\n // Sort and split into arrays by scoord3d.graphicType\n const measurementsByGraphicType = {};\n rois.forEach(roi => {\n const graphicType = roi.scoord3d.graphicType;\n\n if (graphicType !== \"POINT\") {\n // adding z coord as 0\n roi.scoord3d.graphicData.map(coord => coord.push(0));\n }\n\n if (!measurementsByGraphicType[graphicType]) {\n measurementsByGraphicType[graphicType] = [];\n }\n\n measurementsByGraphicType[graphicType].push(roi.scoord3d);\n });\n\n // For each measurement, get the utility arguments using the adapter, and create TID300 Measurement\n // Group these TID300 Measurements into a TID1501 Measurement Group (for each graphicType)\n // Use TID1500MeasurementReport utility to create a single report from the created groups\n // return report;\n\n let allMeasurementGroups = [];\n const measurementGroups = [];\n Object.keys(measurementsByGraphicType).forEach(graphicType => {\n const measurements = measurementsByGraphicType[graphicType];\n\n const group = getMeasurementGroup(graphicType, measurements);\n if (group) {\n measurementGroups.push(group);\n }\n\n allMeasurementGroups =\n allMeasurementGroups.concat(measurementGroups);\n });\n\n const MeasurementReport = new TID1500MeasurementReport(\n { TID1501MeasurementGroups: allMeasurementGroups },\n options\n );\n\n // TODO: what is the correct metaheader\n // http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html\n // TODO: move meta creation to happen in derivations.js\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n // TODO: Find out how to reference the data from dicom-microscopy-viewer\n const studyInstanceUID = \"12.4\";\n const seriesInstanceUID = \"12.4\";\n\n const derivationSourceDataset = {\n StudyInstanceUID: studyInstanceUID,\n SeriesInstanceUID: seriesInstanceUID\n //SOPInstanceUID: sopInstanceUID, // TODO: Necessary?\n //SOPClassUID: sopClassUID,\n };\n\n const _meta = {\n FileMetaInformationVersion: {\n Value: [fileMetaInformationVersionArray.buffer],\n vr: \"OB\"\n },\n //MediaStorageSOPClassUID\n //MediaStorageSOPInstanceUID: sopCommonModule.sopInstanceUID,\n TransferSyntaxUID: {\n Value: [\"1.2.840.10008.1.2.1\"],\n vr: \"UI\"\n },\n ImplementationClassUID: {\n Value: [DicomMetaDictionary.uid()], // TODO: could be git hash or other valid id\n vr: \"UI\"\n },\n ImplementationVersionName: {\n Value: [\"dcmjs\"],\n vr: \"SH\"\n }\n };\n\n const _vrMap = {\n PixelData: \"OW\"\n };\n\n derivationSourceDataset._meta = _meta;\n derivationSourceDataset._vrMap = _vrMap;\n\n const report = new StructuredReport([derivationSourceDataset]);\n const contentItem = MeasurementReport.contentItem(\n derivationSourceDataset\n );\n\n // Merge the derived dataset with the content from the Measurement Report\n report.dataset = Object.assign(report.dataset, contentItem);\n report.dataset._meta = _meta;\n\n return report;\n }\n\n //@ToDo\n static generateToolState(dataset) {\n // For now, bail out if the dataset is not a TID1500 SR with length measurements\n if (dataset.ContentTemplateSequence.TemplateIdentifier !== \"1500\") {\n throw new Error(\n \"This package can currently only interpret DICOM SR TID 1500\"\n );\n }\n\n const REPORT = \"Imaging Measurements\";\n const GROUP = \"Measurement Group\";\n\n // Split the imagingMeasurementContent into measurement groups by their code meaning\n const imagingMeasurementContent = toArray(dataset.ContentSequence).find(\n codeMeaningEquals(REPORT)\n );\n\n // Retrieve the Measurements themselves\n const measurementGroups = toArray(\n imagingMeasurementContent.ContentSequence\n ).filter(codeMeaningEquals(GROUP));\n\n // // For each of the supported measurement types, compute the measurement data\n const measurementData = {};\n\n measurementGroups.forEach(mg => {\n Object.keys(\n MeasurementReport.MICROSCOPY_TOOL_CLASSES_BY_UTILITY_TYPE\n ).forEach(measurementType => {\n // Find supported measurement types in the Structured Report\n const measurementGroupContentSequence = toArray(\n mg.ContentSequence\n );\n let measurementContent = measurementGroupContentSequence.filter(\n graphicTypeEquals(measurementType.toUpperCase())\n );\n if (!measurementContent || measurementContent.length === 0) {\n return;\n }\n\n const toolClass =\n MeasurementReport.MICROSCOPY_TOOL_CLASSES_BY_UTILITY_TYPE[\n measurementType\n ];\n const toolType = toolClass.toolType;\n\n if (!toolClass.getMeasurementData) {\n throw new Error(\n \"MICROSCOPY Tool Adapters must define a getMeasurementData static method.\"\n );\n }\n\n if (!measurementData[toolType]) {\n measurementData[toolType] = [];\n }\n measurementData[toolType] = [\n ...measurementData[toolType],\n ...toolClass.getMeasurementData(measurementContent)\n ];\n });\n });\n\n return measurementData;\n }\n\n static registerTool(toolClass) {\n MeasurementReport.MICROSCOPY_TOOL_CLASSES_BY_UTILITY_TYPE[\n toolClass.utilityToolType\n ] = toolClass;\n MeasurementReport.MICROSCOPY_TOOL_CLASSES_BY_TOOL_TYPE[\n toolClass.graphicType\n ] = toolClass;\n MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.graphicType] =\n toolClass.utilityToolType;\n }\n}\n\nMeasurementReport.MEASUREMENT_BY_TOOLTYPE = {};\nMeasurementReport.MICROSCOPY_TOOL_CLASSES_BY_UTILITY_TYPE = {};\nMeasurementReport.MICROSCOPY_TOOL_CLASSES_BY_TOOL_TYPE = {};\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Polyline from \"../../utilities/TID300/Polyline\";\n\nclass Polyline {\n constructor() {}\n\n static getMeasurementData(measurementContent) {\n // removing duplication and Getting only the graphicData information\n const measurement = measurementContent\n .map(item => item.GraphicData)\n .filter(\n (\n s => a =>\n (j => !s.has(j) && s.add(j))(JSON.stringify(a))\n )(new Set())\n );\n\n // Chunking the array into size of three\n return measurement.map(measurement => {\n return measurement.reduce((all, one, i) => {\n const ch = Math.floor(i / 3);\n all[ch] = [].concat(all[ch] || [], one);\n return all;\n }, []);\n });\n }\n\n static getTID300RepresentationArguments(scoord3d) {\n if (scoord3d.graphicType !== \"POLYLINE\") {\n throw new Error(\"We expected a POLYLINE graphicType\");\n }\n\n const points = scoord3d.graphicData;\n const lengths = 1;\n\n return { points, lengths };\n }\n}\n\nPolyline.graphicType = \"POLYLINE\";\nPolyline.toolType = \"Polyline\";\nPolyline.utilityToolType = \"Polyline\";\nPolyline.TID300Representation = TID300Polyline;\n\nMeasurementReport.registerTool(Polyline);\n\nexport default Polyline;\n","import TID300Measurement from \"./TID300Measurement.js\";\nimport unit2CodingValue from \"./unit2CodingValue.js\";\nimport TID320ContentItem from \"./TID320ContentItem.js\";\n\nexport default class Polygon extends TID300Measurement {\n contentItem() {\n const {\n points,\n perimeter,\n unit = \"mm\",\n area,\n areaUnit,\n ReferencedSOPSequence,\n use3DSpatialCoordinates = false,\n ReferencedFrameOfReferenceUID\n } = this.props;\n\n const GraphicData = this.flattenPoints({\n points,\n use3DSpatialCoordinates\n });\n\n const graphicContentSequence = new TID320ContentItem({\n graphicType: \"POLYGON\",\n graphicData: GraphicData,\n use3DSpatialCoordinates,\n referencedSOPSequence: ReferencedSOPSequence,\n referencedFrameOfReferenceUID: ReferencedFrameOfReferenceUID\n }).contentItem();\n\n return this.getMeasurement([\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"NUM\",\n ConceptNameCodeSequence: {\n CodeValue: \"G-A197\",\n CodingSchemeDesignator: \"SRT\",\n CodeMeaning: \"Perimeter\"\n },\n MeasuredValueSequence: {\n MeasurementUnitsCodeSequence: unit2CodingValue(unit),\n NumericValue: perimeter\n },\n ContentSequence: graphicContentSequence\n },\n {\n RelationshipType: \"CONTAINS\",\n ValueType: \"NUM\",\n ConceptNameCodeSequence: {\n CodeValue: \"G-A166\",\n CodingSchemeDesignator: \"SRT\",\n CodeMeaning: \"Area\"\n },\n MeasuredValueSequence: {\n MeasurementUnitsCodeSequence: unit2CodingValue(areaUnit),\n NumericValue: area\n },\n ContentSequence: graphicContentSequence\n }\n ]);\n }\n}\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Polygon from \"../../utilities/TID300/Polygon\";\n\nclass Polygon {\n constructor() {}\n\n static getMeasurementData(measurementContent) {\n // removing duplication and Getting only the graphicData information\n const measurement = measurementContent\n .map(item => item.GraphicData)\n .filter(\n (\n s => a =>\n (j => !s.has(j) && s.add(j))(JSON.stringify(a))\n )(new Set())\n );\n\n // Chunking the array into size of three\n return measurement.map(measurement => {\n return measurement.reduce((all, one, i) => {\n const ch = Math.floor(i / 3);\n all[ch] = [].concat(all[ch] || [], one);\n return all;\n }, []);\n });\n }\n\n static getTID300RepresentationArguments(scoord3d) {\n if (scoord3d.graphicType !== \"POLYGON\") {\n throw new Error(\"We expected a POLYGON graphicType\");\n }\n\n const points = scoord3d.graphicData;\n const lengths = 1;\n\n return { points, lengths };\n }\n}\n\nPolygon.graphicType = \"POLYGON\";\nPolygon.toolType = \"Polygon\";\nPolygon.utilityToolType = \"Polygon\";\nPolygon.TID300Representation = TID300Polygon;\n\nMeasurementReport.registerTool(Polygon);\n\nexport default Polygon;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Point from \"../../utilities/TID300/Point\";\n\nclass Point {\n constructor() {}\n\n static getMeasurementData(measurementContent) {\n const measurement = measurementContent.map(item => item.GraphicData);\n return measurement.filter(\n (\n s => a =>\n (j => !s.has(j) && s.add(j))(JSON.stringify(a))\n )(new Set())\n );\n }\n\n static getTID300RepresentationArguments(scoord3d) {\n if (scoord3d.graphicType !== \"POINT\") {\n throw new Error(\"We expected a POINT graphicType\");\n }\n\n const points = [scoord3d.graphicData];\n const lengths = 1;\n\n return { points, lengths };\n }\n}\n\nPoint.graphicType = \"POINT\";\nPoint.toolType = \"Point\";\nPoint.utilityToolType = \"Point\";\nPoint.TID300Representation = TID300Point;\n\nMeasurementReport.registerTool(Point);\n\nexport default Point;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Circle from \"../../utilities/TID300/Circle\";\n\nclass Circle {\n constructor() {}\n\n static getMeasurementData(measurementContent) {\n // removing duplication and Getting only the graphicData information\n const measurement = measurementContent\n .map(item => item.GraphicData)\n .filter(\n (\n s => a =>\n (j => !s.has(j) && s.add(j))(JSON.stringify(a))\n )(new Set())\n );\n\n // Chunking the array into size of three\n return measurement.map(measurement => {\n return measurement.reduce((all, one, i) => {\n const ch = Math.floor(i / 3);\n all[ch] = [].concat(all[ch] || [], one);\n return all;\n }, []);\n });\n }\n\n static getTID300RepresentationArguments(scoord3d) {\n if (scoord3d.graphicType !== \"CIRCLE\") {\n throw new Error(\"We expected a CIRCLE graphicType\");\n }\n\n const points = scoord3d.graphicData;\n const lengths = 1;\n\n return { points, lengths };\n }\n}\n\nCircle.graphicType = \"CIRCLE\";\nCircle.toolType = \"Circle\";\nCircle.utilityToolType = \"Circle\";\nCircle.TID300Representation = TID300Circle;\n\nMeasurementReport.registerTool(Circle);\n\nexport default Circle;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport TID300Ellipse from \"../../utilities/TID300/Ellipse\";\n\nclass Ellipse {\n constructor() {}\n\n static getMeasurementData(measurementContent) {\n // removing duplication and Getting only the graphicData information\n const measurement = measurementContent\n .map(item => item.GraphicData)\n .filter(\n (\n s => a =>\n (j => !s.has(j) && s.add(j))(JSON.stringify(a))\n )(new Set())\n );\n\n // Chunking the array into size of three\n return measurement.map(measurement => {\n return measurement.reduce((all, one, i) => {\n const ch = Math.floor(i / 3);\n all[ch] = [].concat(all[ch] || [], one);\n return all;\n }, []);\n });\n }\n\n static getTID300RepresentationArguments(scoord3d) {\n if (scoord3d.graphicType !== \"Ellipse\") {\n throw new Error(\"We expected a Ellipse graphicType\");\n }\n\n const points = scoord3d.graphicData;\n const lengths = 1;\n\n return { points, lengths };\n }\n}\n\nEllipse.graphicType = \"ELLIPSE\";\nEllipse.toolType = \"Ellipse\";\nEllipse.utilityToolType = \"Ellipse\";\nEllipse.TID300Representation = TID300Ellipse;\n\nMeasurementReport.registerTool(Ellipse);\n\nexport default Ellipse;\n","import MeasurementReport from \"./MeasurementReport.js\";\nimport Polyline from \"./Polyline.js\";\nimport Polygon from \"./Polygon.js\";\nimport Point from \"./Point.js\";\nimport Circle from \"./Circle.js\";\nimport Ellipse from \"./Ellipse.js\";\n\nconst DICOMMicroscopyViewer = {\n Polyline,\n Polygon,\n Point,\n Circle,\n Ellipse,\n MeasurementReport\n};\n\nexport default DICOMMicroscopyViewer;\n","import Cornerstone from \"./Cornerstone/index.js\";\nimport Cornerstone3D from \"./Cornerstone3D/index.js\";\nimport VTKjs from \"./VTKjs/index.js\";\nimport DICOMMicroscopyViewer from \"./DICOMMicroscopyViewer/\";\n\nconst adapters = {\n Cornerstone,\n Cornerstone3D,\n VTKjs,\n DICOMMicroscopyViewer\n};\n\nexport default adapters;\n","import TID1500MeasurementReport from \"./TID1500MeasurementReport.js\";\nimport TID1501MeasurementGroup from \"./TID1501MeasurementGroup.js\";\n\nconst TID1500 = {\n TID1500MeasurementReport,\n TID1501MeasurementGroup\n};\n\nexport { TID1500MeasurementReport, TID1501MeasurementGroup };\n\nexport default TID1500;\n","import OpenPolyline from \"./OpenPolyline.js\";\nimport unit2CodingValue from \"./unit2CodingValue.js\";\n\nexport default class Calibration extends OpenPolyline {\n getPoints() {\n const { point1, point2 } = this.props;\n return [point1, point2];\n }\n\n getConceptNameCodeSequence() {\n return {\n CodeValue: \"102304005\",\n CodingSchemeDesignator: \"SCT\",\n CodeMeaning: \"Calibration Ruler\"\n };\n }\n\n getMeasuredValueSequence() {\n const { distance, unit = \"mm\" } = this.props;\n return {\n MeasurementUnitsCodeSequence: unit2CodingValue(unit),\n NumericValue: distance\n };\n }\n}\n","/**\n * Converts a Uint8Array to a String.\n * @param {Uint8Array} array that should be converted\n * @param {Number} offset array offset in case only subset of array items should be extracted (default: 0)\n * @param {Number} limit maximum number of array items that should be extracted (defaults to length of array)\n * @returns {String}\n */\nfunction uint8ArrayToString(arr, offset, limit) {\n offset = offset || 0;\n limit = limit || arr.length - offset;\n let str = \"\";\n for (let i = offset; i < offset + limit; i++) {\n str += String.fromCharCode(arr[i]);\n }\n return str;\n}\n\n/**\n * Converts a String to a Uint8Array.\n * @param {String} str string that should be converted\n * @returns {Uint8Array}\n */\nfunction stringToUint8Array(str) {\n const arr = new Uint8Array(str.length);\n for (let i = 0, j = str.length; i < j; i++) {\n arr[i] = str.charCodeAt(i);\n }\n return arr;\n}\n\n/**\n * Identifies the boundary in a multipart/related message header.\n * @param {String} header message header\n * @returns {String} boundary\n */\nfunction identifyBoundary(header) {\n const parts = header.split(\"\\r\\n\");\n\n for (let i = 0; i < parts.length; i++) {\n if (parts[i].substr(0, 2) === \"--\") {\n return parts[i];\n }\n }\n}\n\n/**\n * Checks whether a given token is contained by a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be present\n * @param {Number} offset offset in message content from where search should start\n * @returns {Boolean} whether message contains token at offset\n */\nfunction containsToken(message, token, offset = 0) {\n if (offset + token.length > message.length) {\n return false;\n }\n\n let index = offset;\n for (let i = 0; i < token.length; i++) {\n if (token[i] !== message[index++]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Finds a given token in a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be found\n * @param {Number} offset message body offset from where search should start\n * @returns {Boolean} whether message has a part at given offset or not\n */\nfunction findToken(message, token, offset = 0, maxSearchLength) {\n let searchLength = message.length;\n if (maxSearchLength) {\n searchLength = Math.min(offset + maxSearchLength, message.length);\n }\n\n for (let i = offset; i < searchLength; i++) {\n // If the first value of the message matches\n // the first value of the token, check if\n // this is the full token.\n if (message[i] === token[0]) {\n if (containsToken(message, token, i)) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * @typedef {Object} MultipartEncodedData\n * @property {ArrayBuffer} data The encoded Multipart Data\n * @property {String} boundary The boundary used to divide pieces of the encoded data\n */\n\n/**\n * Encode one or more DICOM datasets into a single body so it can be\n * sent using the Multipart Content-Type.\n *\n * @param {ArrayBuffer[]} datasets Array containing each file to be encoded in the multipart body, passed as ArrayBuffers.\n * @param {String} [boundary] Optional string to define a boundary between each part of the multipart body. If this is not specified, a random GUID will be generated.\n * @return {MultipartEncodedData} The Multipart encoded data returned as an Object. This contains both the data itself, and the boundary string used to divide it.\n */\nfunction multipartEncode(\n datasets,\n boundary = guid(),\n contentType = \"application/dicom\"\n) {\n const contentTypeString = `Content-Type: ${contentType}`;\n const header = `\\r\\n--${boundary}\\r\\n${contentTypeString}\\r\\n\\r\\n`;\n const footer = `\\r\\n--${boundary}--`;\n const headerArray = stringToUint8Array(header);\n const footerArray = stringToUint8Array(footer);\n const headerLength = headerArray.length;\n const footerLength = footerArray.length;\n\n let length = 0;\n\n // Calculate the total length for the final array\n const contentArrays = datasets.map(datasetBuffer => {\n const contentArray = new Uint8Array(datasetBuffer);\n const contentLength = contentArray.length;\n\n length += headerLength + contentLength + footerLength;\n\n return contentArray;\n });\n\n // Allocate the array\n const multipartArray = new Uint8Array(length);\n\n // Set the initial header\n multipartArray.set(headerArray, 0);\n\n // Write each dataset into the multipart array\n let position = 0;\n contentArrays.forEach(contentArray => {\n multipartArray.set(headerArray, position);\n multipartArray.set(contentArray, position + headerLength);\n\n position += headerLength + contentArray.length;\n });\n\n multipartArray.set(footerArray, position);\n\n return {\n data: multipartArray.buffer,\n boundary\n };\n}\n\n/**\n * Decode a Multipart encoded ArrayBuffer and return the components as an Array.\n *\n * @param {ArrayBuffer} response Data encoded as a 'multipart/related' message\n * @returns {Array} The content\n */\nfunction multipartDecode(response) {\n const message = new Uint8Array(response);\n\n /* Set a maximum length to search for the header boundaries, otherwise\n findToken can run for a long time\n */\n const maxSearchLength = 1000;\n\n // First look for the multipart mime header\n let separator = stringToUint8Array(\"\\r\\n\\r\\n\");\n let headerIndex = findToken(message, separator, 0, maxSearchLength);\n if (headerIndex === -1) {\n throw new Error(\"Response message has no multipart mime header\");\n }\n\n const header = uint8ArrayToString(message, 0, headerIndex);\n const boundaryString = identifyBoundary(header);\n if (!boundaryString) {\n throw new Error(\"Header of response message does not specify boundary\");\n }\n\n const boundary = stringToUint8Array(boundaryString);\n const components = [];\n\n let offset = headerIndex + separator.length;\n\n // Loop until we cannot find any more boundaries\n let boundaryIndex;\n\n while (boundaryIndex !== -1) {\n // Search for the next boundary in the message, starting\n // from the current offset position\n boundaryIndex = findToken(message, boundary, offset);\n\n // If no further boundaries are found, stop here.\n if (boundaryIndex === -1) {\n break;\n }\n\n // Extract data from response message, excluding \"\\r\\n\"\n const spacingLength = 2;\n const length = boundaryIndex - offset - spacingLength;\n const data = response.slice(offset, offset + length);\n\n // Add the data to the array of results\n components.push(data);\n\n // find the end of the boundary\n var boundaryEnd = findToken(\n message,\n separator,\n boundaryIndex + 1,\n maxSearchLength\n );\n if (boundaryEnd === -1) break;\n // Move the offset to the end of the identified boundary\n offset = boundaryEnd + separator.length;\n }\n\n return components;\n}\n\n/**\n * Create a random GUID\n *\n * @return {string}\n */\nfunction guid() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n }\n return (\n s4() +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n s4() +\n s4()\n );\n}\n\nconst message = {\n containsToken: containsToken,\n findToken: findToken,\n identifyBoundary: identifyBoundary,\n uint8ArrayToString: uint8ArrayToString,\n stringToUint8Array: stringToUint8Array,\n multipartEncode: multipartEncode,\n multipartDecode: multipartDecode,\n guid: guid\n};\n\nexport default message;\n","/**\n * A filter for DicomMetadataListener that converts ArrayBuffer[] child values\n * into expanded listener.startObject([]) and value(fragment) calls.\n *\n * This is useful when you have compressed or fragmented pixel data delivered\n * as an array of ArrayBuffers and want to process each fragment individually\n * through the standard listener sequence pattern.\n *\n * @example\n * // Use as a filter in DicomMetadataListener constructor\n * const listener = new DicomMetadataListener(ArrayBufferExpanderFilter);\n * await reader.readFile({ listener });\n *\n * @example\n * // Combine with other filters\n * const listener = new DicomMetadataListener(\n * ArrayBufferExpanderFilter,\n * myCustomFilter\n * );\n */\nexport const ArrayBufferExpanderFilter = {\n /**\n * Filter method that intercepts value calls to expand ArrayBuffer[] into\n * individual fragments.\n *\n * When the value is an array where every element is an ArrayBuffer:\n * 1. Saves the current tag context\n * 2. Calls this.startObject([]) to create a new array context\n * 3. Calls this.value(fragment) for each ArrayBuffer in the array\n * 4. Calls this.pop() to get the resulting array\n * 5. Assigns that array to the tag's Value field\n *\n * This is necessary because when AsyncDicomReader delivers ArrayBuffer[]\n * directly to value(), it does not call startObject/pop around them, so we\n * must make those calls to properly represent the array structure.\n *\n * Otherwise, it passes the value through unchanged to the next filter.\n *\n * @param {Function} next - The next function in the filter chain\n * @param {*} v - The value to process\n */\n value(next, v) {\n // Check if the value is an array of ArrayBuffers\n if (\n Array.isArray(v) &&\n v.length > 0 &&\n v.every(\n item => item instanceof ArrayBuffer || ArrayBuffer.isView(item)\n )\n ) {\n // Expand the ArrayBuffer[] into the proper sequence\n // The reader hasn't called startObject for this, so we must\n\n // Save the current tag context\n const tagContext = this.current;\n\n // Call startObject with an array to create a new array context\n this.startObject([]);\n\n // Add each fragment\n for (const fragment of v) {\n this.value(fragment);\n }\n\n // Pop to get the resulting array structure\n const arrayResult = this.pop();\n\n // Now we're back in the tag context - assign the array to Value\n // The arrayResult will have a Value property with the fragments\n tagContext.dest.Value = arrayResult.Value || arrayResult;\n } else {\n // Pass through non-ArrayBuffer[] values unchanged\n next(v);\n }\n }\n};\n","import TID1500 from \"./TID1500\";\nimport TID300 from \"./TID300\";\nimport message from \"./Message\";\nimport addAccessors from \"./addAccessors\";\nimport dicomJson from \"./dicomJson\";\nimport * as orientation from \"./orientation\";\nimport * as compression from \"./compression/rleSingleSamplePerPixel\";\nimport {\n DicomMetadataListener,\n createInformationFilter\n} from \"./DicomMetadataListener\";\nimport { ArrayBufferExpanderFilter } from \"./ArrayBufferExpanderListener\";\nimport { toFloat } from \"./toFloat\";\nimport { toInt } from \"./toInt\";\n\nconst utilities = {\n TID1500,\n TID300,\n message,\n addAccessors,\n orientation,\n compression,\n dicomJson,\n DicomMetadataListener,\n ArrayBufferExpanderFilter,\n toFloat,\n toInt,\n createInformationFilter\n};\n\nexport default utilities;\nexport { utilities };\n","import TID300Measurement from \"./TID300Measurement.js\";\nimport Point from \"./Point.js\";\nimport Length from \"./Length.js\";\nimport ArrowAnnotate from \"./ArrowAnnotate.js\";\nimport CobbAngle from \"./CobbAngle\";\nimport Bidirectional from \"./Bidirectional.js\";\nimport Polyline from \"./Polyline.js\";\nimport Polygon from \"./Polygon.js\";\nimport Ellipse from \"./Ellipse\";\nimport Circle from \"./Circle\";\nimport Calibration from \"./Calibration\";\nimport unit2CodingValue from \"./unit2CodingValue\";\n\n// To be implemented:\n// - Cornerstone Probe\n// Note: OHIF currently uses Cornerstone's 'dragProbe'. We need to add the regular Probe tool, which drops a single point.\n//\n// Hierarchy\n// TID 1500 MeasurementReport\n// --TID 1501 Measurement Group\n// ---Measurement Group (DCM 125007)\n// ----TID 300 Measurement\n// ------SCOORD. Graphic Type: POINT\n//\n//\n// - Cornerstone Ellipse:\n//\n// Should specify the Mean Modality Pixel Value measured in whatever units the image is in\n// Should specify the Standard Deviation Modality Pixel Value measured in whatever units the image is in\n//\n//\n// - Cornerstone Rectangle ROI\n//\n// Hierarchy\n// TID 1500 MeasurementReport\n// --TID 1501 Measurement Group\n// ---Measurement Group (DCM 125007)\n// ----TID 300 Measurement\n// ------SCOORD. Graphic Type: POLYLINE\n// ------ Use concept corresponding to Rectangle measurement\n//\n// http://dicom.nema.org/medical/dicom/current/output/html/part16.html#sect_TID_4019\n//\n// OR\n// Note: This should be the same as a Freehand ROI, more or less. We add a TID 4019: Algorithm Identification flag to specify that this was created (and should be rehydrated) into a Rectangle ROI.\n// TODO: Should we use a Derivation instead? http://dicom.nema.org/medical/dicom/current/output/html/part16.html#DCM_121401\n// Should specify the Area measured in mmˆ2, including the units in UCUM\n// Should specify the Mean Modality Pixel Value measured in whatever units the image is in\n// Should specify the Standard Deviation Modality Pixel Value measured in whatever units the image is in\n//\n//\n// - Cornerstone Simple Angle tool\n//\n// Hierarchy\n// TID 1500 MeasurementReport\n// --TID 1501 Measurement Group\n// ---Measurement Group (DCM 125007)\n// ----TID 300 Measurement\n// ------SCOORD. Graphic Type: POLYLINE\n// (ftp://dicom.nema.org/MEDICAL/dicom/current/output/chtml/part03/sect_C.10.5.html)\n// ----TID 300 Measurement\n// ------SCOORD. Graphic Type: POLYLINE\n// (ftp://dicom.nema.org/MEDICAL/dicom/current/output/chtml/part03/sect_C.10.5.html)\n//\n// ------ Use concept corresponding to Angle measurement\n//\n// Two lines specify the angle\n// Should specify the Angle measured in Degrees, including the units in UCUM\n//\nconst TID300 = {\n TID300Measurement,\n Point,\n Length,\n ArrowAnnotate,\n CobbAngle,\n Bidirectional,\n Polyline,\n Polygon,\n Ellipse,\n Circle,\n Calibration,\n unit2CodingValue\n};\n\nexport { TID300Measurement, Length };\n\nexport default TID300;\n","const _value = Symbol(\"value\");\nconst _meaning = Symbol(\"meaning\");\nconst _schemeDesignator = Symbol(\"schemeDesignator\");\nconst _schemeVersion = Symbol(\"schemeVersion\");\n\nclass Code {\n constructor(options) {\n this[_value] = options.value;\n this[_meaning] = options.meaning;\n this[_schemeDesignator] = options.schemeDesignator;\n this[_schemeVersion] = options.schemeVersion || null;\n }\n\n get value() {\n return this[_value];\n }\n\n get meaning() {\n return this[_meaning];\n }\n\n get schemeDesignator() {\n return this[_schemeDesignator];\n }\n\n get schemeVersion() {\n return this[_schemeVersion];\n }\n}\n\nclass CodedConcept {\n constructor(options) {\n if (options.value === undefined) {\n throw new Error(\"Option 'value' is required for CodedConcept.\");\n }\n if (options.meaning === undefined) {\n throw new Error(\"Option 'meaning' is required for CodedConcept.\");\n }\n if (options.schemeDesignator === undefined) {\n throw new Error(\n \"Option 'schemeDesignator' is required for CodedConcept.\"\n );\n }\n this.CodeValue = options.value;\n this.CodeMeaning = options.meaning;\n this.CodingSchemeDesignator = options.schemeDesignator;\n if (\"schemeVersion\" in options) {\n this.CodingSchemeVersion = options.schemeVersion;\n }\n }\n\n equals(other) {\n if (\n other.value === this.value &&\n other.schemeDesignator === this.schemeDesignator\n ) {\n if (other.schemeVersion && this.schemeVersion) {\n return other.schemeVersion === this.schemeVersion;\n }\n return true;\n }\n return false;\n }\n\n get value() {\n return this.CodeValue;\n }\n\n get meaning() {\n return this.CodeMeaning;\n }\n\n get schemeDesignator() {\n return this.CodingSchemeDesignator;\n }\n\n get schemeVersion() {\n return this.CodingSchemeVersion;\n }\n}\n\nexport { Code, CodedConcept };\n","import { CodedConcept } from \"./coding.js\";\nimport addAccessors from \"../utilities/addAccessors.js\";\n\nconst ValueTypes = {\n CODE: \"CODE\",\n COMPOSITE: \"COMPOSITE\",\n CONTAINER: \"CONTAINER\",\n DATE: \"DATE\",\n DATETIME: \"DATETIME\",\n IMAGE: \"IMAGE\",\n NUM: \"NUM\",\n PNAME: \"PNAME\",\n SCOORD: \"SCOORD\",\n SCOORD3D: \"SCOORD3D\",\n TCOORD: \"TCOORD\",\n TEXT: \"TEXT\",\n TIME: \"TIME\",\n UIDREF: \"UIDREF\",\n WAVEFORM: \"WAVEFORM\"\n};\nObject.freeze(ValueTypes);\n\nconst GraphicTypes = {\n CIRCLE: \"CIRCLE\",\n ELLIPSE: \"ELLIPSE\",\n ELLIPSOID: \"ELLIPSOID\",\n MULTIPOINT: \"MULTIPOINT\",\n POINT: \"POINT\",\n POLYLINE: \"POLYLINE\"\n};\nObject.freeze(GraphicTypes);\n\nconst GraphicTypes3D = {\n ELLIPSE: \"ELLIPSE\",\n ELLIPSOID: \"ELLIPSOID\",\n MULTIPOINT: \"MULTIPOINT\",\n POINT: \"POINT\",\n POLYLINE: \"POLYLINE\",\n POLYGON: \"POLYGON\"\n};\nObject.freeze(GraphicTypes3D);\n\nconst TemporalRangeTypes = {\n BEGIN: \"BEGIN\",\n END: \"END\",\n MULTIPOINT: \"MULTIPOINT\",\n MULTISEGMENT: \"MULTISEGMENT\",\n POINT: \"POINT\",\n SEGMENT: \"SEGMENT\"\n};\nObject.freeze(TemporalRangeTypes);\n\nconst RelationshipTypes = {\n CONTAINS: \"CONTAINS\",\n HAS_ACQ_CONTENT: \"HAS ACQ CONTENT\",\n HAS_CONCEPT_MOD: \"HAS CONCEPT MOD\",\n HAS_OBS_CONTEXT: \"HAS OBS CONTEXT\",\n HAS_PROPERTIES: \"HAS PROPERTIES\",\n INFERRED_FROM: \"INFERRED FROM\",\n SELECTED_FROM: \"SELECTED FROM\"\n};\nObject.freeze(RelationshipTypes);\n\nconst PixelOriginInterpretations = {\n FRAME: \"FRAME\",\n VOLUME: \"VOLUME\"\n};\nObject.freeze(RelationshipTypes);\n\nfunction isFloat(n) {\n return n === +n && n !== (n | 0);\n}\n\nfunction zeroPad(value) {\n return (value > 9 ? \"\" : \"0\") + value;\n}\n\nfunction TM(date) {\n // %H%M%S.%f\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n return zeroPad(hours) + zeroPad(minutes) + zeroPad(seconds) + milliseconds;\n}\n\nfunction DA(date) {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n return year + zeroPad(month) + zeroPad(day);\n}\n\nfunction DT(date) {\n return DA(date) + TM(date);\n}\n\nclass ContentSequence extends Array {\n constructor(...args) {\n super(...args);\n }\n\n // filterBy(options) {\n // }\n}\n\nclass ContentItem {\n constructor(options) {\n if (options.name === undefined) {\n throw new Error(\"Option 'name' is required for ContentItem.\");\n }\n if (!(options.name instanceof CodedConcept)) {\n throw new Error(\"Option 'name' must have type CodedConcept.\");\n }\n this.ConceptNameCodeSequence = addAccessors([options.name]);\n if (options.valueType === undefined) {\n throw new Error(\"Option 'valueType' is required for ContentItem.\");\n }\n if (!(Object.values(ValueTypes).indexOf(options.valueType) !== -1)) {\n throw new Error(`Invalid value type ${options.valueType}`);\n }\n this.ValueType = options.valueType;\n if (options.relationshipType !== undefined) {\n if (\n !(\n Object.values(RelationshipTypes).indexOf(\n options.relationshipType\n ) !== -1\n )\n ) {\n throw new Error(\n `Invalid relationship type ${options.relationshipTypes}`\n );\n }\n this.RelationshipType = options.relationshipType;\n }\n // TODO: relationship type is required\n }\n\n // getContentItems(options) {\n // // TODO: filter by name, value type and relationship type\n // return this.ContentSequence;\n // }\n}\n\nclass CodeContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.CODE\n });\n if (options.value === undefined) {\n throw new Error(\"Option 'value' is required for CodeContentItem.\");\n }\n if (!(options.value instanceof CodedConcept)) {\n throw new Error(\"Option 'value' must have type CodedConcept.\");\n }\n this.ConceptCodeSequence = addAccessors([options.value]);\n }\n}\n\nclass TextContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.TEXT\n });\n if (options.value === undefined) {\n throw new Error(\"Option 'value' is required for TextContentItem.\");\n }\n if (\n !(\n typeof options.value === \"string\" ||\n options.value instanceof String\n )\n ) {\n throw new Error(\"Option 'value' must have type String.\");\n }\n this.TextValue = options.value;\n }\n}\n\nclass PNameContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.PNAME\n });\n if (options.value === undefined) {\n throw new Error(\"Option 'value' is required for PNameContentItem.\");\n }\n if (\n !(\n typeof options.value === \"string\" ||\n options.value instanceof String\n )\n ) {\n throw new Error(\"Option 'value' must have type String.\");\n }\n this.PersonName = options.value;\n }\n}\n\nclass TimeContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.TIME\n });\n if (options.value === undefined) {\n throw new Error(\"Option 'value' is required for TimeContentItem.\");\n }\n if (\n !(\n typeof options.value === \"object\" ||\n options.value instanceof Date\n )\n ) {\n throw new Error(\"Option 'value' must have type Date.\");\n }\n this.Time = TM(options.value);\n }\n}\n\nclass DateContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.DATE\n });\n if (options.value === undefined) {\n throw new Error(\"Option 'value' is required for DateContentItem.\");\n }\n if (\n !(\n typeof options.value === \"object\" ||\n options.value instanceof Date\n )\n ) {\n throw new Error(\"Option 'value' must have type Date.\");\n }\n this.Date = DA(options.value);\n }\n}\n\nclass DateTimeContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.DATETIME\n });\n if (options.value === undefined) {\n throw new Error(\n \"Option 'value' is required for DateTimeContentItem.\"\n );\n }\n if (\n !(\n typeof options.value === \"object\" ||\n options.value instanceof Date\n )\n ) {\n throw new Error(\"Option 'value' must have type Date.\");\n }\n this.DateTime = DT(options.value);\n }\n}\n\nclass UIDRefContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.UIDREF\n });\n if (options.value === undefined) {\n throw new Error(\n \"Option 'value' is required for UIDRefContentItem.\"\n );\n }\n if (\n !(\n typeof options.value === \"string\" ||\n options.value instanceof String\n )\n ) {\n throw new Error(\"Option 'value' must have type String.\");\n }\n this.UID = options.value;\n }\n}\n\nclass NumContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.NUM\n });\n if (options.value !== undefined) {\n if (\n !(\n typeof options.value === \"number\" ||\n options.value instanceof Number\n )\n ) {\n throw new Error(\"Option 'value' must have type Number.\");\n }\n if (options.unit === undefined) {\n throw new Error(\n \"Option 'unit' is required for NumContentItem with 'value'.\"\n );\n }\n if (!(options.unit instanceof CodedConcept)) {\n throw new Error(\"Option 'unit' must have type CodedConcept.\");\n }\n const item = {};\n item.NumericValue = options.value;\n if (isFloat(options.value)) {\n item.FloatingPointValue = options.value;\n }\n item.MeasurementUnitsCodeSequence = [options.unit];\n this.MeasuredValueSequence = [item];\n } else if (options.qualifier !== undefined) {\n if (!(options.qualifier instanceof CodedConcept)) {\n throw new Error(\n \"Option 'qualifier' must have type CodedConcept.\"\n );\n }\n this.NumericValueQualifierCodeSequence = [options.qualifier];\n } else {\n throw new Error(\n \"Either option 'value' or 'qualifier' is required for NumContentItem.\"\n );\n }\n }\n}\n\nclass ContainerContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.CONTAINER\n });\n if (options.isContentContinuous !== undefined) {\n this.ContinuityOfContent = \"CONTINUOUS\";\n } else {\n this.ContinuityOfContent = \"SEPARATE\";\n }\n if (options.templateID !== undefined) {\n if (\n !(\n typeof options.templateID === \"string\" ||\n options.templateID instanceof String\n )\n ) {\n throw new Error(\"Option 'templateID' must have type String.\");\n }\n const item = {};\n item.MappingResource = \"DCMR\";\n item.TemplateIdentifier = options.templateID;\n this.ContentTemplateSequence = [item];\n }\n }\n}\n\nclass CompositeContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.COMPOSITE\n });\n if (options.referencedSOPClassUID === undefined) {\n throw new Error(\n \"Option 'referencedSOPClassUID' is required for CompositeContentItem.\"\n );\n }\n if (options.referencedSOPInstanceUID === undefined) {\n throw new Error(\n \"Option 'referencedSOPInstanceUID' is required for CompositeContentItem.\"\n );\n }\n if (\n !(\n typeof options.referencedSOPClassUID === \"string\" ||\n options.referencedSOPClassUID instanceof String\n )\n ) {\n throw new Error(\n \"Option 'referencedSOPClassUID' must have type String.\"\n );\n }\n if (\n !(\n typeof options.referencedSOPInstanceUID === \"string\" ||\n options.referencedSOPInstanceUID instanceof String\n )\n ) {\n throw new Error(\n \"Option 'referencedSOPInstanceUID' must have type String.\"\n );\n }\n const item = {};\n item.ReferencedSOPClassUID = options.referencedSOPClassUID;\n item.ReferencedSOPInstanceUID = options.referencedSOPInstanceUID;\n this.ReferenceSOPSequence = [item];\n }\n}\n\nclass ImageContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.IMAGE\n });\n if (options.referencedSOPClassUID === undefined) {\n throw new Error(\n \"Option 'referencedSOPClassUID' is required for ImageContentItem.\"\n );\n }\n if (options.referencedSOPInstanceUID === undefined) {\n throw new Error(\n \"Option 'referencedSOPInstanceUID' is required for ImageContentItem.\"\n );\n }\n if (\n !(\n typeof options.referencedSOPClassUID === \"string\" ||\n options.referencedSOPClassUID instanceof String\n )\n ) {\n throw new Error(\n \"Option 'referencedSOPClassUID' must have type String.\"\n );\n }\n if (\n !(\n typeof options.referencedSOPInstanceUID === \"string\" ||\n options.referencedSOPInstanceUID instanceof String\n )\n ) {\n throw new Error(\n \"Option 'referencedSOPInstanceUID' must have type String.\"\n );\n }\n const item = {};\n item.ReferencedSOPClassUID = options.referencedSOPClassUID;\n item.ReferencedSOPInstanceUID = options.referencedSOPInstanceUID;\n if (options.referencedFrameNumbers !== undefined) {\n if (\n !(\n typeof options.referencedFrameNumbers === \"object\" ||\n options.referencedFrameNumbers instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'referencedFrameNumbers' must have type Array.\"\n );\n }\n // FIXME: value multiplicity\n item.ReferencedFrameNumber = options.referencedFrameNumbers;\n }\n if (options.referencedFrameSegmentNumber !== undefined) {\n if (\n !(\n typeof options.referencedSegmentNumbers === \"object\" ||\n options.referencedSegmentNumbers instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'referencedSegmentNumbers' must have type Array.\"\n );\n }\n // FIXME: value multiplicity\n item.ReferencedSegmentNumber = options.referencedSegmentNumbers;\n }\n this.ReferencedSOPSequence = [item];\n }\n}\n\nclass ScoordContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.SCOORD\n });\n if (options.graphicType === undefined) {\n throw new Error(\n \"Option 'graphicType' is required for ScoordContentItem.\"\n );\n }\n if (\n !(\n typeof options.graphicType === \"string\" ||\n options.graphicType instanceof String\n )\n ) {\n throw new Error(\n \"Option 'graphicType' of ScoordContentItem must have type String.\"\n );\n }\n if (options.graphicData === undefined) {\n throw new Error(\n \"Option 'graphicData' is required for ScoordContentItem.\"\n );\n }\n if (\n !(\n typeof options.graphicData === \"object\" ||\n options.graphicData instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'graphicData' of ScoordContentItem must have type Array.\"\n );\n }\n if (Object.values(GraphicTypes).indexOf(options.graphicType) === -1) {\n throw new Error(`Invalid graphic type '${options.graphicType}'.`);\n }\n if (options.graphicData[0] instanceof Array) {\n options.graphicData = [].concat.apply([], options.graphicData);\n }\n\n this.GraphicType = options.graphicType;\n this.GraphicData = options.graphicData;\n\n options.pixelOriginInterpretation =\n options.pixelOriginInterpretation ||\n PixelOriginInterpretations.VOLUME;\n if (\n !(\n typeof options.pixelOriginInterpretation === \"string\" ||\n options.pixelOriginInterpretation instanceof String\n )\n ) {\n throw new Error(\n \"Option 'pixelOriginInterpretation' must have type String.\"\n );\n }\n if (\n Object.values(PixelOriginInterpretations).indexOf(\n options.pixelOriginInterpretation\n ) === -1\n ) {\n throw new Error(\n `Invalid pixel origin interpretation '${options.pixelOriginInterpretation}'.`\n );\n }\n if (options.fiducialUID !== undefined) {\n if (\n !(\n typeof options.fiducialUID === \"string\" ||\n options.fiducialUID instanceof String\n )\n ) {\n throw new Error(\"Option 'fiducialUID' must have type String.\");\n }\n this.FiducialUID = options.fiducialUID;\n }\n }\n}\n\nclass Scoord3DContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.SCOORD3D\n });\n if (options.graphicType === undefined) {\n throw new Error(\n \"Option 'graphicType' is required for Scoord3DContentItem.\"\n );\n }\n if (\n !(\n typeof options.graphicType === \"string\" ||\n options.graphicType instanceof String\n )\n ) {\n throw new Error(\"Option 'graphicType' must have type String.\");\n }\n if (options.graphicData === undefined) {\n throw new Error(\n \"Option 'graphicData' is required for Scoord3DContentItem.\"\n );\n }\n if (\n !(\n typeof options.graphicData === \"object\" ||\n options.graphicData instanceof Array\n )\n ) {\n throw new Error(\"Option 'graphicData' must have type Array.\");\n }\n if (Object.values(GraphicTypes3D).indexOf(options.graphicType) === -1) {\n throw new Error(`Invalid graphic type '${options.graphicType}'.`);\n }\n if (options.graphicData[0] instanceof Array) {\n options.graphicData = [].concat.apply([], options.graphicData);\n }\n this.GraphicType = options.graphicType;\n this.GraphicData = options.graphicData;\n if (options.frameOfReferenceUID === undefined) {\n throw new Error(\n \"Option 'frameOfReferenceUID' is required for Scoord3DContentItem.\"\n );\n }\n if (\n !(\n typeof options.frameOfReferenceUID === \"string\" ||\n options.frameOfReferenceUID instanceof String\n )\n ) {\n throw new Error(\n \"Option 'frameOfReferenceUID' must have type String.\"\n );\n }\n this.ReferencedFrameOfReferenceUID = options.frameOfReferenceUID;\n if (\"fiducialUID\" in options) {\n if (\n !(\n typeof options.fiducialUID === \"string\" ||\n options.fiducialUID instanceof String\n )\n ) {\n throw new Error(\"Option 'fiducialUID' must have type String.\");\n }\n this.FiducialUID = options.fiducialUID;\n }\n }\n}\n\nclass TcoordContentItem extends ContentItem {\n constructor(options) {\n super({\n name: options.name,\n relationshipType: options.relationshipType,\n valueType: ValueTypes.TCOORD\n });\n if (options.temporalRangeType === undefined) {\n throw new Error(\n \"Option 'temporalRangeType' is required for TcoordContentItem.\"\n );\n }\n if (\n Object.values(TemporalRangeTypes).indexOf(\n options.temporalRangeType\n ) === -1\n ) {\n throw new Error(\n `Invalid temporal range type '${options.temporalRangeType}'.`\n );\n }\n if (options.referencedSamplePositions === undefined) {\n if (\n !(\n typeof options.referencedSamplePositions === \"object\" ||\n options.referencedSamplePositions instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'referencedSamplePositions' must have type Array.\"\n );\n }\n // TODO: ensure values are integers\n this.ReferencedSamplePositions = options.referencedSamplePositions;\n } else if (options.referencedTimeOffsets === undefined) {\n if (\n !(\n typeof options.referencedTimeOffsets === \"object\" ||\n options.referencedTimeOffsets instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'referencedTimeOffsets' must have type Array.\"\n );\n }\n // TODO: ensure values are floats\n this.ReferencedTimeOffsets = options.referencedTimeOffsets;\n } else if (options.referencedDateTime === undefined) {\n if (\n !(\n typeof options.referencedDateTime === \"object\" ||\n options.referencedDateTime instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'referencedDateTime' must have type Array.\"\n );\n }\n this.ReferencedDateTime = options.referencedDateTime;\n } else {\n throw new Error(\n \"One of the following options is required for TcoordContentItem: \" +\n \"'referencedSamplePositions', 'referencedTimeOffsets', or \" +\n \"'referencedDateTime'.\"\n );\n }\n }\n}\n\nexport {\n CodeContentItem,\n ContainerContentItem,\n ContentSequence,\n CompositeContentItem,\n DateContentItem,\n DateTimeContentItem,\n GraphicTypes,\n GraphicTypes3D,\n ImageContentItem,\n NumContentItem,\n PNameContentItem,\n PixelOriginInterpretations,\n RelationshipTypes,\n ScoordContentItem,\n Scoord3DContentItem,\n TcoordContentItem,\n TemporalRangeTypes,\n TextContentItem,\n TimeContentItem,\n UIDRefContentItem,\n ValueTypes\n};\n","import { CodedConcept } from \"./coding.js\";\nimport {\n CodeContentItem,\n CompositeContentItem,\n ContentSequence,\n GraphicTypes,\n GraphicTypes3D,\n ImageContentItem,\n NumContentItem,\n RelationshipTypes,\n ScoordContentItem,\n Scoord3DContentItem,\n UIDRefContentItem\n} from \"./valueTypes.js\";\n\nclass LongitudinalTemporalOffsetFromEvent extends NumContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"128740\",\n meaning: \"Longitudinal Temporal Offset from Event\",\n schemeDesignator: \"DCM\"\n }),\n value: options.value,\n unit: options.unit,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.ContentSequence = new ContentSequence();\n const item = new CodeContentItem({\n name: new CodedConcept({\n value: \"128741\",\n meaning: \"Longitudinal Temporal Event Type\",\n schemeDesignator: \"DCM\"\n }),\n value: options.eventType,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.ContentSequence.push(item);\n }\n}\n\nclass SourceImageForRegion extends ImageContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"121324\",\n meaning: \"Source Image\",\n schemeDesignator: \"DCM\"\n }),\n referencedSOPClassUID: options.referencedSOPClassUID,\n referencedSOPInstanceUID: options.referencedSOPInstanceUID,\n referencedFrameNumbers: options.referencedFrameNumbers,\n relationshipType: RelationshipTypes.SELECTED_FROM\n });\n }\n}\n\nclass SourceImageForSegmentation extends ImageContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"121233\",\n meaning: \"Source Image for Segmentation\",\n schemeDesignator: \"DCM\"\n }),\n referencedSOPClassUID: options.referencedSOPClassUID,\n referencedSOPInstanceUID: options.referencedSOPInstanceUID,\n referencedFrameNumbers: options.referencedFrameNumbers,\n relationshipType: RelationshipTypes.SELECTED_FROM\n });\n }\n}\n\nclass SourceSeriesForSegmentation extends UIDRefContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"121232\",\n meaning: \"Source Series for Segmentation\",\n schemeDesignator: \"DCM\"\n }),\n value: options.referencedSeriesInstanceUID,\n relationshipType: RelationshipTypes.CONTAINS\n });\n }\n}\n\nclass ImageRegion extends ScoordContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"111030\",\n meaning: \"Image Region\",\n schemeDesignator: \"DCM\"\n }),\n graphicType: options.graphicType,\n graphicData: options.graphicData,\n pixelOriginInterpretation: options.pixelOriginInterpretation,\n relationshipType: RelationshipTypes.CONTAINS\n });\n if (options.graphicType === GraphicTypes.MULTIPOINT) {\n throw new Error(\n \"Graphic type 'MULTIPOINT' is not valid for region.\"\n );\n }\n if (options.sourceImage === undefined) {\n throw Error(\"Option 'sourceImage' is required for ImageRegion.\");\n }\n if (\n !(\n options.sourceImage ||\n options.sourceImage instanceof SourceImageForRegion\n )\n ) {\n throw new Error(\n \"Option 'sourceImage' of ImageRegion must have type \" +\n \"SourceImageForRegion.\"\n );\n }\n this.ContentSequence = new ContentSequence();\n this.ContentSequence.push(options.sourceImage);\n }\n}\n\nclass ImageRegion3D extends Scoord3DContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"111030\",\n meaning: \"Image Region\",\n schemeDesignator: \"DCM\"\n }),\n graphicType: options.graphicType,\n graphicData: options.graphicData,\n frameOfReferenceUID: options.frameOfReferenceUID,\n relationshipType: RelationshipTypes.CONTAINS\n });\n if (options.graphicType === GraphicTypes3D.MULTIPOINT) {\n throw new Error(\n \"Graphic type 'MULTIPOINT' is not valid for region.\"\n );\n }\n if (options.graphicType === GraphicTypes3D.ELLIPSOID) {\n throw new Error(\n \"Graphic type 'ELLIPSOID' is not valid for region.\"\n );\n }\n }\n}\n\nclass VolumeSurface extends Scoord3DContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"121231\",\n meaning: \"Volume Surface\",\n schemeDesignator: \"DCM\"\n }),\n graphicType: options.graphicType,\n graphicData: options.graphicData,\n frameOfFeferenceUID: options.frameOfFeferenceUID,\n relationshipType: RelationshipTypes.CONTAINS\n });\n if (options.graphicType !== GraphicTypes3D.ELLIPSOID) {\n throw new Error(\n \"Graphic type for volume surface must be 'ELLIPSOID'.\"\n );\n }\n this.ContentSequence = new ContentSequence();\n if (options.sourceImages) {\n options.sourceImages.forEach(image => {\n if (!(image instanceof SourceImageForRegion)) {\n throw new Error(\n \"Items of option 'sourceImages' of VolumeSurface \" +\n \"must have type SourceImageForRegion.\"\n );\n }\n this.ContentSequence.push(image);\n });\n } else if (options.sourceSeries) {\n if (\n !(options.sourceSeries instanceof SourceSeriesForSegmentation)\n ) {\n throw new Error(\n \"Option 'sourceSeries' of VolumeSurface \" +\n \"must have type SourceSeriesForSegmentation.\"\n );\n }\n this.ContentSequence.push(options.sourceSeries);\n } else {\n throw new Error(\n \"One of the following two options must be provided: \" +\n \"'sourceImage' or 'sourceSeries'.\"\n );\n }\n }\n}\n\nclass ReferencedRealWorldValueMap extends CompositeContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"126100\",\n meaning: \"Real World Value Map used for measurement\",\n schemeDesignator: \"DCM\"\n }),\n referencedSOPClassUID: options.referencedSOPClassUID,\n referencedSOPInstanceUID: options.referencedSOPInstanceUID,\n relationshipType: RelationshipTypes.CONTAINS\n });\n }\n}\n\nclass FindingSite extends CodeContentItem {\n constructor(options) {\n super({\n name: new CodedConcept({\n value: \"363698007\",\n meaning: \"Finding Site\",\n schemeDesignator: \"SCT\"\n }),\n value: options.anatomicLocation,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.ContentSequence = new ContentSequence();\n if (options.laterality) {\n const item = new CodeContentItem({\n name: new CodedConcept({\n value: \"272741003\",\n meaning: \"Laterality\",\n schemeDesignator: \"SCT\"\n }),\n value: options.laterality,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.ContentSequence.push(item);\n }\n if (options.topographicalModifier) {\n const item = new CodeContentItem({\n name: new CodedConcept({\n value: \"106233006\",\n meaning: \"Topographical Modifier\",\n schemeDesignator: \"SCT\"\n }),\n value: options.topographicalModifier,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.ContentSequence.push(item);\n }\n }\n}\n\nclass ReferencedSegmentationFrame extends ContentSequence {\n constructor(options) {\n if (options.sopClassUID === undefined) {\n throw new Error(\n \"Option 'sopClassUID' is required for ReferencedSegmentationFrame.\"\n );\n }\n if (options.sopInstanceUID === undefined) {\n throw new Error(\n \"Option 'sopInstanceUID' is required for ReferencedSegmentationFrame.\"\n );\n }\n if (options.frameNumber === undefined) {\n throw new Error(\n \"Option 'frameNumber' is required for ReferencedSegmentationFrame.\"\n );\n }\n if (options.segmentNumber === undefined) {\n throw new Error(\n \"Option 'segmentNumber' is required for ReferencedSegmentationFrame.\"\n );\n }\n if (options.sourceImage === undefined) {\n throw new Error(\n \"Option 'sourceImage' is required for ReferencedSegmentationFrame.\"\n );\n }\n super();\n const segmentationItem = ImageContentItem({\n name: new CodedConcept({\n value: \"121214\",\n meaning: \"Referenced Segmentation Frame\",\n schemeDesignator: \"DCM\"\n }),\n referencedSOPClassUid: options.sopClassUid,\n referencedSOPInstanceUid: options.sopInstanceUid,\n referencedFrameNumber: options.frameNumber,\n referencedSegmentNumber: options.segmentNumber\n });\n this.push(segmentationItem);\n if (!(options.sourceImage instanceof SourceImageForSegmentation)) {\n throw new Error(\n \"Option 'sourceImage' must have type SourceImageForSegmentation.\"\n );\n }\n this.push(options.sourceImage);\n }\n}\n\nclass ReferencedSegmentation extends ContentSequence {\n constructor(options) {\n if (options.sopClassUID === undefined) {\n throw new Error(\n \"Option 'sopClassUID' is required for ReferencedSegmentation.\"\n );\n }\n if (options.sopInstanceUID === undefined) {\n throw new Error(\n \"Option 'sopInstanceUID' is required for ReferencedSegmentation.\"\n );\n }\n if (options.frameNumbers === undefined) {\n throw new Error(\n \"Option 'frameNumbers' is required for ReferencedSegmentation.\"\n );\n }\n if (options.segmentNumber === undefined) {\n throw new Error(\n \"Option 'segmentNumber' is required for ReferencedSegmentation.\"\n );\n }\n super();\n const segmentationItem = new ImageContentItem({\n name: new CodedConcept({\n value: \"121191\",\n meaning: \"Referenced Segment\",\n schemeDesignator: \"DCM\"\n }),\n referencedSOPClassUid: options.sopClassUid,\n referencedSOPInstanceUid: options.sopInstanceUid,\n referencedFrameNumber: options.frameNumbers,\n referencedSegmentNumber: options.segmentNumber\n });\n this.push(segmentationItem);\n if (options.sourceImages !== undefined) {\n options.sourceImages.forEach(image => {\n if (!image || !(image instanceof SourceImageForSegmentation)) {\n throw new Error(\n \"Items of option 'sourceImages' must have type \" +\n \"SourceImageForSegmentation.\"\n );\n }\n this.push(image);\n });\n } else if (options.sourceSeries !== undefined) {\n if (\n !(options.sourceSeries instanceof SourceSeriesForSegmentation)\n ) {\n throw new Error(\n \"Option 'sourceSeries' must have type SourceSeriesForSegmentation.\"\n );\n }\n this.push(options.sourceSeries);\n } else {\n throw new Error(\n \"One of the following two options must be provided: \" +\n \"'sourceImages' or 'sourceSeries'.\"\n );\n }\n }\n}\n\nexport {\n FindingSite,\n LongitudinalTemporalOffsetFromEvent,\n ReferencedRealWorldValueMap,\n ImageRegion,\n ImageRegion3D,\n ReferencedSegmentation,\n ReferencedSegmentationFrame,\n VolumeSurface,\n SourceImageForRegion,\n SourceImageForSegmentation,\n SourceSeriesForSegmentation\n};\n","import { Code, CodedConcept } from \"./coding.js\";\nimport {\n CodeContentItem,\n ContainerContentItem,\n ContentSequence,\n NumContentItem,\n PNameContentItem,\n RelationshipTypes,\n TextContentItem,\n UIDRefContentItem\n} from \"./valueTypes.js\";\nimport {\n FindingSite,\n ImageRegion,\n ImageRegion3D,\n ReferencedSegmentation,\n ReferencedSegmentationFrame,\n VolumeSurface,\n ReferencedRealWorldValueMap\n} from \"./contentItems.js\";\n\nclass Template extends ContentSequence {\n constructor(...args) {\n super(...args);\n }\n}\n\nclass Measurement extends Template {\n constructor(options) {\n super();\n const valueItem = new NumContentItem({\n name: options.name,\n value: options.value,\n unit: options.unit,\n qualifier: options.qualifier,\n relationshipType: RelationshipTypes.CONTAINS\n });\n valueItem.ContentSequence = new ContentSequence();\n if (options.trackingIdentifier === undefined) {\n throw new Error(\n \"Option 'trackingIdentifier' is required for Measurement.\"\n );\n }\n if (options.trackingIdentifier.constructor === TrackingIdentifier) {\n throw new Error(\n \"Option 'trackingIdentifier' must have type TrackingIdentifier.\"\n );\n }\n valueItem.ContentSequence.push(...options.trackingIdentifier);\n if (options.method !== undefined) {\n const methodItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"370129005\",\n meaning: \"Measurement Method\",\n schemeDesignator: \"SCT\"\n }),\n value: options.method,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n valueItem.ContentSequence.push(methodItem);\n }\n if (options.derivation !== undefined) {\n const derivationItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121401\",\n meaning: \"Derivation\",\n schemeDesignator: \"DCM\"\n }),\n value: options.derivation,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n valueItem.ContentSequence.push(derivationItem);\n }\n if (options.findingSites !== undefined) {\n if (\n !(\n typeof options.findingSites === \"object\" ||\n options.findingSites instanceof Array\n )\n ) {\n throw new Error(\"Option 'findingSites' must have type Array.\");\n }\n options.findingSites.forEach(site => {\n if (!site || !(site instanceof FindingSite)) {\n throw new Error(\n \"Items of option 'findingSites' must have type FindingSite.\"\n );\n }\n valueItem.ContentSequence.push(site);\n });\n }\n if (options.properties !== undefined) {\n if (!(options.properties instanceof MeasurementProperties)) {\n throw new Error(\n \"Option 'properties' must have type MeasurementProperties.\"\n );\n }\n valueItem.ContentSequence.push(...options.properties);\n }\n if (options.referencedRegions !== undefined) {\n if (\n !(\n typeof options.referencedRegions === \"object\" ||\n options.referencedRegions instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'referencedRegions' must have type Array.\"\n );\n }\n options.referencedRegions.forEach(region => {\n if (\n !region ||\n (!(region instanceof ImageRegion) &&\n !(region instanceof ImageRegion3D))\n ) {\n throw new Error(\n \"Items of option 'referencedRegion' must have type \" +\n \"ImageRegion or ImageRegion3D.\"\n );\n }\n valueItem.ContentSequence.push(region);\n });\n } else if (options.referencedVolume !== undefined) {\n if (!(options.referencedVolume instanceof VolumeSurface)) {\n throw new Error(\n \"Option 'referencedVolume' must have type VolumeSurface.\"\n );\n }\n valueItem.ContentSequence.push(options.referencedVolume);\n } else if (options.referencedSegmentation !== undefined) {\n if (\n !(\n options.referencedSegmentation instanceof\n ReferencedSegmentation ||\n options.referencedSegmentation instanceof\n ReferencedSegmentationFrame\n )\n ) {\n throw new Error(\n \"Option 'referencedSegmentation' must have type \" +\n \"ReferencedSegmentation or ReferencedSegmentationFrame.\"\n );\n }\n valueItem.ContentSequence.push(options.referencedSegmentation);\n }\n if (options.referencedRealWorldValueMap !== undefined) {\n if (\n !(\n options.referencedRealWorldValueMap instanceof\n ReferencedRealWorldValueMap\n )\n ) {\n throw new Error(\n \"Option 'referencedRealWorldValueMap' must have type \" +\n \"ReferencedRealWorldValueMap.\"\n );\n }\n valueItem.ContentSequence.push(options.referencedRealWorldValueMap);\n }\n if (options.algorithmId !== undefined) {\n if (!(options.algorithmId instanceof AlgorithmIdentification)) {\n throw new Error(\n \"Option 'algorithmId' must have type AlgorithmIdentification.\"\n );\n }\n valueItem.ContentSequence.push(...options.algorithmId);\n }\n this.push(valueItem);\n }\n}\n\nclass MeasurementProperties extends Template {\n constructor(options) {\n super();\n if (options.normality !== undefined) {\n const normalityItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121402\",\n schemeDesignator: \"DCM\",\n meaning: \"Normality\"\n }),\n value: options.normality,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(normalityItem);\n }\n if (options.measurementStatisticalProperties !== undefined) {\n if (\n !(\n options.measurementStatisticalProperties instanceof\n MeasurementStatisticalProperties\n )\n ) {\n throw new Error(\n \"Option 'measurmentStatisticalProperties' must have type \" +\n \"MeasurementStatisticalProperties.\"\n );\n }\n this.push(...options.measurementStatisticalProperties);\n }\n if (options.normalRangeProperties !== undefined) {\n if (\n !(\n options.normalRangeProperties instanceof\n NormalRangeProperties\n )\n ) {\n throw new Error(\n \"Option 'normalRangeProperties' must have type NormalRangeProperties.\"\n );\n }\n this.push(...options.normalRangeProperties);\n }\n if (options.levelOfSignificance !== undefined) {\n const levelOfSignificanceItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121403\",\n schemeDesignator: \"DCM\",\n meaning: \"Level of Significance\"\n }),\n value: options.levelOfSignificance,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(levelOfSignificanceItem);\n }\n if (options.selectionStatus !== undefined) {\n const selectionStatusItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121404\",\n schemeDesignator: \"DCM\",\n meaning: \"Selection Status\"\n }),\n value: options.selectionStatus,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(selectionStatusItem);\n }\n if (options.upperMeasurementUncertainty !== undefined) {\n const upperMeasurementUncertaintyItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"R-00364\",\n schemeDesignator: \"SRT\",\n meaning: \"Range of Upper Measurement Uncertainty\"\n }),\n value: options.upperMeasurementUncertainty,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(upperMeasurementUncertaintyItem);\n }\n if (options.lowerMeasurementUncertainty !== undefined) {\n const lowerMeasurementUncertaintyItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"R-00362\",\n schemeDesignator: \"SRT\",\n meaning: \"Range of Lower Measurement Uncertainty\"\n }),\n value: options.lowerMeasurementUncertainty,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(lowerMeasurementUncertaintyItem);\n }\n }\n}\n\nclass MeasurementStatisticalProperties extends Template {\n constructor(options) {\n super();\n if (options.values === undefined) {\n throw new Error(\n \"Option 'values' is required for MeasurementStatisticalProperties.\"\n );\n }\n if (\n !(\n typeof options.values === \"object\" ||\n options.values instanceof Array\n )\n ) {\n throw new Error(\"Option 'values' must have type Array.\");\n }\n options.values.forEach(value => {\n if (\n !options.concept ||\n !(options.concept instanceof NumContentItem)\n ) {\n throw new Error(\n \"Items of option 'values' must have type NumContentItem.\"\n );\n }\n this.push(value);\n });\n if (options.description !== undefined) {\n const descriptionItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121405\",\n schemeDesignator: \"DCM\",\n meaning: \"Population Description\"\n }),\n value: options.authority,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(descriptionItem);\n }\n if (options.authority !== undefined) {\n const authorityItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121406\",\n schemeDesignator: \"DCM\",\n meaning: \"Population Authority\"\n }),\n value: options.authority,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(authorityItem);\n }\n }\n}\n\nclass NormalRangeProperties extends Template {\n constructor(options) {\n super();\n if (options.values === undefined) {\n throw new Error(\n \"Option 'values' is required for NormalRangeProperties.\"\n );\n }\n if (\n !(\n typeof options.values === \"object\" ||\n options.values instanceof Array\n )\n ) {\n throw new Error(\"Option 'values' must have type Array.\");\n }\n options.values.forEach(value => {\n if (\n !options.concept ||\n !(options.concept instanceof NumContentItem)\n ) {\n throw new Error(\n \"Items of option 'values' must have type NumContentItem.\"\n );\n }\n this.push(value);\n });\n if (options.description !== undefined) {\n const descriptionItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121407\",\n schemeDesignator: \"DCM\",\n meaning: \"Normal Range Description\"\n }),\n value: options.authority,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(descriptionItem);\n }\n if (options.authority !== undefined) {\n const authorityItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121408\",\n schemeDesignator: \"DCM\",\n meaning: \"Normal Range Authority\"\n }),\n value: options.authority,\n relationshipType: RelationshipTypes.HAS_PROPERTIES\n });\n this.push(authorityItem);\n }\n }\n}\n\nclass ObservationContext extends Template {\n constructor(options) {\n super();\n if (options.observerPersonContext === undefined) {\n throw new Error(\n \"Option 'observerPersonContext' is required for ObservationContext.\"\n );\n }\n if (!(options.observerPersonContext instanceof ObserverContext)) {\n throw new Error(\n \"Option 'observerPersonContext' must have type ObserverContext\"\n );\n }\n this.push(...options.observerPersonContext);\n if (options.observerDeviceContext !== undefined) {\n if (!(options.observerDeviceContext instanceof ObserverContext)) {\n throw new Error(\n \"Option 'observerDeviceContext' must have type ObserverContext\"\n );\n }\n this.push(...options.observerDeviceContext);\n }\n if (options.subjectContext !== undefined) {\n if (!(options.subjectContext instanceof SubjectContext)) {\n throw new Error(\n \"Option 'subjectContext' must have type SubjectContext\"\n );\n }\n this.push(...options.subjectContext);\n }\n }\n}\n\nclass ObserverContext extends Template {\n constructor(options) {\n super();\n if (options.observerType === undefined) {\n throw new Error(\n \"Option 'observerType' is required for ObserverContext.\"\n );\n } else {\n if (\n !(\n options.observerType instanceof Code ||\n options.observerType instanceof CodedConcept\n )\n ) {\n throw new Error(\n \"Option 'observerType' must have type Code or CodedConcept.\"\n );\n }\n }\n const observerTypeItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121005\",\n meaning: \"Observer Type\",\n schemeDesignator: \"DCM\"\n }),\n value: options.observerType,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(observerTypeItem);\n if (options.observerIdentifyingAttributes === undefined) {\n throw new Error(\n \"Option 'observerIdentifyingAttributes' is required for ObserverContext.\"\n );\n }\n // FIXME\n const person = new CodedConcept({\n value: \"121006\",\n schemeDesignator: \"DCM\",\n meaning: \"Person\"\n });\n const device = new CodedConcept({\n value: \"121007\",\n schemeDesignator: \"DCM\",\n meaning: \"Device\"\n });\n if (person.equals(options.observerType)) {\n if (\n !(\n options.observerIdentifyingAttributes instanceof\n PersonObserverIdentifyingAttributes\n )\n ) {\n throw new Error(\n \"Option 'observerIdentifyingAttributes' must have type \" +\n \"PersonObserverIdentifyingAttributes for 'Person' observer type.\"\n );\n }\n } else if (device.equals(options.observerType)) {\n if (\n !(\n options.observerIdentifyingAttributes instanceof\n DeviceObserverIdentifyingAttributes\n )\n ) {\n throw new Error(\n \"Option 'observerIdentifyingAttributes' must have type \" +\n \"DeviceObserverIdentifyingAttributes for 'Device' observer type.\"\n );\n }\n } else {\n throw new Error(\n \"Option 'oberverType' must be either 'Person' or 'Device'.\"\n );\n }\n this.push(...options.observerIdentifyingAttributes);\n }\n}\n\nclass PersonObserverIdentifyingAttributes extends Template {\n constructor(options) {\n super();\n if (options.name === undefined) {\n throw new Error(\n \"Option 'name' is required for PersonObserverIdentifyingAttributes.\"\n );\n }\n const nameItem = new PNameContentItem({\n name: new CodedConcept({\n value: \"121008\",\n meaning: \"Person Observer Name\",\n schemeDesignator: \"DCM\"\n }),\n value: options.name,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(nameItem);\n if (options.loginName !== undefined) {\n const loginNameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"128774\",\n meaning: \"Person Observer's Login Name\",\n schemeDesignator: \"DCM\"\n }),\n value: options.loginName,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(loginNameItem);\n }\n if (options.organizationName !== undefined) {\n const organizationNameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121009\",\n meaning: \"Person Observer's Organization Name\",\n schemeDesignator: \"DCM\"\n }),\n value: options.organizationName,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(organizationNameItem);\n }\n if (options.roleInOrganization !== undefined) {\n const roleInOrganizationItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121010\",\n meaning: \"Person Observer's Role in the Organization\",\n schemeDesignator: \"DCM\"\n }),\n value: options.roleInOrganization,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(roleInOrganizationItem);\n }\n if (options.roleInProcedure !== undefined) {\n const roleInProcedureItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121011\",\n meaning: \"Person Observer's Role in this Procedure\",\n schemeDesignator: \"DCM\"\n }),\n value: options.roleInProcedure,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(roleInProcedureItem);\n }\n }\n}\n\nclass DeviceObserverIdentifyingAttributes extends Template {\n constructor(options) {\n super();\n if (options.uid === undefined) {\n throw new Error(\n \"Option 'uid' is required for DeviceObserverIdentifyingAttributes.\"\n );\n }\n const deviceObserverItem = new UIDRefContentItem({\n name: new CodedConcept({\n value: \"121012\",\n meaning: \"Device Observer UID\",\n schemeDesignator: \"DCM\"\n }),\n value: options.uid,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(deviceObserverItem);\n if (options.manufacturerName !== undefined) {\n const manufacturerNameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121013\",\n meaning: \"Device Observer Manufacturer\",\n schemeDesignator: \"DCM\"\n }),\n value: options.manufacturerName,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(manufacturerNameItem);\n }\n if (options.modelName !== undefined) {\n const modelNameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121015\",\n meaning: \"Device Observer Model Name\",\n schemeDesignator: \"DCM\"\n }),\n value: options.modelName,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(modelNameItem);\n }\n if (options.serialNumber !== undefined) {\n const serialNumberItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121016\",\n meaning: \"Device Observer Serial Number\",\n schemeDesignator: \"DCM\"\n }),\n value: options.serialNumber,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(serialNumberItem);\n }\n if (options.physicalLocation !== undefined) {\n const physicalLocationItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121017\",\n meaning:\n \"Device Observer Physical Location During Observation\",\n schemeDesignator: \"DCM\"\n }),\n value: options.physicalLocation,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(physicalLocationItem);\n }\n if (options.roleInProcedure !== undefined) {\n const roleInProcedureItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"113876\",\n meaning: \"Device Role in Procedure\",\n schemeDesignator: \"DCM\"\n }),\n value: options.roleInProcedure,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(roleInProcedureItem);\n }\n }\n}\n\nclass SubjectContext extends Template {\n constructor(options) {\n super();\n if (options.subjectClass === undefined) {\n throw new Error(\n \"Option 'subjectClass' is required for SubjectContext.\"\n );\n }\n if (options.subjectClassSpecificContext === undefined) {\n throw new Error(\n \"Option 'subjectClassSpecificContext' is required for SubjectContext.\"\n );\n }\n const subjectClassItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121024\",\n meaning: \"Subject Class\",\n schemeDesignator: \"DCM\"\n }),\n value: options.subjectClass,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(subjectClassItem);\n const fetus = new CodedConcept({\n value: \"121026 \",\n schemeDesignator: \"DCM\",\n meaning: \"Fetus\"\n });\n const specimen = new CodedConcept({\n value: \"121027\",\n schemeDesignator: \"DCM\",\n meaning: \"Specimen\"\n });\n const device = new CodedConcept({\n value: \"121192\",\n schemeDesignator: \"DCM\",\n meaning: \"Device Subject\"\n });\n if (fetus.equals(options.subjectClass)) {\n if (\n !(\n options.subjectClassSpecificContext instanceof\n SubjectContextFetus\n )\n ) {\n throw new Error(\n \"Option 'subjectClass' must have type \" +\n \"SubjectContextFetus for 'Fetus' subject class.\"\n );\n }\n } else if (specimen.equals(options.subjectClass)) {\n if (\n !(\n options.subjectClassSpecificContext instanceof\n SubjectContextSpecimen\n )\n ) {\n throw new Error(\n \"Option 'subjectClass' must have type \" +\n \"SubjectContextSpecimen for 'Specimen' subject class.\"\n );\n }\n } else if (device.equals(options.subjectClass)) {\n if (\n !(\n options.subjectClassSpecificContext instanceof\n SubjectContextDevice\n )\n ) {\n throw new Error(\n \"Option 'subjectClass' must have type \" +\n \"SubjectContextDevice for 'Device' subject class.\"\n );\n }\n } else {\n throw new Error(\n \"Option 'subjectClass' must be either 'Fetus', 'Specimen', or 'Device'.\"\n );\n }\n this.push(...options.subjectClassSpecificContext);\n }\n}\n\nclass SubjectContextFetus extends Template {\n constructor(options) {\n super();\n if (options.subjectID === undefined) {\n throw new Error(\n \"Option 'subjectID' is required for SubjectContextFetus.\"\n );\n }\n const subjectIdItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121030\",\n meaning: \"Subject ID\",\n schemeDesignator: \"DCM\"\n }),\n value: options.subjectID,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(subjectIdItem);\n }\n}\n\nclass SubjectContextSpecimen extends Template {\n constructor(options) {\n super();\n if (options.uid === undefined) {\n throw new Error(\n \"Option 'uid' is required for SubjectContextSpecimen.\"\n );\n }\n const specimenUidItem = new UIDRefContentItem({\n name: new CodedConcept({\n value: \"121039\",\n meaning: \"Specimen UID\",\n schemeDesignator: \"DCM\"\n }),\n value: options.uid,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(specimenUidItem);\n if (options.identifier !== undefined) {\n const specimenIdentifierItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121041\",\n meaning: \"Specimen Identifier\",\n schemeDesignator: \"DCM\"\n }),\n value: options.identifier,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(specimenIdentifierItem);\n }\n if (options.containerIdentifier !== undefined) {\n const containerIdentifierItem = new TextContentItem({\n name: new CodedConcept({\n value: \"111700\",\n meaning: \"Specimen Container Identifier\",\n schemeDesignator: \"DCM\"\n }),\n value: options.containerIdentifier,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(containerIdentifierItem);\n }\n if (options.specimenType !== undefined) {\n const specimenTypeItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"R-00254\",\n meaning: \"Specimen Type\",\n schemeDesignator: \"DCM\"\n }),\n value: options.specimenType,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(specimenTypeItem);\n }\n }\n}\n\nclass SubjectContextDevice extends Template {\n constructor(options) {\n super();\n if (options.name === undefined) {\n throw new Error(\n \"Option 'name' is required for SubjectContextDevice.\"\n );\n }\n const deviceNameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121193\",\n meaning: \"Device Subject Name\",\n schemeDesignator: \"DCM\"\n }),\n value: options.name,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(deviceNameItem);\n if (options.uid !== undefined) {\n const deviceUidItem = new UIDRefContentItem({\n name: new CodedConcept({\n value: \"121198\",\n meaning: \"Device Subject UID\",\n schemeDesignator: \"DCM\"\n }),\n value: options.uid,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(deviceUidItem);\n }\n if (options.manufacturerName !== undefined) {\n const manufacturerNameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121194\",\n meaning: \"Device Subject Manufacturer\",\n schemeDesignator: \"DCM\"\n }),\n value: options.manufacturerName,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(manufacturerNameItem);\n }\n if (options.modelName !== undefined) {\n const modelNameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121195\",\n meaning: \"Device Subject Model Name\",\n schemeDesignator: \"DCM\"\n }),\n value: options.modelName,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(modelNameItem);\n }\n if (options.serialNumber !== undefined) {\n const serialNumberItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121196\",\n meaning: \"Device Subject Serial Number\",\n schemeDesignator: \"DCM\"\n }),\n value: options.serialNumber,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(serialNumberItem);\n }\n if (options.physicalLocation !== undefined) {\n const physicalLocationItem = new TextContentItem({\n name: new CodedConcept({\n value: \"121197\",\n meaning:\n \"Device Subject Physical Location During Observation\",\n schemeDesignator: \"DCM\"\n }),\n value: options.physicalLocation,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(physicalLocationItem);\n }\n }\n}\n\nclass LanguageOfContentItemAndDescendants extends Template {\n constructor(options) {\n super();\n if (options.language === undefined) {\n options.language = new CodedConcept({\n value: \"en-US\",\n schemeDesignator: \"RFC5646\",\n meaning: \"English (United States)\"\n });\n }\n const languageItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121049\",\n meaning: \"Language of Content Item and Descendants\",\n schemeDesignator: \"DCM\"\n }),\n value: options.language,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.push(languageItem);\n }\n}\n\nclass _MeasurementsAndQualitatitiveEvaluations extends Template {\n constructor(options) {\n super();\n const groupItem = new ContainerContentItem({\n name: new CodedConcept({\n value: \"125007\",\n meaning: \"Measurement Group\",\n schemeDesignator: \"DCM\"\n }),\n relationshipType: RelationshipTypes.CONTAINS\n });\n groupItem.ContentSequence = new ContentSequence();\n if (options.trackingIdentifier === undefined) {\n throw new Error(\n \"Option 'trackingIdentifier' is required for measurements group.\"\n );\n }\n if (!(options.trackingIdentifier instanceof TrackingIdentifier)) {\n throw new Error(\n \"Option 'trackingIdentifier' must have type TrackingIdentifier.\"\n );\n }\n if (\n !Array.isArray(options.trackingIdentifier) ||\n options.trackingIdentifier.filter(\n item => item instanceof CodedConcept\n ).length < 2\n ) {\n throw new Error(\n \"Option 'trackingIdentifier' must include a human readable tracking \" +\n \"identifier and a tracking unique identifier.\"\n );\n }\n groupItem.ContentSequence.push(...options.trackingIdentifier);\n if (options.session !== undefined) {\n const sessionItem = new TextContentItem({\n name: new CodedConcept({\n value: \"C67447\",\n meaning: \"Activity Session\",\n schemeDesignator: \"NCIt\"\n }),\n value: options.session,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n groupItem.ContentSequence.push(sessionItem);\n }\n if (options.findingType !== undefined) {\n const findingTypeItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121071\",\n meaning: \"Finding\",\n schemeDesignator: \"DCM\"\n }),\n value: options.findingType,\n relationshipType: RelationshipTypes.CONTAINS\n });\n groupItem.ContentSequence.push(findingTypeItem);\n }\n if (options.timePointContext !== undefined) {\n if (!(options.timePointContext instanceof TimePointContext)) {\n throw new Error(\n \"Option 'timePointContext' must have type TimePointContext.\"\n );\n }\n groupItem.ContentSequence.push(...options.timePointContext);\n }\n if (options.referencedRealWorldValueMap !== undefined) {\n if (\n !(\n options.referencedRealWorldValueMap instanceof\n ReferencedRealWorldValueMap\n )\n ) {\n throw new Error(\n \"Option 'referencedRealWorldValleMap' must have type \" +\n \"ReferencedRealWorldValueMap.\"\n );\n }\n groupItem.ContentSequence.push(options.referencedRealWorldValueMap);\n }\n if (options.measurements !== undefined) {\n if (\n !(\n typeof options.measurements === \"object\" ||\n options.measurements instanceof Array\n )\n ) {\n throw new Error(\"Option 'measurements' must have type Array.\");\n }\n options.measurements.forEach(measurement => {\n console.log(measurement);\n if (!measurement || !(measurement instanceof NumContentItem)) {\n throw new Error(\n \"Items of option 'measurement' must have type NumContentItem.\"\n );\n }\n groupItem.ContentSequence.push(measurement);\n });\n }\n if (options.qualitativeEvaluations !== undefined) {\n if (\n !(\n typeof options.qualitativeEvaluations === \"object\" ||\n options.qualitativeEvaluations instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'qualitativeEvaluations' must have type Array.\"\n );\n }\n options.qualitativeEvaluations.forEach(evaluation => {\n if (\n !(\n evaluation instanceof CodeContentItem ||\n evaluation instanceof TextContentItem\n )\n ) {\n throw new Error(\n \"Items of option 'qualitativeEvaluations' must have type \" +\n \"CodeContentItem or TextContentItem.\"\n );\n }\n groupItem.ContentSequence.push(evaluation);\n });\n }\n this.push(groupItem);\n }\n}\n\nclass _ROIMeasurementsAndQualitativeEvaluations extends _MeasurementsAndQualitatitiveEvaluations {\n constructor(options) {\n super({\n trackingIdentifier: options.trackingIdentifier,\n timePointContext: options.timePointContext,\n findingType: options.findingType,\n session: options.session,\n measurements: options.measurements,\n qualitativeEvaluations: options.qualitativeEvaluations\n });\n const groupItem = this[0];\n const wereReferencesProvided = [\n options.referencedRegions !== undefined,\n options.referencedVolume !== undefined,\n options.referencedSegmentation !== undefined\n ];\n const numReferences = wereReferencesProvided.reduce((a, b) => a + b);\n if (numReferences === 0) {\n throw new Error(\n \"One of the following options must be provided: \" +\n \"'referencedRegions', 'referencedVolume', or \" +\n \"'referencedSegmentation'.\"\n );\n } else if (numReferences > 1) {\n throw new Error(\n \"Only one of the following options should be provided: \" +\n \"'referencedRegions', 'referencedVolume', or \" +\n \"'referencedSegmentation'.\"\n );\n }\n if (options.referencedRegions !== undefined) {\n if (\n !(\n typeof options.referencedRegions === \"object\" ||\n options.referencedRegions instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'referencedRegions' must have type Array.\"\n );\n }\n if (options.referencedRegions.length === 0) {\n throw new Error(\n \"Option 'referencedRegion' must have non-zero length.\"\n );\n }\n options.referencedRegions.forEach(region => {\n if (\n !region ||\n (!(region instanceof ImageRegion) &&\n !(region instanceof ImageRegion3D))\n ) {\n throw new Error(\n \"Items of option 'referencedRegion' must have type \" +\n \"ImageRegion or ImageRegion3D.\"\n );\n }\n groupItem.ContentSequence.push(region);\n });\n } else if (options.referencedVolume !== undefined) {\n if (!(options.referencedVolume instanceof VolumeSurface)) {\n throw new Error(\n \"Items of option 'referencedVolume' must have type VolumeSurface.\"\n );\n }\n groupItem.ContentSequence.push(options.referencedVolume);\n } else if (options.referencedSegmentation !== undefined) {\n if (\n !(\n options.referencedSegmentation instanceof\n ReferencedSegmentation ||\n options.referencedSegmentation instanceof\n ReferencedSegmentationFrame\n )\n ) {\n throw new Error(\n \"Option 'referencedSegmentation' must have type \" +\n \"ReferencedSegmentation or ReferencedSegmentationFrame.\"\n );\n }\n groupItem.ContentSequence.push(options.referencedSegmentation);\n }\n this[0] = groupItem;\n }\n}\n\nclass PlanarROIMeasurementsAndQualitativeEvaluations extends _ROIMeasurementsAndQualitativeEvaluations {\n constructor(options) {\n const wereReferencesProvided = [\n options.referencedRegion !== undefined,\n options.referencedSegmentation !== undefined\n ];\n const numReferences = wereReferencesProvided.reduce((a, b) => a + b);\n if (numReferences === 0) {\n throw new Error(\n \"One of the following options must be provided: \" +\n \"'referencedRegion', 'referencedSegmentation'.\"\n );\n } else if (numReferences > 1) {\n throw new Error(\n \"Only one of the following options should be provided: \" +\n \"'referencedRegion', 'referencedSegmentation'.\"\n );\n }\n super({\n trackingIdentifier: options.trackingIdentifier,\n referencedRegions: [options.referencedRegion],\n referencedSegmentation: options.referencedSegmentation,\n referencedRealWorldValueMap: options.referencedRealWorldValueMap,\n timePointContext: options.timePointContext,\n findingType: options.findingType,\n session: options.session,\n measurements: options.measurements,\n qualitativeEvaluations: options.qualitativeEvaluations\n });\n }\n}\n\nclass VolumetricROIMeasurementsAndQualitativeEvaluations extends _ROIMeasurementsAndQualitativeEvaluations {\n constructor(options) {\n super({\n trackingIdentifier: options.trackingIdentifier,\n referencedRegions: options.referencedRegions,\n referencedSegmentation: options.referencedSegmentation,\n referencedRealWorldValueMap: options.referencedRealWorldValueMap,\n timePointContext: options.timePointContext,\n findingType: options.findingType,\n session: options.session,\n measurements: options.measurements,\n qualitativeEvaluations: options.qualitativeEvaluations\n });\n }\n}\n\nclass MeasurementsDerivedFromMultipleROIMeasurements extends Template {\n constructor(options) {\n super();\n if (options.derivation === undefined) {\n throw new Error(\n \"Option 'derivation' is required for \" +\n \"MeasurementsDerivedFromMultipleROIMeasurements.\"\n );\n }\n // FIXME\n const valueItem = new NumContentItem({\n name: options.derivation\n });\n valueItem.ContentSequence = new ContentSequence();\n if (options.measurementGroups === undefined) {\n throw new Error(\n \"Option 'measurementGroups' is required for \" +\n \"MeasurementsDerivedFromMultipleROIMeasurements.\"\n );\n }\n if (\n !(\n typeof options.measurementGroups === \"object\" ||\n options.measurementGroups instanceof Array\n )\n ) {\n throw new Error(\"Option 'measurementGroups' must have type Array.\");\n }\n options.measurementGroups.forEach(group => {\n if (\n !group ||\n (!(\n group instanceof\n PlanarROIMeasurementsAndQualitativeEvaluations\n ) &&\n !(\n group instanceof\n VolumetricROIMeasurementsAndQualitativeEvaluations\n ))\n ) {\n throw new Error(\n \"Items of option 'measurementGroups' must have type \" +\n \"PlanarROIMeasurementsAndQualitativeEvaluations or \" +\n \"VolumetricROIMeasurementsAndQualitativeEvaluations.\"\n );\n }\n group[0].RelationshipType = \"R-INFERRED FROM\";\n valueItem.ContentSequence.push(...group);\n });\n if (options.measurementProperties !== undefined) {\n if (\n !(\n options.measurementProperties instanceof\n MeasurementProperties\n )\n ) {\n throw new Error(\n \"Option 'measurementProperties' must have type MeasurementProperties.\"\n );\n }\n valueItem.ContentSequence.push(...options.measurementProperties);\n }\n this.push(valueItem);\n }\n}\n\nclass MeasurementAndQualitativeEvaluationGroup extends _MeasurementsAndQualitatitiveEvaluations {\n constructor(options) {\n super({\n trackingIdentifier: options.trackingIdentifier,\n referencedRealWorldValueMap: options.referencedRealWorldValueMap,\n timePointContext: options.timePointContext,\n findingType: options.findingType,\n session: options.session,\n measurements: options.measurements,\n qualitativeEvaluations: options.qualitativeEvaluations\n });\n }\n}\n\nclass ROIMeasurements extends Template {\n constructor(options) {\n super();\n if (options.method !== undefined) {\n const methodItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"370129005\",\n meaning: \"Measurement Method\",\n schemeDesignator: \"SCT\"\n }),\n value: options.method,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.push(methodItem);\n }\n if (options.findingSites !== undefined) {\n if (\n !(\n typeof options.findingSites === \"object\" ||\n options.findingSites instanceof Array\n )\n ) {\n throw new Error(\"Option 'findingSites' must have type Array.\");\n }\n options.findingSites.forEach(site => {\n if (!site || !(site instanceof FindingSite)) {\n throw new Error(\n \"Items of option 'findingSites' must have type FindingSite.\"\n );\n }\n this.push(site);\n });\n }\n if (options.measurements === undefined) {\n throw new Error(\n \"Options 'measurements' is required ROIMeasurements.\"\n );\n }\n if (\n !(\n typeof options.measurements === \"object\" ||\n options.measurements instanceof Array\n )\n ) {\n throw new Error(\"Option 'measurements' must have type Array.\");\n }\n if (options.measurements.length === 0) {\n throw new Error(\"Option 'measurements' must have non-zero length.\");\n }\n options.measurements.forEach(measurement => {\n if (!measurement || !(measurement instanceof Measurement)) {\n throw new Error(\n \"Items of option 'measurements' must have type Measurement.\"\n );\n }\n this.push(measurement);\n });\n }\n}\n\nclass MeasurementReport extends Template {\n constructor(options) {\n super();\n if (options.observationContext === undefined) {\n throw new Error(\n \"Option 'observationContext' is required for MeasurementReport.\"\n );\n }\n if (options.procedureReported === undefined) {\n throw new Error(\n \"Option 'procedureReported' is required for MeasurementReport.\"\n );\n }\n const item = new ContainerContentItem({\n name: new CodedConcept({\n value: \"126000\",\n schemeDesignator: \"DCM\",\n meaning: \"Imaging Measurement Report\"\n }),\n templateID: \"1500\"\n });\n item.ContentSequence = new ContentSequence();\n if (options.languageOfContentItemAndDescendants === undefined) {\n throw new Error(\n \"Option 'languageOfContentItemAndDescendants' is required for \" +\n \"MeasurementReport.\"\n );\n }\n if (\n !(\n options.languageOfContentItemAndDescendants instanceof\n LanguageOfContentItemAndDescendants\n )\n ) {\n throw new Error(\n \"Option 'languageOfContentItemAndDescendants' must have type \" +\n \"LanguageOfContentItemAndDescendants.\"\n );\n }\n item.ContentSequence.push(\n ...options.languageOfContentItemAndDescendants\n );\n item.ContentSequence.push(...options.observationContext);\n if (\n options.procedureReported.constructor === CodedConcept ||\n options.procedureReported.constructor === Code\n ) {\n options.procedureReported = [options.procedureReported];\n }\n if (\n !(\n typeof options.procedureReported === \"object\" ||\n options.procedureReported instanceof Array\n )\n ) {\n throw new Error(\"Option 'procedureReported' must have type Array.\");\n }\n options.procedureReported.forEach(procedure => {\n const procedureItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"121058\",\n meaning: \"Procedure reported\",\n schemeDesignator: \"DCM\"\n }),\n value: procedure,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n item.ContentSequence.push(procedureItem);\n });\n const imageLibraryItem = new ImageLibrary();\n item.ContentSequence.push(...imageLibraryItem);\n\n const wereOptionsProvided = [\n options.imagingMeasurements !== undefined,\n options.derivedImagingMeasurements !== undefined,\n options.qualitativeEvaluations !== undefined\n ];\n const numOptionsProvided = wereOptionsProvided.reduce((a, b) => a + b);\n if (numOptionsProvided > 1) {\n throw new Error(\n \"Only one of the following options should be provided: \" +\n \"'imagingMeasurements', 'derivedImagingMeasurement', \" +\n \"'qualitativeEvaluations'.\"\n );\n }\n if (options.imagingMeasurements !== undefined) {\n const containerItem = new ContainerContentItem({\n name: new CodedConcept({\n value: \"126010\",\n meaning: \"Imaging Measurements\",\n schemeDesignator: \"DCM\"\n }),\n relationshipType: RelationshipTypes.CONTAINS\n });\n containerItem.ContentSequence = new ContentSequence(\n ...options.imagingMeasurements\n );\n item.ContentSequence.push(containerItem);\n } else if (options.derivedImagingMeasurements !== undefined) {\n const containerItem = new ContainerContentItem({\n name: new CodedConcept({\n value: \"126011\",\n meaning: \"Derived Imaging Measurements\",\n schemeDesignator: \"DCM\"\n }),\n relationshipType: RelationshipTypes.CONTAINS\n });\n containerItem.ContentSequence = new ContentSequence(\n ...options.derivedImagingMeasurements\n );\n item.ContentSequence.push(containerItem);\n } else if (options.qualitativeEvaluations !== undefined) {\n const containerItem = new ContainerContentItem({\n name: new CodedConcept({\n value: \"C0034375\",\n meaning: \"Qualitative Evaluations\",\n schemeDesignator: \"UMLS\"\n }),\n relationshipType: RelationshipTypes.CONTAINS\n });\n containerItem.ContentSequence = new ContentSequence(\n ...options.qualitativeEvaluations\n );\n item.ContentSequence.push(containerItem);\n }\n this.push(item);\n }\n}\n\nclass TimePointContext extends Template {\n constructor(options) {\n super();\n if (options.timePoint === undefined) {\n throw new Error(\n \"Option 'timePoint' is required for TimePointContext.\"\n );\n }\n const timePointItem = new TextContentItem({\n name: new CodedConcept({\n value: \"C2348792\",\n meaning: \"Time Point\",\n schemeDesignator: \"UMLS\"\n }),\n value: options.timePoint,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(timePointItem);\n if (options.timePointType !== undefined) {\n const timePointTypeItem = new CodeContentItem({\n name: new CodedConcept({\n value: \"126072\",\n meaning: \"Time Point Type\",\n schemeDesignator: \"DCM\"\n }),\n value: options.timePointType,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(timePointTypeItem);\n }\n if (options.timePointOrder !== undefined) {\n const timePointOrderItem = new NumContentItem({\n name: new CodedConcept({\n value: \"126073\",\n meaning: \"Time Point Order\",\n schemeDesignator: \"DCM\"\n }),\n value: options.timePointOrder,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(timePointOrderItem);\n }\n if (options.subjectTimePointIdentifier !== undefined) {\n const subjectTimePointIdentifierItem = new NumContentItem({\n name: new CodedConcept({\n value: \"126070\",\n meaning: \"Subject Time Point Identifier\",\n schemeDesignator: \"DCM\"\n }),\n value: options.subjectTimePointIdentifier,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(subjectTimePointIdentifierItem);\n }\n if (options.protocolTimePointIdentifier !== undefined) {\n const protocolTimePointIdentifierItem = new NumContentItem({\n name: new CodedConcept({\n value: \"126071\",\n meaning: \"Protocol Time Point Identifier\",\n schemeDesignator: \"DCM\"\n }),\n value: options.protocolTimePointIdentifier,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(protocolTimePointIdentifierItem);\n }\n if (options.temporalOffsetFromEvent !== undefined) {\n // TODO: Missing LongitudinalTemporalOffsetFromEventContentItem\n // if (\n // options.temporalOffsetFromEvent.constructor !==\n // LongitudinalTemporalOffsetFromEventContentItem\n // ) {\n // throw new Error(\n // \"Option 'temporalOffsetFromEvent' must have type \" +\n // \"LongitudinalTemporalOffsetFromEventContentItem.\"\n // );\n // }\n this.push(options.temporalOffsetFromEvent);\n }\n }\n}\n\nclass ImageLibrary extends Template {\n constructor() {\n super();\n const libraryItem = new ContainerContentItem({\n name: new CodedConcept({\n value: \"111028\",\n meaning: \"Image Library\",\n schemeDesignator: \"DCM\"\n }),\n relationshipType: RelationshipTypes.CONTAINS\n });\n this.push(libraryItem);\n }\n}\n\nclass AlgorithmIdentification extends Template {\n constructor(options) {\n super();\n if (options.name === undefined) {\n throw new Error(\n \"Option 'name' is required for AlgorithmIdentification.\"\n );\n }\n if (options.version === undefined) {\n throw new Error(\n \"Option 'version' is required for AlgorithmIdentification.\"\n );\n }\n const nameItem = new TextContentItem({\n name: new CodedConcept({\n value: \"111001\",\n meaning: \"Algorithm Name\",\n schemeDesignator: \"DCM\"\n }),\n value: options.name,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.push(nameItem);\n const versionItem = new TextContentItem({\n name: new CodedConcept({\n value: \"111003\",\n meaning: \"Algorithm Version\",\n schemeDesignator: \"DCM\"\n }),\n value: options.version,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.push(versionItem);\n if (options.parameters !== undefined) {\n if (\n !(\n typeof options.parameters === \"object\" ||\n options.parameters instanceof Array\n )\n ) {\n throw new Error(\"Option 'parameters' must have type Array.\");\n }\n options.parameters.forEach(parameter => {\n const parameterItem = new TextContentItem({\n name: new CodedConcept({\n value: \"111002\",\n meaning: \"Algorithm Parameter\",\n schemeDesignator: \"DCM\"\n }),\n value: parameter,\n relationshipType: RelationshipTypes.HAS_CONCEPT_MOD\n });\n this.push(parameterItem);\n });\n }\n }\n}\n\nclass TrackingIdentifier extends Template {\n constructor(options) {\n super();\n if (options.uid === undefined) {\n throw new Error(\"Option 'uid' is required for TrackingIdentifier.\");\n }\n if (options.identifier !== undefined) {\n const trackingIdentifierItem = new TextContentItem({\n name: new CodedConcept({\n value: \"112039\",\n meaning: \"Tracking Identifier\",\n schemeDesignator: \"DCM\"\n }),\n value: options.identifier,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(trackingIdentifierItem);\n }\n const trackingUIDItem = new UIDRefContentItem({\n name: new CodedConcept({\n value: \"112040\",\n meaning: \"Tracking Unique Identifier\",\n schemeDesignator: \"DCM\"\n }),\n value: options.uid,\n relationshipType: RelationshipTypes.HAS_OBS_CONTEXT\n });\n this.push(trackingUIDItem);\n }\n}\n\nexport {\n AlgorithmIdentification,\n DeviceObserverIdentifyingAttributes,\n ImageLibrary,\n LanguageOfContentItemAndDescendants,\n Measurement,\n MeasurementAndQualitativeEvaluationGroup,\n MeasurementReport,\n MeasurementsDerivedFromMultipleROIMeasurements,\n ObservationContext,\n ObserverContext,\n PersonObserverIdentifyingAttributes,\n PlanarROIMeasurementsAndQualitativeEvaluations,\n ROIMeasurements,\n SubjectContext,\n SubjectContextDevice,\n SubjectContextFetus,\n SubjectContextSpecimen,\n TimePointContext,\n TrackingIdentifier,\n VolumetricROIMeasurementsAndQualitativeEvaluations\n // MeasurementProperties,\n // MeasurementStatisticalProperties,\n // NormalRangeProperties,\n // EquationOrTable,\n // ImageOrSpatialCoordinates,\n // WaveformOrTemporalCoordinates,\n // Quotation,\n};\n","import { DicomMetaDictionary } from \"../DicomMetaDictionary.js\";\nimport { ContentSequence } from \"./valueTypes.js\";\nconst _attributesToInclude = [\n // Patient\n \"00080054\",\n \"00080100\",\n \"00080102\",\n \"00080103\",\n \"00080104\",\n \"00080105\",\n \"00080106\",\n \"00080107\",\n \"0008010B\",\n \"0008010D\",\n \"0008010F\",\n \"00080117\",\n \"00080118\",\n \"00080119\",\n \"00080120\",\n \"00080121\",\n \"00080122\",\n \"00081120\",\n \"00081150\",\n \"00081155\",\n \"00081160\",\n \"00081190\",\n \"00081199\",\n \"00100010\",\n \"00100020\",\n \"00100021\",\n \"00100022\",\n \"00100024\",\n \"00100026\",\n \"00100027\",\n \"00100028\",\n \"00100030\",\n \"00100032\",\n \"00100033\",\n \"00100034\",\n \"00100035\",\n \"00100040\",\n \"00100200\",\n \"00100212\",\n \"00100213\",\n \"00100214\",\n \"00100215\",\n \"00100216\",\n \"00100217\",\n \"00100218\",\n \"00100219\",\n \"00100221\",\n \"00100222\",\n \"00100223\",\n \"00100229\",\n \"00101001\",\n \"00101002\",\n \"00101100\",\n \"00102160\",\n \"00102201\",\n \"00102202\",\n \"00102292\",\n \"00102293\",\n \"00102294\",\n \"00102295\",\n \"00102296\",\n \"00102297\",\n \"00102298\",\n \"00102299\",\n \"00104000\",\n \"00120062\",\n \"00120063\",\n \"00120064\",\n \"0020000D\",\n \"00400031\",\n \"00400032\",\n \"00400033\",\n \"00400035\",\n \"00400036\",\n \"00400039\",\n \"0040003A\",\n \"0040E001\",\n \"0040E010\",\n \"0040E020\",\n \"0040E021\",\n \"0040E022\",\n \"0040E023\",\n \"0040E024\",\n \"0040E025\",\n \"0040E030\",\n \"0040E031\",\n \"0062000B\",\n \"00880130\",\n \"00880140\",\n // Patient Study\n \"00080100\",\n \"00080102\",\n \"00080103\",\n \"00080104\",\n \"00080105\",\n \"00080106\",\n \"00080107\",\n \"0008010B\",\n \"0008010D\",\n \"0008010F\",\n \"00080117\",\n \"00080118\",\n \"00080119\",\n \"00080120\",\n \"00080121\",\n \"00080122\",\n \"00081080\",\n \"00081084\",\n \"00101010\",\n \"00101020\",\n \"00101021\",\n \"00101022\",\n \"00101023\",\n \"00101024\",\n \"00101030\",\n \"00102000\",\n \"00102110\",\n \"00102180\",\n \"001021A0\",\n \"001021B0\",\n \"001021C0\",\n \"001021D0\",\n \"00102203\",\n \"00380010\",\n \"00380014\",\n \"00380060\",\n \"00380062\",\n \"00380064\",\n \"00380500\",\n \"00400031\",\n \"00400032\",\n \"00400033\",\n // General Study\n \"00080020\",\n \"00080030\",\n \"00080050\",\n \"00080051\",\n \"00080080\",\n \"00080081\",\n \"00080082\",\n \"00080090\",\n \"00080096\",\n \"0008009C\",\n \"0008009D\",\n \"00080100\",\n \"00080102\",\n \"00080103\",\n \"00080104\",\n \"00080105\",\n \"00080106\",\n \"00080107\",\n \"0008010B\",\n \"0008010D\",\n \"0008010F\",\n \"00080117\",\n \"00080118\",\n \"00080119\",\n \"00080120\",\n \"00080121\",\n \"00080122\",\n \"00081030\",\n \"00081032\",\n \"00081048\",\n \"00081049\",\n \"00081060\",\n \"00081062\",\n \"00081110\",\n \"00081150\",\n \"00081155\",\n \"0020000D\",\n \"00200010\",\n \"00321034\",\n \"00400031\",\n \"00400032\",\n \"00400033\",\n \"00401012\",\n \"00401101\",\n \"00401102\",\n \"00401103\",\n \"00401104\",\n // Clinical Trial Subject\n \"00120010\",\n \"00120020\",\n \"00120021\",\n \"00120030\",\n \"00120031\",\n \"00120040\",\n \"00120042\",\n \"00120081\",\n \"00120082\",\n // Clinical Trial Study\n \"00120020\",\n \"00120050\",\n \"00120051\",\n \"00120052\",\n \"00120053\",\n \"00120083\",\n \"00120084\",\n \"00120085\"\n];\n\nclass Comprehensive3DSR {\n constructor(options) {\n if (options.evidence === undefined) {\n throw new Error(\n \"Option 'evidence' is required for Comprehensive3DSR.\"\n );\n }\n if (\n !(\n typeof options.evidence === \"object\" ||\n options.evidence instanceof Array\n )\n ) {\n throw new Error(\"Option 'evidence' must have type Array.\");\n }\n if (options.evidence.length === 0) {\n throw new Error(\"Option 'evidence' must have non-zero length.\");\n }\n if (options.content === undefined) {\n throw new Error(\n \"Option 'content' is required for Comprehensive3DSR.\"\n );\n }\n if (options.seriesInstanceUID === undefined) {\n throw new Error(\n \"Option 'seriesInstanceUID' is required for Comprehensive3DSR.\"\n );\n }\n if (options.seriesNumber === undefined) {\n throw new Error(\n \"Option 'seriesNumber' is required for Comprehensive3DSR.\"\n );\n }\n if (options.seriesDescription === undefined) {\n throw new Error(\n \"Option 'seriesDescription' is required for Comprehensive3DSR.\"\n );\n }\n if (options.sopInstanceUID === undefined) {\n throw new Error(\n \"Option 'sopInstanceUID' is required for Comprehensive3DSR.\"\n );\n }\n if (options.instanceNumber === undefined) {\n throw new Error(\n \"Option 'instanceNumber' is required for Comprehensive3DSR.\"\n );\n }\n if (options.manufacturer === undefined) {\n throw new Error(\n \"Option 'manufacturer' is required for Comprehensive3DSR.\"\n );\n }\n\n this.SOPClassUID = \"1.2.840.10008.5.1.4.1.1.88.34\";\n this.SOPInstanceUID = options.sopInstanceUID;\n this.Modality = \"SR\";\n this.SeriesDescription = options.seriesDescription;\n this.SeriesInstanceUID = options.seriesInstanceUID;\n this.SeriesNumber = options.seriesNumber;\n this.InstanceNumber = options.instanceNumber;\n\n this.Manufacturer = options.manufacturer;\n if (options.institutionName !== undefined) {\n this.InstitutionName = options.institutionName;\n if (options.institutionalDepartmentName !== undefined) {\n this.InstitutionalDepartmentName =\n options.institutionDepartmentName;\n }\n }\n\n if (options.isComplete) {\n this.CompletionFlag = \"COMPLETE\";\n } else {\n this.CompletionFlag = \"PARTIAL\";\n }\n if (options.isVerified) {\n if (options.verifyingObserverName === undefined) {\n throw new Error(\n \"Verifying Observer Name must be specified if SR document \" +\n \"has been verified.\"\n );\n }\n if (options.verifyingOrganization === undefined) {\n throw new Error(\n \"Verifying Organization must be specified if SR document \" +\n \"has been verified.\"\n );\n }\n this.VerificationFlag = \"VERIFIED\";\n const ovserver_item = {};\n ovserver_item.VerifyingObserverName = options.verifyingObserverName;\n ovserver_item.VerifyingOrganization = options.verifyingOrganization;\n ovserver_item.VerificationDateTime = DicomMetaDictionary.dateTime();\n this.VerifyingObserverSequence = [ovserver_item];\n } else {\n this.VerificationFlag = \"UNVERIFIED\";\n }\n if (options.isFinal) {\n this.PreliminaryFlag = \"FINAL\";\n } else {\n this.PreliminaryFlag = \"PRELIMINARY\";\n }\n\n this.ContentDate = DicomMetaDictionary.date();\n this.ContentTime = DicomMetaDictionary.time();\n\n Object.keys(options.content).forEach(keyword => {\n this[keyword] = options.content[keyword];\n });\n\n const evidenceCollection = {};\n options.evidence.forEach(evidence => {\n if (\n evidence.StudyInstanceUID !==\n options.evidence[0].StudyInstanceUID\n ) {\n throw new Error(\n \"Referenced data sets must all belong to the same study.\"\n );\n }\n if (!(evidence.SeriesInstanceUID in evidenceCollection)) {\n evidenceCollection[evidence.SeriesInstanceUID] = [];\n }\n const instanceItem = {};\n instanceItem.ReferencedSOPClassUID = evidence.SOPClassUID;\n instanceItem.ReferencedSOPInstanceUID = evidence.SOPInstanceUID;\n evidenceCollection[evidence.SeriesInstanceUID].push(instanceItem);\n });\n const evidenceStudyItem = {};\n evidenceStudyItem.StudyInstanceUID =\n options.evidence[0].StudyInstanceUID;\n evidenceStudyItem.ReferencedSeriesSequence = [];\n Object.keys(evidenceCollection).forEach(seriesInstanceUID => {\n const seriesItem = {};\n seriesItem.SeriesInstanceUID = seriesInstanceUID;\n seriesItem.ReferencedSOPSequence =\n evidenceCollection[seriesInstanceUID];\n evidenceStudyItem.ReferencedSeriesSequence.push(seriesItem);\n });\n\n if (options.requestedProcedures !== undefined) {\n if (\n !(\n typeof options.requestedProcedures === \"object\" ||\n options.requestedProcedures instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'requestedProcedures' must have type Array.\"\n );\n }\n this.ReferencedRequestSequence = new ContentSequence(\n ...options.requestedProcedures\n );\n this.CurrentRequestedProcedureEvidenceSequence = [\n evidenceStudyItem\n ];\n } else {\n this.PertinentOtherEvidenceSequence = [evidenceStudyItem];\n }\n\n if (options.previousVersions !== undefined) {\n const preCollection = {};\n options.previousVersions.forEach(version => {\n if (\n version.StudyInstanceUID !=\n options.evidence[0].StudyInstanceUID\n ) {\n throw new Error(\n \"Previous version data sets must belong to the same study.\"\n );\n }\n const instanceItem = {};\n instanceItem.ReferencedSOPClassUID = version.SOPClassUID;\n instanceItem.ReferencedSOPInstanceUID = version.SOPInstanceUID;\n preCollection[version.SeriesInstanceUID].push(instanceItem);\n });\n const preStudyItem = {};\n preStudyItem.StudyInstanceUID =\n options.previousVersions[0].StudyInstanceUID;\n preStudyItem.ReferencedSeriesSequence = [];\n Object.keys(preCollection).forEach(seriesInstanceUID => {\n const seriesItem = {};\n seriesItem.SeriesInstanceUID = seriesInstanceUID;\n seriesItem.ReferencedSOPSequence =\n preCollection[seriesInstanceUID];\n preStudyItem.ReferencedSeriesSequence.push(seriesItem);\n });\n this.PredecessorDocumentsSequence = [preStudyItem];\n }\n\n if (options.performedProcedureCodes !== undefined) {\n if (\n !(\n typeof options.performedProcedureCodes === \"object\" ||\n options.performedProcedureCodes instanceof Array\n )\n ) {\n throw new Error(\n \"Option 'performedProcedureCodes' must have type Array.\"\n );\n }\n this.PerformedProcedureCodeSequence = new ContentSequence(\n ...options.performedProcedureCodes\n );\n } else {\n this.PerformedProcedureCodeSequence = [];\n }\n\n this.ReferencedPerformedProcedureStepSequence = [];\n\n _attributesToInclude.forEach(tag => {\n const key = DicomMetaDictionary.punctuateTag(tag);\n const element = DicomMetaDictionary.dictionary[key];\n if (element !== undefined) {\n const keyword = element.name;\n const value = options.evidence[0][keyword];\n if (value !== undefined) {\n this[keyword] = value;\n }\n }\n });\n }\n}\n\nexport { Comprehensive3DSR };\n","import * as coding from \"./coding.js\";\nimport * as contentItems from \"./contentItems.js\";\nimport * as templates from \"./templates.js\";\nimport * as valueTypes from \"./valueTypes.js\";\nimport * as documents from \"./documents.js\";\n\nconst sr = {\n coding,\n contentItems,\n documents,\n templates,\n valueTypes\n};\n\nexport default sr;\n","import { DicomMetaDictionary } from \"./DicomMetaDictionary.js\";\nimport { Tag } from \"./Tag.js\";\nimport { ValueRepresentation } from \"./ValueRepresentation.js\";\n\nvar tagNamesToEmpty = [\n // please override these in specificReplaceDefaults to have useful values\n \"PatientID\",\n \"PatientName\",\n\n // 0/3: those that appear missing in CTP\n \"SeriesDate\",\n \"AccessionNumber\",\n // (valuable, but sometimes manually filled)\n \"SeriesDescription\",\n // cat 1/3: CTP: set to empty explicitely using @empty\n \"StudyTime\",\n \"ContentTime\",\n \"ReferringPhysicianName\",\n \"PatientBirthDate\",\n \"PatientSex\",\n \"ClinicalTrialSiteID\",\n \"ClinicalTrialSiteName\",\n \"ClinicalTrialSubjectID\",\n \"ClinicalTrialSubjectReadingID\",\n \"ClinicalTrialTimePointID\",\n \"ClinicalTrialTimePointDescription\",\n \"ContrastBolusAgent\",\n \"StudyID\",\n // cat 2/3: CTP: set to increment dates\n \"InstanceCreationDate\",\n \"StudyDate\",\n \"ContentDate\",\n \"DateOfSecondaryCapture\",\n \"DateOfLastCalibration\",\n \"DateOfLastDetectorCalibration\",\n \"FrameAcquisitionDatetime\",\n \"FrameReferenceDatetime\",\n \"StudyVerifiedDate\",\n \"StudyReadDate\",\n \"ScheduledStudyStartDate\",\n \"ScheduledStudyStopDate\",\n \"StudyArrivalDate\",\n \"StudyCompletionDate\",\n \"ScheduledAdmissionDate\",\n \"ScheduledDischargeDate\",\n \"DischargeDate\",\n \"SPSStartDate\",\n \"SPSEndDate\",\n \"PPSStartDate\",\n \"PPSEndDate\",\n \"IssueDateOfImagingServiceRequest\",\n \"VerificationDateTime\",\n \"ObservationDateTime\",\n \"DateTime\",\n \"Date\",\n \"RefDatetime\",\n // cat 3/3: CTP: set to remove using @remove\n \"AcquisitionDate\",\n \"OverlayDate\",\n \"CurveDate\",\n \"AcquisitionDatetime\",\n \"SeriesTime\",\n \"AcquisitionTime\",\n \"OverlayTime\",\n \"CurveTime\",\n \"InstitutionName\",\n \"InstitutionAddress\",\n \"ReferringPhysicianAddress\",\n \"ReferringPhysicianPhoneNumbers\",\n \"ReferringPhysiciansIDSeq\",\n \"TimezoneOffsetFromUTC\",\n \"StationName\",\n \"StudyDescription\",\n \"InstitutionalDepartmentName\",\n \"PhysicianOfRecord\",\n \"PhysicianOfRecordIdSeq\",\n \"PerformingPhysicianName\",\n \"PerformingPhysicianIdSeq\",\n \"NameOfPhysicianReadingStudy\",\n \"PhysicianReadingStudyIdSeq\",\n \"OperatorName\",\n \"OperatorsIdentificationSeq\",\n \"AdmittingDiagnosisDescription\",\n \"AdmittingDiagnosisCodeSeq\",\n \"RefStudySeq\",\n \"RefPPSSeq\",\n \"RefPatientSeq\",\n \"RefImageSeq\",\n \"DerivationDescription\",\n \"SourceImageSeq\",\n \"IdentifyingComments\",\n \"IssuerOfPatientID\",\n \"PatientBirthTime\",\n \"PatientInsurancePlanCodeSeq\",\n \"PatientPrimaryLanguageCodeSeq\",\n \"PatientPrimaryLanguageModifierCodeSeq\",\n \"OtherPatientIDs\",\n \"OtherPatientNames\",\n \"OtherPatientIDsSeq\",\n \"PatientBirthName\",\n \"PatientAge\",\n \"PatientSize\",\n \"PatientWeight\",\n \"PatientAddress\",\n \"InsurancePlanIdentification\",\n \"PatientMotherBirthName\",\n \"MilitaryRank\",\n \"BranchOfService\",\n \"MedicalRecordLocator\",\n \"MedicalAlerts\",\n \"ContrastAllergies\",\n \"CountryOfResidence\",\n \"RegionOfResidence\",\n \"PatientPhoneNumbers\",\n \"EthnicGroup\",\n \"Occupation\",\n \"SmokingStatus\",\n \"AdditionalPatientHistory\",\n \"PregnancyStatus\",\n \"LastMenstrualDate\",\n \"PatientReligiousPreference\",\n \"PatientSexNeutered\",\n \"ResponsiblePerson\",\n \"ResponsibleOrganization\",\n \"PatientComments\",\n \"DeviceSerialNumber\",\n \"PlateID\",\n \"GeneratorID\",\n \"CassetteID\",\n \"GantryID\",\n // we keep - should be SoftwareVersions anyway\n // \"SoftwareVersion\",\n \"ProtocolName\",\n \"AcquisitionDeviceProcessingDescription\",\n \"AcquisitionComments\",\n \"DetectorID\",\n \"AcquisitionProtocolDescription\",\n \"ContributionDescription\",\n \"ModifyingDeviceID\",\n \"ModifyingDeviceManufacturer\",\n \"ModifiedImageDescription\",\n \"ImageComments\",\n \"ImagePresentationComments\",\n \"StudyIDIssuer\",\n \"ScheduledStudyLocation\",\n \"ScheduledStudyLocationAET\",\n \"ReasonforStudy\",\n \"RequestingPhysician\",\n \"RequestingService\",\n \"RequestedProcedureDescription\",\n \"RequestedContrastAgent\",\n \"StudyComments\",\n \"AdmissionID\",\n \"IssuerOfAdmissionID\",\n \"ScheduledPatientInstitutionResidence\",\n \"AdmittingDate\",\n \"AdmittingTime\",\n \"DischargeDiagnosisDescription\",\n \"SpecialNeeds\",\n \"ServiceEpisodeID\",\n \"IssuerOfServiceEpisodeId\",\n \"ServiceEpisodeDescription\",\n \"CurrentPatientLocation\",\n \"PatientInstitutionResidence\",\n \"PatientState\",\n \"ReferencedPatientAliasSeq\",\n \"VisitComments\",\n \"ScheduledStationAET\",\n \"ScheduledPerformingPhysicianName\",\n \"SPSDescription\",\n \"ScheduledStationName\",\n \"SPSLocation\",\n \"PreMedication\",\n \"PerformedStationAET\",\n \"PerformedStationName\",\n \"PerformedLocation\",\n \"PerformedStationNameCodeSeq\",\n \"PPSID\",\n \"PPSDescription\",\n \"RequestAttributesSeq\",\n \"PPSComments\",\n \"AcquisitionContextSeq\",\n \"PatientTransportArrangements\",\n \"RequestedProcedureLocation\",\n \"NamesOfIntendedRecipientsOfResults\",\n \"IntendedRecipientsOfResultsIDSequence\",\n \"PersonAddress\",\n \"PersonTelephoneNumbers\",\n \"RequestedProcedureComments\",\n \"ReasonForTheImagingServiceRequest\",\n \"OrderEnteredBy\",\n \"OrderEntererLocation\",\n \"OrderCallbackPhoneNumber\",\n \"ImagingServiceRequestComments\",\n \"ConfidentialityPatientData\",\n \"ScheduledStationNameCodeSeq\",\n \"ScheduledStationGeographicLocCodeSeq\",\n \"PerformedStationGeoLocCodeSeq\",\n \"ScheduledHumanPerformersSeq\",\n \"ActualHumanPerformersSequence\",\n \"HumanPerformersOrganization\",\n \"HumanPerformersName\",\n \"VerifyingOrganization\",\n \"VerifyingObserverName\",\n \"AuthorObserverSequence\",\n \"ParticipantSequence\",\n \"CustodialOrganizationSeq\",\n \"VerifyingObserverIdentificationCodeSeq\",\n \"PersonName\",\n \"ContentSeq\",\n \"OverlayData\",\n \"OverlayComments\",\n \"IconImageSequence\",\n \"TopicSubject\",\n \"TopicAuthor\",\n \"TopicKeyWords\",\n \"TextString\",\n \"Arbitrary\",\n \"TextComments\",\n \"ResultsIDIssuer\",\n \"InterpretationRecorder\",\n \"InterpretationTranscriber\",\n \"InterpretationText\",\n \"InterpretationAuthor\",\n \"InterpretationApproverSequence\",\n \"PhysicianApprovingInterpretation\",\n \"InterpretationDiagnosisDescription\",\n \"ResultsDistributionListSeq\",\n \"DistributionName\",\n \"DistributionAddress\",\n \"InterpretationIdIssuer\",\n \"Impressions\",\n \"ResultComments\",\n \"DigitalSignaturesSeq\",\n \"DataSetTrailingPadding\"\n];\n\nexport function getTagsNameToEmpty() {\n return [...tagNamesToEmpty];\n}\n\nexport function cleanTags(\n dict,\n tagNamesToReplace = undefined,\n customTagNamesToEmpty = undefined\n) {\n if (tagNamesToReplace == undefined) {\n tagNamesToReplace = {\n \"00100010\": \"ANON^PATIENT\",\n \"00100020\": \"ANON^ID\"\n };\n }\n var tags =\n customTagNamesToEmpty != undefined\n ? customTagNamesToEmpty\n : tagNamesToEmpty;\n tags.forEach(function (tag) {\n var tagInfo = DicomMetaDictionary.nameMap[tag];\n if (tagInfo && tagInfo.version != \"PrivateTag\") {\n var tagNumber = tagInfo.tag,\n tagString = Tag.fromPString(tagNumber).toCleanString();\n if (dict[tagString]) {\n var newValue;\n if (tagString in tagNamesToReplace) {\n newValue = [tagNamesToReplace[tagString]];\n } else {\n newValue = [];\n }\n dict[tagString] = ValueRepresentation.addTagAccessors(\n dict[tagString]\n );\n dict[tagString].Value = newValue;\n }\n }\n });\n}\n","// Data\nimport { BitArray } from \"./bitArray.js\";\nimport { ReadBufferStream } from \"./BufferStream.js\";\nimport { DeflatedReadBufferStream } from \"./BufferStream.js\";\nimport { WriteBufferStream } from \"./BufferStream.js\";\nimport { DicomDict } from \"./DicomDict.js\";\nimport { DicomMessage } from \"./DicomMessage.js\";\nimport { DicomMetaDictionary } from \"./DicomMetaDictionary.js\";\nimport { registerPrivatesModule } from \"./dictionary.fast.js\";\nimport * as privateData from \"./dictionary.private.data.js\";\nimport { DICOMWEB } from \"./dicomweb.js\";\n\nregisterPrivatesModule(privateData);\nimport { Tag } from \"./Tag.js\";\nimport { ValueRepresentation } from \"./ValueRepresentation.js\";\nimport { Colors } from \"./colors.js\";\nimport log from \"./log.js\";\n\nimport { AsyncDicomReader } from \"./AsyncDicomReader.js\";\n\nimport {\n datasetToDict,\n datasetToBuffer,\n datasetToBlob\n} from \"./datasetToBlob.js\";\n// Derivations\nimport {\n DerivedDataset,\n DerivedPixels,\n DerivedImage,\n Segmentation,\n StructuredReport,\n ParametricMap\n} from \"./derivations/index.js\";\n// Normalizers\n\nimport { Normalizer } from \"./normalizers.js\";\nimport { ImageNormalizer } from \"./normalizers.js\";\nimport { MRImageNormalizer } from \"./normalizers.js\";\nimport { EnhancedMRImageNormalizer } from \"./normalizers.js\";\nimport { EnhancedUSVolumeNormalizer } from \"./normalizers.js\";\nimport { CTImageNormalizer } from \"./normalizers.js\";\nimport { PETImageNormalizer } from \"./normalizers.js\";\nimport { SEGImageNormalizer } from \"./normalizers.js\";\nimport { DSRNormalizer } from \"./normalizers.js\";\n\nimport adapters from \"./adapters/index.js\";\nimport utilities from \"./utilities/index.js\";\nimport sr from \"./sr/index.js\";\nimport * as constants from \"./constants/dicom.js\";\n\nimport { cleanTags, getTagsNameToEmpty } from \"./anonymizer.js\";\n\nconst data = {\n BitArray,\n ReadBufferStream,\n DeflatedReadBufferStream,\n WriteBufferStream,\n DicomDict,\n DicomMessage,\n DicomMetaDictionary,\n Tag,\n ValueRepresentation,\n Colors,\n datasetToDict,\n datasetToBuffer,\n datasetToBlob\n};\n\nconst async = {\n AsyncDicomReader\n};\n\nconst derivations = {\n DerivedDataset,\n DerivedPixels,\n DerivedImage,\n Segmentation,\n StructuredReport,\n ParametricMap\n};\n\nconst normalizers = {\n Normalizer,\n ImageNormalizer,\n MRImageNormalizer,\n EnhancedMRImageNormalizer,\n EnhancedUSVolumeNormalizer,\n CTImageNormalizer,\n PETImageNormalizer,\n SEGImageNormalizer,\n DSRNormalizer\n};\n\nconst anonymizer = {\n cleanTags,\n getTagsNameToEmpty\n};\n\nconst dcmjs = {\n DICOMWEB,\n adapters,\n constants,\n data,\n derivations,\n normalizers,\n sr,\n utilities,\n log,\n anonymizer,\n async\n};\n\nDicomDict.setDicomMessageClass(DicomMessage);\nValueRepresentation.setDicomMessageClass(DicomMessage);\nValueRepresentation.setTagClass(Tag);\nTag.setDicomMessageClass(DicomMessage);\n\nexport {\n DICOMWEB,\n adapters,\n anonymizer,\n async,\n constants,\n data,\n derivations,\n normalizers,\n sr,\n utilities,\n log\n};\n\nexport { dcmjs as default };\n"],"names":["root","definition","this","noop","undefinedType","isIE","window","navigator","test","userAgent","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","log","trace","replaceLoggingMethods","level","getLevel","i","length","methodFactory","name","debug","levels","SILENT","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","undefined","realMethod","Logger","factory","inheritedLevel","defaultLevel","userLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","cookieName","encodeURIComponent","location","indexOf","exec","slice","normalizeLevel","input","toUpperCase","TypeError","TRACE","DEBUG","INFO","WARN","ERROR","setLevel","persist","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","resetLevel","removeItem","clearPersistedLevel","enableAll","disableAll","rebuild","childName","initialLevel","getLogger","logger","_log","noConflict","getLoggers","module","exports","validationLog","BitArray","getBytesForBinaryFrame","pack","pixelData","numPixels","bitPixelData","Uint8Array","bytePos","Math","floor","bitPixelValue","unpack","bitPixelArray","bitArray","byteArray","byteIndex","bitIndex","bitByteIndex","remainder","bytesRequired","zero$1","buf","len","LITERALS$1","L_CODES$1","D_CODES$1","MAX_BITS$1","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","Array","static_dtree","_dist_code","_length_code","MAX_MATCH$1","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","s","w","pending_buf","pending","send_bits","value","bi_valid","bi_buf","send_code","c","tree","bi_reverse","code","res","gen_codes","bl_count","next_code","bits","n","init_block","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","sym_next","matches","bi_windup","smaller","m","depth","_n2","_m2","pqdownheap","k","v","heap","j","heap_len","compress_block","ltree","dtree","lc","extra","sx","sym_buf","build_tree","desc","stree","node","heap_max","base","h","xbits","f","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","count","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block$1","stored_len","last","set","subarray","_tr_init_1","LENGTH_CODES$1","tr_static_init","l_desc","d_desc","bl_desc","_tr_flush_block_1","opt_lenb","static_lenb","max_blindex","strm","data_type","block_mask","detect_data_type","BL_CODES$1","build_bl_tree","strategy","lcodes","dcodes","blcodes","rank","send_all_trees","_tr_tally_1","sym_end","trees","_tr_init","_tr_stored_block","_tr_flush_block","_tr_tally","_tr_align","STATIC_TREES","bi_flush","adler32_1","adler","pos","s1","s2","crcTable","Uint32Array","table","makeTable","crc32_1","crc","t","end","messages","constants$2","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","Z_NO_FLUSH$2","Z_FULL_FLUSH$1","Z_FINISH$3","Z_BLOCK$1","Z_OK$3","Z_STREAM_END$3","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_BUF_ERROR$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$2","MAX_MATCH","MIN_LOOKAHEAD","INIT_STATE","BUSY_STATE","FINISH_STATE","err","errorCode","msg","zero","slide_hash","p","wsize","w_size","hash_size","head","prev","HASH","data","hash_shift","hash_mask","flush_pending","state","avail_out","output","pending_out","next_out","total_out","flush_block_only","block_start","strstart","put_byte","b","putShortMSB","read_buf","start","size","avail_in","next_in","wrap","total_in","longest_match","cur_match","match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","str","window_size","insert","ins_h","deflate_stored","flush","left","have","min_block","pending_buf_size","used","high_water","deflate_fast","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","DeflateState","status","gzhead","gzindex","last_flush","w_bits","hash_bits","Uint16Array","HEAP_SIZE","MAX_BITS","lit_bufsize","deflateStateCheck","deflateResetKeep","deflateReset","ret","deflateInit2","windowBits","memLevel","deflate_2$1","old_flush","header","level_flags","text","hcrc","comment","time","os","beg","copy","gzhead_extra","val","charCodeAt","bstate","deflate_huff","deflate_rle","deflateSetDictionary_1","dictionary","dictLength","tmpDict","avail","next","deflate_1$2","deflateInit","deflateSetHeader","deflate","deflateEnd","deflateSetDictionary","deflateInfo","_has","key","Object","hasOwnProperty","common","sources","source","shift","chunks","l","result","chunk","STR_APPLY_UIA_OK","String","fromCharCode","__","_utf8len","q","strings","TextEncoder","encode","c2","m_pos","str_len","buf_len","max","TextDecoder","decode","out","utf16buf","c_len","buf2binstring","zstream","toString$1","toString","Z_NO_FLUSH$1","Z_FINISH$2","Z_OK$2","Z_STREAM_END$2","Z_DEFLATED$1","Deflate$1","options","chunkSize","opt","raw","gzip","ended","Error","dict","_dict_set","deflate$1","deflator","push","flush_mode","_flush_mode","onData","onEnd","deflate_1$1","Deflate","deflateRaw","BAD$1","inffast","_in","_out","dmax","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","from","from_source","lencode","distcode","lenbits","distbits","top","dolen","mode","sane","MAXBITS","lbase","lext","dbase","dext","inftrees","type","lens","lens_index","codes","table_index","work","opts","incr","fill","low","mask","sym","min","curr","drop","huff","offs","here_bits","here_op","here_val","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_NEED_DICT$1","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_MEM_ERROR$1","HEAD","DICT","TYPE","TYPEDO","COPY_","LEN_","LEN","CHECK","BAD","zswap32","InflateState","havedict","flags","check","total","wbits","offset","ncode","nlen","ndist","lendyn","distdyn","back","was","inflateStateCheck","inflateResetKeep","Int32Array","inflateReset","inflateReset2","inflateInit2","lenfix","distfix","virgin","fixedtables","updatewindow","src","inflate_2$1","put","last_bits","last_op","last_val","hbuf","order","inf_leave","done","xflags","extra_len","inflateSetDictionary_1","dictid","inflate_1$2","inflateInit","inflate","inflateEnd","inflateGetHeader","inflateSetDictionary","inflateInfo","gzheader","Inflate$1","to","inflate$1","inflator","last_avail_out","next_out_utf8","tail","utf8str","join","inflate_1$1","Inflate","inflateRaw","ungzip","pako","constants","SplitDataView","_createClass","defaultSize","_classCallCheck","_defineProperty","consumeOffset","consumed","offsets","_this$consumeListener","nextOffset","nextLength","lengths","currentEnd","consumeListener","buffers","views","startOffset","byteLength","buffer","ArrayBuffer","DataView","_options$transfer","transfer","addBuffer","lastOffset","lastLength","view","_options","_this$offsets","_this$lengths","_this$buffers","_this$views","_toConsumableArray","index","findStart","concat","createBuffer","offsetStart","bufStart","addLength","error","viewOffset","viewLength","newBuffer","writeCommit","writeBuffer","startWrite","writeLen","byteBuffer","setData","_this$findView","findView","getUint8","isLittleEndian","_this$findView2","getUint16","_this$findView3","getUint32","_this$findView4","getBigUint64","_this$findView5","getFloat32","_this$findView6","getFloat64","_this$findView7","getInt8","_this$findView8","getInt16","_this$findView9","getInt32","_this$findView0","setUint8","_this$findView1","setUint16","_this$findView10","setUint32","_this$findView11","setBigUint64","_this$findView12","setFloat32","_this$findView13","setFloat64","_this$findView14","setInt8","_this$findView15","setInt16","_this$findView16","setInt32","bufferCount","totalSize","buffersBeforeOffset","bytesBeforeOffset","currentConsumeOffset","bufferStart","toFloat","isArray","map","parseFloat","toInt","isNaN","parseInt","BufferStream","_options$defaultSize","littleEndian","clearBuffers","isComplete","notifyAvailableListeners","orComplete","endOffset","_this","bytes","isAvailable","Promise","resolve","recheckAvailable","availableListeners","isLittle","noCopy","get","getBuffer","checkSize","increment","first","second","encodedString","encoder","charCode","arr","readUint8Array","sixlen","vr","decoder","hexString","readUint8","step","stream","availableSize","_fromAsyncStream","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_iterator","_step","ab","_t","_context","_asyncIterator","sent","byteOffset","return","finish","setComplete","stop","_x","existingListeners","splice","forEach","listener","consume","hasData","newBuf","ReadBufferStream","getBufferMemoryInfo","_BufferStream2","_ref","_options$start","_this2","_callSuper","_objectSpread","_inherits","DeflatedReadBufferStream","_ReadBufferStream","WriteBufferStream","_BufferStream3","_this3","IMPLICIT_LITTLE_ENDIAN","EXPLICIT_LITTLE_ENDIAN","DEFLATED_EXPLICIT_LITTLE_ENDIAN","EXPLICIT_BIG_ENDIAN","UNDEFINED_LENGTH","VM_DELIMITER","PADDING_SPACE","SEQUENCE_ITEM_TAG","SEQUENCE_DELIMITER_TAG","unencapsulatedTransferSyntaxes","videoTransferSyntaxUIDs","Set","isVideoTransferSyntax","uid","has","TagHex","Item","ItemDelimitationEnd","SequenceDelimitationEnd","PixelData","FileMetaInformationGroupLength","TransferSyntaxUID","Rows","Columns","SamplesPerPixel","BitsAllocated","NumberOfFrames","SpecificCharacterSet","PixelRepresentation","DataSetTrailingPadding","StudyInstanceUID","SeriesInstanceUID","SOPInstanceUID","TimezoneOffsetFromUTC","AvailableTransferSyntaxUID","MediaStorageSOPInstanceUID","encodingMapping","gb18030","gbk","TAG_NAME_MAP","DEFAULT_INFORMATION_TAGS","VALID_VRS","BULKDATA_VRS","pnStringToObject","multiple","pnObj","split","filter","Boolean","components","Alphabetic","Ideographic","Phonetic","assign","pnObjectToString","pnDelim","_v$Alphabetic","_v$Ideographic","_v$Phonetic","replace","RegExp","DicomMessage","Tag","DicomMetaDictionary","dicomJson","pnConvertToJsonObject","pnAddValueAccessors","__hasValueAccessors","defineProperty","x","tagProxyHandler","target","prop","vrType","includes","ValueRepresentation","hasValueAccessors","createByTypeString","nameMap","addValueAccessors","rtrim","binaryVRs","length32VRs","singleVRs","multi","_isBinary","_allowMultiple","_isLength32","_storeRaw","values","_this$maxLength","maxLength","maxCharLength","padByte","padChar","lastIdx","lastValue","endsWith","substring","syntax","readOptions","forceStoreRaw","fixed","rawValue","defaultValue","readBytes","applyFormatting","storeRaw","readAsciiString","peekUint8","readEncodedString","args","writeAsciiString","written","valueArgs","allowMultiple","writeUint8","singularArgs","byteCount","allowInvalidVRLength","valid","valarr","checkValue","checklen","isString","displaylen","checkLength","errmsg","info","dicomMessageClass","metaDictionary","tagClass","tag","_tag$vr","__hasTagAccessors","Proxy","VRinstances","ParsedUnknownValue","AsciiStringRepresentation","_ValueRepresentation","writeOptions","_get","_getPrototypeOf","EncodedStringRepresentation","_ValueRepresentation2","BinaryRepresentation","_ValueRepresentation3","_syntax","isEncapsulated","binaryStream","_writeOptions$fragmen","fragmentMultiframe","fragmentSize","frames","bufferLength","needsPadding","fragmentsLength","ceil","frameBuffer","frameStream","fragmentStart","isFinalFragment","fragmentEnd","fragStream","writeUint16","addPaddingByte","writeUint32","writeInt8","binaryData","readTag","is","itemLength","readUint32","numOfFrames","getNextSequenceItemData","nextTag","inputArray","_","range","fragments","_range","_slicedToArray","rangeStream","frameSize","mergedFrame","u8Data","reduce","ApplicationEntity","_AsciiStringRepresent","trim","CodeString","_AsciiStringRepresent2","BACKSLASH","dropPadByte","AgeString","_AsciiStringRepresent3","_this4","AttributeTag","_ValueRepresentation4","_this5","valueLength","DateValue","_AsciiStringRepresent4","_this6","rangeMatchingMaxLength","isRangeQuery","NumericStringRepresentation","_AsciiStringRepresent5","numStr","finiteParsedNumberOrNull","parsed","Number","isFinite","_init","DecimalString","_NumericStringReprese","_this7","formatNumber","numberStr","returnVal","sign_chars","logval","log10","abs","trunc_str","toExponential","toFixed","_this8","ds","convertToString","DateTime","_AsciiStringRepresent6","_this9","FloatingPointSingle","_ValueRepresentation5","_this0","readFloat","FloatingPointDouble","_ValueRepresentation6","_this1","readDouble","IntegerString","_NumericStringReprese2","_this10","trimmed","_this11","LongString","_EncodedStringReprese","_this12","LongText","_EncodedStringReprese2","_this13","PersonName","_EncodedStringReprese3","_this14","_typeof","_createForOfIteratorHelper","pnValue","keys","checkComponentLengths","_step2","_iterator2","readPaddedEncodedString","parsePersonName","valueStr","ShortString","_EncodedStringReprese4","_this15","SignedLong","_ValueRepresentation7","_this16","readInt32","SequenceOfItems","_ValueRepresentation8","_this17","noMultiple","sqlength","undefLength","elements","read","itemStream","toRead","undef","stack","readUint16","ge","items","_read","item","write","SignedShort","_ValueRepresentation9","_this18","readInt16","ShortText","_EncodedStringReprese5","_this19","TimeValue","_AsciiStringRepresent7","_this20","UnlimitedCharacters","_EncodedStringReprese6","_this21","UnlimitedText","_EncodedStringReprese7","_this22","UnsignedShort","_ValueRepresentation0","_this23","UnsignedLong","_ValueRepresentation1","_this24","Unsigned64BitVeryLong","_ValueRepresentation10","_this25","readBigUint64","UniqueIdentifier","_AsciiStringRepresent8","_this26","readPaddedAsciiString","removeInvalidUidChars","uidStr","UniversalResource","_AsciiStringRepresent9","_this27","UnknownValue","_BinaryRepresentation","_this28","_BinaryRepresentation2","_this29","arrayBuffer","streamFromBuffer","isBinary","rawValues","times","_vr$read","OtherWordString","_BinaryRepresentation3","_this30","OtherByteString","_BinaryRepresentation4","_this31","OtherDoubleString","_BinaryRepresentation5","_this32","OtherFloatString","_BinaryRepresentation6","_this33","AE","AS","AT","CS","DA","DS","DT","FL","FD","IS","LO","LT","OB","OD","OF","OW","PN","SH","SL","SQ","SS","ST","TM","UC","UI","UL","UN","UR","US","UT","UV","DicomDict","meta","addTagAccessors","Value","metaSyntax","fileStream","writeUint8Repeat","metaStream","writeTagObject","useSyntax","vrTable","vmTable","nameBlob","_b64","_decodeB64ToU8","b64","Buffer","bin","atob","_u8ToTyped","u8","Ctor","initPacked","groupsU8","groupStartU8","elemsU8","vrCodeU8","vmCodeU8","nameOffU8","nameLenU8","groups","groupStart","vrCode","vmCode","nameOff","nameLen","_groupIndex","rangeEntries","groupMin","groupMax","elem","vm","lookupTagHex","hex8","group","_initPacked","gi","Map","_ensureGroupIndex","ei","lo","hi","mid","_binSearchU16","off","lookupTagRangeHex","r","_pad4","hex","getAllStandardTagEntries","_initPacked2","gHex","privateModule","cache","isPrivateTagKey","_toHex8FromParenKey","create","entry","version","lookupPrivateTag","handler","addAccessors","dest","sqZero","__isProxy","itemZero","customDictionary","customNameMap","_generateCustomNameMap","dataset","denaturalizeDataset","rawTag","unpunctuateTag","parseIntFromTag","cleanedDataset","cleanedValues","cleanDataset","constructor","namedDataset","namedValues","namifyDataset","punctuatedTag","punctuateTag","naturalDataset","_vrMap","naturalName","InlineBinary","BulkDataURI","naturalValues","naturalizeDataset","naturalValue","some","unnaturalDataset","dataValue","dataItem","denaturalizeValue","unnaturalValues","datasetIndex","nestedDataset","warn","random","Date","toISOString","entries","sopClassUIDsByName","sopClassNamesByUID","paddingLeft","paddingValue","string","setDicomMetaDictionary","_generateNameMap","_generateUIDMap","element","_cleanString","toCleanString","_normalizeSyntax","implicit","isPixelDataTag","oldEndian","setEndian","tagStream","writeBytes","isBig16Length","isLength32","fromNumbers","deepEqual","obj1","obj2","keys1","keys2","_i","_keys","setTagClass","bufferStream","ignoreErrors","untilTag","includeUntilTagValue","_readTag","stopOnGreaterTag","previousTagOffset","readInfo","cleanTagString","coding","toLowerCase","setDecoder","_rawValue","reset","metaStartPos","el","metaHeader","cleanString","metaLength","mainSyntax","objects","dicomDict","tagString","fromString","jsonObjects","useStream","sort","tagObject","_getTagWriteValues","originalValue","elementData","lookupTag","isPrivateCreator","readVR","parseUnknownVr","delimiterChar","retObj","keyBlob","initPackedPrivate","keyOffU8","keyLenU8","keyOff","keyLen","keyStr","_initPackedPrivate","candidate","DICOMWEB","rootURL","progressCallback","endpoint","parameters","payload","responseType","service","endpointService","url","firstParameter","parameter","promise","reject","request","XMLHttpRequest","open","onload","response","onprogress","onerror","send","patientID","PatientID","studyInstanceUID","seriesInstanceUID","sopInstanceUID","requestType","studyUID","seriesUID","objectUID","contentType","patients","then","responses","patient","types","wado","services","array","Colors","dicomlab","lab2RGB","dicomlab2LAB","rgb","lab2DICOMLAB","rgb2LAB","lab","xyz2LAB","rgb2XYZ","pow","R","invGammaCorrection","G","B","xyz","whitePoint","d65WhitePointXYZ","X","Y","Z","labf","xyz2RGB","lab2XYZ","L","a","labfInv","R1","G1","B1","minimumComponent","gammaCorrection","createInformationFilter","tags","information","addTag","tagInfo","_this$current","current","normalizedName","_trackInformation","_this$current2","DicomMetadataListener","_len","filters","_key","startObject","pop","informationFilter","informationTags","_createMethodChains","init","fn","_drain","fmi","_filter$_init","_methods","chain","charAt","_loop","filterFn","_len2","_key2","_this$current$level","parent","_this$current$level2","_this$current$pop","_this$current$pop2","_this$current3","_result$Value","_this$current$dest","_this$fmi$transferSyn","transferSyntaxTag","readLog","AsyncDicomReader","_options$maxFragmentS","maxFragmentSize","_readPreamble","ensureAvailable","abrupt","PART10_NO_PREAMBLE","detectRawEncoding","_detectRawEncoding","_callee2","byte4","byte5","potentialLength","isASCIILetter","vrCandidate","_context2","byte","_readFile","_callee3","hasPreamble","_listener","_this$meta","_listener2","_this$meta2","_information2","_args3","_context3","readPreamble","readMeta","transferSyntaxUid","sopInstanceUid","MediaStoreSOPInstanceUID","_readMeta","_callee4","_args4","_context4","readTagHeader","maxSizeMeta","vrObj","_callee5","untilOffset","tagObj","addTagResult","_context5","MAX_SAFE_INTEGER","isUntilTag","isInstruction","isSequence","readSequence","readPixelData","expectsRaw","readRawBinary","readSingle","_x2","_readSequence","_callee6","sqTagInfo","itemUntilOffset","_context6","_x3","_x4","_x5","readCompressed","readUncompressed","_emitSplitValues2","_callee7","_listener$awaitDrain","_context7","awaitDrain","readArrayBuffer","_x6","_readCompressed","_callee8","_tagInfo","_listener$information","isVideo","numberOfFrames","isSingleFrame","frameNumber","lastFrame","frameTag","_context8","readOffsets","_emitSplitValues","_x7","_readOffsets","_callee9","_context9","_readUncompressed","_callee0","_listener$information2","frameLength","_listener$information3","_listener$information4","_listener$information5","_listener$information6","rows","cols","samplesPerPixel","bitsAllocated","_context0","columns","readUncompressedBitFrame","_x8","_readUncompressedBitFrame","_callee1","_listener$information7","_listener$information8","_listener$information9","_listener$information0","_listener$information1","bitsPerFrame","bytesPerFrame","totalBits","totalBytes","allPixelData","bitOffset","frameView","sourceView","globalBitIndex","sourceByteIndex","sourceBitIndex","targetByteIndex","targetBitIndex","_context1","_x9","_readRawBinary","_callee10","_context10","_x0","isCommand","_this$listener$inform","pixelRepresentation","_DicomMessage$lookupT","_readSingle","_callee11","_vr$read2","_value","_values2","_context11","_x1","_x10","_x11","datasetToDict","fileMetaInformationVersionArray","_meta","MediaStorageSOPClassUID","SOPClassUID","ImplementationVersionName","ImplementationClassUID","FileMetaInformationVersion","denaturalized","datasetToBuffer","datasetToBlob","Blob","Symbol","Normalizer","DerivedDataset","datasets","JSON","parse","stringify","o","Manufacturer","ManufacturerModelName","SeriesDescription","SeriesNumber","SoftwareVersions","DeviceSerialNumber","date","SeriesDate","SeriesTime","ContentDate","ContentTime","ClinicalTrialTimePointID","ClinicalTrialCoordinatingCenterName","ClinicalTrialSeriesID","ImageComments","ContentQualification","referencedDatasets","referencedDataset","derive","assignFromReference","assignFromOptions","DerivedPixels","_DerivedDataset","ContentLabel","ContentDescription","ContentCreatorName","assignToDataset","ImageType","LossyImageCompression","InstanceNumber","SharedFunctionalGroupsSequence","copyDataset","PerFrameFunctionalGroupsSequence","DerivedImage","_DerivedPixels","Segmentation","includeSliceSpacing","Modality","PhotometricInterpretation","BitsStored","HighBit","SegmentationType","dimensionUID","DimensionOrganizationSequence","DimensionOrganizationUID","DimensionIndexSequence","DimensionIndexPointer","FunctionalGroupPointer","DimensionDescriptionLabel","SegmentSequence","ReferencedSeriesSequence","ReferencedInstanceSequence","ReferencedSOPClassUID","ReferencedSOPInstanceUID","PixelMeasuresSequence","SpacingBetweenSlices","PixelValueTransformationSequence","isBitpacked","unpackedPixelData","uInt8ViewUnpackedPixelData","bitPackedPixelData","Segment","labelmaps","segmentIndexInLabelmap","referencedFrameNumbers","_addSegmentPixelDataFromLabelmaps","ReferencedSegmentNumber","_addSegmentMetadata","_addPerFrameFunctionalGroups","segmentIndex","existingFrames","sliceLength","pixelDataUInt8View","occupiedValue","_getOccupiedValue","labelmap","_addSegmentPixelData","perFrameFunctionalGroups","PlanePositionSequence","PlaneOrientationSequence","FrameContentSequence","DimensionIndexValues","SegmentIdentificationSequence","ReferencedFrameNumber","referencedInstanceSequenceI","isMultiframeSOPClassUID","DerivationImageSequence","SourceImageSequence","PurposeOfReferenceCodeSequence","CodeValue","CodingSchemeDesignator","CodeMeaning","DerivationCodeSequence","SegmentLabel","SegmentedPropertyCategoryCodeSequence","SegmentedPropertyTypeCodeSequence","SegmentAlgorithmType","SegmentAlgorithmName","reNumberedSegmentCopy","SegmentNumber","RecommendedDisplayCIELabValue","SegmentDescription","normalizer","ParametricMap","StructuredReport","EnhancedSR","ValueType","sopClassUID","toUID","sopClassUIDMap","NMImage","NMImageNormalizer","CTImage","CTImageNormalizer","ParametricMapStorage","PMImageNormalizer","MRImage","MRImageNormalizer","EnhancedCTImage","EnhancedCTImageNormalizer","LegacyConvertedEnhancedCTImage","EnhancedMRImage","EnhancedMRImageNormalizer","LegacyConvertedEnhancedMRImage","EnhancedUSVolume","EnhancedUSVolumeNormalizer","PETImage","PETImageNormalizer","EnhancedPETImage","LegacyConvertedEnhancedPETImage","SEGImageNormalizer","DeformableSpatialRegistration","DSRNormalizer","OphthalmicPhotography8BitImage","OPImageNormalizer","OphthalmicTomographyImage","OCTImageNormalizer","LabelmapSegmentation","consistentSOPClassUIDs","normalizerClass","normalizerForSOPClassUID","normalize","ImageNormalizer","_Normalizer","convertToMultiframe","normalizeMultiframe","isMultiframeDataset","derivation","referenceDataset","RescaleSlope","RescaleIntercept","referencePosition","ImagePositionPatient","rowVector","ImageOrientationPatient","columnVector","scanAxis","vec3CrossProduct","distanceDatasetPairs","position","positionVector","vec3Subtract","distance","vec3Dot","frame","pair","pixels","RangeError","message","_distanceDatasetPairs","distance0","dataset0","distance1","PixelSpacing","SliceThickness","FrameVOILUTSequence","WindowCenter","WindowWidth","StudyID","Laterality","PresentationLUTShape","BodyPartExamined","FrameAnatomySequence","AnatomicRegionSequence","FrameLaterality","rescaleIntercept","rescaleSlope","RescaleType","FrameAcquisitionDuration","StackID","InStackPositionNumber","frameTime","AcquisitionDate","AcquisitionTime","frameContentSequence","FrameAcquisitionDateTime","FrameReferenceDateTime","wcww","center","width","functionalGroup","FrameVOILUT","wc","ww","ax","ay","az","bx","by","bz","_ImageNormalizer","MRImageFrameTypeSequence","FrameType","PixelPresentation","VolumetricProperties","VolumeBasedCalculationTechnique","ComplexImageComponent","AcquisitionContrast","_ImageNormalizer2","_ImageNormalizer3","_ImageNormalizer4","_ImageNormalizer5","_ImageNormalizer6","_ImageNormalizer7","_ImageNormalizer8","_ImageNormalizer9","_Normalizer2","_Normalizer3","_ImageNormalizer0","setNormalizer","TID1500MeasurementReport","TIDIncludeGroups","ImageLibraryContentSequence","CurrentRequestedProcedureEvidenceSequence","PersonObserverName","RelationshipType","ConceptNameCodeSequence","tid1500","ContinuityOfContent","PerformedProcedureCodeSequence","CompletionFlag","VerificationFlag","ReferencedPerformedProcedureStepSequence","CodingSchemeIdentificationSequence","CodingSchemeName","CodingSchemeVersion","CodingSchemeResponsibleOrganization","ContentTemplateSequence","MappingResource","TemplateIdentifier","ContentSequence","ConceptCodeSequence","derivationSourceDatasetOrDatasets","derivationSourceDatasets","addTID1501MeasurementGroups","sopInstanceUIDsToSeriesInstanceUIDMap","TID1501MeasurementGroups","child","contentItem","parsedSOPInstances","measurementGroup","TID300Measurements","measurement","ReferencedSOPSequence","derivationSourceDataset","find","dsd","ImagingMeasurments","TID1501MeasurementGroup","measurementGroups","TID300Measurement","getMeasurementGroup","contentSequenceEntries","toArray","codeMeaningEquals","codeMeaningName","FINDING","FINDING_SITE","FINDING_SITE_OLD","codeValueMatch","oldCode","MeasurementReport","MeasurementGroup","contentSequenceArr","findingGroup","findingSiteGroups","NUMGroup","SCOORDGroup","defaultState","frameIndex","complete","finding","findingSites","fsg","description","findingSite","toolState","metadataProvider","allMeasurementGroups","firstImageId","generalSeriesModule","imageId","sopCommonModule","toolData","toolTypes","toolType","toolTypeData","toolClass","CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE","Measurements","tool","getTID300RepresentationArguments","TID300Representation","getTID300ContentItem","report","hooks","imagingMeasurementContent","measurementData","cornerstoneToolClasses","CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE","registeredToolClasses","TrackingIdentifierValue","TextValue","getToolClass","tc","isValidCornerstoneTrackingIdentifier","getMeasurementData","utilityToolType","MEASUREMENT_BY_TOOLTYPE","props","getTrackingGroups","getFindingGroup","getFindingSiteGroups","trackingIdentifierTextValue","UID","points","_ref$use3DSpatialCoor","use3DSpatialCoordinates","flattenedCoordinates","point","y","z","TID320ContentItem","graphicType","graphicData","referencedSOPSequence","referencedFrameOfReferenceUID","content","GraphicType","GraphicData","ReferencedFrameOfReferenceUID","OpenPolyline","_TID300Measurement","_this$props","_this$props$use3DSpat","flattenPoints","getPoints","concept","getConceptNameCodeSequence","measuredValue","getMeasuredValueSequence","getMeasurement","MeasuredValueSequence","buildGraphicContent","unitCodeMap","unit","NO_UNIT","codeValue","unit2CodingValue","units","space","baseUnit","codingUnit","measurementMap","Length","_OpenPolyline","point1","point2","_this$props2","_this$props2$unit","MeasurementUnitsCodeSequence","NumericValue","CORNERSTONE_4_TAG","LENGTH","_MeasurementReport$ge","getSetupMeasurementData","handles","textBox","hasMoved","movesIndependently","drawnIndependently","allowedOutsideImage","hasBoundingBox","_SCOORDGroup$GraphicD","TID300Length","TrackingIdentifier","_TrackingIdentifier$s2","cornerstone4Tag","registerTool","MeasurementBuilder","codingScheme","codeMeaning","_ref$scoordContentIte","scoordContentItem","area","areaUnit","_ref2","createNumericMeasurement","radius","radiusUnit","_ref3","modalityUnit","_ref4","_ref5","mean","_ref6","stdDev","_ref7","perimeter","_ref8","Polyline","_this$props$areaUnit","_this$props$unit","measurementConfigs","builder","createPerimeterMeasurement","createAreaMeasurement","createMaxMeasurement","createMinMeasurement","createMeanMeasurement","createStdDevMeasurement","measurements","config","FreehandRoi","active","cachedStats","color","invalidated","_tool$cachedStats","_cachedStats$area","_cachedStats$perimete","TID300Polyline","Bidirectional","longAxis","shortAxis","longAxisLength","shortAxisLength","longAxisGraphicData","shortAxisGraphicData","longAxisContentSequence","shortAxisContentSequence","BIDIRECTIONAL","longAxisNUMGroup","longAxisSCOORDGroup","shortAxisNUMGroup","shortAxisSCOORDGroup","longestDiameter","shortestDiameter","bottomRight","highlight","perpendicularStart","perpendicularEnd","isCreating","toolName","visible","_tool$handles","TID300Bidirectional","Ellipse","ELLIPTICALROI","EllipticalRoi","majorAxis","minorAxis","minorAxisLength","sqrt","minorAxisDirection","halfMinorAxisLength","corner1","corner2","initialRotation","halfXLength","halfYLength","TID300Ellipse","Circle","createRadiusMeasurement","CIRCLEROI","CircleRoi","_cachedStats$areaUnit","_cachedStats$unit","PI","TID300Circle","Point","graphicContentSequence","ARROW_ANNOTATE","CORNERSTONEFREETEXT","ArrowAnnotate","TID300RepresentationArguments","isBuffer","isBuffer_1","readFloatLE","isSlowBuffer","_isBuffer","TID300Point","iota","iota_1","require$$1","hasTypedArrays","Float64Array","compare1st","stride","terms","compileConstructor","dtype","dimension","className","useGetters","procedure","CACHED_CONSTRUCTORS","indices","index_str","shapeArg","strideArg","a_vars","c_vars","tShape","tStride","idx","float32","float64","int8","int16","int32","uint8","uint16","uint32","uint8_clamped","bigint64","biguint64","generic","ndarray","shape","ctor","d","sz","arrayDType","ctor_list","crossProduct3D","flipImageOrientationPatient","iop","hv","rotateVectorAroundUnitVector","theta","cosTheta","cos","sinTheta","sin","oneMinusCosTheta","kdotv","vRot","kxv","rotateDirectionCosinesInPlane","rxc","rRot","cRot","flipMatrix2D","matrix","_matrix$shape","_matrix$shape2","rotateMatrix902D","resultColsMinus1","nearlyEqual","epsilon","absA","absB","diff","MAX_VALUE","generateSegmentation","images","brushData","segments","image0","dims","xy","_getSegCount","seg","isMultiframe","dicomData","readFile","multiframe","normalizeToDataset","SegmentationDerivation","_createSegFromImages","_getNumberOfFramesPer","segmentIndicies","referencedFramesPerSegment","imageIdSpecificToolState","segIdx","brush","_getNumberOfFramesPerSegment","setNumberOfFrames","referencedFrameIndicies","segment","addSegment","_extractCornerstoneToolsPixelData","bitPackPixelData","generateToolState","imageIds","imagePlaneModule","validOrientations","orientations","flipIOP","iop90","getValidOrientations","rowCosines","columnCosines","sharedImageOrientationPatient","segMetadata","segmentSequence","seriesInstanceUid","getSegmentMetadata","segType","MaximumFractionalValue","onlyMaxAndZero","unpackPixelData","inPlane","PerFrameFunctionalGroups","ImageOrientationPatientI","alignedPixelDataI","alignPixelDataWithSourceData","addImageIdSpecificBrushToolState","getImageIdOfSourceImage","referencedFrames","pixelDataIndex","brushPixelData","numSegments","pixelData2D","brushDataI","cToolsPixelData","imageIdFrameNumber","getImageIdOfReferencedFrame","getImageIdOfReferencedSingleFramedSOPInstance","compareIOP","dx","iop1","iop2","headerUint32","encodedFrames","frameOffset","encodeFrame","rleArray","uint8Row","literalRunLength","getLiteralRunLength","literalRun","replicateRunLength","getReplicateRunLength","bodyLength","encodedFrameBuffer","headerView","bodyView","rleEncodedFrames","decodeFrame","rleEncodedFrame","uInt8Frame","byteValue","N","HASH_UNDEFINED","argsTag","boolTag","dateTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reFlags","reIsHostCtor","reIsUint","cloneableTags","freeGlobal","global","freeSelf","freeExports","nodeType","freeModule","moduleExports","addMapEntry","addSetEntry","add","arrayReduce","iteratee","accumulator","initAccum","isHostObject","mapToArray","overArg","transform","arg","setToArray","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","IE_PROTO","funcToString","objectToString","reIsNative","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","nativeKeys","getNative","WeakMap","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","Hash","clear","ListCache","MapCache","Stack","__data__","arrayLikeKeys","inherited","isObjectLike","isArrayLike","isArrayLikeObject","isArguments","baseTimes","skipIndexes","isIndex","assignValue","object","objValue","eq","assocIndexOf","baseClone","isDeep","isFull","customizer","isObject","isArr","initCloneArray","copyArray","getTag","isFunc","cloneBuffer","isPrototype","proto","initCloneObject","copyObject","getSymbols","copySymbols","baseAssign","cloneFunc","symbol","cloneArrayBuffer","dataView","cloneDataView","typedArray","cloneTypedArray","cloneMap","regexp","lastIndex","cloneRegExp","cloneSet","initCloneByTag","stacked","keysFunc","symbolsFunc","arrayPush","baseGetAllKeys","getAllKeys","arrayEach","subValue","baseIsNative","isFunction","getMapData","getValue","hash","pairs","LARGE_ARRAY_SIZE","other","ctorString","isLength","baseKeys","inputLabelmaps3D","userOptions","fillSegmentation","skipOverlapping","tolerance","hasCoordinateSystem","orientation","sourceDataDimensions","operation","compareArrays","absDotColumnCosines","absDotRowCosines","checkIfPerpendicular","checkOrientation","insertFunction","overlapping","groupsLen","frameSegmentsMapping","_loop3","getSegmentIndex","frameSegment","findReferenceSourceImageId","imageIdIndex","findIndex","segmentArray","role","temp2DArray","pixelDataI2D","checkSEGsOverlapping","insertOverlappingPixelDataPlanar","insertPixelDataPlanar","segmentsOnFrameArray","segmentsOnFrame","arrayBufferLength","labelmapBufferArray","generateSegmentationDefaultOptions","rleEncode","segmentation","labelmaps3D","referencedFramesPerLabelmap","labelmap3D","labelmapIndex","labelmaps2D","metadata","_loop2","labelmap2D","segmentsOnLabelmap","segmentMetadata","_getLabelmapsFromRefernecedFrameIndicies","addSegmentFromLabelmap","SegmentationFractionalType","FrameOfReferenceUID","PerFrameFunctionalGroup","frameSourceImageSequence","getImageIdOfSourceImagebySourceImageSequence","ReferencedSeriesInstanceUID","imageIdsIndexc","sourceImageMetadata","getImageIdOfSourceImagebyGeometry","M","tempBuffer","tempSegmentsOnFrame","cloneDeep","numberOfSegs","segmentIndexToProcess","_loop4","_i2","labelmap2DView","segmentOnFrame","_loop5","array1","array2","labelmaps3DorBrushData","cornerstoneToolsVersion","Segmentation_4X","Segmentation_3X","CobbAngle","point3","point4","rAngle","COBB_ANGLE","start2","end2","TID300CobbAngle","ANGLE","Angle","middle","RectangleRoi","Cornerstone","CodingScheme","codeValues","FREE_TEXT_CODE_VALUE","isFreeTextCodeValue","isLegacyFreeTextCodeValue","_defaultState$finding","freeTextLabel","fs","generateDatasetMeta","sopInstanceUIDToImageIdMap","referencedImageId","annotation","annotationUID","frameOfReferenceUID","label","getCornerstoneLabelFromDefaultState","worldToImageCoords","generateDerivationSourceDataset","instance","tid1500MeasurementReport","imageToWorldCoords","CORNERSTONE_3D_TAG","worldCoords","activeHandleIndex","_data$cachedStats","cornerstone3DTag","shortAxisPoints","longAxisPoints","firstPointPairs","secondPointPairs","longAxisStartImage","longAxisEndImage","shortAxisStartImage","shortAxisEndImage","EPSILON","ARRAY_TYPE","Float32Array","RANDOM","round","glMatrix.ARRAY_TYPE","fromValues","subtract","multiply","divide","squaredDistance","squaredLength","dot","vec","sub","mul","div","sqrDist","sqrLen","mag","cosine","acos","inverseFactor","inverseFactorTimesTwo","factorTimes2","factor1","factor2","factor3","factor4","a0","a1","a2","b0","b1","b2","glMatrix.EPSILON","scale","glMatrix.RANDOM","zScale","rad","glMatrix.round","angle","sinTotal","ratioA","ratioB","qx","qy","qz","qw","vx","vy","vz","tx","ty","tz","EllipticalROI","pointsWorld","worldPos","majorAxisStart","vec3","majorAxisEnd","minorAxisStart","minorAxisEnd","majorAxisVec","minorAxisVec","columnCosinesVec","projectedMajorAxisOnColVec","projectedMinorAxisOnColVec","absoluteOfMajorDotProduct","absoluteOfMinorDotProduct","ellipsePoints","bottom","right","stats","imagePixelModule","xOffset","yOffset","secondPoint","arrowFirst","_data$handles","pointImage","TID300ArrowAnnotate","PROBE","Probe","PLANARFREEHANDROI","PlanarFreehandROI","isOpenContour","polyline","firstPoint","Cornerstone3D","CodeScheme","den","sum","norm","cielab","rgba","dicomlab2RGB","functionalGroups","segmentNumber","packedSegment","geometry","pixelMeasures","planeOrientation","firstFunctionalGroup","lastFunctionalGroup","firstPosition","lastPosition","origin","spacing","dimensions","Zx","Zy","Zz","columnStepToPatient","rowStepToPatient","planeNormal","sliceStep","direction","geometryFromFunctionalGroups","VTKjs","rois","measurementsByGraphicType","roi","scoord3d","coord","MICROSCOPY_TOOL_CLASSES_BY_TOOL_TYPE","mg","MICROSCOPY_TOOL_CLASSES_BY_UTILITY_TYPE","measurementType","measurementContent","all","one","ch","Polygon","TID300Polygon","adapters","DICOMMicroscopyViewer","TID1500","Calibration","uint8ArrayToString","stringToUint8Array","identifyBoundary","parts","substr","containsToken","token","findToken","maxSearchLength","searchLength","guid","s4","multipartEncode","boundary","contentTypeString","footer","headerArray","footerArray","headerLength","footerLength","contentArrays","datasetBuffer","contentArray","contentLength","multipartArray","multipartDecode","separator","headerIndex","boundaryString","boundaryIndex","boundaryEnd","ArrayBufferExpanderFilter","every","isView","tagContext","fragment","arrayResult","utilities","TID300","compression","_meaning","_schemeDesignator","_schemeVersion","Code","meaning","schemeDesignator","schemeVersion","CodedConcept","ValueTypes","CODE","COMPOSITE","CONTAINER","DATE","DATETIME","IMAGE","NUM","PNAME","SCOORD","SCOORD3D","TCOORD","TEXT","TIME","UIDREF","WAVEFORM","freeze","GraphicTypes","CIRCLE","ELLIPSE","ELLIPSOID","MULTIPOINT","POINT","POLYLINE","GraphicTypes3D","POLYGON","TemporalRangeTypes","BEGIN","END","MULTISEGMENT","SEGMENT","RelationshipTypes","CONTAINS","HAS_ACQ_CONTENT","HAS_CONCEPT_MOD","HAS_OBS_CONTEXT","HAS_PROPERTIES","INFERRED_FROM","SELECTED_FROM","PixelOriginInterpretations","FRAME","VOLUME","zeroPad","hours","getHours","minutes","getMinutes","seconds","getSeconds","milliseconds","getMilliseconds","year","getFullYear","month","getMonth","day","getDate","_Array","_wrapNativeSuper","ContentItem","valueType","relationshipType","relationshipTypes","CodeContentItem","_ContentItem","TextContentItem","_ContentItem2","PNameContentItem","_ContentItem3","TimeContentItem","_ContentItem4","Time","DateContentItem","_ContentItem5","DateTimeContentItem","_ContentItem6","UIDRefContentItem","_ContentItem7","NumContentItem","_ContentItem8","FloatingPointValue","qualifier","NumericValueQualifierCodeSequence","ContainerContentItem","_ContentItem9","isContentContinuous","templateID","CompositeContentItem","_ContentItem0","referencedSOPClassUID","referencedSOPInstanceUID","ReferenceSOPSequence","ImageContentItem","_ContentItem1","referencedFrameSegmentNumber","referencedSegmentNumbers","ScoordContentItem","_ContentItem10","pixelOriginInterpretation","fiducialUID","FiducialUID","Scoord3DContentItem","_ContentItem11","TcoordContentItem","_ContentItem12","temporalRangeType","referencedSamplePositions","ReferencedSamplePositions","referencedTimeOffsets","ReferencedTimeOffsets","referencedDateTime","ReferencedDateTime","LongitudinalTemporalOffsetFromEvent","_NumContentItem","eventType","SourceImageForRegion","_ImageContentItem","SourceImageForSegmentation","_ImageContentItem2","SourceSeriesForSegmentation","_UIDRefContentItem","referencedSeriesInstanceUID","ImageRegion","_ScoordContentItem","sourceImage","ImageRegion3D","_Scoord3DContentItem","VolumeSurface","_Scoord3DContentItem2","frameOfFeferenceUID","sourceImages","image","sourceSeries","ReferencedRealWorldValueMap","_CompositeContentItem","FindingSite","_CodeContentItem","anatomicLocation","laterality","topographicalModifier","ReferencedSegmentationFrame","_ContentSequence","segmentationItem","referencedSOPClassUid","sopClassUid","referencedSOPInstanceUid","referencedFrameNumber","referencedSegmentNumber","ReferencedSegmentation","_ContentSequence2","frameNumbers","Template","Measurement","_Template","_valueItem$ContentSeq","valueItem","trackingIdentifier","methodItem","derivationItem","site","properties","_valueItem$ContentSeq2","MeasurementProperties","referencedRegions","region","referencedVolume","referencedSegmentation","referencedRealWorldValueMap","algorithmId","_valueItem$ContentSeq3","AlgorithmIdentification","_Template2","normality","normalityItem","measurementStatisticalProperties","MeasurementStatisticalProperties","normalRangeProperties","NormalRangeProperties","levelOfSignificance","levelOfSignificanceItem","selectionStatus","selectionStatusItem","upperMeasurementUncertainty","upperMeasurementUncertaintyItem","lowerMeasurementUncertainty","lowerMeasurementUncertaintyItem","_Template3","descriptionItem","authority","authorityItem","_Template4","ObservationContext","_Template5","observerPersonContext","ObserverContext","observerDeviceContext","subjectContext","SubjectContext","_Template6","observerType","observerTypeItem","observerIdentifyingAttributes","person","device","equals","PersonObserverIdentifyingAttributes","DeviceObserverIdentifyingAttributes","_Template7","nameItem","loginName","loginNameItem","organizationName","organizationNameItem","roleInOrganization","roleInOrganizationItem","roleInProcedure","roleInProcedureItem","_Template8","deviceObserverItem","manufacturerName","manufacturerNameItem","modelName","modelNameItem","serialNumber","serialNumberItem","physicalLocation","physicalLocationItem","_Template9","subjectClass","subjectClassSpecificContext","subjectClassItem","fetus","specimen","SubjectContextFetus","SubjectContextSpecimen","SubjectContextDevice","_Template0","subjectID","subjectIdItem","_Template1","specimenUidItem","identifier","specimenIdentifierItem","containerIdentifier","containerIdentifierItem","specimenType","specimenTypeItem","_Template10","deviceNameItem","deviceUidItem","LanguageOfContentItemAndDescendants","_Template11","language","languageItem","_MeasurementsAndQualitatitiveEvaluations","_Template12","_groupItem$ContentSeq","groupItem","session","sessionItem","findingType","findingTypeItem","timePointContext","_groupItem$ContentSeq2","TimePointContext","qualitativeEvaluations","evaluation","_ROIMeasurementsAndQualitativeEvaluations","_MeasurementsAndQuali","numReferences","PlanarROIMeasurementsAndQualitativeEvaluations","_ROIMeasurementsAndQu","referencedRegion","VolumetricROIMeasurementsAndQualitativeEvaluations","_ROIMeasurementsAndQu2","MeasurementsDerivedFromMultipleROIMeasurements","_Template13","_valueItem$ContentSeq4","measurementProperties","_valueItem$ContentSeq5","MeasurementAndQualitativeEvaluationGroup","_MeasurementsAndQuali2","ROIMeasurements","_Template14","_Template15","_item$ContentSequence","_item$ContentSequence2","_item$ContentSequence3","observationContext","procedureReported","languageOfContentItemAndDescendants","procedureItem","imageLibraryItem","ImageLibrary","imagingMeasurements","derivedImagingMeasurements","containerItem","_construct","_Template16","timePoint","timePointItem","timePointType","timePointTypeItem","timePointOrder","timePointOrderItem","subjectTimePointIdentifier","subjectTimePointIdentifierItem","protocolTimePointIdentifier","protocolTimePointIdentifierItem","temporalOffsetFromEvent","_Template17","libraryItem","_Template18","versionItem","parameterItem","_Template19","trackingIdentifierItem","trackingUIDItem","_attributesToInclude","Comprehensive3DSR","evidence","seriesNumber","seriesDescription","instanceNumber","manufacturer","institutionName","InstitutionName","institutionalDepartmentName","InstitutionalDepartmentName","institutionDepartmentName","isVerified","verifyingObserverName","verifyingOrganization","ovserver_item","VerifyingObserverName","VerifyingOrganization","VerificationDateTime","dateTime","VerifyingObserverSequence","isFinal","PreliminaryFlag","keyword","evidenceCollection","instanceItem","evidenceStudyItem","seriesItem","requestedProcedures","ReferencedRequestSequence","PertinentOtherEvidenceSequence","previousVersions","preCollection","preStudyItem","PredecessorDocumentsSequence","performedProcedureCodes","sr","contentItems","documents","templates","valueTypes","tagNamesToEmpty","registerPrivatesModule","privateData","async","derivations","normalizers","anonymizer","cleanTags","tagNamesToReplace","customTagNamesToEmpty","newValue","tagNumber","fromPString","getTagsNameToEmpty","dcmjs","setDicomMessageClass"],"mappings":"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EAAA04C,EAAA,EA5B4Bg3B,knBCljD3BuK,GAAuB,CAEzB,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YAGEC,GAAiBl6E,EACnB,SAAAk6E,EAAYxjF,GAAS,IAAAkQ,EAAA5uB,KACjB,GADiBkoB,OAAAg6E,QACQ1/F,IAArBkc,EAAQyjF,SACR,MAAM,IAAInjF,MACN,wDAGR,KAEoC,WAA5BikB,EAAOvkB,EAAQyjF,WACfzjF,EAAQyjF,oBA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BACA,wBACA,gCACA,2BACA,yBACA,oBACA,gBACA,0BACA,yBACA,mBACA,sBACA,yBACA,yBACA,gBACA,eACA,aACA,eACA,aACA,mCACA,uBACA,sBACA,WACA,OACA,cAEA,kBACA,cACA,YACA,sBACA,aACA,kBACA,cACA,YACA,kBACA,qBACA,4BACA,iCACA,2BACA,wBACA,cACA,mBACA,8BACA,oBACA,yBACA,0BACA,2BACA,8BACA,6BACA,eACA,6BACA,gCACA,4BACA,cACA,YACA,gBACA,cACA,wBACA,iBACA,sBACA,oBACA,mBACA,8BACA,gCACA,wCACA,kBACA,oBACA,qBACA,mBACA,aACA,cACA,gBACA,iBACA,8BACA,yBACA,eACA,kBACA,uBACA,gBACA,oBACA,qBACA,oBACA,sBACA,cACA,aACA,gBACA,2BACA,kBACA,oBACA,6BACA,qBACA,oBACA,0BACA,kBACA,qBACA,UACA,cACA,aACA,WAGA,eACA,yCACA,sBACA,aACA,iCACA,0BACA,oBACA,8BACA,2BACA,gBACA,4BACA,gBACA,yBACA,4BACA,iBACA,sBACA,oBACA,gCACA,yBACA,gBACA,cACA,sBACA,uCACA,gBACA,gBACA,gCACA,eACA,mBACA,2BACA,4BACA,yBACA,8BACA,eACA,4BACA,gBACA,sBACA,mCACA,iBACA,uBACA,cACA,gBACA,sBACA,uBACA,oBACA,8BACA,QACA,iBACA,uBACA,cACA,wBACA,+BACA,6BACA,qCACA,wCACA,gBACA,yBACA,6BACA,oCACA,iBACA,uBACA,2BACA,gCACA,6BACA,8BACA,uCACA,gCACA,8BACA,gCACA,8BACA,sBACA,wBACA,wBACA,yBACA,sBACA,2BACA,yCACA,aACA,aACA,cACA,kBACA,oBACA,eACA,cACA,gBACA,aACA,YACA,eACA,kBACA,yBACA,4BACA,qBACA,uBACA,iCACA,mCACA,qCACA,6BACA,mBACA,sBACA,yBACA,cACA,iBACA,uBACA,2BlGjOG,SAAgCj/F,GACnCkpC,GAAgBlpC,CACpB,CmGCAk/F,CAAuBC,IAyCvB,IAAMrwF,GAAO,CACT3O,SAAAA,EACAwsB,iBAAAA,GACAS,yBAAAA,GACAE,kBAAAA,GACA8X,UAAAA,GACA9T,aAAAA,GACAE,oBAAAA,GACAD,IAAAA,GACAa,oBAAAA,GACAqhB,OAAAA,GACAyN,cAAAA,GACAS,gBAAAA,GACAC,cAAAA,IAGEw9C,GAAQ,CACVjnD,iBAAAA,IAGEknD,GAAc,CAChBr9C,eAAAA,GACA2B,cAAAA,GACAY,aAAAA,GACAE,aAAAA,GACAqE,iBAAAA,GACAD,cAAAA,IAGEy2C,GAAc,CAChBv9C,WAAAA,GACAqJ,gBAAAA,GACAzB,kBAAAA,GACAK,0BAAAA,GACAG,2BAAAA,GACAZ,kBAAAA,GACAc,mBAAAA,GACAG,mBAAAA,GACAE,cAAAA,IAGE60C,GAAa,CACfC,UDkJG,SACHhmF,GAGF,IAFEimF,EAAiB7jG,UAAAS,OAAA,QAAAU,IAAAnB,UAAA,GAAAA,UAAA,QAAGmB,EACpB2iG,EAAqB9jG,UAAAS,OAAA,QAAAU,IAAAnB,UAAA,GAAAA,UAAA,QAAGmB,EAECA,MAArB0iG,IACAA,EAAoB,CAChB,WAAY,eACZ,WAAY,aAIS1iG,MAAzB2iG,EACMA,EACAT,IACL3yE,QAAQ,SAAUuJ,GACnB,IAAIggB,EAAUrkB,GAAoBe,QAAQsD,GAC1C,GAAIggB,GAA8B,cAAnBA,EAAQrM,QAAyB,CAC5C,IAGQm2D,EAHJC,EAAY/pD,EAAQhgB,IACpB4Z,EAAYle,GAAIsuE,YAAYD,GAAW5yD,gBAC3C,GAAIxzB,EAAKi2B,GAGDkwD,EADAlwD,KAAagwD,EACF,CAACA,EAAkBhwD,IAEnB,GAEfj2B,EAAKi2B,GAAard,GAAoBkT,gBAClC9rB,EAAKi2B,IAETj2B,EAAKi2B,GAAWlK,MAAQo6D,CAEhC,CACJ,EACJ,ECnLIG,mBD6IG,WACH,MAAA,GAAAr7E,OAAWw6E,GACf,GC5IMc,GAAQ,CACV9uD,SAAAA,GACAq0C,SAAAA,GACAjjE,UAAAA,GACAvT,KAAAA,GACAuwF,YAAAA,GACAC,YAAAA,GACAV,GAAAA,GACA7W,UAAAA,GACAhsF,IAAAA,EACAwjG,WAAAA,GACAH,MAAAA,IAGJh6D,GAAU46D,qBAAqB1uE,IAC/Bc,GAAoB4tE,qBAAqB1uE,IACzCc,GAAoB8b,YAAY3c,IAChCA,GAAIyuE,qBAAqB1uE","x_google_ignoreList":[0,3,56,57,58,68,82,83]}